scenarios.xml

The scenarios.xml provides instructions for modifying a GCAM configuration XML file. The file, which is processed by the setup sub-command, cad define one or more groups of related scenarios, and provides an iteration feature that allows automated generation of a set of related scenarios.

See also

The GCAM XML-Setup page provides an overview of setup system. See pygcam.xmlEditor for more information about the Python API. Command-line usage is described on the gt setup page.

Note

When developing scenario definitions using iterators, it can be helpful to see the generated XML. You can set the configuration variable GCAM.ScenarioSetupOutputFile to a pathname to which the expanded XML should be written after the setup sub-command has been run.

The XML element of the scenarios.xml file are described below, followed by an example.

XML elements

The elements that comprise the scenarios.xml file are described below.

See also

Some elements of the scenarios.xml file can contain <CONDITIONAL> elements, as described below. See Conditional XML for further details.

Note

All elements can be wrapped in a <comment> ... </comment> element to effectively remove them from the input stream. This is provided to allow commenting sections that themselves contain comments.

<scenarios>

The top-most element, <scenarios>, encloses one or more <scenarioGroup> elements, zero or more <iterator> elements, and zero or more <comment> elements. The <scenarios> element may contain <CONDITIONAL> elements.

The <scenarios> element takes the following attributes:

Attribute Required Default Values
defaultGroup no (none) text

The defaultGroup attribute of <scenarios> identifies the default scenarioGroup to use when no group is explicitly identified in the gt setup command.

<scenarioGroup>

The <scenarioGroup> element defines a set of two or moreo related <scenario> elements, including one baseline scenario and one or more policy scenarios. It may also include zero or more <comment> elements.

Attribute Required Default Values
name yes (none) text
useGroupDir no “0” boolean
groupSubdir no (name) text
iterator no (none) text
baselineSource no (none) text

The required name attribute must match the name of a scenario defined in the project.xml file.

When a project contains multiple scenario groups, it can keep the groups separated by using the group dir in the path. The useGroupDir attribute indicates whether the name of the scenario group should be used when composing pathnames of the scenario group’s XML files. By default the group’s name is used as the directory name, but this can be overridden by setting the groupSubdir parameter. This is useful when you have several scenarios that share static XML files. If groupSubdir is set, this implies useGroupDir="1".

The iterator attribute identifies an iterator (defined withing the <scenarioGroup> to use to generate a series of scenario groups and/or scenarios. (See the next section and the example below.)

The baselineSource attribute allows the baseline for one scenario group to be based on the baseline for another scenario group in the same setup file. The argument to the baselineSource attribute must be of the form “groupName/baselineName”. For example, if the baseline (named ‘base-1a’) for scenario group “Bar” is sourced from scenario group “Foo”, whose baseline is named “foobase”, you would use the following definition:

<scenarioGroup name="Bar" useGroupDir="1" baselineSource="Foo/foobase">
   <scenario name="base-1a" baseline="1">

Note that this use pattern requires that you use group directory names for each scenario group in a project, which is a good organizing approach in any case.

The configuration file generated for the source group’s baseline is copied as the starting point for the current group’s baseline configuration, rather than using the GCAM reference configuration file. This avoids duplication of sequences of actions that are shared among scenario groups.

<iterator>

This element identifies an iterator that can be used to automatically generate a set of <scenarioGroup> and/or <scenario> elements whose names are a function of the iterator value.

There are three types of iterators: integer, floating point, and a comma-delimited list of text values. In each case, the setup command iterators over the given (or implied) set of values and substitutes the value where the name of the iterator is specified within curly braces, e.g., {myIterator}.

For example, to create 3 scenarios called scen-1, scen-2, and scen-3, you can define an integer iterator (here, named “ssp”) with a minimum value of 1, a maximum of 2 and a step of 1 (the default):

<iterator name="ssp" type="int" min="1" max="3">

or, equivalently,

<iterator name=”ssp” values=”1,2,3”>

You would then define the scenario name as

<scenario name="scen-{ssp}">

which would result in the desired scenarios. Of course, for these to be useful, they need to create different configuration files. This is accomplished by using iterator names in the names of the relevant XML files. For example, you might have a set of files that define alternatives that you number 1 through three. You would then select the correct one by using the line:

<replace name="cement_2">{scenarioDir}/cement_incelas_ssp{ssp}.xml</replace>

Note that in addition to iterators defined in the scenario group, two variables are added automatically: scenarioDir and baselineDir, which refer to paths relative to the GCAM “exe” directory to the directories for the current scenario and, for non-baseline scenarios, for the baseline.

The <iterator> element recognizes the following attributes:

Attribute Required Default Values
name yes (none) text
type yes list see below
min no (none) numeric
max no (none) numeric
step no (none) numeric
format no (none) text
values no (none) text

The type must be one of {int, float, list}. For the numeric types, int and float, a min and a max must be specified. These are coerced (if necessary) to the indicated type. Step is optional and defaults to 1. The values generated are inclusive of the min and max values. The values attribute is used only with type="list"; its value should be a comma-delimited series of text or numeric values. A comma before or after no other content (or blank) results in a value of the empty string, which can be useful in some cases.

The format allows you to specify how to represent values when converted to a string, using the formatting convention common to many programming languages. This is most useful for “float” iterators, as it lets you specify the number of decimal places to include. For example, a format of %.2f indicates a floating point value with 2 digits to the right of the decimal point. The default float format is %.1f, allowing one digit after the decimal point.

For example, to generate the set of values {0.00, 0.25, 0.50, 0.75, 1.00}, you could create either of the following iterators:

<iterator name="fraction" type="float" min="0" max="1" step="0.25" format="%.2f"/>

or

<iterator name="fraction" type="list" values="0.00,0.25,0.50,0.75,1.00"/>

The two approaches produce identical results. Use whichever you find more convenient. The “list” case is more flexible in that the values need not all have the same format, while the “int” and “float” versions would be more convenient for a large number of scenarios. The list form allows iteration over distinctly formatted values, e.g.,

<iterator name="fraction" type="list" values="0,0.25,0.5,0.75,1"/>

In this case, ‘0.00’ and ‘1.00’ are shortened to ‘0’ and ‘1’, respectively.

<scenario>

The <scenario> element defines a single scenario. It contains a sequence of one or more “actions” that manipulate the scenario’s configuration file and (optionally) modify and create local copies of GCAM reference files or files defined in the baseline scenario. It may also contain zero or more <comment> elements, and may contain <CONDITIONAL> elements.

The <scenario> element accepts the following attributes:

Attribute Required Default Values
name yes (none) text
baseline no “0” boolean
iterator no (none) text

The baseline attribute is used to identify the baseline scenario. Only one scenario in a <scenarioGroup> can be identified as the baseline.

The value of the iterator attribute must be the name of an iterator defined in the current <scenarioGroup>. When an iterator is used, a single <scenario> generates a sequence of scenarios based on the values of the iterator, as described above.

Actions: <add>, <insert>, <replace>, <delete>, <function>, and <if>

There are five action elements that operate on the configuration file. The elements <add>, <insert>, <replace>, and <delete> operate directly on XML configuration elements. The <function> element call certain internal methods of the pygcam.xmlEditor class (and its designated subclasses) that can modify the configuration and/or modify and create local copies of GCAM reference files or files defined in the baseline scenario. The sixth action element, <if>, allows content to be included conditionally. Note that <if> elements can be nested. Examples of each are provided below.

To maintain the ability to edit files programmatically using the the setup system, the name assigned to any new component should be unique among the scenario components.

<add>

Adds a new “scenario component” element to the configuration file, at the end of the list of components. The text content of the element should be the name of the new XML file to include.

Attribute Required Default Values
name yes (none) text

<insert>

Adds a new scenario components after the component with the name specified by the after attribute. The text content of the element should be the name of the new XML file to include.

Attribute Required Default Values
name yes (none) text
after yes (none) text

<replace>

Replace the XML file in the scenario component with the given name with that given in the text content of the <replace> element.

Attribute Required Default Values
name yes (none) text

<delete>

Delete the scenario component with the given name.

Attribute Required Default Values
name yes (none) text

<function>

Call the internal function (i.e., “method”) of the class pygcam.xmlEditor (or, a subclass thereof) with the given name, passing to it the arguments provided in the text of the <function> element. The arguments should be a comma-delimited set of values that are valid Python constants. Note that some function calls use keyword arguments, which must be specified with the keyword. Note that function arguments can refer to iterator variables. (See example below.)

Any functions that generate dynamic content (e.g., computing constraints as a function of baseline results) should declare dynamic="true" so they are run in the proper sequence. If these are not indicated as dynamic, any files written to the dyn-xml directory will be deleted when the setupDynamic() method of XmlEditor is run.

Attribute Required Default Values
name yes (none) text
dynamic no “false” boolean

Subclassing XMLEditor to provide functions callable from XML

By default, the <function> element allows you to invoke functions defined in the pygcam.xmlEditor class. If set, the class identified by the configuration variable GCAM.ScenarioSetupClass must indicate a subclass of XMLEditor to use instead. The format of the value for this variable is:

/path/to/module/dir;module.SubclassName

That is, there are two parts separated by a semi-colon. The first part is a path to a directory holding a module in which the subclass is defined. The second part is a standard Python specification of one or more modules separated by periods, with the final element being the name of the subclass.

Note: Only functions (class methods) defined with the @callableMethod decorator are recognized as callable from XML. See pygcam.xmlEditor.py for examples.

<if>

The <if> node allows one or more action elements to be included if the two values provided match (are the same; the default) or do not match, indicated by specifying matches="0" or matches="false". This element may contain zero or more <comment> elements, and may contain <CONDITIONAL> elements.

Note

The <if> element evaluates scenario iterators, and is evaluated when a scenario is run. In contrast, the <CONDITIONAL> element evaluates configuration variables and is evaluated when the scenarios file is loaded, prior to evaluating any file contents.

Attribute Required Default Values
value1 yes (none) text
value2 yes (none) text*
matches no “true” boolean

When matches is “1” or “true” (the default) the enclosed actions are taken if and only if the values of attributes value1 and value2 are the same. When matches is “0” or “false”, the actions are taken if and only if the two values differ.

Note that value2 (but not value1) can be a comma-delimited string to identify multiple values. In this case, the test is whether value1 is in the list of values created by splitting the string on the commas and stripping blanks at the start and end of the resulting values. Thus, the following two blocks are functionally equivalent:

<!-- first version matches one name at a time -->
<if value1="{name}" value2="John">
  <!-- some actions -->
</if>
<if value1="{name}" value2="Jane">
  <!-- the same actions as above -->
</if>
<!-- second version matches any name in a list -->
<if value1="{name}" value2="John, Jane">
  <!-- the same actions as above -->
</if>

Example

The following is the scenarios.xml file that is copied into new projects by the new sub-command. It serves as a starting point and for testing that the overall pygcam environment is configured properly.

<?xml version="1.0" encoding="UTF-8"?>

<!--
This file defines the "tutorial" scenarios. Feel free to edit it to your liking.
Also see scenarios2.xml, which offers a slightly more complex example.
-->

<scenarios name="uniqueName" defaultGroup="group"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="scenarios-schema.xsd">

    <scenarioGroup name="group" useGroupDir="0">
        <scenario name="base" baseline="1">
            <!-- unmodified GCAM reference scenario -->
        </scenario>

        <!-- $10/tonne tax on fossil/industrial CO2, increasing by 5% per year -->
        <scenario name="tax-10">
            <!-- Add a line to the XML config file to load this file -->
            <add name="carbon_tax">../input/policy/carbon_tax_10_5.xml</add>
        </scenario>

        <!-- $25/tonne tax on fossil/industrial CO2, increasing by 5% per year -->
        <scenario name="tax-25">
            <add name="carbon_tax">../input/policy/carbon_tax_25_5.xml</add>
        </scenario>

        <!-- $10/tonne as above, but also tax biogenic CO2 -->
        <scenario name="tax-bio-10">
            <add name="carbon_tax">../input/policy/carbon_tax_10_5.xml</add>
            <function name="taxBioCarbon"/>
        </scenario>

        <!-- $10/tonne as above, but also tax biogenic CO2 -->
        <scenario name="tax-bio-25">
            <add name="carbon_tax">../input/policy/carbon_tax_25_5.xml</add>
            <function name="taxBioCarbon"/>
        </scenario>
    </scenarioGroup>
</scenarios>