Welcome to IDM modeling for general disease

The Institute for Disease Modeling (IDM) develops complex software modeling. The primary software, Epidemiological MODeling software (EMOD), helps determine the combination of health policies and intervention strategies that can lead to disease eradication. We share this modeling software with the research community to advance the understanding of disease dynamics.

Documentation structure

IDM recently separated the documentation into disease-specific sets that provide guidance for researchers modeling particular diseases. For example, this documentation set includes general installation and usage instructions for the generic disease model, which can be used to model a variety of diseases.

“Using the model” contains information for researchers who want to create simulations of disease dynamics using EMOD as developed by IDM.

“Advancing the model” contains information for researchers and developers who want to modify the EMOD source code to add more functionality to the model.

What’s new

This topic describes new functionality and breaking changes for recently released versions of Epidemiological MODeling software (EMOD).

EMOD v2.13

The EMOD v2.13 release includes many new features for all supported simulation types.

New configuration parameters

For the generic simulation type, the following new configuration parameters are available:

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Custom_Reports_Filename

string

NA

NA

UNINITIALIZED STRING

The name of the file containing custom report configuration parameters. Omitting this parameter or setting it to RunAllCustomReports will load all reporters found that are valid for the given simulation type. The file must be in JSON format.

{  
    "Custom_Reports_Filename": "custom_reports.json"
}

Incubation_Period_Log_Mean

float

0

3.40E+38

6

The mean of log normal for the incubation period distribution. Incubation_Period_Distribution must be set to LOG_NORMAL_DURATION.

{
    "Incubation_Period_Distribution": "LOG_NORMAL_DURATION",
    "Incubation_Period_Log_Mean": 5.758,
    "Incubation_Period_Log_Width": 0.27
}

Incubation_Period_Log_Width

float

0

3.40E+38

1

The log width of log normal for the incubation period distribution. Incubation_Period_Distribution must be set to LOG_NORMAL_DURATION.

{
    "Incubation_Period_Distribution": "LOG_NORMAL_DURATION",
    "Incubation_Period_Log_Mean": 5.758,
    "Incubation_Period_Log_Width": 0.27
}

Infectivity_Exponential_Baseline

float

0

1

0

The scale factor applied to Base_Infectivity at the beginning of a simulation, before the infectivity begins to grow exponentially. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Baseline": 0.1, 
    "Infectivity_Exponential_Delay": 90, 
    "Infectivity_Exponential_Rate": 45, 
    "Infectivity_Scale_Type": "EXPONENTIAL_FUNCTION_OF_TIME"
}

Infectivity_Exponential_Delay

float

0

3.40E+38

0

The number of days before infectivity begins to ramp up exponentially. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Baseline": 0.1, 
    "Infectivity_Exponential_Delay": 90, 
    "Infectivity_Exponential_Rate": 45, 
    "Infectivity_Scale_Type": "EXPONENTIAL_FUNCTION_OF_TIME"
}

Infectivity_Exponential_Rate

float

0

3.40E+38

0

The daily rate of exponential growth to approach to full infectivity after the delay set by Infectivity_Exponential_Delay has passed. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Rate": 45
}

Memory_Usage_Halting_Threshold_Working_Set_MB

integer

0

1.00E+06

8000

The maximum size (in MB) of working set memory before the system throws an exception and halts.

{
    "Memory_Usage_Halting_Threshold_Working_Set_MB": 4000
}

Memory_Usage_Warning_Threshold_Working_Set_MB

integer

0

1.00E+06

7000

The maximum size (in MB) of working set memory before memory usage statistics are written to the log regardless of log level.

{
    "Memory_Usage_Warning_Threshold_Working_Set_MB": 3500
}

Serialization_Time_Steps

array of integers

0

2.15E+09

The list of time steps after which to save the serialized state. 0 (zero) indicates the initial state before simulation, n indicates after the nth time step. By default, no serialized state is saved.

{
    "Serialization_Time_Steps": [
        0, 
        10
    ]
}

Serialized_Population_Filenames

array of strings

NA

NA

NA

Array of filenames with serialized population data. The number of filenames must match the number of cores used for the simulation. The file must be in .dtk format.

{
    "Serialized_Population_Filenames": [
        "state-00010.dtk"
    ]
}

Serialized_Population_Path

string

NA

NA

.

The root path for the serialized population files.

{
    "Serialized_Population_Path": "../00_Generic_Version_1_save/output"
}

To view all available configuration parameters, see Configuration parameters.

New demographics parameters

In all simulation types, you can now assign properties like risk or quality of care to nodes using NodeProperties, which are configured much like IndividualProperties. In addition, a new property type is available for both nodes and individuals called InterventionStatus, which is used by the campaign file to distribute interventions based on the other interventions an individual or node has received. This property type was previously available only for individuals in the HIV simulation type and was known as the CascadeState. The relevant campaign parameters are described in the next section.

For more information, see the table below.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

NodeProperties

array of objects

NA

NA

NA

An array that contains parameters that add properties to nodes in a simulation. For example, you can define values for intervention status, risk, and other properties and assign values to different nodes.

{
    "NodeProperties": [{
        "Property": "Risk",
        "Values": ["HIGH", "MEDIUM", "LOW"],
        "Initial_Distribution": [0.1, 0.4, 0.5]
    }]
}

Property

enum

NA

NA

NA

The individual or node property type for which you will assign arbitrary values to create groups. You can then move individuals or nodes into or out of different groups or target interventions to particular groups. Possible values are:

Age_Bin

Assign individuals to age bins. Use with Age_Bin_Edges_In_Years. Cannot be used with NodeProperties.

Accessibility

Tag individuals or nodes based on their accessibility.

Geographic

Tag individuals or nodes based on geographic characteristics.

HasActiveTB

Tag individuals or nodes based on active TB status. Typically used only with HIV ART staging interventions.

InterventionStatus

Tag individuals or nodes based on intervention status, so that receiving an intervention can affect how other interventions are distributed. Use with Disqualifying_Properties and New_Property_Value in the campaign file.

Place

Tag individuals or nodes based on place.

Risk

Tag individuals or nodes based on disease risk.

QualityofCare

Tag individuals or nodes based on the quality of medical care.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [ 0, 6, 10, 20, -1 ]
        }]
    }
}
{
    "NodeProperties": [{
        "Property": "InterventionStatus",
        "Values": ["NONE", "RECENT_SPRAY"],
        "Initial_Distribution": [1.0, 0.0]
    }]
}
New campaign parameters

The addition of NodeProperties in the demographics file also necessitated the addition of Node_Property_Restrictions to control how interventions are distributed based on the property values assigned to each node.

The new campaign parameters Disqualifying_Properties and New_Property_Value were added to every intervention to control how interventions are distributed based on properties assigned to individuals or nodes. Disqualifying_Properties prevents an intervention from being distributed to individuals or nodes with certain property values. New_Property_Value updates the property value after they receive an intervention.

These are generally used with the the property type InterventionStatus to control how interventions are distributed based on the interventions already received. For example, a household may be ineligible for clinical treatment for a length of time if they already received treatment during a drug campaign. This functionality was previously only available for individuals in the HIV simulation type and used parameters previously called Abort_States and Valid_Cascade_States.

The following event coordinators and intervention classes are new for this simulation type.

CommunityHealthWorkerEventCoordinator

The CommunityHealthWorkerEventCoordinator coordinator class is used to model a health care worker’s ability to distribute interventions to the nodes and individual in their coverage area. This coordinator distributes a limited number of interventions per day, and can create a backlog of individuals or nodes requiring the intervention. For example, individual-level interventions could be distribution of drugs and node-level interventions could be spraying houses with insecticide.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Amount_In_Shipment

integer

1

2.15E+0

2.15E+09

The number of interventions (such as vaccine doses) that a health worker or clinic receives in a shipment. Interventions can only be distributed if they are in stock; stock is updated every Days_Between_Shipments with the Amount_In_Shipment.

{
    "Amount_In_Shipment": 10
}

Days_Between_Shipments

float

1

3.40E+3

3.40E+38

The number of days to wait before a clinic or health worker receives a new shipment of interventions (such as vaccine doses). Interventions can only be distributed if they are in stock; stock is updated every Days_Between_Shipments with the Amount_In_Shipment.

{
    "Days_Between_Shipments": 30
}

Duration

float

0

3.40E+3

3.40E+38

The number of days for an event coordinator to be active before it expires.

{
    "Duration": 65
}

Initial_Amount

float

0

3.40E+3

6

The initial amount of stock of interventions (such as vaccine doses). Interventions can only be distributed if they are in stock; stock is updated every Days_Between_Shipments with the Amount_In_Shipment.

{
    "Initial_Amount": 10
}

Initial_Amount_Distribution_Type

enum

NA

NA

NOT_INITIALIZED

The distribution type to set when initializing Initial_Amount. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Initial_Amount_Distribution_Type": "FIXED_DURATION"
}

Initial_Amount_Max

float

0

3.40E+3

0

The maximum amount of initial stock when Initial_Amount_Distribution_Type is set to UNIFORM_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "UNIFORM_DURATION",
    "Initial_Amount_Min": 5,
    "Initial_Amount_Max": 10
}

Initial_Amount_Mean

float

0

3.40E+3

6

The average amount of initial stock when Initial_Amount_Distribution_Type is set to GAUSSIAN_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "GAUSSIAN_DISTRIBUTION",
    "Initial_Amount_Std_Dev": 1,
    "Initial_Amount_Mean": 5
}

Initial_Amount_Min

float

0

3.40E+3

0

The minimum amount of initial stock when Initial_Amount_Distribution_Type is set to UNIFORM_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "UNIFORM_DURATION",
    "Initial_Amount_Min": 5,
    "Initial_Amount_Max": 10
}

Initial_Amount_Std_Dev

float

0

3.40E+3

1

The standard deviation for the amount of initial stock when Initial_Amount_Distribution_Type is set to GAUSSIAN_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "GAUSSIAN_DISTRIBUTION",
    "Initial_Amount_Std_Dev": 1,
    "Initial_Amount_Mean": 5
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "BroadcastEvent",
        "Broadcast_Event": "EventFromIntervention"
    }
}

Max_Distributed_Per_Day

integer

1

2.15E+0

2.15E+09

The maximum number of interventions (such as vaccine doses) that can be distributed by health workers or clinics in a given day.

{
    "Max_Distributed_Per_Day": 1
}

Max_Stock

integer

0

2.15E+0

2.15E+09

The maximum number of interventions (such as vaccine doses) that can be stored by a health worker or clinic. If the amount of interventions in a new shipment and current stock exceeds this value, only the number of interventions specified by this value will be stored.

{
    "Max_Stock": 12
}

Trigger_Condition_List

array of strings

NA

NA

NoTrigger

The list of events that are of interest to the community health worker (CHW). If one of these events occurs, the individual or node is put into a queue to receive the CHW’s intervention. The CHW processes the queue when the event coordinator is updated. See Event list for possible values.

{
    "Trigger_Condition_List": ["ListenForEvent"]
}

Waiting_Period

float

0

3.40E+3

3.40E+38

The number of days a person or node can be in the queue waiting to get the intervention from the community health worker (CHW). If a person or node is in the queue, they will not be re-added to the queue if the event that would add them to the queue occurs. This allows them to maintain their priority, however they could be removed from the queue due to this waiting period.

{
    "Waiting_Period": 15
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Min

float

0

3.40E+3

0

The lower end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}
ImportPressure

The ImportPressure intervention class extends the ImportCases outbreak event. Rather than importing a deterministic number of cases on a scheduled day, ImportPressure applies a set of per-day rates of importation of infected individuals, over a corresponding set of durations. ImportPressure inherits from Outbreak; the Antigen and Genome parameters are defined as they are for all Outbreak events.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Daily_Import_Pressures

array of floats

0

3.40E+3

0

The rate of per-day importation for each node that the intervention is distributed to.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Durations": [100, 100, 100, 100, 100, 100, 100],
        "Daily_Import_Pressures": [0.1, 5.0, 0.2, 1.0, 2.0, 0.0, 10.0],
        "class": "ImportPressure"
    }
}

Durations

array of integers

0

2.15E+0

1

The durations over which to apply import pressure.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Durations": [100, 100, 100, 100, 100, 100, 100],
        "Daily_Import_Pressures": [0.1, 5.0, 0.2, 1.0, 2.0, 0.0, 10.0],
        "class": "ImportPressure"
    }
}

Number_Cases_Per_Node

integer

0

2.15E+0

1

The number of new cases of Outbreak to import (per node).

Note

This will increase the population and there is no control over demographics of these individuals.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "ImportCases",
        "Number_Cases_Per_Node": 10,
        "class": "Outbreak"
    }
}

Import_Age

float

0

43800

365

The age (in days) of infected import cases.

{
    "Import_Age": 10000
}

Incubation_Period_Override

integer

-1

2.15E+0

-1

The incubation period, in days, that infected individuals will go through before becoming infectious. This value overrides the incubation period set in the configuration file. Set to -1 to honor the configuration parameter settings.

{
    "Incubation_Period_Override": 0
}

Antigen

integer

0

10

0

The antigenic ID of the outbreak infection.

{  
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual"
    }   
}

Genome

integer

-2.15E+0

2.15E+0

0

The genetic ID of the outbreak infection.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 0
    }
}
IndividualImmunityChanger

The IndividualImmunityChanger intervention class acts essentially as a MultiEffectVaccine, with the exception of how the behavior is implemented. Rather than attaching a persistent vaccine intervention object to an individual’s intervention list (as a campaign-individual-multieffectboostervaccine does), the IndividualImmunityChanger directly alters the immune modifiers of the individual’s susceptibility object and is then immediately disposed of. Any immune waning is not governed by Waning effect classes, as MultiEffectVaccine is, but rather by the immunity waning parameters in the configuration file.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Boost_Acquire

float

0

1

0

Specifies the boosting effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Acquire": 0.7
}

Boost_Mortality

float

0

1

0

Specifies the boosting effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Mortality": 1.0
}

Boost_Threshold_Acquire

float

0

1

0

Specifies how much acquisition immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Acquire": 0.0
}

Boost_Threshold_Mortality

float

0

1

0

Specifies how much mortality immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Mortality": 0.0
}

Boost_Threshold_Transmit

float

0

1

0

Specifies how much transmission immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Transmit": 0.0
}

Boost_Transmit

float

0

1

0

Specifies the boosting effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Transmit": 0.5
}

Prime_Acquire

float

0

1

0

Specifies the priming effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Acquire": 0.1
}

Prime_Mortality

float

0

1

0

Specifies the priming effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Mortality": 0.3
}

Prime_Transmit

float

0

1

0

Specifies the priming effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Transmit": 0.2
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}
MultiEffectBoosterVaccine

The MultiEffectBoosterVaccine intervention class is derived from MultiEffectVaccine and preserves many of the same parameters. Upon distribution and successful take, the vaccine’s effect in each immunity compartment (acquisition, transmission, and mortality) is determined by the recipient’s immune state. If the recipient’s immunity modifier in the corresponding compartment is above a user-specified threshold, then the vaccine’s initial effect will be equal to the corresponding priming parameter. If the recipient’s immune modifier is below this threshold, then the vaccine’s initial effect will be equal to the corresponding boost parameter. After distribution, the effect wanes, just like a MultiEffectVaccine. The behavior is intended to mimic biological priming and boosting.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Acquire_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine acquisition. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Acquire_Config": {
        "Initial_Effect": 0.9,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Mortality_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine mortality. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Mortality_Config": {
        "Initial_Effect": 1.0,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Transmit_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine transmission. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Transmit_Config": {
        "Initial_Effect": 0.6,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Boost_Acquire

float

0

1

0

Specifies the boosting effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Acquire": 0.7
}

Boost_Mortality

float

0

1

0

Specifies the boosting effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Mortality": 1.0
}

Boost_Threshold_Acquire

float

0

1

0

Specifies how much acquisition immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Acquire": 0.0
}

Boost_Threshold_Mortality

float

0

1

0

Specifies how much mortality immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Mortality": 0.0
}

Boost_Threshold_Transmit

float

0

1

0

Specifies how much transmission immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Transmit": 0.0
}

Boost_Transmit

float

0

1

0

Specifies the boosting effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Transmit": 0.5
}

Prime_Acquire

float

0

1

0

Specifies the priming effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Acquire": 0.1
}

Prime_Mortality

float

0

1

0

Specifies the priming effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Mortality": 0.3
}

Prime_Transmit

float

0

1

0

Specifies the priming effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Transmit": 0.2
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
NodePropertyValueChanger

The NodePropertyValueChanger intervention class sets a given node property to a new value. You can also define a duration in days before the node property reverts back to its original value, the probability that a node will change its node property to the target value, and the number of days over which nodes will attempt to change their individual properties to the target value. This node-level intervention functions in a similar manner as the individual-level intervention, PropertyValueChanger.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Target_NP_Key_Value

string

NA

NA

NA

The NodeProperty key:value pair, as defined in the demographics file, to assign to the node.

{
    "Target_NP_Key_Value": "InterventionStatus:NONE"
}

Daily_Probability

float

0

1

1

The probability that an individual will move to the Target_Property_Value.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Maximum_Duration

float

-1

3.40E+3

3.40E+38

The maximum amount of time individuals have to move to a new group. This timing works in conjunction with Daily_Probability.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Revert

float

0

10000

0

The number of days before an individual moves back to their original group.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
SimpleBoosterVaccine

The SimpleBoosterVaccine intervention class is derived from SimpleVaccine and preserves many of the same parameters. The behavior is much like SimpleVaccine, except that upon distribution and successful take, the vaccine’s effect is determined by the recipient’s immune state. If the recipient’s immunity modifier in the corresponding channel (acquisition, transmission, or mortality) is above a user-specified threshold, then the vaccine’s initial effect will be equal to the corresponding priming parameter. If the recipient’s immune modifier is below this threshold, then the vaccine’s initial effect will be equal to the corresponding boosting parameter. After distribution, the effect wanes, just like SimpleVaccine. In essence, this intervention provides a SimpleVaccine intervention with one effect to all naive (below- threshold) individuals, and another effect to all primed (above-threshold) individuals; this behavior is intended to mimic biological priming and boosting.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Boost_Effect

float

0

1

1

Specifies the boosting effect on [acquisition/transmission/mortality] immunity for previously exposed individuals (either natural or vaccine-derived). This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Intervention_Config": {
        "Cost_To_Consumer": 10.0,
        "Vaccine_Take": 1,
        "Vaccine_Type": "MortalityBlocking",
        "Prime_Effect": 0.25,
        "Boost_Effect": 0.45,
        "Boost_Threshold": 0.0,
        "Waning_Config": {
            "Box_Duration": 10,
            "Initial_Effect": 1,
            "class": "WaningEffectBox"
        },
        "class": "SimpleBoosterVaccine"
    }
}

Boost_Threshold

float

0

1

0

Specifies how much immunity is required before the vaccine changes from a priming effect to a boosting effect.

{
    "Intervention_Config": {
        "Cost_To_Consumer": 10.0,
        "Vaccine_Take": 1,
        "Vaccine_Type": "MortalityBlocking",
        "Prime_Effect": 0.25,
        "Boost_Effect": 0.45,
        "Boost_Threshold": 0.0,
        "Waning_Config": {
            "Box_Duration": 10,
            "Initial_Effect": 1,
            "class": "WaningEffectBox"
        },
        "class": "SimpleBoosterVaccine"
    }
}

Prime_Effect

float

0

1

1

Specifies the priming effect on [acquisition/transmission/mortality] immunity for naive individuals (without natural or vaccine-derived immunity).

{
    "Intervention_Config": {
        "Cost_To_Consumer": 10.0,
        "Vaccine_Take": 1,
        "Vaccine_Type": "MortalityBlocking",
        "Prime_Effect": 0.25,
        "Boost_Effect": 0.45,
        "Boost_Threshold": 0.0,
        "Waning_Config": {
            "Box_Duration": 10,
            "Initial_Effect": 1,
            "class": "WaningEffectBox"
        },
        "class": "SimpleBoosterVaccine"
    }
}

Efficacy_Is_Multiplicative

boolean

NA

NA

1

The overall vaccine efficacy when individuals receive more than one vaccine. When set to true (1), the vaccine efficacies are multiplied together; when set to false (0), the efficacies are additive.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Waning_Config

JSON object

NA

NA

NA

The configuration of how the intervention efficacy wanes over time. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Waning_Config": {
        "Box_Duration": 3650,
        "Initial_Effect": 1,
        "class": "WaningEffectBox"
    }
}

Vaccine_Type

enum

NA

NA

Generic

The type of vaccine to distribute in a vaccine intervention. Possible values are:

Generic

The vaccine can reduce transmission, acquisition, and mortality.

TransmissionBlocking

The vaccine will reduce pathogen transmission.

AcquisitionBlocking

The vaccine will reduce the acquisition of the pathogen by reducing the force of infection experienced by the vaccinated individual.

MortalityBlocking

The vaccine reduces the disease-mortality rate of a vaccinated individual.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}

EMOD v2.10

The EMOD v2.10 release includes new and updated malaria configuration, demographic, and intervention parameters. With this release, EMOD now uses Visual Studio 2015, Boost 1.61.0, and SCons 2.5.0.

EMOD software upgrades
Microsoft Visual Studio

EMOD now uses Visual Studio 2015, and Visual Studio 2012 is no longer supported. The Visual Studio solution file in the EMOD source, EradicationKernel, has been updated for Visual Studio 2015. If you have custom reporter EMODules (DLLS) that were built using Visual Studio 2012, you will need to rebuild them with Visual Studio 2015; otherwise, your simulation will crash when it attempts to load the DLLs built by Visual Studio 2012.

Boost

EMOD now supports using Boost 1.61.0. If you continue to use Boost 1.51.0, you will get the following warning, “Unknown compiler version - please run the configure tests and report the results.”

Environment variables

To make it easier to use Boost and Python with Visual Studio, IDM paths have been created. These two paths, IDM_BOOST_PATH and IDM_PYTHON_PATH, need to be added to your environment variables by using either the setx command from a command line or the Windows System Properties panel.

SCons

EMOD was tested using SCons 2.5.0, as it supports Visual Studio 2015. If you do not add the new IDM environment variables for Boost and Python, you will need to modify the Boost and Python paths in the SConstruct file in the EMOD root directory.

Python

EMOD was tested with Python 2.7.11 and 2.7.12. If you are building the EMOD executable (Eradication.exe) and have an earlier version of Python (for example, 2.7.2), you will see the following warning message on some files, “c:python27includepymath.h(22): warning C4273: ‘round’: inconsistent dll linkage.” Upgrade to Python 2.7.11 or 2.7.12 to get rid of the warning message.

For more information, see Prerequisites for working with EMOD source code.

EMOD installation

Epidemiological MODeling software (EMOD) can be installed on computers running Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit) or CentOS 7.1 on Azure. For both operating systems, there are relatively few prerequisites required and the EMOD executable (Eradication.exe) or Eradication binary is pre- built from the latest EMOD source code release. After completing installation, you can run simulations locally or on an HPC cluster using real-world data.

Note

If you want to download and modify the EMOD source code and build the Eradication.exe or Eradication binary yourself, see EMOD source code installation.

Install EMOD on Windows

Follow the steps below to install EMOD on computers running Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit). This installs the pre-built Eradication.exe and all software necessary to run simulations.

Note

If you want to download and modify the EMOD source code and build the Eradication.exe yourself, see EMOD source code installation.

The EMOD executable (Eradication.exe) is tested using Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit). Windows HPC Server is used for testing remote simulations on a high-performance computing (HPC) cluster and the other Windows operating systems are used to test local simulations.

  1. Install the Microsoft HPC Pack 2012 Client Utilities Redistributable Package (64-bit). See http://www.microsoft.com/en-us/download/details.aspx?id=36044 for instructions.

  2. Install the Microsoft MPI v8. See https://www.microsoft.com/en-us/download/details.aspx?id=54607 for instructions, being sure to run the MSMpiSetup.exe file.

  3. Download the EMOD executable (Eradication.exe). See EMOD releases on GitHub.

(Optional) Install plotting software

None of the following plotting software is required to run simulations with EMOD, but they are useful for creating graphs from and evaluating the model output. In addition, EMOD provides many Python scripts for analyzing data.

Note

IDM does not provide support or guarantees for any third-party software, even software that we recommend you install. Send feedback if you encounter any issues, but any support must come from the makers of those software packages and their user communities.

Python and Python packages

Python is required to install many of the software packages described below.

We recommended that you download some of the Python packages from http://www.lfd.uci.edu/~gohlke/pythonlibs, a page compiled by Christoph Gohlke, University of California, Irvine. The libraries there are compiled Windows binaries, including the 64-bit versions required by EMOD.

  1. Install Python 2.7.11 or 2.7.12. See https://www.python.org/downloads/ for instructions.

    • In the Customize Python dialog box, verify that Add python.exe to PATH is selected to add Python to the PATH environment variable on your computer.

  2. From Control Panel, select Advanced system settings, and then click Environment Variables.

  3. Add a new variable called IDM_PYTHON_PATH and set it to the directory where you installed Python, and then click OK.

  4. Open a Command Prompt window and type the following to verify installation:

    python --version
    

The Python package manager, pip, is installed as part of Python 2.7.11 or 2.7.12 and is used to install other software packages.

Python utilities

The Python utilities dateutil, six, and pyparsing provide text parsing and datetime functionality.

  1. Open a Command Prompt window.

  2. Enter the following commands:

    pip install python-dateutil
    pip install pyparsing
    
NumPy

The NumPy package adds support for large, multi-dimensional arrays and matrices to Python.

  1. Go to http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy and select the WHL file for NumPy 1.11.3 (64-bit) that is compatible with Python 2.7.11 or 2.7.12.

  2. Save the file to your Python installation directory.

  3. Open a Command Prompt window and navigate to the Python installation directory, then enter the following, substituting the name of the specific NumPy WHL file you downloaded:

    pip install numpy-1.x.x+mkl-cp27m-win_amd64.whl
    
Matplotlib

Matplotlib is a Python library for making publication quality plots using syntax familiar to MATLAB users. Matplotlib also uses NumpPy for numeric manipulation. Output formats include PDF, Postscript, SVG, and PNG, as well as a screen display.

  1. Go to http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib and select the WHL file for Matplotlib 1.5.3 (64-bit) that is compatible with Python 2.7.11 or 2.7.12.

  2. Save the file to your Python installation directory.

  3. Open a Command Prompt window and navigate to the Python installation directory, then enter the following, substituting the name of the specific matplotlib WHL file you downloaded:

    pip install matplotlib-1.x.x+mkl-cp27m-win_amd64.whl
    
R

R is a free software environment for statistical computing and graphics.

MATLAB

MATLAB is a high-level language and interactive environment for numerical computation, visualization, and programming. The MATLAB Statistics and Machine Learning Toolbox™ provides functions and applications to describe, analyze and model data using statistics and machine learning algorithms.

  1. Go to http://www.mathworks.com/products/matlab/ and install MATLAB R2015a.

  2. If desired, go to https://www.mathworks.com/products/statistics.html and install the MATLAB Statistics and Machine Learning Toolbox™ R2015a.

Install EMOD on CentOS on Azure

Follow the steps below to install EMOD on CentOS 7.1 on Azure environments. This installs the pre- built Eradication binary and all software needed to run simulations. The setup script installs most prerequisite software, including Python and the Python packages dateutil, six, pyparsing, NumPy, and matplotlib. Other prerequisites, such as Boost 1.61.0 and Microsoft MPI v8, are declared by the script as required. Because the installation instructions will vary based on the particular distribution you are running, instruction information is not included here.

Note

If you want to download and modify the EMOD source code and build the Eradication binary yourself, see EMOD source code installation.

The Eradication binary is tested and supported on a CentOS 7.1 on Azure virtual machine. It has also been successfully built and run on Ubuntu, SUSE, and Arch, but has not been tested and is not supported on those Linux distributions.

Note

IDM does not provide support or guarantees for any third-party software, even software that we recommend you install. Send feedback if you encounter any issues, but any support must come from the makers of those software packages and their user communities.

The script provides the option of installing the EMOD source code and input data files provided by IDM, but these steps will install a pre-built version of the Eradication binary. For information on building the Eradication binary from source code, see EMOD source code installation.

Before you begin, you must have the following:

  • sudo privileges to install packages

  • 15 GB free in your home directory (if you install the EMOD source code and input data files)

  • An Internet connection

  1. Download and run the PrepareLinuxEnvironment.sh script on EMOD releases on GitHub.

    Respond to the prompts for information while the script is running. If you choose not to download the EMOD source and input data files, do the following. This example assumes that a directory named IDM is in your home directory and contains the subdirectories EMOD, containing the EMOD source code, and EMOD_InputData, containing the input data files directory.

    1. Set the EMOD_ROOT environment variable to the path to the EMOD source path:

      EMOD_ROOT=~/IDM/EMOD
      
    2. Put Scripts and . in the path:

      export PATH=$PATH:.:$EMOD_ROOT/Scripts
      
    3. Create a symlink from the EMOD directory to InputDataFiles:

      ln -s /home/general/IDM/EMOD-InputData $EMOD_ROOT/InputData
      
    4. If you run simulations using in the same session that you updated EMOD_ROOT and the Scripts path, reload the .bashrc file using source .bashrc.

  2. Download the Eradication binary for CentOS 7.1 on Azure. See on EMOD releases on GitHub.

(Optional) Install plotting software

None of the following plotting software is required to run simulations with EMOD, but they are useful for creating graphs from and evaluating the model output. In addition, EMOD provides many Python scripts for analyzing data.

Note

IDM does not provide support or guarantees for any third-party software, even software that we recommend you install. Send feedback if you encounter any issues, but any support must come from the makers of those software packages and their user communities.

R

R is a free software environment for statistical computing and graphics.

MATLAB

MATLAB is a high-level language and interactive environment for numerical computation, visualization, and programming. The MATLAB Statistics and Machine Learning Toolbox™ provides functions and applications to describe, analyze and model data using statistics and machine learning algorithms.

  1. Go to http://www.mathworks.com/products/matlab/ and install MATLAB R2015a.

  2. If desired, go to https://www.mathworks.com/products/statistics.html and install the MATLAB Statistics and Machine Learning Toolbox™ R2015a.

Introduction to the software

The Institute for Disease Modeling (IDM) develops detailed simulations of disease transmission through the use of extensive and complex software modeling. The primary software, Epidemiological MODeling software (EMOD), helps determine the combination of health policies and intervention strategies that can lead to disease eradication. EMOD calculates how diseases may spread in particular areas and is used to analyze the effects of current and future health policies and intervention strategies. It supports infectious disease campaign planning, data gathering, new product development, and policy decisions. We share this modeling software with the research community to advance the understanding of disease dynamics.

EMOD supports the following simulation types for modeling a variety of diseases:

  • Generic disease (GENERIC_SIM)

  • Vector-borne diseases (VECTOR_SIM)

  • Malaria (MALARIA_SIM)

  • Tuberculosis (TB_SIM)

  • Sexually transmitted infections (STI_SIM)

  • HIV (HIV_SIM)

The illustration below shows how the simulation types are built upon one another. All parameters available in the generic simulation type are inherited by the vector simulation type. The vector simulation type adds additional parameters specific to the biology of vector-borne diseases, which in turn are inherited by the malaria simulation type and so on. Therefore, depending on the simulation type you select, different parameters are available for you to use. In addition, simulation types for broader classes of disease can be extended to build your own disease-specific model.

_images/simulation-types.png

Simulation type inheritance

EMOD is a stochastic, agent-based model that simulates the actions and interactions of individuals within geographic areas known as nodes to understand the disease dynamics in a population over time. EMOD can produce statistically significant results over a broad set of parameters and scenarios. Quantitative analysis of the simulated output enables disease eradication efforts to make more data-driven decisions. The IDM research team has published many articles related to modeling, as well as the modeling concepts underpinning EMOD. For a list of published articles, see IDM Publications.

This section provides the conceptual overview of EMOD. The architecture diagram below shows, at a high level, how the system functions. If you run simulations in parallel on a multi-node cluster, there is also a Message Passing Interface (MPI) component used to pass data between multiple instances of EMOD.

_images/architecture.png

High-level EMOD system architecture

Input data files

Not all files accepted as input for running a simulation are considered input data files. Rather, input data files contain the relatively fixed information about a population to model. For example, climate, geography, demographics, and migration data.

Configuration file

The configuration file contains parameters that control many different aspects of the simulation. EMOD provides hundreds of parameters for you to configure your simulation. For example, configuration parameters can control the following:

  • The disease or disease class to simulate (simulation type)

  • The name and location for the input data files and output files

  • Whether to include births, deaths, and migration

  • Disease attributes, such as infectivity, transmission, immunity, and mortality

  • The computing resources to use

Campaign file

The campaign file contains parameters that distribute outbreaks and the interventions used to control the spread of disease. For example, campaign parameters can control the following:

  • Target demographic (age, location, gender, etc.) for interventions

  • Diagnostic tests to use

  • The cost and timing of interventions

Running a simulation

The EMOD executable (Eradication.exe) accepts the input data, configuration, and campaign files and then simulates the susceptibility and infection of individuals within each geographic node. The simulation type controls the transmission mechanism of the disease. After the simulation is complete, the Eradication.exe produces output reports that describe various aspects of the disease dynamics within the modeled population.

You can run simulations locally or on a multi-core cluster. Because the model is stochastic, you must run simulations multiple times to produce scientifically valid results.

Depending on how you run the simulation, other programs or environments external to EMOD may also output error and logging files.

Output files

After the simulation finishes, a reporter extracts simulation data, aggregates it, and outputs it to a file (known as an output report). Most of the reports are also JSON files, the most important of which is InsetChart.json. The InsetChart.json file provides simulation-wide averages of disease prevalence at each time step.

See the topics listed below for a more detailed explanation of each of these system components.

Input data files

EMOD accepts the following categories of input data files that contain the relatively fixed information about the population within each geographic node. For example, the number of individuals, geographic data, climate, demographics, and migration data. This is in contrast to the demographic, geographic, and migration parameters in the configuration file that control simulation-wide qualities, such as enabling air migration across all nodes in the simulation.

Although a demographics file is the only required input data file, additional files are generally needed for a realistic simulation. The demographics files use JavaScript Object Notation (JSON). The other input data files use both a JSON file for metadata and an associated binary file that contains the actual data.

The Institute for Disease Modeling (IDM) provides collections of input data files for many different locations in the world for download on GitHub. Except for the demographics file, you will typically use these input data files in their default state. See Use input data files for more information.

Demographics

Demographics files are JSON formatted files containing information on the demographics of the population in a geographical region to simulate. For example, the number of individuals and the distribution for age, gender, immunity, risk, and mortality.

In addition, demographics files are useful for creating heterogeneous groups within a population. You can define values for accessibility, age, geography, risk, and other properties and assign individuals to groups based on those property values. For example, you might want to divide a population up into different bins based on age so you can target interventions to individuals in a particular age range. Another common use is to configure treatment coverage to be higher for individuals in easily accessible regions and lower for individuals in areas that are difficult to access.

EMOD assumes homogeneous mixing and disease transmission for the generic simulation type. You can use the HINT feature to add heterogeneous transmission to your generic model. You cannot manually configure heterogeneous transmission using HINT with other simulation types because the heterogeneity in transmission for specific diseases and disease classes is already configured by the simulation type.

You can specify multiple demographics files, which function as a “base layer” file and one or more “overlay” files that override the base layer configuration. Overlay files can change the value of parameters already specified in the base layer or add new parameters. Support for multiple demographics layers allows for the following scenarios:

  • Separating different sets of parameters and values into individual layers (for example, to separate those that are useful for specific diseases into different layers)

  • Adding new parameters for a simulation into a new layer for easier prototyping

  • Overriding certain parameters of interest in a new layer

  • Overriding certain parameters for a particular sub-region

  • Simulating subsets of a larger region for which input data files have been constructed

Migration

Migration files describe the rate of migration of individuals in and out of a geographic node. There are four types of migration files that can be used by EMOD: local migration, regional migration, air migration, and sea migration.

For all types, migration data is contained in a set of two files, a JSON metadata file with header information and a binary data file with the actual migration data. Both files are required. The basic file structure is identical for all types, with the only exception being the number of columns per row allowed to each type.

Local

Local migration describes the foot travel of people into and out of adjacent nodes. A local migration file is required for simulations that support more than one node.

Regional

Regional migration describes migration via a road or rail network. If a node is not part of the network, the regional migration of individuals to and from that node considers the closest road hub city. When you create the migration file, you must create a Voronoi tiling based on road hubs of the region, with each non-hub connected to the hub of its tile.

Air

Air migration describes migration via airplane travel. It is usually required for simulations of an entire country or larger geographies.

Sea

Sea migration describes migration via ship.

Climate

There are two general types of climate files usable by EMOD: climate files generated through actual data, referred to as “climate by data,” and climate files generated from the Koppen classification system, referred to as “climate by Koppen.”

For both types, climate data is contained in a set of two files, a JSON metadata file with header information and a binary file that contains the actual climate data. Both files are required.

Climate by data

Climate by data files contain real data gathered from weather stations in the region to be simulated. This includes rainfall, temperature, relative humidity, and so on.

Climate by Koppen

Climate by Koppen files contain the Koppen classifier for the region. The Koppen classification system is one of the most widely used climate classification systems. It makes the assumption that native vegetation is the best reflection of climate.

Load balancing

When running a simulation on a multi-core HPC cluster, you can include a load balancing file to control how the computing load is distributed across the cluster. The load balancing file is a binary file that allocates the simulation of each geographic node to cores in the cluster. If no file is submitted, EMOD allocates nodes to cores according to a checkerboard pattern.

Configuration file

The primary means of configuring the disease simulation is the configuration file. This required file is a JavaScript Object Notation (JSON) formatted file that is typically named config.json. The configuration file controls many different aspects of the simulation. For example,

  • The names of the campaign file and input data files to use

  • Simulation-wide demographics, climate, and migration data

  • General disease attributes such as infectivity, immunity, mortality, and so on

  • Attributes specific to the disease type being modeled, including treatment efficacy

  • The reports to output from the simulation

IDM provides complete simulation scenarios in the Regression directory on GitHub. Within each of the simulation subdirectories, there is a config.json file. The Scenarios subdirectory contains the files used in the tutorials.

The following is an example of configuration file.

{
    "parameters": {
        "Acquisition_Blocking_Immunity_Decay_Rate": 0.1,
        "Acquisition_Blocking_Immunity_Duration_Before_Decay": 60,
        "Age_Initialization_Distribution_Type": "DISTRIBUTION_SIMPLE",
        "Animal_Reservoir_Type": "NO_ZOONOSIS",
        "Base_Incubation_Period": 0,
        "Base_Individual_Sample_Rate": 1,
        "Base_Infectious_Period": 4,
        "Base_Infectivity": 3.5,
        "Base_Mortality": 0,
        "Base_Population_Scale_Factor": 1,
        "Birth_Rate_Dependence": "POPULATION_DEP_RATE",
        "Birth_Rate_Time_Dependence": "NONE",
        "Burnin_Cache_Mode": "none",
        "Burnin_Cache_Period": 0,
        "Burnin_Name": "",
        "Campaign_Filename": "campaign.json",
        "Climate_Model": "CLIMATE_OFF",
        "Config_Name": "00_DEFAULT",
        "Custom_Reports_Filename": "NoCustomReports",
        "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF",
        "Default_Geography_Initial_Node_Population": 1000,
        "Default_Geography_Torus_Size": 10,
        "Demographics_Filenames": [
            "../00_Default/demographics.json"
        ],
        "Enable_Absolute_Time": "NO",
        "Enable_Aging": 1,
        "Enable_Birth": 1,
        "Enable_Default_Reporting": 1,
        "Enable_Default_Shedding_Function": 1,
        "Enable_Demographics_Birth": 0,
        "Enable_Demographics_Builtin": 0,
        "Enable_Demographics_Gender": 1,
        "Enable_Demographics_Other": 0,
        "Enable_Demographics_Reporting": 1,
        "Enable_Disease_Mortality": 0,
        "Enable_Heterogeneous_Intranode_Transmission": 0,
        "Enable_Immune_Decay": 0,
        "Enable_Immunity": 1,
        "Enable_Interventions": 1,
        "Enable_Maternal_Infection_Transmission": 0,
        "Enable_Property_Output": 0,
        "Enable_Spatial_Output": 0,
        "Enable_Superinfection": 0,
        "Enable_Vital_Dynamics": 0,
        "Geography": "",
        "Immunity_Acquisition_Factor": 0,
        "Immunity_Initialization_Distribution_Type": "DISTRIBUTION_OFF",
        "Immunity_Mortality_Factor": 0,
        "Immunity_Transmission_Factor": 0,
        "Incubation_Period_Distribution": "FIXED_DURATION",
        "Individual_Sampling_Type": "TRACK_ALL",
        "Infection_Updates_Per_Timestep": 1,
        "Infectious_Period_Distribution": "EXPONENTIAL_DURATION",
        "Infectivity_Scale_Type": "CONSTANT_INFECTIVITY",
        "Job_Node_Groups": "Chassis08",
        "Job_Priority": "BELOWNORMAL",
        "Listed_Events": [],
        "Load_Balance_Filename": "",
        "Local_Simulation": 0,
        "Maternal_Transmission_Probability": 0,
        "Max_Individual_Infections": 1,
        "Max_Node_Population_Samples": 40,
        "Migration_Model": "NO_MIGRATION",
        "Minimum_Adult_Age_Years": 15,
        "Mortality_Blocking_Immunity_Decay_Rate": 0.001,
        "Mortality_Blocking_Immunity_Duration_Before_Decay": 60,
        "Mortality_Time_Course": "DAILY_MORTALITY",
        "Node_Grid_Size": 0.042,
        "Num_Cores": 1,
        "Number_Basestrains": 1,
        "Number_Substrains": 1,
        "PKPD_Model": "FIXED_DURATION_CONSTANT_EFFECT",
        "Population_Density_C50": 30,
        "Population_Density_Infectivity_Correction": "CONSTANT_INFECTIVITY",
        "Population_Scale_Type": "USE_INPUT_FILE",
        "Report_Event_Recorder": 0,
        "Run_Number": 1,
        "Sample_Rate_0_18mo": 1,
        "Sample_Rate_10_14": 1,
        "Sample_Rate_15_19": 1,
        "Sample_Rate_18mo_4yr": 1,
        "Sample_Rate_20_Plus": 1,
        "Sample_Rate_5_9": 1,
        "Sample_Rate_Birth": 1,
        "Serialization_Test_Cycles": 0,
        "Simulation_Duration": 90,
        "Simulation_Timestep": 1,
        "Simulation_Type": "GENERIC_SIM",
        "Start_Time": 0,
        "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY",
        "Transmission_Blocking_Immunity_Decay_Rate": 0.1,
        "Transmission_Blocking_Immunity_Duration_Before_Decay": 60,
        "x_Air_Migration": 1,
        "x_Birth": 1,
        "x_Local_Migration": 1,
        "x_Other_Mortality": 1,
        "x_Population_Immunity": 1,
        "x_Regional_Migration": 1,
        "x_Sea_Migration": 1,
        "x_Temporary_Larval_Habitat": 1
    }
}
Overlay file

As you work more with EMOD, you may want to change the values of a view parameters of interest while keeping the rest constant, for example, when running simulation experiments or testing source code changes.

You have the option of creating an overlay file to keep configuration parameters of interest in a separate file from the complete configuration file that contains default values. These files can be flattened into a single file and the values in the overlay file will override those in the default file.

See Configuration parameters for a comprehensive list and description of all parameters available to use in the configuration file for this simulation type.

Campaign file

The campaign file is an optional file that distributes outbreaks and contains all parameters that define the collection of interventions that make up a disease eradication campaign. For example,

  • When, how, and who to test for a disease

  • When, how, and who to distribute treatments to

  • The vaccines or other preventative interventions to use

  • The medications to use for treatment

Like the configuration file, the campaign file is a JavaScript Object Notation (JSON) formatted file. It is hierarchically organized into logical groups of parameters that can have arbitrary levels of nesting. For some interventions, there can be a very complex hierarchical structure, including recursion. Typically, the file is named campaign.json. The relative path to this file is specified by Campaign_Filename in the configuration file.

To distribute an intervention, you must configure the following:

campaign event

A JSON object that determines when and where an intervention is distributed during a campaign.

event coordinator

A JSON object that determines who will receive a particular intervention during a campaign.

intervention

A JSON object that determines what will be distributed to reduce the spread of a disease. An intervention can be distributed either to an individual (such as a vaccine, drug, or bednet) or to a node (such as a larvicide). Sometimes this can be an intermediate intervention that schedules another intervention.

IDM provides complete simulation scenarios in the Regression directory on GitHub. Within each of the simulation subdirectories, there is a campaign.json file. The Scenarios subdirectory contains the files used in the tutorials.

Overlay file

As you work more with EMOD, you may want to change the values of a view parameters of interest while keeping the rest constant, for example, when running simulation experiments or testing source code changes.

You have the option of creating an overlay file to keep campaign parameters of interest in a separate file from the complete campaign file that contains default values. These files can be flattened into a single file and the values in the overlay file will override those in the default file.

See Campaign parameters for a comprehensive list and description of all parameters available to use in the campaign file for this simulation type.

Running a simulation

The EMOD executable (Eradication.exe) consumes the input data files, configuration file, and, optionally, campaign file to run simulations that model disease dynamics and campaign efficacy. You have a few different options for running simulations. The option you choose will depend upon whether you want to run one or more simulations, to run simulations locally or on a remote cluster (for large simulations or multiple simulations), or to run simulations for debugging the source code. This topic briefly describes the different options you have for running simulations.

Run a single simulation

You will generally want to run simulations using the EMOD command-line options. This will run a single simulation and put the output files in a local directory.

You must either download the latest version of Eradication.exe from GitHub or clone the EMOD source from GitHub and build Eradication.exe yourself. This gives you access to the latest features and parameters for EMOD.

Run multiple simulations

Because the EMOD model is stochastic, simulations must be run multiple times to return scientifically valid results. Therefore, you have the following options to run multiple simulations at a time, either locally or remotely on a high-performance computing (HPC) cluster. Generally, only small simulations should be run locally.

Many of these options are scripting languages that you can also use to modify the files consumed by EMOD, simplifying your workflow when running many simulations.

Run simulations for debugging

If you are helping advance the EMOD model by contributing to source code, there are other options for running simulations that provide debugging support. These options for running simulations are not recommended if you are not modifying the source code.

You can run a simulation locally from Visual Studio using the built-in debugger. You will be able to put in breakpoints and step through the code while inspecting the values of different state variables throughout the simulation.

You can use regression_test.py in the GitHub Regression directory to run multiple simulations on a cluster, including running the suite of regression tests run by the IDM testing team.

Output files

After running a simulation, the simulation data is extracted, aggregated, and saved as an output report. Depending on your configuration, one or more output reports will be created, each of which summarize different data from the simulation. Output reports can be in JSON, CSV, or binary file formats.

The EMOD functionality that produces an output report is known as a reporter. EMOD provides several built-in reporters for outputting data from simulations. By default, EMOD will always generate the report InsetChart.json, which contains the simulation-wide average disease prevalence by time step. If none of the provided reports generates the output report that you require, you can create a custom reporter.

If you want to visualize the data output from an EMOD simulation, you must use graphing software to plot the output reports. In addition to output reports, EMOD will generate error and logging files to help troubleshoot any issues you may encounter.

Introduction to disease modeling

To understand the complex dynamics underlying disease transmission, epidemiologists utilize a set of models called compartmental models. Developed in the early 20th century, these models stratify a population into groups, generally based on their risk or infection status. Underlying these models is a system of differential equations, so the model is able to track the population as a function of time. Further, the models track the number of people in each category, are able to predict the various properties of pathogen spread, can estimate the duration of epidemics, and can be used to understand how different situations or interventions can impact the outcome of pathogen spread. To see a typical plot of a population in SIR conditions, see the plot in Types of compartmental models. If you would like a more in-depth introduction to epidemiology and disease modeling, you may want to take the Epidemics course from The Pennsylvania State University through Coursera.

An agent-based model (ABM) is another powerful tool used to help understand the complexity inherent in disease transmission systems. These models form a type of “microscale model,” where they simulate the simultaneous interactions of agents in an effort to re-crate complex phenomena. Each agent (such as a human, or vector) can be assigned a variety of “properties” (for example, age, gender, etc), and their behavior and interactions with one another are determined by using decision rules. These models have strong predictive power, and are able to leverage spatial and temporal dynamics. Further, complex environments can be developed in which the agents act, and agents may “learn” from interactions or “adapt” to their environment. As a result, ABMs are excellent for identifying “emerging properties” of the system: patterns that are not explicitly modeled, but instead occur as a consequence of the rules that govern the agents.

Agent-based models are extensively used in epidemiology due to their predictive power in modeling the spread (or conversely, control) of epidemics. A popular type of ABM for this is one in which each agent’s rules follow the dynamics specified in the compartmental models, where each agent flows through the compartments as a function of both “within-host” rules (such as duration of infection) and interactions between agents (such as becoming infected when coming into contact with an infectious agent). By combining the epidemiological basis of compartmental models with the flexibility of an agent-based model, this type of ABM is quite powerful due to their ability to simultaneously address the ecology, epidemiology, and pathology of complex systems.

Why use disease modeling

Disease models play an important role in understanding and managing the transmission dynamics of various pathogens. We can use them to describe the spatial and temporal patterns of disease prevalence, as well as to explore or better understand the factors that influence infection incidence. Modeling is a key step in understanding what treatments and interventions can be most effective, how cost-effective these approaches may be, and what specific factors need to be considered when trying to eradicate disease.

Types of compartmental models

The following diagrams illustrate common compartmental models.

_images/SIR-Plot.jpeg

SIR Plot, showing typical categorization of a population into Susceptible, Infectious, and Recovered states.

Definitions
Susceptible

Individual is able to become infected.

Exposed

Individual has been infected with a pathogen, but due to the pathogen’s incubation period, is not yet infectious.

Infectious

Individual is infected with a pathogen and is capable of transmitting the pathogen to others.

Recovered

Individual is either no longer infectious, or “removed” from the population.

SI (Susceptible - Infectious) model

In this situation, people never leave the infectious state and have life-long infections. For example, herpes is a disease with life-long infectiousness. The dashed line shows how the model becomes an SIS (Susceptible - Infectious - Susceptible) model, where infection does not confer immunity (or there is waning immunity). Individuals have repeat or reoccurring infections, and infected individuals return to the susceptible state. For example, sexually transmitted diseases such as gonorrhea or chlamydia fall into this group.

_images/SI-SIS.png

SI - SIS model

SIR (Susceptible - Infectious - Recovered) model

In this category, individuals in the recovered state gain immunity to the pathogen. For example, measles, mumps, rubella, and pertussis may be modeled using the SIR framework. The dashed line shows how the model becomes an SIRS (Susceptible - Infectious - Recovered - Susceptible) model, where recovery does not confer life-long immunity, and individuals may become susceptible again.

_images/SIR-SIRS.png

SIR - SIRS model

SEIR (Susceptible - Exposed - Infectious - Recovered) model

In this category, individuals experience a long incubation duration (the “exposed” category), such that the individual is infected but not yet infectious. For example chicken pox, and even vector-borne diseases such as Dengue Hemorrhagic fever have a long incubation duration where the individual cannot yet transmit the pathogen to others. The dashed line shows how the model becomes an SEIRS (Susceptible - Exposed - Infectious - Recovered - Susceptible) model, where recovered people may become susceptible again (recovery does not confer life-long immunity). For example, rotovirus and malaria are diseases with long incubation durations, and where infection only confers temporary immunity.

_images/SEIR-SEIRS.png

SEIR - SEIRS model

Fundamental concepts in epidemiology and disease modeling

Basic reproductive number (R0)

The average number of secondary infections generated by the first infectious individual in a population of completely susceptible individuals. R0=S*L* \(\beta\) (where S = the number of susceptible hosts, L = length of infection, and \(\beta\) = transmissibility). When R0> 1, disease will spread. It is essentially a measure of the expected or average outcome of transmission. This is the threshold parameter used to determine whether or not an epidemic will occur, and determines:

  • The initial rate of increase of an epidemic (the exponential growth phase).

  • The final size of an epidemic (what fraction of susceptibles will be infected).

  • The endemic equilibrium fraction of susceptibles in a population (=1/ R0).

  • The critical vaccination threshold, which is equal to 1-(1/ R0), and determines the number of people that must be vaccinated to prevent the spread of a pathogen.

Disability-adjusted life years (DALY)

The number of years of life lost due to premature mortality plus the years lost due to disability while infected. Used to quantify the burden of disease.

Epidemic

An outbreak of an infectious disease, such that a greater number of individuals than normal has the disease. Epidemics have very high R0 (Recall R0>1 for a disease to spread) and are often associated with acute, highly transmissible pathogens that can be directly transmitted. Further, pathogens with lower infectious periods create more explosive epidemics.

  • To control epidemics, it is necessary to reduce R0. This can be done by:

    • Reducing transmissibility.

    • Decreasing the number of susceptibles (by vaccination, for example).

    • Decreasing the mean number of contacts or the transmissibility, such as by improving sanitation, or limiting the number of interactions sick people have with healthy people.

    • Reducing length of infectious period.

Force of infection (FoI)

A measure of the degree to which an infected individual can spread infection; the per-capita rate at which susceptibles contract infection. Typically increases with transmissibility and prevalence of infection.

Herd immunity

Vaccines protect individuals, but also provide indirect protection to anyone those vaccinated people may have infected. The portion of the population that needs to be immunized in order to achieve herd immunity is P > 1 – (1/ R0), where P = proportion vaccinated * vaccine efficacy.

Incidence (of a pathogen)

The number of new cases or infections in a given time period.

Immune

Unable to become infected/infectious

Prevalence (of a pathogen)

The proportion of a population that is infectious at any given time.

Transmissibility (\(\beta\))

Also known as the effective contact rate, is the product of the contact rate and the probability of transmission per contact.

Virulence

The capacity of a pathogen to produce disease. It is proportional to parasitemia, or the number of circulating copies of the pathogen in the host. The higher the virulence (given contact between S and I individuals), the more likely transmission is to occur. However, higher virulence means contact may be less likely as infected hosts show more symptoms of the disease. There is a trade-off that occurs between high transmissibility and disease-induced mortality.

Generic simulation tutorials

The generic simulation tutorials consist of a group of scenarios that guide you through simulations that will help you understand how to use a configuration file, campaign file, and input data files to run EMOD simulations. Each scenario has a corresponding directory and a demographics file in the RegressionScenariosInputFiles directory so you can run the simulation on your computer. All of these configuration files (config.json) have Simulation_Type set to GENERIC_SIM.

There are two ways to use the tutorials. You can read the tutorials information and graphs to learn about the model; installing EMOD is not required. Or, for a more hands-on approach, you can also run the simulations that are associated with the tutorials and make the suggested changes to the configuration files to see the impact on the output graphs. See EMOD installation for installation instructions and Run simulations for information on how to run EMOD simulations.

You can refer to EMOD parameter reference for more information regarding individual parameters that you are interested in modifying.

Note

These scenarios are for learning purposes only and are not considered scientifically valid.

Generic 1: SIR - Simple single-node outbreak

This first tutorial is a simple SIR epidemic in a single-node, village-scale location. The tutorial describes the differences between the stochastic EMOD model and the deterministic SIR model and demonstrates how the Epidemiological MODeling software (EMOD) is configured to simulate an SIR epidemic.

After running the base simulation of the SIR epidemic, you can vary the parameters for disease infectivity and infection duration to see the effect on the height of the epidemic peak, the time to reach the peak, and the cumulative number of disease cases.

The SIR model

The simplest way to model epidemic spread in populations is to classify people into different population groups or compartments. One of the classic but still widely used models divides people into three groups: S - susceptible, I - infected/infectious, and R - recovered/immune. This model was first used by Kermack and McKendrick in 1927 and has subsequently been applied to a variety of diseases, especially airborne childhood diseases with life-long immunity upon recovery, such as measles, mumps, rubella, and pertussis.

S, I and R represent the number of susceptible,infected, and recovered individuals, and N = S + I + R is the total population. The infectious rate β controls the rate of spread which represents the probability of transmitting disease between a susceptible and an infectious individual. Recovery rate, γ = 1/D, is determined by the average duration, D, of infection.

If the course of the infection is short (emergent outbreak) compared with the life time of an individual, and the disease is non-fatal, vital dynamics (birth and death) can be ignored. In the deterministic form, the SIR model can be written as follows:

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = -\frac{\beta SI}{N}\\ \frac{dI}{dt} & = \frac{\beta SI}{N} - \gamma I\\ \frac{dR}{dt} & = \gamma I \end{aligned}\end{split}\]

It is challenging to derive exact analytical solutions of the previous equations because of the non- linear dynamics. However, the key metrics that control the spread can be derived. At the initial seeding of the infection, the following condition needs to be satisfied for a disease to spread:

\[\frac{dI}{dt} = \frac{\beta SI}{N} - \gamma I > 0\]

If the number of infections at the initial stage is small and the initial R = 0 then S is close to N and the condition becomes:

\[\frac{\beta}{\gamma} > 1\]

where β/γ is named the reproductive number (R0). R0is the average number of secondary cases generated by an index case in a fully susceptible population. The disease will spread in the population when R0> 1 and will die out if R0< 1.

SIR and EMOD model comparison

The EMOD model is a discrete and stochastic version of the SIR model with state changes occurring at fixed time steps and an exponentially distributed duration of infection. The discrete form of the previous equation at each time step from to can be written as:

\[\begin{split}\begin{aligned} S(t+\delta) & = S(t) - \delta\frac{\beta S(t)I(t)}{N}\\ I(t+\delta) & = I(t) + \delta\frac{\beta S(t)I(t)}{N} - \delta\gamma I(t)\\ R(t+\delta) & = R(t) +\delta\gamma I(t) \end{aligned}\end{split}\]

The infection and recovery process can be represented as probabilistic binomial draws where:

The total rate of contagion shedding from all infected individuals (the force of infection):

\[\lambda = \frac{\beta I}{N}\]

The probability of infection:

\[p_i = 1-\mathrm{e}^{\-lambda\delta}\]

Probability of recovery:

\[p_r = 1-\mathrm{e}^{\-gamma\delta}\]

Therefore,

\[\begin{split}\begin{aligned} S(t+\delta) & = S(t) - \mathrm{Binomial}\left(S(t), p_i\right)\\ I(t+\delta) & = I(t) + \mathrm{Binomial}\left(S(t), p_i\right) - \mathrm{Binomial}\left(I(t), p_r\right)\\ R(t+\delta) & = R(t) + \mathrm{Binomial}\left(I(t), p_r\right) \end{aligned}\end{split}\]

Because the EMOD model is stochastic and discrete, the accuracy of the result will depend on δ which is set with the parameter Simulation_Timestep. By default, δ = 1 which is a day but you can choose a smaller time step in order to get more accurate results.

One of the key differences between stochastic and deterministic systems is the value of R0. A ordinary differential equation (ODE) model will never predict an outbreak when R0< 1, especially when R0 is close to 1. In stochastic simulations it is possible to see outbreaks.

For more information on the mathematics of the EMOD model, see Heterogeneity and transmission scaling in the generic documentation set.

Demographic inputs

The demographic file generic_scenarios_demographics, defines a single node with 10,000 individuals and has a fixed birth and death rate at 20 per 1000 individual per year (0.0000548 per day). This demographics file is used by this tutorial and several of the other Generic simulation tutorials.

{
    "NodeID": 1,
    "NodeAttributes": {
        "InitialPopulation": 10000,
        "BirthRate": 0.0000548
    },
    "IndividualAttributes": {
        "MortalityDistribution": {
            "NumDistributionAxes": 2,
            "AxisNames": ["gender", "age"],
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0]
            ],
            "ResultUnits": "deaths per day",
            "ResultScaleFactor": 1,
            "ResultValues": [
                [0.0000548],
                [0.0000548]
            ]
        }
    }
}

For some of the Generic tutorials that use generic_scenarios_demographics, including this tutorial, the birth and death rate needs to be 0. In this case, the birth and death process is disabled in the configuration file (config.json) by setting the parameter Enable_Vital_Dynamics to 0.

You can view the demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Input data files.

Key configuration parameters

You can view the complete config.json at <path_to_directory>RegressionScenariosGeneric Scenarios01_SIR directory.

Population dynamics parameters

Set Enable_Vital_Dyanamics to 0. This will disable vital dynamics (birth and death) in the simulation.

SIR model setup parameters

The EMOD generic simulation uses an SEIR-like disease model by default. You can modify the default SEIR model to an SIR model by turning off the incubation period and immune decay in the config.json file. For more information, see Simulation setup, Incubation, and Enable or disable features parameters.

Set the following parameters:

  • Set Simulation_Type to “GENERIC SIM.”

  • Set Base_Incubation_Period to 0.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Enable_Immune_Decay to 0.

Disease parameters

As demonstrated above, the spread of disease in the SIR model depends on the basic reproductive number R0=β/γ . In this simulation, the average infection duration is 4 days, and R0=14 (measles-like). An exponentially distributed period is used to match the behavior of ODE. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 3.5.

  • Set Base_Infectious_Period to 4.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Simulation duration parameters

The simulation is run for 3 months with a 1-day time step. For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 90.

Interventions

You can define interventions and events for a simulation through a JavaScript Object Notation (JSON) formatted campaign file, typically called campaign.json.

Interventions can have either a positive effect on a simulation (for example, a vaccination campaign) or a negative impact (for example, an outbreak). For this simulation, the intervention is an outbreak.

Initial outbreak

This simulation uses an OutbreakIndividual event at day 1 as the initial seeding of the infection. For more information, see OutbreakIndividual parameters.

{
    "Use_Defaults": 1,
    "Campaign_Name": "Initial Seeding",
    "Events": [{
        "Event_Coordinator_Config": {
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 0.0005,
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }]
}

You can view the complete campaign.json in <path_to_directory>RegressionScenariosGeneric Scenarios01_SIR directory.

Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

Figure 1: growth of infection and depletion of the susceptible population is a graph of the complete course of the outbreak. After the initial fast growth, the epidemic depletes the susceptible population. Eventually the virus cannot find enough new susceptible people and dies out.

_images/Generic_SIR_output_plotInsetChart_default.png

Figure 1: Growth of infection and depletion of the susceptible population

_images/Generic_SIR_output_plotAllCharts_default.png

Figure 2: All inset charts

Exploring the model

The EMOD model is individual-based, which allows the implementation of a flexible distribution. In an ODE model the time constants are exponentially distributed, however, this is not case for some diseases. You can test the effects of different distributions in the EMOD executable by changing Infectious_Period_Distribution in the configuration file.

Set the value of Infectious_Period_Distribution to “FIXED_DURATION” and let all other parameters remain the same. The following output shows a much faster spread of disease when using a fixed duration for the infection period.

_images/Generic_SIR_exploring_plotInsetChart_fixed_500x386.png

Figure 3: Infectious_Period_Distribution is FIXED_DURATION

You can also try the same SIR model with different basic reproductive number values. For example, run the simulation with R0 equal to 0.2 and 2.0.

  • Simulation with R0=0.2 : Keep Base_Infectious_Period equal to 4 and change Base_Infectivity to 0.05.

  • Simulation with R0=2.0 : Keep Base_Infectious_Period equal to 4 and change Base_Infectivity to 0.5.

The following images shows the simulation results with R0 equal to 0.2 and 2.0.

_images/Generic_SIR_exploring_plotInsetChart_0.2_500x386.png

Figure 4: R0=0.2 - No Outbreak (Base_Infectivity = 0.05)

_images/Generic_SIR_exploring_plotInsetChart_2_500x386.png

Figure 5: R0=2.0 - Outbreak (Base_Infectivity = 0.5)

Generic 2: SIR - Targeted vaccination campaigns

This tutorial assumes that you have read Generic 1: SIR - Simple single-node outbreak.

This tutorial implements vaccination strategies to control an SIR epidemic in a single-node, village-scale location. The tutorial demonstrates how to configure vaccination interventions and the effect of those vaccine interventions on herd immunity.

The tutorial also demonstrates how to target vaccines to heterogeneous groups within the node. By default, the EMOD executable assumes every individual has the same probability of being selected for vaccination. However, it is possible to model certain groups with low or no vaccination coverage through the use of IndividualProperties. IndividualProperties is added to the demographics file and configured to create the groups. For more information see IndividualProperties.

This tutorial consists of three scenarios:

  1. Baseline outbreak

  2. Vaccination campaigns all individuals

  3. Vaccination campaigns targeted groups

Vaccination and herd immunity

In Generic 1: SIR - Simple single-node outbreak, the SIR model assumed all individuals are susceptible before the importation of an outbreak. However, vaccination is the one of the most effective ways to prevent or contain a disease outbreak. This scenario demonstrates the effect of vaccinations.

Starting from the SIR equations discussed in the previous tutorials:

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = -\frac{\beta SI}{N}\\ \frac{dI}{dt} & = \frac{\beta SI}{N} - \gamma I\\ \frac{dR}{dt} & = \gamma I \end{aligned}\end{split}\]

For an outbreak to start, the following condition needs to be satisfied:

\[\frac{dI}{dt} = \frac{\beta SI}{N} - \gamma I > 0\]

If a vaccination campaign with coverage p \(\in\) [0, 1] is performed before the outbreak, only a fraction of susceptible people move to the recovered compartment. If the vaccine take is e \(\in\) [0, 1], representing the probability of being protected after receiving a vaccine dose, the fraction of immune people due to vaccination is ep. Therefore, the previous condition can be reduced to:

\[\begin{split}\begin{aligned} \left(\beta (1 - e p) - \gamma\right) I & > 0\\ R_0 (1 - e p) & > 1\\ R_{eff} & > 1 \end{aligned}\end{split}\]

Reff is also called the effective reproductive number. Vaccination can reduce the disease’s ability to spread, and the outbreak can be prevented or stopped with less than 100% coverage. When Reff= 1, there exists a minimum vaccination coverage that can prevent a disease outbreak. This minimum coverage required to prevent an outbreak is usually called herd immunity (represented as Pherd). Therefore, the analytical form of Pherd can be derived based on the previous condition:

\[p_{herd} = \frac{1}{e}\left(1-\frac{1}{R_0}\right)\]
Multiple rounds of vaccinations

If multiple vaccine interventions are performed in the same area, people are selected on a binomial basis and all individuals have the same probability of being included. If the vaccine coverage is p, every individual has a probability p of being selected in a given round. After the first round, the fraction of non-vaccinated is 1-p, and after n rounds this fraction is (1 - p)n. Therefore, the fraction of people getting at least 1 dose is:

\[1-(1-p)^n\]

For example, the fraction of people getting at least one vaccination with a 50% campaign coverage is shown in the following table. After a few rounds, the coverage increases significantly with the number of campaigns. Scenario B demonstrates this example.

Number of Campaigns

Covered Fraction (>=1 dose)

1

50%

2

75%

3

87.5%

4

93.75%

5

96.875%

However, this is usually not the case. In recent polio eradication campaigns, the number of supplemental immunization activity (SIA) campaigns planned in certain high-risk districts is greater than 6 per year, but poliovirus still persists in the area due to certain groups that are chronically missed. This can be caused by low accessibility, exclusion from SIA microplans, or vaccine refusal. Reff has not been driven below 1 because these susceptible people in the chronically missed groups are still in contact with the rest of population. In some modeling simulations, this assumption has to be included.

In this second example, the same 50% campaign coverage is repeated so that the same amount of vaccine is used. However, 30% of the population is not accessible to any vaccine campaigns. Although the number of vaccine doses used is the same as the previous example, the overall coverage is much less. The scenario C demonstrates this example.

Number of Campaigns

Covered Fraction of Total Population

Covered Fraction of Groups with Access

Covered Fraction of Groups without Access

1

50%

71.43%

0%

2

29%

91.84%

0%

3

68.37%

97.67%

0%

4

69.53%

99.33%

0%

5

69.87%

99.81%

0%

Demographics inputs

This simulation uses the demographics file “generic_scenarios_individualproperties_demographics”. Except for an IndividualProperties structure, the demographics file is the same as “generic_scenarios_demographics” used in Generic 1: SIR - Simple single-node outbreak.

Individual Properties

An IndividualProperties structure is added to Defaults in the demographics file. Its purpose for this scenario is to divide individuals into two groups so the individuals in different groups can be configured differently. In the third scenario, a vaccine campaign will be targeted at only one of the groups but not the other group. This models the situation where individuals in the general population have a chance of receiving a vaccine while the other individuals are in the chronically missed group.

{
  "Metadata": {
  },
  "Defaults": {

    "IndividualProperties": [{
      "Property": "Accessibility",
      "Values": ["Easy", "Hard"],
      "Initial_Distribution": [0.7, 0.3],
      "Transitions": []
    }]
  },
  "Nodes": [{
  }]
}
Property and values

The IndividualProperties structure creates groups using the Property and Values parameters.

The Property parameter specifies the property type. This tutorial uses the property type Accessibility.

The Values array defines the groups. Each element in the array is a group. In this tutorial, the groups are “Easy” and “Hard”. They represent the group that is easy to access during a vaccine campaign (Easy), and the chronically missed group (Hard).

Note

Property and Values creates the groups. However, the different behavior of the two groups must be configured with parameters in the campaign files.

Initial_Distribution

At the beginning of the simulation individuals are assigned a group using the probabilities in the Initial_Distribution array. The values in the Initial_Distribution array must be in the same order as the groups in the Values array.

At the beginning of the simulation, each individual has a 70% of belonging to the “Easy” accessibility group and a 30% chance of belonging to the “Hard” accessibility group as specified by the Initial_Distribution array.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Accessibility",
            "Values": ["Easy", "Hard"],
            "Initial_Distribution": [0.7, 0.3],
            "Transitions": []
        }]
    }
}

Note

Transitions is not used in this tutorial but it must be include as an empty array. When the simulation is run, it will create an empty Transitions output file which can be ignored.

Note that this tutorial only uses IndividualProperties to divide the population into groups. In more complex simulations, IndividualProperties can be used to differentiate the disease transmission between multiple groups within a node. This is described in Heterogeneous Intra-Node Transmission (HINT) tutorials.

Key configuration parameters

All three of the scenarios in this tutorial use the same simulation set up. Please note each subdirectory has a copy of the config.json file. You can view the complete config.json in the following directories:

  • <path_to_directory>RegressionScenariosGeneric Scenarios02_SIR_VaccinationsA_BaselineOutbreak

  • <path_to_directory>RegressionScenariosGeneric Scenarios02_SIR_VaccinationsB_VaccinationAll

  • <path_to_directory>RegressionScenariosGeneric Scenarios02_SIR_VaccinationsC_TargetedVaccination

Population dynamics parameters

Set Enable_Vital_Dyanamics to 0. This will disable vital dynamics (birth and death) in the simulation. For more information, see Population dynamics parameters.

SIR model setup parameters

The generic simulation uses an SEIR-like disease model by default. You can modify the default SEIR model to an SIR model by turning off the incubation period and immune decay in the config.json file. For more information, see Incubation and Enable or disable features parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 0.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Enable_Immune_Decay to 0.

Disease parameters

In the following example, we assume the average infection duration is 7 days, and R0 = 4.9. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 7.

  • Set Base_Infectious_Period to 0.7.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DISTRIBUTION.”

Timestep and duration parameters

For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 120.

Interventions

The three scenarios have different campaign.json files.

A. Baseline outbreak

This scenario uses an OutbreakIndividual event at day 30 as the initial seeding of the infection. For more information, see OutbreakIndividual parameters.

{
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "Antigen": 0,
            "Genome": 0,
            "Outbreak_Source": "PrevalenceIncrease",
            "class": "OutbreakIndividual"
        },
        "Target_Demographic": "Everyone",
        "Demographic_Coverage": 0.0005,
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Event_Name": "Outbreak",
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 30,
    "class": "CampaignEvent"
}

You can view the complete campaign.json at <path_to_directory>RegressionScenariosGeneric Scenarios02_SIR_VaccinationsA_BaselineOutbreak.

B. Vaccinations for all individuals

The following campaign event has three vaccination campaigns that are 7 days apart. The campaigns have a 100% vaccine take rate and a 50% per-campaign coverage. The vaccine is acquisition-blocking and full immunity lasts for 10 years. For more information, see SimpleVaccine parameters.

Set the following parameters:

  • Set Number_Repetitions to 3.

  • Set Timesteps_Between_Repetitions to 7.

  • Set Vaccine_Take to 1.0.

  • Set Demographic_Coverage to 3.

  • Set Vaccine_Type to “AcquistionBlocking”.

  • Set Simulation_Duration to 120.

  • Set Primar_Decay_Time_Constant to 3650.

You can also view campaign.json at <path_to_directory>RegressionScenariosGeneric Scenarios02_SIR_VaccinationsB_Vaccinations.

{
    "Event_Coordinator_Config": {
        "Demographic_Coverage": 0.5,
        "Intervention_Config": {
            "Cost_To_Consumer": 10.0,
            "Durability_Time_Profile": "BOXDURABILITY",
            "Primary_Decay_Time_Constant": 3650,
            "Reduced_Acquire": 1,
            "Reduced_Transmit": 0,
            "Vaccine_Take": 1,
            "Vaccine_Type": "AcquisitionBlocking",
            "class": "SimpleVaccine"
        },
        "Number_Repetitions": 3,
        "Timesteps_Between_Repetitions": 7,
        "Target_Demographic": "Everyone",
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 1,
    "class": "CampaignEvent"
}
C. Vaccination campaigns for targeted groups

The following campaign event is the same as the campaign event in scenario B, but it restricts the vaccine campaign to the “Easy” accessibility group by adding a Property_Restrictions parameter and setting it to “Accessibility”: “Easy”. As only 70% of the population is in the “Easy” accessibility group, vaccine coverage is also reduced.

{
    "Event_Coordinator_Config": {
        "Demographic_Coverage": 0.5,
        "Intervention_Config": {
            "Cost_To_Consumer": 10.0,
            "Durability_Time_Profile": "BOXDURABILITY",
            "Primary_Decay_Time_Constant": 3650,
            "Reduced_Acquire": 1,
            "Reduced_Transmit": 0,
            "Vaccine_Take": 1,
            "Vaccine_Type": "AcquisitionBlocking",
            "class": "SimpleVaccine"
        },
        "Number_Repetitions": 3,
        "Timesteps_Between_Repetitions": 7,
        "Target_Demographic": "Everyone",
        "Property_Restrictions": ["Accessibility:Easy"],
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 1,
    "class": "CampaignEvent"
}

You can view the complete campaign.json at <path_to_directory>RegressionScenariosGeneric Scenarios02_SIR_VaccinationsC_TargetedVaccinations.

Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

A. Baseline outbreak

Figure 1: Outbreak without vaccination campaigns shows the complete trajectory of the outbreak without vaccination campaigns.

_images/Generic_SIR_IP_output_baseline_500x386.png

Figure 1: Outbreak without vaccination campaigns

_images/Generic_SIR_IP_output_baseline_property.png

Figure 2: Outbreak without vaccination campaigns - property report

B. Vaccinations for all individuals

With three campaigns randomly administered, the fraction of immune people is above the herd immunity (in this case, close to 80%), therefore, an outbreak will not start.

_images/Generic_SIR_IP_output_vaccination_all.png

Figure 3: Outbreak with vaccination campaigns

_images/Generic_SIR_IP_output_vaccination_all_property.png

Figure 4: Outbreak with vaccination campaigns - property report

C. Vaccination campaigns for targeted groups

With three campaigns administered only to the easily accessible group, the fraction of immune people is never above the group size (70%). If there is an outbreak, the group will not reach the herd immunity no matter how many vaccine campaigns are done.

_images/Generic_SIR_IP_output_targeted_vaccination.png

Figure 5: Outbreak with targeted vaccination campaigns

_images/Generic_SIR_IP_output_targeted_vaccination_property.png

Figure 6: Outbreak with targeted vaccination campaigns - property report

Exploring the model

Starting with the campaign.json file in scenario B, change one of the single vaccination intervention by varying the vaccination coverage and observe the herd immunity.

Generic 3: SIER - Incubation periods

This tutorial assumes that you have read Generic 1: SIR - Simple single-node outbreak and Generic 2: SIR - Targeted vaccination campaigns.

The SIR model in Generic 1: SIR - Simple single-node outbreak has several limitations that might not be true for some diseases. Many diseases have a latent phase during which the individual is infected but not yet infectious. This delay between the acquisition of infection and the infectious state can be incorporated within the existing model by adding a latent/exposed population, E, and letting infected (but not yet infectious) individuals move from S to E and from E to I. If \(sigma\) is the rate of latent individuals becoming infectious (average duration of latency is 1/\(sigma\)), the SEIR model becomes:

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = -\frac{\beta SI}{N}\\ \frac{dE}{dt} & = \frac{\beta SI}{N} - \sigma E\\ \frac{dI}{dt} & = \sigma E - \gamma I\\ \frac{dR}{dt} & = \gamma I \end{aligned}\end{split}\]

with \(N = S + E + I + R\)

Since the latency delays the start of the individual’s infectious period, the secondary spread from an infected individual will occur at a later time compared with an SIR model which has no latency. Therefore, including a longer latency period will result in slower initial growth of the outbreak. However, since the model does not include mortality, the basic reproductive number, R0 = \(\beta/\gamma\), does not change.

Demographics inputs

This tutorial uses generic_scenarios_demographics file for demographics input, as do all of the generic simulation scenarios except for Generic 2: SIR - Targeted vaccination campaigns, and Generic 10: Animal reservoir zoonosis. You can view the complete demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location were EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key configuration parameters

This tutorial uses the config.json in <path_to_directory>RegressionScenariosGeneric Scenarios03_SEIR directory.

Population dynamics parameters

Set Enable_Vital_Dyanamics to 0. This will disable vital dynamics (birth and death) in the simulation. For more information, see Population dynamics parameters.

SEIR model setup parameters

The incubation period, infection period, and immunity must be enabled for an SEIR model. Immunity waning must be disabled. For more information, see Incubation and Immunity parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 8.

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 0.

  • Set Incubation_Period_Distribution to “EXPONENTIAL_DISTRIBUTION.”

Disease parameters

In the following example, we still use the same parameters as in the SIR model: the average infectious duration is 4 days; and R0 = 14 (measles-like). However, this time we will add a latent period of 8 days. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 3.5.

  • Set Base_Infectious_Period to 4.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Time step and duration parameters

For more information, see Simulation setup parameters. Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 90.

Interventions

This tutorial uses the campaign.json file in the <path_to_directory>RegressionScenariosGeneric Scenarios03_SEIR directory.

Initial outbreak

This simulation uses an OutbreakIndividual event at day 1 to create the initial seeding. For more information, see OutbreakIndividual parameters.

{
    "Use_Defaults": 1,
    "Campaign_Name": "Initial Seeding",
    "Events": [{
        "Event_Coordinator_Config": {
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 0.0005,
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

The complete course of outbreak is observed. After the initial fast growth, the epidemic depletes the susceptible population. Eventually the virus cannot find enough new susceptible people and dies out.

Although R0and the cumulative number of infected individuals does not change, including latency slows down the growth of the epidemic.

_images/Generic_SEIR_output_plotInsetChart_500x386.png

Figure 1: Depletion of the susceptible population

Exploring the model

Change the latent period to observe the initial growth. The following figure shows the results of changing to a shorter latent period (2 days).

_images/Generic_SEIR_exploring_plotInsetChart_2day_500x386.png

Figure 2: Impact of the length of the latent period

Generic 4: SEIR - Vital dynamics (birth and death)

This tutorial assumes that you have read Generic 3: SIER - Incubation periods.

This tutorial explores the effect of birth and death on a simulation. In a closed population with no vital dynamics, an epidemic will eventually die out due to an insufficient number of susceptible individuals to sustain the disease. Infected individuals who are added later will not start another epidemic due to the life-long immunity of the existing population.

If there are vital dynamics, new births can provide more susceptible individuals to the population. In this case, when infected individuals are added later, another epidemic may start.

Demographics inputs

In the demographics input file, the node has 10,000 individuals. The birth rate and death rate are equal to 20 per 1000 individuals per year (0.0000548 per day).

The birth rate and initial population values are set in NodeAttributes using BirthRate and InitialPopulation, respectively. The death rate is set in IndividualAttributes using the MortalityDistribution. Both the male and female death rate is equal to 0.0000548 per day.

{
    "Metadata": {
    },
    "Nodes": [{
        "NodeID": 1,
        "NodeAttributes": {
            "InitialPopulation": 10000,
            "BirthRate": 0.0000548
        },
        "IndividualAttributes": {

            "MortalityDistribution": {
                "NumDistributionAxes": 2,
                "AxisNames": ["gender", "age"],
                "AxisUnits": ["male=0,female=1", "years"],
                "AxisScaleFactors": [1, 365],
                "NumPopulationGroups": [2, 1],
                "PopulationGroups": [
                    [0, 1],
                    [0]
                ],
                "ResultUnits": "deaths per day",
                "ResultScaleFactor": 1,
                "ResultValues": [
                    [0.0000548],
                    [0.0000548]
                ]
            }
        }
    }]
}

To view the complete demographics file, see generic_scenarios_demographics at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key simulation parameters

This tutorial simulates the person-person disease transmission as an SEIR model in a hypothetical community over a longer period.

You can view the complete config.json in <path_to_directory>RegressionScenariosGeneric04_VitalDynamics directory.

Population dynamics parameters

The following parameters enable vital dynamics for birth and non-disease related deaths, and disable disease-related mortality. For more information, see Population dynamics parameters.

Set the following parameters:

  • Set Enable_Vital_Dynamics to 1.

  • Set Enable_Birth to 1.

  • Set Death_Rate_Dependence to “NONDISEASE_MORTALITY_BY_AGE_AND_GENDER.”

  • Set Enable_Disease_Mortality to 0.

SEIR model setup parameters

The incubation period, infection period, and immunity must be enabled for an SEIR model. Immunity waning must be disabled. For more information, see Incubation and Immunity parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 3.

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 0.

  • Set Incubation_Period_Distribution to “EXPONENTIAL_DISTRIBUTION.”

Disease parameters

These parameters configure an SEIR-like disease model with person-to-person direct transmission. The basic reproductive number is 17.5.

The birth and death rates are calculated based on the base birth and mortality rates in the demographics file, as well as the multiplier in the configuration file. The birth and death (mortality) rates are increased by a factor of 10 using multipliers, x_Birth and x_Other_Mortality, to show the effect of the vital process. In this tutorial, the birth rate equals the mortality rate. For more information, see Infectivity and transmission and Scalars and multipliers parameters.

Set the following parameters:

  • Set Base_Infectivity to 2.5.

  • Set Base_Infectious_Period to 7.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

  • Set x_Birth to 10.

  • Set x_Other_Mortality to 10.

Simulation duration parameters

The simulation runs a 10 year simulation with a 1-day time step. For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 3650.

Interventions
Prior immunity

This tutorial assumes that 80% of individuals are immune at the beginning of the simulation. This is simulated using a vaccination campaign with 80% coverage and 100% take at day 1.

{
    "Campaign_Name": "Pre-outbreak Immunity",
    "Event_Coordinator_Config": {
        "Demographic_Coverage": 0.8,
        "Intervention_Config": {
            "Cost_To_Consumer": 10.0,
            "Durability_Time_Profile": "BOXDURABILITY",
            "Primary_Decay_Time_Constant": 3650,
            "Reduced_Acquire": 1,
            "Reduced_Transmit": 0,
            "Vaccine_Take": 1,
            "Vaccine_Type": "AcquisitionBlocking",
            "class": "SimpleVaccine"
        },
        "Target_Demographic": "Everyone",
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 1,
    "class": "CampaignEvent"
}
Outbreaks

This simulation uses an OutbreakIndividual event for an infrequent infection seeding. The Timesteps_Between_Repetitions and Number_Repetitions parameters are set to reintroduce the outbreak once every two years for 10 years. With larger population sizes, the endemic can sustain itself. For more information, see OutbreakIndividual parameters.

{
    "Campaign_Name": "Outbreak",
    "Event_Coordinator_Config": {
        "Demographic_Coverage": 0.001,
        "Intervention_Config": {
            "Antigen": 0,
            "Event_Name": "Outbreak",
            "Genome": 0,
            "Outbreak_Source": "ImportCases",
            "class": "OutbreakIndividual"
        },
        "Number_Repetitions": 10,
        "Target_Demographic": "Everyone",
        "Timesteps_Between_Repetitions": 730,
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 5,
    "class": "CampaignEvent"
}

You can view the complete campaign.json in <path_to_directory>RegressionScenariosGeneric04_VitalDynamics directory.

Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

The output shows the periodic outbreaks when an infection is reseeded because of the accumulation of new susceptibles due to the vital process (new births). Since periodic endemic behavior cannot be maintained due to stochastic fadeout in a small population, OutbreakIndividual was used to reintroduce the outbreak every two years for 10 years.

_images/Generic_BirthDeath_output_periodicOutbreaks.png

Figure 1: Periodic outbreaks on reintroduction

_images/Generic_BirthDeath_output_allChannels2.png

Figure 2: Periodic outbreaks on reintroduction - all channels

Exploring the model

Shut down the vital dynamics by setting Enable_Vital_Dynamics to 0 in the ScenariosGeneric04_SEIR_VitalDynamicsconfig.json file. Eventually, the number of susceptible individuals will be exhausted and a reintroduction of the outbreak will not cause a new outbreak.

Experiment with increasing the birth rate and population size in the generic_scenarios_demographics file. At a certain point, the influx of population might be enough to sustain the dynamics without reintroducing an outbreak.

Generic 5: SIRS - Waning immunity

This tutorial assumes that you have read Generic 4: SEIR - Vital dynamics (birth and death).

The SIR model assumes people carry lifelong immunity to a disease upon recovery; and this is the case for a variety of diseases. For another class of airborne diseases, for example seasonal influenza, an individual’s immunity may wane over time. In this case, the SIRS model is used allow recovered individuals return to a susceptible state. Specifically, \(\xi\) is the rate which recovered individuals return to the susceptible statue due to loss of immunity. If there is sufficient influx to the susceptible population, at equilibrium the dynamics will be in an endemic state with damped oscillation.

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = -\frac{\beta SI}{N} + \xi R\\ \frac{dI}{dt} & = \frac{\beta SI}{N} - \gamma I\\ \frac{dR}{dt} & = \gamma I - \xi R \end{aligned}\end{split}\]

The EMOD executable (Eradication.exe) simulates waning immunity by a delayed exponential distribution. Individuals stay immune for a certain period of time then immunity wanes following an exponential distribution. Because the shedding and acquisition process is separate, two kinds of immunity can be waned: transmission and acquisition immunity.

Demographic inputs

This tutorial uses generic_scenarios_demographics file for demographics input. You can view the demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key configuration parameters

You can view the complete config.json in the ScenariosGeneric05_SIRS directory.

Population dynamics parameters

Set Enable_Vital_Dynamics to 0. This will disable vital dynamics (birth and death) in the simulation. For more information, see Population dynamics parameters.

SIRS model setup parameters

The model setup is similar to an SIR model. The immunity decay is enabled so that recovered individuals can return to susceptible at a later time. For more information, see Incubation and Immunity parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 0.

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 1.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

Disease parameters

In the following example, the average infection duration is 7 days, and R0 = 1.75 which is similar to influenza. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 0.25.

  • Set Base_Infectious_Period to 7.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Immunity parameters

There are three immunity factor parameters: Immunity_Acquisition_Factor, Immunity_Transmission_Factor, and Immunity_Mortality_Factor. At the time of recovery when the infection is cleared, the values of immunity against acquisition, transmission, and mortality are multiplied by

(1- the value of the corresponding immunity factor parameter).

For example, the multiplier for Acquisition_Blocking_Immunity_Decay_Rate is Immunity_Acquisition_Factor and the multiplicative reduction in the probability of reacquiring the disease is:

Acquisition_Blocking_Immunity_Decay_Rate x (1 - Immunity_Acquisition_Factor)

In this simulation, individual’s immunity decays with an average half-life of 180 days and a 90-day offset. This applies to both transmission blocking and acquisition blocking immunity. This tutorial does not use the Mortality_Blocking_Immunity_Decay_Rate, however, the next tutorial, Generic 6: SEIRS - Disease-specific mortality and endemics, does. For more information, see Immunity parameters.

Set the following parameters:

  • Set Acquisition_Blocking_Immunity_Duration_Before_Decay to 90.

  • Set Transmission_Blocking_Immunity_Duration_Before_Decay to 90.

  • Set Acquisition_Blocking_Immunity_Decay_Rate to 0.0056.

  • Set Transmission_Blocking_Immunity_Decay_Rate to 0.0056.

  • Set Immunity_Acquisition_Factor to 0.

  • Set Immunity_Mortality_Factor to 0.

  • Set Immunity_Transmission_Factor to 0.

Simulation duration parameters

The simulation is run for 10 years with a 1-day time step. For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 3650.

Interventions

This simulation uses the campaign.json file in the ScenariosGeneric05_SIRS directory.

Outbreak with re-seeding

This simulation uses an OutbreakIndividual event for an infrequent infection seeding. The Timesteps_Between_Repetitions and Number_Repetitions parameters are set to reintroduce the outbreak once every 180 days for 10 years, to allow reintroduction of disease. For more information, see OutbreakIndividual parameters.

{
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "Antigen": 0,
            "Genome": 0,
            "Outbreak_Source": "PrevalenceIncrease",
            "class": "OutbreakIndividual"
        },
        "Target_Demographic": "Everyone",
        "Demographic_Coverage": 0.0005,
        "Number_Repetitions": 20,
        "Timesteps_Between_Repetitions": 180,
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Event_Name": "Outbreak",
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 1,
    "class": "CampaignEvent"
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

Figure 1 shows damped oscillation due to people losing immunity and becoming susceptible again.

Note

Individuals who are susceptible people due to waning immunity are not classified as susceptible in the simulation. They are reported under the “Wane Population” channel.

_images/Generic_SIRS_output_plotInsetChart_default.png

Figure 1: Simulation output - damped oscillation

_images/Generic_SIRS_output_plotAllCharts_default.png

Figure 2: Simulation output - all channels

Exploring the model

Change the waning immunity distribution by modifying the number of days until immunity starts to decay and the immunity decay rate. For example, to represent a step-like function:

  1. Set the Acquisition_Blocking_Immunity_Duration_Before_Decay and Transmission_Blocking_Immunity_Duration_Before_Decay to 180.

  2. Set Acquisition_Blocking_Immunity_Duration_Before_Decay and Transmission_Blocking_Immunity_Duration_Before_Decay to 1.

Generic 6: SEIRS - Disease-specific mortality and endemics

This tutorial assumes that you have read Generic 5: SIRS - Waning immunity.

This tutorial is a simple SEIRS model in a single-node, village-scale location. Similar to the SIRS model, recovered individuals transition to susceptible individuals by enabling waning immunity.

As in a previous tutorial, Generic 4: SEIR - Vital dynamics (birth and death), the vital dynamics are enabled. This scenario also enables the disease-specific mortality rate.

By varying the disease infectivity and infection durations, you will observe the effect of these parameters on the height of the epidemic peak, the time to reach the peak, and the cumulative number of disease cases.

Demographics inputs

This scenario uses generic_scenarios_demographics file for demographics input. You can view the complete demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key configuration parameters

You can view the complete config.json in the <path_to_directory>RegressionScenariosGeneric06_SEIRS directory.

Population dynamics parameters

The following parameters enable vital dynamics for birth , non-disease related deaths, and disease related deaths. For more information, see Population dynamics parameters.

Set the following parameters:

  • Set Enable_Vital_Dynamics to 1.

  • Set Enable_Birth to 1.

  • Set Death_Rate_Dependence to “NONDISEASE_MORTALITY_BY_AGE_AND_GENDER.”

  • Set Enable_Disease_Mortality to 1.

SEIRS model setup parameters

The incubation period, infection period, immunity, and immunity waning must be enabled for an SEIRS model. For more information, see Incubation and Immunity parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 3.

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 1.

  • Set Incubation_Period_Distribution to “EXPONENTIAL_DISTRIBUTION.”

Disease parameters

These parameters set the EMOD executable to run as an SEIRS-like disease model with person-to- person direct contact. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 0.25.

  • Set Base_Infectious_Period to 6.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Mortality rate

The following parameters set the mortality for the disease. These parameters determine whether disease mortality is enabled by the simulation when the mortality is applied, and the rate of mortality. For more information, see Mortality and survival parameters.

Set the following parameters:

  • Set Base_Mortality to 0.01.

  • Set Mortality_Time_Course to “DAILY_MORTALITY.”

Immunity parameters

For this scenario the Mortality_Blocking_Immunity_Duration_Before_Decay and Mortality_Blocking_Immunity_Decay_Rate are added. On recovery, people’s immunity decays with an average half-life of 10 days and a 100-day offset. This applies to transmission blocking, acquisition blocking and mortality blocking immunity. For more information, see Immunity parameters.

Set the following parameters:

  • Set Acquisition_Blocking_Immunity_Duration_Before_Decay to 100.

  • Set Acquisition_Blocking_Immunity_Decay_Rate to 0.1.

  • Set Transmission_Blocking_Immunity_Duration_Before_Decay to 100.

  • Set Transmission_Blocking_Immunity_Decay_Rate to 0.1.

  • Set Immunity_Acquisition_Factor to 0.

  • Set Immunity_Mortality_Factor to 0.

  • Set Immunity_Transmission_Factor to 0.

  • Set Mortality_Blocking_Immunity_Duration_Before_Decay to 100.

  • Set Mortality_Blocking_Immunity_Decay_Rate to 0.1.

Simulation duration parameters

The simulation is run for 2 years with a 1-day time step. For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 730.

Interventions

You can view the complete campaign.json in the SamplesGeneric06_SEIRS directory.

Baseline outbreak

This scenario uses an OutbreakIndividual event at day 1 as the initial seeding of the infection. The value of Demographic_Coverage is 0.001 which is about 10 infected individuals in a population of 10,000. For more information, see OutbreakIndividual parameters.

{
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "Antigen": 0,
            "Genome": 0,
            "Outbreak_Source": "PrevalenceIncrease",
            "class": "OutbreakIndividual"
        },
        "Target_Demographic": "Everyone",
        "Demographic_Coverage": 0.001,
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Event_Name": "Outbreak",
    "Nodeset_Config": {
        "class": "NodeSetAll"
    },
    "Start_Day": 1,
    "class": "CampaignEvent"
}
Vaccination campaigns

The following campaign event adds a vaccination campaign at day 500, with 100% vaccine take rate (Vaccine_Take) and 80% coverage (Demographic_Coverage) for all individuals. The vaccine is acquisition-blocking and full immunity lasts for 10 years (3650 days). For more information, see SimpleVaccine parameters.

{
    "Use_Defaults": 1,
    "Events": [{
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 0.80,
            "Intervention_Config": {
                "Cost_To_Consumer": 10.0,
                "Durability_Time_Profile": "BOXDURABILITY",
                "Primary_Decay_Time_Constant": 3650,
                "Reduced_Acquire": 1,
                "Reduced_Transmit": 0,
                "Vaccine_Take": 1,
                "Vaccine_Type": "AcquisitionBlocking",
                "class": "SimpleVaccine"
            },
            "Target_Demographic": "Everyone",
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 5060,
        "class": "CampaignEvent"
    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

The following figure shows the complete trajectory of the outbreak: the disease endemicity due to vital process and waning immunity; and the effect of vaccination campaigns that eradicates the outbreak after day 500.

_images/Generic_SEIRS_output_completeTrajectory.png

Figure 1: Trajectory of the outbreak

The following figure shows the number of disease-specific deaths, and cumulative number of infections for all of the channels in the simulation output.

_images/Generic_SEIRS_output_allCharts.png

Figure 2: Disease-specific deaths and cumulative number of infections

Exploring the model

In the this simulation, the Base_Infectivity parameter is set to 0.25 and with the incubation period, the basic reproductive numbers is 1.5. Change the Base_Infectivity parameter to 0.5. The base reproductive number should now be 3. Due to this larger value, the disease did not persist in the simulation because the rate of consuming susceptible individuals was larger than the inflow of new susceptible individuals. The infection could not find enough new susceptible individuals to sustain the transmission.

_images/Generic_SEIRS_explore1_insetchart.png

Keep the base reproductive number at 3, and try shortening the immunity duration by changing Acquisition_Blocking_Immunity_Duration_Before_Decay and Transmission_Blocking_Immunity_Duration_Before_Decay from 100 to 50. Run the simulation again, and observe the persistence of the outbreak again due to increased influx of susceptible individuals.

_images/Generic_SEIRS_explore2_insetchart.png

Generic 7: SI - Lifelong infection

This tutorial assumes that you have read Generic 6: SEIRS - Disease-specific mortality and endemics.

This tutorial demonstrates how to configure an SI model and vary EMOD input parameters to observe the effect on the disease.

The SI model is the simplest form of all disease models. Individuals are born into the simulation with no immunity (susceptible). Once infected and with no treatment, individuals stay infected and infectious throughout their life, and remain in contact with the susceptible population. This model matches the behavior of diseases like cytomegalovirus (CMV) or herpes.

If S and I represent the number of susceptible and infected individuals, and \(N = S + I\) is the total population. The infectious rate \(\beta\) controls the spread.

The SI model can be written as follows:

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = -\frac{\beta SI}{N}\\ \frac{dI}{dt} & = \frac{\beta SI}{N} = \beta I \left(1-\frac{I}{N}\right) \end{aligned}\end{split}\]

The dynamics of I are also known as logistic growth. If there are no vital processes (birth and death), every susceptible will eventually become infected.

Let \(\mu\) and \(\nu\) represent the birth and death rates, respectively, for the model. To maintain a constant population, assume that \(\mu = \nu\). Therefore, the model becomes:

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = \mu N - \frac{\beta SI}{N} - \nu S\\ \frac{dI}{dt} & = \frac{\beta SI}{N} - \nu I \end{aligned}\end{split}\]

In steady state \(\frac{dI}{dt} = 0\) and given that \(\mu = \nu = \frac{\beta S}{N} = \beta \left(1 - \frac{1}{N}\right)\), the final proportion of infected people is related to both the vital dynamics and \(\beta\).

Demographics inputs

This tutorial uses generic_scenarios_demographics file for demographics input. You can view the complete demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key configuration parameters

This tutorial simulates the person-to-person disease transmission of an SI model in a hypothetical community for more than a 100 year period.

You can view the complete config.json at <path_to_directory>RegressionScenariosGeneric07_SI directory.

Population dynamics parameters

The following parameter enables vital dynamics (birth and death) in the simulation. For more information, see Population dynamics parameters.

Set the following parameters:

  • Set Enable_Vital_Dynamics to 1.

  • Set Enable_Birth to 1.

  • Set Death_Rate_Dependence to “NONDISEASE_MORTALITY_BY_AGE_AND_GENDER.”

SI model setup parameters

The EMOD generic simulation uses an SEIR model by default. However, it can be modified to an SI model with the following configurations. For more information, see Incubation and Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 0.

  • Set Base_Infectious_Period to 50000.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Infectious_Period_Distribution to “FIXED_DURATION.”

Disease parameters

As demonstrated previously, the spread of disease in the SI model depends on β, the base infectivity, and, for simplicity, assume the infectivity stays constant over time.

Assume that the anticipated final epidemic size, \(I/N\), is 85%, and the birth/death rate equals 0.0000548 per day (2% per year). \(\beta\) can be calculated by looking at the steady state:

\[\mu = \nu = \frac{\beta S}{N} = \beta \left(1 - \frac{1}{N}\right)\]

and \(\beta\) =0.00003653.

Set the following parameters:

  • Set Base_Infectivity to 0.00003653.

Simulation time parameters

The simulation runs for 100 years. Because the disease dynamics are slow, the larger time step speeds up the simulation. For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 36500.

Interventions
Initial outbreak

This simulation uses an OutbreakIndividual event at day 30 for the initial seeding. For more information, see OutbreakIndividual parameters.

{
    "Use_Defaults": 1,
    "Campaign_Name": "Initial Seeding",
    "Events": [{
        "Event_Coordinator_Config": {
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 0.05,
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 30,
        "class": "CampaignEvent"
    }]
}

You can view the complete campaign.json at <path_to_directory>RegressionScenariosGeneric07_SI directory.

Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

Figure 1 shows the growth of an outbreak over time and eventually approaching steady state. Notice that the fraction of infected people at steady state approaches the anticipated value of 85%.

_images/Generic_SI_output_plotInsetChart_500x403.png

Figure 1: Outbreak reaching steady-state

Exploring the model

You can change the Base_Infectivity in the config.json file and the birth and death rates in the demographics file to have a different fraction of infected value at steady state.

If you want to change vital dynamics without updating the demographics file, disable vital dynamics in the configuration file (Enable_Vital_Dynamics = 0). There will be no births in the simulation and eventually everyone becomes infected. The following output shows the result without vital dynamics.

_images/Generic_SI_exploring_plotInsetChart_novital_500x403.png

Figure 2: No vital dynamics

Generic 8: SIS - Reoccurring infections

This tutorial assumes that you have read Generic 7: SI - Lifelong infection and Generic 1: SIR - Simple single-node outbreak.

Similar to the SIRS model, the infected individuals return to the susceptible state. This model is appropriate for diseases that commonly have repeat infections, for example, the common cold (rhinoviruses), or sexually transmitted diseases like gonorrhea or chlamydia. For this model, we can analytically solve the ordinary differential equation (ODE) to understand the dynamics.

For simplicity, the following ODE model ignores the vital process (birth and death):

\[\begin{split}\begin{aligned} \frac{dS}{dt} & = -\frac{\beta SI}{N} + \gamma I\\ \frac{dI}{dt} & = \frac{\beta SI}{N} - \gamma I\\ \end{aligned}\end{split}\]

At equilibrium, solving:

\[\frac{dI}{dt} = \beta I \left(1-\frac{1}{N}\right) - \gamma I = 0\]

There are two equilibrium states for the SIS model, the first is \(I = 0\) (disease free state), and the second is:

\[I = \frac{(\beta - \gamma)N}{\beta} = \left(1-\frac{\gamma}{\beta}\right)N\]

For disease to spread, we need to have \(dI/dt > 0\). Therefore, similar to the previously described concept of the basic reproductive number, when \(\beta/\gamma > 1\), the disease will spread and approach the second steady state; otherwise, it will eventually reach the disease-free state.

Demographics inputs

This tutorial uses generic_scenarios_demographics file for demographics input. You can view the complete demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key configuration parameters

The tutorial simulates a sexually-transmitted disease using the SIS model in a hypothetical closed community over a 10-year period. The infectious duration is 25 days, and the basic reproductive number is 1.2.

You can view the complete config.json in the <path_to_directory>RegressionScenariosGeneric08_SIS directory where <path_to_directory> is the location where EMOD source files were installed.

Population dynamics parameters

Set Enable_Vital_Dyanamics to 0. This will disable vital dynamics (birth and death) in the simulation. For more information, see Population dynamics parameters.

SIS model parameters

The generic simulation type uses an SEIR model by default. However, it can be modified to an SIS model with the following configurations: no incubation period and no immunity. For more information, see Incubation and Immunity parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 0.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Enable_Immunity to 0.

Disease parameters

As demonstrated previously, the spread of disease in the SIS model depends on \(\beta\) (set by base infectivity) and \(\gamma\) which are set by duration of infection. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 0.048.

  • Set Base_Infectious_Period to 25.

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Simulation duration parameters

The simulation is run for 3 months with a 1-day time step. For more information, see Simulation setup parameters.

Set the following parameters:

  • Set Simulation_Timestep to 1.

  • Set Simulation_Duration to 3650.

Interventions

You can view the complete campaign.json in the <path_to_directory>RegressionScenariosGeneric08_SIS directory where <path_to_directory> is the location where EMOD source files were installed.

Initial outbreak

This simulation uses an OutbreakIndividual event at day 1 to provide the initial seeding. For more information, see OutbreakIndividual parameters.

{
    "Use_Defaults": 1,
    "Campaign_Name": "Initial Seeding",
    "Events": [{
        "Event_Coordinator_Config": {
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 0.0005,
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

The following figure shows the growth of an outbreak over time that eventually approaches steady state. You can compare the fraction of infected people with the anticipated value based on the previous calculation. If we have a reproductive number of 1.2, the infected fraction at equilibrium will be 1 - (1/1.2) ~ 17%.

_images/Generic_SIS_output_plotInsetChart.png

Figure 1: Outbreak approaching steady-state

Exploring the model

You can change the Base_Infectivity value to alter the basic reproductive number (R0 >1 and R0<1) to observe the endemic state behavior.

Generic 9: Density scaling of infectivity

This tutorial explores the effect of population density on the transmissibility of disease.

By default, the EMOD executable (Eradication.exe) uses frequency-dependent transmission and the overall transmissibility does not change with population size or density. An infected individual will infect the same number of people either in a small village or in a metropolitan area. However, it is possible when population size is low, the transmissibility might be less and follow density- dependent behavior instead of frequency-dependent behavior.

Based on existing evidence, it is possible that neither a frequency-dependent nor a density- dependent mechanism may adequately describe the correct scaling over the entire population density spectrum. The EMOD executable uses the spatial contact model with constant population density and limited activity range to estimate contact rates as discussed in the article The scaling of contact rates with population density for the infectious disease models, by Hu et al., 2013 Journal of Mathematical Bioscience. 244(2):125-134. The scaling function can be specified for β, in the form of:

β = β0 (1- e ρ/ρc50)

where ρc50 is a constant determining the speed of increase of infectivity.

For this tutorial, the simulation is run three times with a different node size for each run. The change of node grid size will result in the change of population density for the simulations.

Demographics inputs

This tutorial uses generic_scenarios_demographics file for demographics input. You can view the complete demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on demographics files, see Demographics parameters.

Key configuration parameters

The tutorial simulates the person-person disease transmission of an influenza-like-illness model with waning immunity (SEIRS) over a short period, in a hypothetical community over a short period. After infection, all individuals will stay immune for a certain period of time before they become susceptible again. The saturated R0is set to 1.5 and R0initially increases with population density

You can view the complete config.json at <path_to_directory>RegressionScenariosGeneric Scenarios09_DensityScaling directory.

SEIRS model setup parameters

The incubation period, infection period, immunity, and immunity waning, must be enabled for an SEIRS model. For more information, see Incubation and Immunity parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 3.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 1.

Disease parameters

These parameters set Eradication.exe to run an SEIRS-like disease model with person-to-person direct transmission. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 0.375.

  • Set Base_Infectious_Period to 14.

  • Set Infectious_Period_Distribution to “FIXED_DURATION.”

Immunity parameters

The following parameters configure a 90 day immunity. After 90 days, the immunity is lost immediately. For more information, see Immunity parameters.

Set the following parameters:

  • Set Acquisition_Blocking_Immunity_Duration_Before_Decay to 90.

  • Set Transmission_Blocking_Immunity_Duration_Before_Decay to 90.

  • Set Acquisition_Blocking_Immunity_Decay_Rate to 1.

  • Set Transmission_Blocking_Immunity_Decay_Rate to 1.

Density scaling parameters

These parameters are used by the scaling function to calculate β. You can change Node_Grid_Size to change population density for different simulations. For more information, see Infectivity and transmission and Simulation setup parameters.

Set the following parameters:

  • Set Population_Density_Infectivity_Correction to “SATURATING_FUNCTION_OF_DENSITY.”

  • Set Population_Density_C50 to 30.

  • Set Node_Grid_Size to 0.1, 0.15, and 0.3 respectively for the three different simulations.

Interventions

This simulation uses an OutbreakIndividual event for repeated infection seeding. The campaign.json file is in the ScenariosGeneric09_DensityScaling directory. For more information, see OutbreakIndividual parameters.

{
    "Use_Defaults": 1,
    "Events": [{
        "Campaign_Name": "Infections",
        "Event_Coordinator_Config": {
            "Coverage": 0.001,
            "Demographic_Coverage": 0.001,
            "Intervention_Config": {
                "Antigen": 0,
                "Event_Name": "Outbreak",
                "Genome": 0,
                "Outbreak_Source": "ImportCases",
                "class": "OutbreakIndividual"
            },
            "Number_Repetitions": 10,
            "Target_Age_Max": 100,
            "Target_Age_Min": 0,
            "Target_Demographic": "Everyone",
            "Timesteps_Between_Repetitions": 120,
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"

    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

The simulation was run three times with the Node_Grid_Size set to three different values: 0.1, 0.15, and 0.3 degrees. The node was assumed to be near the equator (both latitude and longitude were set to 0) and the population was 10,000. Using the three different Node_Grid_Size values, the node area for the three simulations were 124, 278, and 1112 km2 , respectively. With a population of 10,000, the population density was 80, 36, and 9 people/km2, respectively.

Using the data described in the previous paragraph, the three densities correspond to different R:sub:0values: close to 1.5, close to 1, and well below 1, respectively, as shown in the following graph from Hu *et al*., 2013. *Journal of Mathematical Bioscience*. 244(2):125-134..

_images/Generic_DensityScaling_output_threeDensities_orig_cropped.png

Figure 1: Effect of population density on transmissibility

The following table shows the values for the three simulations:

Simulation

Population

Latitude, Longitude

Node_Grid_Size

Node Area

Density

R0

1

10,000

0, 0

0.1

124

80

R0> 1

2

10,000

0, 0

0.15

278

36

R0~ 1

3

10,000

0, 0

0.3

1112

9

R0< 1

The following graphs show the effect of population density on transmissibility, in terms of maintaining endemic status. When population density is large enough, it is easy to maintain an endemic status while in lower density is difficult to do so.

_images/Generic_DensityScaling_output_0.1.png

Simulation 1: Node_Grid_Size = 0.1, population density 80/km2and R0 > 1

_images/Generic_DensityScaling_output_0.15.png

Simulation 2: Node_Grid_Size = 0.15, population density 36/km2and R0 ~ 1

_images/Generic_DensityScaling_output_0.3.png

Simulation 3: Node_Grid_Size = 0.3, population density 9/km2and R0 < 1

Exploring the model

Change the Node_Grid_Size to other values. Explore a range of population densities and run the simulation multiple times to get a probability of fade-out under different densities.

You can download the sample Excel file, calculate_cell_area_pop_density, to calculate the node area (cell area) and population density. There are four inputs that you can modify: latitude, longitude, grid size (in degrees) and population.

Click calculate_cell_area_pop_density to download the file.

Generic 10: Animal reservoir zoonosis

Zoonosis represents a list of diseases that transmit from animals to humans. They are of particular interest because typically a zoonosis disease has previously not been in the population, and the whole population is susceptible. This tutorial demonstrates an animal reservoir, independently of human infections, reintroducing zoonotic cases at a specified rate.

This tutorial is important because for many zoonotic diseases, there is a background animal reservoir that continuously exposes humans to infection. In these situations, the interest is not only in a single large outbreak which can be simulated by an Outbreak event, but also in the population-level dynamics where there is a continuous background rate of introducing a new zoonotic infection to the human population which can be configured by parameter Zoonosis_Rate.

In this tutorial, the rate of infection from the animal reservoir can be adjusted with respect to the human-to-human infectiousness to vary along a spectrum, from a low rate of primary zoonotic infection with substantial secondary human transmission to a high zoonosis rate with low human transmission. This shifts the fraction of cases that are primary zoonotic infections. By varying the parameter Zoonosis_Rate, you can observe the daily rate of zoonotic infection per individual and the impact of the parameter changes on the outbreak.

Input files

The input files for this tutorial differ from the previous tutorials. The previous tutorials were simple single-node simulations without migration. This tutorial uses Seattle as an example of a multi-node simulation with migration rates. The input files include not a only a human population demographics file but also a zoonosis demographics file and local and regional migration files.

  • Seattle_30arcsec_demographics_zoonosis

  • Seattle_Seattle_30arcsec_local_migration

  • Seattle_Seattle_30arcsec_regional_migration

You can view these files at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information on data input files, see Input data files.

Key configuration parameters

This tutorial uses the config.json file in the <path_to_directory>RegressionScenariosGeneric10_Zoonosis directory.

Input file parameters

This tutorial uses two demographics files. The first demographics file provides information about the people in the region while the second provides information on zoonosis. Multiple demographics file are listed under one parameter. When there is more than one demographics file, the file names are separated by a semi-colon.

This is a multi-node simulation that also supports migration between the nodes. This simulation supports only local and regional migration. The input files for the different types of migration are specified with different parameters.

The following parameters specify the demographic and migration input files. For more information, see Input data files parameters.

Set the following parameters:

  • Set Demographics_Filename to “Seattle_30arcsec_demographics.json;Seattle_30arcsec_demographics_zoonosis.json.”

  • Set Local_Migration__Filename to “Seattle_30arcsec_local_migration.bin.”

  • Set Regional_Migration_Filename to “Seattle_30arcsec_regional_migration.bin.”

Population dynamics parameters

The following parameters enable vital dynamics for birth but disable non-disease related death and disease related deaths. For more information, see Population dynamics parameters.

Set the following parameters:

  • Set Enable_Vital_Dynamics to 1.

  • Set Enable_Birth to 1.

  • Set Death_Rate_Dependence to “NONDISEASE_MORTALITY_BY_AGE_AND_GENDER.”

  • Set Enable_Disease_Mortality to 0.

Migration input file parameters

The following parameters enable or disable the specific type of migration. For more information, see Migration parameters.

Set the following parameters:

  • Set Enable_Air_Migration to 0.

  • Set Enable_Local_Migration to 1.

  • Set Enable_Regional_Migration to 1.

  • Set Enable_Sea_Migration to 0.

SEIRS model setup parameters

This tutorial uses an SEIRS model. The following parameters configure the EMOD executable to run an SEIRS-like disease model with person-to-person direct transmission. For more information, see Incubation and Enable or disable features parameters.

Set the following parameters:

  • Set Base_Incubation_Period to 3.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 1.

Migration parameters

In a multi-node simulation with migration enabled, individuals have a probably of “migrating” to another node at every time step unless they have already migrated. When an individual has migrated to another node, they can shed or acquire infection in that node.

The migration pattern for this simulation is configured as “WAYPOINTS_HOME” with Roundtrip_Waypoints set to 1. This means, individuals “migrate” one day and return home the next day. There are no intermediate nodes between the home and the destination node. For more information, see Migration parameters.

Set the following parameters:

  • Set Migration_Model to “FIXED_RATE_MIGRATION.”

  • Set Migration_Pattern to “WAYPOINTS_HOME.”

  • Set Roundtrip_Waypoints to 1.

Disease parameters

These parameters configure the EMOD executable to run an SEIRS-like disease model with person- to- person direct transmission. For more information, see Infectivity and transmission parameters.

Set the following parameters:

  • Set Base_Infectivity to 0.25.

  • Set Base_Infectious_Period to 7.

  • Set Infectious_Period_Distribution to “FIXED_DURATION.”

Zoonosis parameters

The following parameters configure the animal zoonosis. The Zoonosis_Rate is multiplied with the Zoonosis rate in the demographic file. For more information, see General disease parameters.

Set the following parameters:

  • Set Animal_Reservoir_Type to “ZOONOSIS_FROM_DEMOGRAPHICS.”

  • Set Zoonosis_Rate to 0.005.

Immunity parameters

At the time of recovery when the infection is cleared, the values of immunity against acquisition, transmission, and mortality are multiplied by Immunity_Acquisition_Factor, Immunity_Transmission_Factor, and Immunity_Mortality_Factor parameters. The default values are set to 0 in the files, which means full and complete protection against each. For more information, see Immunity parameters.

In this scenario, people’s immunity decays with an average half-life of 33 days and a 400-day offset. This assumption applies to transmission blocking, acquisition blocking, and mortality blocking immunity.

Set the following parameters:

  • Set Acquisition_Blocking_Immunity_Duration_Before_Decay to 400.

  • Set Acquisition_Blocking_Immunity_Decay_Rate to 0.03.

  • Set Transmission_Blocking_Immunity_Duration_Before_Decay to 400.

  • Set Transmission_Blocking_Immunity_Decay_Rate to 0.03.

  • Set Immunity_Acquisition_Factor to 0.

  • Set Immunity_Mortality_Factor to 0.

  • Set Immunity_Transmission_Factor to 0.

  • Set Mortality_Blocking_Immunity_Duration_Before_Decay to 400.

  • Set Mortality_Blocking_Immunity_Decay_Rate to 0.03.

Intervention

This simulation uses an Outbreak intervention for repeated infection seeding. This simulation uses the campaign.json in the <path_to_directory>RegressionScenariosGeneric10_Zoonosis directory. For more information, see Outbreak parameters.

{
    "Use_Defaults": 1,
    "Campaign_Name": "Generic Seattle Regression Campaign",
    "Events": [{
        "Event_Coordinator_Config": {
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "ImportCases",
                "class": "Outbreak"
            },
            "Number_Distributions": 10,
            "Target_Demographic": "Everyone",
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "Polygon_Format": "SHAPE",
            "Vertices": "-122.320726936496,47.6597902588541 -122.320406460197,47.6520988276782 -122.308388598985,47.6471314450438 -122.301658596706,47.6541819236217 -122.315118601264,47.6644371651896 -122.320726936496,47.6597902588541",
            "class": "NodeSetPolygon"
        },
        "Start_Day": 40,
        "class": "CampaignEvent"
    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Simulation output graphs

After the initial outbreak, there are no additional imported cases set in the campaign file. However, because of the non-zero zoonosis rate, there are several introductions of infections in the background, as shown in the Log Prevalence chart in Figure 1.

When enough susceptible individuals are accumulated due to immunity waning, one of the seeds starts a disease outbreak later due to zoonosis (see Figure 1 and Figure 2). The seeding and occasional outbreaks after the seeding is shown in the following graph plotting infections over time.

_images/Generic_Zoonosis_output_zoonosis_allcharts.png

Figure 1: Animal reservoir zoonosis charts

_images/Generic_Zoonosis_output_zoonosis_insetchart.png

Figure 2: Re-seeding of infections cased by zoonosis and waning immunity

Exploring the model

Change the Zoonosis_Rate in the configuration file to see the changing frequency of outbreaks.

Heterogeneous Intra-Node Transmission (HINT) tutorials

The Heterogeneous Intra-Node Transmission (HINT) tutorials consist of a group of scenarios that guide you through simulations that will help you understand the HINT feature, which allows you to configure heterogeneous disease transmission between different groups defined with IndividualProperties. Each tutorial has a corresponding Scenarios directory and a demographics file in the ScenariosInputFiles directory. All of these tutorials have an IndividualProperties attribute in their demographics files. An IndividualProperties attribute with a TransmissionMatrix is a requirement for a HINT simulation. Additionally, Enable_Heterogeneous_Intranode_Transmission must be set to 1 (true) in the simulation configuration file (config.json).

There are two ways to use the tutorials. You can read the tutorials information and graphs to learn about the model; installing EMOD is not required. Or, for a more hands-on approach, you can also run the simulations that are associated with the tutorials and make the suggested changes to the configuration files to see the impact on the output graphs. See EMOD installation for installation instructions and Run simulations for information on how to run EMOD simulations.

Refer to EMOD parameter reference for more information regarding individual parameters that you are interested in modifying.

For more information about the mathematics behind HINT, see Heterogeneity and transmission scaling in the generic disease documentation.

HINT 1: Risk groups

This tutorial is a simple simulation using risk groups to investigate the disease spread between heterogeneous groups. The tutorial uses EMOD’s HINT feature and sets up 2 risk groups (Low, High) with the level of risk associated with disease transmission.

By default, the disease transmission for a EMOD generic simulation is frequency-dependent. The expected number of secondary infections from an infected person does not change with population size. HINT uses a “who-acquires-infection-from-whom” (WAIFW) matrix with \(\beta\) values that define the force of infection between the risk groups.

Demographics inputs

In the demographics input file, the node has 10,000 individuals. There are no births and deaths.

The birth rate and initial population values are set by BirthRate and InitialPopulation, respectively, in NodeAttributes. The death rate is set in IndividualAttributes using the MortalityDistribution attribute. The ResultValues matrix in MortalityDistribution contains the death rates for males and females. Both the male and female death rate is equal to 0.

{
    "Metadata": {},
    "Defaults": {
        "IndividualProperties": {}
    },
    "Nodes": [{
        "NodeID": 340461476,
        "NodeAttributes": {
            "InitialPopulation": 10000,
            "BirthRate": 0.001
        },
        "IndividualAttributes": {
            "MortalityDistribution": {
                "NumDistributionAxes": 2,
                "AxisNames": ["gender", "age"],
                "AxisUnits": ["male=0,female=1", "years"],
                "AxisScaleFactors": [1, 365],
                "NumPopulationGroups": [2, 1],
                "PopulationGroups": [
                    [0, 1],
                    [0]
                ],
                "ResultUnits": "annual deaths per day",
                "ResultScaleFactor": 1,
                "ResultValues": [
                    [0.001],
                    [0.001]
                ]
            }
        }
    }]
}

You can view the complete hint_riskgroups_demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed.

IndividualProperties

For HINT, IndividualProperties must be added to Defaults in the demographics file and contain a TransmissionMatrix. The TransmissionMatrix is configured with the \(\beta\) values of the WAIFW matrix that are needed for HINT’s mathematical model.

Property and values

The Property and Values parameters of IndividualProperties define two risk groups: “High” and “Low”.

Initial_Distribution

At the beginning of the simulation, 20% of the population is in the high-risk population and 80% are in the low-risk population as specified by the Initial_Distribution array.

Transitions

Individuals will not move from one risk group to the other so Transitions is empty.

TransmissionMatrix

In the TransmissionMatrix structure, the Matrix member is a Values x Values-sized WAIFW matrix with \(\beta\) values that scale the base infectivity. For this simulation, the risk groups are defined in the following order: “High” and “Low.” The following matrix represents the direction of the disease transmission between the groups:

\[\begin{split}WAIFW = \begin{pmatrix} \text{High Risk} \rightarrow \text{High Risk} & \text{High Risk} \rightarrow \text{Low Risk}\\ \text{Low Risk} \rightarrow \text{High Risk} & \text{Low Risk} \rightarrow \text{Low Risk}\\ \end{pmatrix}\end{split}\]

This simulation assumes that the disease transmission within the same risk group is higher than between risk groups, and people in the high-risk group have higher transmissibility. The following \(\beta\) values of the WAIFW matrix are used to specify the disease transmission between the risk groups:

\[\begin{split}\beta = \begin{pmatrix} 10 & 0.1\\ 0.1 & 1\\ \end{pmatrix}\end{split}\]
{
    "Metadata": {},
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Risk",
            "Values": ["High", "Low"],
            "Initial_Distribution": [0.2, 0.8],
            "Transitions": [],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [10, 0.1],
                    [0.1, 1]
                ]
            }
        }]
    },
    "Nodes": []
}

For more information, see IndividualAttributes parameters.

Key configuration parameters

The tutorial simulates the person-person disease transmission of influenza-like-illness model (SEIR) in a hypothetical community over a short period.

You can view the config.json file in the ScenariosHINT01_RiskGroups directory.

Set the following parameters:

  • Set Base_Infectivity to 1.

  • Set Base_Infectious_Period to 1.8.

  • Set Base_Incubation_Period to 1.

  • Set Enable_Heterogeneous_Intranode_Transmission to 1.

  • Set Incubation_Period_Distribution to “EXPONENTIAL_DURATION.”

Interventions

An OutbreakIndividual event seeds the initial infection on day 1. Property_Restrictions targets the outbreak at the low risk group. For more information on targeting an intervention, see Target interventions to nodes or groups in the general documentation set.

This simulation uses the campaign.json file in the ScenariosHINT01_RiskGroups directory.

{
    "Use_Defaults": 1,
    "Events": [{
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 0.001,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": ["Risk:Low"],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "class": "CampaignEvent"
    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Expected simulation output

The output shows the different spreading behavior of the two risk groups. The following graphs show the daily number of infected people for each group in the simulation Although the disease starts in the low risk group, the initial spread in the high-risk group is much faster because of the high transmission rates in the high-risk group, and is the main driver of the overall epidemic.

_images/HINT_RiskGroups_output_diseaseSpread_orig_cropped.png

Figure 1: Daily number of infected individuals by risk group

Exploring the model

Compare the HINT results with homogeneous mixing where people mix equally with each other. To do this, disable the HINT feature by setting Enable_Heterogeneous_Intranode_Transmission to 0 in the config.json file in the ScenariosHINT01_RiskGroups directory. All of the IndividualProperties will be used except for the TransmissionMatrix.

Re-run the simulation and compare the following results with the previous results. You can use the sample batch file, plotPropertyReport, in the ScenariosHINT01_RiskGroups directory to generate the following graphs from the PropertyReport output file.

Change the transmission rate values in the WAIFW matrix, re-run the model and see the dynamics. Make sure that the HINT feature is enabled by checking that Enable_Heterogeneous_Intranode_Transmission equals 1 in the config.json.

Note

It is possible that the high-low risk groups in this example are orthogonal to other factors related to transmission, for example, age or urban/rural status. If you would like to explore other factors related to heterogeneous transmission, a secondary axis can be added to IndividualProperties. See HINT 3: Age and accessibility for more information.

HINT 2: School closure

This tutorial replicates disease transmission dynamics through the different activities of individuals. In this tutorial, a group is defined by the place where individuals go for similar activities but it is not tied to one specific geographic location. For example, “school” represents all of the students that are going to school instead of having a group for every school that the students attend. As another example, “community” represents places that people meet for varying activities outside of school and work, such as shopping, getting gas, or going to a movie.

This tutorial also shows the effect of disease-control policies that modify group mixing during a disease outbreak (for example, the effect of closing schools during a hypothetical pandemic). Students are transitioned from the school group to another group during school closure, and reverted back to the school group when the school is reopened. There are two distinct groups that represent the different activities of school-age children during a school closure:

  • Children who mostly stay at home and the contact rates were largely reduced.

  • Children who spend more time outside of home and have more contacts with other groups

Demographics inputs

You can view the complete “hint_schoolclosure_demographics” file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed.

IndividualProperties
Property and values

The Property and Values members of IndividualProperties define five groups. There are three groups that represent the places where individuals normally go when schools are open. There are two groups that represent the place where students go during a school closure. For more information, see NodeProperties and IndividualProperties parameters.

Normal activity groups:

School

Students who are in school.

Work

People who are working outside of the home.

Community

General activities for people who neither work nor go to school.

School closure groups:

SchoolBreak_Interaction

Students who do activities outside of the home during a school break.

SchoolBreak_NonInteraction

Students who mostly stay at home during a school break.

Initial_Distribution

At the beginning of the simulation, every individual has a 10% chance of being assigned to “Community”, 30% chance to “School”, and 60% chance to “Work” as specified by the Initial_Distribution array. Individuals are not assigned to SchoolBreak_Interaction and SchoolBreak_NonInteraction at the beginning of the simulation.

Transitions

Transitions is used to move individuals from one property value (group) to another. All of the individuals in “School” are moved to SchoolBreak_NonInteraction on day 20 and moved back to “School” 20 days later (day 40). For more information, see Transitions.

SchoolBreak_Interaction is not used in this tutorial. It is added to the demographics file so that you can easily run some variations of this simulation.

TransmissionMatrix

TransmissionMatrix contains the \(\beta\) values of the WAIFW matrix. The transmission Route is “Contact”. The \(\beta\) values are added to Matrix.

The first three rows and columns of Matrix demonstrate a hypothetical transmission rate between the three groups: “Community”, “School”, and “Work”. Students are a main driver of disease transmission. The last two columns and rows demonstrate the different behaviors when students are not in school. Note that the fourth column and row for SchoolBreak_Interaction have a much higher transition rate than SchoolBreak_NonInteraction in the fifth row and column.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Place",
            "Values": ["Community", "School", "Work",
                "SchoolBreak_Interaction", "SchoolBreak_NonInteraction"
            ],
            "Initial_Distribution": [0.1, 0.3, 0.6, 0.0, 0.0],
            "Transitions": [{
                "From": "School",
                "To": "SchoolBreak_NonInteraction",
                "Type": "At_Timestep",
                "Coverage": 1,
                "Timestep_Restriction": {
                    "Start": 20
                },
                "Age_In_Years_Restriction": {},
                "Probability_Per_Timestep": 1,
                "Timesteps_Until_Reversion": 20
            }],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [0.5, 0.5, 0.5, 1, 0.1],
                    [0.5, 3, 1.5, 0.0, 0.0],
                    [0.5, 1.5, 1, 1, 0.1],
                    [1, 0.0, 1, 1, 0],
                    [0.1, 0.0, 0.1, 0, 0.1]
                ]
            }
        }]
    }
}
Key configuration parameters

The simulation simulates the person-person disease transmission of influenza-like-illness model (SEIR) in a hypothetical community over a short period. For more information, see Infectivity and transmission and Incubation parameters. You can view the config.json file in the ScenariosHINT02_SchoolClosure directory.

Set the following parameters:

  • Set Base_Infectivity to 1.

  • Set Base_Infectious_Period to 1.8.

  • Set Base_Incubation_Period to 1.

  • Set Enable_Heterogeneous_Intranode_Transmission to 1.

  • Set Incubation_Period_Distribution to “EXPONENTIAL_DURATION.”

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Interventions

An OutbreakIndividual event seeds the initial infection on day 1 of the simulation. For more information, see OutbreakIndividual parameters.

You can view the campaign.json file in the in the ScenariosHINT02_SchoolClosure directory.

{
    "Use_Defaults": 1,
    "Events": [
        {
            "Start_Day": 1,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "Number_Distributions": -1,
                "Intervention_Config": {
                    "Antigen": 0,
                    "Genome": 0,
                    "outbreak_source": "PrevalenceIncrease",
                    "class": "OutbreakIndividual"
                },
                "Demographic_Coverage": 0.001,
                "Target_Demographic": "Everyone",
                "class": "StandardInterventionDistributionEventCoordinator"
            },
            "class": "CampaignEvent"
        }
    ]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Expected simulation output

The output shows the effect of school break under the assumption that students will reduce their contact during the break (SchoolBreak_NonInteraction).

The following graph shows the daily number of infected people for each group in the simulation. It is clear that since students are the major driver of transmission, and the fact that students do not interact much with other groups during the break, the school break was able to delay the epidemic for 20 days.

_images/HINT_SchoolClosure_output_SB_nonInteraction_orig_cropped.png

Figure 1: School closure - SchoolBreak_NonInteraction

Exploring the model

Change the transition in intervention to SchoolBreak_Interaction. In this case, students will interact more with other groups, therefore, it is expected that a school break does not necessarily slow down the epidemic.

HINT 3: Age and accessibility

This tutorial illustrates the effect of heterogeneity in both mixing between population groups and in access to interventions, specifically vaccination. The scenarios simulate a measles outbreak over a single year in an initially fully susceptible population, highlighting differences in age and accessibility group-specific disease dynamics.

It consists of three scenarios that illustrate the measles outbreak and targeted vaccination campaigns:

  1. A measles outbreak with no interventions. The supporting configuration and campaign files are in ScenariosHINT03_AgeAndAccessA_BaselineOutbreak.

  2. An age-targeted outreach vaccination campaign for 6 to 10 year olds. The outreach is designed to reach populations who are normally inaccessible. The supporting configuration and campaign files are in ScenariosHINT03_AgeAndAccessB_AgeTargetedVaccine.

  3. A mass measles vaccination campaign of the entire population. This is a standard campaign, not an outreach campaign, as it targets individuals who are in the accessible group of the population and easily reached by the vaccination campaign. The supporting configuration and campaign files are in ScenariosHINT03_AgeAndAccessC_AccessTargetedVaccine.

Note

The fully susceptible population in this tutorial is used to illustrate the model features in the most parsimonious manner. For calibration to real data, you would need to initialize a distribution of immunity in the population at the beginning of the epidemic to represent past history of infection and vaccination. This could be done through matching serology data and/or matching vaccination dose history.

This tutorial assumes that you have read the previous HINT tutorial, HINT 2: School closure.

Demographics inputs

You can view the complete hint_ageandaccess_demographics and hint_ageandaccess_overlay files at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information, see Demographics parameters.

IndividualProperties

IndividualProperties defines two Property types: Accessibility and Age_Bin. The supporting software for Accessibility is the same as for the property types, Risk and Place, that were used in the previous tutorials. However, the Age_Bin property uses data from the demographics files for initial age distribution, and the membership in an Age_Bin group is updated as an individual ages. Therefore, the Age_Bin attribute has different structures than those of the other property types. For more information, see NodeProperties and IndividualProperties parameters.

Accessibility: Property and Values

Property and Values define two Accessibility groups: “Easy” and “Hard”. These two groups will be used to initialize the population with differential vaccination coverage. Individuals are randomly assigned one of these two values at birth and do not transition afterwards.

Accessibility: Initial_Distribution

At the beginning of the simulation, individuals have an equal chance of being assigned to either the “Easy” or “Hard” group as specified in the Initial_Distribution array.

Accessibility: Transitions

Individuals will not transition from one Accessibility group to the other therefore Transitions is empty.

Accessibility: TransmissionMatrix

TransmissionMatrix contains the \(\beta\) values for the WAIFW matrix that scales the base infectivity. The transmission Route is “Contact”. The \(\beta\) values are added to Matrix.

Matrix specifies the interaction between the “Easy” and “Hard” groups. Individuals in the “Easy” group are nine times as likely to be in contact with individuals of their own group. Similarly, individuals in the “Hard” accessibility group are five times as likely to interact with their own group.

The interpretation for this tutorial is that individuals in the “Hard” accessibility group have only 60% of the contacts of those in the “Easy” accessibility group. As an example, “Hard” accessibility could be caused by geographic isolation.

Age_Bin: Property and Age_Bin_Edges_In_Years

The second Property is Age_Bin. Instead of a Values array there is an Age_Bin_Edges_In_Years array that specifies the upper bounds of the age groups.

All of the middle values in the Age_Bins_In_Years array specify the upper bound of Age_Bin group that is neither the last nor the first group. This scenario has the following age groups:

  • Birth to age 6

  • Older than 6 to age 10

  • Older than 10 to age 20

  • Older than 20

Age_Bin: Initial_Distribution

The Age_Bin property does not support Initial_Distribution. As an age-dependent property, the distribution of the individuals in age bins is determined by the demographics file.

Age_Bin: Transitions

The Age_Bin property does not use Transitions in IndividualProperties. As an age-dependent property, the membership in an Age_Bin group is updated for individuals as they age. Transitions must be added to the IndividualProperties but it should be empty.

Age_Bin: TransmissionMatrix

TransmissionMatrix contains the \(\beta\) values that scale the base infectivity. The transmission Route is “Contact”. The \(\beta\) values are added to Matrix.

The assumption for this scenario is that individuals interact more frequently with their own age group, and those groups closer in age. Therefore, Matrix has higher values on the diagonal entries.

IndividualProperties for Accessibility and Age_Bin
{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Accessibility",
            "Values": ["Easy", "Hard"],
            "Initial_Distribution": [0.5, 0.5],
            "Transitions": [],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [0.9, 0.1],
                    [0.1, 0.5]
                ]
            }
        }, {
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [0, 6, 10, 20, -1],
            "Transitions": [],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [0.4, 0.2, 0.1, 0.3],
                    [0.2, 0.4, 0.1, 0.3],
                    [0.1, 0.2, 0.6, 0.1],
                    [0.1, 0.1, 0.1, 0.7]
                ]
            }
        }]
    }
}
Key configuration parameters

The following sections describe the parameters that define measles pathogenesis and immunity of an individual for all scenarios in this tutorial. Each scenario has a directory (A_BaselineOutbreak, B_AgeTargetedVaccine and C_AccessTargetedVaccine) that contains a simulation configuration files (config.json) file. The three directories are located in ScenariosHINT03_AgeAndAccess. The configuration files are the same in each directory but are copied in each directory to make it more convenient to run simulations.

Population dynamics parameters

The following parameters disable vital dynamics and disease mortality in the simulations. HINT is enabled. For more information, see Population dynamics parameters.

Set the following parameters:

  • Set Enable_Vital_Dynamics to 0.

  • Set Death_Rate_Dependence to “NONDISEASE_MORTALITY_BY_AGE_AND_GENDER”.

  • Set Enable_Heterogeneous_Intranode_Transmission to 1.

Pathogenesis and immunity parameters

Measles is a highly infectious virus that is typically transmitted by large respiratory and aerosolized droplets. Some transmission also occurs via fomites, however this is believed to be a less significant route for transmission as the virus only survives a short time on dry surfaces. The pathogen is characterized by a high basic reproductive number, often estimated at 16-20 combined with short incubation and infectious periods on the order of days. Immunity conferred is typically lifelong and vaccination has high efficacy (~95%). For more information, see Immunity, Incubation, and Infectivity and transmission parameters.

The following parameters define measles pathogenesis and immunity of an individual.

Set the following parameters:

  • Set Enable_Immunity to 1.

  • Set Enable_Immune_Decay to 0.

  • Set Base_Infectivity to 4.

  • Set Base_Incubation_Period to 5.

  • Set Base_Infectious_Period to 5.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Interventions

Run the simulation and generate graphs of the simulation output for each of the following three scenarios. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

A: Baseline outbreak

The simulation seeds an initial measles outbreak with a prevalence of 1% in the age group of 10 to 20 years old who are in the “Easy” accessibility group.

Age groups do not use the PropertyRestrictions parameter. It uses the Target_Demographic parameter with the value set to “ExplicitAgeRanges”, which will use the values in Target_Age_Min and Target_Age_Max. For more information, see event coordinator parameters.

The campaign file (campaign.json) is in the ScenariosHINT03_AgeAndAccessA_BaselineOutbreak directory.

{
    "Use_Defaults": 1,
    "Events": [{
        "Start_Day": 2,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 0.01,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "outbreak_source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Target_Demographic": "ExplicitAgeRanges",
            "Target_Age_Min": 10,
            "Target_Age_Max": 20,
            "Property_Restrictions": ["Accessibility:Easy"],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "class": "CampaignEvent"
    }]
}
Expected simulation output

In the fixed population of 1000 susceptible individuals, a total of 700 individuals become infected with a peak prevalence of 14% roughly 100 days into the epidemic. The number of individuals in the “Easy” and “Hard” groups is equal for each age group as specified in the initial distribution. Looking at the number of infected individuals by age and accessibility groups, notice that the numbers are significantly higher (peak prevalence) in the “Easy” accessibility group compared to “Hard”. This is due to the decreased transmission rate specified in the accessibility group matrix.

_images/HINT_AgeAndAccess_output_baseLine_orig2_cropped.png

Figure 1: Baseline outbreak

B: Age-targeted outreach vaccination campaign

This simulation adds an age targeted vaccination on day 1 followed by the same outbreak seeding specified in the first scenario on day 2. The campaign configuration file (campaign.json) is in the ScenariosHINT03_AgeAndAccessB_AgeTargetedVaccine directory. For more information, see SimpleVaccine parameters.

{
    "Use_Defaults": 1,
    "Events": [
        {
            "Event_Coordinator_Config": {
                "Demographic_Coverage": 0.95,
                "Intervention_Config": {
                    "Cost_To_Consumer": 10.0,
                    "Durability_Time_Profile": "BOXDURABILITY",
                    "Primary_Decay_Time_Constant": 3650,
                    "Reduced_Acquire": 1,
                    "Reduced_Transmit": 0,
                    "Vaccine_Take": 0.95,
                    "Vaccine_Type": "AcquisitionBlocking",
                    "class": "SimpleVaccine"
                },
                "Target_Demographic": "ExplicitAgeRanges",
                "Target_Age_Min": 6,
                "Target_Age_Max": 10,
                "class": "StandardInterventionDistributionEventCoordinator"
            },
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Start_Day": 1,
            "class": "CampaignEvent"
        }
    ]
}
Expected simulation output

Compare the number of infected-by-age in this simulation with the baseline outbreak scenario. Notice the dramatic decrease (an order of magnitude) of the infection in 6 to 10 year olds due to the vaccination of this group. Compare infections in other ages, noting the overall decrease in infection across age groups despite the fact that only 6 to 10 year olds were vaccinated.

_images/HINT_AgeAndAccess_output_6_to_10_vaccine_orig2_cropped.png

Figure 2: Age-targeted outreach vaccination campaign

C: Standard vaccination campaign

On day 1, a non-targeted vaccination campaign begins which reaches all those individuals in the “Easy” accessibility group but does not reach those in the “Hard” accessibility group.

This is followed by an outbreak that originates in the “Hard” accessibility group in the 0.5 to 6 year olds. In the first two scenarios, the outbreak originated in the “Easy” accessibility group among older children. This outbreak begins in the “Hard” accessibility group. For more information, see OutbreakIndividual and SimpleVaccine parameters.

The campaign configuration file (campaign.json) is in the ScenariosHINT03_AgeAndAccessC_AccessTargetedVaccine directory.

{
    "Use_Defaults": 1,
    "Events": [{
        "Start_Day": 2,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "outbreak_source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 0.01,
            "Target_Demographic": "ExplicitAgeRanges",
            "Target_Age_Min": 0.5,
            "Target_Age_Max": 6.0,
            "Property_Restrictions": ["Accessibility:Hard"],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "class": "CampaignEvent"
    }, {
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 0.95,
            "Intervention_Config": {
                "Cost_To_Consumer": 10.0,
                "Durability_Time_Profile": "BOXDURABILITY",
                "Primary_Decay_Time_Constant": 36500,
                "Reduced_Acquire": 1,
                "Reduced_Transmit": 1,
                "Vaccine_Take": 0.95,
                "Vaccine_Type": "AcquisitionBlocking",
                "class": "SimpleVaccine"
            },
            "Target_Demographic": "Everyone",
            "Property_Restrictions": ["Accessibility:Easy"],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }]
}
Expected simulation output

Notice the dramatic decrease in cumulative incidence (~300 vs. ~700) and peak prevalence from the first scenario because of the vaccination campaign that targeted the “Easy” accessibility group.

_images/HINT_AgeAndAccess_output_easyVaccine_orig2_cropped.png

Figure 3: Easy accessibility targeted vaccine–Accessibility easy group

Notice the almost complete elimination of infection in the “Easy” accessibility group due to 95% vaccination coverage with a 95% take. There is only a slight reduction in infection in the “Hard” accessibility group which was not reachable by vaccination in this campaign. Recall that the epidemic was seeded in the “Hard” accessibility group.

_images/HINT_AgeAndAccess_output_easyVaccine_orig_cropped.png

Figure 4: Easy accessibility targeted vaccine–Accessibility hard group

Exploring the model
  1. Adjust both the targeted age and accessibility groups of the initial outbreak. In IndividualProperties, decrease the value of the off-diagonal entries in the TransmissionMatrix. Investigate how this slows down the spread of measles to the other age and accessibility groups in terms of both the speed of the disease spread and total incidence of the disease.

  2. For one age and/or accessibility group, set all interactions with other groups to zero. To do this for the nth population group, set all values of the nth row to 0 except for the diagonal entry (nth column and nth row), which should remain unchanged.

  3. Use the campaign cost output, which is proportional to the number of doses, to compare the cost- effectiveness of vaccination campaigns targeted at different age and accessibility groups. Also adjust coverage in different groups.

    For example, the following Matrix values configure the interactions with other group for the third age group (older than 10 to 20 years).

    {
        "Matrix": [
            [0.4, 0.2, 0.10, 0.3],
            [0.2, 0.4, 0.10, 0.3],
            [0.0, 0.0, 0.6, 0.0],
            [0.1, 0.1, 0.10, 0.7]
        ]
    }
    

    Verify that if the epidemic started in a different group, it cannot spread to this group.

  4. How do results of the third scenario change if the infection is seeded in the “Easy” accessibility group? See that the infection fails to spread to the “Hard” accessibility group. Lower the vaccination coverage of the “Easy” accessibility group to find the vaccination level where the spread to the “Hard” accessibility group occurs.

HINT 4: Washington state pertussis

The Washington state pertussis tutorial highlights several important features of the 2012 pertussis outbreak in Washington state. These features include the timing and spatial pattern of the spreading outbreak, the relationship between vaccine-derived immunity levels in different population groups and disease incidence over the course of the outbreak, and the effects of within-age-group mixing and the switch from whole-cell to acellular vaccines on incidence in different age groups.

The Washington state pertussis tutorial consists of two scenarios:

  1. The baseline outbreak scenario initializes the historical vaccination of vaccine-accepting individuals before introducing a pertussis outbreak in Skagit county and letting it spread throughout the state. The supporting configuration and campaign files are in ScenariosHINT04_WAPertussisA_BaselineOutbreak.

  2. The target vaccine refusers scenario uses the baseline outbreak setup with the addition of a targeted vaccination before the outbreak of the previously vaccine-refusing populations in Snohomish, King, and Pierce counties. The supporting configuration and campaign files are in ScenariosHINT04_WAPertussisB_TargetVaccineRefusers.

This tutorial assumes that you have read the previous HINT tutorial, HINT 3: Age and accessibility.

Demographics inputs

You can see the complete hint_wapertussis_demographics file at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information, see Demographics parameters.

Geography and population

Each of Washington state counties is specified as a geographical node with population estimates by county from 2013 WA State Office of Financial Management and geographic location (latitude and longitude) centered on county seats. The following code example is for the first county (node) listed in the demographics file.

{
    "Nodes": [{
        "County": "Adams",
        "NodeAttributes": {
            "Latitude": 47.1274,
            "InitialPopulation": 19200,
            "Longitude": -118.38
        },
        "NodeID": 1
    }]
}
IndividualAttributes

The initial age distribution is a uniform distribution of individuals between the ages of 0 and 60 years old. For more information, see IndividualAttributes parameters.

{
    "Defaults": {
        "NodeAttributes": {},
        "IndividualAttributes": {
            "AgeDistribution_DESCRIPTION": "Box between age 0 and 60 years: Age_Initialization_Distribution_Type=DISTRIBUTION_SIMPLE",
            "AgeDistributionFlag": 1,
            "AgeDistribution1": 0,
            "AgeDistribution2": 21900
        }
    }
}

Age-specific mortality is taken from Washington statewide numbers from CDC 1999-2010 in annual deaths per 1000 individuals.

{
    "Defaults": {
        "NodeAttributes": {},
        "IndividualAttributes": {
            "MortalityDistribution_DESCRIPTION": "WA state (1999-2010).  Source: wonder.cdc.gov",
            "MortalityDistribution": {
                "NumDistributionAxes": 2,
                "AxisNames": ["gender", "age"],
                "AxisUnits": ["male=0,female=1", "years"],
                "AxisScaleFactors": [1, 365],
                "NumPopulationGroups": [2, 15],
                "PopulationGroups": [
                    [0, 1],
                    [0, 1, 2.5, 7.5, 12.5, 17.5, 22.5, 30, 40, 50, 60, 70, 80, 90, 120]
                ],
                "ResultUnits": "annual deaths per 1000 individuals",
                "ResultScaleFactor": 0.00000273972602739726027397260273973,
                "ResultValues": [
                    [4.8, 0.2, 0.1, 0.2, 0.5, 1.1, 1.1, 1.7, 4.1, 9.2, 19.8, 53.7, 154.2, 1000],
                    [4.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.5, 1.1, 2.6, 5.5, 14.3, 40.1, 129.3, 1000]
                ]
            }
        }
    }
}

The birth rate used in the simulation is the value corresponding to stable population replacement.

{
    "Defaults": {
        "NodeAttributes": {
            "BirthRate_DESCRIPTION": "Replacement of stable age distribution: Birth_Rate_Dependence=DEMOGRAPHIC_DEP_RATE (i.e. 14-45 year-old PossibleMothers)",
            "BirthRate": 0.00017675
        },
        "IndividualAttributes": {}
    }
}
IndividualProperties

In this simulation IndividualProperties defines two Property types: Accessibility and Age_Bin. The IndividualProperties configuration is in the hint_wapertussis_demographics_overlay file. For more information, see NodeProperties and IndividualProperties parameters.

Accessibility: Property and Values

The Property and Values parameters define two Accessibility groups: VaccineTake and VaccineRefuse. Accessibility will be used to initialize the population with differential vaccination coverage. Individuals are randomly assigned one of these two values at birth and do not transition afterwards.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Accessibility",
            "Values": ["VaccineTake", "VaccineRefuse"],
            "Initial_Distribution": [0.85, 0.15],
            "Transitions": []
        }]
    }
}
Accessibility: Initial_Distribution

At the beginning of the simulation, individuals have an 85% chance of being assigned to VaccineTake and a 15% chance to VaccineRefuse as specified by the Initial_Distribution array.

Accessibility: Transitions

In this simulation, individuals will not transition from one Accessibility group to the other therefore the Transitions structure is empty.

Accessibility: TransmissionMatrix

The specification of enhanced within-group interaction is specified by the WAIFW matrix between the two groups: VaccineTake and VaccineRefuse. For example, a VaccineRefuse-type individual is 5 times more likely (compared to homogeneous mixing) to be exposed to infections from another individual within their group and 0.3 times as likely to be exposed to an individual outside their group.

The transmission Route is “Contact”. The \(\beta\) values of the WAIFW matrix for the heterogeneous mixing between the Accessibility groups is defined in Matrix.

{
    "Defaults": {
        "IndividualProperties": [{
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [1.1, 0.3],
                    [0.3, 5.0]
                ]
            }
        }]
    }
}
Age_Bin: Property and Age_Bin_Edges_In_Years

The second Property is Age_Bin. Three age bins are defined by the Age_Bins_In_Years array with heterogeneous mixing defined by the following TransmissionMatrix.

  • The beginning 0 and ending -1 are mandatory elements in the Age_Bins_In_Years array.

  • The 0 is the lower bound for the first Age_Bin group and specifies birth.

  • The -1 is the upper bound of the last Age_Bin group and specifies the maximum age of the simulation.

All of the middle values in the Age_Bins_In_Years array specify the upper bound of Age_Bin group that is neither the last nor the first group. This simulation has the following age groups:

  • Birth to age 5

  • Older than 5 to age 13

  • Older than 13

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [0, 5, 13, -1],
            "Transitions": []
        }]
    }
}
Age_Bin: Initial_Distribution

The Age_Bin Property type does not support Initial_Distribution. As an age-dependent property, the distribution of the individuals in age bins is determined by the demographics file.

Age_Bin: Transitions

The Age_Bin property does not use Transitions. As an age-dependent property, the membership in an Age_Bin group is updated for each individual as he or she ages. Transitions must be added to the IndividualProperties but it should be empty.

Age_Bin: TransmissionMatrix

TransmissionMatrix contains the \(\beta\) values of the WAIFW matrix that scale the base infectivity. The transmission Route is “Contact”. The heterogeneous mixing between the age groups is defined in Matrix.

{
    "Defaults": {
        "IndividualProperties": [{
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [1.4, 1.0, 1.0],
                    [1.0, 2.5, 0.7],
                    [1.0, 0.7, 1.0]
                ]
            }
        }]
    }
}
IndividualProperties for Accessibility and Age_Bin
{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Accessibility",
            "Values": ["VaccineTake", "VaccineRefuse"],
            "Initial_Distribution": [0.85, 0.15],
            "Transitions": [],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [1.1, 0.3],
                    [0.3, 5.0]
                ]
            }
        }, {
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [0, 5, 13, -1],
            "Transitions": [],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [1.4, 1.0, 1.0],
                    [1.0, 2.5, 0.7],
                    [1.0, 0.7, 1.0]
                ]
            }
        }]
    }
}

For more information on IndividualProperties, see Heterogeneous Intra-Node Transmission (HINT).

Migration

The daily migration rates between the various counties are taken from daily commuter data and are packed into the binary file in hint_wapertussis_regional_migration.bin.

These rates are most likely a lower bound on actual migration, especially between more distant counties, as they consider only daily commutes and not other longer-range modes.

Key configuration parameters

Enable_Heterogeneous_Intranode_Transmission must be set to 1 to enable the TransmissionMatrix structure in IndividualProperties. For more information, see NodeProperties and IndividualProperties parameters.

Each scenario has a directory (A_BaselineOutbreak and B_TargetVaccineRefusers) that contains a configuration files (config.json) file. The two directories are located in ScenariosHINT04_WAPertussis. The configuration files are the same but are copied in each directory to make it more convenient to run simulations.

Pertussis disease parameters

The generic-disease-model parameters are configured to approximate the dynamics of pertussis. There is a 7-day fixed incubation period followed by an infectious period drawn from an exponential with a mean duration of 22 days. The product of the daily infectiousness (0.6) and the mean infectious duration corresponds to an R0 of about 14. For more information, see Infectivity and transmission and Incubation parameters.

Set the following parameters:

  • Set Base_Infectivity to 0.6.

  • Set Base_Infectious_Period to 22.

  • Set Base_Incubation_Period to 7.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Infectious_Period_Distribution to “EXPONENTIAL_DURATION.”

Upon clearing natural pertussis infections, individuals are configured to have complete protection against re-acquisition for a duration of 4 years. After 4 years, the protection wanes exponentially with a time constant of 16 years. The reduced transmission potential of immune individuals is configured to follow a similar waning pattern. For more information, see Immunity parameters.

Set the following parameters:

  • Set Immunity_Acquisition_Factor to 0.

  • Set Acquisition_Blocking_Immunity_Duration_Before_Decay to 1460.

  • Set Acquisition_Blocking_Immunity_Decay_Rate to 0.00017.

Adapted population sampling

The simulation is configured to use adapted sampling rates in the various nodes as a function of population size. This improves the computing time of the simulation while minimizing the effect of over-sampling, (i.e. a compromised representation of the small-number stochastic effects). The maximum number of sampled individuals in any given node is configured to be 1000. For example, a county with 2 million individuals would have 1000 samples each with weight=2000, while a county with 10,000 individuals would have 1000 samples each with weight=10. For more information, see Sampling parameters.

Set the following parameters:

  • Set Individual_Sampling_Type to “ADAPTED_SAMPLING_BY_POPULATION_SIZE.”

  • Set Max_Node_Population_Samples to 1000.

Migration

The regional migration between nodes has been configured in a commute-driven mode with all migration events consisting of single round-trips where the migrating individual draws a duration of his or her stay from an exponential with a mean of one day before returning with probability = 1 to the home node. Without regenerating the binary migration file, it is possible to scale all regional migration rates up and down with the x_Regional_Migration multiplicative parameter. For more information, see:ref:config-migration parameters.

Set the following parameters:

  • Set Migration_Pattern to “SINGLE_ROUND_TRIPS.”

  • Set Regional_Migration_Roundtrip_Duration to 1.

  • Set Regional_Migration_Roundtrip_Probability to 1.

Interventions

You can see the complete campaign.json in ScenariosHINT04_WAPertussis.

Initialization of population immunity

A ten-year burn-in allows for the age-structure of the vaccination schedule (including waning) to be initialized. Four vaccine-distribution events are specified in the campaign file, each targeted only at individuals with the “VaccineTake” value for the “Accessibility” property in the demographics file. For more information, see SimpleVaccine.

  1. A vaccination calendar to all children under 12 years old, so that the rest of their childhood vaccinations are distributed as they age: 2 month, 4 month, 6 month, 17 month, 5 year, 11.5 year with 90% coverage at the fourth dose and 95% on each of the last two doses.

    {
        "Calendar": [{
            "Age": 60,
            "Probability": 1
        }, {
            "Age": 120,
            "Probability": 1
        }, {
            "Age": 180,
            "Probability": 1
        }, {
            "Age": 510,
            "Probability": 0.9
        }, {
            "Age": 1825,
            "Probability": 0.95
        }, {
            "Age": 4200,
            "Probability": 0.95
        }],
        "Dropout": 0,
        "class": "IVCalendar"
    }
    
  2. A birth-triggered distribution of the same calendar to newborns as they are born throughout the simulation.

  3. A health-seeking behavior for people over 12 years old to seek booster doses with a daily tendency (0.000548) corresponding to a 5-year mean waiting time.

  4. A dose to over-12s at the beginning of the simulation to prime their immune systems to account for their historic childhood vaccination. The acellular pertussis vaccine is configured such that 95% of vaccinated individuals, for whom the vaccine takes, will have an initial 90% reduction in the probability of acquiring infection per exposure and a 60% reduction in their transmission potential if infected. The protection wanes exponentially (DECAYDURABILITY) with a time constant of approximately 7 years.

    {
        "Cost_To_Consumer": 20.0,
        "Durability_Time_Profile": "DECAYDURABILITY",
        "Primary_Decay_Time_Constant": 2525,
        "Reduced_Acquire": 0.9,
        "Reduced_Transmit": 0.6,
        "Reduced_Mortality": 1,
        "Vaccine_Take": 0.95,
        "Vaccine_Type": "Generic",
        "class": "SimpleVaccine"
    }
    

The initial immunity given to the over-12 population is intended to capture the slightly more immunogenic whole-cell vaccine, which is configured with 90% initial protection against both acquisition and transmission as well as a longer 20-year decay time.

Targeted outbreak

As a demonstration of the ability to target an outbreak at both a geographical region (or set of nodes) and at a target population (based on IndividualProperties), this simulation has two OutbreakIndividual interventions. The first (shown below) is distributed 10 years into the simulation and infects 1% of the “VaccineTake” population in the specified list of nodes (in this case only Skagit county with NodeID = 57). The other intervention, distributed 100 days later, infects 10% of the “VaccineRefuse” population in the same county.

{
    "Campaign_Name": "Washington State Pertussis Outbreak",
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "Antigen": 0,
            "Genome": 0,
            "Outbreak_Source": "PrevalenceIncrease",
            "class": "OutbreakIndividual"
        },
        "Demographic_Coverage": 0.01,
        "Number_Repetitions": 1,
        "Target_Demographic": "Everyone",
        "Property_Restrictions": ["Accessibility:VaccineTake"],
        "class": "StandardInterventionDistributionEventCoordinator"
    },
    "Nodeset_Config": {
        "Node_List": [57],
        "County_DESCRIPTION": "Skagit",
        "class": "NodeSetNodeList"
    },
    "Start_Day": 3650,
    "class": "CampaignEvent"
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Spatial spread

The Plot_Infections_By_Node.py script unpacks the SpatialOutput binary files, which are written out for each channel listed in the configuration parameter, Spatial_Output_Channels, provided that Enable_Spatial_Output is set to 1. For more information, see Output settings parameters.

The following plot shows the daily incidence of new infections for a representative sampling of counties in the simulation. From top to bottom, one can see the characteristic evolution of each local outbreak, starting in Skagit county and progressing southward through Snohomish and King counties down to Clark county on the Oregon border. Similarly, there is a delay before the outbreak makes it over Cascades into the Tri-Cities (Benton and Franklin counties) and Spokane areas.

_images/HINT_WAPertussis_output_plotByNode_orig_cropped.png

Figure 1: Daily incidence of new infections in representative sample of counties

Incidence in different groups

The Plot_Infections_by_Property.py script parses the output of the PropertyReport.json file (provided that Enable_Property_Output is set to 1) and plots the output channels grouped according to the property values specified within the script. In the following example, the total number of cases and the population-normalized incidence is compared between the “VaccineTake” and “VaccineRefuse” groups.

_images/HINT_WAPertussis_output_plotByGroup_orig_cropped.png

Figure 2: Population-normalized incidence of new infection by accessibility groups

Incidence by age

Finally, the Plot_Age_Distributions.py script parses the BinnedReport.json output (provided that Enable_Demographics_Reporting is set to 1) and plots the population in each age bin through time and also the cumulative incidence of infection in age bins as shown below.

_images/HINT_WAPertussis_output_ageDistributions_orig_cropped.png

Figure 3: Population of age bins and cumulated incidence

Exploring the model

There are a number of different areas that one could explore within this tutorial:

  • Modifying the vaccination coverage, efficacy, and waning values to see the impact on the size and make-up of the effected populations.

  • Modifying the migration rates and county-level variation in vaccine-derived immunity to see the impact on the spatio-temporal pattern of the spreading outbreak.

  • Modifying the heterogeneous mixing within age groups and the relative protective efficacy of the whole-cell and acellular vaccines to see the impact on the age distribution of the effected population.

  • Introducing targeted interventions before the outbreak to minimize its impact.

As an example, the last category is provided in the directory ScenariosHINT04_WAPertussisB_TargetVaccineRefusers and consists of a targeted vaccination 100 days before the outbreak that reaches 95% of the previously unvaccinated VaccineRefuse population in the three most-populous counties: King, Snohomish and Pierce.

_images/HINT_WAPertussis_exploring_vaccineRefusers_orig_cropped.png

Figure 4: Impact of targeted vaccines in King, Snohomish and Pierce counties

HINT 5: Seattle commuting

This tutorial simulates the person-person disease transmission of influenza in Seattle over the course of one year. The tutorial assumes that individuals have round-trip travels, or commutes, between census tracts in less than one day. The return time is less than or equal to 8 hours and movement is in equilibrium. Different from homogeneous mixing, the heterogeneous movement links and rates between census tracts will create a timing difference of epidemic trajectories upon initial seeding.

The tutorial represents Seattle as a single node. There are 125 groups based on Seattle census tract data. The heterogeneous infectivity between individuals and the 125 groups is represented by a WAIFW matrix with \(\beta\) values. The values, which represent the heterogeneous force of infection at each census tract, are based on the movement rate between census tracts and the return rate. Individuals interact mostly with other individuals in their own census tract but also shed into or acquire infection from the census tracts that they commuted to during the day.

Demographics inputs

To view the complete demographics file, see hint_seattlecommuting_demographics at <path_to_directory>RegressionScenariosInputFiles where <path_to_directory> is the location where EMOD source files were installed. For more information, see Demographics parameters.

Generating Seattle as a single node

The hint_seattlecommuting_demographics file was generated from the multi-node Seattle_30arcsec_demographics file, the Seattle_30arcsec_local_migration file, and the Seattle_30arcsec_regional_migration file using the Python script ConvertMultipleNodeDemographicsToSingleNodePools. The script also added the IndividualProperties attribute that is needed for this tutorial.

The ConvertMultipleNodeDemographicsToSingleNodePools Python file, Seattle_Template, which is a copy of the hint_seattlecommuting_demographics file, and the three multi-node input files are in the ScenariosHINT05_SeattleCommutingscript directory.

IndividualProperties

For more information, see IndividualAttributes parameters.

Property and Values

The Property and Values parameters of IndividualProperties define 125 groups based on Seattle census tracts. The Property type must be “Geographic” as it is the only property that supports 125 Values. The Values are the 3-digit ID for the 125 Seattle census tracts for Seattle.

Initial_Distribution

Initial_Distribution is an array with 125 elements. See the hint_seattlecommuting_demographics file for those values.

Transitions

Individuals will not move from one Seattle census track to the other so Transitions is empty.

TransmissionMatrix

TransmissionMatrix contains the \(\beta\) values that scale the base infectivity. The transmission Route is “Contact”. The \(\beta\) values are added to Matrix.

The Matrix was created using a script with a specified return rate. The script loads the existing multi-node demographics and migration input files, and converts them to a single-node demographics file. Each component in the TransmissionMatrix is calculated based on the spatial coupling of round- trip movement flow detailed in the article: Balcan, D., Colizza, V., Gonçalves, B., et al. (2009). Multiscale mobility networks and the spatial spreading of infectious diseases. PNAS 106(51), 21484-21489. doi: 10.1073/pnas.0906910106.

Since the average hours to stay at a destination is 8 hours (1/3 of a day) and the return rate is the inverse of the average hours, the return rate is 3. That is, \(\frac{1}{(\frac{1}{3})}=3\).

There are 125 Seattle census tracts so the Matrix is a 125 x 125 matrix.

See the hint_seattlecommuting_demographics file in the ScenarioInputFiles directory to see the complete IndividualProperties for this simulation.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Geographic",
            "Values": ["001", "002", "003", "124", "125"],
            "Initial_Distribution": [125],
            "Transitions": [],
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": []
            }
        }]
    }
}
Key configuration parameters

The generic disease model parameters are configured to approximate the dynamics of influenza-like- illness disease. The key influenza disease parameters are listed below. For more information, see Infectivity and transmission and Incubation parameters.

You can see the complete config.json file in the ScenariosHINT05_SeattleCommuting directory.

Set the following parameters:

  • Set Base_Infectivity to 0.3.

  • Set Base_Infectious_Period to 7.

  • Set Base_Incubation_Period to 3.

  • Set Enable_Heterogeneous_Intranode_Transmission to 1.

  • Set Incubation_Period_Distribution to “FIXED_DURATION.”

  • Set Infectious_Period_Distribution to “FIXED_DURATION.”

Interventions

This simulation uses an OutbreakIndividual event to demonstrate the ability to target an outbreak at a geographical region represented as a heterogeneous group. The OutbreakIndividual targets the infection at 1% of the individuals living in census tract 7 at day 20. For more information, see OutbreakIndividual parameters.

You can see the complete campaign.json file in the in the ScenariosHINT05_SeattleCommuting directory.

{
    "Use_Defaults": 1,
    "Events": [{
        "Campaign_Name": "Generic Seattle Regression Campaign",
        "Event_Coordinator_Config": {
            "Coverage": 1,
            "Demographic_Coverage": 0.01,
            "Intervention_Config": {
                "Antigen": 0,
                "Event_Name": "Outbreak",
                "Genome": 0,
                "outbreak_source": "ImportCases",
                "class": "OutbreakIndividual"
            },
            "Number_Distributions": 1,
            "Number_Repetitions": 1,
            "Target_Age_Max": 100,
            "Target_Age_Min": 0,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": ["Geographic:007"],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 20,
        "class": "CampaignEvent"
    }]
}
Run the simulation

Run the simulation and generate graphs of the simulation output. For more information, see Run simulations.

Note

Because the EMOD model is stochastic, your graphs may appear slightly different from those given below.

Expected simulation output

This tutorial shows the timing difference of disease spread between groups due to spatial coupling. It has 125 groups that represent the census tracts in Seattle and simulates a daily commute between the census tracts.

The following Inset Charts shows the daily number of infected people for each census tract in the simulation sorted by census tract ID. The census tracts are sequentially ordered with the census tract with the lowest number at the top of the graph. the graph shows the difference in timing between census tracts in terms of the disease spread.

_images/HINT_SeattleCommuting_output_spatialCoupling__orig_cropped.png

Figure 1: Number of infected people per census tract

Exploring the model

Change the return rates to either increase or decrease the spatial coupling when generating the demographic input and transmission matrix. In general, when the return rates are high, there is less coupling between census tracts so the disease curves of the outbreak are less synchronized. The following example shows a less synchronized behavior of disease spread when the return rate = 24 (people spend 1 hour on average at their destination) with the outbreak targeted at “Geographic: 7” in the demographics file.

Updating a demographics file

You can manually modify the the Seattle_template provided in the ScenariosHINT05_SeattleCommutingscript directory. However, because of the size of the TransmissionMatrix, you might want to use the Python scripts (also in ScenariosHINT05_SeattleCommutingscript) to modify the Seattle_template and regenerate the demographics file. Update the value of returnRate in ConvertMultipleNodeDemographicsToSingleNodePools using an editor of your choice.

Note

All of the multi-node demographics files and Seattle_template must be in the same directory.

For example, the following Inset Chart graph shows decreased spatial coupling after modifying the demographics file.

_images/HINT_SeattleCommuting_exploring_decreasedCoupling_orig_cropped.png

Figure 2: Decreased coupling between census tracts

How to use the software

This section contains detailed procedural information about how to use Epidemiological MODeling software (EMOD). For example, how to download input data files, how to set up groups in a population, how to create a configuration file and campaign file, how to run simulations both locally and on a remote HPC cluster, and more.

The architecture diagram below shows, at a high level, how the system functions.

_images/architecture.png

High-level EMOD system architecture

For more information about how each component of the system fits together, see Introduction to the software. That section provides a conceptual overview of EMOD and describes each required or optional component for running a simulation.

Use input data files

The input data files contain the relatively fixed information about the population within each geographic node. For example, the number of individuals, geography, climate, demographics, and migration data. This topic describes how to download and use the input data files. These are in contrast to the demographic, geography, and migration parameters in the configuration file that control simulation-wide qualities, such as enabling air migration across all nodes in the simulation.

Except for the demographics file, you will generally use input data files without modifying them in any way. Only the demographics file is required, though migration files may be required for multi-node simulations. See Input data files for an overview of each of the different input files, including which are required for different simulations. See Input data file structure for reference information about the structure of each of these files.

Download input files

The EMOD-InputData repository uses large file storage (LFS) to manage the binaries and large JavaScript Object Notation (JSON) files. A standard Git clone of the repository will only retrieve the metadata for these files managed with LFS. To retrieve the actual data, follow the steps below.

  1. Install the Git LFS plugin, if it is not already installed.

    • For Windows users, download the plugin from https://git-lfs.github.com.

    • For CentOS on Azure users, the plugin is included with the PrepareLinuxEnvironment.sh script.

  2. Using a Git client or Command Prompt window, clone the input data repository to retrieve the metadata:

    git clone https://github.com/InstituteforDiseaseModeling/EMOD-InputData.git
    
  3. Navigate to the directory where you downloaded the metadata for the input data files.

  4. Cache the actual data on your local machine:

    git lfs fetch
    
  5. Replace the metadata in the files with the actual contents:

    git lfs checkout
    
Specify input files in the configuration file

Follow the steps below to specify which input files to use in a simulation. Only the demographics file is required, though additional files are generally needed for a realistic simulation.

  1. Place all input files for a simulation in the same directory. You will specify this directory when you run a simulation. See Run simulations for more information.

  2. In your configuration file, specify the path to each of these files, relative to the directory above, in the appropriate parameter. Generally, these parameters are appended with “_Filename” or “_Filenames”.

For example, the example below shows the relevant portion of a configuration file. See :doc :parameter-configuration for a complete list of the parameters.

{
    "parameters": {
        "Air_Temperature_Filename": "Namawala_single_node_air_temperature_daily.bin",
        "Air_Temperature_Offset": 0,
        "Air_Temperature_Variance": 2,
        "Base_Rainfall": 100,
        "Campaign_Filename": "campaign.json",
        "Climate_Model": "CLIMATE_BY_DATA",
        "Climate_Update_Resolution": "CLIMATE_UPDATE_DAY",
        "Config_Name": "VectorAndMalaria_5_Namawala_Vector_ITNs",
        "Demographics_Filenames": [
            "Namawala_single_node_demographics.json"
        ],
        "Geography": "Namawala",
        "Land_Temperature_Filename": "Namawala_single_node_land_temperature_daily.bin",
        "Land_Temperature_Offset": 0,
        "Land_Temperature_Variance": 2,
        "Load_Balance_Filename": "",
        "Rainfall_Filename": "Namawala_single_node_rainfall_daily.bin",
        "Rainfall_In_mm_To_Fill_Swamp": 1000.0,
        "Rainfall_Scale_Factor": 1,
        "Relative_Humidity_Filename": "Namawala_single_node_relative_humidity_daily.bin",
        "Relative_Humidity_Scale_Factor": 1,
        "Relative_Humidity_Variance": 0.05
    }
}
Modify demographics files

The demographics files provided by IDM generally contain information about prevalence, immunity, risk, population size, and more for a geographic region. However, you will almost certainly want to modify the file to provide more detail or to set up groups within a population to more accurately model heterogeneous populations in terms of transmission, group transitions, or targeted interventions.

The demographics file is the only required input data file, with one exception. You have the option to run a simulation without a demographics file if you set Enable_Demographics_Builtin to 1 in the configuration file. However, this option is primarily used for software testing. It will not provide meaningful simulation data as it does not represent the population of a real geographic location.

Use demographics overlay files

You can use multiple demographic files when setting up a simulation. The “base layer” file contains default parameter settings and one or more overlay files contains additional parameters or different parameter values that override the values in the default file. This topic describes how to set up the base layer and overlay files.

Demographic overlay files allow you to do the following:

  • Separate different sets of parameters and values into individual overlays (for example, to separate those that are useful for specific diseases into different overlay files)

  • Add new parameters for a simulation into an overlay for easier prototyping

  • Override certain parameters of interest in an overlay

  • Override certain parameters for a particular sub-region

  • Simulating subsets of a larger region for which input data files have been constructed

  1. Select the demographics file to use as the base layer file. All nodes to be included in the simulation must be listed in this file.

  2. In the metadata, make note of the IdReference value.

    You may change this value if you desire, but all input files for a simulation must have the same IdReference value. For more information about this parameter and the structure of demographics files in general, see Demographics parameters.

  3. Create one or more overlay files. Keep the following things in mind:

    • In the metadata, the value for IdReference must match the value in the base layer file and all other input data files.

    • Any nodes listed in an overlay but not in the base layer will not be simulated.

    • If the demographics files include any JSON array elements, the entire array is overridden. You cannot add or remove individual elements in an array using an overlay file.

    • Overriding a parameter value on a node will not affect the other parameter values applied to that node.

    • Values set in the Defaults section of an overlay will be applied to all nodes listed in that file, not all nodes in the entire simulation. Therefore, an overlay file that includes a Defaults section but no Nodes section will not have any effect.

  4. Place all demographics files in the directory where the other input data files are stored.

  5. In the configuration file, set Demographics_Filenames to an array that contains a comma-delimited list of demographics files, listing the base layer file first.

An example base layer demographics file and an overlay file is below. You can see that the overlay adds the TransmissionMatrix for Heterogeneous Intra-Node Transmission (HINT) to only three of the five nodes (which correspond to Washington state counties).

{
    "Metadata": {
        "Author": "ewenger",
        "NodeCount": 5,
        "Tool": "table_to_demographics.py",
        "IdReference": "SampleContent",
        "DateCreated": "2013-08-01 15:37:16.853000"
    },
    "Defaults": {
        "NodeAttributes": {
            "BirthRate_DESCRIPTION": "Replacement of stable age distribution: Birth_Rate_Dependence=DEMOGRAPHIC_DEP_RATE (i.e. 14-45 year-old PossibleMothers)",
            "BirthRate": 0.00017675,

            "Airport": 0,
            "Region": 1,
            "Altitude": 0,
            "Seaport": 0
        },
        "IndividualAttributes": {

            "AgeDistribution_DESCRIPTION": "Box between age 0 and 60 years: Age_Initialization_Distribution_Type=DISTRIBUTION_SIMPLE",
            "AgeDistributionFlag": 1,
            "AgeDistribution1": 0,
            "AgeDistribution2": 21900,

            "PrevalenceDistribution_DESCRIPTION": "No initial infections",
            "PrevalenceDistributionFlag": 0,
            "PrevalenceDistribution1": 0,
            "PrevalenceDistribution2": 0,

            "RiskDistributionFlag": 0,
            "RiskDistribution1": 1,
            "RiskDistribution2": 0,

            "ImmunityDistributionFlag": 0,
            "ImmunityDistribution1": 1,
            "ImmunityDistribution2": 0,

            "MigrationHeterogeneityDistributionFlag": 0,
            "MigrationHeterogeneityDistribution1": 1,
            "MigrationHeterogeneityDistribution2": 0,

            "MortalityDistribution_DESCRIPTION": "WA state (1999-2010).  Source: wonder.cdc.gov",
            "MortalityDistribution": {
                "NumDistributionAxes": 2,
                "AxisNames": [ "gender", "age" ],
                "AxisUnits": [ "male=0,female=1", "years" ],
                "AxisScaleFactors": [ 1, 365 ],
                "NumPopulationGroups": [ 2, 15 ],
                "PopulationGroups": [
                    [ 0, 1 ],
                    [ 0, 1, 2.5, 7.5, 12.5, 17.5, 22.5, 30, 40, 50, 60, 70, 80, 90, 120 ]
                ],
                "ResultUnits": "annual deaths per 1000 individuals",
                "ResultScaleFactor": 0.00000273972602739726027397260273973,
                "ResultValues": [
                    [ 4.8, 0.2, 0.1, 0.2, 0.5, 1.1, 1.1, 1.7, 4.1, 9.2, 19.8, 53.7, 154.2, 1000, 1000 ],
                    [ 4.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.5, 1.1, 2.6, 5.5, 14.3, 40.1, 129.3, 1000, 1000 ]
                ]
            }
        }
    },
    "Nodes": [
        {
            "County": "Adams",
            "NodeAttributes": {
                "Latitude": 47.1274,
                "InitialPopulation": 19200,
                "Longitude": -118.38
            },
            "NodeID": 1
        },
        {
            "County": "Asotin",
            "NodeAttributes": {
                "Latitude": 46.3393,
                "InitialPopulation": 21800,
                "Longitude": -117.0482
            },
            "NodeID": 2
        },
        {
            "County": "Benton",
            "NodeAttributes": {
                "Latitude": 46.2068,
                "InitialPopulation": 183400,
                "Longitude": -119.7689
            },
            "NodeID": 3
        },
        {
            "County": "Chelan",
            "NodeAttributes": {
                "Latitude": 47.4235,
                "InitialPopulation": 73600,
                "Longitude": -120.3103
            },
            "NodeID": 4
        },
        {
            "County": "Clallam",
            "NodeAttributes": {
                "Latitude": 48.1181,
                "InitialPopulation": 72350,
                "Longitude": -123.4307
            },
            "NodeID": 5
        }
    ]
}
{
    "Metadata": {
        "Author": "cwiswell",
        "NodeCount": 10,
        "Tool": "table_to_demographics.py",
        "IdReference": "SampleContent",
        "DateCreated": "2013-08-01 15:37:16.853000"
    },
    "Defaults": {
        "IndividualProperties": [
            {
                "Property": "Accessibility",
                "Values": [ "VaccineTake", "VaccineRefuse"],
                "Initial_Distribution": [ 0.85, 0.15],
                "Transitions": [],
                "TransmissionMatrix": {
                    "Route": "Contact",
                    "Matrix": [
                        [1.1, 0.3],
                        [0.3, 5.0]
                    ]
                }
            },
            {
                "Property": "Age_Bin",
                "Age_Bin_Edges_In_Years": [ 0, 5, 13, -1 ],
                "Transitions": [],
                "TransmissionMatrix": {
                    "Route": "Contact",
                    "Matrix": [
                        [1.4, 1.0, 1.0],
                        [1.0, 2.5, 0.7],
                        [1.0, 0.7, 1.0]
                    ]
                }
            }
        ]
    },
    "Nodes": [
        {
            "NodeID": 1
        },
        {
            "NodeID": 3
        },
        {
            "NodeID": 5
        }
    ]
}
Configure heterogeneity using individual and node properties

Demographics files can be used to add heterogeneity to a population. You can define property values for accessibility, age, geography, risk, and other properties and assign these values to individuals or nodes in the simulation. For more information about the parameters and structure of demographics files, see Demographics parameters.

These properties are most commonly used to target (or avoid targeting) particular nodes or individuals with interventions. For example, you might want to put individuals into different age bins and then target interventions to individuals in a particular age bin. Another common use is to configure treatment coverage to be higher for nodes that are easy to access and lower for nodes that are difficult to access. For more information on targeting interventions to particular nodes or individuals, see Target interventions to nodes or groups.

For the generic simulation type, you can also configure heterogeneous transmission between individuals with different property values. For more information, see Configure heterogeneous disease transmission. For other simulation types, transmission is configured using mechanistic parameter settings.

This topic describes how to define individual properties and assign different values to individuals in a simulation. However, with the exception of setting up age bins, you can use the same process to configure heterogeneity using NodeProperties. To see all individual and node property parameters, see NodeProperties and IndividualProperties.

Create individual properties other than age

Assigning property values, such as accessibility or risk, to individuals uses the IndividualProperties parameter in the demographics file. See Demographics parameters for a list of supported properties. The values you assign to properties are user-defined and can be applied to individuals in all nodes or only in particular nodes in a simulation.

  1. In the demographics file, add the IndividualProperties parameter and set it to an empty array. If you want the values to apply to all nodes, add it in the Defaults section; if you want the values to be applied to specific nodes, add it to the Nodes section.

  2. In the array, add an empty JSON object. Within it, do the following:

    1. Add the Property parameter and set it to one of the supported values.

    2. Add the Values parameter and set it to an array of possible values that can be assigned to individuals. You can define any value here.

    3. Add the Initial_Distribution parameter and set it to an array of numbers that add up to 1. This configures the initial distribution of the values assigned to individuals in one or all nodes.

    4. To define how individuals transition from one property value to another, add the Transitions parameter and set it to it an empty array. Within it, do the following:

      1. Add an empty JSON object and set parameters that define the value that individuals transition from, the value they transition to, the event that triggers the transition, the probability of transition, and more. See doc:parameter-demographics for a list of supported Transitions parameters and values.

  3. If you want to add another property and associated values, add a new JSON object in the IndividualProperties array as above.

Note

Multiple properties must be defined in one file. They can be defined in either the base layer demographics file or an overlay file, but they cannot be split between the files. The maximum number of property types that can be added is two.

Create properties for age ranges

Creating properties based on age ranges works a little differently than other properties. Age_Bin is tied to the simulated age of an individual rather than being an independent property. Some of its characteristics, such as initial distribution and transitions, are dependent on information from the demographics file and EMOD that manages individual aging during the simulation. The Transitions array is not required and other parameters and structures in IndividualProperties are slightly different.

  1. In the demographics file, add the IndividualProperties parameter and set it to an empty array. If you want the values to apply to all nodes, add it in the Defaults section; if you want the values to be applied to specific nodes, add it to the Nodes section.

  2. In the array, add an empty JSON object. Within it, do the following:

    1. Add the Property parameter and set it to “Age_Bin”.

    2. Add the Age_Bin_Edges_In_Years parameter and set it to an array that contains a comma- delimited list of integers in ascending order that define the boundaries used for each of the age bins, in years. The first number must always be 0 (zero) to indicate the age at birth and the last number must be -1 to indicate the maximum age in the simulation.

The example below shows how to set up several property values based on disease risk and physical place, and how to move individuals among these values. It also defines three age bins: 0 to 5 years, older than 5 to 13, and older than 13 to the maximum age.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Risk",
            "Values": ["Low", "Medium", "High"],
            "Initial_Distribution": [0.7, 0.2, 0.1],
            "Transitions": [{
                "From": "High",
                "To": "Medium",
                "Type": "At_Age",
                "Coverage": 1,
                "Probability_Per_Timestep": 0.3,
                "Timestep_Restriction": 20,
                "Age_In_Years": 5,
                "Timesteps_Until_Reversion": 0
            }, {
                "From": "Medium",
                "To": "Low",
                "Type": "At_Age",
                "Coverage": 1,
                "Probability_Per_Timestep": 0.3,
                "Timestep_Restriction": 20,
                "Age_In_Years": 12,
                "Timesteps_Until_Reversion": 0
            }]
        }, {
            "Property": "Place",
            "Values": ["Community", "School", "Work", "Vacation"],
            "Initial_Distribution": [0.3, 0.2, 0.4, 0.1],
            "Transitions": [{
                "From": "School",
                "To": "Vacation",
                "Type": "At_Timestep",
                "Coverage": 1,
                "Timestep_Restriction": {
                    "Start": 20
                },
                "Age_In_Years_Restriction": {},
                "Probability_Per_Timestep": 1,
                "Timesteps_Until_Reversion": 20
            }]
        }, {
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [0, 5, 13, -1],
            "Transitions": []
        }]
    }
}
Configure heterogeneous disease transmission

By default, Epidemiological MODeling software (EMOD) assumes disease transmission is homogeneous across a population within each node when using the generic simulation type. That is, the population within a node is “well-mixed” and has a homogeneous pattern of mixing. Disease transmission is configured by the parameter Base_Infectivity, which determines a single transmission constant, \(\beta_0\), to calculate the transmission rate for each individual. These assumptions simplify the mathematical calculations that are performed when running a simulation.

However, these assumptions do not reflect the true complexity of disease transmission in a population. The dynamics of transmission for some diseases are influenced by heterogeneous contact patterns. Several studies have shown that contact pattern is not random and correlates with specific characteristics, such as age, household and community structure, and spatial movement. When modeling scenarios with large heterogeneities, such as accessibility to health care or age groups, a simulation without heterogeneous mixing cannot incorporate these population segments in a node.

This topic describes how to use the HINT feature to add heterogeneous transmission to your generic model by defining population groups and the transmission rate between each of these groups. Heterogeneity and transmission scaling describes the mathematics underpinning HINT.

  1. In the configuration file, set the following:

    • Enable_Heterogeneous_Intranode_Transmission to 1.

    • Base_Infectivity to your desired value.

  2. If you have not already created population groups in the demographics file, create them using the steps in Configure heterogeneity using individual and node properties.

  3. In the demographics file, within the IndividualProperties array, add the TransmissionMatrix parameter and assign it an empty JSON object.

  4. In the object, set the following:

    • Route to the the transmission route (currently “Contact” is the only supported value).

    • Matrix to an array that contains a WAIFW matrix that scales the base infectivity set in the configuration file. This matrix is described in more detail below.

Transmission matrix

The matrix is \(n \times n\) sized, where \(n\) is the number of groups defined in IndividualProperties. Each value in the matrix contains the \(\beta\) value by which to scale the base infectivity, \(\beta_0\), for the simulation. Rows represent from whom the disease is transmitted and columns represent to whom the disease is transmitted, in terms of the group the individual belongs to.

For example, the following demographics file configures HINT for transmission between individuals in high-risk and low-risk groups.

{
    "IndividualProperties": [{
        "Property": "Risk",
        "Values": ["High", "Low"],
        "TransmissionMatrix": {
            "Route": "Contact",
            "Matrix": [
                [10, 0.1],
                [0.1, 1]
            ]
        }
    }]
}

Based on the order the property values are listed, the high-risk group is represented in the first column and first row; the low-risk group is represented in the second column and second row. The following matrix represents the direction of the disease transmission between the groups:

\[\begin{split}WAIFW = \begin{pmatrix} \text{High Risk} \rightarrow \text{High Risk} & \text{High Risk} \rightarrow \text{Low Risk}\\ \text{Low Risk} \rightarrow \text{High Risk} & \text{Low Risk} \rightarrow \text{Low Risk}\\ \end{pmatrix}\end{split}\]
Multiple properties

When a simulation has more than one Property, an individual will belong to one group in each Property type.

The \(\beta\) values for the different groups that an individual belongs to are multiplied together to create the transmission constant. In the following example, an individual who is high risk and suburban will have the following transmission multiplier when interacting with an individual who is a low risk and suburban: \(0.1 \times 1.4 = 0.14\).

{
    "IndividualProperties": [{
        "Property": "Risk",
        "Values": ["High", "Low"],
        "Initial_Distribution": [0.2, 0.8],
        "Transitions": [],
        "TransmissionMatrix": {
            "Route": "Contact",
            "Matrix": [
                [10, 0.1],
                [0.1, 1]
            ]
        }
    }, {
        "Property": "Place",
        "Values": ["Urban", "Suburban", "Rural"],
        "Initial_Distribution": [0.55, 0.35, 0.1],
        "Transitions": [],
        "TransmissionMatrix": {
            "Route": "Contact",
            "Matrix": [
                [2.5, 1.0, 0.1],
                [1.0, 1.4, 0.2],
                [0.2, 0.4, 0.8]
            ]

        }
    }]
}
Heterogeneity and transmission scaling
Author

Daniel J. Klein, Senior Research Scientist, IDM

Overview

Models of disease transmission often assume a homogeneous pattern of mixing between individuals that stems from a mechanism in which the population is sufficiently “well-mixed” to make each individual equally likely to next encounter each other individual. Along with this mixing assumption, simple models additionally suppose that susceptibility and infectivity are homogeneous across the population. These assumptions enable elegant mathematical calculations to be performed, including those for the base reproductive rate, \(R_0\), and endemic equilibrium. Homogeneous mixing also greatly simplifies implementation in the sense the only a single transmission constant, \(\beta\), is required to describe the transmission rate per person.

However, assumptions of homogeneity quickly become invalid when considering the complexities of disease transmission. Spatial effects, even at relatively small scales, can invalidate the well- mixed assumption, particularly if the disease is highly infectious or the population density is high. Non-uniform patterns of mixing based on age are well-documented in school-based disease transmission 1. Susceptibility and infectivity are inherently heterogeneous, as governed by both behavioral and biological factors including hand washing, viral load, and immunity. Many of these factors can be targeted by interventions that potentially have non-uniform uptake, for example due to differences in accessibility.

These sources of heterogeneity are abundant in almost every infectious disease. The “right” level of heterogeneity to include in a model depends on the question being asked, but rarely is a purely homogeneous model sufficient. The Epidemiological MODeling software (EMOD) has long-supported heterogeneity in the form of “nodes.” Each node represents a small geographical area that can have customized parameters. Individuals migrate between nodes either temporarily or permanently using mobility patterns driven by local, regional, and long-distance transportation. While nodes have long provided the capability to model large-scale spatial heterogeneities, disease transmission within each node was homogeneously governed by a single transmission parameter, Base_Infectivity, which determined \(\beta\).

Heterogeneous Intra-Node Transmission (HINT)

EMOD implements the Heterogeneous Intra-Node Transmission (HINT) feature that enables the modeler to include disease transmission heterogeneities within each node. Intra-node heterogeneity is driven by “individuals properties,” each of which has an associated discrete set of “values.” Examples of individual properties, with typical values given parenthetically, include risk group (low, medium, high), age group (under 5, 5 to 15, over 15), vaccine accessibility class (easy, hard), intra-node locale (census tracts), and place (home, school, work, community, non-school). All nodes in a simulation must have the same individual properties and values, but the characteristics of the heterogeneity can vary from node to node.

Associated with each individual property is a values-by-values-sized matrix of multipliers, denoted \(\beta\), that scale base infectivity, \(\beta_0\). Specifically, the entry of the multiplier matrix at row \(i\) and column \(j\) determines the transmission constant from infected individuals having the \(i^{th}\) value to susceptible individuals having the \(j^{th}\) value.

Two individual properties can be combined to achieve a higher level of transmission heterogeneity. When multiple individual properties are configured, their effects are combined independently via multiplication of the appropriate multipliers. For example if the individual properties are age group (young and old) and vaccine accessibility (easy and hard),

\[\begin{split}\beta^{\text{age}} = \begin{bmatrix}1.5 & 0.9 \\ 0.8 & 1.0\end{bmatrix} \text{and } \beta^{\text{accessibility}} = \begin{bmatrix}1.0 & 0.4 \\ 0.3 & 5.0\end{bmatrix},\end{split}\]

the transmission multiplier from an infected individual who is a young and hard to access to a susceptible individual who is old and easy to access will be \(0.9 \times 0.3 = 0.27\). Similarly, the multiplier from an infected young vaccine refuser to a susceptible young vaccine refuser will be \(1.5 \times 5.0 = 7.5\). While most multiplier matrices are symmetric, asymmetries as in the above example can arise for several reasons including heterogeneity in susceptibility.

The product of the base infectivity, \(\beta_0\), and the multiplier matrix, \(\beta\), governs “who acquires infection from whom,” and thus is sometimes called the WAIFW matrix. The values in this matrix can be thought of as the “effective contact rate,” where an effective contact is defined as one that will result in disease transmission were it between a susceptible and infected individual 2.

Disease dynamics

EMOD is an exceptionally powerful software tool. Even in “generic” mode, EMOD is capable of simulating spatially diverse Susceptible-Exposed-Infected-Recovered (SEIR model) and SEIRS dynamics, including options for non-exponential incubation and infectious periods, inter-node migration, and density- or frequency-dependent transmission.

Single homogeneous node

The mathematical fundamentals underlying generic disease dynamics are most vividly illustrated in a single well-mixed community. In EMOD, this scenario corresponds to a single node without HINT. To simplify presentation of the mathematical principles, we focus on the well-known SIR model dynamics with exponentially distributed waiting times between state transitions.

In mathematical biology, disease dynamics are often presented in terms of the proportion of the initial population in susceptible, infected, or recovered states (SIR). Because EMOD represents individuals, and to be clear about mechanisms by which the transmission rate varies as a function of the node population, we instead present the dynamics in terms of the number of individuals \((X, Y, Z)\) in place of \((S, I, R)\), respectively.

The governing dynamics can be written as an ordinary differential equation (ODE) with fixed birthrate \(v\), death rate \({\mu}\), and recovery rate \({\gamma}\).

\[\begin{split}\frac{dX}{dt} &= vN - \frac{\beta_0}{N}XY - \mu{X} \\ \frac{dY}{dt} &= \frac{\beta_0}{N}XY - \gamma{Y} - \mu{Y} \\ \frac{dZ}{dt} &= \gamma{Y} - \mu{Z}\end{split}\]

Here \(N = X + Y + Z\) is the total number of individuals.

The ODE dynamics in (2) are deterministic and continuous. In a finite population of individuals, there is no way to precisely replicate these dynamics, and it is not clear that one would want to in practice because disease transmission is an inherently stochastic process that unfolds in a population of finite size.

In EMOD, the state changes at fixed time steps. The size of the time step, denoted \(\delta\), is selected to be small compared to the characteristic timescale of the disease dynamics. Each update step consists of three primary sub-steps:

  1. Shed: The default behavior in a homogeneous generic simulation is for each infected individual to shed contagion at a fixed rate. The total rate of contagion shedding from all infected individuals is called the force of infection, \(\lambda = \frac{\beta}{N}Y\).

  2. Expose: Each susceptible individual becomes infected with probability \(p_1 = \text{exp}(\lambda\delta)\), where \(\lambda\) is the time step.

  3. Finalize: The final part of each time step contains recovery from infection and disease mortality for infected individuals, along with basic demographic updates. EMOD supports advanced demographics, but here we use the per-capita birth and death rates as in (2).

    1. Recovery: Each infected individual recovers in one time step with probability, \(p_r = 1 - \text{exp}(-\gamma\delta)\).

    2. Birth: For birthrate \(v\), the number of new susceptible individuals will be Poisson distributed with rate \(vN\delta\).

    3. Natural Death: The probability of death for each individual is \(p_d = 1 - \text{exp}(-\mu\delta)\).

Putting these pieces together over the course of a time step, let:

\[\begin{split}\Delta{N_i} & \sim \text{Binomial}(X,p_i) \qquad [\text{Infection}] \\ \Delta{N_r} & \sim \text{Binomial}(Y,p_r) \qquad [\text{Recovery}] \\ \Delta{N_b} & \sim \text{Binomial}(vN\delta) \qquad [\text{Birth}] \\ \Delta{N_{X,d}} & \sim \text{Binomial}(X,p_d) \qquad [\text{Death of susceptibles}] \\ \Delta{N_{Y,d}} & \sim \text{Binomial}(Y,p_d) \qquad [\text{Death of infected}] \\ \Delta{N_{Z,d}} & \sim \text{Binomial}(Z,p_d) \qquad [\text{Death of recovered}]\end{split}\]

With these numbers in mind and assuming that only one state transition event happens to each individual in a time step:

\[\begin{split}X(t + \delta) &= X(t) - \Delta{N_i} + \Delta{N_b} - \Delta{N_{X,d}} \\ Y(t + \delta) &= Y(t) - \Delta{N_i} + \Delta{N_r} - \Delta{N_{Y,d}} \\ Z(t + \delta) &= Z(t) - \Delta{N_r} - \Delta{N_{Z,d}} \\ t &= t + \delta\end{split}\]
HINT node with one individual property

HINT feature adds the ability to simulate heterogeneity within each EMOD node. It is enabled through individual properties defined in the demographics file. The disease dynamics parallel the homogeneous case. To begin, consider a single node with one individual property having \(V\) values. The \(X\), \(Y\), and \(Z\) disease states will gain an \(n\) subscript to index into the individual property values. Using the user-provided multiplier matrix of size \(V \times V\), the ODE-form of the disease dynamics are:

\[\begin{split}\frac{dX_v}{dt} &= vN - \sum^{V}_{k=1}\frac{\beta_0\beta_{k,v}}{N}X_v Y_k - \mu{X_v} \\ \frac{dY_v}{dt} &= \sum^V_{k=1}\frac{\beta_0\beta_{k,v}}{N}X_vY_k - \gamma{Y_v} - \mu{Y_v} \\ \frac{dZ_v}{dt} &= \gamma{Y_v} - \mu{Z_v}\end{split}\]

For \(v \in [1...V]\). From this ODE, conversion to an individual-based implementation follows the methods for a homogeneous node presented above.

At simulation initialization, individuals are assigned stochastically to values of the individual property according to the distribution specified in the demographics file. Note also that intra-node transmission heterogeneities can be transmission-route specific.

HINT node with multiple individual properties

Multiple individual properties can be easily configured in the EMOD demographics file. When enabled, the heterogeneity induced by separate individual properties act independently. As an example, consider two individual properties, \(p_1\) and \(p_2\), having \(V_1\) and \(V_2\) values, respectively. The multiplier matrices will be denoted \(\beta^{p_1}\) and \(\beta^{p_2}\), and have sizes \(V_1 \times V_1\) and \(V_2 \times V_2\), respectively. The resulting disease dynamics in ODE-form are:

\[ \begin{align}\begin{aligned}\begin{split}\frac{dX_{v_1,v_2}}{dt} &= vN - \sum^{v_1}_{k_1=1} \sum^{v_2}_{k_2=1}\frac{\beta_0\beta^{p_1}_{k_1,v_1}\beta^{p_2}_{k_2,k_2}}{N}X_{v_1,v_2}Y_{k_1,k_2} - \mu{X_{v_1,v_2}} \\\end{split}\\\begin{split}\frac{dX_{v_1,v_2}}{dt} &= vN - \sum^{v_1}_{k_1=1} \sum^{v_2}_{k_2=1}\frac{\beta_0\beta^{p_1}_{k_1,v_1}\beta^{p_2}_{k_2,k_2}}{N}X_{v_1,v_2}Y_{k_1,k_2} - \gamma{Y_{v_1,v_2}} - \mu{Y_{v_1,v_2}} \\\end{split}\\\frac{dZ_{v_1,v_2}}{dt} &= \gamma{Y_{v_1,v_2}} - \mu{Z_{v_1,v_2}}\end{aligned}\end{align} \]

For indices \((V_1,V_2) \in [1...V_1]\times[V_1...V_2]\).

When configured for multiple individual properties, EMOD assigns individual property values to individuals independently based on the separate probability distributions provided by the user in the demographics file.

Transmission scaling

Disease transmission depends on the rate effective contacts as represented by parameter \(\beta_0\). But what happens to the effective contact rate as the size of the population changes? There are two commonly accepted answers: frequency-dependent and density-dependent transmission scaling.

Frequency versus density-dependent transmission scaling

The two common forms of transmission scaling with population (more precisely, population density) are:

Frequency dependence, true mass action

The number of effective contacts per person per unit time is independent of the population size. A single infected person in a node with a large population will infect just as many people as they would in a node with a small population. One way to think about this is that the population density is fixed, so that the node with the large population is spread over a large area. For this case,

\[\text{Transmission} \propto \frac{\text{Number of effective contacts per unit time}}{\text{Current size of the node population}},\]

so that the transmission rate inversely proportional to \(N(t)\). The dynamics described above, starting from (2), are frequency-dependent because the \(\beta_0\) parameter is divided by the current node population, \(N(t)\).

Density dependence, pseudo mass action

The number of effective contacts per person per time is proportional to the population. Think of a room containing \(N\) individuals. A single highly-infectious cough would infect more people if the number of people in the room (population density) was higher. For this case,

\[\text{Transmission} \propto \frac{\text{Number of effective contacts per unit time}}{\text{Fixed population size}},\]

Usually, the denominator is taken as \(N(t=0)\), the initial node population. Note that the transmission rate per capita is a constant in this case. Density-dependent transmission is often found in SIR models which inherently neglect the total population size.

Transmission scaling in EMOD

EMOD supports flexibility in transmission scaling above and beyond pure frequency- or density-dependent scaling. The default configuration employs frequency-dependent scaling, the most commonly- used form of scaling in computational epidemiology. For version 1.6, EMOD allows the transmission rate to scale as a saturating function of population (density) 3, even when HINT is enabled. The force of infection contributed by each infected individual under these two cases of transmission scaling are as follows:

\[\begin{split}\text{Force per infected} = \left\{ \begin{array}{ll} \frac{\beta_0}{N} & \text{Frequency dependence} \\ \left[1 - \exp\left(- \frac{\rho}{\rho_{50}}\right)\right] \frac{\beta_0}{N} & \text{Saturating function of density} \end{array} \right.\end{split}\]

Here, \(r\) is the population density and \(r_{50}\) is an input parameter the governs the transition from density to frequency dependence. The population density is computed as \(\rho = \frac{N}{A}\) where \(A\) is is the area of the node. This node area is in turn computed from the longitude and latitude of the node center point (from the demographics file) and the node size. It is assumed that all nodes have equal size in terms of the degrees of latitude and longitude, as determined by configuration parameter Node_Grid_Size. Denoting this node grid size by \(w\), the area of a node located at (lat, lon) is computed based on the corresponding area of a sphere,

\[A = R^2\Big\lbrace\Big[\text{cos}\Big(\Big(90-\text{lat}-\frac{w}{2}\Big)\frac{\pi}{180}\Big)- \text{cos}\Big(\Big(90-\text{lat}+\frac{w}{2}\Big)\frac{\pi}{180}\Big)\Big]\frac{w\pi}{180}\Big\rbrace,\]

where \(R=6371.2213\) km is the radius of Earth.

The saturating function of density is enabled by setting the following EMOD configuration parameter: Population_Density_Infectivity_Correction: SATURATING_FUNCTION_OF_DENSITY

Finally, the \(r_{50}\) parameter is configured using an EMOD configuration parameter Population_Density_C50.

Contact scaling

HINT and transmission scaling allow the EMOD user to specify and control heterogeneity within EMOD. One potential application for these features is in configuring “contact scaling,’’ a particular form of heterogeneous mixing in which shedding and acquisition are symmetric. The best example of contact scaling is location-based mixing, which can be used in place of intra-day migration. Typical places for location-based mixing include home, school, and work. Contact scaling could also be used for mixing between age groups.

Contact scaling is typically specified by a matrix, \(\rho=\frac{N}{A}\). The entry at \(c_{ij}\) indicates that an individual with value \(i\) sheds and acquires from mixing pool \(j\) with weight \(c_{ij}\). Each row of the contact scaling matrix typically sums to one, especially for location-based mixing wherein \(c_{ij}\) can be used to represent the fraction of the day an individual with value \(i\) spends at location \(j\).

In terms of implementation, there is one main difference between contact scaling and transmission scaling. In contact scaling, individuals both shed into and acquire from pools of contagion according to the corresponding row of the \(C\) matrix. Normalization is done not by \(N\), as in frequency scaling, but instead by the “effective population” of each mixing pool, which is computed as the \(C\)-weighted sum of the population-by-value. Transmission scaling via the \(\beta\) matrix directly specifies the transmission rate per susceptible between each group of individuals, so there is no concept of place but the overall approach is more flexible, e.g. by allowing asymmetries.

Interestingly, contact scaling exhibits neither frequency-dependent nor density-dependent scaling, although it more closely resembles frequency-dependent transmission because the denominator is a function of the current population. Currently, contact scaling is not supported as an independent feature in the EMOD software, however one can simulate contact scaling to good approximation if the fraction of the population in each value \(n_i = \frac{N_i(t)}{N(t)}\) is constant or stabilizes quickly. Then EMOD can be configured using,

\[\beta = C[\text{diag}(C^Tn)]^{-1}C^T\]

Here, \(n\) is a \(V\)-length column vector of the equilibrium fractions of the population by value. Absent mortality factors or interventions moving individuals from one value to the next, \(n\) should be close to the probability distribution used to assign values to individuals.

Conclusion

EMOD is a powerful software tool for simulating generic disease dynamics. Amongst the many improvements offered by version 1.6 are the new capabilities described mathematically in this document: HINT and transmission scaling with population density. These improvements add to the long list of EMOD features that make it the most powerful disease simulation framework available today.

1
  1. Mossong, N. Hens, M. Jit, P. Beutels, K. Auranen, R. Mikolajczyk, M. Massari, S. Salmaso, G. S. Tomba, J. Wallinga, et al. Social contacts and mixing patterns relevant to the spread of infectious diseases. PLos medicine, 5(3):e74, 2008.

2

M.J. Keeling and P. Rohani. Modeling infectious diseases in humans and animals. Princeton University Press, 2008.

3
  1. Hu, K. Nigmatulina, and P. Eckhoff. The scaling of contact rates with population density for the infectious disease models. Mathematical biosciences, 2013.

Create a configuration file

You define the general configuration and processing of a simulation through a JSON-formatted configuration file, typically called config.json. Two forms of the simulation configuration file are used: a flattened version and a hierarchical version. This topic describes how to create a configuration file of other form. The EMOD executable (Eradication.exe) and Eradication binary requires a flattened version of the simulation configuration file. The hierarchical version allows you to organize parameters into logical groups, making them easier to manage. If you use hierarchical configuration files, you must flatten them prior to running a simulation.

The EMOD Regression directory contains many different subdirectories that contain configuration, campaign, and other associated files to run simulations that represent real-world scenarios. Within the each subdirectory, there is usually a hierarchical overlay file (param_overrides.json) and a flattened file (config.json), which has been created by combining param_overrides.json with one of the default files in Regression/defaults. The default files are also organized hierarchically. The naming of these files is an arbitrary convention used at IDM; you may name this files anything you choose. See Use configuration overlay files for more information about flattening hierarchical files.

For a complete list of configuration parameters that are available to use with this simulation type, see Configuration parameters. For more information about JSON, see EMOD parameter reference.

Flattened configuration file

A flattened configuration file is generally a single-depth JSON file with configuration parameters listed alphabetically. This is the configuration file format that Eradication.exe requires for running simulations.

Below is an example of a flattened configuration file:

{
    "parameters": {
        "Acquisition_Blocking_Immunity_Decay_Rate": 0.1,
        "Acquisition_Blocking_Immunity_Duration_Before_Decay": 60,
        "Age_Initialization_Distribution_Type": "DISTRIBUTION_SIMPLE",
        "Animal_Reservoir_Type": "NO_ZOONOSIS",
        "Base_Incubation_Period": 0,
        "Base_Individual_Sample_Rate": 1,
        "Base_Infectious_Period": 4,
        "Base_Infectivity": 3.5,
        "Base_Mortality": 0,
        "Base_Population_Scale_Factor": 1,
        "Birth_Rate_Dependence": "POPULATION_DEP_RATE",
        "Birth_Rate_Time_Dependence": "NONE",
        "Burnin_Cache_Mode": "none",
        "Burnin_Cache_Period": 0,
        "Burnin_Name": "",
        "Campaign_Filename": "campaign.json",
        "Climate_Model": "CLIMATE_OFF",
        "Config_Name": "00_DEFAULT",
        "Custom_Reports_Filename": "NoCustomReports",
        "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF",
        "Default_Geography_Initial_Node_Population": 1000,
        "Default_Geography_Torus_Size": 10,
        "Demographics_Filenames": [
            "../00_Default/demographics.json"
        ],
        "Enable_Absolute_Time": "NO",
        "Enable_Aging": 1,
        "Enable_Birth": 1,
        "Enable_Default_Reporting": 1,
        "Enable_Default_Shedding_Function": 1,
        "Enable_Demographics_Birth": 0,
        "Enable_Demographics_Builtin": 0,
        "Enable_Demographics_Gender": 1,
        "Enable_Demographics_Other": 0,
        "Enable_Demographics_Reporting": 1,
        "Enable_Disease_Mortality": 0,
        "Enable_Heterogeneous_Intranode_Transmission": 0,
        "Enable_Immune_Decay": 0,
        "Enable_Immunity": 1,
        "Enable_Interventions": 1,
        "Enable_Maternal_Infection_Transmission": 0,
        "Enable_Property_Output": 0,
        "Enable_Spatial_Output": 0,
        "Enable_Superinfection": 0,
        "Enable_Vital_Dynamics": 0,
        "Geography": "",
        "Immunity_Acquisition_Factor": 0,
        "Immunity_Initialization_Distribution_Type": "DISTRIBUTION_OFF",
        "Immunity_Mortality_Factor": 0,
        "Immunity_Transmission_Factor": 0,
        "Incubation_Period_Distribution": "FIXED_DURATION",
        "Individual_Sampling_Type": "TRACK_ALL",
        "Infection_Updates_Per_Timestep": 1,
        "Infectious_Period_Distribution": "EXPONENTIAL_DURATION",
        "Infectivity_Scale_Type": "CONSTANT_INFECTIVITY",
        "Job_Node_Groups": "Chassis08",
        "Job_Priority": "BELOWNORMAL",
        "Listed_Events": [],
        "Load_Balance_Filename": "",
        "Local_Simulation": 0,
        "Maternal_Transmission_Probability": 0,
        "Max_Individual_Infections": 1,
        "Max_Node_Population_Samples": 40,
        "Migration_Model": "NO_MIGRATION",
        "Minimum_Adult_Age_Years": 15,
        "Mortality_Blocking_Immunity_Decay_Rate": 0.001,
        "Mortality_Blocking_Immunity_Duration_Before_Decay": 60,
        "Mortality_Time_Course": "DAILY_MORTALITY",
        "Node_Grid_Size": 0.042,
        "Num_Cores": 1,
        "Number_Basestrains": 1,
        "Number_Substrains": 1,
        "PKPD_Model": "FIXED_DURATION_CONSTANT_EFFECT",
        "Population_Density_C50": 30,
        "Population_Density_Infectivity_Correction": "CONSTANT_INFECTIVITY",
        "Population_Scale_Type": "USE_INPUT_FILE",
        "Report_Event_Recorder": 0,
        "Run_Number": 1,
        "Sample_Rate_0_18mo": 1,
        "Sample_Rate_10_14": 1,
        "Sample_Rate_15_19": 1,
        "Sample_Rate_18mo_4yr": 1,
        "Sample_Rate_20_Plus": 1,
        "Sample_Rate_5_9": 1,
        "Sample_Rate_Birth": 1,
        "Serialization_Test_Cycles": 0,
        "Simulation_Duration": 90,
        "Simulation_Timestep": 1,
        "Simulation_Type": "GENERIC_SIM",
        "Start_Time": 0,
        "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY",
        "Transmission_Blocking_Immunity_Decay_Rate": 0.1,
        "Transmission_Blocking_Immunity_Duration_Before_Decay": 60,
        "x_Air_Migration": 1,
        "x_Birth": 1,
        "x_Local_Migration": 1,
        "x_Other_Mortality": 1,
        "x_Population_Immunity": 1,
        "x_Regional_Migration": 1,
        "x_Sea_Migration": 1,
        "x_Temporary_Larval_Habitat": 1
    }
}
Hierarchical configuration file

The hierarchical version of a configuration file has a more complex structure. As a way of sorting parameters into logical groups, the parameters can be contained inside nested JSON objects. The names you use to create these logical categories are unimportant; the scripts used to flatten the files will search through the hierarchies and retain only the “leaf” values in the resulting flattened file. See Use configuration overlay files for more information on flattening files.

Below is an example of a hierarchical configuration file:

{
    "parameters": {
        "CAMPAIGNS": {
            "Campaign_Filename": "campaign.json",
            "Enable_Interventions": 1,
            "Listed_Events": [],
            "PKPD_Model": "FIXED_DURATION_CONSTANT_EFFECT"
        },
        "CLIMATE": {
            "Climate_Model": "CLIMATE_OFF"
        },
        "DEMOGRAPHICS": {
            "Age_Initialization_Distribution_Type": "DISTRIBUTION_SIMPLE",
            "Base_Population_Scale_Factor": 1,
            "Birth_Rate_Dependence": "DEMOGRAPHIC_DEP_RATE",
            "Birth_Rate_Time_Dependence": "NONE",
            "Demographics_Filenames": ["NO_DEFAULT_DEMOGRAPHICS"],
            "Default_Geography_Initial_Node_Population": 1000,
            "Default_Geography_Torus_Size": 10,
            "Enable_Aging": 1,
            "Enable_Birth": 1,
            "Enable_Demographics_Birth": 0,
            "Enable_Demographics_Gender": 1,
            "Enable_Demographics_Builtin": 0,
            "Enable_Demographics_Other": 0,
            "Enable_Demographics_Reporting": 0,
            "Enable_Vital_Dynamics": 1,
            "Minimum_Adult_Age_Years": 15,
            "IMMUNITY": {
                "Acquisition_Blocking_Immunity_Decay_Rate": 0.1,
                "Acquisition_Blocking_Immunity_Duration_Before_Decay": 60,
                "Enable_Immune_Decay": 1,
                "Enable_Immunity": 1,
                "Immunity_Acquisition_Factor": 0,
                "Immunity_Transmission_Factor": 0,
                "Immunity_Initialization_Distribution_Type": "DISTRIBUTION_OFF",
                "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY",
                "Transmission_Blocking_Immunity_Decay_Rate": 0.1,
                "Transmission_Blocking_Immunity_Duration_Before_Decay": 60
            },
            "MORTALITY": {
                "Base_Mortality": 0,
                "Enable_Disease_Mortality": 0,
                "Death_Rate_Dependence": "NONDISEASE_MORTALITY_BY_AGE_AND_GENDER",
                "Immunity_Mortality_Factor": 0,
                "Mortality_Blocking_Immunity_Decay_Rate": 0.001,
                "Mortality_Blocking_Immunity_Duration_Before_Decay": 60,
                "Mortality_Time_Course": "DAILY_MORTALITY"
            },
            "Population_Density_C50": 30,
            "Population_Scale_Type": "USE_INPUT_FILE",
            "SAMPLING": {
                "Base_Individual_Sample_Rate": 1,
                "Individual_Sampling_Type": "TRACK_ALL",
                "Max_Node_Population_Samples": 40,
                "Sample_Rate_0_18mo": 1,
                "Sample_Rate_10_14": 1,
                "Sample_Rate_15_19": 1,
                "Sample_Rate_18mo_4yr": 1,
                "Sample_Rate_20_Plus": 1,
                "Sample_Rate_5_9": 1,
                "Sample_Rate_Birth": 2
            }
        },
        "DISEASE": {
            "Animal_Reservoir_Type": "NO_ZOONOSIS",
            "Enable_Superinfection": 0,
            "INCUBATION": {
                "Base_Incubation_Period": 3,
                "Incubation_Period_Distribution": "FIXED_DURATION"
            },
            "INFECTIOUSNESS": {
                "Base_Infectious_Period": 7,
                "Base_Infectivity": 0.3,
                "Infectious_Period_Distribution": "EXPONENTIAL_DURATION",
                "Infectivity_Scale_Type": "CONSTANT_INFECTIVITY",
                "Population_Density_Infectivity_Correction": "CONSTANT_INFECTIVITY"
            },
            "Infection_Updates_Per_Timestep": 1,
            "Max_Individual_Infections": 1,
            "TRANSMISSION": {
                "Enable_Maternal_Infection_Transmission": 0,
                "Maternal_Transmission_Probability": 0
            }
        },
        "FUDGE_FACTORS": {
            "x_Air_Migration": 1,
            "x_Birth": 1,
            "x_Local_Migration": 1,
            "x_Other_Mortality": 1,
            "x_Population_Immunity": 1,
            "x_Regional_Migration": 1,
            "x_Sea_Migration": 1,
            "x_Temporary_Larval_Habitat": 1
        },
        "HPC": {
            "Job_Node_Groups": "Chassis08",
            "Job_Priority": "BELOWNORMAL",
            "Load_Balance_Filename": "",
            "Local_Simulation": 0,
            "Num_Cores": 1
        },
        "INTRANODE_TRANSMISSION": {
            "Enable_Default_Shedding_Function": 1,
            "Enable_Heterogeneous_Intranode_Transmission": 0
        },
        "MIGRATION": {
            "Migration_Model": "NO_MIGRATION"
        },
        "OUTPUT": {
            "Custom_Reports_Filename": "NoCustomReports",
            "Report_Event_Recorder": 0,
            "Enable_Default_Reporting": 1,
            "Enable_Property_Output": 0,
            "Enable_Spatial_Output": 0
        },
        "POLIO": {},
        "PRIMARY": {
            "Config_Name": "DEFAULT_CONFIG_NAME_SHOULD_BE_SET",
            "ENUMS": {
                "Simulation_Type": "GENERIC_SIM"
            },
            "Geography": "DEFAULT_GEOGRAPHY_SHOULD_BE_SET",
            "Node_Grid_Size": 0.042,
            "Run_Number": 0,
            "Simulation_Duration": 365,
            "Simulation_Timestep": 1,
            "Start_Time": 0,
            "Enable_Absolute_Time": "NO"

        },
        "SERIALIZATION": {
            "Burnin_Cache_Mode": "none",
            "Burnin_Cache_Period": 0,
            "Burnin_Name": "",
            "Serialization_Test_Cycles": 0
        },
        "STRAIN_TRACKING": {
            "Number_Basestrains": 1,
            "Number_Substrains": 1
        }
    }
}
Create or modify configuration files

Although you can create configuration files entirely from scratch, it is often easier to start from an existing configuration file and modify it to meet your needs. Any of the configuration files in the Regression directory may be used; in particular the Regression/defaults directory contains hierarchical configuration files with the common parameter settings used with different simulation types.

The simplest method is to use a text editor to directly edit the parameters or parameter values in the JSON file. However, while direct editing of files may be sufficient for small and infrequent changes, you will likely find that scripting tools are more powerful and reliable for both creating and modifying files.

The following example shows how to read a configuration file to a Python dictionary, modify a parameter, and write it back out to the file:

import json

# load the current config.json
config_file = open( "config.json" )
config_json = json.load( config_file )
config_file.close()

# modify one of the parameter values, e.g. "base_infectivity"
config_json["parameters"]["base_infectivity"] = 0.5

# write the modified config file
modified_file = open( "modified_config.json", "w" )
json.dump( config_json, modified_file, sort_keys=True, indent=4 )
modified_file.close()

The following example shows how to modify a configuration file in MATLAB:

addpath Matlab
addpath Matlab\test

% load the simulation configuration file into MATLAB structure
configjson = loadJson( "config.json" );

% modify one of the values
configjson.parameters.Base_Infectivity = 08.5;

% save the new configuration to file
saveJson( "modified_config.json", configjson );
Generate a list of all available parameters (a schema)

You can generate a schema from the EMOD executable (Eradication.exe) or Eradication binary that defines all configuration parameters and campaign parameters available in the version of EMOD that is installed, for all available simulation types. This includes parameter names, data types, defaults, ranges, and short descriptions.

Logging information is also produced as part of the schema. If you are using EMOD source and have added or modified configuration parameters or intervention code, this logging information can help you troubleshoot any errors that may occur.

Warning

If you modify the source code to add or remove configuration or campaign parameters, you may need to update the code used to produce the schema. You must also verify that your simulations are still scientifically valid.

Command options

The following command-line options are available for providing information about EMOD.

EMOD information commands

Long form

Short form

Description

--help

-help

Shows help options for Eradication.exe.

--version

-v

Shows the version information and supported simulation types. Note capitalization of short alternative.

--get-schema

--get-schema

Outputs the configuration and campaign parameters. Unless --schema-path or a redirect operator is used, the schema will print to the Command Prompt window.

--schema-path

>

When used with --get-schema, if a TXT or JSON file is specified, the schema information will be written to the file instead of the Command Prompt window.

Usage
  1. Open a Command Prompt window and navigate to the directory where Eradication.exe is installed.

  2. To output the schema to the Command Prompt window, enter:

    Eradication.exe --get-schema
    
  3. To output the schema to a file, do one of the following (replacing <filename> with the desired filename):

    • To output a text file that includes logging information, enter:

      Eradication.exe --get-schema > <filename>.txt
      
    • To display logging in the Command Prompt window and output a text file that does not include logging information, enter:

      Eradication.exe --get-schema --schema-path <filename>.txt
      
    • To output the schema to a JSON file that includes logging information, enter:

      Eradication.exe --get-schema > <filename>.json
      
    • To display logging in the Command Prompt window and output a JSON file that does not include logging information, enter:

      Eradication.exe --get-schema --schema-path <filename>.json
      
Perform a parameter sweep

Parameter sweeps iteratively update the values of parameters to exhaustively search through the parameter space for a simulation. EMOD does not currently support automated parameter sweeps. However, you can write your own code, such as a Python or MATLAB script, that iterates through the values you want for a particular parameter. This topic describes how to perform a parameter sweep.

For example, you can run simulations using a Python script that uses the parameter values specified in a JSON parameter sweep file to iteratively update the configuration or campaign parameter values. The IDM test team performs parameter sweeps as part of regression testing. See the following examples to see how this is implemented.

The following JSON example illustrates sweeping through configuration parameter values.

{
    "sweep" :
    {
        "path": "43_Vector_Garki_MultiCore_VectorMigration",
        "param_name" : "Run_Number",
        "param_values" : [ 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 ]
    }
}

The following Python example illustrates how to update the configuration file with the above values. This is excerpted from the regression_test.py script in the Regression directory.

elif "sweep" in reglistjson:
    print( "Running sweep...\n" )
    param_name = reglistjson["sweep"]["param_name"]

    for param_value in reglistjson["sweep"]["param_values"]:
        os.chdir(ru.cache_cwd)
        sim_timestamp = str(datetime.datetime.now()).replace('-', '_' ).replace( ' ', '_' ).replace( ':', '_' ).replace( '.', '_' )
        if regression_id == None:
            regression_id = sim_timestamp

        configjson = ru.flattenConfig( os.path.join( reglistjson["sweep"]["path"], "param_overrides.json" ) )
        if configjson is None:
            print("Error flattening config.  Skipping " + simcfg["path"])
            ru.final_warnings += "Error flattening config.  Skipped " + simcfg["path"] + "\n"
            continue

        # override sweep parameter
        configjson["parameters"][param_name] = param_value

        campjson_file = open( os.path.join( reglistjson["sweep"]["path"],"campaign.json" ) )
        campjson = json.loads( campjson_file.read().replace( "u'", "'" ).replace( "'", '"' ).strip( '"' ) )
        campjson_file.close()
        configjson["campaign_json"] = str(campjson)

        report_fn = os.path.join( reglistjson["sweep"]["path"],"custom_reports.json" )
        if os.path.exists( report_fn ) == True:
            reportjson_file = open( report_fn )
            reportjson = json.loads( reportjson_file.read().replace( "u'", "'" ).replace( "'", '"' ).strip( '"' ) )
            reportjson_file.close()
            configjson["custom_reports_json"] = str(reportjson)
        else:
            configjson["custom_reports_json"] = None

        thread = runner.commissionFromConfigJson( sim_timestamp, configjson, reglistjson["sweep"]["path"], None, 'sweep' )
        ru.reg_threads.append( thread )
else:
    print "Unknown state"
    sys.exit(0)
Use configuration overlay files

You can use two configuration files when setting up a simulation. One file contains default parameter settings and an overlay file contains additional parameters or different parameter values that override the values in the default file. This topic describes how to set up the default and overlay file and flatten them into a single file before running a simulation.

Overlay files allow you to easily separate a subset of parameters that are of particular interest from the rest of the parameters needed to run a simulation. You can easily modify the parameters in the overlay file without needing to maintain a complete configuration or campaign file. This can be especially helpful when you want to experiment with the values set in certain parameters of interest without modifying the rest of the settings. You can have one default file and many different overlay files for different configurations. It also allows you to easily update the default values across multiple simulations.

In addition to being used for model experimentation, overlay files are used when testing the software functionality after making source code changes. If you run the EMOD regression tests using regression_test.py, configuration files will be flattened as part of those tests. However, this may take several hours if run locally. More guidance on modifying the EMOD source code is in the “Advance the model” section.

Follow the steps below to quickly flatten configuration files.

  1. Create the default configuration file in JSON. You may, though it is not required, organize the parameters into logical categories of nested JSON objects to make managing the parameters easier. See Configuration parameters for a complete list of all parameters that are available. See the example default configuration file below.

    {
        "parameters": {
            "CAMPAIGNS": {
                "Campaign_Filename": "campaign.json",
                "Enable_Interventions": 1,
                "Listed_Events": [],
                "PKPD_Model": "FIXED_DURATION_CONSTANT_EFFECT"
            },
            "CLIMATE": {
                "Climate_Model": "CLIMATE_OFF"
            },
            "DEMOGRAPHICS": {
                "Age_Initialization_Distribution_Type": "DISTRIBUTION_SIMPLE",
                "Base_Population_Scale_Factor": 1,
                "Birth_Rate_Dependence": "DEMOGRAPHIC_DEP_RATE",
                "Birth_Rate_Time_Dependence": "NONE",
                "Demographics_Filenames": ["NO_DEFAULT_DEMOGRAPHICS"],
                "Default_Geography_Initial_Node_Population": 1000,
                "Default_Geography_Torus_Size": 10,
                "Enable_Aging": 1,
                "Enable_Birth": 1,
                "Enable_Demographics_Birth": 0,
                "Enable_Demographics_Gender": 1,
                "Enable_Demographics_Builtin": 0,
                "Enable_Demographics_Other": 0,
                "Enable_Demographics_Reporting": 0,
                "Enable_Vital_Dynamics": 1,
                "Minimum_Adult_Age_Years": 15,
                "IMMUNITY": {
                    "Acquisition_Blocking_Immunity_Decay_Rate": 0.1,
                    "Acquisition_Blocking_Immunity_Duration_Before_Decay": 60,
                    "Enable_Immune_Decay": 1,
                    "Enable_Immunity": 1,
                    "Immunity_Acquisition_Factor": 0,
                    "Immunity_Transmission_Factor": 0,
                    "Immunity_Initialization_Distribution_Type": "DISTRIBUTION_OFF",
                    "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY",
                    "Transmission_Blocking_Immunity_Decay_Rate": 0.1,
                    "Transmission_Blocking_Immunity_Duration_Before_Decay": 60
                },
                "MORTALITY": {
                    "Base_Mortality": 0,
                    "Enable_Disease_Mortality": 0,
                    "Death_Rate_Dependence": "NONDISEASE_MORTALITY_BY_AGE_AND_GENDER",
                    "Immunity_Mortality_Factor": 0,
                    "Mortality_Blocking_Immunity_Decay_Rate": 0.001,
                    "Mortality_Blocking_Immunity_Duration_Before_Decay": 60,
                    "Mortality_Time_Course": "DAILY_MORTALITY"
                },
                "Population_Density_C50": 30,
                "Population_Scale_Type": "USE_INPUT_FILE",
                "SAMPLING": {
                    "Base_Individual_Sample_Rate": 1,
                    "Individual_Sampling_Type": "TRACK_ALL",
                    "Max_Node_Population_Samples": 40,
                    "Sample_Rate_0_18mo": 1,
                    "Sample_Rate_10_14": 1,
                    "Sample_Rate_15_19": 1,
                    "Sample_Rate_18mo_4yr": 1,
                    "Sample_Rate_20_Plus": 1,
                    "Sample_Rate_5_9": 1,
                    "Sample_Rate_Birth": 2
                }
            },
            "DISEASE": {
                "Animal_Reservoir_Type": "NO_ZOONOSIS",
                "Enable_Superinfection": 0,
                "INCUBATION": {
                    "Base_Incubation_Period": 3,
                    "Incubation_Period_Distribution": "FIXED_DURATION"
                },
                "INFECTIOUSNESS": {
                    "Base_Infectious_Period": 7,
                    "Base_Infectivity": 0.3,
                    "Infectious_Period_Distribution": "EXPONENTIAL_DURATION",
                    "Infectivity_Scale_Type": "CONSTANT_INFECTIVITY",
                    "Population_Density_Infectivity_Correction": "CONSTANT_INFECTIVITY"
                },
                "Infection_Updates_Per_Timestep": 1,
                "Max_Individual_Infections": 1,
                "TRANSMISSION": {
                    "Enable_Maternal_Infection_Transmission": 0,
                    "Maternal_Transmission_Probability": 0
                }
            },
            "FUDGE_FACTORS": {
                "x_Air_Migration": 1,
                "x_Birth": 1,
                "x_Local_Migration": 1,
                "x_Other_Mortality": 1,
                "x_Population_Immunity": 1,
                "x_Regional_Migration": 1,
                "x_Sea_Migration": 1,
                "x_Temporary_Larval_Habitat": 1
            },
            "HPC": {
                "Job_Node_Groups": "Chassis08",
                "Job_Priority": "BELOWNORMAL",
                "Load_Balance_Filename": "",
                "Local_Simulation": 0,
                "Num_Cores": 1
            },
            "INTRANODE_TRANSMISSION": {
                "Enable_Default_Shedding_Function": 1,
                "Enable_Heterogeneous_Intranode_Transmission": 0
            },
            "MIGRATION": {
                "Migration_Model": "NO_MIGRATION"
            },
            "OUTPUT": {
                "Custom_Reports_Filename": "NoCustomReports",
                "Report_Event_Recorder": 0,
                "Enable_Default_Reporting": 1,
                "Enable_Property_Output": 0,
                "Enable_Spatial_Output": 0
            },
            "POLIO": {},
            "PRIMARY": {
                "Config_Name": "DEFAULT_CONFIG_NAME_SHOULD_BE_SET",
                "ENUMS": {
                    "Simulation_Type": "GENERIC_SIM"
                },
                "Geography": "DEFAULT_GEOGRAPHY_SHOULD_BE_SET",
                "Node_Grid_Size": 0.042,
                "Run_Number": 0,
                "Simulation_Duration": 365,
                "Simulation_Timestep": 1,
                "Start_Time": 0,
                "Enable_Absolute_Time": "NO"
    
            },
            "SERIALIZATION": {
                "Burnin_Cache_Mode": "none",
                "Burnin_Cache_Period": 0,
                "Burnin_Name": "",
                "Serialization_Test_Cycles": 0
            },
            "STRAIN_TRACKING": {
                "Number_Basestrains": 1,
                "Number_Substrains": 1
            }
        }
    }
    
  2. Create the overlay configuration file in JSON. This file must include the parameter Default_Config_Path, set to the path to the default configuration file, relative to the location of the flatten_config.py script in the EMOD Regression folder. Again, you may organize the parameters into logical categories if you desire. See the example overlay configuration file below.

    {
         "Default_Config_Path": "defaults/generic-default-config.json",
         "parameters": {
              "DEMOGRAPHICS": {
                  "Enable_Demographics_Builtin": 0,
                  "Birth_Rate_Dependence": "POPULATION_DEP_RATE",
                  "Death_Rate_Dependence" : "NONDISEASE_MORTALITY_OFF",
                  "Enable_Vital_Dynamics": 0,
                  "Sample_Rate_Birth": 1,
                  "Enable_Demographics_Reporting": 1
              },
              "DISEASE": {
                  "Base_Incubation_Period": 0,
                  "Base_Infectious_Period": 4,
                  "Base_Infectivity": 3.5,
                  "Enable_Immune_Decay": 0
              },
              "PRIMARY": {
                   "Config_Name": "00_Generic_DEFAULT",
                   "Demographics_Filenames": ["demographics.json"],
                   "Geography": "",
                   "Run_Number": 1,
                   "Simulation_Duration": 90
              }
         }
    }
    
  3. In a Command Prompt window, navigate to the Regression folder.

  4. Run the flatten_config.py script, providing the relative path to the overlay file:

    python flatten_config.py experiment/param_overlay.json
    
  5. Open the resulting config.json file in the same folder as param_overlay.json and see that it has been flattened into a single layer with all parameters listed alphabetically and any logical categories removed. Eradication.exe will not accept a configuration file with nested JSON objects.

    {
        "parameters": {
            "Acquisition_Blocking_Immunity_Decay_Rate": 0.1,
            "Acquisition_Blocking_Immunity_Duration_Before_Decay": 60,
            "Age_Initialization_Distribution_Type": "DISTRIBUTION_SIMPLE",
            "Animal_Reservoir_Type": "NO_ZOONOSIS",
            "Base_Incubation_Period": 0,
            "Base_Individual_Sample_Rate": 1,
            "Base_Infectious_Period": 4,
            "Base_Infectivity": 3.5,
            "Base_Mortality": 0,
            "Base_Population_Scale_Factor": 1,
            "Birth_Rate_Dependence": "POPULATION_DEP_RATE",
            "Birth_Rate_Time_Dependence": "NONE",
            "Burnin_Cache_Mode": "none",
            "Burnin_Cache_Period": 0,
            "Burnin_Name": "",
            "Campaign_Filename": "campaign.json",
            "Climate_Model": "CLIMATE_OFF",
            "Config_Name": "00_DEFAULT",
            "Custom_Reports_Filename": "NoCustomReports",
            "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF",
            "Default_Geography_Initial_Node_Population": 1000,
            "Default_Geography_Torus_Size": 10,
            "Demographics_Filenames": [
                "../00_Default/demographics.json"
            ],
            "Enable_Absolute_Time": "NO",
            "Enable_Aging": 1,
            "Enable_Birth": 1,
            "Enable_Default_Reporting": 1,
            "Enable_Default_Shedding_Function": 1,
            "Enable_Demographics_Birth": 0,
            "Enable_Demographics_Builtin": 0,
            "Enable_Demographics_Gender": 1,
            "Enable_Demographics_Other": 0,
            "Enable_Demographics_Reporting": 1,
            "Enable_Disease_Mortality": 0,
            "Enable_Heterogeneous_Intranode_Transmission": 0,
            "Enable_Immune_Decay": 0,
            "Enable_Immunity": 1,
            "Enable_Interventions": 1,
            "Enable_Maternal_Infection_Transmission": 0,
            "Enable_Property_Output": 0,
            "Enable_Spatial_Output": 0,
            "Enable_Superinfection": 0,
            "Enable_Vital_Dynamics": 0,
            "Geography": "",
            "Immunity_Acquisition_Factor": 0,
            "Immunity_Initialization_Distribution_Type": "DISTRIBUTION_OFF",
            "Immunity_Mortality_Factor": 0,
            "Immunity_Transmission_Factor": 0,
            "Incubation_Period_Distribution": "FIXED_DURATION",
            "Individual_Sampling_Type": "TRACK_ALL",
            "Infection_Updates_Per_Timestep": 1,
            "Infectious_Period_Distribution": "EXPONENTIAL_DURATION",
            "Infectivity_Scale_Type": "CONSTANT_INFECTIVITY",
            "Job_Node_Groups": "Chassis08",
            "Job_Priority": "BELOWNORMAL",
            "Listed_Events": [],
            "Load_Balance_Filename": "",
            "Local_Simulation": 0,
            "Maternal_Transmission_Probability": 0,
            "Max_Individual_Infections": 1,
            "Max_Node_Population_Samples": 40,
            "Migration_Model": "NO_MIGRATION",
            "Minimum_Adult_Age_Years": 15,
            "Mortality_Blocking_Immunity_Decay_Rate": 0.001,
            "Mortality_Blocking_Immunity_Duration_Before_Decay": 60,
            "Mortality_Time_Course": "DAILY_MORTALITY",
            "Node_Grid_Size": 0.042,
            "Num_Cores": 1,
            "Number_Basestrains": 1,
            "Number_Substrains": 1,
            "PKPD_Model": "FIXED_DURATION_CONSTANT_EFFECT",
            "Population_Density_C50": 30,
            "Population_Density_Infectivity_Correction": "CONSTANT_INFECTIVITY",
            "Population_Scale_Type": "USE_INPUT_FILE",
            "Report_Event_Recorder": 0,
            "Run_Number": 1,
            "Sample_Rate_0_18mo": 1,
            "Sample_Rate_10_14": 1,
            "Sample_Rate_15_19": 1,
            "Sample_Rate_18mo_4yr": 1,
            "Sample_Rate_20_Plus": 1,
            "Sample_Rate_5_9": 1,
            "Sample_Rate_Birth": 1,
            "Serialization_Test_Cycles": 0,
            "Simulation_Duration": 90,
            "Simulation_Timestep": 1,
            "Simulation_Type": "GENERIC_SIM",
            "Start_Time": 0,
            "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY",
            "Transmission_Blocking_Immunity_Decay_Rate": 0.1,
            "Transmission_Blocking_Immunity_Duration_Before_Decay": 60,
            "x_Air_Migration": 1,
            "x_Birth": 1,
            "x_Local_Migration": 1,
            "x_Other_Mortality": 1,
            "x_Population_Immunity": 1,
            "x_Regional_Migration": 1,
            "x_Sea_Migration": 1,
            "x_Temporary_Larval_Habitat": 1
        }
    }
    

Note

These same steps can also be used to flatted a single configuration file that has been hierarchically organized into logical categories.

Create a campaign file

You define the initial disease outbreak and interventions used a campaign for a simulation through a JSON-formatted campaign file, typically called campaign.json. It is hierarchically organized into logical groups of parameters that can have arbitrary levels of nesting. For some interventions, there can be a very complex hierarchical structure, including recursion. This framework enables rigorous testing of possible control strategies to determine which events or combination of events will best aid in the elimination of disease for specific geographic locations.

For a complete list of campaign parameters that are available to use with this simulation type and more detail about the campaign file structure, see Campaign parameters. For more information about JSON, see EMOD parameter reference.

For the interventions to take place, the campaign file must be in the same directory as the configuration file and you must set the configuration parameters Enable_Interventions to 1 and Campaign_Filename to the name of the campaign file.

The EMOD Regression directory contains many different subdirectories that contain configuration, campaign, and other associated files to run simulations that represent real-world scenarios. Within the each subdirectory, there is usually a single campaign file (campaign.json), though some directories also include a campaign overlay file (campaign_overrides.json), which has been created by combining campaign_overrides.json with one of the default files in Regression/defaults. The naming of these files is an arbitrary convention used at IDM; you may name this files anything you choose. See Use campaign overlay files for more information flattening two campaign files.

Although you can create campaign files entirely from scratch, it is often easier to start from an existing campaign file and modify it to meet your needs. The simplest method is to edit the parameters or parameter values in the JSON file in any text editor. You may also create or modify the files using a scripting language, as with configuration files. See Create a configuration file for examples.

The following is an example of campaign file that has two events (SimpleVaccine and Outbreak) that occur in all nodes at day 1 and day 30, respectively. Each event contains an event coordinator that describes who receives the intervention (everyone, with the vaccine repeated three times) and the configuration for the intervention itself. Note that the nested JSON elements have been organized to best illustrate their hierarchy, but that many files in the Regression directory list the parameters and nested objects differently.

{
    "Campaign_Name": "Vaccine",
    "Use_Defaults": 1,
    "Events":
    [
        {
            "Event_Name": "SimpleVaccine",
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Start_Day": 1,
            "class": "CampaignEvent",
            "Event_Coordinator_Config": {
                "Demographic_Coverage": 0.5,
                "Number_Repetitions": 3,
                "Target_Demographic": "Everyone",
                "Timesteps_Between_Repetitions": 7,
                "class": "StandardInterventionDistributionEventCoordinator",
                "Intervention_Config": {
                    "Cost_To_Consumer": 10,
                    "Waning_Config": {
                        "class": "WaningEffectMapLinear",
                        "Initial_Effect" : 1.0,
                        "Expire_At_Durability_Map_End" : 0,
                        "Durability_Map" : {
                            "Times"  : [   0,  30,  60,  90, 120 ],
                            "Values" : [ 0.9, 0.3, 0.9, 0.6, 1.0 ]
                        }
                    },
                    "Vaccine_Take": 1,
                    "Vaccine_Type": "AcquisitionBlocking",
                    "class": "SimpleVaccine"
                }
            },
        },
        {
            "Event_Name": "Outbreak",
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Start_Day": 30,
            "class": "CampaignEvent",
            "Event_Coordinator_Config": {
                "Demographic_Coverage": 0.001,
                "Target_Demographic": "Everyone",
                "class": "StandardInterventionDistributionEventCoordinator",
                "Intervention_Config": {
                    "Antigen": 0,
                    "Genome": 0,
                    "Outbreak_Source": "PrevalenceIncrease",
                    "class": "OutbreakIndividual"
                }
            }
        }
    ]
}
Multiple interventions

When creating multiple interventions, either of the same type or different types, they will generally be distributed independently without regard to whether a person has already received another intervention.

Warning

The event containing the outbreak “intervention” must be the last one listed in the campaign file or none of the disease control interventions will take place.

For example, say you create two SimpleBednet interventions and both interventions have Demographic_Coverage set to 0.5 (50% demographic coverage). This value is the probability that each individual in the target population will receive the intervention. It does not guarantee that the exact fraction of the target population set by Demographic_Coverage receives the intervention.

By default, each individual in the simulation will have a 50% chance of receiving a bednet in both of the distributions and the two distributions will be independent. Therefore, each individual has a 75% chance of receiving at least one bednet.

_images/howto-multiple.png
Use campaign overlay files

You can use two campaign files when setting up a simulation. One file contains default campaign settings and an overlay file contains additional parameters or different parameter values that override the values in the default file. This topic describes how to set up the default and overlay file and flatten them into a single file before running a simulation.

Overlay files allow you to easily separate a subset of parameters that are of particular interest from the rest of the parameters needed to run a simulation. You can easily modify the parameters in the overlay file without needing to maintain a complete campaign file. This can be especially helpful when you want to experiment with different interventions without modifying the rest of the settings. You can have one default file and many different overlay files for different intervention settings. It also allows you to easily update the default values across multiple simulations.

In addition to being used for model experimentation, overlay files are used when testing the software functionality after making source code changes. If you run the EMOD regression tests using regression_test.py, campaign files will be flattened as part of those tests. However, this may take several hours if run locally. More guidance on modifying the EMOD source code is in the “Advance the model” section.

Follow the steps below to quickly flatten campaign files.

  1. Create the default campaign file in JSON. You may, though it is not required, organize the parameters into logical categories of nested JSON objects to make managing the parameters easier. See Campaign parameters for a complete list of all parameters that are available. See the example default campaign file below.

    {
        "Campaign_Name": "Initial Seeding",
        "Use_Defaults": 1,
        "Events": [
            {
                "Event_Name": "Outbreak",
                "Nodeset_Config": {
                    "class": "NodeSetAll"
                },
                "Start_Day": 30,
                "class": "CampaignEvent",
                "Event_Coordinator_Config": {
                    "Demographic_Coverage": 0.001,
                    "Target_Demographic": "Everyone",
                    "class": "StandardInterventionDistributionEventCoordinator",
                    "Intervention_Config": {
                        "Antigen": 0,
                        "Genome": 0,
                        "Outbreak_Source": "PrevalenceIncrease",
                        "class": "OutbreakIndividual"
                    }
                }
            }
        ]
    }
    
  2. Create the overlay campaign file in JSON. This file must include the parameter Default_Campaign_Path, set to the path to the default campaign file, relative to the location of the flatten_campaign.py script in the EMOD Regression folder. Again, you may organize these into logical categories if you desire. See the example overlay campaign file below.

    {
        "Campaign_Name": "Vaccine",
        "Default_Campaign_Path": "defaults/generic-default-campaign.json",
        "Events": [
            {
                "VACCINATION": "BEGIN",
                "Event_Name": "SimpleVaccine",
                "Event_Coordinator_Config": {
                    "Demographic_Coverage": 0.5,
                    "Intervention_Config": {
                        "Cost_To_Consumer": 10,
                        "Waning_Config": {
                            "class": "WaningEffectMapLinear",
                            "Initial_Effect" : 1.0,
                            "Expire_At_Durability_Map_End" : 0,
                            "Durability_Map" :
                            {
                                "Times"  : [   0,  30,  60,  90, 120 ],
                                "Values" : [ 0.9, 0.3, 0.9, 0.6, 1.0 ]
                            }
                        },
                        "Vaccine_Take": 1,
                        "Vaccine_Type": "AcquisitionBlocking",
                        "class": "SimpleVaccine"
                    },
                    "Number_Repetitions": 3,
                    "Target_Demographic": "Everyone",
                    "Timesteps_Between_Repetitions": 7,
                    "class": "StandardInterventionDistributionEventCoordinator"
                },
                "Nodeset_Config": {
                    "class": "NodeSetAll"
                },
                "Start_Day": 1,
                "class": "CampaignEvent",
                "VACCINATION": "END"
            }
        ]
    }
    
  3. In a Command Prompt window, navigate to the Regression folder.

  4. Run the flatten_campaign.py script, providing the relative path to the overlay file and the path to and name of the new flattened campaign file that will be saved, using the arguments as shown below:

    python flatten_campaign.py --overlay experiment/campaign_overlay.json --saveto experiment/campaign.json
    
  5. Open the resulting campaign.json file and see that it has been flattened into a single file with nested JSON objects and any logical categories retained.

    {
        "Campaign_Name": "Vaccine",
        "Default_Campaign_Path": "defaults/generic-default-campaign.json",
        "Use_Defaults": 1,
        "Events":
        [
            {
                "VACCINATION": "BEGIN",
                "Event_Name": "SimpleVaccine",
                "Nodeset_Config": {
                    "class": "NodeSetAll"
                },
                "Start_Day": 1,
                "class": "CampaignEvent",
                "Event_Coordinator_Config": {
                    "Demographic_Coverage": 0.5,
                    "Number_Repetitions": 3,
                    "Target_Demographic": "Everyone",
                    "Timesteps_Between_Repetitions": 7,
                    "class": "StandardInterventionDistributionEventCoordinator",
                    "Intervention_Config": {
                        "Cost_To_Consumer": 10,
                        "Waning_Config": {
                            "class": "WaningEffectMapLinear",
                            "Initial_Effect" : 1.0,
                            "Expire_At_Durability_Map_End" : 0,
                            "Durability_Map" : {
                                "Times"  : [   0,  30,  60,  90, 120 ],
                                "Values" : [ 0.9, 0.3, 0.9, 0.6, 1.0 ]
                            }
                        },
                        "Vaccine_Take": 1,
                        "Vaccine_Type": "AcquisitionBlocking",
                        "class": "SimpleVaccine"
                    }
                },
                "VACCINATION": "END"
            },
            {
                "Event_Name": "Outbreak",
                "Nodeset_Config": {
                    "class": "NodeSetAll"
                },
                "Start_Day": 30,
                "class": "CampaignEvent",
                "Event_Coordinator_Config": {
                    "Demographic_Coverage": 0.001,
                    "Target_Demographic": "Everyone",
                    "class": "StandardInterventionDistributionEventCoordinator",
                    "Intervention_Config": {
                        "Antigen": 0,
                        "Genome": 0,
                        "Outbreak_Source": "PrevalenceIncrease",
                        "class": "OutbreakIndividual"
                    }
                }
            }
        ]
    }
    

After the overlay files and default files are combined into a single campaign file, you can run a simulation using the EMOD executable (Eradication.exe).

Target interventions to nodes or groups

Generally, you want to target your outbreaks and campaign interventions to specific regions or individuals who meet certain criteria. For example, you may want to distribute bednets only to areas where a mosquito-borne disease is endemic or vaccinate only young children who are at highest risk. This topic describes how to distribute interventions to specific geographic nodes or groups of individuals.

Target to nodes using Nodeset_Config

Targeting geographic nodes with a particular intervention can be controlled by the Nodeset_Config parameter in the campaign file. To distribute the intervention to all nodes, simply set it to “NodeSetAll”. To distribute to a subset of nodes, follow the steps below.

  1. In the JSON object for the campaign event, set Nodeset_Config using one of the following two options:

    • Set it to an empty JSON object. Within that object, set the following:

      • Set class to “NodeSetNodeList”.

      • Set Node_List to an array that contains a comma-delimited list of nodes that set where the intervention will be distributed.

    • Set it to an empty JSON object. Within that object, set the following:

      • Set class to “NodeSetPolygon”.

      • Set Polygon_Format to “SHAPE”.

      • Set Vertices to a comma-delimited list of latitude and longitude pairs that define the outer boundary of the region you want to target. The intervention will be distributed to all nodes within the defined bounds.

See the example below.

{
    "Use_Defaults": 1,
    "Events": [{
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetNodeList",
            "Node_List": [1, 3, 5]
        },
        "Start_Day": 10,
        "class": "CampaignEvent"
    }]
}
Target to nodes or individuals using properties

To target interventions to particular individuals or nodes based on their property values, you must first define those properties in the demographics file using IndividualProperties or NodeProperties. Then, in the campaign file, you can target an intervention or outbreak to a group of individuals based on the properties applied to them. See Configure heterogeneity using individual and node properties for instructions on defining properties.

Just as defining properties based on age works a little differently than other properties, targeting an intervention to a particular age range works a little differently than targeting an intervention to other properties.

To target interventions to properties other than age:

  1. In the campaign file, in the event you want to target, set Target_Demographic to “Everyone”.

  2. Add the Property_Restrictions parameter and set to an empty array.

  3. In that array, add a list of JSON key-value pairs of the property type and value that specifies the groups to apply the intervention to. If the name of the element is not valid, EMOD will ignore the property restriction.

To target interventions to age ranges:

  1. In the campaign file, in the event you want to target, set Target_Demographic to ExplicitAgeRanges.

  2. Add the Target_Age_Min and set to the lower age bound.

  3. Add the Target_Age_Max and set to the upper age bound.

    Both of these values must match one the values listed in Age_Bin_Edges_In_Years in the demographics file. EMOD does not verify this range.

The following examples illustrate how to target interventions to different groups. This includes how to configure interventions when there are multiple relevant properties, such as targeting individuals who are both low-risk and in a suburban setting or individuals who are either low- risk or living in suburban settings.

Single property, single value

The following examples show how to target interventions based on a single property value.

At day 0 of the simulation, an outbreak starts. Target_Demographic is set to “Everyone” but Property_Restrictions restricts the start of the outbreak to the “Urban” group.

_images/howto-targeted-1.png
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 1,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Place:Urban"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"
    }]
}

Even if you have multiple properties defined in the demographics file, you can target interventions to a single property value in the same way. Individuals can be assigned any of the values for the other property types.

In this example, values are defined for both the “Risk” and “Place” property types. The outbreak only targets “Suburban” individuals using the “Place” property type. Individuals can have any “Risk” value.

_images/howto-targeted-2.png
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 1,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Place:Urban"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"
    }]
}
Single property, multiple values

If you want to target multiple values with the same property type, such as both “Urban” and “Rural” values with the “Place” property, you must use multiple interventions. You cannot have more than one group with the same property value in one intervention or outbreak.

In this example, an outbreak starts at day 0 in the both the “Rural” and “Urban” groups.

_images/howto-targeted-3.png
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 1,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Place:Rural"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"
    }, {
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 1,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Place:Urban"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"
    }]
}
Multiple properties, individuals must match all values

To target individuals how have values defined by different property types, such as people who are both urban and low risk, you can use a single intervention or outbreak. When two values from multiple properties are targeted in one intervention or outbreak, the event is only applied to individuals that are assigned both values.

In this example, a vaccine intervention is targeted at low risk, suburban place individuals. Individuals who are targeted to receive the vaccine must have both property values.

_images/howto-targeted-4.png
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "Cost_To_Consumer": 10,
                "Durability_Time_Profile": "BOXDECAYDURABILITY",
                "Primary_Decay_Time_Constant": 3650,
                "Reduced_Acquire": 1,
                "Reduced_Transmit": 0,
                "Secondary_Decay_Time_Constant": 3650,
                "Vaccine_Take": 1,
                "Vaccine_Type": "StrainSpecific",
                "class": "SimpleImmunoglobulin"
            },
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Risk:Low",
                "Place:Suburban"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 100,
        "class": "CampaignEvent"
    }]
}
Multiple properties, individuals must match at least one value

However, if you want to target multiple properties, but individuals need to have only one of the specified values to qualify for the intervention, you must create a separate campaign event for each of the targeted property values. The events are applied separately and are applied to individuals that have one OR both property values; they need not have both.

In this example, an outbreak is targeted at low risk individuals in the first intervention and suburban individuals in the second intervention.

_images/howto-targeted-5.png
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 1,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Risk:Low"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"
    }, {
        "Event_Coordinator_Config": {
            "Number_Distributions": -1,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "Demographic_Coverage": 1,
            "Target_Demographic": "Everyone",
            "Property_Restrictions": [
                "Place:Suburban"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 0,
        "class": "CampaignEvent"
    }]
}

Alternatively, if you want to target multiple properties, one of which is the age bin, you could use Property_Restriction_Within_Node and the Age_Bin properties and Age_Bin_Property_From_X_To_Y values that are automatically created by EMOD when you use the Age_Bin_Edges_In_Years demographics parameter (see NodeProperties and IndividualProperties parameters). This allows you to use a single campaign event instead of multiple ones as you would with “Target_Demographic”: “ExplicitAgeRanges”.

{
    "Events": {
        "class": "CampaignEvent",
        "Distributions": [{
            "Start_Day": 1,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "EventCoordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Demographic_Coverage": 1,
                "Intervention_Config": {
                    "class": "NodeLevelHealthTriggeredIV",
                    "Property_Restrictions_Within_Node": [{
                            "Risk": "LOW",
                            "Age_Bin": "Age_Bin_Property_From_0_To_5"
                        },
                        {
                            "Risk": "MEDIUM",
                            "Age_Bin": "Age_Bin_Property_From_5_To_13"
                        },
                        {
                            "Risk": "HIGH",
                            "Age_Bin": "Age_Bin_Property_From_13_To_125"
                        }
                    ]
                }
            }
        }]
    }
}
Target an age range

Targeting an intervention to an age range is set up differently than targeting an intervention to other property types. However, you can combine both kinds of restrictions. In this example, a vaccine campaign is targeted at urban individuals who are age 0 to 5.

_images/howto-targeted-6.png
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "Cost_To_Consumer": 10,
                "Durability_Time_Profile": "BOXDECAYDURABILITY",
                "Primary_Decay_Time_Constant": 3650,
                "Reduced_Acquire": 1,
                "Reduced_Transmit": 0,
                "Secondary_Decay_Time_Constant": 3650,
                "Vaccine_Take": 1,
                "Vaccine_Type": "StrainSpecific",
                "class": "SimpleImmunoglobulin"
            },
            "Target_Demographic": "ExplicitAgeRanges",
            "Target_Age_Min": 0,
            "Target_Age_Max": 5,
            "Property_Restrictions": [
                "Place:Urban"
            ],
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 30,
        "class": "CampaignEvent"
    }]
}

Run simulations

There are a number of ways to run an EMOD simulation, whether locally or on a remote HPC cluster. The simplest way is to run a simulation at the command line, however that limits you to running one local simulation at a time. Because the EMOD model is stochastic, you must run many simulations before you can interpret the outcome. You may want to use a scripting language like Python or MATLAB or an application like mpiexec to run multiple simulations at once.

In addition, if you are modifying the EMOD source code to add functionality to the model, you can run simulations in Visual Studio as part of debugging. This process is described in Run debug simulations in Visual Studio.

No matter how you choose to run simulations, you must have a built copy of the EMOD executable (Eradication.exe) or Eradication binary, either downloaded directly from GitHub or built from the EMOD source code. See EMOD installation. In addition, you must know the paths to the configuration file and input data files and where you want to store the output files. You will pass this information as arguments to Eradication.exe.

Directory structure

Although there are many ways you can structure the files needed to run a simulation, we recommend the following to keep your files organized and simplify the file paths set in the configuration file or passed as arguments to Eradication.exe.

  • Place the configuration and campaign files needed for a simulation in the same directory. This is also known as the working directory.

    However, if you are using overlay files, you may want the default configuration or campaign file in a separate directory so they can be used with different overlay files for other simulations.

  • Place all input data files for a given region in the same directory.

  • Place output for a simulation in a subdirectory of the directory containing configuration and campaign files.

It is not important where you install Eradication.exe or the Eradication binary.

Run a simulation using the command line

Using command-line options is the simplest way to run an EMOD simulation. This topic describes the commands available for running simulations.

The EMOD executable (Eradication.exe) and Eradication binary also provide commands that provide information about the version of EMOD that is installed, such as available parameters and simulation types. For more information, see Generate a list of all available parameters (a schema). The examples below show the Windows Eradication.exe, but the options are the same for the Eradication binary on CentOS on Azure.

Command options

The following command-line options are available for running EMOD simulations. Paths can be absolute or relative to the directory you are in when running the commands, unless otherwise specified.

Simulation options

Long form

Short form

Description

--config

-C

Path to the configuration file. If not specified, EMOD will look for a file named default-config.json in the current directory.

--input-path

-I

Path to the directory containing input data files. If not specified, EMOD will look for files in the current directory.

--output-path

-O

Path to the directory where output files will be written. If not specified, EMOD will create an “output” directory and overwrite any previous output in that directory.

--dll-path

-D

Path to the EMODule root directory. For more information, see Custom reporters.

The following options are for monitoring the progress of simulations running on an high-performance computing (HPC) cluster. They are optional for any simulation, but they must be used together. To monitor progress, listen for User Datagram Protocol (UDP) messages on the specified host and port.

HPC cluster options

Long form

Description

--monitor_host

The IP address of the commissioning/monitoring host. Set to “none” for no IP address.

--monitor_port

The port of the commissioning/monitoring host. Set to “0” for no port.

--sim_id

The unique ID for this simulation. This ID is needed for self-identification to the UDP host. Set to “none” for no simulation ID.

Usage
  1. Open a Command Prompt window and navigate to the working directory, which contains the configuration and campaign files.

  2. Enter a command like the one illustrated below, substituting the appropriate paths and file names for your simulation:

    ../Eradication.exe -C config.json -I C:\|EMOD_s|\InputFiles -O Sim1Output
    

    If you do not specify anything when invoking Eradication.exe, it will not execute with all defaults, but will instead tell you how to invoke the --help command.

  3. EMOD will display logging information, including an errors that occur, while running the simulation. See Error and logging files for more information.

Run a simulation using mpiexec

The application mpiexec is used to run multi-node simulations in parallel. Eradication.exe is “single threaded”, so it uses only one core for processing. If you run a simulation with multiple geographic nodes using mpiexec instead of invoking Eradication.exe directly, multiple copies of Eradication.exe will be running, with one copy per core processing data for a single node at a time. Message Passing Interface (MPI) communicates between the cores when handling the migration of individuals from one node to another.

Although mpiexec can be used to run a simulation in parallel on your local computer, it is more often used to run complex simulations in parallel on an HPC cluster or several linked computers. Mpiexec is part of the Microsoft HPC Pack 2012 SDK (64-bit) installed as a prerequisite for building Eradication.exe from the EMOD source code. See EMOD source code installation for more information.

Note

If you get an error that the mpiexec command cannot be found, you must add the path to mpiexec to the PATH environment variable. For example, open Control Panel and add the path C:\Program Files\Microsoft HPC Pack 2012\Bin to PATH.

Usage
  1. Take note of the number of cores on your computer or cluster.

    If running locally, we recommend running mpiexec with one fewer cores than are available, so one core is reserved for the operating system. The simulation can be run on all available cores and will complete faster, but the desktop will not be responsive.

  2. Open a Command Prompt window and navigate to the directory that contains the configuration and campaign files for the simulation.

  3. Invoke Eradication.exe using mpiexec as follows, replacing the number of cores, paths, and command options as necessary for your environment. See Run a simulation using the command line for more information about the command options available for use with Eradication.exe.

    mpiexec -n 3 ..\Eradication.exe --config config.json --input-path ..\InputDirectory\Garki --output-path OutputGarki
    

Mpiexec will start multiple copies of Eradication.exe as specified by -n. Those instances will communicate with each other via MPI. If all cores are on a single computational node or host, they will use internal networking to carry the MPI packets.

Note

The EMOD executable (Eradication.exe) does NOT use the configuration file parameter Num_Cores, which is used by the infrastructure that runs the simulation, such as an HPC cluster or regression script.

You can also link together several computers with MPI using the mpiexec -host option. For example, if you were using six cores on two computers, you could run three copies of Eradication.exe on the first computer, and three more could be run on the second computer. Again, this assumes that each computer has at least three cores.

For more information about mpiexec, see MSDN.

Run a simulation using Python

If you used Python to create or modify JSON files as shown in Create a configuration file or Create a campaign file, it may be convenient to invoke Eradication.exe to run a simulation from a Python script. One way of doing this is shown below using the subprocess package.

import subprocess

# specify paths
binary_path = "binDirectory\Eradication.exe"
input_path = "inputDirectory\Namawala\

# commission job
subprocess.call( [binary_path, "-C", "config.json", "--input", input_path] )

See Run a simulation using the command line for more information about the command options available for use with Eradication.exe.

Run a simulation using MATLAB

If you used MATLAB to create or modify JSON files as shown in Create a configuration file or Create a campaign file, it may be convenient to invoke Eradication.exe to run a simulation from a MATLAB script. One way of doing this is shown below using the dos command.

exe_name = fullfile( binDirectory, 'Eradication.exe' );
exe_args = [ '-C config.json -I ', fullfile( inputDirectory, 'Namawala' ) ];
[status,result] = dos( ['cd ', WorkDirectory, ' && ', exe_name, ' ', exe_args ], '-echo' );

See Run a simulation using the command line for more information about the command options available for use with Eradication.exe.

Improve EMOD performance

While small simulations can be run quickly on a local computer, the time and memory needed to complete a simulation can grow significantly when simulations become larger and more complex. For example, a single geographical node simulation might use 3 GB with one core in order to run successfully in one minute or less, while another simulation job may require 32 GB in a dual-core system in order to complete in approximately the same amount of time.

As your simulations grow, you will likely want to run simulations on an HPC cluster or take other steps to improve performance and reduce processing time. This topic describes many of the steps you can take to speed up EMOD simulations.

Parallel processing

The EMOD executable (Eradication.exe) is “single threaded”, meaning that for processing, it will use only one core. However, you can use the Message Passing Interface (MPI) to run multiple copies of Eradication.exe in parallel, either locally or on an HPC cluster. To run a simulation in parallel, you must invoke Eradication.exe with the mpiexec command. For more information, see Run a simulation using mpiexec.

Parameter settings

You can also set various parameters in the configuration file that will improve performance by scaling down the amount of data used or optimizing data processing. See the parameters listed in the sections below for guidance on making performance adjustments. See Configuration parameters for more information about each of the parameters.

Scaling and sampling
Simulation_Duration

Obviously, simulating a shorter timespan will take less processing time. However, the processing time is often driven by the number of infections or immune updates, so running a simulation after all infections have cleared may not increase processing time much. For more information, see Simulation setup parameters.

Individual_Sampling_Type and Base_Individual_Sample_Rate

Instead of the default Individual_Sampling_Type setting of “TRACK_ALL”, you can speed up performance by sampling such that each individual object represents more than one person. For example, a simulation with a population of 1 million and sample rate of 0.1 would simulate 100,000 individuals, with each given a weight of 10.Sampling can be fixed at a particular rate or can adapt the rate based on certain criteria, such as age or immune state. However, you should be especially careful not to undersample simulations to the point where they are overly sensitive to rare stochastic events. For more information, see Sampling parameters.

Population_Scale_Type and Base_Population_Scale_Factor

Alternatively, you can simply reduce the total population of the simulation using Population_Scale_Type set to “FIXED_SCALING” and Base_Population_Scale_Factor set to less than one. For more information, see Scalars and multipliers parameters.

Processing
Num_Cores

For large, spatially distributed simulations, running the intra-node dynamics (for example, infection and immune dynamics) in parallel on multiple cores may be very advantageous. Ideally, the timing would be reduced inversely to the number of cores. However, there are costs to serializing individuals for migration over MPI, as well as considerations for balancing the CPU load on each core. These issues may be mitigated using a load balancing input file that is suitable to the geography being simulated. See Load-balancing file structure for more information.

Use output files

At the end of the simulation, you will notice that a number of files have been written to the output directory. Some are logging or error output files, which you can read about more in Error and logging files. The rest are output reports that contain data from the simulation itself, usually in JSON or CSV format. This topic describes how to parse and use the output reports.

By default, the output report InsetChart.json is always produced, which contains per- timestep values accumulated over the simulation in a variety of reporting channels, for example, “New Infections”, “Adult Vectors”, and “Parasite Prevalence”. EMOD provides several other built-in reports that you can produce if you enable them in the configuration file. See Output report structure for additional information about the reports and how to enable them.

If none of the built-in output reports provide the data you need, you can use a custom reporter that plugs in to the Eradication.exe as a EMODule dynamic link library (DLL). For more information, see Custom reporters.

In order to interpret the output of EMOD simulations, you will find it useful to parse the output reports into an analyzable structure. For example, you can use a Python or MATLAB script to create graphs and charts for analysis.

Use Python to parse data

The example below uses the Python package JSON to parse the file and the Python package matplotlib.pyplot to plot the output. This is a very simple example and not likely the most robust or elegant. Be sure to set the actual path to your working directory.

import os
import json
import matplotlib.pyplot as plt

# open and parse InsetChart.json
ic_json = json.loads( open( os.path.join( WorkingDirectoryLocation, "output", "InsetChart.json" ) ).read() )
ic_json_allchannels = ic_json["Channels"]
ic_json_birthdata = ic_json["Channels"]["Births"]

# plot "Births" channel by time step
plt.plot( ic_json_birthdata[  "Data"  ], 'b-' )
plt.title( "Births" )
plt.show()
Use MATLAB to parse data

The example below uses the MATLAB toolbox JSONlab to parse an InsetChart.json file and plot one channel. This script uses JSONLab to parse the file into a usable form in MATLAB. This is a very simple example and not likely the most robust or elegant. Be sure to set the actual paths to JSONlab and your working directory.

% this sample uses JSONLab toolbox
addpath('PATH TO/jsonlab');

% open and parse InsetChart.json
ic_json = loadjson( fullfile( 'WorkingDirectoryLocation', 'output', 'InsetChart.json' ));
ic_json_allchannels = ic_json.Channels;
ic_json_birthinfo = ic_json_allchannels.Births;
ic_json_birthdata = ic_json_birthinfo.Data;
M = num2cell(ic_json_birthdata);

% plot "Births" channel by time step
plot(cell2mat(M));
title( 'Births' );
Custom reporters

Reporters extract simulation data, aggregate it, and output it to a file known as an output report. You can process the report data using tools, such as Python or MATLAB, to create graphs and charts for analysis. EMOD provides built-in reporters that are part of the EMOD executable (Eradication.exe) and can be enabled or disabled by setting parameters in the configuration file. See Output report structure for a list of the reports that are available using built-in reporters.

In addition, you can use custom reporters that extract data from the simulation and aren’t part of the Eradication.exe. A custom reporter is an EMODule that you plug in to EMOD. Custom reporters are not supported for CentOS on Azure. There are several reporters in the GitHub reporters directory that you can use. You may also want to build your own custom reporter to create a new output report.

_images/Reporters.png

The Eradication.exe must load the reporter when running a simulation to use it. If it is loaded, the output report will be automatically generated at the end of the simulation. There are three ways to specify their location so Eradication.exe can load them. Eradication.exe attempts to load the file using the following methods, in the order listed:

  1. Define the location of the dynamic link library (DLL) in a JSON-formatted file (emodules_map.json).

  2. Point to the location using the --dll-path command-line option when invoking Eradication.exe.

  3. Place the DLL in the working directory.

JSON file

First, Eradication.exe looks for an emodules_map.json file in the working directory. This map file lists specific reporter DLLs and their exact location. This is useful if you want to store all custom reporters in the same directory, but only want certain reporters to be used with each simulation.

The emodules_map.json file has three sections: diseases, interventions and reporters. Each section is a JSON array and contains the path to each EMODule in the array. Although reporter EMODules are the only type currently supported, empty disease and intervention sections must be included. You must use either a double backslash (\) or a single forward slash (/) to represent a single backslash for the path. For example:

{
    "disease_plugins": [
         ],
    "interventions": [
         ],
    "reporter_plugins": [
        "C:\\src\\EMOD\\x64\\Release\\emodules\\reporter_plugins\\libreportpluginbasic.dll"
    ]
}
Command-line option

If a map file is not provided, you can include the --dll-path option when you invoke Eradication.exe. It must point to a directory with a reporter_plugins subdirectory that contains the reporters. The name of the directory does not matter, but the reporter must be in a subdirectory named reporter_plugins. Note that this method will load all reporters in the root directory specified.

If you build custom reporters as described here, the DLLs will be saved to the following directories, depending on the build configuration:

  • <EMOD source directory path>x64Releasereporter_plugins

  • <EMOD source directory path>x64Debugreporter_plugins

Therefore, if you do not move your reports, you will set --dll-path to one of the following paths:

  • <EMOD source directory path>x64Release

  • <EMOD source directory path>x64Debug

For more information on EMOD command-line options, see Run a simulation using the command line.

Working directory

Finally, if neither the the map file or the command-line option are provided, Eradication.exe looks for the reporter plug-in in the current working directory.

EMOD parameter reference

The configurable parameters described in this reference section determine the behavior of a particular simulation and interventions. The parameter descriptions are intended to guide you in correctly configuring simulations to match your disease scenario of interest.

This reference section contains only the parameters supported for use with the generic simulation type. To see the parameters for a different simulation type, see the corresponding documentation.

These parameters include three major groups: parameters for the demographics file, parameters for the configuration file, and parameters for the campaign file.

If you would rather use a text file for parameter reference than this web documentation, you can also generate a schema with the EMOD executable (Eradication.exe) that defines all configuration and campaign parameters that can be used in a simulation, including names, data types, defaults, ranges, and short descriptions. For instructions, see Generate a list of all available parameters (a schema).

JSON formatting overview

All of these parameters are contained in JavaScript Object Notation (JSON) formatted files. JSON is a data format that is human-readable and easy for software to read and generate. It can be created and edited using a simple text editor.

JSON has two basic structures: a collection of key-value pairs or an ordered list of values (an array). These structures are within a JSON object, which is enclosed in a set of braces. You will notice that each of these files begins with a left brace ({) and ends with a right brace (}).

A value can be a string, number, Boolean, array, or an object. The campaign and data input files often use nested objects and arrays. See www.json.org for more information on JSON.

A few important details to call out when creating JSON files:

  • Add a comma after every key-value pair or array except for the last key-value pair in an array or object.

  • The keys (parameters) are case-sensitive. For example, “NodeID” is not the same as “NodeId”.

  • Decimals require a 0 (zero) before the decimal point.

  • EMOD does not support Booleans (“True”, “False”). Instead, EMOD use the integer 1 for “True” and 0 for “False”.

  • Every opening brace or bracket ({ or [) requires a corresponding closing brace or bracket (} or ]).

The following is an example of a JSON formatted file.

{
    "A_Complex_Key": {
        "An_Array_with_a_Nested_Object_Value": [
            {
                "A_Simple_Key": "Value",
                "A_Simple_Array": [ "Value1", "Value2" ],
                "An_Array_with_Number_Values": [ 0.1, 0.2 ],
                "A_Nested_Object": {
                    "Another_Simple_Key": "Value",
                    "Nested_Arrays": [
                        [ 10, 0.1 ],
                        [ 0.1, 1 ]
                    ]
                }
            }
        ]
    }
}
Demographics parameters

The parameters described in this reference section can be added to the JavaScript Object Notation (JSON) formatted demographics file to determine the demographics of the population within each geographic node in a simulation. For example, the number of individuals and the distribution for age, gender, immunity, risk, and mortality. These parameters work closely with the Population dynamics parameters in the configuration file, which are simulation-wide and generally control whether certain events, such as births or deaths, are enabled in a simulation.

Generally, you will download a demographics file and modify it to meet the needs of your simulation. Demographics files for several locations are available on the Institute for Disease Modeling (IDM) GitHub EMOD-InputData repository or you can use COMputational Platform Service (COMPS) to generate demographics and other input data files for a particular region. By convention, these are named using the name of the region appended with “_demographics.json”, but you may name the file anything you like.

Additionally, you can use more than one demographics file, with one serving as the base layer and the one or more others acting as overlays that override the values in the base layer. This can be helpful if you want to experiment with different values in the overlay without modifying your base file. For more information, see Use demographics overlay files.

At least one demographics file is required for every simulation unless you set the parameter Enable_Demographics_Builtin to 1 (one) in the configuration file. This setting does not represent a real location and is generally only used for testing and validating code pathways rather than actual modeling of disease.

Demographics files are organized into four main sections: Metadata, NodeProperties, Defaults, and Nodes. The following example shows the skeletal format of a demographics file.

{
     "Metadata": {
          "DateCreated": "dateTime",
          "Tool": "scriptUsedToGenerate",
          "Author": "author",
          "IdReference": "Gridded world grump2.5arcmin",
          "NodeCount": 2
     },
     "NodeProperties": [
          {}
     ],
     "Defaults": {
          "NodeAttributes": {},
          "IndividualAttributes": {},
          "IndividualProperties": {},
          "Society": {}
     },
     "Nodes": [{
          "NodeID": 1,
          "NodeAttributes": {},
          "IndividualAttributes": {},
          "IndividualProperties": {},
          "Society": {}
     }, {
          "NodeID": 2,
          "NodeAttributes": {},
          "IndividualAttributes": {},
          "IndividualProperties": {},
          "Society": {}
     }]
}

All parameters except those in the Metadata and NodeProperties sections below can appear in either the Defaults section or the Nodes section of the demographics file. Parameters under Defaults will be applied to all nodes in the simulation. Parameters under Nodes will be applied to specific nodes, overriding the values in Defaults if they appear in both. Each node in the Nodes section is identified using a unique NodeID.

The tables below contain only parameters available when using the generic simulation type.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

Metadata

Metadata provides information about data provenance. NodeCount and IdReference are the only parameters used by EMOD, but you are encouraged to included information for your own reference. For example, author, date created, tool used, and more are commonly included in the Metadata section. You can include any information you like here provided it is in valid JSON format.

If you generate input data files using COMPS, the following IdReference values are possible and indicate how the NodeID values are generated:

Gridded world grump30arcsec

Nodes are approximately square regions defined by a 30-arc second grid and the NodeID values are generated from the latitude and longitude of the northwest corner.

Gridded world grump2.5arcmin

Nodes are approximately square regions defined by a 2.5-arc minute grid and the NodeID values are generated from the latitude and longitude of the northwest corner.

Gridded world grump1degree

Nodes are approximately square regions defined by a 1-degree grid and the NodeID values are generated from the latitude and longitude of the northwest corner.

The algorithm for encoding latitude and longitude into a NodeID is as follows:

unsigned int xpix = math.floor((lon + 180.0) / resolution)
unsigned int ypix = math.floor((lat + 90.0) / resolution)
unsigned int **NodeID** = (xpix << 16) + ypix + 1

This generates a NodeID that is a 4-byte unsigned integer; the first two bytes represent the longitude of the node and the second two bytes represent the latitude. To reserve 0 to be used as a null value, 1 is added to the NodeID as part of the final calculation.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

IdReference

string

NA

NA

NA

The identifier for a simulation; all input data files used in a simulation must have the same IdReference value. The value must be greater than 0. If the input data files are generated using COMPS, the string that indicates the method used for generating the NodeID, the identifier used for each node in the simulation.

{
    "Metadata": {
        "IdReference": "Gridded world grump30arcsec"
    }
}

NodeCount

integer

1

Depends on available memory

NA

The number of nodes to expect in the input data files.

{
    "Metadata": {
        "NodeCount": 2
    }
}
NodeProperties and IndividualProperties

Node properties and individual properties are set similarly and share many of the same parameters. Properties can be thought of as tags that are assigned to nodes or individuals and can then be used to either target interventions to nodes or individuals with certain properties (or prevent them from being targeted). For example, you could define individual properties for disease risk and then target an intervention to only those at high risk. Similarly, you could define properties for node accessibility and set lower intervention coverage for nodes that are difficult to access. For more information on setting up properties, see Configure heterogeneity using individual and node properties.

The NodeProperties section is a top-level section at the same level as Defaults and **Nodes that contains parameters that assign properties to nodes in a simulation. The IndividualProperties section is under either Defaults or Nodes and contains parameters that assign properties to individuals in a simulation.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Age_Bin_Edges_In_Years

array

NA

NA

NA

An array of integers that represents the ages, in years, at which to demarcate the age groups for individuals. Used only with the Age_Bin property type. The first number must be 0, the last must be -1, and they must be listed in ascending order. Cannot be used with NodeProperties.

EMOD automatically create the individual property Age_Bin with values based on the bin edges using the format Age_Bin_Property_From_X_To_Y. These appear in the property reports and can be used to target campaign interventions using Property_Restrictions_Within_Node. See Target interventions to nodes or groups for more information.

The following example creates three age groups: 0 to 5, older than 5 to 13, and older than 13 to the maximum age.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [0, 5, 13, -1]
        }]
    }
}

IndividualProperties

array of objects

NA

NA

NA

An array that contains parameters that add properties to individuals in a simulation. For example, you can define values for accessibility, age, geography, risk, and other properties and assign values to different individuals. alues.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "InterventionStatus",
            "Values": ["None", "ARTStaging"],
            "Initial_Distribution": [1, 0]
        }, {
            "Property": "Risk",
            "Values": ["High", "Medium", "Low"],
            "Initial_Distribution": [0.2, 0.5, 0.3]
        }]
    }
}

Initial_Distribution

array of floats

0

1

1

An array of floats that define the proportion of property values to assign to individuals or nodes at the beginning of the simulation and when new individuals are born. Their sum must equal 1 and the number of members in this array must match the number of members in Values. For Age_Bin property types, omit this parameter as the demographics file controls the age distribution.

{
    "Nodes": [{
        "NodeID": 25,
        "IndividualProperties": [{
            "Initial_Distribution": [0.2, 0.4, 0.4]
        }]
    }]
}
{
    "Defaults": {
        "NodeProperties": [{
            "Property": "InterventionStatus",
            "Values": [ "NONE", "RECENT_SPRAY" ],
            "Initial_Distribution": [ 1.0, 0.0 ]
        }]
    }
}

NodeProperties

array of objects

NA

NA

NA

An array that contains parameters that add properties to nodes in a simulation. For example, you can define values for intervention status, risk, and other properties and assign values to different nodes.

{
    "NodeProperties": [{
        "Property": "Risk",
        "Values": ["HIGH", "MEDIUM", "LOW"],
        "Initial_Distribution": [0.1, 0.4, 0.5]
    }]
}

Property

enum

NA

NA

NA

The individual or node property type for which you will assign arbitrary values to create groups. You can then move individuals or nodes into or out of different groups or target interventions to particular groups. Possible values are:

Age_Bin

Assign individuals to age bins. Use with Age_Bin_Edges_In_Years. Cannot be used with NodeProperties.

Accessibility

Tag individuals or nodes based on their accessibility.

Geographic

Tag individuals or nodes based on geographic characteristics.

HasActiveTB

Tag individuals or nodes based on active TB status. Typically used only with HIV ART staging interventions.

InterventionStatus

Tag individuals or nodes based on intervention status, so that receiving an intervention can affect how other interventions are distributed. Use with Disqualifying_Properties and New_Property_Value in the campaign file.

Place

Tag individuals or nodes based on place.

Risk

Tag individuals or nodes based on disease risk.

QualityofCare

Tag individuals or nodes based on the quality of medical care.

{
    "Defaults": {
        "IndividualProperties": [{
            "Property": "Age_Bin",
            "Age_Bin_Edges_In_Years": [ 0, 6, 10, 20, -1 ]
        }]
    }
}
{
    "NodeProperties": [{
        "Property": "InterventionStatus",
        "Values": ["NONE", "RECENT_SPRAY"],
        "Initial_Distribution": [1.0, 0.0]
    }]
}

Transitions

array

NA

NA

NA

An array that contains multiple JSON objects that each define how an individual transitions from one property value to another. See the transitions array table for information about the parameters to include in the Transitions object. For Age_Bin property types, set to an empty array, as individuals will transition to the next age bin based on the passing of time. Cannot be used with NodeProperties.

{
    "Defaults": {
        "IndividualProperties": [{
            "Transitions": [{
                "From": "High",
                "To": "Medium",
                "Type": "At_Age",
                "Coverage": 1,
                "Probability_Per_Timestep": 0.3,
                "Age_In_Years": 5,
                "Timesteps_Until_Reversion": 0
            }, {
                "From": "Medium",
                "To": "Low",
                "Type": "At_Age",
                "Coverage": 1,
                "Probability_Per_Timestep": 0.3,
                "Age_In_Years": 12,
                "Timesteps_Until_Reversion": 0
            }]
        }]
    }
}

TransmissionMatrix

JSON object

NA

NA

NA

An object that contains Route and Matrix parameters that define how to scale the base infectivity from individuals with one property value to individuals with another. Route must be set to Contact and Matrix contains a WAIFW matrix of the disease transmission multipliers. The rows and columns are in the same order that the property values were defined in Value. The rows represent the infectious individuals (the “whom”); the columns represent the susceptible individuals (the “who”).

This implements the HINT feature, which is available only in the generic simulation type. For more information, see Configure heterogeneous disease transmission. Enable_Heterogeneous_Intranode_Transmission in the configuration file must be set to 1 (see Infectivity and transmission parameters). Cannot be used with NodeProperties.

{
    "Defaults": {
        "IndividualProperties": [{
            "TransmissionMatrix": {
                "Route": "Contact",
                "Matrix": [
                    [10, 0.1],
                    [0.1, 1]
                ]
            }
        }]
    }
}

Values

array of strings

NA

NA

NA

An array of the user-defined values that can be assigned to individuals or nodes for this property. The order of the values corresponds to the order of the Initial_Distribution array.

You can have up to 125 values for the Geographic and InterventionStatus property types and up to 5 values for all other types. For Age_Bin property types, omit this parameter and use Age_Bin_Edges_In_Years instead.

{
    "Defaults": {
        "IndividualProperties": [{
            "Values": ["Low", "Medium", "High"]
        }]
    }
}
{
    "NodeProperties": [
        {
            "Property": "InterventionStatus",
            "Values": [ "NONE", "RECENT_SPRAY" ],
            "Initial_Distribution": [ 1.0, 0.0 ]
        }
    ]
}
Transitions

The Transitions array under IndividualProperties section controls how individuals transition from one property value to another. It cannot be used with NodeProperties. Alternatively, similar transitions can be configured in the campaign file as the result of campaign events.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Age_In_Years

float

0

125

NA

The age at which individuals are eligible to transition. Do not use when Type is set to At_Timestep. Required when Type is set to At_Age.

{
    "IndividualProperties": [{
        "Transitions": [{
            "Type": "At_Age",
            "Age_In_Years": 10
        }]
    }]
}

Age_In_Years_Restriction

JSON object

0

100

3.40E+38

The age when an individual is eligible to transition. Min is optional and Max is required. Do not use this with Type set to At_Age because it will conflict with other age parameters in Age_In_Years. This is required when Type is set to At_Timestep, though it can be empty for no age restriction.

{
    "IndividualProperties": [{
        "Transitions": [{
            "Type": "At_Timestep",
            "Age_In_Years_Restriction": {
                "Min": 5,
                "Max": 40
            }
        }]
    }]
}

Coverage

float

0

1

1

The proportion of the population that EMOD will attempt to transition. The calculation used with Probability_Per_Timeset only uses the proportion of the population specified in Coverage to calculate the probability of an individual transitioning at a given time step. Coverage has no effect when the value is set to 1. Required when Type is set to either At_Age or At_Timestep.

{
    "Individual_Properties": [{
        "Transitions": [{
            "From": "Bad",
            "To": "Good",
            "Coverage": 0.5
        }]
    }]
}

From

string

NA

NA

NA

The property value that an individual will transition from.

{
    "Individual_Properties": [{
        "Transitions": [{
            "From": "Bad",
            "To": "Good",
            "Coverage": 0.5,
            "Type": "At_Timestep"
        }]
    }]
}

Probability_Per_Timestep

float

0

1

NA

The daily probability of an individual transitioning given the number of individuals remaining with the same property value. Required when Type is set to At_Age or At_Timestep.

{
    "Individual_Properties": {
        "Transitions": [{
            "From": "Low",
            "To": "High",
            "Coverage": 0.9,
            "Type": "At_Timestep",
            "Probability_Per_Timestep": 0.25
        }]
    }
}

Timesteps_Until_Reversion

integer

0

NA

NA

The number of time steps after the start of transitioning when individuals revert back to their original property value. The start of transitioning is specified by the Start parameter in Timestep_Restriction.

{
    "Individual_Properties": [{
        "Transitions": [{
            "Timestep_Restriction": {
                "Start": 20,
                "Duration": 60
            },
            "Timesteps_Until_Reversion": 10
        }]
    }]
}

Timestep_Restriction

JSON object

NA

NA

NA

The time step when transitioning starts and stops. Required when Type is set to either At_Age or At_Timestep. Start is required and Duration is optional.

{
    "Individual_Properties": [{
        "Transitions": [{
            "Timestep_Restriction": {
                "Start": 20,
                "Duration": 60
            }
        }]
    }]
}

To

string

The property value an individual will transition to.

{
    "Individual_Properties": [{
        "Transitions": [{
            "From": "Bad",
            "To": "Good",
            "Coverage": 0.5,
            "Type": "At_Timestep"
        }]
    }]
}

Type

enum

NA

NA

NA

The type of condition that starts transitioning individuals. Possible values are At_Age or At_Timestep. The other parameters you must set depend on the condition type set here.

{
    "Individual_Properties": [{
        "Transitions": [{
            "From": "Bad",
            "To": "Good",
            "Coverage": 0.5,
            "Type": "At_Timestep"
        }]
    }]
}
NodeAttributes

The NodeAttributes section contains parameters that add or modify information regarding the location, migration, habitat, and population of node. Some NodeAttributes depend on values set in the configuration parameters.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Airport

boolean

0

1

0

Indicates whether or not the node has an airport for air migration from (not to) the node. If set to 1, Enable_Air_Migration in the configuration file must be set to 1 or migration will not occur (see Migration parameters). Primarily used to turn off migration in a particular node.

{
    "Defaults": {
        "NodeAttributes": {
            "Airport": 0
        }
    }
}

Altitude

float

-3.40282e+038

3.40282e+038

0

The altitude, in meters, for the node. Required, but only used when Climate_Model is set to CLIMATE_KOPPEN.

{
    "Defaults": {
        "NodeAttributes": {
            "Altitude": 250
        }
    }
}

BirthRate

double

0

1

0.00008715

The birth rate, in births per person per day. In the configuration file, Enable_Birth must be set to 1 and Birth_Rate_Dependence will affect how this rate is used (see Population dynamics parameters).

{
    "Nodes": [{
        "NodeID": 21,
        "NodeAttributes": {
            "BirthRate": 0.0001
        }
    }]
}

InitialPopulation

integer

0

2.15E+0

1000

The number of people that will be populated into the node at the beginning of the simulation. You can scale this number using Base_Population_Scale_Factor in the configuration file (see Population dynamics parameters).

{
    "Nodes": [{
        "NodeID": 25,
        "NodeAttributes": {
            "InitialPopulation": 1000
        }
    }]
}

Latitude

float

3.40282e+038

-3.40282e+038

-1

Latitude of the node in decimal degrees. This can be used for several things, including determining infectiousness by latitude and defining the size of grid cells.

{
    "Nodes": [{
        "NodeID": 25,
        "NodeAttributes": {
            "Latitude": 12.4,
            "Longitude": 9.35
        }
    }]
}

Longitude

float

-3.40282e+38

3.40282e+38

-1

Longitude of the node in decimal degrees. This can be used for several things, including defining the size of grid cells.

{
    "Nodes": [{
        "NodeID": 254,
        "NodeAttributes": {
            "Latitude": 25.4,
            "Longitude": 9.1
        }
    }]
}

NodeAttributes

JSON object

NA

NA

NA

The structure that contains parameters that add or modify information regarding the location, migration, habitat, and population of a simulation. Some NodeAttributes depend on values set in the configuration parameters.

{
    "Nodes": [
        {
            "NodeID": 1487548419, 
            "NodeAttributes": {
                "Latitude": 12.4208, 
                "Longitude": 9.15417
            }
        }
    ]
} 

Region

boolean

0

1

0

Indicates whether or not the node has a road network for regional migration from (not to) the node. If set to 1, Enable_Regional_Migration in the configuration file must be set to 1 or migration will not occur (see Migration parameters). Primarily used to turn off migration in particular nodes.

{
    "Nodes": [{
         "NodeID": 12,
         "NodeAttributes": {
            "Region": 1
        }
    }]
}

Seaport

boolean

0

1

0

Indicates whether or not the node is connected by sea migration from (not to) the node. If set to 1, Enable_Sea_Migration in the configuration file must be set to 1 or migration will not occur (see Migration parameters). Primarily used to turn off migration in particular nodes.

{
    "Nodes": [{
        "NodeID": 43,
        "NodeAttributes": {
            "Seaport": 1
        }
    }]
}

Urban

boolean

0

1

0

Indicates whether urban settings are enabled. Used only if Enable_Demographics_Other is set to 1 and Birth_Rate_Dependence is set to INDIVIDUAL_PREGNANCIES_BY_URBAN_AND_AGE and required if Enable_Demographics_Other is set to 1 in the configuration file (see Population dynamics parameters).

{
    "Defaults": {
        "NodeAttributes": {
            "Urban": 1
        }
    }
}

Zoonosis

float

0

1

0

The daily rate of zoonotic infection per individual. In the configuration file, Animal_Reservoir_Type must be set to ZOONOSIS_FROM_DEMOGRAPHICS to use this value (see General disease parameters).

{
    "Defaults": {
        "NodeAttributes": {
            "Zoonosis": 0
        }
    }
}
IndividualAttributes

The IndividualAttributes section contains parameters that initialize the distribution of attributes across individuals, such as the age or immunity. An initial value for an individual is a randomly selected value from a given distribution. These distributions can be configured using a simple flag system of three parameters or a complex system of many more parameters. The following table contains the parameters that can be used with either distribution system.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

IndividualAttributes

JSON object

NA

NA

NA

The structure that contains parameters that add or modify the distribution of attributes across individuals in a simulation. For example, the age or immunity distribution. An initial value for an individual is a randomly selected value from a distribution. For example, if you use a uniform distribution to initialize age, the initial ages of individuals in the simulation will be evenly distributed between some minimum and maximum value.

{
    "Defaults": {
        "IndividualAttributes": {
            "AgeDistributionFlag": 0,
            "AgeDistribution1": 25550,
            "AgeDistribution2": 0
        }
    }
}

PercentageChildren

float

0

1

NA

The percentage of individuals in the node that are children. Set Minimum_Adult_Age_Years to determine the age at which individuals transition to adults.

{
    "Nodes": {
        "NodeID": 45,
        "IndividualAttributes": {
            "PercentageChildren": 0.7
        }
    }
}
Simple distributions

Simple distributions are defined by three parameters where one is a flag for the distribution type and the other two are used to further define the distribution. For example, if you set the age flag to a uniform distribution, the initial ages of individuals in the simulation will be evenly distributed between some minimum and maximum value as defined by the other two parameters.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

AgeDistribution1

float

-3.40282e+038

3.40282e+038

0.000118

The first value, in days, in the age distribution, the meaning of which depends upon the value set in AgeDistributionFlag. The table below shows the flag value and corresponding distribution value.

AgeDistributionFlag

AgeDistribution1

0

Age value to assign.

1

Minimum age for a uniform distribution.

2

Mean age for a Gaussian distribution.

3

Mean age for an exponential distribution.

4

Mean age for a Poisson distribution.

5

Mean age for a log normal distribution.

6

Proportion of time to return the value specified by AgeDistribution2 for a bimodal distribution. Must be between 0 and 1.

7

Scale parameter for a Weibull distribution.

Age_Initialization_Distribution_Type in the configuration file must be set to DISTRIBUTION_SIMPLE (see Population dynamics parameters).

{
    "IndividualAttributes": {
        "AgeDistributionFlag": 0,
        "AgeDistribution1": 25550,
        "AgeDistribution2": 0
    }
}

AgeDistribution2

float

-3.40282e+038

3.40282e+038

0

The second value, in days, in the age distribution, the meaning of which depends upon the value set in AgeDistributionFlag. The table below shows the flag value and corresponding distribution value.

AgeDistributionFlag

AgeDistribution2

0

NA, set to 0.

1

Maximum age for a uniform distribution.

2

Standard deviation in age for a Gaussian distribution.

3

NA, set to 0.

4

NA, set to 0.

5

Log (standard deviation) in age for a log normal distribution.

6

A positive value to be returned for a bimodal distribution. If the value is not positive, a value of 1 is returned.

7

Shape parameter for a Weibull distribution.

Age_Initialization_Distribution_Type in the configuration file must be set to DISTRIBUTION_SIMPLE (see Population dynamics parameters).

{
    "IndividualAttributes": {
        "AgeDistributionFlag": 0,
        "AgeDistribution1": 25550,
        "AgeDistribution2": 0
    }
}

AgeDistributionFlag

integer

0

7

3

The type of distribution to use for age. Possible values are:

  • 0 (Constant, everyone in the population is the same age.)

  • 1 (Uniform, ages are randomly drawn between a minimum and maximum value.)

  • 2 (Gaussian)

  • 3 (Exponential)

  • 4 (Poisson)

  • 5 (Log normal)

  • 6 (Bimodal)

  • 7 (Weibull)

Age_Initialization_Distribution_Type in the configuration file must be set to DISTRIBUTION_SIMPLE (see Population dynamics parameters).

{
    "IndividualAttributes": {
        "AgeDistributionFlag": 0,
        "AgeDistribution1": 25550,
        "AgeDistribution2": 0
    }
}

ImmunityDistribution1

float

-3.40282e+038

3.40282e+038

0

The first value in the immunity distribution, the meaning of which depends upon the value set in ImmunityDistributionFlag. Enable_Immunity in the configuration file must be set to 1. The table below shows the flag value and corresponding distribution value.

ImmunityDistributionFlag

ImmunityDistribution1

0

Immunity value to assign.

1

Minimum immunity for a uniform distribution.

2

Mean immunity for a Gaussian distribution.

3

Mean immunity for an exponential distribution.

4

Mean immunity for a Poisson distribution.

5

Mean immunity for a log normal distribution.

6

Proportion of time to return the value specified by ImmunityyDistribution2 for a bimodal distribution. Must be between 0 and 1.

7

Scale parameter for a Weibull distribution.

In the configuration file, Enable_Demographics_Other must be set to true (1) and Immunity_Initialization_Distribution_Type must be set to DISTRIBUTION_SIMPLE (see Immunity parameters).

{
    "IndividualAttributes": { 
        "ImmunityDistributionFlag": 0, 
        "ImmunityDistribution1": 1, 
        "ImmunityDistribution2": 0 
    }
}

ImmunityDistribution2

float

-3.40282e+038

3.40282e+038

0

The second value in the distribution, the meaning of which depends upon the value set in ImmunityDistributionFlag. Enable_Immunity in the configuration file must be set to 1. The table below shows the flag value and corresponding distribution value.

ImmunityDistributionFlag

ImmunityDistribution2

0

NA, set to 0.

1

Maximum immunity for a uniform distribution.

2

Standard deviation in immunity for a Gaussian distribution.

3

NA, set to 0.

4

NA, set to 0.

5

Log (standard deviation) in immunity for a log normal distribution.

6

A positive value to be returned for a bimodal distribution. If the value is not positive, a value of 1 is returned.

7

Shape parameter for a Weibull distribution.

In the configuration file, Enable_Demographics_Other must be set to true (1) and Immunity_Initialization_Distribution_Type must be set to DISTRIBUTION_SIMPLE (see Immunity parameters).

{
    "IndividualAttributes": { 
        "ImmunityDistributionFlag": 0, 
        "ImmunityDistribution1": 1, 
        "ImmunityDistribution2": 0 
    }
}

ImmunityDistributionFlag

integer

0

7

0

The type of distribution to use for immunity. Enable_Immunity in the configuration file must be set to 1. Possible values are:

  • 0 (Constant, everyone in the population has the same immunity.)

  • 1 (Uniform, immunity is randomly drawn between a minimum and maximum value.)

  • 2 (Gaussian)

  • 3 (Exponential)

  • 4 (Poisson)

  • 5 (Log normal)

  • 6 (Bimodal)

  • 7 (Weibull)

In the configuration file, Enable_Demographics_Other must be set to true (1) and Immunity_Initialization_Distribution_Type must be set to DISTRIBUTION_SIMPLE (see Immunity parameters).

{
    "IndividualAttributes": { 
        "ImmunityDistributionFlag": 0, 
        "ImmunityDistribution1": 1, 
        "ImmunityDistribution2": 0 
    }
}

MigrationHeterogeneityDistribution1

float

-3.40282e+38

3.40282e+38

1

The first value in the migration heterogeneity distribution, the meaning of which depends upon the value set in MigrationHeterogeneityFlag. The table below shows the flag value and corresponding distribution value.

MigrationHeterogeneityDistributionFlag

MigrationHeterogeneityDistribution1

0

Migration heterogeneity value to assign.

1

Minimum migration heterogeneity for a uniform distribution.

2

Mean migration heterogeneity for a Gaussian distribution.

3

Mean migration heterogeneity for an exponential distribution.

4

Mean migration heterogeneity for a Poisson distribution.

5

Mean migration heterogeneity for a log normal distribution.

6

Proportion of time to return the value specified by MigrationHeterogeneityDistribution2 for a bimodal distribution. Must be between 0 and 1.

7

Scale parameter for a Weibull distribution.

Enable_Migration_Heterogeneity in the configuration file must be set to 1 (see Migration parameters).

{
    "IndividualAttributes": {
        "MigrationHeterogeneityDistributionFlag": 0, 
        "MigrationHeterogeneityDistribution1": 1, 
        "MigrationHeterogeneityDistribution2": 0
    }
}

MigrationHeterogeneityDistribution2

float

-3.40282e+038

3.40282e+038

0

The second value in the distribution, the meaning of which depends upon the value set in MigrationHeterogeneityDistributionFlag. The table below shows the flag value and corresponding distribution value.

MigrationHeterogeneityDistributionFlag

MigrationHeterogeneityDistribution2

0

NA, set to 0.

1

Maximum migration heterogeneity for a uniform distribution.

2

Standard deviation in migration heterogeneity for a Gaussian distribution.

3

NA, set to 0.

4

NA, set to 0.

5

Log (standard deviation) in migration heterogeneity for a log normal distribution.

6

A positive value to be returned for a bimodal distribution. If the value is not positive, a value of 1 is returned.

7

Shape parameter for a Weibull distribution.

Enable_Migration_Heterogeneity in the configuration file must be set to 1 (see Migration parameters).

{
    "IndividualAttributes": {
        "MigrationHeterogeneityDistributionFlag": 0, 
        "MigrationHeterogeneityDistribution1": 1, 
        "MigrationHeterogeneityDistribution2": 0
    }
}

MigrationHeterogeneityDistributionFlag

integer

0

7

0

The type of distribution to use for migration heterogeneity. Possible values are:

  • 0 (Constant, everyone in the population has the same migration value.)

  • 1 (Uniform, migration values are randomly drawn between a minimum and maximum value.)

  • 2 (Gaussian)

  • 3 (Exponential)

  • 4 (Poisson)

  • 5 (Log normal)

  • 6 (Bimodal)

  • 7 (Weibull)

Enable_Migration_Heterogeneity in the configuration file must be set to 1 (see Migration parameters).

{
    "IndividualAttributes": {
        "MigrationHeterogeneityDistributionFlag": 0, 
        "MigrationHeterogeneityDistribution1": 1, 
        "MigrationHeterogeneityDistribution2": 0
    }
}

PrevalenceDistribution1

float

-3.40282e+038

3.40282e+038

1

The first value in the prevalence distribution, the meaning of which depends upon the value set in PrevalenceDistributionFlag. The table below shows the flag value and corresponding distribution value.

PrevalenceDistributionFlag

PrevalenceDistribution1

0

Prevalence value to assign.

1

Minimum prevalence for a uniform distribution.

2

Mean prevalence for a Gaussian distribution.

3

Mean prevalence for an exponential distribution.

4

Mean prevalence for a Poisson distribution.

5

Mean prevalence for a log normal distribution.

6

Proportion of time to return the value specified by PrevalenceDistribution2 for a bimodal distribution. Must be between 0 and 1.

7

Scale parameter for a Weibull distribution.

Enable_Demographics_Other must be set to 1 in the configuration file (see Population dynamics parameters).

{
    "IndividualAttributes": { 
        "PrevalenceDistributionFlag": 0, 
        "PrevalenceDistribution1": 0.0, 
        "PrevalenceDistribution2": 0.0
    }
} 

PrevalenceDistribution2

float

-3.40282e+038

3.40282e+038

0

The second value in the distribution, the meaning of which depends upon the value set in PrevalenceDistributionFlag. The table below shows the flag value and corresponding distribution value.

PrevalenceDistributionFlag

PrevalenceDistribution2

0

NA, set to 0.

1

Maximum prevalence for a uniform distribution.

2

Standard deviation in prevalence for a Gaussian distribution.

3

NA, set to 0.

4

NA, set to 0.

5

Log (standard deviation) in prevalance for a log normal distribution.

6

A positive value to be returned for a bimodal distribution. If the value is not positive, a value of 1 is returned.

7

Shape parameter for a Weibull distribution.

Enable_Demographics_Other must be set to 1 in the configuration file (see Population dynamics parameters).

{
    "IndividualAttributes": { 
        "PrevalenceDistributionFlag": 0, 
        "PrevalenceDistribution1": 0.0, 
        "PrevalenceDistribution2": 0.0
    }
} 

PrevalenceDistributionFlag

integer

0

7

0

The type of distribution to use for prevalence. Possible values are:

  • 0 (Constant, everyone in the population has the same prevalence.)

  • 1 (Uniform, prevalence is randomly drawn between a minimum and maximum value.)

  • 2 (Gaussian)

  • 3 (Exponential)

  • 4 (Poisson)

  • 5 (Log normal)

  • 6 (Bimodal)

  • 7 (Weibull)

Enable_Demographics_Other must be set to 1 in the configuration file (see Population dynamics parameters).

{
    "IndividualAttributes": { 
        "PrevalenceDistributionFlag": 0, 
        "PrevalenceDistribution1": 0.0, 
        "PrevalenceDistribution2": 0.0
    }
} 

RiskDistribution1

float

-3.40282e+038

3.40282e+038

0

The first value in the risk distribution, the meaning of which depends upon the value set in RiskDistributionFlag. The table below shows the flag value and corresponding distribution value.

RiskDistributionFlag

RiskDistribution1

0

Risk value to assign.

1

Minimum risk for a uniform distribution.

2

Mean risk for a Gaussian distribution.

3

Mean risk for an exponential distribution.

4

Mean risk for a Poisson distribution.

5

Mean risk for a log normal distribution.

6

Proportion of time to return the value specified by RiskDistribution2 for a bimodal distribution. Must be between 0 and 1.

7

Scale parameter for a Weibull distribution.

Enable_Demographics_Other must be set to 1 in the configuration file (see Population dynamics parameters).

{
    "IndividualAttributes": { 
        "RiskDistributionFlag": 0, 
        "RiskDistribution1": 1, 
        "RiskDistribution2": 0
    }
}

RiskDistribution2

float

-3.40282e+038

3.40282e+038

0

The second value in the distribution, the meaning of which depends upon the value set in RiskDistributionFlag. The table below shows the flag value and corresponding distribution value.

RiskDistributionFlag

RiskDistribution2

0

NA, set to 0.

1

Maximum risk for a uniform distribution.

2

Standard deviation in risk for a Gaussian distribution.

3

NA, set to 0.

4

NA, set to 0.

5

Log (standard deviation) in risk for a log normal distribution.

6

A positive value to be returned for a bimodal distribution. If the value is not positive, a value of 1 is returned.

7

Shape parameter for a Weibull distribution.

Enable_Demographics_Other must be set to 1 in the configuration file (see Population dynamics parameters).

{
    "IndividualAttributes": { 
        "RiskDistributionFlag": 0, 
        "RiskDistribution1": 1, 
        "RiskDistribution2": 0
    }
}

RiskDistributionFlag

integer

0

7

0

The type of distribution to use for risk. Possible values are:

  • 0 (Constant, everyone in the population has the same risk.)

  • 1 (Uniform, risk is randomly drawn between a minimum and maximum value.)

  • 2 (Gaussian)

  • 3 (Exponential)

  • 4 (Poisson)

  • 5 (Log normal)

  • 6 (Bimodal)

  • 7 (Weibull)

Enable_Demographics_Other must be set to 1 (see Population dynamics parameters).

{
    "IndividualAttributes": { 
        "RiskDistributionFlag": 0, 
        "RiskDistribution1": 1, 
        "RiskDistribution2": 0
    }
}
Complex distributions

Complex distributions are more effort to configure, but are useful for representing real-world data where the distribution does not fit a standard. Individual attribute values are drawn from a piecewise linear distribution. The distribution is configured using arrays of axes (such as gender or age) and values at points along each of these axes. This allows you to have different distributions for different groups in the population.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

AgeDistribution

JSON object

NA

NA

NA

The structure defining a complex age distribution. Age_Initialization_Distribution_Type in the configuration file must be set to DISTRIBUTION_COMPLEX.

The following example shows at age distribution in which 25% of individuals are under age 5, 50% are between 5 and 20, and 25% are between 20 and 35.

{
    "IndividualAttributes": {
        "AgeDistribution": {
            "ResultUnits": "years",
            "ResultScaleFactor": 365,
            "ResultValues": [0, 0.25, 0.75, 1],
            "DistributionValues": [0, 5, 20, 35]
        }
    }
}

AxisNames

array of strings

NA

NA

NA

An array of the names used for each axis of a complex distribution. The list below shows the axis names to use (in the order given) for each of the distribution types:

MortalityDistribution

[“gender”, “age”] Death_Rate_Dependence in the configuration file must be set to NONDISEASE_MORTALITTY_BY_AGE_AND_GENDER (see Mortality and survival parameters).

MortalityDistributionMale

[“age”, “year”] Death_Rate_Dependence must be set to NONDISEASE_MORTALITY_BY_YEAR_AND_AGE_FOR_EACH_GENDER (see Mortality and survival parameters).

MortalityDistributionFemale

[“age”, “year”] Death_Rate_Dependence must be set to NONDISEASE_MORTALITY_BY_YEAR_AND_AGE_FOR_EACH_GENDER (see Mortality and survival parameters).

FertilityDistribution

Two options are available:

  • [“urban”, “age”] Birth_Rate_Dependence in the configuratIon file must be set to INDIVIDUAL_PREGNANCIES_BY_URBAN_AND_AGE (see Population dynamics parameters).

  • [“age”, “year”] Birth_Rate_Dependence must be set to INDIVIDUAL_PREGNANCIES_BY_AGE_AND_YEAR (see Population dynamics parameters).

ImmunityDistribution

[“age”]

AgeDistribution

No axes.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": ["gender", "age"],
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0]
            ],
            "ResultUnits": "annual deaths per 1000 individuals",
            "ResultScaleFactor": 2.739726027397e-06,
            "ResultValues": [
                [0],
                [0]
            ]
        }
    }
}

AxisScaleFactors

array of floats

3.40282e+038

-3.40282e+038

1

A list of the scale factors used to convert axis units to data measurements in a complex distribution. For example, 365 to convert daily mortality to annual mortality. The array must contain one factor for each axis.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": ["gender", "age"],
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0]
            ],
            "ResultUnits": "annual deaths per 1000 individuals",
            "ResultScaleFactor": 2.739726027397e-06,
            "ResultValues": [
                [0],
                [0]
            ]
        }
    }
}

AxisUnits

array of floats

0

3.40E+3

1

An array of the scale factors to use to convert the units used for the axes into days. EMOD does not use this value; it is only informational.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": ["gender", "age"], 
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365]
        }
    }
}

DistributionValues

array of floats

0

1

1

An array of values between 0 and 1 listed in ascending order that defines a complex age distribution. Each value represents the proportion of the population below that age and the difference between two successive values is the proportion of the population in the age bin defined in ResultValues. Age_Initialization_Distribution_Type in the configuration file must be set to DISTRIBUTION_COMPLEX (see Population dynamics parameters).

The following example shows at age distribution in which 25% of individuals are under age 5, 50% are between 5 and 20, and 25% are between 20 and 35.

{
    "IndividualAttributes": {
        "AgeDistribution": {
            "ResultUnits": "years", 
            "ResultScaleFactor": 365, 
            "AxisScaleFactors": 1, 
            "DistributionValues": [0, 0.25, 0.75, 1],
            "ResultValues": [0, 5, 20, 35]
        }
    }
}

FertilityDistribution

JSON object

NA

NA

NA

The distribution of the fertility rate in the population. Enable_Birth in the configuration file must be set to 1 (see Population dynamics parameters).

{
    "IndividualAttributes": {
        "FertilityDistribution": {
            "NumDistributionAxes": 2,
            "AxisNames": ["urban", "XXX"],
            "AxisUnits": ["rural=0, urban=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 9],
            "PopulationGroups": [
                [0, 1],
                [0, 15, 20, 25, 30, 35, 40, 45, 49]
            ],
            "ResultUnits": "annual births per 1000 individuals",
            "ResultScaleFactor": 0.000002739726027397,
            "ResultValues": [
                [0, 28.4, 190.3, 222.4, 155.4, 68, 21.9, 3.6, 0],
                [0, 28.4, 190.3, 222.4, 155.4, 68, 21.9, 3.6, 0]
            ]
        }
    }
}

ImmunityDistribution

JSON object

NA

NA

NA

The structure defining a complex immunity distribution. Immunity_Initialization_Distribution_Type in the configuration file must be set to DISTRIBUTION_COMPLEX (see Immunity parameters).

{
    "IndividualAttributes": {
        "ImmunityDistribution": {
            "AxisNames": ["age"],
            "AxisUnits": ["years"],
            "AxisScaleFactors": [365],
            "NumPopulationGroups": [1],
            "PopulationGroups": [
                [0]
            ],
            "ResultScaleFactor": 3.6952,
            "ResultValues": [
                [0]
            ]
        }
    }
}

MortalityDistribution

JSON object

NA

NA

NA

The distribution of non-disease mortality for a population. Death_Rate_Dependence in the configuration file must be set to NONDISEASE_MORTALITY_BY_AGE_AND_GENDER or NONDISEASE_MORTALITY_BY_YEAR_AND_AGE_FOR_EACH_GENDER (see Mortality and survival parameters).

Warning

Mortality is sampled every 30 days. To correctly attribute neonatal deaths to days 0-30, you must indicate that the threshold for the first age group in PopulationGroups is less than 30 days.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": [
                "gender", "age"
            ],
            "AxisScaleFactors": [
                1, 1
            ],
            "NumDistributionAxes": 2,
            "NumPopulationGroups": [
                2, 4
            ],
            "PopulationGroups": [
                [
                    0, 1
                ],
                [
                    0.0, 29.99, 365, 1826
                ]
            ],
            "ResultScaleFactor": 1,
            "ResultValues": [
                [
                    0.0016, 0.000107, 6.3e-05, 100.0
                ],
                [
                    0.0016, 0.000107, 6.3e-05, 100.0
                ]
            ]
        }
    }
}

NumDistributionAxes

integer

1

NA

NA

The number of axes to use for a complex distribution. EMOD does not use this value; it is only informational.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "NumDistributionAxes": 2,
            "AxisNames": ["gender", "age"],
            "AxisScaleFactors": [1, 365]
        }
    }
}

NumPopulationGroups

array of integers

NA

NA

NA

An array of population groupings for each independent variable for a complex distribution. This variable defines the number of columns for each row in the population group table. The number of values in the array is often two, representing the values for gender and number of age bins. EMOD does not use this value; it is only informational.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": ["gender", "age"],
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0]
            ],
            "ResultUnits": "annual deaths per 1000 individuals",
            "ResultScaleFactor": 2.739726027397e-06,
            "ResultValues": [
                [0],
                [0]
            ]
        }
    }
}

PopulationGroups

matrix of integers

NA

NA

NA

An array in which each row represents one of the distribution axes and contains the values that the independent variable can take. The values must be listed in ascending order and each defines the left edge of the bin.

Warning

Mortality is sampled every 30 days. To correctly attribute neonatal deaths to days 0-30, you must indicate that the threshold for the first age group in PopulationGroups is less than 30 days.

The following example configures relatively high infant mortality and lower mortality at ages 10 and 40, with everyone dead by age 120.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": ["gender", "age"],
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0, 10, 40, 120]
            ],
            "ResultUnits": "annual deaths per 1000 individuals",
            "ResultScaleFactor": 2.739726027397e-06,
            "ResultValues": [
                [51.6, 3.7, 5.3, 1000],
                [60.1, 4.1, 4.8, 1000]
            ]
        }
    }
}

ResultScaleFactor

float

-3.40282e+038

3.40282e+038

1

The scale factor used to convert ResultUnits to number of births, deaths, or another variable per individual per day.

{
    "IndividualAttributes": {
        "AgeDistribution": {
            "AxisScaleFactors": 1, 
            "DistributionValues": [
                0.99,
                1.0
            ],
            "ResultScaleFactor": 365,
            "ResultUnits": "years",
            "ResultValues": [
                0.0027,
                0.0027
            ]
        }
    }
}

ResultUnits

string

NA

NA

NA

A string that indicates the units used for the Results parameters of a complex distribution. EMOD does not use this value; it is only informational.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0]
            ],
            "ResultUnits": "annual deaths per 1000 individuals",
            "ResultScaleFactor": 2.739726027397e-06,
            "ResultValues": [
                [0],
                [0]
            ]
        }
    }
}

ResultValues

array of floats

NA

NA

NA

An array that contains floats in the units set by ResultUnits.

For age distributions, it lists in ascending order the ages at which to bin the population. The corresponding values in DistributionValues represent the proportion of the population that is below that age. If the first member of the array is non-zero, the first bin is defined as those with that exact value (EMOD does not assume the bins start at zero).

For all other distributions, an array in which each row represents the values for a combination of axes. For example, a mortality distribution that includes both gender and age axes will have a row for males and a row for females that each contain the mortality rate at various ages set in PopulationGroups.

The following example shows an age distribution in which 10% of individuals are newborn, 25% are under age 5, 50% are between 5 and 20, and 25% are between 20 and 35.

{
    "IndividualAttributes": {
        "AgeDistribution": {
            "DistributionValues": [0.1, 0.25, 0.75, 1],
            "ResultValues": [0, 5, 20, 35]
        }
    }
}

The following example configures relatively high infant mortality and lower mortality at ages 10 and 40, with everyone dead by age 120.

{
    "IndividualAttributes": {
        "MortalityDistribution": {
            "AxisNames": ["gender", "age"],
            "AxisUnits": ["male=0,female=1", "years"],
            "AxisScaleFactors": [1, 365],
            "NumPopulationGroups": [2, 1],
            "PopulationGroups": [
                [0, 1],
                [0, 10, 40, 120]
            ],
            "ResultUnits": "annual deaths per 1000 individuals",
            "ResultScaleFactor": 2.739726027397e-06,
            "ResultValues": [
                [51.6, 3.7, 5.3, 1000],
                [60.1, 4.1, 4.8, 1000]
            ]
        }
    }
}
Configuration parameters

The parameters described in this reference section can be added to the JavaScript Object Notation (JSON) formatted configuration file to determine the core behavior of a simulation including the computing environment, functionality to enable, additional files to use, and characteristics of the disease being modeled. This file contains mostly a flat list of JSON key:value pairs. For more information on how to use these files, see Create a configuration file.

The tables below contain only parameters available when using the generic simulation type. Some parameters may appear in multiple categories.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

Enable or disable features

The following parameters enable or disable features of the model, such as allowing births, deaths, or aging. Set to false (0) to disable; set to true (1) to enable.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Enable_Aging

boolean

0

1

1

Controls whether or not individuals in a population age during the simulation. Enable_Vital_Dynamics must be set to true (1).

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Aging": 1
}

Enable_Air_Migration

boolean

0

1

0

Controls whether or not migration by air travel will occur. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
     "Migration_Model": "FIXED_RATE_MIGRATION",
     "Enable_Air_Migration": 1,
     "Air_Migration_Filename": "../inputs/air_migration.bin"
}

Enable_Birth

boolean

0

1

1

Controls whether or not individuals will be added to the simulation by birth. Enable_Vital_Dynamics must be set to true (1). If you want new individuals to have the same intervention coverage as existing individuals, you must add a BirthTriggeredIV to the campaign file.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1
}

Enable_Climate_Stochasticity

boolean

0

1

0

Controls whether or not the climate has stochasticity. Climate_Model must be set to CLIMATE_CONSTANT or CLIMATE_BY_DATA. Set the variance using the parameters Air_Temperature_Variance, Land_Temperature_Variance, Enable_Rainfall_Stochasticity, and Relative_Humidity_Variance.

{
    "Climate_Model": "CLIMATE_BY_DATA",
    "Enable_Climate_Stochasticity": 1, 
    "Air_Temperature_Variance": 2,
    "Enable_Rainfall_Stochasticity": 1,
    "Land_Temperature_Variance": 2,
    "Relative_Humidity_Variance": 0.05
}

Enable_Default_Reporting

boolean

0

1

1

Controls whether or not the default InsetChart.json report is created.

{
    "Enable_Default_Reporting": 1
}

Enable_Demographics_Birth

boolean

0

1

0

Controls whether or not newborns have identical or heterogeneous characteristics. Set to false (0) to give all newborns identical characteristics; set to true (1) to allow for heterogeneity in traits such as sickle-cell status. Enable_Birth must be set to true (1).

{
    "Enable_Birth": 1,
    "Enable_Demographics_Birth": 1
}

Enable_Demographics_Builtin

boolean

0

1

0

Controls whether or not built-in demographics for default geography will be used. Note that the built-in demographics feature does not represent a real geographical location and is mostly used for testing. Set to true (1) to define the initial population and number of nodes using Default_Geography_Initial_Node_Population and Default_Geography_Torus_Size. Set to false (0) to use demographics input files defined in Demographics_Filenames.

{
    "Enable_Demographics_Builtin": 1,
    "Default_Geography_Initial_Node_Population": 1000,
    "Default_Geography_Torus_Size": 3
}

Enable_Demographics_Gender

boolean

0

1

1

Controls whether or not gender ratios are drawn from a Gaussian or 50/50 draw. Set to true (1) to create gender ratios drawn from a male/female ratio that is randomly smeared by a Gaussian of width 1%; set to false (0) to assign a gender ratio based on a 50/50 draw.

{
    "Enable_Demographics_Gender": 1
}

Enable_Demographics_Other

boolean

0

1

0

Controls whether or not other demographic factors are included in the simulation, such as the fraction of individuals above poverty, urban/rural characteristics, heterogeneous initial immunity, or risk. These factors are set in the demographics file.

{
    "Enable_Demographics_Other": 1
}

Enable_Demographics_Reporting

boolean

0

1

1

Controls whether or not demographic summary data and age-binned reports are outputted to file.

{
    "Enable_Demographics_Reporting": 1
}

Enable_Disease_Mortality

boolean

0

1

1

Controls whether or not individuals die due to disease.

{
    "Enable_Disease_Mortality": 1
}

Enable_Family_Migration

boolean

0

1

0

Controls whether or not all members of a household can migrate together. All residents must be home before they can leave on the trip. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Enable_Migration": "FIXED_RATE_MIGRATION",
    "Enable_Family_Migration": 1,
    "Family_Migration_Filename": "../inputs/family_migration.bin"
}

Enable_Heterogeneous_Intranode_Transmission

boolean

0

1

0

Controls whether or not individuals experience heterogeneous disease transmission within a node. When set to true (1), individual property definitions and the \(\beta\) matrix must be specified in the demographics file (see NodeProperties and IndividualProperties parameters). The \(\beta\) values are multiplied with the \(\beta\) 0 value configured by Base_Infectivity.

This is used only in generic simulations, but must be set to false (0) for all other simulation types. Heterogeneous transmission for other diseases uses other mechanistic parameters included with the simulation type.

{
    "Enable_Heterogeneous_Intranode_Transmission": 1
}

Enable_Immune_Decay

boolean

0

1

1

Controls whether or not immunity decays after an infection clears. Set to true (1) if immunity decays; set to false (0) if recovery from the disease confers complete immunity for life. Enable_Immunity must be set to true (1).

{
    "Enable_Immunity": 1,
    "Enable_Immune_Decay": 0
}

Enable_Immunity

boolean

0

1

1

Controls whether or not an individual has protective immunity after an infection clears.

{
    "Enable_Immunity": 1
}

Enable_Interventions

boolean

0

1

0

Controls whether or not campaign interventions will be used in the simulation. Set Campaign_Filename to the path of the file that contains the campaign interventions.

{
    "Enable_Interventions": 1,
    "Campaign_Filename": "campaign.json"
}

Enable_Local_Migration

boolean

0

1

0

Controls whether or not local migration (the diffusion of people in and out of nearby nodes by foot travel) occurs. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Local_Migration": 1,
    "Local_Migration_Filename": "../inputs/local_migration.bin"
}

Enable_Maternal_Transmission

boolean

0

1

0

Controls whether or not infectious mothers infect infants at birth. Enable_Birth must be set to true (1).

{
    "Enable_Birth": 1,
    "Enable_Maternal_Transmission": 1
}

Enable_Migration_Heterogeneity

boolean

0

1

1

Controls whether or not migration rate is heterogeneous among individuals. Set to true (1) to use a migration rate distribution in the demographics file (see NodeAttributes parameters); set to false (0) to use the same migration rate applied to all individuals. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Migration_Heterogeneity": 1
}

Enable_Property_Output

boolean

0

1

0

Controls whether or not to create property output reports, which detail groups as defined in IndividualProperties in the demographics file (see NodeProperties and IndividualProperties parameters). When there is more than one property type, the report will display the channel information for all combinations of the property type groups.

{
    "Enable_Property_Output": 1
}

Enable_Rainfall_Stochasticity

boolean

0

1

1

Controls whether or not there is stochastic variation in rainfall; set to true (1) for stochastic variation of rainfall that is drawn from an exponential distribution (with a mean value as the daily rainfall from the Climate_Model values CLIMATE_CONSTANT or CLIMATE_BY_DATA), or set to false (0) to disable rainfall stochasticity.

{
    "Enable_Climate_Stochasticity": 1, 
    "Air_Temperature_Variance": 2,
    "Enable_Rainfall_Stochasticity": 1,
    "Land_Temperature_Variance": 2,
    "Relative_Humidity_Variance": 0.05
}

Enable_Regional_Migration

boolean

0

1

0

Controls whether or not there is migration by road vehicle into and out of nodes in the road network. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Regional_Migration": 1,
    "Regional_Migration_Filename": "../inputs/regional_migration.bin"
}

Enable_Sea_Migration

boolean

0

1

0

Controls whether or not there is migration on ships into and out of coastal cities with seaports. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Sea_Migration": 1,
    "Sea_Migration_Filename": "../inputs/sea_migration.bin"
}

Enable_Spatial_Output

boolean

0

1

0

Controls whether or not spatial output reports are created. If set to true (1), spatial output reports include all channels listed in the parameter Spatial_Output_Channels.

Note

Spatial output files require significant processing time and disk space.

{
    "Enable_Spatial_Output": 1,
    "Spatial_Output_Channels": [
        "Prevalence",
        "New_Infections"
    ]
}

Enable_Superinfection

boolean

0

1

0

Controls whether or not an individual can have multiple infections simultaneously. Set to true (1) to allow for multiple simultaneous infections; set to false (0) if multiple infections are not possible. Set the Max_Individual_Infections parameter.

{
    "Enable_Superinfection": 1,
    "Max_Individual_Infections": 2
}

Enable_Vital_Dynamics

boolean

0

1

1

Controls whether or not births and deaths occur in the simulation. Births and deaths must be individually enabled and set.

{
    "Enable_Vital_Dynamics":1,
    "Enable_Birth": 1,
    "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF",
    "Base_Mortality": 0.002
}
General disease

The following parameters determine general disease characteristics.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Animal_Reservoir_Type

enum

NA

NA

NO_ZOONOSIS

The type of animal reservoir and configuration for zoonosis. Use of the animal reservoir sets a low constant baseline of infectivity beyond what is present in the human population. It allows a more random introduction of cases in continuous time, which is more applicable for various situations such as zoonosis. Possible values are:

NO_ZOONOSIS

There is no animal reservoir.

CONSTANT_ZOONOSIS

The daily rate of zoonotic infection is configured by the parameter Zoonosis_Rate.

ZOONOSIS_FROM_DEMOGRAPHICS

The zoonosis rate is scaled first by the node-specific Zoonosis value in the demographics file (see NodeAttributes parameters). If Zoonosis is not configured, the simulation will then use the value for Zoonosis_Rate.

{
    "Animal_Reservoir_Type": "CONSTANT_ZOONOSIS"
}

Number_Basestrains

integer

1

10

1

The number of base strains in the simulation, such as antigenic variants.

{
    "Number_Basestrains": 1
}

Number_Substrains

integer

1

16777200

256

The number of disease substrains for each base strain, such as genetic variants.

{
    "Number_Substrains": 16777216
}

Zoonosis_Rate

float

0

1

0

The daily rate of zoonotic infection per individual. Animal_Reservoir_Type must be set to CONSTANT_ZOONOSIS or ZOONOSIS_FROM_DEMOGRAPHICS. If Animal_Reservoir_Type is set to ZOONOSIS_FROM_DEMOGRAPHICS, the value for the Zoonosis NodeAttribute in the demographics file will override the value set for Zoonosis_Rate.

{
    "Zoonosis_Rate": 0.005
}
Geography and environment

The following parameters determine characteristics of the geography and environment of the simulation. For example, how to use the temperature or rainfall data in the climate files and the size of the nodes in the simulation.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Air_Temperature_Filename

string

NA

NA

air_temp.json

The path to the input data file that defines air temperature data measured two meters above ground. Climate_Model must be set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Climate_Model": "CLIMATE_BY_DATA",
    "Air_Temperature_Filename": "Namawala_single_node_air_temperature_daily.bin"
}

Air_Temperature_Offset

float

-20

20

0

The linear shift of air temperature in degrees Celsius. Climate_Model must be set to CLIMATE_BY_DATA.

{
    "Air_Temperature_Offset": 1
}

Air_Temperature_Variance

float

0

5

2

The standard deviation (in degrees Celsius) for normally distributed noise applied to the daily air temperature values when Climate_Model is configured as CLIMATE_CONSTANT or CLIMATE_BY_DATA. Enable_Climate_Stochasticity must be set to true (1).

{
    "Enable_Climate_Stochasticity": 1, 
    "Air_Temperature_Variance": 2,
}

Base_Air_Temperature

float

-55

45

22

The air temperature, in degrees Celsius, where Climate_Model is set to CLIMATE_CONSTANT.

{
    "Climate_Model": "CLIMATE_CONSTANT",
    "Base_Air_Temperature": 30
}

Base_Land_Temperature

float

-55

60

26

The land temperature, in degrees Celsius, where Climate_Model is set to CLIMATE_CONSTANT.

{
    "Climate_Model": "CLIMATE_CONSTANT",
    "Base_Land_Temperature": 20
}

Base_Rainfall

float

0

150

10

The value of rainfall per day in millimeters when Climate_Model is set to CLIMATE_CONSTANT.

{ 
     "Climate_Model": "CLIMATE_CONSTANT", 
     "Base_Rainfall": 20
}

Base_Relative_Humidity

float

0

1

0.75

The value of humidity where Climate_Model is set to CLIMATE_CONSTANT.

{ 
    "Base_Relative_Humidity": 0.1
}

Climate_Model

enum

NA

NA

CLIMATE_OFF

How and from what files the climate of a simulation is configured. The possible values are:

CLIMATE_OFF

No climate files used.

CLIMATE_CONSTANT

Uses the conditional parameters that give the fixed values of temperature or rain for land temperature, air temperature, rainfall, and humidity.

CLIMATE_KOPPEN

Uses an input data file that decodes Koppen codes by geographic location.

CLIMATE_BY_DATA

Reads everything out of several input data files with additional parameters that allow the addition of stochasticity or scale offsets.

{   
    "Climate_Model": "CLIMATE_CONSTANT"
}

Climate_Update_Resolution

enum

NA

NA

CLIMATE_UPDATE_YEAR

The resolution of data in climate files. Climate_Model must be set to CLIMATE_CONSTANT, CLIMATE_BY_DATA, or CLIMATE_KOPPEN. Possible values are:

CLIMATE_UPDATE_YEAR CLIMATE_UPDATE_MONTH CLIMATE_UPDATE_WEEK CLIMATE_UPDATE_DAY CLIMATE_UPDATE_HOUR

{
    "Climate_Update_Resolution": "CLIMATE_UPDATE_DAY"
}

Default_Geography_Initial_Node_Population

integer

0

1000000

1000

When using the built-in demographics for default geography, the initial number of individuals in each node. Note that the built-in demographics feature does not represent a real geographical location and is mostly used for testing. Enable_Demographics_Builtin must be set to true (1).

{
    "Enable_Demographics_Builtin": 1,
    "Default_Geography_Initial_Node_Population": 1000,
    "Default_Geography_Torus_Size": 3
}

Default_Geography_Torus_Size

integer

3

100

10

When using the built-in demographics for default geography, the square root of the number of nodes in the simulation. The simulation uses an N x N square grid of nodes with N specified by this parameter. If migration is enabled, the N x N nodes are assumed to be a torus and individuals can migrate from any node to all four adjacent nodes.

To enable migration, set Migration_Model to FIXED_RATE_MIGRATION. Built-in migration is a form of “local” migration where individuals only migrate to the adjacent nodes. You can use the x_Local_Migration parameter to control the rate of migration. The other migration parameters are ignored. Note that the built-in demographics feature does not represent a real geographical location and is mostly used for testing.

Enable_Demographics_Builtin must be set to true (1).

{
    "Enable_Demographics_Builtin": 1,
    "Default_Geography_Initial_Node_Population": 1000,
    "Default_Geography_Torus_Size": 3
}

Enable_Climate_Stochasticity

boolean

0

1

0

Controls whether or not the climate has stochasticity. Climate_Model must be set to CLIMATE_CONSTANT or CLIMATE_BY_DATA. Set the variance using the parameters Air_Temperature_Variance, Land_Temperature_Variance, Enable_Rainfall_Stochasticity, and Relative_Humidity_Variance.

{
    "Climate_Model": "CLIMATE_BY_DATA",
    "Enable_Climate_Stochasticity": 1, 
    "Air_Temperature_Variance": 2,
    "Enable_Rainfall_Stochasticity": 1,
    "Land_Temperature_Variance": 2,
    "Relative_Humidity_Variance": 0.05
}

Enable_Rainfall_Stochasticity

boolean

0

1

1

Controls whether or not there is stochastic variation in rainfall; set to true (1) for stochastic variation of rainfall that is drawn from an exponential distribution (with a mean value as the daily rainfall from the Climate_Model values CLIMATE_CONSTANT or CLIMATE_BY_DATA), or set to false (0) to disable rainfall stochasticity.

{
    "Enable_Climate_Stochasticity": 1, 
    "Air_Temperature_Variance": 2,
    "Enable_Rainfall_Stochasticity": 1,
    "Land_Temperature_Variance": 2,
    "Relative_Humidity_Variance": 0.05
}

Koppen_Filename

string

NA

NA

UNINITIALIZED STRING

The path to the input file used to specify Koppen climate classifications; only used when Climate_Model is set to CLIMATE_KOPPEN. The file must be in .dat format.

{
    "Koppen_Filename": "Mad_2_5arcminute_koppen.dat"
}

Land_Temperature_Filename

string

NA

NA

land_temp.json

The path of the input file defining temperature data measured at land surface; used only when Climate_Model is set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Land_Temperature_Filename": "Namawala_single_node_land_temperature_daily.bin"
}

Land_Temperature_Offset

float

-20

20

0

The linear shift of land surface temperature in degrees Celsius; only used when Climate_Model is set to CLIMATE_BY_DATA.

{
    "Land_Temperature_Offset": 0
}

Land_Temperature_Variance

float

0

7

2

The standard deviation (in degrees Celsius) for normally distributed noise applied to the daily land temperature values when Climate_Model is configured to CLIMATE_CONSTANT or CLIMATE_BY_DATA; only used if the Enable_Climate_Stochasticity is set to true (1).

{
    "Land_Temperature_Variance": 1.5
}

Node_Grid_Size

float

0.00416

90

0.004167

The spatial resolution indicating the node grid size for a simulation in degrees.

{
    "Node_Grid_Size": 0.042
}

Rainfall_Filename

string

NA

NA

rainfall.json

The path of the input file which defines rainfall data. Climate_Model must be set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Rainfall_Filename": "Namawala_single_node_rainfall_daily.bin"
}

Rainfall_Scale_Factor

float

0.1

10

1

The scale factor used in multiplying rainfall value(s). Climate_Model must be set to CLIMATE_BY_DATA.

{
    "Rainfall_Scale_Factor": 1
}

Relative_Humidity_Filename

string

NA

NA

rel_hum.json

The path of the input file which defines relative humidity data measured 2 meters above ground. Climate_Model must be set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Relative_Humidity_Filename": "Namawala_single_node_relative_humidity_daily.bin"
}

Relative_Humidity_Scale_Factor

float

0.1

10

1

The scale factor used in multiplying relative humidity values. Climate_Model must be set to CLIMATE_BY_DATA.

{
    "Relative_Humidity_Scale_Factor": 1
}

Relative_Humidity_Variance

float

0

0.12

0.05

The standard deviation (in percentage) for normally distributed noise applied to the daily relative humidity values when Climate_Model is configured as CLIMATE_CONSTANT or CLIMATE_BY_DATA. Enable_Climate_Stochasticity must be set to true (1).

{
    "Relative_Humidity_Variance": 0.05
}
Immunity

The following parameters determine the immune system response for the disease being modeled, including waning immunity after an infection clears.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Acquisition_Blocking_Immunity_Decay_Rate

float

0

1000

0.001

The rate at which acquisition-blocking immunity decays after the initial period indicated by the base acquisition-blocking immunity offset. Only used when Enable_Immunity and Enable_Immune_Decay parameters are set to true (1).

{
    "Acquisition_Blocking_Immunity_Decay_Rate": 0.05
}

Acquisition_Blocking_Immunity_Duration_Before_Decay

float

0

45000

0

The number of days after infection until acquisition-blocking immunity begins to decay. Enable_Immunity and Enable_Immune_Decay must be set to true (1).

{
    "Acquisition_Blocking_Immunity_Duration_Before_Decay": 10
}

Enable_Immune_Decay

boolean

0

1

1

Controls whether or not immunity decays after an infection clears. Set to true (1) if immunity decays; set to false (0) if recovery from the disease confers complete immunity for life. Enable_Immunity must be set to true (1).

{
    "Enable_Immunity": 1,
    "Enable_Immune_Decay": 0
}

Enable_Immunity

boolean

0

1

1

Controls whether or not an individual has protective immunity after an infection clears.

{
    "Enable_Immunity": 1
}

Immune_Threshold_For_Downsampling

float

0

1

0

Threshold on acquisition immunity at which to apply immunity dependent downsampling. Individual_Sampling_Type must set to ADAPTED_SAMPLING_BY_IMMUNE_STATE.

{
    "Individual_Sampling_Type": "ADAPTED_SAMPLING_BY_IMMUNE_STATE", 
    "Immune_Threshold_For_Downsampling": 0.5
}

Immunity_Acquisition_Factor

float

0

1000

0

The multiplicative reduction in the probability of reacquiring disease. Only used when Enable_Immunity and Enable_Immune_Decay are set to 1.

{
    "Enable_Immunity": 1,
    "Enable_Immune_Decay": 1,
    "Immunity_Acquisition_Factor": 0.9
}

Immunity_Initialization_Distribution_Type

enum

NA

NA

DISTRIBUTION_OFF

The method for initializing the immunity distribution in the simulated population. Enable_Immunity must be set to true (1). Possible values are:

DISTRIBUTION_OFF

All individuals default to no immunity.

DISTRIBUTION_SIMPLE

Individual immunities are drawn from a distribution whose functional form and parameters are specified in the demographics file in IndividualAttributes using ImmunityDistributionFlag, ImmunityDistribution1, and ImmunityDistribution2 (see Simple distributions parameters).

DISTRIBUTION_COMPLEX

Individual immunities are drawn from an age-dependent piecewise linear function for each specific antibody in the demographics file (see Complex distributions parameters).

{
    "Immunity_Initialization_Distribution_Type": "DISTRIBUTION_COMPLEX" 
}

Immunity_Mortality_Factor

float

0

1000

0

The multiplicative reduction in the probability of dying from infection after getting re-infected. Enable_Immunity and Enable_Immune_Decay must be set to true (1).

{
    "Enable_Immunity": 1,
    "Enable_Immune_Decay": 1, 
    "Immunity_Mortality_Factor": 0.5
}

Immunity_Transmission_Factor

float

0

1000

0

The multiplicative reduction in the probability of transmitting infection after getting re-infected. Only used when Enable_Immunity and Enable_Immune_Decay are set to 1.

{
    "Enable_Immunity": 1,
    "Enable_Immunity_Decay": 1, 
    "Immunity_Transmission_Factor": 0.9
}

Mortality_Blocking_Immunity_Decay_Rate

float

0

1000

0.001

The rate at which mortality-blocking immunity decays after the mortality-blocking immunity offset period. Enable_Immune_Decay must be set to 1.

{
    "Mortality_Blocking_Immunity_Decay_Rate": 0.1
}

Mortality_Blocking_Immunity_Duration_Before_Decay

float

0

45000

0

The number of days after infection until mortality-blocking immunity begins to decay. Enable_Immunity and Enable_Immune_Decay must be set to 1.

{
    "Mortality_Blocking_Immunity_Duration_Before_Decay": 270
}

Transmission_Blocking_Immunity_Decay_Rate

float

0

1000

0.001

The rate at which transmission-blocking immunity decays after the base transmission-blocking immunity offset period. Used only when Enable_Immunity and Enable_Immune_Decay parameters are set to true (1).

{
    "Transmission_Blocking_Immunity_Decay_Rate": 0.01
}

Transmission_Blocking_Immunity_Duration_Before_Decay

float

0

45000

0

The number of days after infection until transmission-blocking immunity begins to decay. Only used when Enable_Immunity and Enable_Immune_Decay parameters are set to true (1).

{
    "Transmission_Blocking_Immunity_Duration_Before_Decay": 90
}

Incubation

The following parameters determine the characteristics of the incubation period.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Base_Incubation_Period

float

0

3.40E+38

6

Average duration, in days, of the incubation period before infected individuals become infectious. Incubation_Period_Distribution must be set to either FIXED_DURATION or EXPONENTIAL_DURATION.

{
    "Incubation_Period_Distribution": "EXPONENTIAL_DURATION",
    "Base_Incubation_Period": 1
}

Incubation_Period_Distribution

enum

NA

NA

NOT_INITIALIZED

The distribution for the duration of the incubation period. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

Base_Incubation_Period is the constant duration incubation period.

UNIFORM_DURATION

Incubation_Period_Min and Incubation_Period_Max define the ranges of a uniform random draw for the duration of the incubation period.

GAUSSIAN_DURATION

Incubation_Period_Mean and Incubation_Period_Std_Dev define the mean and standard deviation of the Gaussian from which the incubation period is drawn. Negative values are truncated at zero.

EXPONENTIAL_DURATION

Base_Incubation_Period is the mean of the exponential random draw.

POISSON_DURATION

Incubation_Period_Mean is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

Incubation_Period_Log_Mean is the mean of log normal and Incubation_Period_Log_Width is the log width of log normal.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of Base_Incubation_Period for a specified period of time and equal to Base_Incubation_Period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Base_Incubation_Period": 5,
    "Incubation_Period_Distribution": "EXPONENTIAL_DURATION"
}

Incubation_Period_Log_Mean

float

0

3.40E+38

6

The mean of log normal for the incubation period distribution. Incubation_Period_Distribution must be set to LOG_NORMAL_DURATION.

{
    "Incubation_Period_Distribution": "LOG_NORMAL_DURATION",
    "Incubation_Period_Log_Mean": 5.758,
    "Incubation_Period_Log_Width": 0.27
}

Incubation_Period_Log_Width

float

0

3.40E+38

1

The log width of log normal for the incubation period distribution. Incubation_Period_Distribution must be set to LOG_NORMAL_DURATION.

{
    "Incubation_Period_Distribution": "LOG_NORMAL_DURATION",
    "Incubation_Period_Log_Mean": 5.758,
    "Incubation_Period_Log_Width": 0.27
}

Incubation_Period_Max

float

0.6

3.40E+38

0

The maximum length of the incubation period. Incubation_Period_Distribution must be set to UNIFORM_DURATION.

{
    "Incubation_Period_Distribution": "UNIFORM_DURATION",
    "Incubation_Period_Min": 2,
    "Incubation_Period_Max": 6
}

Incubation_Period_Mean

float

0

3.40E+38

6

The mean of the incubation period. Incubation_Period_Distribution must be set to either GAUSSIAN_DURATION or POISSON_DURATION.

{
    "Incubation_Period_Distribution": "GAUSSIAN_DURATION",
    "Incubation_Period_Mean": 7,
    "Infectious_Period_Std_Dev": 2
}

Incubation_Period_Min

float

0

3.40E+38

0

The minimum length of the incubation period. Incubation_Period_Distribution must be set to UNIFORM_DURATION.

{
    "Incubation_Period_Distribution": "UNIFORM_DURATION",
    "Incubation_Period_Min": 2,
    "Incubation_Period_Max": 6
}

Incubation_Period_Std_Dev

float

0

3.40E+38

1

The standard deviation incubation period. Incubation_Period_Distribution must be set to GAUSSIAN_DURATION.

{
    "Incubation_Period_Distribution": "GAUSSIAN_DURATION",
    "Incubation_Period_Mean": 7,
    "Infectious_Period_Std_Dev": 2
}
Infectivity and transmission

The following parameters determine aspects of infectivity and disease transmission. For example, how infectious individuals are and the length of time for which they remain infectious, whether the disease can be maternally transmitted, and how population density affects infectivity.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Base_Infectious_Period

float

0

3.40E+38

6

Average duration, in days, of the infectious period before the infection is cleared. Infectious_Period_Distribution must be set to either FIXED_DURATION or EXPONENTIAL_DURATION.

{
    "Base_Infectious_Period": 4
}

Base_Infectivity

float

0

1000

0.3

The base infectiousness of individuals before accounting for transmission-blocking effects of acquired immunity and/or campaign interventions.

For generic simulations, this is the average number of individuals per time step who will be exposed to infection by one infectious individual. In the case of super-infection, the infectiousness is summed over all infections.

{
    "Base_Infectivity": 0.5
}

Enable_Heterogeneous_Intranode_Transmission

boolean

0

1

0

Controls whether or not individuals experience heterogeneous disease transmission within a node. When set to true (1), individual property definitions and the \(\beta\) matrix must be specified in the demographics file (see NodeProperties and IndividualProperties parameters). The \(\beta\) values are multiplied with the \(\beta\) 0 value configured by Base_Infectivity.

This is used only in generic simulations, but must be set to false (0) for all other simulation types. Heterogeneous transmission for other diseases uses other mechanistic parameters included with the simulation type.

{
    "Enable_Heterogeneous_Intranode_Transmission": 1
}

Enable_Maternal_Transmission

boolean

0

1

0

Controls whether or not infectious mothers infect infants at birth. Enable_Birth must be set to true (1).

{
    "Enable_Birth": 1,
    "Enable_Maternal_Transmission": 1
}

Enable_Superinfection

boolean

0

1

0

Controls whether or not an individual can have multiple infections simultaneously. Set to true (1) to allow for multiple simultaneous infections; set to false (0) if multiple infections are not possible. Set the Max_Individual_Infections parameter.

{
    "Enable_Superinfection": 1,
    "Max_Individual_Infections": 2
}

Infection_Updates_Per_Timestep

integer

0

144

1

The number of infection updates executed during each timestep; note that a timestep defaults to one day.

{
    "Infection_Updates_Per_Timestep": 1
}	

Infectious_Period_Distribution

enum

NA

NA

NOT_INITIALIZED

The distribution of the duration of the infectious period.

Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

Base_Infectious_Period is the constant-duration infectious period.

UNIFORM_DURATION

Infectious_Period_Min and Infectious_Period_Max define the ranges of a uniform random draw for the duration of the infectious period.

GAUSSIAN_DURATION

Infectious_Period_Mean and Infectious_Period_Std_Dev define the mean and standard deviation of the Gaussian from which the infectious period is drawn. Negative values are truncated at zero.

EXPONENTIAL_DURATION

Base_Infectious_Period is the mean of the exponential random draw.

POISSON_DURATION

Infectious_Period_Mean is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The duration is a log normal distribution defined by a specified mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of Base_Incubation_Period for a specified period of time and equal to Base_Incubation_Period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Infectious_Period_Distribution": "EXPONENTIAL_DURATION" 
    
}	

Infectious_Period_Max

float

0.6

3.40E+38

0

The maximum length of the infectious period; used when Infectious_Period_Distribution is set to UNIFORM_DURATION.

{
    "Infectious_Period_Distribution": "UNIFORM_DURATION", 
    "Infectious_Period_Max": 15, 
    "Infectious_Period_Min": 5
}

Infectious_Period_Mean

float

0

3.40E+38

6

The mean of the infectious period; used when Infectious_Period_Distribution is set to either GAUSSIAN_DURATION or POISSON_DURATION.

{
    "Infectious_Period_Distribution": "GAUSSIAN_DURATION", 
    "Infectious_Period_Mean": 12, 
    "Infectious_Period_Std_Dev": 10
}

Infectious_Period_Min

float

0

3.40E+38

0

The minimum length of the infectious period; used when Infectious_Period_Distribution is set to UNIFORM_DURATION.

{
    "Infectious_Period_Distribution": "UNIFORM_DURATION", 
    "Infectious_Period_Max": 15, 
    "Infectious_Period_Min": 5
}			

Infectious_Period_Std_Dev

float

0

3.40E+38

1

The standard deviation of the infectious period; used when Infectious_Period_Distribution is set to GAUSSIAN_DURATION.

{
    "Infectious_Period_Distribution": "GAUSSIAN_DURATION", 
    "Infectious_Period_Mean": 12, 
    "Infectious_Period_Std_Dev": 10
}

Infectivity_Boxcar_Forcing_Amplitude

float

0

3.40E+38

0

The fractional increase in R0 during the high-infectivity season when Infectivity_Scale_Type is equal to ANNUAL_BOXCAR_FUNCTION.

{
    "Infectivity_Boxcar_Forcing_Amplitude": 0.25, 
    "Infectivity_Boxcar_Forcing_End_Time": 270, 
    "Infectivity_Boxcar_Forcing_Start_Time": 90, 
    "Infectivity_Scale_Type": "ANNUAL_BOXCAR_FUNCTION"
}		

Infectivity_Boxcar_Forcing_End_Time

float

0

365

0

The end of the high-infectivity season when Infectivity_Scale_Type is equal to ANNUAL_BOXCAR_FUNCTION.

{
    "Infectivity_Boxcar_Forcing_Amplitude": 0.25, 
    "Infectivity_Boxcar_Forcing_End_Time": 270, 
    "Infectivity_Boxcar_Forcing_Start_Time": 90, 
    "Infectivity_Scale_Type": "ANNUAL_BOXCAR_FUNCTION"
}		

Infectivity_Boxcar_Forcing_Start_Time

float

0

365

0

The beginning of the high-infectivity season, in days, when Infectivity_Scale_Type is equal to ANNUAL_BOXCAR_FUNCTION.

{
    "Infectivity_Boxcar_Forcing_Amplitude": 0.25, 
    "Infectivity_Boxcar_Forcing_End_Time": 270, 
    "Infectivity_Boxcar_Forcing_Start_Time": 90, 
    "Infectivity_Scale_Type": "ANNUAL_BOXCAR_FUNCTION"
}		

Infectivity_Exponential_Baseline

float

0

1

0

The scale factor applied to Base_Infectivity at the beginning of a simulation, before the infectivity begins to grow exponentially. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Baseline": 0.1, 
    "Infectivity_Exponential_Delay": 90, 
    "Infectivity_Exponential_Rate": 45, 
    "Infectivity_Scale_Type": "EXPONENTIAL_FUNCTION_OF_TIME"
}

Infectivity_Exponential_Delay

float

0

3.40E+38

0

The number of days before infectivity begins to ramp up exponentially. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Baseline": 0.1, 
    "Infectivity_Exponential_Delay": 90, 
    "Infectivity_Exponential_Rate": 45, 
    "Infectivity_Scale_Type": "EXPONENTIAL_FUNCTION_OF_TIME"
}

Infectivity_Exponential_Rate

float

0

3.40E+38

0

The daily rate of exponential growth to approach to full infectivity after the delay set by Infectivity_Exponential_Delay has passed. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Rate": 45
}

Infectivity_Scale_Type

enum

NA

NA

CONSTANT_INFECTIVITY

A scale factor that allows infectivity to be altered by time or season. Possible values are:

CONSTANT_INFECTIVITY

No infectivity correction is applied.

FUNCTION_OF_TIME_AND_LATITUDE

Infectivity is corrected for approximate seasonal forcing. The use of a seasonal infectivity correction is a proxy for the effects of varying climate. From October through March, infectivity increases in the Northern Hemisphere and decreases in the Southern Hemisphere. From April through September, the trend reverses: regions closer to the equator have reduced forcing compared to temperate regions.

FUNCTION_OF_CLIMATE

Allows infectivity to be modulated by weather directly, for example, relative humidity in airborne simulations or rainfall in waterborne simulations. There is no default climate dependence enabled for generic simulations.

EXPONENTIAL_FUNCTION_OF_TIME

To facilitate certain burn-in scenarios, infectivity ramps up from zero at the beginning of the simulation according to the functional form, 1-exp(-rate*time), where the rate is specified by the parameter Infectivity_Scaling_Rate.

SINUSOIDAL_FUNCTION_OF_TIME

Allows infectivity to be time-dependent, following a sinusoidal shape.

ANNUAL_BOXCAR_FUNCTION

Allows infectivity to follow a boxcar function, such that it will be equal to zero for an entire time period (e.g. year) except for a single interval in which it is equal to a constant.

{
    "Infectivity_Scale_Type": "FUNCTION_OF_CLIMATE"
}

Infectivity_Sinusoidal_Forcing_Amplitude

float

0

1

0

Sets the amplitude of sinusoidal variations in Base_Infectivity. Only used when Infectivity_Scale_Type is set to SINUSOIDAL_FUNCTION_OF_TIME.

{
    "Infectivity_Scale_Type": "SINUSOIDAL_FUNCTION_OF_TIME", 
    "Infectivity_Sinusoidal_Forcing_Amplitude": 0.1, 
    "Infectivity_Sinusoidal_Forcing_Phase": 0
}	

Infectivity_Sinusoidal_Forcing_Phase

float

0

365

0

Sets the phase of sinusoidal variations in Base_Infectivity. Only used when Infectivity_Scale_Type is set to SINUSOIDAL_FUNCTION_OF_TIME.

{
    "Infectivity_Scale_Type": "SINUSOIDAL_FUNCTION_OF_TIME", 
    "Infectivity_Sinusoidal_Forcing_Amplitude": 0.1, 
    "Infectivity_Sinusoidal_Forcing_Phase": 0
}	

Maternal_Transmission_Probability

float

0

1

0

The probability of transmission of infection from mother to infant at birth. Enable_Maternal_Transmission must be set to 1. Note: For malaria and vector simulations, set this to 0. Instead, use the Maternal_Antibody_Protection, Maternal_Antibody_Decay_Rate, and Maternal_Antibodies_Type parameters.

{
    "Maternal_Transmission_Probability": 0.3
}

Max_Individual_Infections

integer

0

1000

1

The limit on the number of infections that an individual can have simultaneously. Enable_Superinfection must be set to 1.

{
    "Max_Individual_Infections": 5
}

Population_Density_C50

float

0

3.40E+38

10

The population density at which R0 for a 2.5-arc minute square reaches half of its initial value. Population_Density_Infectivity_Correction must be set to SATURATING_FUNCTION_OF_DENSITY.

{
    "Population_Density_C50": 30
}

Population_Density_Infectivity_Correction

enum

NA

NA

CONSTANT_INFECTIVITY

Correction to alter infectivity by population density set in the Population_Density_C50 parameter. Measured in people per square kilometer. Possible values are:

  • CONSTANT_INFECTIVITY

  • SATURATING_FUNCTION_OF_DENSITY

Note

Sparsely populated areas have a lower infectivity, while densely populated areas have a higher infectivity, which rises to saturate at the Base_Infectivity value.

{
    "Population_Density_Infectivity_Correction": "SATURATING_FUNCTION_OF_DENSITY"
}

Relative_Sample_Rate_Immune

float

0.001

1

0.1

The relative sampling rate for people who have acquired immunity through recovery or vaccination.

{
    "Relative_Sample_Rate_Immune": 0.1
}

Susceptibility_Scale_Type

enum

NA

NA

CONSTANT_SUSCEPTIBILITY

The effect of time or season on infectivity. Possible values are:

CONSTANT_SUSCEPTIBILITY LOG_LINEAR_FUNCTION_OF_TIME LINEAR_FUNCTION_OF_AGE LOG_LINEAR_FUNCTION_OF_AGE

{
    "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY"
}	

Transmission_Blocking_Immunity_Decay_Rate

float

0

1000

0.001

The rate at which transmission-blocking immunity decays after the base transmission-blocking immunity offset period. Used only when Enable_Immunity and Enable_Immune_Decay parameters are set to true (1).

{
    "Transmission_Blocking_Immunity_Decay_Rate": 0.01
}

Transmission_Blocking_Immunity_Duration_Before_Decay

float

0

45000

0

The number of days after infection until transmission-blocking immunity begins to decay. Only used when Enable_Immunity and Enable_Immune_Decay parameters are set to true (1).

{
    "Transmission_Blocking_Immunity_Duration_Before_Decay": 90
}

Zoonosis_Rate

float

0

1

0

The daily rate of zoonotic infection per individual. Animal_Reservoir_Type must be set to CONSTANT_ZOONOSIS or ZOONOSIS_FROM_DEMOGRAPHICS. If Animal_Reservoir_Type is set to ZOONOSIS_FROM_DEMOGRAPHICS, the value for the Zoonosis NodeAttribute in the demographics file will override the value set for Zoonosis_Rate.

{
    "Zoonosis_Rate": 0.005
}
Input data files

The following parameters set the paths to the the campaign file and the input data files for climate, migration, demographics, and load-balancing.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Air_Migration_Filename

string

NA

NA

The path to the input data file that defines patterns of migration by airplane. Enable_Air_Migration must be set to true (1). The file must be in .bin format.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Air_Migration" : 1,
    "Air_Migration_Filename": "../Global_1degree_air_migration.bin"
}

Air_Temperature_Filename

string

NA

NA

air_temp.json

The path to the input data file that defines air temperature data measured two meters above ground. Climate_Model must be set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Climate_Model": "CLIMATE_BY_DATA",
    "Air_Temperature_Filename": "Namawala_single_node_air_temperature_daily.bin"
}

Campaign_Filename

string

NA

NA

The path to the campaign file. It is required when interventions are part of the simulation and Enable_Interventions is set to true (1). The file must be in .json format.

{
    "Enable_Interventions": 1,
    "Campaign_Filename": "campaign.json"
}

Demographics_Filenames

array of strings

NA

NA

An array of the paths to demographics files containing information on the identity and demographics of the region to simulate. The files must be in .json format.

{
	"Demographics_Filenames": [    		
        "Namawala_single_node_demographics.json",
	    "Namawala_demographics_overlay.json"
	]
}

Family_Migration_Filename

string

NA

NA

The name of the binary file to use to configure family migration. Enable_Family_Migration must be set to true (1). The file must be in .bin format.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Family_Migration" 1,
    "Family_Migration_Filename": "../inputs/family_migration.bin"
}

Koppen_Filename

string

NA

NA

UNINITIALIZED STRING

The path to the input file used to specify Koppen climate classifications; only used when Climate_Model is set to CLIMATE_KOPPEN. The file must be in .dat format.

{
    "Koppen_Filename": "Mad_2_5arcminute_koppen.dat"
}

Land_Temperature_Filename

string

NA

NA

land_temp.json

The path of the input file defining temperature data measured at land surface; used only when Climate_Model is set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Land_Temperature_Filename": "Namawala_single_node_land_temperature_daily.bin"
}

Load_Balance_Filename

string

NA

NA

UNINITIALIZED STRING

The path to the input file used when a static load balancing scheme is selected. The file must be in .json format.

{
    "Load_Balance_Filename": "GitHub_426_LoadBalance.json"
}

Local_Migration_Filename

string

NA

NA

The path of the input file which defines patterns of migration to adjacent nodes by foot travel. The file must be in .bin format.

{
    "Local_Migration_Filename": "Local_Migration.bin"
}

Rainfall_Filename

string

NA

NA

rainfall.json

The path of the input file which defines rainfall data. Climate_Model must be set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Rainfall_Filename": "Namawala_single_node_rainfall_daily.bin"
}

Regional_Migration_Filename

string

NA

NA

The path of the input file which defines patterns of migration by vehicle via road or rail network. If the node is not on a road or rail network, regional migration focuses on the closest hub city in the network. The file must be in .bin format.

{
    "Regional_Migration_Filename": "Regional_Migration.bin"
}

Relative_Humidity_Filename

string

NA

NA

rel_hum.json

The path of the input file which defines relative humidity data measured 2 meters above ground. Climate_Model must be set to CLIMATE_BY_DATA. The file must be in .bin format.

{
    "Relative_Humidity_Filename": "Namawala_single_node_relative_humidity_daily.bin"
}

Sea_Migration_Filename

string

NA

NA

The path of the input file which defines patterns of migration by ship. Only used when Enable_Sea_Migration is set to true (1). The file must be in .bin format.

{
    "Sea_Migration_Filename": "5x5_Households_Work_Migration.bin"
}

Serialized_Population_Filenames

array of strings

NA

NA

NA

Array of filenames with serialized population data. The number of filenames must match the number of cores used for the simulation. The file must be in .dtk format.

{
    "Serialized_Population_Filenames": [
        "state-00010.dtk"
    ]
}

Serialized_Population_Path

string

NA

NA

.

The root path for the serialized population files.

{
    "Serialized_Population_Path": "../00_Generic_Version_1_save/output"
}

Migration

The following parameters determine aspects of population migration into and outside of a node, including daily commutes, seasonal migration, and one-way moves. Modes of transport includes travel by foot, automobile, sea, or air. Migration can also be configured to move all individuals in a family at the same time.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Air_Migration_Filename

string

NA

NA

The path to the input data file that defines patterns of migration by airplane. Enable_Air_Migration must be set to true (1). The file must be in .bin format.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Air_Migration" : 1,
    "Air_Migration_Filename": "../Global_1degree_air_migration.bin"
}

Air_Migration_Roundtrip_Duration

float

0

10000

1

The average time spent (in days) at the destination node during a round-trip migration by airplane. Enable_Air_Migration must be set to true (1).

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Air_Migration" : 1,
    "Air_Migration_Roundtrip_Duration": 2
}

Air_Migration_Roundtrip_Probability

float

0

1

0.8

The likelihood that an individual who flies to another node will return to the node of origin during the next migration. Enable_Air_Migration must be set to true (1).

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Air_Migration" : 1,
    "Air_Migration_Roundtrip_Probability": 0.9
}

Enable_Air_Migration

boolean

0

1

0

Controls whether or not migration by air travel will occur. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
     "Migration_Model": "FIXED_RATE_MIGRATION",
     "Enable_Air_Migration": 1,
     "Air_Migration_Filename": "../inputs/air_migration.bin"
}

Enable_Family_Migration

boolean

0

1

0

Controls whether or not all members of a household can migrate together. All residents must be home before they can leave on the trip. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Enable_Migration": "FIXED_RATE_MIGRATION",
    "Enable_Family_Migration": 1,
    "Family_Migration_Filename": "../inputs/family_migration.bin"
}

Enable_Local_Migration

boolean

0

1

0

Controls whether or not local migration (the diffusion of people in and out of nearby nodes by foot travel) occurs. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Local_Migration": 1,
    "Local_Migration_Filename": "../inputs/local_migration.bin"
}

Enable_Migration_Heterogeneity

boolean

0

1

1

Controls whether or not migration rate is heterogeneous among individuals. Set to true (1) to use a migration rate distribution in the demographics file (see NodeAttributes parameters); set to false (0) to use the same migration rate applied to all individuals. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Migration_Heterogeneity": 1
}

Enable_Regional_Migration

boolean

0

1

0

Controls whether or not there is migration by road vehicle into and out of nodes in the road network. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Regional_Migration": 1,
    "Regional_Migration_Filename": "../inputs/regional_migration.bin"
}

Enable_Sea_Migration

boolean

0

1

0

Controls whether or not there is migration on ships into and out of coastal cities with seaports. Migration_Model must be set to FIXED_RATE_MIGRATION.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Sea_Migration": 1,
    "Sea_Migration_Filename": "../inputs/sea_migration.bin"
}

Family_Migration_Filename

string

NA

NA

The name of the binary file to use to configure family migration. Enable_Family_Migration must be set to true (1). The file must be in .bin format.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Enable_Family_Migration" 1,
    "Family_Migration_Filename": "../inputs/family_migration.bin"
}

Family_Migration_Roundtrip_Duration

float

0

10000

1

The number of days to complete the trip and return to the original node. Migration_Pattern must be set to SINGLE_ROUND_TRIPS.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Migration_Pattern": "SINGLE_ROUND_TRIPS",
    "Family_Migration_Roundtrip_Duration": 100
}

Local_Migration_Filename

string

NA

NA

The path of the input file which defines patterns of migration to adjacent nodes by foot travel. The file must be in .bin format.

{
    "Local_Migration_Filename": "Local_Migration.bin"
}

Local_Migration_Roundtrip_Duration

float

0

10000

1

The average time spent (in days) at the destination node during a round-trip migration by foot travel. Only used if Enable_Local_Migration is set to true (1).

{
    "Local_Migration_Roundtrip_Duration": 1.0
}

Local_Migration_Roundtrip_Probability

float

0

1

0.95

The likelihood that an individual who walks into a neighboring cell will return to the cell of origin during the next migration. Only used when Enable_Local_Migration is set to true (1).

{
    "Local_Migration_Roundtrip_Probability": 1.0
}

Migration_Model

enum

NA

NA

NO_MIGRATION

Model to use for migration. Possible values are:

NO_MIGRATION

Migration into and out of nodes will not occur.

FIXED_RATE_MIGRATION

Migration into and out of nodes will occur at a fixed rate as defined in the migration files. At the beginning of the simulation or whenever an individual has just moved, they pick their next destination and the time and type of the migration. If an individual is on an outbound leg of their journey, they will query the node’s MigrationInfo object and, through probability, pick a new destination; if the individual is inbound, they will travel back to their previous location.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Local_Migration_Filename": "../inputs/local_migration.bin",
    "Enable_Local_Migration": 1
}

Migration_Pattern

enum

NA

NA

RANDOM_WALK_DIFFUSION

Describes the type of roundtrip used during migration. Migration_Model must be set to FIXED_RATE_MIGRATION. Possible values are:

RANDOM_WALK_DIFFUSION

Individuals retain no memory of where they came from; every move is to a new destination with no thought of returning home.

SINGLE_ROUND_TRIPS

There is a certain probability that an individual’s move will be a roundtrip (determined Local_Migration_Roundtrip_Probability, Air_Migration_Roundtrip_Probability, etc.). Otherwise, the departure point is forgotten and the individual does not return to their original location.

WAYPOINTS_HOME

Individuals go on a multi-step journey along several waypoints and then retrace their steps back along their path once they have reached a maximum number of waypoints from their home.

{
    "Migration_Model": "FIXED_RATE_MIGRATION",
    "Migration_Pattern": "SINGLE_ROUND_TRIPS"
}

Regional_Migration_Filename

string

NA

NA

The path of the input file which defines patterns of migration by vehicle via road or rail network. If the node is not on a road or rail network, regional migration focuses on the closest hub city in the network. The file must be in .bin format.

{
    "Regional_Migration_Filename": "Regional_Migration.bin"
}

Regional_Migration_Roundtrip_Duration

float

0

10000

1

The average time spent (in days) at the destination node during a round-trip migration by road network. Enable_Regional_Migration must be set to true (1).

{
    "Regional_Migration_Roundtrip_Duration": 1.0
}

Regional_Migration_Roundtrip_Probability

float

0

1

0.1

The likelihood that an individual who travels by vehicle to another cell will return to the cell of origin during the next migration. Migration_Pattern must be set to SINGLE_ROUND_TRIPS.

{
    "Regional_Migration_Roundtrip_Probability": 1.0
}

Roundtrip_Waypoints

integer

0

1000

10

The maximum number of points reached during a trip before steps are retraced on the return trip home. Migration_Pattern must be set to WAYPOINTS_HOME.

{
    "Roundtrip_Waypoints": 5
}

Sea_Migration_Filename

string

NA

NA

The path of the input file which defines patterns of migration by ship. Only used when Enable_Sea_Migration is set to true (1). The file must be in .bin format.

{
    "Sea_Migration_Filename": "5x5_Households_Work_Migration.bin"
}

Sea_Migration_Roundtrip_Duration

float

0

10000

1

The average time spent at the destination node during a round-trip migration by ship. Used only when Enable_Sea_Migration is set to true (1).

{
    "Sea_Migration_Roundtrip_Duration": 10000
}

Sea_Migration_Roundtrip_Probability

float

0

1

0.25

The likelihood that an individual who travels by ship into a neighboring cell will return to the cell of origin during the next migration. Used only when Enable_Sea_Migration is set to true (1).

{
    "Sea_Migration_Roundtrip_Probability": 0
}

x_Air_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by air, as provided by the migration file. Enable_Air_Migration must be set to 1.

{
    "x_Air_Migration": 1
}

x_Family_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by families, as provided by the migration file. Enable_Family_Migration must be set to true (1).

{
    "x_Family_Migration": 1
}

x_Local_Migration

float

0

3.40E+38

1

Scale factor for rate of migration by foot travel, as provided by the migration file. Enable_Local_Migration must be set to 1.

{
    "x_Local_Migration": 1
}

x_Regional_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by road vehicle, as provided by the migration file. Enable_Regional_Migration must be set to 1.

{
    "x_Regional_Migration": 1
}

x_Sea_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by sea, as provided by the migration file. Enable_Sea_Migration must be set to 1.

{
    "x_Sea_Migration": 1
}
Mortality and survival

The following parameter determine mortality and survival characteristics of the disease being modeled and the population in general (non-disease mortality).

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Base_Mortality

float

0

1000

0.001

The base mortality of the infection before accounting for individual immune modification factors. Depending on the setting of Mortality_Time_Course, this is either the daily probability of the disease being fatal (DAILY_MORTALITY) or the probability of death at the end of the infection duration (MORTALITY_AFTER_INFECTIOUS). Enable_Vital_Dynamics must be set to true (1).

{
    "Enable_Vital_Dynamics": 1,
    "Mortality_Time_Course": "DAILY_MORTALITY",
    "Base_Mortality": 0.01
}

Death_Rate_Dependence

enum

NA

NA

NONDISEASE_MORTALITY_OFF

Determines how likely individuals are to die from natural, non-disease causes. Enable_Vital_Dynamics must be set to 1. Possible values are:

NONDISEASE_MORTALITY_OFF

The daily mortality rate is 0, and no one dies from non-disease related causes.

NONDISEASE_MORTALITY_BY_AGE_AND_GENDER

The individual’s age and gender are taken into account to determine the daily mortality rate.

NONDISEASE_MORTALITY_BY_YEAR_AND_AGE_FOR_EACH_GENDER

Gender, age, and year, are all taken into account to determine the daily mortality rate.

Properties, rates, and bin sizes can be set for non-disease mortality for each gender in the demographics file (see Complex distributions parameters).

{
    "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF"
}

Mortality_Blocking_Immunity_Decay_Rate

float

0

1000

0.001

The rate at which mortality-blocking immunity decays after the mortality-blocking immunity offset period. Enable_Immune_Decay must be set to 1.

{
    "Mortality_Blocking_Immunity_Decay_Rate": 0.1
}

Mortality_Time_Course

enum

NA

NA

DAILY_MORTALITY

The method used to calculate disease deaths. Possible values are:

DAILY_MORTALITY

Calculated at every time step.

MORTALITY_AFTER_INFECTIOUS

Calculated once at the end of the disease duration.

{
    "Mortality_Time_Course": "MORTALITY_AFTER_INFECTIOUS"
}

x_Other_Mortality

float

0

3.40E+38

1

Scale factor for mortality from causes other than the disease being simulated, as provided by the demographics file (see Complex distributions parameters). Enable_Vital_Dynamics must be set to 1.

{
    "x_Other_Mortality": 1
}

Output settings

The following parameters configure whether or not output reports are created for the simulation, such as reports detailing spatial or demographic data at each time step. By default, the Inset chart output report is always created.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Custom_Reports_Filename

string

NA

NA

UNINITIALIZED STRING

The name of the file containing custom report configuration parameters. Omitting this parameter or setting it to RunAllCustomReports will load all reporters found that are valid for the given simulation type. The file must be in JSON format.

{  
    "Custom_Reports_Filename": "custom_reports.json"
}

Enable_Default_Reporting

boolean

0

1

1

Controls whether or not the default InsetChart.json report is created.

{
    "Enable_Default_Reporting": 1
}

Enable_Demographics_Reporting

boolean

0

1

1

Controls whether or not demographic summary data and age-binned reports are outputted to file.

{
    "Enable_Demographics_Reporting": 1
}

Enable_Property_Output

boolean

0

1

0

Controls whether or not to create property output reports, which detail groups as defined in IndividualProperties in the demographics file (see NodeProperties and IndividualProperties parameters). When there is more than one property type, the report will display the channel information for all combinations of the property type groups.

{
    "Enable_Property_Output": 1
}

Enable_Spatial_Output

boolean

0

1

0

Controls whether or not spatial output reports are created. If set to true (1), spatial output reports include all channels listed in the parameter Spatial_Output_Channels.

Note

Spatial output files require significant processing time and disk space.

{
    "Enable_Spatial_Output": 1,
    "Spatial_Output_Channels": [
        "Prevalence",
        "New_Infections"
    ]
}

Report_Event_Recorder

boolean

0

1

0

Set to true (1) to enable or to false (0) to disable the ReportEventRecorder.csv output report.

{
    "Report_Event_Recorder": 1, 
    "Report_Event_Recorder_Events": [
        "VaccinatedA", 
        "VaccineExpiredA", 
        "VaccinatedB", 
        "VaccineExpiredB"
    ], 
    "Report_Event_Recorder_Ignore_Events_In_List": 0 
}			

Report_Event_Recorder_Events

array

NA

NA

The list of events to include or exclude in the ReportEventRecorder.csv output report, based on how Report_Event_Recorder_Ignore_Events_In_List is set.

{
    "Report_Event_Recorder": 1, 
    "Report_Event_Recorder_Events": [
        "VaccinatedA", 
        "VaccineExpiredA", 
        "VaccinatedB", 
        "VaccineExpiredB"
    ], 
    "Report_Event_Recorder_Ignore_Events_In_List": 0 
}				

Report_Event_Recorder_Ignore_Events_In_List

boolean

0

1

0

If set to false (0), only the events listed in the Report_Event_Recorder_Events array will be included in the ReportEventRecorder.csv output report. If set to true (1), only the events listed in the array will be excluded, and all other events will be included. If you want to return all events from the simulation, leave the events array empty.

Value

Events array

Output file

0

No events

No events

0

One or more events

Only the listed events.

1

No events

All events occurring in the simulation.

1

One or more events

All simulation events occurring in the simulation, except for those listed.

{
    "Report_Event_Recorder": 1, 
    "Report_Event_Recorder_Events": [
        "VaccinatedA", 
        "VaccineExpiredA", 
        "VaccinatedB", 
        "VaccineExpiredB"
    ], 
    "Report_Event_Recorder_Ignore_Events_In_List": 0 
}			

Report_Event_Recorder_Individual_Properties

array of strings

NA

NA

[]

Specifies an array of events that will be excluded from the property output report; all events NOT listed in the array will be included in the report. To report all events from the simulation, leave the events array empty.

This example demonstrates reporting all individual property events:

{
    "Report_Event_Recorder_Individual_Properties": []
}	

The following example demonstrates the syntax for excluding particular properties from the report:

{
    "Report_Event_Recorder_Individual_Properties": [
        "Accessibility", 
        "Risk"
    ]
}	

Spatial_Output_Channels

array of strings

NA

NA

[]

An array of channel names for spatial output by node and time step. The data from each channel will be written to a separate binary file. Enable_Spatial_Output must be set to true (1). Possible values are:

Air_Temperature

Data related to air temperature.

Births

Data related to the number of births.

Campaign_Cost

Data related to the costs of a campaign.

Disease_Deaths

Data related to the number of deaths due to disease.

Human_Infectious_Reservoir

Data related to the total infectiousness of the population.

Infection_Rate

Data related to infection rates.

Land_Temperature

Data related to the average land temperature over all nodes.

New_Infections

Data related to the presence of new infections.

New_Reported_Infections

Data related to the presence of reported new infections.

Population

Data related to the total population in the simulation.

Prevalence

Data related to the fraction of the population that is infected.

Rainfall

Data related to the presence of rainfall.

Relative_Humidity

Data related to the presence of relative humidity.

{
    "Spatial_Output_Channels": [
        "Prevalence",
        "New_Infections"
    ]
}        
Population dynamics

The following parameters determine characteristics related to population dynamics, such as age distribution, births, deaths, and gender. The values set here generally interact closely with values in the demographics file.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Age_Initialization_Distribution_Type

enum

NA

NA

DISTRIBUTION_OFF

The method for initializing the age distribution in the simulated population. Possible values are:

DISTRIBUTION_OFF

All individuals default to age 20 years old.

DISTRIBUTION_SIMPLE

Individual ages are drawn from a distribution whose functional form is specified in the demographics file using the IndividualAttributes simple Age distribution parameters.

DISTRIBUTION_COMPLEX

Individual ages are drawn from a piecewise linear function specified in the demographics file complex distribution parameters.

{
    "Age_Initialization_Distribution_Type": "DISTRIBUTION_SIMPLE"
}

Base_Population_Scale_Factor

float

0

3.40E+38

1

The scale factor for InitialPopulation in the demographics file (see NodeAttributes parameters). If Population_Scale_Type is set to FIXED_SCALING, the initial simulation population is uniformly scaled over the entire area to adjust for historical or future population density.

{
    "Base_Population_Scale_Factor": 0.0001
}

Birth_Rate_Boxcar_Forcing_Amplitude

float

0

3.40E+38

0

Fractional increase in birth rate during high birth season when Birth_Rate_Time_Dependence is set to ANNUAL_BOXCAR_FUNCTION.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Time_Dependence": "ANNUAL_BOXCAR_FUNCTION",
    "Birth_Rate_Boxcar_Forcing_Amplitude": 0.1
}

Birth_Rate_Boxcar_Forcing_End_Time

float

0

365

0

Day of the year when the high birth rate season ends when Birth_Rate_Time_Dependence is set to ANNUAL_BOXCAR_FUNCTION.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Time_Dependence": "ANNUAL_BOXCAR_FUNCTION", 
    "Birth_Rate_Boxcar_Forcing_End_Time": 220
}

Birth_Rate_Boxcar_Forcing_Start_Time

float

0

365

0

Day of the year when the high birth rate season begins when Birth_Rate_Time_Dependence is set to ANNUAL_BOXCAR_FUNCTION.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Time_Dependence": "ANNUAL_BOXCAR_FUNCTION",
    "Birth_Rate_Boxcar_Forcing_Start_Time": 130
}

Birth_Rate_Dependence

enum

NA

NA

FIXED_BIRTH_RATE

The method used to modify the value set in BirthRate in the demographics file (see NodeAttributes parameters). Possible values are:

NONE

Births are not allowed during the simulation, even if Enable_Birth is set to true (1).

FIXED_BIRTH_RATE

The absolute rate at which new individuals are born, as set by BirthRate.

POPULATION_DEP_RATE

Scales the node population to determine the birth rate. If BirthRate is greater than 0.005, a value of 2% per year (0.02/365) is used instead.

DEMOGRAPHIC_DEP_RATE

Scales the female population within fertility age ranges to determine the birth rate. If BirthRate is greater than 0.005, a value of 1 child every 8 years of fertility [1/8/365(~0.000342)] is used instead.

INDIVIDUAL_PREGNANCIES

Scales the female population within fertility age ranges to determine the birth rate, but pregnancies are assigned on an individual basis and result in a 40-week pregnancy for a specific individual with a birth at the end.

INDIVIDUAL_PREGNANCIES_BY_URBAN_AND_AGE

Similar to INDIVIDUAL_PREGNANCIES, but determines the rate based on the FertilityDistribution (in IndividualAttributes) and Urban (in NodeAttributes), as well as the individual’s age.

INDIVIDUAL_PREGNANCIES_BY_AGE_AND_YEAR

Similar to INDIVIDUAL_PREGNANCIES, but determines the rate based on the FertilityDistribution (in IndividualAttributes), using the individual’s age and the year of the simulation.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Dependence": "POPULATION_DEP_RATE"
}

Birth_Rate_Sinusoidal_Forcing_Amplitude

float

0

1

0

The amplitude of sinusoidal variations in birth rate when Birth_Rate_Time_Dependence is set to SINUSOIDAL_FUNCTION_OF_TIME.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Time_Dependence": "SINUSOIDAL_FUNCTION_OF_TIME",
    "Birth_Rate_Sinusoidal_Forcing_Amplitude": 0.1
}

Birth_Rate_Sinusoidal_Forcing_Phase

float

0

365

0

The phase of sinusoidal variations in birth rate. Birth_Rate_Time_Dependence must be set to SINUSOIDAL_FUNCTION_OF_TIME.

{
    "Birth_Rate_Sinusoidal_Forcing_Phase": 20
}

Birth_Rate_Time_Dependence

enum

NA

NA

NONE

A scale factor that allows the birth rate to be altered by time or season. Enable_Birth must be set to true (1). Possible values are:

NONE

Birth rate does not vary by time.

SINUSOIDAL_FUNCTION_OF_TIME

Allows birth rate to be time-dependent, following a sinusoidal shape. Set Birth_Rate_Sinusoidal_Forcing_Amplitude and Birth_Rate_Sinusoidal_Forcing_Phase.

ANNUAL_BOXCAR_FUNCTION

Allows birth rate to follow a boxcar function, such that it will be equal to zero for an entire time period (e.g. year) except for a single interval in which it is equal to a constant. Set Birth_Rate_Boxcar_Forcing_Amplitude, Birth_Rate_Boxcar_Forcing_End_Time, and Birth_Rate_Boxcar_Forcing_Start_Time.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Time_Dependence": "ANNUAL_BOXCAR_FUNCTION"
}

Death_Rate_Dependence

enum

NA

NA

NONDISEASE_MORTALITY_OFF

Determines how likely individuals are to die from natural, non-disease causes. Enable_Vital_Dynamics must be set to 1. Possible values are:

NONDISEASE_MORTALITY_OFF

The daily mortality rate is 0, and no one dies from non-disease related causes.

NONDISEASE_MORTALITY_BY_AGE_AND_GENDER

The individual’s age and gender are taken into account to determine the daily mortality rate.

NONDISEASE_MORTALITY_BY_YEAR_AND_AGE_FOR_EACH_GENDER

Gender, age, and year, are all taken into account to determine the daily mortality rate.

Properties, rates, and bin sizes can be set for non-disease mortality for each gender in the demographics file (see Complex distributions parameters).

{
    "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF"
}

Default_Geography_Initial_Node_Population

integer

0

1000000

1000

When using the built-in demographics for default geography, the initial number of individuals in each node. Note that the built-in demographics feature does not represent a real geographical location and is mostly used for testing. Enable_Demographics_Builtin must be set to true (1).

{
    "Enable_Demographics_Builtin": 1,
    "Default_Geography_Initial_Node_Population": 1000,
    "Default_Geography_Torus_Size": 3
}

Demographics_Filenames

array of strings

NA

NA

An array of the paths to demographics files containing information on the identity and demographics of the region to simulate. The files must be in .json format.

{
	"Demographics_Filenames": [    		
        "Namawala_single_node_demographics.json",
	    "Namawala_demographics_overlay.json"
	]
}

Enable_Aging

boolean

0

1

1

Controls whether or not individuals in a population age during the simulation. Enable_Vital_Dynamics must be set to true (1).

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Aging": 1
}

Enable_Birth

boolean

0

1

1

Controls whether or not individuals will be added to the simulation by birth. Enable_Vital_Dynamics must be set to true (1). If you want new individuals to have the same intervention coverage as existing individuals, you must add a BirthTriggeredIV to the campaign file.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1
}

Enable_Demographics_Birth

boolean

0

1

0

Controls whether or not newborns have identical or heterogeneous characteristics. Set to false (0) to give all newborns identical characteristics; set to true (1) to allow for heterogeneity in traits such as sickle-cell status. Enable_Birth must be set to true (1).

{
    "Enable_Birth": 1,
    "Enable_Demographics_Birth": 1
}

Enable_Demographics_Builtin

boolean

0

1

0

Controls whether or not built-in demographics for default geography will be used. Note that the built-in demographics feature does not represent a real geographical location and is mostly used for testing. Set to true (1) to define the initial population and number of nodes using Default_Geography_Initial_Node_Population and Default_Geography_Torus_Size. Set to false (0) to use demographics input files defined in Demographics_Filenames.

{
    "Enable_Demographics_Builtin": 1,
    "Default_Geography_Initial_Node_Population": 1000,
    "Default_Geography_Torus_Size": 3
}

Enable_Demographics_Gender

boolean

0

1

1

Controls whether or not gender ratios are drawn from a Gaussian or 50/50 draw. Set to true (1) to create gender ratios drawn from a male/female ratio that is randomly smeared by a Gaussian of width 1%; set to false (0) to assign a gender ratio based on a 50/50 draw.

{
    "Enable_Demographics_Gender": 1
}

Enable_Demographics_Other

boolean

0

1

0

Controls whether or not other demographic factors are included in the simulation, such as the fraction of individuals above poverty, urban/rural characteristics, heterogeneous initial immunity, or risk. These factors are set in the demographics file.

{
    "Enable_Demographics_Other": 1
}

Enable_Disease_Mortality

boolean

0

1

1

Controls whether or not individuals die due to disease.

{
    "Enable_Disease_Mortality": 1
}

Enable_Vital_Dynamics

boolean

0

1

1

Controls whether or not births and deaths occur in the simulation. Births and deaths must be individually enabled and set.

{
    "Enable_Vital_Dynamics":1,
    "Enable_Birth": 1,
    "Death_Rate_Dependence": "NONDISEASE_MORTALITY_OFF",
    "Base_Mortality": 0.002
}

Minimum_Adult_Age_Years

float

0

3.40E+38

15

The age, in years, after which an individual is considered an adult. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP.

{
    "Minimum_Adult_Age_Years": 17
}

Population_Density_Infectivity_Correction

enum

NA

NA

CONSTANT_INFECTIVITY

Correction to alter infectivity by population density set in the Population_Density_C50 parameter. Measured in people per square kilometer. Possible values are:

  • CONSTANT_INFECTIVITY

  • SATURATING_FUNCTION_OF_DENSITY

Note

Sparsely populated areas have a lower infectivity, while densely populated areas have a higher infectivity, which rises to saturate at the Base_Infectivity value.

{
    "Population_Density_Infectivity_Correction": "SATURATING_FUNCTION_OF_DENSITY"
}

Population_Scale_Type

enum

NA

NA

USE_INPUT_FILE

The method to use for scaling the initial population specified in the demographics input file. Possible values are:

USE_INPUT_FILE

Turns off population scaling and uses InitialPopulation in the demographics file (see NodeAttributes parameters).

FIXED_SCALING

Enables Base_Population_Scale_Factor.

{
    "Population_Scale_Type": "FIXED_SCALING"
}

x_Birth

float

0

3.40E+38

1

Scale factor for birth rate, as provided by the demographics file (see NodeAttributes parameters). Enable_Birth must be set to 1.

{
    "x_Birth": 1
}
Sampling

The following parameters determine how a population is sampled in the simulation. While you may want every agent (individual object) to represent a single person, you can often optimize CPU time with without degrading the accuracy of the simulation but having an agent represent multiple people. The sampling rate may be adapted to have a higher or lower sampling rate for particular regions or age groups.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Base_Individual_Sample_Rate

float

0

1

1

The base rate of sampling for individuals, equal to the fraction of individuals in each node being sampled. Reducing the sampling rate will reduce the time needed to run simulations. Individual_Sampling_Type must be set to FIXED_SAMPLING or ADAPTED_SAMPLING_BY_IMMUNE_STATE.

{
    "Base_Individual_Sample_Rate": 0.01
}

Immune_Threshold_For_Downsampling

float

0

1

0

Threshold on acquisition immunity at which to apply immunity dependent downsampling. Individual_Sampling_Type must set to ADAPTED_SAMPLING_BY_IMMUNE_STATE.

{
    "Individual_Sampling_Type": "ADAPTED_SAMPLING_BY_IMMUNE_STATE", 
    "Immune_Threshold_For_Downsampling": 0.5
}

Individual_Sampling_Type

enum

NA

NA

TRACK_ALL

The type of individual human sampling. Possible values are:

TRACK_ALL

Each person in the population is tracked as a single Individual object with a sampling weight of 1.

FIXED_SAMPLING

Members of the population are added to the simulation with a probability of Base_Individual_Sample_Rate and sampling weight of 1 / Base_Individual_Sample_Rate. This allows a smaller set of Individual objects to represent the overall population.

ADAPTED_SAMPLING_BY_POPULATION_SIZE

For each node, a maximum number of Individual objects is tracked (set in Max_Node_Population_Samples). If the population is smaller than this number, each person is tracked with a sampling rate of 1; if the population is larger, members of the population are added to the simulation with a probability of Max_Node_Population_Samples / population and sampling weight of population / Max_Node_Population_Samples. This setting is useful for simulations over large geographic areas with large heterogeneities in population density.

ADAPTED_SAMPLING_BY_AGE_GROUP

The population is binned by age and each age bin is sampled at a different rate as defined by Sample_Rate parameters. The setting is useful for diseases in which only infants or children are relevant by allowing full sampling of these age groups while using fewer objects to represent the rest of the population.

ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE

Each node has a maximum number of Individual objects as described in ADAPTED_SAMPLING_BY_POPULATION_SIZE, but when the population grows beyond that threshold, sampling is not done at a fixed rate, but varies by age as described in ADAPTED_SAMPLING_BY_AGE_GROUP.

ADAPTED_SAMPLING_BY_IMMUNE_STATE

Individuals who have acquired immunity are sampled at a lower rate as defined by Relative_Sample_Rate_Immune and Immune_Threshold_For_Downsampling parameters.

The following example shows how to sampling immune individuals at a lower rate.

{
    "Individual_Sampling_Type": "ADAPTED_SAMPLING_BY_IMMUNE_STATE",
    "Immune_Threshold_For_Downsampling": 0.5,  
    "Relative_Sample_Rate_Immune": 0.1 
}

The following example shows how to sampling older individuals at a lower rate.

{
    "Individual_Sampling_Type": "ADAPTED_SAMPLING_BY_AGE_GROUP",
    "Sample_Rate_0_18mo": 1, 
    "Sample_Rate_10_14": 0.5, 
    "Sample_Rate_15_19": 0.3, 
    "Sample_Rate_18mo_4yr": 1, 
    "Sample_Rate_20_Plus": 0.2, 
    "Sample_Rate_5_9": 1, 
    "Sample_Rate_Birth": 1
}

Max_Node_Population_Samples

float

1

3.40E+38

30

The maximum number of individuals to track in a node. When the population exceeds this number, the sampling rate will drop according to the value set in Individual_Sampling_Type.

{
    "Individual_Sampling_Type": "ADAPTED_SAMPLING_BY_POPULATION_SIZE",
    "Max_Node_Population_Samples": 100000
}

Relative_Sample_Rate_Immune

float

0.001

1

0.1

The relative sampling rate for people who have acquired immunity through recovery or vaccination.

{
    "Relative_Sample_Rate_Immune": 0.1
}

Sample_Rate_0_18mo

float

0

1000

1

For age-adapted sampling, the relative sampling rate for infants age 0 to 18 months. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_0_18mo": 1
}

Sample_Rate_10_14

float

0

1000

1

For age-adapted sampling, the relative sampling rate for children age 10 to 14 years. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_10_14": 1
}

Sample_Rate_15_19

float

0

1000

1

For age-adapted sampling, the relative sampling rate for adolescents age 15 to 19 years. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_15_19": 1
}

Sample_Rate_18mo_4yr

float

0

1000

1

For age-adapted sampling, the relative sampling rate for children age 18 months to 4 years. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_18mo_4yr": 1
}

Sample_Rate_20_plus

float

0

1000

1

For age-adapted sampling, the relative sampling rate for adults age 20 and older. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_20_plus": 1
}

Sample_Rate_5_9

float

0

1000

1

For age-adapted sampling, the relative sampling rate for children age 5 to 9 years. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_5_9": 1
}

Sample_Rate_Birth

float

0

1000

1

For age-adapted sampling, the relative sampling rate for births. Individual_Sampling_Type must be set to ADAPTED_SAMPLING_BY_AGE_GROUP or ADAPTED_SAMPLING_BY_AGE_GROUP_AND_POP_SIZE.

{
    "Sample_Rate_Birth": 1
}
Scalars and multipliers

The following parameters scale or multiply values set in other areas of the configuration file or input data files. This can be especially useful for understanding the sensitivities of disease dynamics to input data without requiring modifications to those base values. For example, one might set x_Birth to a value less than 1 to simulate a lower future birth rate due to increased economic prosperity and available medical technology.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Base_Population_Scale_Factor

float

0

3.40E+38

1

The scale factor for InitialPopulation in the demographics file (see NodeAttributes parameters). If Population_Scale_Type is set to FIXED_SCALING, the initial simulation population is uniformly scaled over the entire area to adjust for historical or future population density.

{
    "Base_Population_Scale_Factor": 0.0001
}

Birth_Rate_Time_Dependence

enum

NA

NA

NONE

A scale factor that allows the birth rate to be altered by time or season. Enable_Birth must be set to true (1). Possible values are:

NONE

Birth rate does not vary by time.

SINUSOIDAL_FUNCTION_OF_TIME

Allows birth rate to be time-dependent, following a sinusoidal shape. Set Birth_Rate_Sinusoidal_Forcing_Amplitude and Birth_Rate_Sinusoidal_Forcing_Phase.

ANNUAL_BOXCAR_FUNCTION

Allows birth rate to follow a boxcar function, such that it will be equal to zero for an entire time period (e.g. year) except for a single interval in which it is equal to a constant. Set Birth_Rate_Boxcar_Forcing_Amplitude, Birth_Rate_Boxcar_Forcing_End_Time, and Birth_Rate_Boxcar_Forcing_Start_Time.

{
    "Enable_Vital_Dynamics": 1,
    "Enable_Birth": 1,
    "Birth_Rate_Time_Dependence": "ANNUAL_BOXCAR_FUNCTION"
}

Immunity_Acquisition_Factor

float

0

1000

0

The multiplicative reduction in the probability of reacquiring disease. Only used when Enable_Immunity and Enable_Immune_Decay are set to 1.

{
    "Enable_Immunity": 1,
    "Enable_Immune_Decay": 1,
    "Immunity_Acquisition_Factor": 0.9
}

Infectivity_Exponential_Baseline

float

0

1

0

The scale factor applied to Base_Infectivity at the beginning of a simulation, before the infectivity begins to grow exponentially. Infectivity_Scale_Type must be set to EXPONENTIAL_FUNCTION_OF_TIME.

{
    "Infectivity_Exponential_Baseline": 0.1, 
    "Infectivity_Exponential_Delay": 90, 
    "Infectivity_Exponential_Rate": 45, 
    "Infectivity_Scale_Type": "EXPONENTIAL_FUNCTION_OF_TIME"
}

Population_Scale_Type

enum

NA

NA

USE_INPUT_FILE

The method to use for scaling the initial population specified in the demographics input file. Possible values are:

USE_INPUT_FILE

Turns off population scaling and uses InitialPopulation in the demographics file (see NodeAttributes parameters).

FIXED_SCALING

Enables Base_Population_Scale_Factor.

{
    "Population_Scale_Type": "FIXED_SCALING"
}

Susceptibility_Scale_Type

enum

NA

NA

CONSTANT_SUSCEPTIBILITY

The effect of time or season on infectivity. Possible values are:

CONSTANT_SUSCEPTIBILITY LOG_LINEAR_FUNCTION_OF_TIME LINEAR_FUNCTION_OF_AGE LOG_LINEAR_FUNCTION_OF_AGE

{
    "Susceptibility_Scale_Type": "CONSTANT_SUSCEPTIBILITY"
}	

x_Air_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by air, as provided by the migration file. Enable_Air_Migration must be set to 1.

{
    "x_Air_Migration": 1
}

x_Birth

float

0

3.40E+38

1

Scale factor for birth rate, as provided by the demographics file (see NodeAttributes parameters). Enable_Birth must be set to 1.

{
    "x_Birth": 1
}

x_Family_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by families, as provided by the migration file. Enable_Family_Migration must be set to true (1).

{
    "x_Family_Migration": 1
}

x_Local_Migration

float

0

3.40E+38

1

Scale factor for rate of migration by foot travel, as provided by the migration file. Enable_Local_Migration must be set to 1.

{
    "x_Local_Migration": 1
}

x_Other_Mortality

float

0

3.40E+38

1

Scale factor for mortality from causes other than the disease being simulated, as provided by the demographics file (see Complex distributions parameters). Enable_Vital_Dynamics must be set to 1.

{
    "x_Other_Mortality": 1
}

x_Regional_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by road vehicle, as provided by the migration file. Enable_Regional_Migration must be set to 1.

{
    "x_Regional_Migration": 1
}

x_Sea_Migration

float

0

3.40E+38

1

Scale factor for the rate of migration by sea, as provided by the migration file. Enable_Sea_Migration must be set to 1.

{
    "x_Sea_Migration": 1
}
Simulation setup

These parameters determine the basic setup of a simulation including the type of simulation you are running, such as “GENERIC_SIM” or “MALARIA_SIM”, the simulation duration, and the time step duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Base_Year

float

1900

2200

2015

The absolute time in years when the simulation begins. This can be combined with CampaignEventByYear to trigger campaign events.

This parameter is not used in this simulation type.

{
    "Base_Year": 1960
}

Config_Name

string

NA

NA

UNINITIALIZED STRING

The optional, user-supplied title naming a configuration file.

{
     "Config_Name": "My_First_Config"
}

Enable_Interventions

boolean

0

1

0

Controls whether or not campaign interventions will be used in the simulation. Set Campaign_Filename to the path of the file that contains the campaign interventions.

{
    "Enable_Interventions": 1,
    "Campaign_Filename": "campaign.json"
}

Listed_Events

array of strings

NA

NA

[]

The list of valid, user-defined events that will be included in the campaign. Any event used in the campaign must either be one of the built-in events or in this list.

{
    "Listed_Events": [
        "Vaccinated",
        "VaccineExpired"
    ]
}

Memory_Usage_Halting_Threshold_Working_Set_MB

integer

0

1.00E+06

8000

The maximum size (in MB) of working set memory before the system throws an exception and halts.

{
    "Memory_Usage_Halting_Threshold_Working_Set_MB": 4000
}

Memory_Usage_Warning_Threshold_Working_Set_MB

integer

0

1.00E+06

7000

The maximum size (in MB) of working set memory before memory usage statistics are written to the log regardless of log level.

{
    "Memory_Usage_Warning_Threshold_Working_Set_MB": 3500
}

Node_Grid_Size

float

0.00416

90

0.004167

The spatial resolution indicating the node grid size for a simulation in degrees.

{
    "Node_Grid_Size": 0.042
}

Number_Basestrains

integer

1

10

1

The number of base strains in the simulation, such as antigenic variants.

{
    "Number_Basestrains": 1
}

Num_Cores

integer

NA

NA

NA

The number of cores used to run a simulation.

{
    "Num_Cores": 4
}

Run_Number

integer

0

2147480000

1

Sets the random number seed through a bit manipulation process. When running a multi-core simulation, combines with processor rank to produce independent random number streams for each process.

{
    "Run_Number": 1
}

Serialization_Time_Steps

array of integers

0

2.15E+09

The list of time steps after which to save the serialized state. 0 (zero) indicates the initial state before simulation, n indicates after the nth time step. By default, no serialized state is saved.

{
    "Serialization_Time_Steps": [
        0, 
        10
    ]
}

Serialized_Population_Filenames

array of strings

NA

NA

NA

Array of filenames with serialized population data. The number of filenames must match the number of cores used for the simulation. The file must be in .dtk format.

{
    "Serialized_Population_Filenames": [
        "state-00010.dtk"
    ]
}

Serialized_Population_Path

string

NA

NA

.

The root path for the serialized population files.

{
    "Serialized_Population_Path": "../00_Generic_Version_1_save/output"
}

Simulation_Duration

float

0

1000000

1

The elapsed time (in days) from the start to the end of a simulation.

{
    "Simulation_Duration": 7300
}

Simulation_Timestep

float

0

1000000

1

The duration of a simulation time step, in days.

{
    "Simulation_Timestep": 1
}	

Simulation_Type

enum

NA

NA

GENERIC_SIM

The type of disease being simulated. Possible IDM-supported values are:

  • GENERIC_SIM

  • VECTOR_SIM

  • MALARIA_SIM

  • TB_SIM

  • STI_SIM

  • HIV_SIM

{
    "Simulation_Type": "STI_SIM"
}	

Start_Time

float

0

1000000

1

The time, in days, when the simulation begins. This time is used to identify the starting values of the temporal input data, such as specifying which day’s climate values should be used for the first day of the simulation.

Note

The Start_Day of campaign events is in absolute time, so time relative to the beginning of the simulation depends on this parameter.

{
    "Start_Time": 365
}	

Campaign parameters

The parameters described in this reference section can be added to the JavaScript Object Notation (JSON) formatted campaign file to determine the interventions that are used to control the spread of disease and where, when, how, and to whom the interventions are distributed. Additionally, the campaign file specifies the details of the outbreak of the disease itself.

In the configuration file, you must set the Enable_Interventions parameter to 1 and set the Campaign_Filename parameter to the name of the campaign file for the interventions to take place. The campaign file must be in the same directory as the configuration file.

The campaign file is hierarchically organized into logical groups of parameters that can have arbitrary levels of nesting. It contains an Events array of campaign events, each of which contains a JSON object describing the event coordinator, which in turn contains a nested JSON object describing the intervention. At the same level as the Events array is the boolean Use_Defaults to indicate whether or not to use the default values for required parameters that are not included in the file. It is common to include JSON keys for campaign name, event name, or intervention name; these are informational only and not used by EMOD. For more information on how to set up the elements in a campaign file, see Create a campaign file.

The skeletal JSON example below illustrates the basic file structure (this does not include all required parameters for each object). Note that the nested JSON elements have been organized to best illustrate their hierarchy, but that many files in the Regression directory of the EMOD GitHub repository list the parameters and nested objects differently.

{
    "Campaign_Name": "Campaign example",
    "Use_Defaults": 1,
    "Events": [{
        "Event_Name": "The first event",
        "class": "CampaignEvent",
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Intervention_Config": {
                "Intervention_Name": "The vaccine",
                "class": "SimpleVaccine"
            }
        }
    }, {
        "Event_Name": "The second event",
        "class": "CampaignEvent",
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Intervention_Config": {
                "Intervention_Name": "The disease outbreak",
                "class": "OutbreakIndividual"
            }
        }
    }]
}

Warning

The event containing the outbreak “intervention” must be the last one listed in the campaign file or none of the disease control interventions will take place.

The topics below contain only parameters available when using the generic simulation type.

Events and event coordinators

Campaign events determine when and where an intervention is distributed during a campaign. Event coordinators are nested within the campaign event JSON object and determine who receives the intervention.

The following events and event coordinators are available to use with the generic simulation type.

CampaignEvent

The CampaignEvent event class determines when to distribute the intervention based on the first day of the simulation. See the following JSON example and table, which shows all available parameters for this campaign event.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Event_Coordinator_Config

JSON object

NA

NA

NA

An object that specifies how the event is handled by the simulation. It specifies which Event Coordinator class will handle the event, and then configures the coordinator. This description starts with specifying class, and then the other fields depend on the class.

{
    "Event_Coordinator_Config": {
        "class": "StandardInterventionDistributionEventCoordinator",
        "Demographic_Coverage": 1.0
    }
}

Nodeset_Config

JSON object

NA

NA

NA

An object that specifies in which nodes the interventions will be distributed. For example, if running a single location simulation, or an event that is active in all nodes, then specify class NodeSetAll within the Nodeset_Config brackets.

Possible classes are:

NodeSetAll

Distribute to all nodes in the simulation.

NodeSetNodeList

Distribute to the nodes in the comma-separated list of node IDs specified by the Node_List parameter.

NodeSetPolygon

Distribute to the nodes that fall within a polygon specified by the comma-separated list of polygon points in the Vertices parameter (set Polygon_Format to SHAPE).

{
    "Nodeset_Config": {
        "class": "NodeSetAll"
    }
}

Start_Day

float

0

3.40E+3

1

The day of the simulation to activate the event’s event coordinator.

{
    "Start_Day": 0,
    "End_Day": 100
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Event_Name": "Individual outbreak",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "class": "OutbreakIndividual"
            }
        }
    }]
}
CalendarEventCoordinator

The CalendarEventCoordinator coordinator class distributes individual-level interventions at a specified time and coverage. See the following JSON example and table, which shows all available parameters for this event coordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Distribution_Coverages

array of floats

0

1

0

A vector of floats for the fraction of individuals that will receive this intervention in a CalendarEventCoordinator.

{
    "Distribution_Times": [100, 200, 400, 800, 1200],
    "Distribution_Coverages": [0.01, 0.05, 0.1, 0.2, 1.0]
}

Distribution_Times

array of integers

1

2.15E+0

0

A vector of integers for simulation times at which distribution of events occurs in a CalendarEventCoordinator.

{
    "Distribution_Times": [100, 200, 400, 800, 1200],
    "Distribution_Coverages": [0.01, 0.05, 0.1, 0.2, 1.0]
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 1,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Min

float

0

3.40E+3

0

The lower end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Timesteps_Between_Repetitions

integer

-1

10000

-1

The repetition interval.

{
    "Timesteps_Between_Repetitions": 50
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}

Target_Age_Max

float

0

3.40E+3

3.40E+38

The upper end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Event_Name": "High-risk vaccination",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "CalendarEventCoordinator",
            "Demographic_Coverage": 1,
            "Property_Restrictions": [
                "Risk:High"
            ],
            "Number_Repetitions": 1,
            "Timesteps_Between_Repetitions": 0,
            "Target_Demographic": "Everyone",
            "Target_Residents_Only": 1,
            "Distribution_Times": [100, 200, 400, 800, 1200],
            "Distribution_Coverages": [0.01, 0.05, 0.1, 0.2, 1.0],
            "Intervention_Config": {
                "Cost_To_Consumer": 0,
                "Vaccine_Take": 1,
                "Vaccine_Type": "AcquisitionBlocking",
                "class": "SimpleVaccine",
                "Waning_Config": {
                    "Initial_Effect": 1,
                    "Box_Duration": 1825,
                    "class": "WaningEffectBox"
                }
            }
        }
    }]
}
CommunityHealthWorkerEventCoordinator

The CommunityHealthWorkerEventCoordinator coordinator class is used to model a health care worker’s ability to distribute interventions to the nodes and individual in their coverage area. This coordinator distributes a limited number of interventions per day, and can create a backlog of individuals or nodes requiring the intervention. For example, individual-level interventions could be distribution of drugs and node-level interventions could be spraying houses with insecticide.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Amount_In_Shipment

integer

1

2.15E+0

2.15E+09

The number of interventions (such as vaccine doses) that a health worker or clinic receives in a shipment. Interventions can only be distributed if they are in stock; stock is updated every Days_Between_Shipments with the Amount_In_Shipment.

{
    "Amount_In_Shipment": 10
}

Days_Between_Shipments

float

1

3.40E+3

3.40E+38

The number of days to wait before a clinic or health worker receives a new shipment of interventions (such as vaccine doses). Interventions can only be distributed if they are in stock; stock is updated every Days_Between_Shipments with the Amount_In_Shipment.

{
    "Days_Between_Shipments": 30
}

Duration

float

0

3.40E+3

3.40E+38

The number of days for an event coordinator to be active before it expires.

{
    "Duration": 65
}

Initial_Amount

float

0

3.40E+3

6

The initial amount of stock of interventions (such as vaccine doses). Interventions can only be distributed if they are in stock; stock is updated every Days_Between_Shipments with the Amount_In_Shipment.

{
    "Initial_Amount": 10
}

Initial_Amount_Distribution_Type

enum

NA

NA

NOT_INITIALIZED

The distribution type to set when initializing Initial_Amount. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Initial_Amount_Distribution_Type": "FIXED_DURATION"
}

Initial_Amount_Max

float

0

3.40E+3

0

The maximum amount of initial stock when Initial_Amount_Distribution_Type is set to UNIFORM_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "UNIFORM_DURATION",
    "Initial_Amount_Min": 5,
    "Initial_Amount_Max": 10
}

Initial_Amount_Mean

float

0

3.40E+3

6

The average amount of initial stock when Initial_Amount_Distribution_Type is set to GAUSSIAN_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "GAUSSIAN_DISTRIBUTION",
    "Initial_Amount_Std_Dev": 1,
    "Initial_Amount_Mean": 5
}

Initial_Amount_Min

float

0

3.40E+3

0

The minimum amount of initial stock when Initial_Amount_Distribution_Type is set to UNIFORM_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "UNIFORM_DURATION",
    "Initial_Amount_Min": 5,
    "Initial_Amount_Max": 10
}

Initial_Amount_Std_Dev

float

0

3.40E+3

1

The standard deviation for the amount of initial stock when Initial_Amount_Distribution_Type is set to GAUSSIAN_DISTRIBUTION.

{
    "Initial_Amount_Distribution_Type": "GAUSSIAN_DISTRIBUTION",
    "Initial_Amount_Std_Dev": 1,
    "Initial_Amount_Mean": 5
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "BroadcastEvent",
        "Broadcast_Event": "EventFromIntervention"
    }
}

Max_Distributed_Per_Day

integer

1

2.15E+0

2.15E+09

The maximum number of interventions (such as vaccine doses) that can be distributed by health workers or clinics in a given day.

{
    "Max_Distributed_Per_Day": 1
}

Max_Stock

integer

0

2.15E+0

2.15E+09

The maximum number of interventions (such as vaccine doses) that can be stored by a health worker or clinic. If the amount of interventions in a new shipment and current stock exceeds this value, only the number of interventions specified by this value will be stored.

{
    "Max_Stock": 12
}

Trigger_Condition_List

array of strings

NA

NA

NoTrigger

The list of events that are of interest to the community health worker (CHW). If one of these events occurs, the individual or node is put into a queue to receive the CHW’s intervention. The CHW processes the queue when the event coordinator is updated. See Event list for possible values.

{
    "Trigger_Condition_List": ["ListenForEvent"]
}

Waiting_Period

float

0

3.40E+3

3.40E+38

The number of days a person or node can be in the queue waiting to get the intervention from the community health worker (CHW). If a person or node is in the queue, they will not be re-added to the queue if the event that would add them to the queue occurs. This allows them to maintain their priority, however they could be removed from the queue due to this waiting period.

{
    "Waiting_Period": 15
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Min

float

0

3.40E+3

0

The lower end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetNodeList",
            "Node_List": [2, 3, 4]
        },
        "Event_Coordinator_Config": {
            "class": "CommunityHealthWorkerEventCoordinator",
            "Duration": 400,
            "Distribution_Rate": 25,
            "Waiting_Period": 10,
            "Days_Between_Shipments": 25,
            "Amount_In_Shipment": 250,
            "Max_Stock": 1000,
            "Initial_Amount_Distribution_Type": "FIXED_DURATION",
            "Initial_Amount": 500,
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 1.0,
            "Property_Restrictions": [],
            "Target_Residents_Only": 0,
            "Trigger_Condition_List": ["NewInfectionEvent"],
            "Intervention_Config": {
                "class": "SimpleVaccine",
                "Cost_To_Consumer": 10.0,
                "Vaccine_Take": 1,
                "Vaccine_Type": "AcquisitionBlocking",
                "Waning_Config": {
                    "class": "WaningEffectBox",
                    "Initial_Effect": 1,
                    "Box_Duration": 200
                }
            }
        }
    }]
}
CoverageByNodeEventCoordinator

The CoverageByNodeEventCoordinator coordinator class distributes individual-level interventions and is similar to the StandardInterventionDistributionEventCoordinator, but adds the ability to specify different demographic coverages by node. If no coverage has been specified for a particular node ID, the coverage will be zero. See the following JSON example and table, which shows all available parameters for this event coordinator.

Note

This can only be used with individual-level interventions, but EMOD will not produce an error if you attempt to use it with an node-level intervention.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Coverage_By_Node

array of arrays

NA

NA

NA

An array of (nodeID, coverage) pairs configuring the demographic coverage of interventions by node for the targeted populations. The coverage value must be a float between 0 and 1.

{
    "Event_Coordinator_Config": {
        "Coverage_By_Node": [
            [
                1,
                0.6
            ],
            [
                2,
                0.9
            ],
            [
                3,
                0.1
            ]
        ]
    }
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 1,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}

Number_Repetitions

integer

-1

1000

1

The number of times an intervention is given, used with Timesteps_Between_Repetitions.

{
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "class": "Outbreak",
            "Num_Cases": 1
        },
        "Number_Repetitions": 10,
        "Timesteps_Between_Repetitions": 50,
        "class": "StandardInterventionDistributionEventCoordinator"
    }
}

Timesteps_Between_Repetitions

integer

-1

10000

-1

The repetition interval.

{
    "Timesteps_Between_Repetitions": 50
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Min

float

0

3.40E+3

0

The lower end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 0,
        "Nodeset_Config": {
            "Node_List": [
                1,
                2,
                3
            ],
            "class": "NodeSetNodeList"
        },
        "Event_Coordinator_Config": {
            "class": "CoverageByNodeEventCoordinator",
            "Target_Demographic": "Everyone",
            "Coverage_By_Node": [
                [1, 0.6],
                [2, 0.9],
                [3, 0.1]
            ],
            "Intervention_Config": {
                "Cost_To_Consumer": 10.0,
                "Reduced_Transmit": 0,
                "Vaccine_Take": 1,
                "Vaccine_Type": "AcquisitionBlocking",
                "Waning_Config": {
                    "Box_Duration": 3650,
                    "Initial_Effect": 1,
                    "class": "WaningEffectBox"
                },
                "class": "SimpleVaccine"
            }
        }
    }]
}
MultiInterventionEventCoordinator

The MultiInterventionEventCoordinator coordinator class distributes multiple individual-level or node- level interventions at the same time to the same set of covered individuals or nodes. You cannot specify a mix of individual-level and node-level interventions within the same event coordinator. This enables correlated distributions, such as dosing of multiple drugs with different regimens. See the following JSON example and table, which shows all available parameters for this event coordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Intervention_Configs

array of JSON objects

NA

NA

NA

The array of nested JSON parameters for the interventions to be distributed by this event coordinator.

{
    "Intervention_Configs": [{
            "Cost_To_Consumer": 1,
            "Dosing_Type": "FullTreatmentCourse",
            "Drug_Type": "DHA",
            "class": "AntimalarialDrug"
        },
        {
            "Cost_To_Consumer": 1,
            "Dosing_Type": "FullTreatmentCourse",
            "Drug_Type": "Piperaquine",
            "class": "AntimalarialDrug"
        }
    ]
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Min

float

0

3.40E+3

0

The lower end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 10,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "MultiInterventionEventCoordinator",
            "Intervention_Configs": [{
                    "class": "PropertyValueChanger",
                    "Target_Property_Key": "Risk",
                    "Target_Property_Value": "HIGH",
                    "Daily_Probability": 1.0,
                    "Maximum_Duration": 0,
                    "Revert": 0
                },
                {
                    "class": "BroadcastEvent",
                    "Broadcast_Event": "PVC_Distributed"
                }
            ]
        }
    }]
}
NChooserEventCoordinator

The NChooserEventCoordinator coordinator class is used to distribute an individual-level intervention to exactly N people of a targeted demographic. This contrasts with other event coordinators that distribute an intervention to a percentage of the population, not to an exact count. See the following JSON example and table, which shows all available parameters for this event coordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Max

float

0

125

125

This parameter determines the maximum age, in years for individuals to be included in the targeted population. An individual is considered in range if their age is greater than or equal to the minimum age and less than the maximum age, in floating point years of age.

{
    "Age_Ranges_Years": [{
        "Min": 20,
        "Max": 29
    }, {
        "Min": 50,
        "Max": 59
    }]
}

Min

float

0

125

0

This parameter determines the minimum age, in years for individuals to be included in the targeted population. An individual is considered in range if their age is greater than or equal to the minimum age and less than the maximum age, in floating point years of age.

{
    "Age_Ranges_Years": [{
        "Min": 20,
        "Max": 29
    }, {
        "Min": 50,
        "Max": 59
    }]
}

Distributions

array of JSON objects

NA

NA

NA

The ordered list of elements defining when, to whom, and how many interventions to distribute.

{
    "Distributions": {
        "Start_Day": 10,
        "End_Day": 20,
        "Property_Restrictions_Within_Node": [],
        "Age_Ranges_Years": [{
            "Min": 10,
            "Max": 19
        }, {
            "Min": 40,
            "Max": 49
        }],
        "Num_Targeted": [100, 300]
    }
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "Incubation_Period_Override": 1
    }
}

Age_Ranges_Years

array of JSON objects

NA

NA

NA

A list of age ranges that individuals must be in to qualify for an intervention. Each age range is a JSON object with a minimum and a maximum property. An individual is considered in range if their age is greater than or equal to the minimum age and less than the maximum age, in floating point years of age. It must have the same number of objects as Num_Targeted_XXX has elements.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 30,
        "Max": 39
    }, {
        "Min": 50,
        "Max": 59
    }],
    "Num_Targeted_Males": [600000, 400000, 200000],
    "Num_Targeted_Females": [500000, 300000, 100000]
}

End_Day

float

0

3.40E+3

3.40E+38

The day to stop distributing the intervention. No interventions are distributed on this day or going forward.

{
    "Start_Day": 10,
    "End_Day": 20
}

Num_Targeted

array of integers

0

2.15E+0

0

The number of individuals to target with the intervention. Note that this value will be scaled up by the population scaling factor equal to Base_Population_Scale_Factor. If using this parameter, Num_Targeted_Males and Num_Targeted_Females must be empty.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 40,
        "Max": 49
    }],
    "Num_Targeted": [100, 300]
}

Num_Targeted_Females

array of integers

0

2.15E+0

0

The number of female individuals to distribute interventions to during this time period. If using this parameter with Num_Targeted_Males to target specific genders, they both must be the same length, and Num_Targeted must be empty.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 30,
        "Max": 39
    }, {
        "Min": 50,
        "Max": 59
    }],
    "Num_Targeted_Males": [600000, 400000, 200000],
    "Num_Targeted_Females": [500000, 300000, 100000]
}

Num_Targeted_Males

array of integers

0

2.15E+0

0

The number of male individuals to distribute interventions to during this time period. If using this parameter with Num_Targeted_Females to target specific genders, they both must be the same length, and Num_Targeted must be empty.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 30,
        "Max": 39
    }, {
        "Min": 50,
        "Max": 59
    }],
    "Num_Targeted_Males": [600000, 400000, 200000],
    "Num_Targeted_Females": [500000, 300000, 100000]
}

Start_Day

float

0

3.40E+3

0

The day to start distributing the intervention.

{
    "Start_Day": 0,
    "End_Day": 100
}

Max

float

0

125

125

This parameter determines the maximum age, in years for individuals to be included in the targeted population. An individual is considered in range if their age is greater than or equal to the minimum age and less than the maximum age, in floating point years of age.

{
    "Age_Ranges_Years": [{
        "Min": 20,
        "Max": 29
    }, {
        "Min": 50,
        "Max": 59
    }]
}

Min

float

0

125

0

This parameter determines the minimum age, in years for individuals to be included in the targeted population. An individual is considered in range if their age is greater than or equal to the minimum age and less than the maximum age, in floating point years of age.

{
    "Age_Ranges_Years": [{
        "Min": 20,
        "Max": 29
    }, {
        "Min": 50,
        "Max": 59
    }]
}

Distributions

array of JSON objects

NA

NA

NA

The ordered list of elements defining when, to whom, and how many interventions to distribute.

{
    "Distributions": {
        "Start_Day": 10,
        "End_Day": 20,
        "Property_Restrictions_Within_Node": [],
        "Age_Ranges_Years": [{
            "Min": 10,
            "Max": 19
        }, {
            "Min": 40,
            "Max": 49
        }],
        "Num_Targeted": [100, 300]
    }
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "Incubation_Period_Override": 1
    }
}

Age_Ranges_Years

array of JSON objects

NA

NA

NA

A list of age ranges that individuals must be in to qualify for an intervention. Each age range is a JSON object with a minimum and a maximum property. An individual is considered in range if their age is greater than or equal to the minimum age and less than the maximum age, in floating point years of age. It must have the same number of objects as Num_Targeted_XXX has elements.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 30,
        "Max": 39
    }, {
        "Min": 50,
        "Max": 59
    }],
    "Num_Targeted_Males": [600000, 400000, 200000],
    "Num_Targeted_Females": [500000, 300000, 100000]
}

Num_Targeted

array of integers

0

2.15E+0

0

The number of individuals to target with the intervention. Note that this value will be scaled up by the population scaling factor equal to Base_Population_Scale_Factor. If using this parameter, Num_Targeted_Males and Num_Targeted_Females must be empty.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 40,
        "Max": 49
    }],
    "Num_Targeted": [100, 300]
}

Num_Targeted_Females

array of integers

0

2.15E+0

0

The number of female individuals to distribute interventions to during this time period. If using this parameter with Num_Targeted_Males to target specific genders, they both must be the same length, and Num_Targeted must be empty.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 30,
        "Max": 39
    }, {
        "Min": 50,
        "Max": 59
    }],
    "Num_Targeted_Males": [600000, 400000, 200000],
    "Num_Targeted_Females": [500000, 300000, 100000]
}

Num_Targeted_Males

array of integers

0

2.15E+0

0

The number of male individuals to distribute interventions to during this time period. If using this parameter with Num_Targeted_Females to target specific genders, they both must be the same length, and Num_Targeted must be empty.

{
    "Age_Ranges_Years": [{
        "Min": 10,
        "Max": 19
    }, {
        "Min": 30,
        "Max": 39
    }, {
        "Min": 50,
        "Max": 59
    }],
    "Num_Targeted_Males": [600000, 400000, 200000],
    "Num_Targeted_Females": [500000, 300000, 100000]
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}
{
    "Use_Defaults": 1,
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config__KP1": "",
        "Event_Coordinator_Config": {
            "class": "NChooserEventCoordinator",
            "Distributions": [{
                "Start_Day": 10,
                "End_Day": 11,
                "Property_Restrictions_Within_Node": [{
                    "QualityOfCare": "Bad"
                }],
                "Age_Ranges_Years": [{
                    "Min": 20,
                    "Max": 40
                }],
                "Num_Targeted": [
                    99999999
                ]
            }],
            "Intervention_Config": {
                "class": "ControlledVaccine",
                "Cost_To_Consumer": 10,
                "Vaccine_Type": "AcquisitionBlocking",
                "Vaccine_Take": 1.0,
                "Waning_Config": {
                    "class": "WaningEffectMapLinear",
                    "Initial_Effect": 1.0,
                    "Expire_At_Durability_Map_End": 1,
                    "Durability_Map": {
                        "Times": [
                            0,
                            50,
                            100
                        ],
                        "Values": [
                            1.0,
                            1.0,
                            0.0
                        ]
                    }
                },
                "Distributed_Event_Trigger": "Vaccinated",
                "Expired_Event_Trigger": "VaccineExpired",
                "Duration_To_Wait_Before_Revaccination": 0
            }
        }
    }]
}
SimpleDistributionEventCoordinator

The SimpleInterventionDistributionEventCoordinator coordinator class distributes individual- level or node-level interventions and is a simplified version of the StandardInterventionDistributionEventCoordinator. There is reduced complexity, such as there is no targeting restrictions on demographics, properties, age, gender, or other target values. See the following JSON example and table, which shows all available parameters for this event coordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Coverage

float

0

1

1

The fraction of individuals that will receive this intervention.

{
    "Coverage": 1.0
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 1,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Event_Name": "Male circumcision for initial population",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "SimpleInterventionDistributionEventCoordinator",
            "Coverage": 0.5,
            "Intervention_Config": {
                "class": "MaleCircumcision",
                "Circumcision_Reduced_Acquire": 0.6
            }
        }
    }]
}
StandardInterventionDistributionEventCoordinator

The StandardInterventionDistributionEventCoordinator coordinator class distributes an individual-level or node-level intervention to a specified fraction of individuals or nodes within a node set. Recurring campaigns can be created by specifying the number of times distributions should occur and the time between repetitions. See the following JSON example and table, which shows all available parameters for this event coordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Number_Repetitions

integer

-1

1000

1

The number of times an intervention is given, used with Timesteps_Between_Repetitions.

{
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "class": "Outbreak",
            "Num_Cases": 1
        },
        "Number_Repetitions": 10,
        "Timesteps_Between_Repetitions": 50,
        "class": "StandardInterventionDistributionEventCoordinator"
    }
}

Timesteps_Between_Repetitions

integer

-1

10000

-1

The repetition interval.

{
    "Timesteps_Between_Repetitions": 50
}

Intervention_Config

JSON object

NA

NA

NA

The nested JSON of the actual intervention to be distributed by this event coordinator.

{
    "Intervention_Config": {
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 1,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Min

float

0

3.40E+3

0

The lower end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Age_Max

float

0

3.40E+3

3.40E+38

The upper end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}
{
    "Use_Defaults": 1,
    "Events": [{
        "Event_Name": "Outbreak",
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Demographic_Coverage": 0.005,
            "Intervention_Config": {
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            }
        }
    }]
}
Node-level interventions

Node-level interventions determine what will be distributed to nodes to reduce the spread of a disease. For example, spraying larvicide in a village to kill mosquito larvae is a node-level malaria intervention. Sometimes this can be an intermediate intervention that schedules another intervention. Node-level disease outbreaks are also configured as “interventions”.

The following node-level interventions are available for use with the generic simulation type.

BirthTriggeredIV

The BirthTriggeredIV intervention class monitors for birth events and then distributes an actual intervention to the new individuals as specified in Actual_IndividualIntervention_Config.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Actual_IndividualIntervention_Config

JSON object

NA

NA

NA

The configuration of an actual individual intervention sought. Selects a class for the intervention and configures the parameters specific for that intervention class.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}    

Duration

float

-1

3.40E+3

-1

The number of days to continue this intervention.

Note

For BirthTriggeredIV, specifying a value of -1 results in indefinite persistence of the birth-triggered intervention.

{
    "Duration": -1
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}

Target_Age_Max

float

0

3.40E+3

3.40E+38

The upper end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [{
        "class": "CampaignEventByYear",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Year": 1960,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Intervention_Config": {
                "class": "BirthTriggeredIV",
                "Target_Demographic": "ExplicitGender",
                "Target_Gender": "Male",
                "Demographic_Coverage": 1,
                "Actual_IndividualIntervention_Config": {
                    "class": "HIVSigmoidByYearAndSexDiagnostic",
                    "New_Property_Value": "InterventionStatus:None",
                    "Ramp_Min": 0.0,
                    "Ramp_Max": 0.3,
                    "Ramp_MidYear": 2002.0,
                    "Ramp_Rate": 0.5,
                    "Positive_Diagnosis_Event": "HIVNeedsMaleCircumcision"
                }
            }
        }

    }]
}
ImportPressure

The ImportPressure intervention class extends the ImportCases outbreak event. Rather than importing a deterministic number of cases on a scheduled day, ImportPressure applies a set of per-day rates of importation of infected individuals, over a corresponding set of durations. ImportPressure inherits from Outbreak; the Antigen and Genome parameters are defined as they are for all Outbreak events.

Warning

Be careful when configuring import pressure in multi-node simulations. Daily_Import_Pressures defines a rate of per-day importation for each node that the intervention is distributed to. In a 10 node simulation with Daily_Import_Pressures = [0.1, 5.0], the total importation rate summed over all nodes will be 1/day and 50/day during the two time periods. You must divide the per-day importation rates by the number of nodes.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Daily_Import_Pressures

array of floats

0

3.40E+3

0

The rate of per-day importation for each node that the intervention is distributed to.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Durations": [100, 100, 100, 100, 100, 100, 100],
        "Daily_Import_Pressures": [0.1, 5.0, 0.2, 1.0, 2.0, 0.0, 10.0],
        "class": "ImportPressure"
    }
}

Durations

array of integers

0

2.15E+0

1

The durations over which to apply import pressure.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Durations": [100, 100, 100, 100, 100, 100, 100],
        "Daily_Import_Pressures": [0.1, 5.0, 0.2, 1.0, 2.0, 0.0, 10.0],
        "class": "ImportPressure"
    }
}

Number_Cases_Per_Node

integer

0

2.15E+0

1

The number of new cases of Outbreak to import (per node).

Note

This will increase the population and there is no control over demographics of these individuals.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "ImportCases",
        "Number_Cases_Per_Node": 10,
        "class": "Outbreak"
    }
}

Import_Age

float

0

43800

365

The age (in days) of infected import cases.

{
    "Import_Age": 10000
}

Incubation_Period_Override

integer

-1

2.15E+0

-1

The incubation period, in days, that infected individuals will go through before becoming infectious. This value overrides the incubation period set in the configuration file. Set to -1 to honor the configuration parameter settings.

{
    "Incubation_Period_Override": 0
}

Antigen

integer

0

10

0

The antigenic ID of the outbreak infection.

{  
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual"
    }   
}

Genome

integer

-2.15E+0

2.15E+0

0

The genetic ID of the outbreak infection.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 0
    }
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "Initial Seeding",
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 1,
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "Antigen": 0,
                "Genome": 0,
                "Durations": [100, 100, 100, 100, 100, 100, 100],
                "Daily_Import_Pressures": [0.1, 5.0, 0.2, 1.0, 2.0, 0.0, 10.0],
                "class": "ImportPressure"
            }
        }
    }]
}
MigrateFamily

The MigrateFamily intervention class tells residents of the targeted node to go on a family trip. The duration of time residents wait before migration can be configured; the “timer” for this duration does not start until all residents are “home”.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Duration_At_Node_Exponential_Period

float

0

3.40E+3

6

The period (1/rate) to use for an exponential distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to EXPONENTIAL_DURATION.

{
    "Duration_At_Node_Distribution_Type": "EXPONENTIAL_DURATION",
    "Duration_At_Node_Exponential_Period": 4
}

Duration_At_Node_Fixed

float

0

3.40E+3

6

The value to use for a fixed distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to FIXED_DURATION.

{
    "Duration_At_Node_Distribution_Type" : "FIXED_DURATION",
    "Duration_At_Node_Fixed": 10
}

Duration_At_Node_Gausian_Mean

float

0

3.40E+3

6

The mean value to use for a Gaussian distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_At_Node_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_At_Node_Gausian_Mean": 9.0,
    "Duration_At_Node_Gausian_StdDev": 2.0
}

Duration_At_Node_Gausian_StdDev

float

0

3.40E+3

1

The standard deviation to use for a Gaussian distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_At_Node_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_At_Node_Gausian_Mean": 9.0,
    "Duration_At_Node_Gausian_StdDev": 2.0
}

Duration_At_Node_Poisson_Mean

float

0

3.40E+3

6

The mean to use for a Poisson distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to POISSON_DURATION.

{
    "Duration_At_Node_Distribution_Type": "POISSON_DURATION",
    "Duration_At_Node_Poisson_Mean": 4
}

Duration_At_Node_Distribution_Type

enum

NA

NA

NOT_INITIALIZED

The shape of the distribution for the amount of time spent at the destination node for intervention-based migration. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Duration_At_Node_Distribution_Type": "GAUSSIAN_DURATION"
}

Duration_At_Node_Uniform_Max

float

0

3.40E+3

0

The maximum value to use for a uniform distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_At_Node_Distribution_Type": "UNIFORM_DURATION",
    "Duration_At_Node_Uniform_Max": 75,
    "Duration_At_Node_Uniform_Min": 45
}

Duration_At_Node_Uniform_Min

float

0

3.40E+3

0

The minimum value to use for a uniform distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_At_Node_Distribution_Type": "UNIFORM_DURATION",
    "Duration_At_Node_Uniform_Max": 75,
    "Duration_At_Node_Uniform_Min": 45
}

Duration_Before_Leaving_Exponential_Period

float

0

3.40E+3

6

The period (1/rate) to use for an exponential distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to EXPONENTIAL_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "EXPONENTIAL_DURATION",
    "Duration_Before_Leaving_Exponential_Period": 4
}

Duration_Before_Leaving_Fixed

float

0

3.40E+3

6

The value to use for a fixed distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to FIXED_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "FIXED_DURATION",
    "Duration_Before_Leaving_Fixed": 4
}

Duration_Before_Leaving_Gausian_Mean

float

0

3.40E+3

6

The mean value to use for a Gaussian distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_Before_Leaving_Gausian_Mean": 9.0,
    "Duration_Before_Leaving_Gausian_StdDev": 2.0
}

Duration_Before_Leaving_Gausian_StdDev

float

0

3.40E+3

1

The standard deviation to use for a Gaussian distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_Before_Leaving_Gausian_Mean": 9.0,
    "Duration_Before_Leaving_Gausian_StdDev": 2.0
}

Duration_Before_Leaving_Poisson_Mean

float

0

3.40E+3

6

The mean to use for a Poisson distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to POISSON_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "POISSON_DURATION",
    "Duration_Before_Leaving_Poisson_Mean": 3.0,
}

Duration_Before_Leaving_Distribution_Type

enum

NA

NA

NOT_INITIALIZED

The shape of the distribution of the number of days to wait before migrating to the destination node for intervention-based migration. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Duration_Before_Leaving_Distribution_Type": "FIXED_DURATION"
}

Duration_Before_Leaving_Uniform_Max

float

0

3.40E+3

0

The maximum value to use for a uniform distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "UNIFORM_DURATION",
    "Duration_Before_Leaving_Uniform_Max": 14,
    "Duration_Before_Leaving_Uniform_Min": 0,
}

Duration_Before_Leaving_Uniform_Min

float

0

3.40E+3

0

The minimum value to use for a uniform distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "UNIFORM_DURATION",
    "Duration_Before_Leaving_Uniform_Max": 14,
    "Duration_Before_Leaving_Uniform_Min": 0,
}

Is_Moving

boolean

NA

NA

0

Set to true (1) to indicate the individual is permanently moving to a new home node for intervention-based migration.

{
    "Is_Moving": 1
}

NodeID_To_Migrate_To

integer

0

2.15E+0

0

The destination node ID for intervention-based migration.

{
    "NodeID_To_Migrate_To": 26
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Intervention_Config": {
                "class": "NodeLevelHealthTriggeredIV",
                "Trigger_Condition_List": ["NewInfectionEvent"],
                "Demographic_Coverage": 1.0,
                "Actual_NodeIntervention_Config": {
                    "class": "MigrateFamily",
                    "NodeID_To_Migrate_To": 4,
                    "Duration_Before_Leaving_Distribution_Type": "FIXED_DURATION",
                    "Duration_Before_Leaving_Fixed": 0,
                    "Duration_At_Node_Distribution_Type": "FIXED_DURATION",
                    "Duration_At_Node_Fixed": 10,
                    "Is_Moving": 0
                }
            }
        }
    }]
}
NodeLevelHealthTriggeredIV

The NodeLevelHealthTriggeredIV intervention class distributes an intervention to an individual when a specific event occurs. NodeLevelHealthTriggeredIV monitors for event triggers from individuals, and when found, will distribute the intervention. For example, NodeLevelHealthTriggeredIV can be configured such that all individuals will be given a diagnostic intervention when they transition from susceptible to infectious. During the simulation, when individuals become infected, they broadcast the NewInfectionEvent trigger and NodeLevelHealthTriggeredIV distributes the diagnostic intervention to them.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Blackout_Event_Trigger

enum

NA

NA

NoTrigger

The event to broadcast if an intervention cannot be distributed due to the Blackout_Period. See Event list for possible values.

{
    "Blackout_Event_Trigger" : "Blackout"
}

Blackout_On_First_Occurrence

boolean

NA

NA

0

If set to true (1), individuals will enter the blackout period after the first occurrence of an event in the Trigger_Condition_List.

{
    "Blackout_On_First_Occurrence": 0
}

Blackout_Period

float

0

3.40E+3

0

After the initial intervention distribution, the time, in days, to wait before distributing the intervention again. If it cannot distribute due to the blackout period, it will broadcast the user-defined Blackout_Event_Trigger.

{
    "Blackout_Period" : 0.0
}

Actual_NodeIntervention_Config

JSON object

NA

NA

NA

The configuration of the actual node-level intervention sought. This parameter selects a class for the intervention and configures the parameters specific for that intervention class.

{  
    "Actual_NodeIntervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease"
    }
} 

Distribute_On_Return_Home

boolean

NA

NA

0

When set to true (1), individuals will receive an intervention upon returning home if that intervention was originally distributed while the individual was away.

{
    "Distribute_On_Return_Home" : 1
}

Trigger_Condition

enum

NA

NA

NoTrigger

The condition for triggering a health seeking intervention.

Normally, Trigger_Condition specifies an event from the built-in list of pre-defined events or triggers from the IndividualEventTriggerType enum. For a list of possible values, see Individual Event Trigger Values. If the value is set to TriggerString, the Trigger_Condition_String parameter specifies the event. If the value is set to TriggerList, the Trigger_Condition_List parameter specifies a list of events.

Trigger_Condition_List

enum

NA

NA

NA

This parameter configures NodeLevelHealthTriggeredIV to listen for multiple events at once. The events contained in the list can be built-in events (see Event list for possible events) or the custom events defined in Listed_Events in the simulation configuration file.

{
    "Trigger_Condition_List": [
        "OnART3"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Target_Age_Max

float

0

3.40E+3

3.40E+38

The upper end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Actual_IndividualIntervention_Config

JSON object

NA

NA

NA

The configuration of an actual individual intervention sought. Selects a class for the intervention and configures the parameters specific for that intervention class.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}    

Duration

float

-1

3.40E+3

-1

The number of days to continue this intervention.

Note

For BirthTriggeredIV, specifying a value of -1 results in indefinite persistence of the birth-triggered intervention.

{
    "Duration": -1
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 1,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Intervention_Config": {
                "class": "NodeLevelHealthTriggeredIV",
                "Trigger_Condition_List": ["HappyBirthday"],
                "Demographic_Coverage": 1.0,
                "Actual_IndividualIntervention_Config": {
                    "class": "OutbreakIndividual",
                    "Antigen": 0,
                    "Genome": 0,
                    "Outbreak_Source": "PrevalenceIncrease"
                }
            }
        }
    }]
}
NodeLevelHealthTriggeredIVScaleUpSwitch

The NodeLevelHealthTriggeredIVScaleUpSwitch intervention class transitions from one intervention to another over time. Generally this is used if one type of diagnostic tool is being phased out but the transition to replace it with the new diagnostic takes place over a few years. The individuals who are included by Demographic_Coverage will receive the new intervention and those that aren’t will receive the older “not covered” intervention.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Demographic_Coverage_Time_Profile

enum

NA

NA

Immediate

The profile for the ramp-up time to demographic coverage. Possible values are:

  • Immediate

  • Linear

  • Sigmoid

{
    "Demographic_Coverage_Time_Profile": "Linear"
}

Initial_Demographic_Coverage

float

0

1.00E+0

0

The initial level of demographic coverage when using linear scale-up.

{
    "Initial_Demographic_Coverage": 0
}

Not_Covered_IndividualIntervention_Configs

array of JSON objects

NA

NA

NA

The array of interventions that is distributed if an individual qualifies according to all parameters except Demographic_Coverage. Generally, this is used to specify a diagnostic tool that is being phased out.

{
    "Not_Covered_IndividualIntervention_Configs": [{
        "class": "DelayedIntervention",
        "Delay_Distribution": "FIXED_DURATION",
        "Delay_Period": 10,
        "Coverage": 1,
        "Actual_IndividualIntervention_Configs": [{
            "class": "AntiTBDrug",
            "Cost_To_Consumer": 90,
            "Drug_Type": "FirstLineCombo",
            "Durability_Profile": "FIXED_DURATION_CONSTANT_EFFECT",
            "Primary_Decay_Time_Constant": 180,
            "Remaining_Doses": 1,
            "TB_Drug_Clearance_Rate": 5e-11,
            "TB_Drug_Inactivation_Rate": 0
        }]
    }]
}

Primary_Time_Constant

float

0

3.65E+0

1

The time to full scale-up demographic coverage.

{
    "Primary_Time_Constant": 150
}

Blackout_Event_Trigger

enum

NA

NA

NoTrigger

The event to broadcast if an intervention cannot be distributed due to the Blackout_Period. See Event list for possible values.

{
    "Blackout_Event_Trigger" : "Blackout"
}

Blackout_On_First_Occurrence

boolean

NA

NA

0

If set to true (1), individuals will enter the blackout period after the first occurrence of an event in the Trigger_Condition_List.

{
    "Blackout_On_First_Occurrence": 0
}

Blackout_Period

float

0

3.40E+3

0

After the initial intervention distribution, the time, in days, to wait before distributing the intervention again. If it cannot distribute due to the blackout period, it will broadcast the user-defined Blackout_Event_Trigger.

{
    "Blackout_Period" : 0.0
}

Actual_NodeIntervention_Config

JSON object

NA

NA

NA

The configuration of the actual node-level intervention sought. This parameter selects a class for the intervention and configures the parameters specific for that intervention class.

{  
    "Actual_NodeIntervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease"
    }
} 

Distribute_On_Return_Home

boolean

NA

NA

0

When set to true (1), individuals will receive an intervention upon returning home if that intervention was originally distributed while the individual was away.

{
    "Distribute_On_Return_Home" : 1
}

Trigger_Condition_List

enum

NA

NA

NA

This parameter configures NodeLevelHealthTriggeredIV to listen for multiple events at once. The events contained in the list can be built-in events (see Event list for possible events) or the custom events defined in Listed_Events in the simulation configuration file.

{
    "Trigger_Condition_List": [
        "OnART3"
    ]
}

Node_Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the NodeProperty key:value pairs, as defined in the demographics file, that nodes must have to be targeted by the intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Node_Property_Restrictions": [{
            "Place": "URBAN",
            "Risk": "MED"
        },
        {
            "Place": "RURAL",
            "Risk": "LOW"
        }
    ]
}

Actual_IndividualIntervention_Config

JSON object

NA

NA

NA

The configuration of an actual individual intervention sought. Selects a class for the intervention and configures the parameters specific for that intervention class.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "OutbreakIndividual",
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease"
    }
}    

Duration

float

-1

3.40E+3

-1

The number of days to continue this intervention.

Note

For BirthTriggeredIV, specifying a value of -1 results in indefinite persistence of the birth-triggered intervention.

{
    "Duration": -1
}

Demographic_Coverage

float

0

1

1

The fraction of individuals in the target demographic that will receive this intervention.

{
    "Demographic_Coverage": 1
}

Property_Restrictions_Within_Node

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this node-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions_Within_Node": [{
        "Risk": "HIGH"
    }]
}

Target_Age_Max

float

0

3.40E+3

3.40E+38

The upper end of ages targeted for an intervention, in years. Used when Target_Demographic is set to ExplicitAgeRanges or ExplicitAgeRangesAndGender.

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Target_Gender

enum

NA

NA

All

Specifies the gender restriction for the intervention. Possible values are:

  • Male

  • Female

  • All

{
    "Target_Gender": "Male"
}

Target_Residents_Only

boolean

NA

NA

0

When set to true (1), the intervention is only distributed to individuals that began the simulation in the node (i.e. those that claim the node as their residence).

{
    "Target_Residents_Only": 1
}

Property_Restrictions

array of JSON objects

NA

NA

NA

A list of the IndividualProperty key:value pairs, as defined in the demographics file, that individuals must have to be targeted by this individual-level intervention. See NodeProperties and IndividualProperties parameters for more information.

{
    "Property_Restrictions": [
        "Risk:HIGH"
    ]
}

Target_Demographic

enum

NA

NA

Everyone

The target demographic group. Possible values are:

  • Everyone

  • ExplicitAgeRanges

  • ExplicitAgeRangesAndGender

  • ExplicitGender

  • PossibleMothers

  • ArrivingAirTravellers

  • DepartingAirTravellers

  • ArrivingRoadTravellers

  • DepartingRoadTravellers

  • AllArrivingTravellers

  • AllDepartingTravellers

  • ExplicitDiseaseState

{
    "Target_Age_Max": 20,
    "Target_Age_Min": 10,
    "Target_Demographic": "ExplicitAgeRanges"
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "Illustration of NodeLevelScaleUp: Outbreak to smear- and smear+ at day 100, then diagnostic and treatment of only smear+ cases at day 200",
    "Events": [{
        "Event_Name": "when someone broadcasts a positive test using smear, give them the drug",
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 99,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Demographic_Coverage": 1,
            "Include_Arrivals": 0,
            "Include_Departures": 0,
            "Number_Repetitions": 1,
            "Property_Restrictions": [],
            "Target_Demographic": "Everyone",
            "Timesteps_Between_Repetitions": -1,
            "Intervention_Config": {
                "class": "NodeLevelHealthTriggeredIVScaleUpSwitch",
                "Demographic_Coverage": 1,
                "Demographic_Coverage_Time_Profile": "Linear",
                "Initial_Demographic_Coverage": 0,
                "Primary_Time_Constant": 150,
                "Property_Restrictions_Within_Node": [],
                "Not_Covered_IndividualIntervention_Configs": [{
                    "class": "DelayedIntervention",
                    "Delay_Distribution": "FIXED_DURATION",
                    "Delay_Period": 10,
                    "Coverage": 1,
                    "Actual_IndividualIntervention_Configs": [{
                        "class": "SmearDiagnostic",
                        "Base_Sensitivity": 1,
                        "Base_Specificity": 1,
                        "Cost_To_Consumer": 10,
                        "Days_To_Diagnosis": 0,
                        "Treatment_Fraction": 1,
                        "Event_Or_Config": "Event",
                        "Positive_Diagnosis_Event": "TestPositiveOnSmear"
                    }]
                }],
                "Actual_IndividualIntervention_Config": {
                    "class": "ActiveDiagnostic",
                    "Base_Sensitivity": 1,
                    "Base_Specificity": 1,
                    "Cost_To_Consumer": 8,
                    "Days_To_Diagnosis": 0,
                    "Treatment_Fraction": 1,
                    "Event_Or_Config": "Event",
                    "Positive_Diagnosis_Event": "TestPositiveOnActive"
                }
            }
        }
    }]
}
NodePropertyValueChanger

The NodePropertyValueChanger intervention class sets a given node property to a new value. You can also define a duration in days before the node property reverts back to its original value, the probability that a node will change its node property to the target value, and the number of days over which nodes will attempt to change their individual properties to the target value. This node-level intervention functions in a similar manner as the individual-level intervention, PropertyValueChanger.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Target_NP_Key_Value

string

NA

NA

NA

The NodeProperty key:value pair, as defined in the demographics file, to assign to the node.

{
    "Target_NP_Key_Value": "InterventionStatus:NONE"
}

Daily_Probability

float

0

1

1

The probability that an individual will move to the Target_Property_Value.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Maximum_Duration

float

-1

3.40E+3

3.40E+38

The maximum amount of time individuals have to move to a new group. This timing works in conjunction with Daily_Probability.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Revert

float

0

10000

0

The number of days before an individual moves back to their original group.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [{
        "class": "CampaignEvent",
        "Start_Day": 40,
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Node_Property_Restrictions": [{
                "InterventionStatus": "VACCINATING"
            }],
            "Intervention_Config": {
                "class": "NodePropertyValueChanger",
                "Target_NP_Key_Value": "InterventionStatus:STOP_VACCINATING",
                "Daily_Probability": 1.0,
                "Maximum_Duration": 0,
                "Revert": 0
            }
        }
    }]
}
Outbreak

The Outbreak class allows the introduction of a disease outbreak event by the addition of infected individuals or by the infection of existing individuals in the specified node set. The type of disease outbreak to be added must be configured. Outbreak is a node-level intervention; to distribute an outbreak intervention to specific categories of individuals within a targeted node, use OutbreakIndividual.

Warning

The event containing the outbreak “intervention” must be the last one listed in the campaign file or none of the disease control interventions will take place.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Antigen

integer

0

10

0

The antigenic ID of the outbreak infection.

{  
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual"
    }   
}

Genome

integer

-2.15E+0

2.15E+0

0

The genetic ID of the outbreak infection.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 0
    }
}

Import_Age

float

0

43800

365

The age (in days) of infected import cases.

{
    "Import_Age": 10000
}

Incubation_Period_Override

integer

-1

2.15E+0

-1

The incubation period, in days, that infected individuals will go through before becoming infectious. This value overrides the incubation period set in the configuration file. Set to -1 to honor the configuration parameter settings.

{
    "Incubation_Period_Override": 0
}

Number_Cases_Per_Node

integer

0

2.15E+0

1

The number of new cases of Outbreak to import (per node).

Note

This will increase the population and there is no control over demographics of these individuals.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "ImportCases",
        "Number_Cases_Per_Node": 10,
        "class": "Outbreak"
    }
}
{
    "Use_Defaults": 1,
    "Events": [{
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 40,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Intervention_Config": {
                "class": "Outbreak",
                "Antigen": 0,
                "Genome": 0,
                "Number_Cases_Per_Node": 10
            }
        }
    }]
}
Individual-level interventions

Individual-level interventions determine what will be distributed to individuals to reduce the spread of a disease. For example, distributing vaccines or drugs are individual-level interventions. Sometimes this can be an intermediate intervention that schedules another intervention.

The following individual-level interventions are available for use with the generic simulation type.

BroadcastEvent

The BroadcastEvent intervention class immediately broadcasts the event trigger you specify. This campaign event is typically used with other classes that monitor for a broadcast event, such as NodeLevelHealthTriggeredIV or CommunityHealthWorkerEventCoordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Broadcast_Event

string

NA

NA

No Trigger

The name of the event that will trigger the intervention. See Event list for possible values.

{
    "Broadcast_Event": "HIVNeedsHIVTest"
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "4C: HIVMuxer",
    "Events": [{
            "Description": "Drive initial population into a loop",
            "class": "CampaignEvent",
            "Start_Day": 1,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Intervention_Config": {
                    "class": "BroadcastEvent",
                    "Broadcast_Event": "Loop_Entry_InitialPopulation"
                }
            }
        },
        {
            "Description": "Wait one year, only one entry allowed at a time per individual",
            "class": "CampaignEvent",
            "Start_Day": 1,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Intervention_Config": {
                    "class": "NodeLevelHealthTriggeredIV",
                    "Trigger_Condition": "TriggerList",
                    "Trigger_Condition_List": [
                        "Loop_Entry_InitialPopulation",
                        "Loop_Entry_Birth",
                        "Done_Waiting"
                    ],
                    "Actual_IndividualIntervention_Config": {
                        "class": "HIVMuxer",
                        "Disqualifying_Properties": ["InterventionStatus:Abort_Infinite_Loop"],
                        "New_Property_Value": "InterventionStatus:Infinite_Loop",
                        "Delay_Distribution": "FIXED_DURATION",
                        "Delay_Period": 365,
                        "Muxer_Name": "Delay_Loop_Muxer",
                        "Max_Entries": 1,
                        "Broadcast_Event": "Done_Waiting"
                    }
                }
            }
        }
    ]
}
BroadcastEventToOtherNodes

The BroadcastEventToOtherNodes intervention class allows events to be sent from one node to another. For example, if an individual in one node has been diagnosed, drugs may be distributed to individuals in surrounding nodes.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Max_Distance_To_Other_Nodes_Km

float

0

3.40E+3

3.40E+38

The maximum distance, in kilometers, to the destination node for the node to be selected. The location values used are those entered in the demographics file. Used only if Node_Selection_Type is either DISTANCE_ONLY or DISTANCE_AND_MIGRATION.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "BroadcastEventToOtherNodes",
        "Event_Trigger": "VaccinateNeighbors",
        "Include_My_Node" : 1,
        "Node_Selection_Type" : "DISTANCE_AND_MIGRATION",
        "Max_Distance_To_Other_Nodes_Km" : 1
    }
}

Event_Trigger

enum

NA

NA

NoTrigger

The name of the event to broadcast to selected nodes. See Event list for possible values.

{
    "Event_Trigger": "VaccinateNeighbors"
}

Include_My_Node

boolean

NA

NA

0

Set to true (1) to broadcast the event to the current node.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "BroadcastEventToOtherNodes",
        "Event_Trigger": "VaccinateNeighbors",
        "Include_My_Node" : 1,
        "Node_Selection_Type" : "DISTANCE_AND_MIGRATION",
        "Max_Distance_To_Other_Nodes_Km" : 1
    }
}

Node_Selection_Type

enum

NA

NA

DISTANCE_ONLY

The method by which to select nodes to receive the event. Possible values are:

DISTANCE_ONLY

Nodes located within the distance specified by Max_Distance_To_Other_Nodes_Km are selected.

MIGRATION_NODES_ONLY

Nodes that are local or regional are selected.

DISTANCE_AND_MIGRATION

Nodes are selected using DISTANCE_ONLY and MIGRATION_NODES_ONLY criteria.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "BroadcastEventToOtherNodes",
        "Event_Trigger": "VaccinateNeighbors",
        "Include_My_Node" : 1,
        "Node_Selection_Type" : "DISTANCE_AND_MIGRATION",
        "Max_Distance_To_Other_Nodes_Km" : 1
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [{
            "Event_Name": "Broadcast to Other Households If Person Infected",
            "class": "CampaignEvent",
            "Start_Day": 0,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Demographic_Coverage": 1,
                "Intervention_Config": {
                    "class": "NodeLevelHealthTriggeredIV",
                    "Trigger_Condition_List": ["NewClinicalCase"],
                    "Blackout_Event_Trigger": "Blackout",
                    "Blackout_Period": 0.0,
                    "Blackout_On_First_Occurrence": 0,
                    "Actual_IndividualIntervention_Config": {
                        "class": "BroadcastEventToOtherNodes",
                        "Event_Trigger": "VaccinateNeighbors",
                        "Include_My_Node": 1,
                        "Node_Selection_Type": "DISTANCE_AND_MIGRATION",
                        "Max_Distance_To_Other_Nodes_Km": 1
                    }
                }
            }
        },
        {
            "Event_Name": "Get Vaccinated If Neighbor Infected",
            "class": "CampaignEvent",
            "Start_Day": 0,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Demographic_Coverage": 1,
                "Intervention_Config": {
                    "class": "NodeLevelHealthTriggeredIV",
                    "Trigger_Condition_List": ["VaccinateNeighbors"],
                    "Blackout_Event_Trigger": "Blackout",
                    "Blackout_Period": 0.0,
                    "Blackout_On_First_Occurrence": 0,
                    "Actual_IndividualIntervention_Config": {
                        "class": "AntimalarialDrug",
                        "Cost_To_Consumer": 10,
                        "Dosing_Type": "FullTreatmentParasiteDetect",
                        "Drug_Type": "Chloroquine",
                        "Dont_Allow_Duplicates": 1
                    }
                }
            }
        }
    ]
}
ControlledVaccine

The ControlledVaccine intervention class is a subclass of SimpleVaccine so it contains all functionality of SimpleVaccine, but provides more control over additional events and event triggers. This intervention can be configured so that specific events are broadcast when individuals receive an intervention or when the intervention expires. Further, individuals can be re-vaccinated, using a configurable wait time between vaccinations.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Distributed_Event_Trigger

enum

NA

NA

NoTrigger

The name of the event to be broadcast when the intervention is distributed to an individual. See Event list for possible values.

{
    "Distributed_Event_Trigger": "Vaccinated"
}

Duration_To_Wait_Before_Revaccination

float

0

3.40E+3

3.40E+38

The length of time, in days, to wait before revaccinating an individual. After this time has passed, the individual can be revaccinated. If the first vaccine has not expired, the individual can receive the effect from both doses of the vaccine.

{
    "Duration_To_Wait_Before_Revaccination": 240
}

Expired_Event_Trigger

enum

NA

NA

NoTrigger

The name of the event to be broadcast when the intervention is distributed to an individual. See Event list for possible values.

{
    "Expired_Event_Trigger": "VaccineExpired"
}

Efficacy_Is_Multiplicative

boolean

NA

NA

1

The overall vaccine efficacy when individuals receive more than one vaccine. When set to true (1), the vaccine efficacies are multiplied together; when set to false (0), the efficacies are additive.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Waning_Config

JSON object

NA

NA

NA

The configuration of how the intervention efficacy wanes over time. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Waning_Config": {
        "Box_Duration": 3650,
        "Initial_Effect": 1,
        "class": "WaningEffectBox"
    }
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Vaccine_Type

enum

NA

NA

Generic

The type of vaccine to distribute in a vaccine intervention. Possible values are:

Generic

The vaccine can reduce transmission, acquisition, and mortality.

TransmissionBlocking

The vaccine will reduce pathogen transmission.

AcquisitionBlocking

The vaccine will reduce the acquisition of the pathogen by reducing the force of infection experienced by the vaccinated individual.

MortalityBlocking

The vaccine reduces the disease-mortality rate of a vaccinated individual.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [{
            "COMMENT": "Vaccinate Everyone with VaccineA",
            "class": "CampaignEvent",
            "Start_Day": 1,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Intervention_Config": {
                    "class": "ControlledVaccine",
                    "Intervention_Name": "VaccineA",
                    "Cost_To_Consumer": 1,
                    "Vaccine_Type": "AcquisitionBlocking",
                    "Vaccine_Take": 1.0,
                    "Waning_Config": {
                        "class": "WaningEffectMapLinear",
                        "Initial_Effect": 1.0,
                        "Expire_At_Durability_Map_End": 1,
                        "Durability_Map": {
                            "Times": [0, 25, 50],
                            "Values": [1.0, 1.0, 0.0]
                        }
                    },
                    "Distributed_Event_Trigger": "VaccinatedA",
                    "Expired_Event_Trigger": "VaccineExpiredA",
                    "Duration_To_Wait_Before_Revaccination": 40
                }
            }
        },
        {
            "COMMENT": "After the first round expires, distribute a different vaccine, VaccineB",
            "class": "CampaignEvent",
            "Start_Day": 60,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Intervention_Config": {
                    "class": "ControlledVaccine",
                    "Intervention_Name": "VaccineB",
                    "Cost_To_Consumer": 1,
                    "Vaccine_Type": "AcquisitionBlocking",
                    "Vaccine_Take": 1.0,
                    "Waning_Config": {
                        "class": "WaningEffectMapLinear",
                        "Initial_Effect": 1.0,
                        "Expire_At_Durability_Map_End": 1,
                        "Durability_Map": {
                            "Times": [0, 25, 50],
                            "Values": [1.0, 1.0, 0.0]
                        }
                    },
                    "Distributed_Event_Trigger": "VaccinatedB",
                    "Expired_Event_Trigger": "VaccineExpiredB",
                    "Duration_To_Wait_Before_Revaccination": 40
                }
            }
        }
    ]
}
DelayedIntervention

The DelayedIntervention intervention class introduces a delay between when the intervention is distributed to the individual and when they receive the actual intervention. This is due to the frequent occurrences of time delays as individuals seek care and receive treatment. This intervention allows configuration of the distribution type for the delay as well as the fraction of the population that receives the specified intervention.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Actual_IndividualIntervention_Configs

array of JSON objects

NA

NA

NA

An array of nested interventions to be distributed at the end of a delay period, to covered fraction of the population.

{
    "Actual_IndividualIntervention_Configs": [{
        "class": "HIVSimpleDiagnostic",
        "New_Property_Value": "InterventionStatus:None",
        "Base_Specificity": 1,
        "Base_Sensitivity": 1,
        "Event_Or_Config": "Event",
        "Positive_Diagnosis_Event": "NoTrigger",
        "Negative_Diagnosis_Event": "HIVNeedsMaleCircumcision"
    }]
}

Coverage

float

0

1

1

The proportion of individuals who receive the DelayedIntervention that actually receive the configured interventions.

{
    "Coverage": 1.0
}

Delay_Distribution

enum

NA

NA

NOT_INITIALIZED

The distribution of the time delay from when the intervention is distributed to when the individual actually receives the intervention. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Delay_Distribution": "UNIFORM_DURATION"
}

Delay_Period

float

0

3.40E+3

6

When Delay_Distribution is set to FIXED_DURATION, this will specify the time delay (in number of days). When Delay_Distribution is set to EXPONENTIAL_DURATION, this represents the exponential rate that describes the distribution of the time delay (in units of 1/days).

{
    "Delay_Distribution": "FIXED_DURATION",
    "Delay_Period": 8
}

Delay_Period_Max

float

0

3.40E+3

6

The maximum time delay (in number of days) when Delay_Distribution is set to UNIFORM_DURATION.

{
    "Delay_Distribution": "UNIFORM_DURATION",
    "Delay_Period_Min": 1,
    "Delay_Period_Max": 30
}

Delay_Period_Mean

float

0

3.40E+3

6

The mean time delay (in number of days), when Delay_Distribution is set to GAUSSIAN_DURATION.

{
    "Delay_Distribution": "GAUSSIAN_DURATION",
    "Delay_Period_Mean": 25,
    "Delay_Period_Std_Dev": 5
}

Delay_Period_Min

float

0

3.40E+3

6

The minimum time delay (in number of days) when Delay_Distribution is set to UNIFORM_DURATION.

{
    "Delay_Distribution": "UNIFORM_DURATION",
    "Delay_Period_Min": 1,
    "Delay_Period_Max": 30
}

Delay_Period_Scale

float

0

3.40E+3

16

The scale parameter (lambda > 0) of the distribution (in days) when Delay_Distribution is set to WEIBULL_DURATION.

{
    "Delay_Distribution": "WEIBULL_DURATION",
    "Delay_Period_Scale": 10,
    "Delay_Period_Shape": 15
}

Delay_Period_Shape

float

0

20

The shape parameter (kappa > 0) of the distribution when Delay_Distribution is set to WEIBULL_DURATION.

{
    "Delay_Distribution": "WEIBULL_DURATION",
    "Delay_Period_Scale": 10,
    "Delay_Period_Shape": 15
}

Delay_Period_Std_Dev

float

0

3.40E+3

6

The standard deviation of the Gaussian distribution (in number of days) when Delay_Distribution is set to GAUSSIAN_DURATION.

{
    "Delay_Distribution": "GAUSSIAN_DURATION",
    "Delay_Period_Mean": 25,
    "Delay_Period_Std_Dev": 5
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}
{
    "Campaign_Name": "Initial Seeding",
    "Events": [{
            "Event_Name": "Outbreak",
            "class": "CampaignEvent",
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Start_Day": 1,
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Intervention_Config": {
                    "class": "DelayedIntervention",
                    "Delay_Distribution": "FIXED_DURATION",
                    "Delay_Period": 25,
                    "Actual_IndividualIntervention_Configs": [{
                        "Outbreak_Source": "PrevalenceIncrease",
                        "class": "OutbreakIndividual"
                    }]
                }
            }
        },
        {
            "Event_Name": "Outbreak",
            "class": "CampaignEvent",
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Start_Day": 50,
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Intervention_Config": {
                    "class": "DelayedIntervention",
                    "Delay_Distribution": "UNIFORM_DURATION",
                    "Delay_Period_Min": 15,
                    "Delay_Period_Max": 30,
                    "Actual_IndividualIntervention_Configs": [{
                        "Outbreak_Source": "PrevalenceIncrease",
                        "class": "OutbreakIndividual"
                    }]
                }
            }
        }
    ],
    "Use_Defaults": 1
}
IndividualImmunityChanger

The IndividualImmunityChanger intervention class acts essentially as a MultiEffectVaccine, with the exception of how the behavior is implemented. Rather than attaching a persistent vaccine intervention object to an individual’s intervention list (as a campaign-individual-multieffectboostervaccine does), the IndividualImmunityChanger directly alters the immune modifiers of the individual’s susceptibility object and is then immediately disposed of. Any immune waning is not governed by Waning effect classes, as MultiEffectVaccine is, but rather by the immunity waning parameters in the configuration file.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Boost_Acquire

float

0

1

0

Specifies the boosting effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Acquire": 0.7
}

Boost_Mortality

float

0

1

0

Specifies the boosting effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Mortality": 1.0
}

Boost_Threshold_Acquire

float

0

1

0

Specifies how much acquisition immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Acquire": 0.0
}

Boost_Threshold_Mortality

float

0

1

0

Specifies how much mortality immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Mortality": 0.0
}

Boost_Threshold_Transmit

float

0

1

0

Specifies how much transmission immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Transmit": 0.0
}

Boost_Transmit

float

0

1

0

Specifies the boosting effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Transmit": 0.5
}

Prime_Acquire

float

0

1

0

Specifies the priming effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Acquire": 0.1
}

Prime_Mortality

float

0

1

0

Specifies the priming effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Mortality": 0.3
}

Prime_Transmit

float

0

1

0

Specifies the priming effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Transmit": 0.2
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "Generic Seattle Regression Campaign",
    "Events": [{
        "Start_Day": 10,
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "class": "IndividualImmunityChanger",
                "Cost_To_Consumer": 10.0,
                "Prime_Acquire": 0.1,
                "Prime_Transmit": 0.2,
                "Prime_Mortality": 0.3,
                "Boost_Acquire": 0.7,
                "Boost_Transmit": 0.7,
                "Boost_Mortality": 1.0,
                "Boost_Threshold_Acquire": 0.2,
                "Boost_Threshold_Transmit": 0.1,
                "Boost_Threshold_Mortality": 0.1
            }
        }
    }]
}
IVCalendar

The IVCalendar intervention class contains a list of ages when an individual will receive the actual intervention. In IVCalendar, there is a list of actual interventions where the distribution is dependent on whether the individual’s age matches the next date in the calendar. This implies that at a certain age, the list of actual interventions will be distributed according to a given probability. While a typical use case might involve the distribution of calendars by a BirthTriggeredIV in the context of a routine vaccination schedule, calendars may also be distributed directly to individuals.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Actual_IndividualIntervention_Configs

array of JSON objects

NA

NA

NA

An array of interventions that will be distributed as specified in the calendar. This parameter selects a class for the intervention and configures the parameters specific for that intervention class.

{  
    "Actual_IndividualIntervention_Config": {
        "class": "IVCalendar",
        "Actual_IndividualIntervention_Configs": [{
            "class": "BCGVaccine",
            "Cost_To_Consumer": 10,
            "Vaccine_Take": 1,
            "Vaccine_Take_Age_Decay_Rate": 0,
             "Waning_Config": {
                "Initial_Effect": 1,
                "Box_Duration": 3650,
                "Decay_Rate_Factor": 3650,
                "class": "WaningEffectBoxExponential"
            }
        }]
    }
}    

Age

float

0

45625

NA

An array of ages (in days). In IVCalendar, there is a list of actual interventions where the distribution is dependent on whether the individual’s age matches the next date in the calendar.

{
    "Calendar": [{
            "Age": 60,
            "Probability": 1
        },
        {
            "Age": 120,
            "Probability": 1
        },
        {
            "Age": 180,
            "Probability": 1
        },
        {
            "Age": 510,
            "Probability": 0.9
        },
        {
            "Age": 1825,
            "Probability": 0.95
        },
        {
            "Age": 4200,
            "Probability": 0.95
        }
    ]
}

Calendar

array of JSON objects

NA

NA

NA

An array of ages, days and the probabilities of receiving the list of interventions at each age. Calendar has two parameters: Probability and Age.

{
    "Calendar": [{
            "Age": 60,
            "Probability": 1
        },
        {
            "Age": 120,
            "Probability": 1
        },
        {
            "Age": 180,
            "Probability": 1
        },
        {
            "Age": 510,
            "Probability": 0.9
        },
        {
            "Age": 1825,
            "Probability": 0.95
        },
        {
            "Age": 4200,
            "Probability": 0.95
        }
    ]
}

Dropout

boolean

NA

NA

0

If set to true (1), when an intervention distribution is missed, all subsequent interventions are also missed. If set to false (0), all calendar dates/doses are applied independently of each other.

{
    "Actual_IndividualIntervention_Config": {
        "class": "IVCalendar",
        "Dont_Allow_Duplicates": 0,
        "Dropout": 0,
        "Calendar": [{
            "Age": 12045,
            "Probability": 1
        }]
    }
}

Probability

float

0

1

NA

The probability of an individual receiving the list of actual interventions at the corresponding age.

{
    "Calendar": [{
            "Age": 60,
            "Probability": 1
        },
        {
            "Age": 120,
            "Probability": 1
        },
        {
            "Age": 180,
            "Probability": 1
        },
        {
            "Age": 510,
            "Probability": 0.9
        },
        {
            "Age": 1825,
            "Probability": 0.95
        },
        {
            "Age": 4200,
            "Probability": 0.95
        }
    ]
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "BCG vaccination calendar distributed at birth",
    "Events": [{
        "Event_Name": "BCG vaccinations scheduled at birth",
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1825,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Target_Demographic": "Everyone",
            "Intervention_Config": {
                "class": "BirthTriggeredIV",
                "Demographic_Coverage": 0.9,
                "Actual_IndividualIntervention_Config": {
                    "class": "IVCalendar",
                    "Calendar": [{
                            "Age": 30,
                            "Probability": 1
                        },
                        {
                            "Age": 3650,
                            "Probability": 1
                        }
                    ],
                    "Dropout": 0,
                    "Actual_IndividualIntervention_Configs": [{
                        "class": "BCGVaccine",
                        "Cost_To_Consumer": 8,
                        "Vaccine_Take": 0.8,
                        "Vaccine_Take_Age_Decay_Rate": 0.2,
                        "Waning_Config": {
                            "Initial_Rate": 0.9,
                            "Decay_Time_Constant": 3650,
                            "class": "WaningEffectExponential"
                        }
                    }]
                }
            }
        }
    }]
}
MigrateIndividuals

The MigrateIndividuals intervention class is used to force migration and is separate from the normal migration system. However, it does require that human migration is enabled.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Duration_At_Node_Exponential_Period

float

0

3.40E+3

6

The period (1/rate) to use for an exponential distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to EXPONENTIAL_DURATION.

{
    "Duration_At_Node_Distribution_Type": "EXPONENTIAL_DURATION",
    "Duration_At_Node_Exponential_Period": 4
}

Duration_At_Node_Fixed

float

0

3.40E+3

6

The value to use for a fixed distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to FIXED_DURATION.

{
    "Duration_At_Node_Distribution_Type" : "FIXED_DURATION",
    "Duration_At_Node_Fixed": 10
}

Duration_At_Node_Gausian_Mean

float

0

3.40E+3

6

The mean value to use for a Gaussian distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_At_Node_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_At_Node_Gausian_Mean": 9.0,
    "Duration_At_Node_Gausian_StdDev": 2.0
}

Duration_At_Node_Gausian_StdDev

float

0

3.40E+3

1

The standard deviation to use for a Gaussian distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_At_Node_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_At_Node_Gausian_Mean": 9.0,
    "Duration_At_Node_Gausian_StdDev": 2.0
}

Duration_At_Node_Poisson_Mean

float

0

3.40E+3

6

The mean to use for a Poisson distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to POISSON_DURATION.

{
    "Duration_At_Node_Distribution_Type": "POISSON_DURATION",
    "Duration_At_Node_Poisson_Mean": 4
}

Duration_At_Node_Distribution_Type

enum

NA

NA

NOT_INITIALIZED

The shape of the distribution for the amount of time spent at the destination node for intervention-based migration. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Duration_At_Node_Distribution_Type": "GAUSSIAN_DURATION"
}

Duration_At_Node_Uniform_Max

float

0

3.40E+3

0

The maximum value to use for a uniform distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_At_Node_Distribution_Type": "UNIFORM_DURATION",
    "Duration_At_Node_Uniform_Max": 75,
    "Duration_At_Node_Uniform_Min": 45
}

Duration_At_Node_Uniform_Min

float

0

3.40E+3

0

The minimum value to use for a uniform distribution for the amount of time spent at the destination node when Duration_At_Node_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_At_Node_Distribution_Type": "UNIFORM_DURATION",
    "Duration_At_Node_Uniform_Max": 75,
    "Duration_At_Node_Uniform_Min": 45
}

Duration_Before_Leaving_Exponential_Period

float

0

3.40E+3

6

The period (1/rate) to use for an exponential distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to EXPONENTIAL_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "EXPONENTIAL_DURATION",
    "Duration_Before_Leaving_Exponential_Period": 4
}

Duration_Before_Leaving_Fixed

float

0

3.40E+3

6

The value to use for a fixed distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to FIXED_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "FIXED_DURATION",
    "Duration_Before_Leaving_Fixed": 4
}

Duration_Before_Leaving_Gausian_Mean

float

0

3.40E+3

6

The mean value to use for a Gaussian distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_Before_Leaving_Gausian_Mean": 9.0,
    "Duration_Before_Leaving_Gausian_StdDev": 2.0
}

Duration_Before_Leaving_Gausian_StdDev

float

0

3.40E+3

1

The standard deviation to use for a Gaussian distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to GAUSSIAN_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "GAUSSIAN_DURATION",
    "Duration_Before_Leaving_Gausian_Mean": 9.0,
    "Duration_Before_Leaving_Gausian_StdDev": 2.0
}

Duration_Before_Leaving_Poisson_Mean

float

0

3.40E+3

6

The mean to use for a Poisson distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to POISSON_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "POISSON_DURATION",
    "Duration_Before_Leaving_Poisson_Mean": 3.0,
}

Duration_Before_Leaving_Distribution_Type

enum

NA

NA

NOT_INITIALIZED

The shape of the distribution of the number of days to wait before migrating to the destination node for intervention-based migration. Possible values are:

NOT_INITIALIZED

No distribution set.

FIXED_DURATION

A constant duration.

UNIFORM_DURATION

A uniform random draw for the duration.

GAUSSIAN_DURATION

Duration of the active period is defined by the mean and standard deviation of the Gaussian distribution. Negative values are truncated at zero.

EXPONENTIAL_DURATION

The active period is the mean of the exponential random draw.

POISSON_DURATION

The active period is the mean of the random Poisson draw.

LOG_NORMAL_DURATION

The active period is a log normal distribution defined by a mean and log width.

BIMODAL_DURATION

The distribution is bimodal, the duration is a fraction of the active period for a specified period of time and equal to the active period otherwise.

PIECEWISE_CONSTANT

The distribution is specified with a list of years and a matching list of values. The duration at a given year is that specified for the nearest previous year.

PIECEWISE_LINEAR

The distribution is specified with a list of years and matching list of values. The duration at a given year is a linear interpolation of the specified values.

WEIBULL_DURATION

The duration is a Weibull distribution with a given scale and shape.

DUAL_TIMESCALE_DURATION

The duration is two exponential distributions with given means.

{
    "Duration_Before_Leaving_Distribution_Type": "FIXED_DURATION"
}

Duration_Before_Leaving_Uniform_Max

float

0

3.40E+3

0

The maximum value to use for a uniform distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "UNIFORM_DURATION",
    "Duration_Before_Leaving_Uniform_Max": 14,
    "Duration_Before_Leaving_Uniform_Min": 0,
}

Duration_Before_Leaving_Uniform_Min

float

0

3.40E+3

0

The minimum value to use for a uniform distribution of the number of days to wait before migrating to the destination node when Duration_Before_Leaving_Distribution_Type is set to UNIFORM_DURATION.

{
    "Duration_Before_Leaving_Distribution_Type": "UNIFORM_DURATION",
    "Duration_Before_Leaving_Uniform_Max": 14,
    "Duration_Before_Leaving_Uniform_Min": 0,
}

Is_Moving

boolean

NA

NA

0

Set to true (1) to indicate the individual is permanently moving to a new home node for intervention-based migration.

{
    "Is_Moving": 1
}

NodeID_To_Migrate_To

integer

0

2.15E+0

0

The destination node ID for intervention-based migration.

{
    "NodeID_To_Migrate_To": 26
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Events": [
        {
            "class": "CampaignEvent",
            "Start_Day": 5,
            "Nodeset_Config": {
                "class": "NodeSetNodeList",
                "Node_List": [ 1 ]
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Residents_Only": 1,
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Intervention_Config": {
                    "class": "MigrateIndividuals",
                    "NodeID_To_Migrate_To": 2,
                    "Duration_Before_Leaving_Distribution_Type": "FIXED_DURATION",
                    "Duration_Before_Leaving_Fixed": 0,
                    "Duration_At_Node_Distribution_Type": "FIXED_DURATION",
                    "Duration_At_Node_Fixed": 999,
                    "Is_Moving": 0
                }
            }
        }
    ]
}
MultiEffectBoosterVaccine

The MultiEffectBoosterVaccine intervention class is derived from MultiEffectVaccine and preserves many of the same parameters. Upon distribution and successful take, the vaccine’s effect in each immunity compartment (acquisition, transmission, and mortality) is determined by the recipient’s immune state. If the recipient’s immunity modifier in the corresponding compartment is above a user-specified threshold, then the vaccine’s initial effect will be equal to the corresponding priming parameter. If the recipient’s immune modifier is below this threshold, then the vaccine’s initial effect will be equal to the corresponding boost parameter. After distribution, the effect wanes, just like a MultiEffectVaccine. The behavior is intended to mimic biological priming and boosting.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Acquire_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine acquisition. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Acquire_Config": {
        "Initial_Effect": 0.9,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Mortality_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine mortality. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Mortality_Config": {
        "Initial_Effect": 1.0,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Transmit_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine transmission. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Transmit_Config": {
        "Initial_Effect": 0.6,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Boost_Acquire

float

0

1

0

Specifies the boosting effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Acquire": 0.7
}

Boost_Mortality

float

0

1

0

Specifies the boosting effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Mortality": 1.0
}

Boost_Threshold_Acquire

float

0

1

0

Specifies how much acquisition immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Acquire": 0.0
}

Boost_Threshold_Mortality

float

0

1

0

Specifies how much mortality immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Mortality": 0.0
}

Boost_Threshold_Transmit

float

0

1

0

Specifies how much transmission immunity is required before the vaccine changes from a prime to a boost.

{
    "Boost_Threshold_Transmit": 0.0
}

Boost_Transmit

float

0

1

0

Specifies the boosting effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine. This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Boost_Transmit": 0.5
}

Prime_Acquire

float

0

1

0

Specifies the priming effect on acquisition immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Acquire": 0.1
}

Prime_Mortality

float

0

1

0

Specifies the priming effect on mortality immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Mortality": 0.3
}

Prime_Transmit

float

0

1

0

Specifies the priming effect on transmission immunity for naive individuals (without natural or vaccine-derived immunity) for a multi-effect booster vaccine.

{
    "Prime_Transmit": 0.2
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "Generic Seattle Regression Campaign",
    "Events": [{
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "Cost_To_Consumer": 10.0,
                "Vaccine_Take": 1,
                "Prime_Acquire": 0.1,
                "Prime_Transmit": 0.2,
                "Prime_Mortality": 0.3,
                "Boost_Acquire": 0.7,
                "Boost_Transmit": 0.5,
                "Boost_Mortality": 1.0,
                "Boost_Threshold_Acquire": 0.0,
                "Boost_Threshold_Transmit": 0.0,
                "Boost_Threshold_Mortality": 0.0,
                "Acquire_Config": {
                    "Box_Duration": 100,
                    "Initial_Effect": 0.5,
                    "class": "WaningEffectBox"
                },
                "Transmit_Config": {
                    "Box_Duration": 100,
                    "Initial_Effect": 0.5,
                    "class": "WaningEffectBox"
                },
                "Mortality_Config": {
                    "Box_Duration": 100,
                    "Initial_Effect": 0.5,
                    "class": "WaningEffectBox"
                },
                "class": "MultiEffectBoosterVaccine"
            },
            "Target_Demographic": "Everyone",
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }]
}
MultiEffectVaccine

The MultiEffectVaccine intervention class implements vaccine campaigns in the simulation. Vaccines can effect all of the following:

  • Reduce the likelihood of acquiring an infection

  • Reduce the likelihood of transmitting an infection

  • Reduce the likelihood of death

After distribution, the effect wanes over time.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Acquire_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine acquisition. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Acquire_Config": {
        "Initial_Effect": 0.9,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Mortality_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine mortality. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Mortality_Config": {
        "Initial_Effect": 1.0,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Transmit_Config

JSON object

NA

NA

NA

The configuration for multi-effect vaccine transmission. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Transmit_Config": {
        "Initial_Effect": 0.6,
        "Decay_Time_Constant": 2525,
        "class": "WaningEffectExponential"
    }
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 1,
            "Intervention_Config": {
                "Cost_To_Consumer": 20,
                "Vaccine_Take": 1,
                "Vaccine_Type": "Generic",
                "class": "MultiEffectVaccine",
                "Acquire_Config": {
                    "Initial_Effect": 0.9,
                    "Decay_Time_Constant": 7300,
                    "class": "WaningEffectExponential"
                },
                "Transmit_Config": {
                    "Initial_Effect": 0.9,
                    "Decay_Time_Constant": 7300,
                    "class": "WaningEffectExponential"
                },
                "Mortality_Config": {
                    "Initial_Effect": 1.0,
                    "Decay_Time_Constant": 7300,
                    "class": "WaningEffectExponential"
                }
            },
            "Property_Restrictions": [
                "Accessibility:VaccineTake"
            ],
            "Target_Age_Max": 100,
            "Target_Age_Min": 12,
            "Target_Demographic": "ExplicitAgeRanges",
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }],
    "Use_Defaults": 1
}
MultiInterventionDistributor

The MultiInterventionDistributer intervention class allows you to input a list of interventions, rather than just a single intervention, to be distributed simultaneously to the same individuals.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Intervention_List

array of JSON objects

NA

NA

NA

The list of individual interventions that is distributed by MultiInterventionDistributor.

{
    "Actual_IndividualIntervention_Config": {
        "Intervention_List": [{
                "Cost_To_Consumer": 1,
                "Dosing_Type": "FullTreatmentNewDetectionTech",
                "Drug_Type": "Artemether",
                "class": "AntimalarialDrug"
            },
            {
                "Cost_To_Consumer": 1,
                "Dosing_Type": "FullTreatmentNewDetectionTech",
                "Drug_Type": "Lumefantrine",
                "class": "AntimalarialDrug"
            }
        ],
        "class": "MultiInterventionDistributor"
    }
}

Number_Repetitions

integer

-1

1000

1

The number of times an intervention is given, used with Timesteps_Between_Repetitions.

{
    "Event_Coordinator_Config": {
        "Intervention_Config": {
            "class": "Outbreak",
            "Num_Cases": 1
        },
        "Number_Repetitions": 10,
        "Timesteps_Between_Repetitions": 50,
        "class": "StandardInterventionDistributionEventCoordinator"
    }
}

Timesteps_Between_Repetitions

integer

-1

10000

-1

The repetition interval.

{
    "Timesteps_Between_Repetitions": 50
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
  "Events": [{
    "class": "CampaignEvent",
    "Nodeset_Config": {
      "class": "NodeSetAll"
    },
    "Start_Day": 0,
    "Event_Coordinator_Config": {
      "class": "CommunityHealthWorkerEventCoordinator",
      "Demographic_Coverage": 1,
      "Target_Demographic": "Everyone",
      "Target_Residents_Only": 0,
      "Trigger_Condition_List": [
        "HappyBirthday"
      ],
      "Amount_In_Shipment": 1000,
      "Days_Between_Shipments": 30,
      "Max_Distributed_Per_Day": 50,
      "Duration": 700,
      "Waiting_Period": 7,
      "Max_Stock": 1000,
      "Initial_Amount": 500,
      "Initial_Amount_Distribution_Type": "FIXED_DURATION",
      "Intervention_Config": {
        "class": "MultiInterventionDistributor",
        "Intervention_List": [{
            "class": "SimpleVaccine",
            "Cost_To_Consumer": 1,
            "Vaccine_Type": "AcquisitionBlocking",
            "Vaccine_Take": 1,
            "Efficacy_Is_Multiplicative": 1,
            "Waning_Config": {
              "class": "WaningEffectConstant",
              "Initial_Effect": 0.9
            }
          },
          {
            "class": "BroadcastEvent",
            "Broadcast_Event": "Received_Treatment"
          }
        ]
      }
    }
  }],
  "Use_Defaults": 1
}
OutbreakIndividual

The OutbreakIndividual intervention class introduces contagious diseases that are compatible with the simulation type to existing individuals using the individual targeted features configured in the appropriate event coordinator.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

Warning

The event containing the outbreak “intervention” must be the last one listed in the campaign file or none of the disease control interventions will take place.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Ignore_Immunity

boolean

NA

NA

1

Individuals will be force-infected (with a specific strain) regardless of actual immunity level when set to true (1).

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "class": "OutbreakIndividual",
        "Ignore_Immunity": 0
    }
}

Antigen

integer

0

10

0

The antigenic ID of the outbreak infection.

{  
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual"
    }   
}

Genome

integer

-2.15E+0

2.15E+0

0

The genetic ID of the outbreak infection.

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "Outbreak_Source": "PrevalenceIncrease",
        "class": "OutbreakIndividual",
        "Incubation_Period_Override": 0
    }
}

Incubation_Period_Override

integer

-1

2.15E+0

-1

The incubation period, in days, that infected individuals will go through before becoming infectious. This value overrides the incubation period set in the configuration file. Set to -1 to honor the configuration parameter settings.

{
    "Incubation_Period_Override": 0
}

Ignore_Immunity

boolean

NA

NA

1

Individuals will be force-infected (with a specific strain) regardless of actual immunity level when set to true (1).

{
    "Intervention_Config": {
        "Antigen": 0,
        "Genome": 0,
        "class": "OutbreakIndividual",
        "Ignore_Immunity": 0
    }
}
{
    "Events": [{
        "Event_Coordinator_Config": {
            "Demographic_Coverage": 0.005,
            "Intervention_Config": {
                "Outbreak_Source": "PrevalenceIncrease",
                "class": "OutbreakIndividual"
            },
            "class": "StandardInterventionDistributionEventCoordinator"
        },
        "Event_Name": "Outbreak",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 1,
        "class": "CampaignEvent"
    }],
    "Use_Defaults": 1
}
PropertyValueChanger

The PropertyValueChanger intervention class assigns new individual property values to individuals. You must update one property value and have the option to update another using New_Property_Value. This parameter is generally used to move patients from one intervention state in the health care cascade (InterventionStatus) to another, though it can be used for any individual property. Individual property values are user-defined in the demographics file (see NodeProperties and IndividualProperties for more information). Note that the HINT feature does not need to be enabled to use this intervention. To instead change node properties, use NodePropertyValueChanger.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Daily_Probability

float

0

1

1

The probability that an individual will move to the Target_Property_Value.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Maximum_Duration

float

-1

3.40E+3

3.40E+38

The maximum amount of time individuals have to move to a new group. This timing works in conjunction with Daily_Probability.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Revert

float

0

10000

0

The number of days before an individual moves back to their original group.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Target_Property_Key

string

NA

NA

NA

The name of the individual property type whose value will be updated by the intervention.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "New_Property_Value": "",
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Target_Property_Value

string

NA

NA

NA

The user-defined value of the individual property that will be assigned to the individual.

{
    "Intervention_Config": {
        "class": "PropertyValueChanger",
        "Disqualifying_Properties": [],
        "Target_Property_Key": "Risk",
        "Target_Property_Value": "LOW",
        "New_Property_Value": "",
        "Daily_Probability": 1.0,
        "Maximum_Duration": 0,
        "Revert": 0
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Events": [
        {
            "class": "CampaignEvent",
            "Start_Day": 10,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Property_Restrictions": [
                    "Risk:LOW"
                ],
                "Intervention_Config": {
                    "class": "PropertyValueChanger",
                    "Disqualifying_Properties": [ "InterventionStatus:Diagnosed"],
                    "New_Property_Value": "InterventionStatus:Monitor",
                    "Target_Property_Key" : "Risk",
                    "Target_Property_Value" : "HIGH",
                    "Daily_Probability" : 1.0,
                    "Maximum_Duration" : 0,
                    "Revert" : 10
                }
            }
        }
    ],
    "Use_Defaults": 1
}
SimpleBoosterVaccine

The SimpleBoosterVaccine intervention class is derived from SimpleVaccine and preserves many of the same parameters. The behavior is much like SimpleVaccine, except that upon distribution and successful take, the vaccine’s effect is determined by the recipient’s immune state. If the recipient’s immunity modifier in the corresponding channel (acquisition, transmission, or mortality) is above a user-specified threshold, then the vaccine’s initial effect will be equal to the corresponding priming parameter. If the recipient’s immune modifier is below this threshold, then the vaccine’s initial effect will be equal to the corresponding boosting parameter. After distribution, the effect wanes, just like SimpleVaccine. In essence, this intervention provides a SimpleVaccine intervention with one effect to all naive (below- threshold) individuals, and another effect to all primed (above-threshold) individuals; this behavior is intended to mimic biological priming and boosting.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Boost_Effect

float

0

1

1

Specifies the boosting effect on [acquisition/transmission/mortality] immunity for previously exposed individuals (either natural or vaccine-derived). This does not replace current immunity, it builds multiplicatively on top of it.

{
    "Intervention_Config": {
        "Cost_To_Consumer": 10.0,
        "Vaccine_Take": 1,
        "Vaccine_Type": "MortalityBlocking",
        "Prime_Effect": 0.25,
        "Boost_Effect": 0.45,
        "Boost_Threshold": 0.0,
        "Waning_Config": {
            "Box_Duration": 10,
            "Initial_Effect": 1,
            "class": "WaningEffectBox"
        },
        "class": "SimpleBoosterVaccine"
    }
}

Boost_Threshold

float

0

1

0

Specifies how much immunity is required before the vaccine changes from a priming effect to a boosting effect.

{
    "Intervention_Config": {
        "Cost_To_Consumer": 10.0,
        "Vaccine_Take": 1,
        "Vaccine_Type": "MortalityBlocking",
        "Prime_Effect": 0.25,
        "Boost_Effect": 0.45,
        "Boost_Threshold": 0.0,
        "Waning_Config": {
            "Box_Duration": 10,
            "Initial_Effect": 1,
            "class": "WaningEffectBox"
        },
        "class": "SimpleBoosterVaccine"
    }
}

Prime_Effect

float

0

1

1

Specifies the priming effect on [acquisition/transmission/mortality] immunity for naive individuals (without natural or vaccine-derived immunity).

{
    "Intervention_Config": {
        "Cost_To_Consumer": 10.0,
        "Vaccine_Take": 1,
        "Vaccine_Type": "MortalityBlocking",
        "Prime_Effect": 0.25,
        "Boost_Effect": 0.45,
        "Boost_Threshold": 0.0,
        "Waning_Config": {
            "Box_Duration": 10,
            "Initial_Effect": 1,
            "class": "WaningEffectBox"
        },
        "class": "SimpleBoosterVaccine"
    }
}

Efficacy_Is_Multiplicative

boolean

NA

NA

1

The overall vaccine efficacy when individuals receive more than one vaccine. When set to true (1), the vaccine efficacies are multiplied together; when set to false (0), the efficacies are additive.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Waning_Config

JSON object

NA

NA

NA

The configuration of how the intervention efficacy wanes over time. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Waning_Config": {
        "Box_Duration": 3650,
        "Initial_Effect": 1,
        "class": "WaningEffectBox"
    }
}

Vaccine_Type

enum

NA

NA

Generic

The type of vaccine to distribute in a vaccine intervention. Possible values are:

Generic

The vaccine can reduce transmission, acquisition, and mortality.

TransmissionBlocking

The vaccine will reduce pathogen transmission.

AcquisitionBlocking

The vaccine will reduce the acquisition of the pathogen by reducing the force of infection experienced by the vaccinated individual.

MortalityBlocking

The vaccine reduces the disease-mortality rate of a vaccinated individual.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Use_Defaults": 1,
    "Campaign_Name": "Generic Seattle Regression Campaign",
    "Events": [{
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 20,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 1.0,
            "Intervention_Config": {
                "class": "SimpleBoosterVaccine",
                "Cost_To_Consumer": 10.0,
                "Vaccine_Take": 1,
                "Vaccine_Type": "MortalityBlocking",
                "Prime_Effect": 0.25,
                "Boost_Effect": 0.45,
                "Boost_Threshold": 0.0,
                "Waning_Config": {
                    "Box_Duration": 10,
                    "Initial_Effect": 1,
                    "class": "WaningEffectBox"
                }
            }
        }
    }]
}
SimpleDiagnostic

The SimpleDiagnostic intervention class identifies infected individuals, regardless of disease state, based on specified diagnostic sensitivity and specificity. Diagnostics are a key component of modern disease control efforts, whether used to identify high-risk individuals, infected individuals, or drug resistance. This intervention class distributes a specified intervention to a fraction of individuals who test positive.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Treatment_Fraction

float

0

1

1

The fraction of positive diagnoses that are treated.

{
    "Intervention_Config": {
        "Base_Sensitivity": 1.0,
        "Base_Specificity": 1.0,
        "Cost_To_Consumer": 0.0,
        "Days_To_Diagnosis": 0.0,
        "Event_Or_Config": "Event",
        "Positive_Diagnosis_Event": "TestedPositive_CureMeNow",
        "Treatment_Fraction": 1.0,
        "class": "SimpleDiagnostic"
    }
}

Positive_Diagnosis_Config

JSON object

NA

NA

NA

The intervention distributed to individuals if they test positive. Only used when Event_Or_Config is set to Config.

{
    "Positive_Diagnosis_Config": {
        "class": "MultiInterventionDistributor",
        "Intervention_List": [{
            "Cost_To_Consumer": 0.333,
            "Secondary_Decay_Time_Constant": 1,
            "Vaccine_Take": 1,
            "Vaccine_Type": "AcquisitionBlocking",
            "class": "SimpleVaccine",
            "Waning_Config": {
                "Box_Duration": 3650,
                "Initial_Effect": 0.1,
                "class": "WaningEffectBox"
            }
        }]
    }
}

Positive_Diagnosis_Event

enum

NA

NA

No_Trigger

If the test is positive, this specifies an event that can trigger another intervention when the event occurs. Only used if Event_Or_Config is set to Event. See Event list for possible values.

{
    "Intervention_Config": {
        "Base_Sensitivity": 1.0,
        "Base_Specificity": 1.0,
        "Cost_To_Consumer": 0.0,
        "Days_To_Diagnosis": 0.0,
        "Event_Or_Config": "Event",
        "Positive_Diagnosis_Event": "TestedPositive_CureMeNow",
        "Treatment_Fraction": 1.0,
        "class": "SimpleDiagnostic"
    }
}

Days_To_Diagnosis

float

0

3.40E+3

0

The number of days from test until diagnosis.

{
    "Days_To_Diagnosis": 0.0
}

Cost_To_Consumer

float

0

3.40E+3

1

The unit ‘cost’ assigned to the diagnostic. Setting Cost_To_Consumer to zero for all other interventions, and to a non-zero amount for one intervention, provides a convenient way to track the number of times the intervention has been applied in a simulation.

{
    "Cost_To_Consumer": 0.333
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
    "Events":[{
            "class":"CampaignEvent",
            "Start_Day":200,
            "Nodeset_Config":{
                "class":"NodeSetAll"
            },
            "Event_Coordinator_Config":{
                "class":"StandardInterventionDistributionEventCoordinator",
                "Target_Demographic":"Everyone",
                "Demographic_Coverage": 1.0,
                "Intervention_Config":{
                    "class":"SimpleDiagnostic",
                    "Base_Sensitivity":1.0,
                    "Base_Specificity":1.0,
                    "Cost_To_Consumer":0,
                    "Days_To_Diagnosis":5.0,
                    "Dont_Allow_Duplicates":0,
                    "Event_Or_Config":"Event",
                    "Positive_Diagnosis_Event":"Acorn",
                    "Intervention_Name":"Diagnostic_Sample",
                    "Treatment_Fraction":1.0
                }
            }
        }],
    "Use_Defaults":1
}
SimpleHealthSeekingBehavior

The SimpleHealthSeekingBehavior intervention class models the time delay that typically occurs between when an individual experiences onset of symptoms and when they seek help from a health care provider. Several factors may contribute to such delays including accessibility, cost, and trust in the health care system. This intervention models this time delay as an exponential process; at every time step, the model draws randomly to determine if the individual will receive the specified intervention. As an example, this intervention can be nested in a NodeLevelHealthTriggeredIV so that when an individual is infected, he or she receives a SimpleHealthSeekingBehavior, representing that the individual will now seek care. The individual subsequently seeks care with an exponentially distributed delay and ultimately receives the specified intervention.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Actual_IndividualIntervention_Config

JSON object

NA

NA

NA

The configuration of an actual intervention sought. Selects a class for the intervention and configures the parameters specific for that intervention class.

{
    "Actual_IndividualIntervention_Config": {
        "Cost_To_Consumer": 1,
        "Drug_Type": "FirstLineCombo",
        "Durability_Profile": "FIXED_DURATION_CONSTANT_EFFECT",
        "Primary_Decay_Time_Constant": 180,
        "Remaining_Doses": 1,
        "Secondary_Decay_Time_Constant": 0,
        "TB_Drug_Clearance_Rate": 0.2,
        "TB_Drug_Inactivation_Rate": 0.000000001,
        "class": "AntiTBDrug"
    }
}

Actual_IndividualIntervention_Event

enum

NA

NA

NoTrigger

The event of an actual intervention sought. Selects a class for the intervention and configures the parameters specific for that intervention class. See Event list for possible values.

{
    "Actual_IndividualIntervention_Config": {
        "Actual_IndividualIntervention_Event": "ProviderOrdersTBTest",
        "Tendency": 0.005,
        "Event_Or_Config": "Event",
        "class": "SimpleHealthSeekingBehavior"
    }
}

Single_Use

boolean

NA

NA

1

If set to true (1), the health-seeking behavior gets used once and discarded. If set to false (0), it remains indefinitely.

{
    "Single_Use": 1
}

Tendency

float

0

1

1

The probability of seeking healthcare.

{
    "Tendency": 0.01
}

Event_Or_Config

enum

NA

NA

Config

Specifies whether the current intervention (or a positive diagnosis, depending on the intervention class) distributes a nested intervention (the Config option) or an event will be broadcast which may trigger other interventions in the campaign file (the Event option). Possible values are:

  • Event

  • Config

{
    "Event_Or_Config": "Config"
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}
{
     "Use_Defaults": 1,
     "Events": [{
          "class": "CampaignEvent",
          "Event_Name": "Drugs after TB activation",
          "Nodeset_Config": {
               "class": "NodeSetAll"
          },
          "Start_Day": 9125,
          "Event_Coordinator_Config": {
               "class": "StandardInterventionDistributionEventCoordinator",
               "Number_Repetitions": 1,
               "Target_Demographic": "Everyone",
               "Demographic_Coverage": 1,
               "Intervention_Config": {
                    "class": "NodeLevelHealthTriggeredIV",
                    "Trigger_Condition_List": ["TBActivation"],
                    "Actual_IndividualIntervention_Config": {
                         "class": "SimpleHealthSeekingBehavior",
                         "Event_Or_Config": "Config",
                         "Tendency": 0.0015,
                         "Actual_IndividualIntervention_Config": {
                              "class": "AntiTBDrug",
                              "Cost_To_Consumer": 90,
                              "Drug_Type": "FirstLineCombo",
                              "Durability_Profile": "FIXED_DURATION_CONSTANT_EFFECT",
                              "Primary_Decay_Time_Constant": 180,
                              "Remaining_Doses": 1,
                              "Secondary_Decay_Time_Constant": 0,
                              "TB_Drug_Clearance_Rate": 0.02,
                              "TB_Drug_Inactivation_Rate": 0.3
                         }
                    }
               }
          }
     }]
}
SimpleVaccine

The SimpleVaccine intervention class implements vaccine campaigns in the simulation. Vaccines can have an effect on one of the following:

  • Reduce the likelihood of acquiring an infection

  • Reduce the likelihood of transmitting an infection

  • Reduce the likelihood of death

To configure vaccines that have an effect on more than one of these, use MultiEffectVaccine instead.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

The table below describes all possible parameters with which this class can be configured. The JSON example that follows shows one potential configuration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Vaccine_Take

float

0

1

1

The rate at which delivered vaccines will successfully stimulate an immune response and achieve the desired efficacy. For example, if it is set to 0.9, there will be a 90 percent chance that the vaccine will start with the specified efficacy, and a 10 percent chance that it will have no efficacy at all.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Vaccine_Type

enum

NA

NA

Generic

The type of vaccine to distribute in a vaccine intervention. Possible values are:

Generic

The vaccine can reduce transmission, acquisition, and mortality.

TransmissionBlocking

The vaccine will reduce pathogen transmission.

AcquisitionBlocking

The vaccine will reduce the acquisition of the pathogen by reducing the force of infection experienced by the vaccinated individual.

MortalityBlocking

The vaccine reduces the disease-mortality rate of a vaccinated individual.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Efficacy_Is_Multiplicative

boolean

NA

NA

1

The overall vaccine efficacy when individuals receive more than one vaccine. When set to true (1), the vaccine efficacies are multiplied together; when set to false (0), the efficacies are additive.

{
    "Intervention_Config": {
        "class": "SimpleVaccine",
        "Cost_To_Consumer": 10,
        "Vaccine_Type": "AcquisitionBlocking",
        "Vaccine_Take": 1,
        "Efficacy_Is_Multiplicative": 0,
        "Waning_Config": {
            "class": "WaningEffectConstant",
            "Initial_Effect": 0.3
        }
    }
}

Dont_Allow_Duplicates

boolean

NA

NA

0

If an individual’s container has an intervention, set to true (1) to prevent them from receiving another copy of the intervention. Supported by all intervention classes.

{
    "Dont_Allow_Duplicates": 0
}

Waning_Config

JSON object

NA

NA

NA

The configuration of how the intervention efficacy wanes over time. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Waning_Config": {
        "Box_Duration": 3650,
        "Initial_Effect": 1,
        "class": "WaningEffectBox"
    }
}

Cost_To_Consumer

float

0

999999

10

The unit cost per vaccine (unamortized).

{
    "Cost_To_Consumer": 10.0
}

Event_Or_Config

enum

NA

NA

Config

Specifies whether the current intervention (or a positive diagnosis, depending on the intervention class) distributes a nested intervention (the Config option) or an event will be broadcast which may trigger other interventions in the campaign file (the Event option). Possible values are:

  • Event

  • Config

{
    "Event_Or_Config": "Config"
}

Base_Sensitivity

float

0

1

1

The sensitivity of the diagnostic. This sets the proportion of the time that individuals with the condition being tested receive a positive diagnostic test. When set to 1, the diagnostic always accurately reflects the condition. When set to zero, then individuals who have the condition always receive a false-negative diagnostic test.

{
    "Base_Sensitivity": 0.8
}

Base_Specificity

float

0

1

1

The specificity of the diagnostic. This sets the proportion of the time that individuals without the condition being tested receive a negative diagnostic test. When set to 1, the diagnostic always accurately reflects the lack of having the condition. When set to zero, then individuals who do not have the condition always receive a false-positive diagnostic test.

{
    "Base_Specificity": 0.9
}

New_Property_Value

string

NA

NA

NA

An optional IndividualProperty key:value pair that will be assigned when the intervention is distributed. See NodeProperties and IndividualProperties parameters for more information. Generally used to indicate the broad category of health care cascade to which an intervention belongs to prevent individuals from accessing care through multiple pathways. For example, if an individual must already be taking a particular medication to be prescribed a new one.

{
    "New_Property_Value": "InterventionStatus:None"
}

Disqualifying_Properties

string

NA

NA

NA

A list of IndividualProperty key:value pairs that cause an intervention to be aborted (persistent interventions will stop being distributed to individuals with these values). See NodeProperties and IndividualProperties parameters for more information. Generally used to control the flow of health care access. For example, to prevent the same individual from accessing health care via two different routes at the same time.

{
    "Disqualifying_Properties": [
        "InterventionStatus:LostForever"
    ]
}

Intervention_Name

string

NA

NA

NA

The optional name used to refer to this intervention as a means to differentiate it from others that use the same class.

{
    "Intervention_Name":"Diagnostic_Sample"
}
{
    "Events": [{
        "class": "CampaignEvent",
        "Nodeset_Config": {
            "class": "NodeSetAll"
        },
        "Start_Day": 60,
        "Event_Coordinator_Config": {
            "class": "StandardInterventionDistributionEventCoordinator",
            "Target_Demographic": "Everyone",
            "Demographic_Coverage": 0.5,
            "Intervention_Config": {
                "class": "SimpleVaccine",
                "Cost_To_Consumer": 10.0,
                "Reduced_Transmit": 0,
                "Vaccine_Take": 1,
                "Vaccine_Type": "AcquisitionBlocking",
                "Waning_Config": {
                    "Box_Duration": 3650,
                    "Initial_Effect": 1,
                    "class": "WaningEffectBox"
                }
            }
        }
    }],
    "Use_Defaults": 1
}
Waning effect classes

The following classes are nested within interventions (both individual-level and node-level) to indicate how their efficacy wanes over time. They can be used with several parameters including Blocking_Config, Killing_Config, and Waning_Config.

Note

Parameters are case-sensitive. For Boolean parameters, set to 1 for true or 0 for false. JSON does not permit comments, but you can add “dummy” parameters to add contextual information to your files.

See the example below that uses a mix of different waning effect classes and the tables below that describe all parameters that can be used with each waning effect class.

{
    "Events": [
        {
            "class": "CampaignEvent",
            "Start_Day": 1,
            "Nodeset_Config": {
                "class": "NodeSetAll"
            },
            "Event_Coordinator_Config": {
                "class": "StandardInterventionDistributionEventCoordinator",
                "Target_Demographic": "Everyone",
                "Demographic_Coverage": 1.0,
                "Number_Repetitions": -1,
                "Timesteps_Between_Repetitions": 60,
                "Intervention_Config": {
                    "class": "SimpleBednet",
                    "Cost_To_Consumer": 5,
                    "Usage_Config": {
                        "class": "WaningEffectRandomBox",
                        "Initial_Effect": 1.0,
                        "Expected_Discard_Time" : 60
                    },
                    "Blocking_Config": {
                        "Box_Duration": 100,
                        "Decay_Time_Constant": 150,
                        "Initial_Effect": 0.5
                    },
                    "Killing_Config": {
                        "class": "WaningEffectConstant",
                        "Initial_Effect": 1.0
                    }
                }
            }
        }
    ],
    "Use_Defaults": 1
}
WaningEffectBox

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Box_Duration

float

0

100000

100

The box duration of the effect in days. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Killing_Config": {
        "Box_Duration": 40,
        "Decay_Time_Constant": 0,
        "Initial_Effect": 0,
        "class": "WaningEffectBoxExponential"
    }
}

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
WaningEffectBoxExponential

The initial efficacy is held for a specified duration, then the efficacy decays at an exponential rate.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Box_Duration

float

0

100000

100

The box duration of the effect in days. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Waning_Config": {
        "Box_Duration": 3650,
        "Initial_Effect": 1,
        "class": "WaningEffectBox"
    }
}

Decay_Time_Constant

float

0

100000

100

The exponential decay length, in days.

{
    "Killing_Config": {
        "Box_Duration": 40,
        "Decay_Time_Constant": 0,
        "Initial_Effect": 0,
        "class": "WaningEffectBoxExponential"
    }
}
WaningEffectConstant

The efficacy is held at a constant rate.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
WaningEffectExponential

The efficacy decays at an exponential rate.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}

Decay_Time_Constant

float

0

100000

100

The exponential decay length, in days.

{
    "Killing_Config": {
        "Box_Duration": 40,
        "Decay_Time_Constant": 0,
        "Initial_Effect": 0,
        "class": "WaningEffectBoxExponential"
    }
}
WaningEffectMapLinear

The efficacy decays based on the time since the start of the intervention. This change is defined by a map of time to efficacy values in which the time between time/value points is linearly interpolated. When the time since start reaches the end of the times in the map, the last value will be used unless the intervention expires. If the time since start is less than the first value in the map, the efficacy will be zero. This can be used to define the shape of a curve whose magnitude is defined by the Initial_Effect multiplier.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Durability_Map

JSON object

NA

NA

NA

The time, in days, since the intervention was distributed to a multiplier times the Initial_Effect.

{
    "class": "WaningEffectMapLinearSeasonal",
    "Initial_Effect": 1.0,
    "Durability_Map": {
        "Times": [0.0, 20.0, 21.0, 30.0, 31.0, 365.0],
        "Values": [1.0, 1.0, 0.0, 0.0, 1.0, 1.0]
    }
}

Expire_At_Durability_Map_End

boolean

0

1

0

Set to 1 to let the intervention expire when the end of the map is reached.

{
    "Changing_Effect": {
        "class": "WaningEffectConstant",
        "Initial_Effect": 1.0,
        "Expire_At_Durability_Map_End": 1
    }
}

Reference_Timer

integer

0

2.15E+0

0

The timestamp at which linear-map should be anchored.

{
    "Changing_Effect": {
        "Initial_Effect": 1.0,
        "class": "WaningEffectMapLinear",
        "Expire_At_Durability_Map_End": 1,
        "Reference_Timer": 1,
        "Durability_Map": {
            "Times": [0, 385, 390, 10000],
            "Values": [0, 0.0, 0.5, 0.5]
        }
    }
}

Times

array of floats

0

999999

NA

An array of days.

{
    "Changing_Effect": {
        "Initial_Effect": 1.0,
        "class": "WaningEffectMapLinear",
        "Expire_At_Durability_Map_End": 1,
        "Reference_Timer": 1,
        "Durability_Map": {
            "Times": [0, 385, 390, 10000],
            "Values": [0, 0.0, 0.5, 0.5]
        }
    }
}

Values

array of floats

0

3.40E+3

NA

An array of values to match the defined Times.

{
    "Time_Value_Map": {
        "Times": [1998, 2000, 2003, 2006, 2009],
        "Values": [
            0,
            0.260000,
            0.080000,
            0.140000,
            0.540000
        ]
    }
}

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
WaningEffectMapLinearAge

Similar to WaningEffectMapLinear, except that the efficacy decays based on the age of the individual who owns the intervention instead of the time since the start of the intervention.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Times

array of floats

0

125

NA

An array of years.

{
    "class": "WaningEffectMapLinearAge",
    "Initial_Effect": 1.0,
    "Durability_Map": {
        "Times": [0.0, 12.99999, 13.0, 125.0],
        "Values": [0.0, 0.0, 1.0, 1.0]
    }
}

Durability_Map

JSON object

NA

NA

NA

The time, in days, since the intervention was distributed to a multiplier times the Initial_Effect.

{
    "class": "WaningEffectMapLinearSeasonal",
    "Initial_Effect": 1.0,
    "Durability_Map": {
        "Times": [0.0, 20.0, 21.0, 30.0, 31.0, 365.0],
        "Values": [1.0, 1.0, 0.0, 0.0, 1.0, 1.0]
    }
}

Values

array of floats

0

3.40E+3

NA

An array of values to match the defined Times.

{
    "Time_Value_Map": {
        "Times": [1998, 2000, 2003, 2006, 2009],
        "Values": [
            0,
            0.260000,
            0.080000,
            0.140000,
            0.540000
        ]
    }
}

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
WaningEffectMapLinearSeasonal

Similar to WaningEffectMapLinear, except that the map will repeat itself every 365 days. That is, the time since start will reset to zero once it reaches 365. This allows you to simulate seasonal effects.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Times

array of floats

0

365

NA

An array of days.

{
    "class": "WaningEffectMapLinearSeasonal",
    "Initial_Effect": 1.0,
    "Durability_Map": {
        "Times": [0.0, 20.0, 21.0, 30.0, 31.0, 365.0],
        "Values": [1.0, 1.0, 0.0, 0.0, 1.0, 1.0]
    }
}

Durability_Map

JSON object

NA

NA

NA

The time, in days, since the intervention was distributed to a multiplier times the Initial_Effect.

{
    "class": "WaningEffectMapLinearSeasonal",
    "Initial_Effect": 1.0,
    "Durability_Map": {
        "Times": [0.0, 20.0, 21.0, 30.0, 31.0, 365.0],
        "Values": [1.0, 1.0, 0.0, 0.0, 1.0, 1.0]
    }
}

Values

array of floats

0

3.40E+3

NA

An array of values to match the defined Times.

{
    "Time_Value_Map": {
        "Times": [1998, 2000, 2003, 2006, 2009],
        "Values": [
            0,
            0.260000,
            0.080000,
            0.140000,
            0.540000
        ]
    }
}

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
WaningEffectMapPiecewise

Similar to WaningEffectMapLinear, except that the data is assumed to be constant between time/value points (no interpolation). If the time since start falls between two points, the efficacy of the earlier time point is used.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Expire_At_Durability_Map_End

boolean

0

1

0

Set to 1 to let the intervention expire when the end of the map is reached.

{
    "Changing_Effect": {
        "class": "WaningEffectConstant",
        "Initial_Effect": 1.0,
        "Expire_At_Durability_Map_End": 1
    }
}

Reference_Timer

integer

0

2.15E+0

0

The timestamp at which linear-map should be anchored.

{
    "Changing_Effect": {
        "Initial_Effect": 1.0,
        "class": "WaningEffectMapLinear",
        "Expire_At_Durability_Map_End": 1,
        "Reference_Timer": 1,
        "Durability_Map": {
            "Times": [0, 385, 390, 10000],
            "Values": [0, 0.0, 0.5, 0.5]
        }
    }
}

Times

array of floats

0

999999

NA

An array of days.

{
    "Changing_Effect": {
        "Initial_Effect": 1.0,
        "class": "WaningEffectMapLinear",
        "Expire_At_Durability_Map_End": 1,
        "Reference_Timer": 1,
        "Durability_Map": {
            "Times": [0, 385, 390, 10000],
            "Values": [0, 0.0, 0.5, 0.5]
        }
    }
}

Durability_Map

JSON object

NA

NA

NA

The time, in days, since the intervention was distributed to a multiplier times the Initial_Effect.

{
    "class": "WaningEffectMapLinearSeasonal",
    "Initial_Effect": 1.0,
    "Durability_Map": {
        "Times": [0.0, 20.0, 21.0, 30.0, 31.0, 365.0],
        "Values": [1.0, 1.0, 0.0, 0.0, 1.0, 1.0]
    }
}

Values

array of floats

0

3.40E+3

NA

An array of values to match the defined Times.

{
    "Time_Value_Map": {
        "Times": [1998, 2000, 2003, 2006, 2009],
        "Values": [
            0,
            0.260000,
            0.080000,
            0.140000,
            0.540000
        ]
    }
}

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
WaningEffectRandomBox

The efficacy is held at a constant rate until it drops to zero after a user-defined duration. This duration is randomly selected from an exponential distribution where Expected_Discard_Time is the mean.

The efficacy is held at a constant rate until it drops to zero after the user-defined duration.

Parameter

Data type

Minimum

Maximum

Default

Description

Example

Expected_Discard_Time

float

0

100000

100

The mean time, in days, of an exponential distribution of the duration of the effect of an intervention (such as a vaccine or bed net). Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}

Initial_Effect

float

0

1

-1

Initial strength of the effect. Specify how this effect decays over time using one of the Waning effect classes.

{
    "Usage_Config": {
        "class": "WaningEffectRandomBox",
        "Initial_Effect": 1.0,
        "Expected_Discard_Time": 60
    }
}
Event list

The following list provides possible values for built-in events. These events can be broadcast to nodes to trigger interventions.

Note

Not all events are appropriate for every simulation type.

  • Births

  • DiseaseDeaths

  • EighteenMonthsOld

  • Emigrating

  • EnteredRelationship

  • EveryTimeStep

  • EveryUpdate

  • ExitedRelationship

  • FirstCoitalAct

  • FourteenWeeksPregnant

  • GaveBirth

  • HappyBirthday

  • HIVNewlyDiagnosed

  • HIVNonPreARTToART

  • HIVPreARTToART

  • HIVSymptomatic

  • HIVTestedNegative

  • HIVTestedPositive

  • Immigrating

  • InterventionDisqualified

  • NewClinicalCase

  • NewInfectionEvent

  • NewSevereCase

  • NodePropertyChange

  • NonDiseaseDeaths

  • NoTrigger

  • Pregnant

  • PropertyChange

  • ProviderOrdersTBTest

  • SixWeeksOld

  • StartedART

  • STIDebut

  • STINewInfection

  • STIPostImmigrating

  • STIPreEmigrating

  • StoppedART

  • TBActivation

  • TBActivationExtrapulm

  • TBActivationPostRelapse

  • TBActivationPresymptomatic

  • TBActivationSmearNeg

  • TBActivationSmearPos

  • TBFailedDrugRegimen

  • TBMDRTestDefault

  • TBMDRTestNegative

  • TBMDRTestPositive

  • TBPendingRelapse

  • TBRelapseAfterDrugRegimen

  • TBRestartHSB

  • TBStartDrugRegimen

  • TBStopDrugRegimen

  • TBTestDefault

  • TBTestNegative

  • TBTestPositive

  • TestPositiveOnSmear

  • TwelveWeeksPregnant

Input and output file structure

The section describes the file structure used for input data files, each of the built-in output report types, and error logs to help debug issues you may encounter.

Input data file structure

The input data files described in this section determine the demographics, migration, climate, and other relatively fixed information about the population within each geographic node. These files are in contrast to the population, geographic, and migration parameters in the configuration file that control simulation-wide qualities, such as enabling air migration across all nodes in the simulation.

Generally, you will download and use input data files without modification. For instructions, see Use input data files. However, demographics files can include many user-defined parameter values and will likely require modification. Only the demographics file is required for a simulation.

Each type of input data generally requires both a metadata file that contains provenance information and a binary file that contains the actual data for each node. Some input files included with EMOD were prepared using CIESIN Gridded Population of the World (GPW) population distribution and a corresponding spatial resolution grid (for example, 2.5 arc minutes) to define the initial population and extent of the nodes for country-wide input files. Therefore, the naming convention for this files usually leads with the geographic location, followed by the spatial resolution, and input file type.

All input files include the parameter IdReference in the metadata, which is used to generate the NodeID associated with each node in a simulation. The values for IdReference and NodeID must be the same across all input data files used in a simulation. See Demographics parameters for more information about NodeID generation.

Climate file structure

There are two general types of climate files usable by EMOD, namely, climate files generated through actual data, referred to as “climate by data,” and climate files generated from the Koppen classification system, referred to as “climate by Koppen”. Climate data (both types) is contained in a set of two files, a metadata file with header information (<name>.bin.json) and a binary data file (<name>.bin). Both files are required.

The metadata file is a JSON-formatted file that includes a metadata section and a node offsets section. The Metadata parameter contains a JSON object with parameters, some of which are strictly informational and some of which are used by Eradication.exe. However, the informational ones may still be important to understand the provenance and meaning of the data.

In a second section, the NodeOffsets parameter contains a list of hex-encoded 16-byte values used to find the data for each given node (the NodeID).They are not 16-byte offsets, but instead, two 8-byte hex-encoded character strings. This encoding includes the source NodeID. You can map the binary data to its corresponding source NodeID by using the NodeOffset information.

The binary file contains the climate data in a sequential stream. In other words, it presents all the data for the first node, then all the data for the second node, all the way through to the last node.

To use the climate files, you must set Climate_Model to either “CLIMATE_BY_DATA” or “CLIMATE_BY_KOPPEN”, as appropriate, in the configuration file. There are also additional parameters in the configuration file you can use to scale or otherwise modify the data included in the climate files.

Climate by data

At this time, the EMOD executable (Eradication.exe) reads land temperature data, but does not use the data in any calculations. IDM clones the air temperature and uses that as the land temperature in the climate data files. If you are going to be constructing your own climate files, we advise you to do the same.

Metadata file

The following parameters in the metadata section are informational:

Parameter

Data type

Description

DateCreated

string

The day the file was created.

Author

string

The author of the file.

OriginalDataYears

string

The years from which the original data was derived.

StartDayOfYear

string

The day of the year representing the first day in the climate file.

DataProvenance

string

The source of the data.

The following parameters in the metadata section are used by Eradication.exe:

Parameter

Data type

Description

IdReference

string

A unique, user-selected string that indicates the method used for generating NodeID values in the input file. For more information, see Input data file structure.

NodeCount

integer

The number of nodes to expect in this file.

DatavalueCount

integer

The number of data values per node. The number must be the same across every node in the binary file.

UpdateResolution

enum

The time resolution of the climate file. Available values are:

  • CLIMATE_UPDATE_YEAR

  • CLIMATE_UPDATE_MONTH

  • CLIMATE_UPDATE_WEEK

  • CLIMATE_UPDATE_DAY

  • CLIMATE_UPDATE_HOUR

An example of climate by data metadata is as follows:

{
    "Metadata": {
        "DateCreated": "Sun Sep 25 19:02:09 2011",
        "Tool": "createclimateheader.py",
        "Author": "authorName",
        "IdReference": "Gridded world grump2.5arcmin",
        "NodeCount": 1,
        "DatavalueCount": 3650,
        "UpdateResolution": "CLIMATE_UPDATE_DAY",
        "OriginalDataYears": "1990-1993",
        "StartDayOfYear": "January 1",
        "DataProvenance": "47 consecutive months of data were used to generate one average year of data that is repeated for 10 years"
    },
    "NodeOffsets": "144B07A400000000"
}
Binary file

The binary file is a stream of 4-byte floating point values that contain the data value at the data count position for a given node, running from 1 to the maximum data count value.

The binary format is as follows:

_images/climate-by-data-binary.jpg
Climate by Koppen

The Koppen classification system is one of the most widely used climate classification systems. The Koppen classification system makes the assumption that native vegetation is the best expression of climate.

Metadata file

The following parameters in the metadata section are informational:

Parameter

Data type

Description

DateCreated

string

The day the file was created.

Author

string

The author of the file.

DataProvenance

string

The source of the data.

Tool

string

The script used to create the file.

The following parameters in the metadata section are used by Eradication.exe:

Parameter

Data type

Description

IdReference

string

A unique, user-selected string that indicates the method used for generating NodeID values in the input file. For more information, see Input data file structure.

NodeCount

integer

The number of nodes to expect in this file.

An example of climate by Koppen metadata is as follows:

{
    "Metadata": {
        "DateCreated": "Sun Sep 25 19:08:52 2011",
        "Tool": "createclimateheader.py",
        "Author": "authorName",
        "IdReference": "Gridded world grump2.5arcmin",
        "NodeCount": 2,
        "DataProvenance": "Köppen-Geiger Classification System from http://koeppen-geiger.vu-wien.ac.at/"
    },
    "NodeOffsets": "157D075200000000157E07520000000"
}
Binary file

The binary file parameters use the naming convention below to store the data.

Parameter

Data type

Description

KoppenIndexX

integer, 4 bytes

The Koppen Index value, with X running from 1 to the maximum number of nodes.

The binary format is as follows:

_images/climate-by-koppen-binary.jpg
Migration file structure

There are four types of migration files that can be used by EMOD, namely, local migration, regional migration, air migration and sea migration. For all types, migration data is contained in a set of two files, a metadata file with header information and a binary data file. Both files are required. The structure of each of these files is nearly the same for all migration types, with the only exception being the number of columns in the binary file.

The metadata file is a JSON-formatted file that includes a metadata section and a node offsets section. The Metadata parameter contains a JSON object with parameters, some of which are strictly informational and some of which are used by Eradication.exe. However, the informational ones may still be important to understand the provenance and meaning of the data.

The following parameters in the metadata section are informational:

Parameter

Data type

Description

DateCreated

string

The day the file was created.

Author

string

The author of the file.

Tool

string

The script used to create the file.

The following parameters in the metadata section are used by Eradication.exe:

Parameter

Data type

Description

IdReference

string

A unique, user-selected string that indicates the method used for generating NodeID values in the input file. For more information, see Input data file structure.

NodeCount

integer

The number of nodes to expect in this file.

DatavalueCount

integer

The number of data values per node. The number must be the same across every node in the binary file.

In a second section, the NodeOffsets parameter contains a list of hex-encoded 16-byte values used to find the data for each given node (the NodeID).They are not 16-byte offsets, but instead, two 8-byte hex-encoded character strings. This encoding includes the source NodeID. You can map the binary data to its corresponding source NodeID by using the NodeOffset information.

The binary file contains the migration rate data in a sequential stream. In other words, it presents all the data for the first node, then all the data for the second node, all the way through to the last node. The data is laid out in rows and columns, with each row corresponding to a node and the number of columns varying based on the migration type.

The following diagram shows how migration data is laid out in rows, with each row corresponding to a source node and each column corresponding to the destination node.

_images/LayoutMigrationNodes.png

Migration rate is that fraction of the node’s population that is migrating per day. Units are per person per day, meaning the number of people migrating per day divided by the total population of the node. For example, if a node had 1,000 people and a migration rate of .01, there would be .01 * 1,000 = 10 people migrating per day, but if the node had 10,000 people in the node and a migration rate of .01, it would .01 * 10,000 = 100 people migrating per day. You can adjust this rate using configuration parameters for scaling (these begin with x).

The binary file contains a stream of 4-byte unsigned integers that identify the destination node, followed by a stream of 8-byte double floating point values that contain the rate associated with the destination node (per person per day), running from 1 to the total number of nodes.

To use the migration files, you must set Migration_Model in the configuration file to a valid migration type except “NO_MIGRATION”. Each migration types also requires you to set another parameter to enable the particular type of migration selected. There are also additional parameters in the configuration file you can use to scale or otherwise modify the data included in the climate files.

Local

Local migration describes the foot travel movement of people into and out of adjacent nodes. A local migration file is required for simulations that support more than one node. You must also set the Enable_Local_Migration parameter in the configuration file to 1. For each location, the local migration file represents up to eight adjacent destination nodes, with 0 used as the value for unused nodes.

The following diagram shows the format for the local migration binary file data:

_images/localMigrationBFF.jpg
Regional

Regional migration describes migration that occurs on a road or rail network for a simulation. If a node is not part of the network, the regional migration of individuals to and from that node considers the closest road hub city. A Voronoi tiling based on road hubs is constructed of the region, with each non-hub connected to the hub of its tile. These connections are created when the migration file is constructed. They are not performed at runtime.

A regional migration file is required for simulations that cover a geography that is large enough that road/rail migration is relevant. You must also set the Enable_Regional_Migration parameter in the configuration file to 1. For each location, the regional migration file represents up to 30 adjacent destination nodes, with 0 used as the value for unused nodes.

The following diagram shows the format for the regional migration binary file data:

_images/regionalMigrationBFF.jpg
Air

Air migration describes migration that occurs by airplane travel. An air migration file is usually required for simulations of an entire country or larger geographies. You must also set the Enable_Air_Migration parameter in the configuration file to 1. For each location, the air migration file represents up to 60 adjacent destination nodes, with 0 used as the value for unused nodes.

The following diagram shows the format for the air migration binary file data:

_images/airMigrationBFF.jpg
Sea

Sea migration describes migration that occurs by ship travel. Unlike the other migration files, the sea migration file only contains information for the nodes that are seaports. A sea migration file does not contain every node like local, regional or air migration files do. You must also set the Enable_Sea_Migration parameter in the configuration file to 1. For each location, the sea migration file represents up to five adjacent destination nodes, with 0 used as the value for unused nodes.

The following diagram shows the format for the sea migration binary file data:

_images/seaMigrationBFF.jpg
Load-balancing file structure

If you are running a large simulation with multiple nodes, you may want to use a load balancing file to distribute the computing load among multiple cores. This can be especially helpful if the nodes vary considerably in size and, therefore, processing time. If no load balancing file is submitted, the Eradication.exe allocates simulation nodes to cores according to a checkerboard pattern.

For each simulation, the load balancing file contains information about the relative level of processing time required for each geographical node. The Eradication.exe can then allocate nodes to processors in such a way that the total processing required is evenly distributed across all processors.

To use a load balancing file, you must set Load_Balance_Filename to the path to the load balancing file, relative to the input file directory. Load-balancing files can be JavaScript Object Notation (JSON) files, which are preferred, or binary files.

JSON file

A JSON load-balancing file contains the Load_Balance_Scheme_Nodes_On_Core_Matrix parameter, assigned an array of arrays, each of which represents a core and lists the NodeID of each node to be processed on that core. If any node contained in the demographics file is not listed in the load-balancing file, it will be processed on the first core.

For example, the load-balancing file shown below distributes the processing for 100 nodes across 4 cores, assigning more nodes to particular cores when those nodes require less processing time.

{
    "Load_Balance_Scheme_Nodes_On_Core_Matrix": [
        [1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 45],
        [6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 26, 27, 28, 29, 30, 36, 37, 38, 39, 40, 46, 47, 48, 49, 50, 56, 57, 58, 59, 60, 67, 68, 69, 70],
        [61, 62, 63, 64, 65, 66, 71, 72, 73, 74, 75, 76, 77, 81, 82, 83, 84, 85, 86, 87, 91, 92, 93, 94, 95, 96, 97],
        [41, 42, 43, 44, 51, 52, 53, 54, 55, 78, 79, 80, 88, 89, 90, 98, 99, 100]
    ]
}
Binary file

A binary load-balancing file starts with an initial unsigned 4-byte integer that indicates the number of nodes. Following that value is a series of 4-byte unsigned integers representing the NodeID values. The number of values will be equal to the previously read number of nodes. Following that, another series of 4-byte floating point values, with each value representing the relative processing time required for each geographic node. Again, the number of values will be equal to the previously read number of nodes. The series of values are set up such that the \(i^{th}\) entry in the series is equal to the cumulative proportion of the processing load for all the previous nodes 0 through \(i\).

The cumulative nature of each node’s value does not mean each node is assigned that amount for its processing load. Rather, it is a way to make the internal calculations more efficient. For example, if you had ten nodes and each node was assigned 10% of the load, the values assigned from node0 to node9 would be the following: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 and 1.0.

The following diagram shows the format for the binary load-balancing file data:

_images/loadbalancingBFF.jpg

Output report structure

This topic defines various data output reports that the EMOD executable (Eradication.exe) can produce. These reports are built in to the Eradication.exe and are either always output with each simulation, such as inset chart, or reports that you can configure to be included with the output. All output reports can be found in the output directory of the working directory, for example, 1_Generic_Seattle_MultiNodeoutput.

If the available output reports do not meet your needs, you can use custom reporters that are EMODules separate from the Eradication.exe code. There are several provided in the EMOD GitHub repository or you can even write your own custom reporter to post- process and format data as you desire into a new output report. For more information, see Custom reporters.

Inset chart output report

The inset chart output report is output with every simulation. It is a JSON-formatted file with the channel output results of the simulation, consisting of simulation-wide averages by time step. The channels in an inset chart are fully specified by the simulation type and cannot be altered without making changes to the EMOD source code. The file name is InsetChart.json. You can use the information contained in the file to create a chart, but EMOD does not automatically output a chart.

The file contains a header and a channels section.

Channels

The channels section contains the following parameters.

Parameter

Data type

Description

<Channel_Title>

string

The title of the particular channel.

Units

string

The units used for this channel.

Data

array

A list of the channel data at each time step.

Example

The following is a sample of an InsetChart.json file.

{
    "Header": {
        "DateTime": "Thu Dec 03 11:28:34 2015",
        "DTK_Version": "5738 HIV-Ongoing 2015/11/18 13:00:39",
        "Report_Type": "InsetChart",
        "Report_Version": "3.2",
        "Start_Time": 0,
        "Simulation_Timestep": 1,
        "Timesteps": 5,
        "Channels": 17
    },
    "Channels": {
        "Births": {
            "Units": "Births",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Campaign Cost": {
            "Units": "USD",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Cumulative Infections": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Cumulative Reported Infections": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Disease Deaths": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Exposed Population": {
            "Units": "Exposed Fraction",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Human Infectious Reservoir": {
            "Units": "Total Infectivity",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Infected": {
            "Units": "Infected Fraction",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Infectious Population": {
            "Units": "Infectious Fraction",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Log Prevalence": {
            "Units": "Log Prevalence",
            "Data": [-10, -10, -10, -10, -10]
        },
        "New Infections": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "New Reported Infections": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Daily (Human) Infection Rate": {
            "Units": "Infection Rate",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Recovered Population": {
            "Units": "Recovered (Immune) Fraction",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Statistical Population": {
            "Units": "Population",
            "Data": [
                900,
                900,
                900,
                900,
                900
            ]
        },
        "Susceptible Population": {
            "Units": "Susceptible Fraction",
            "Data": [
                1,
                1,
                1,
                1,
                1
            ]
        },
        "Waning Population": {
            "Units": "Waning Immunity Fraction",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        }
    }
}
Binned output report

The binned output report is a JSON-formatted file where the channel data has been sorted into bins. It is very similar to an inset chart. However, with the binned report, channels are broken down into sub-channels (bins) based on various criteria. For example, instead of having a single prevalence channel, you might have prevalence in the “0-3 years old bin” and the “4-6 years old bin, and so forth. The file name is BinnedReport.json.

To generate the binned report, set the Enable_Demographics_Reporting configuration parameter to 1. The demographics summary output report will also be generated.

The file contains a header and a channels section.

Channels

The channels section contains the following parameters.

Parameter

Data type

Description

<Channel_Title>

string

The title of the particular channel.

Units

string

The units used for this channel.

Data

array

A list of the channel data at each time step.

Example

The following is a sample of an BinnedReport.json file.

{
    "Header": {
        "DateTime": "Wed Oct 01 14:49:22 2014",
        "DTK_Version": "4284 trunk 2014/09/23 11:50:52",
        "Report_Version": "2.1",
        "Timesteps": 150,
        "Subchannel_Metadata": {
            "AxisLabels": [
                ["Age"]
            ],
            "NumBinsPerAxis": [
                [21]
            ],
            "ValuesPerAxis": [
                [
                    [1825, 3650, 5475, 7300, 9125, 10950, 12775, 14600, 16425, 18250, 20075, 21900, 23725, 25550, 27375, 29200, 31025, 32850, 34675, 36500, 999999]
                ]
            ],
            "MeaningPerAxis": [
                [
                    ["<5", "5-9", "10-14", "15-19", "20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70-74", "75-79", "80-84", "85-89", "90-94", "95-99", ">100"]
                ]
            ]
        },
        "Channels": 4
    },
    "Channels": {
        "Disease Deaths": {
            "Units": "",
            "Data": [
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
            ]
        },
        "Infected": {
            "Units": "",
            "Data": [
                [0, 2, 1, 1, 1, 1, 2, 6, 7, 5, 3, 5, 4, 3, 2, 3, 5, 6, 14, 21, 22, 22, 31, 52, 63, 101, 108, 119, 121, 139, 132, 133, 130, 115, 97, 95, 93, 98, 102, 108, 105, 110, 98, 90, 93, 94, 92, 81, 62, 57, 63, 56, 58, 61, 67, 64, 52, 54, 45, 33, 34, 36, 27, 32, 29, 21, 17, 7, 13, 15, 17, 13, 14, 11, 14, 15, 11, 12, 7, 6, 6, 3, 3, 3, 4, 4, 3, 3, 2, 2, 3, 3, 4, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 3, 4, 2, 2, 2, 1, 5, 5, 7, 7, 6, 13, 14, 12, 8, 8, 15, 15, 23, 39, 43, 61, 82, 110, 133, 142, 133, 113, 105, 105, 100, 86, 81, 81, 75, 73, 68, 74, 74, 73, 70, 75, 67, 63, 72, 61, 63, 60, 55, 52, 47, 44, 36, 39, 36, 39, 36, 28, 27, 22, 20, 17, 20, 22, 17, 13, 13, 10, 10, 6, 7, 7, 3, 4, 5, 5, 4, 2, 1, 2, 2, 2, 3, 2, 2, 4, 2, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 1, 2, 3, 3, 4, 3, 3, 3, 2, 2, 3, 5, 5, 7, 7, 12, 15, 21, 24, 22, 23, 33, 36, 42, 58, 93, 95, 104, 105, 102, 83, 75, 72, 67, 66, 63, 68, 61, 61, 63, 62, 60, 67, 67, 55, 52, 55, 42, 43, 40, 43, 36, 37, 30, 33, 33, 29, 23, 20, 15, 15, 17, 16, 14, 13, 13, 12, 15, 13, 11, 7, 13, 12, 11, 10, 9, 6, 5, 7, 4, 7, 4, 2, 2, 2, 1, 0, 0, 0, 1, 0, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0, 0, 1, 2, 3, 4, 2, 3, 2, 4, 6, 7, 10, 12, 13, 14, 16, 18, 27, 31, 50, 50, 48, 58, 68, 86, 81, 82, 76, 67, 58, 58, 59, 63, 57, 47, 40, 48, 43, 46, 45, 46, 46, 44, 40, 39, 40, 40, 37, 39, 36, 29, 26, 20, 22, 23, 20, 15, 13, 16, 16, 14, 12, 10, 7, 9, 8, 6, 6, 5, 3, 3, 3, 2, 1, 1, 1, 1, 1, 2, 3, 3, 2, 2, 1, 1, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 2, 1, 2, 2, 2, 2, 4, 5, 4, 5, 4, 2, 4, 9, 11, 12, 16, 15, 20, 22, 28, 40, 44, 44, 48, 54, 54, 50, 53, 52, 51, 48, 47, 43, 44, 40, 40, 43, 36, 34, 30, 34, 32, 29, 26, 27, 24, 16, 22, 21, 18, 18, 17, 17, 15, 12, 14, 9, 12, 5, 6, 3, 6, 7, 6, 8, 9, 8, 7, 7, 6, 5, 4, 3, 5, 5, 4, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 1, 1, 2, 2, 2, 1, 1, 1, 0, 0, 1, 2, 3, 1, 2, 2, 7, 7, 9, 10, 10, 19, 22, 34, 44, 42, 45, 62, 63, 48, 48, 48, 46, 42, 37, 33, 33, 33, 35, 34, 37, 34, 33, 30, 28, 32, 33, 24, 27, 27, 23, 25, 18, 12, 13, 12, 12, 11, 9, 5, 6, 7, 8, 10, 7, 7, 5, 6, 5, 5, 5, 4, 6, 5, 2, 3, 5, 4, 4, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 2, 5, 11, 16, 20, 25, 25, 26, 36, 53, 49, 48, 51, 54, 47, 44, 35, 30, 21, 20, 22, 24, 26, 28, 22, 16, 19, 31, 26, 30, 25, 30, 26, 19, 22, 21, 18, 21, 23, 15, 11, 11, 11, 9, 6, 4, 2, 4, 4, 3, 2, 2, 4, 3, 3, 4, 3, 2, 1, 1, 0, 0, 3, 3, 2, 4, 3, 2, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 3, 2, 1, 1, 2, 3, 10, 13, 12, 12, 17, 26, 24, 23, 25, 30, 33, 28, 35, 34, 27, 22, 22, 21, 22, 19, 18, 16, 13, 17, 13, 14, 11, 14, 11, 11, 10, 12, 14, 13, 13, 15, 12, 9, 7, 6, 5, 5, 5, 6, 6, 7, 8, 6, 6, 5, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 2, 2, 1, 1, 2, 2, 0, 0, 0, 0, 2, 3, 5, 7, 5, 4, 10, 8, 10, 11, 18, 18, 21, 27, 27, 26, 24, 20, 24, 24, 21, 20, 21, 20, 19, 21, 18, 21, 13, 12, 14, 15, 13, 12, 14, 15, 13, 9, 8, 7, 6, 4, 8, 6, 4, 3, 4, 5, 5, 3, 1, 1, 1, 1, 0, 1, 1, 1, 3, 2, 3, 2, 1, 2, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 5, 7, 7, 9, 13, 13, 16, 20, 18, 22, 26, 26, 23, 23, 24, 20, 13, 7, 7, 11, 9, 12, 13, 16, 19, 20, 14, 11, 12, 11, 10, 11, 8, 6, 6, 4, 4, 2, 6, 6, 4, 4, 3, 3, 3, 6, 6, 6, 4, 4, 3, 4, 2, 3, 5, 3, 4, 2, 2, 4, 4, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 0, 1, 1, 2, 2, 2, 2, 1, 0, 1, 2, 3, 3, 5, 5, 4, 6, 15, 16, 18, 22, 22, 22, 23, 12, 8, 5, 6, 4, 5, 6, 9, 10, 11, 13, 17, 14, 11, 13, 13, 9, 7, 6, 11, 9, 7, 4, 4, 3, 2, 2, 3, 1, 4, 3, 2, 1, 2, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 3, 2, 3, 2, 2, 4, 3, 8, 11, 10, 12, 10, 6, 6, 12, 9, 5, 6, 6, 9, 8, 6, 8, 7, 8, 12, 11, 11, 7, 14, 13, 12, 11, 12, 6, 8, 10, 12, 8, 4, 4, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 1, 0, 0, 0, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 3, 4, 6, 9, 9, 11, 12, 12, 11, 12, 12, 9, 9, 6, 7, 8, 10, 10, 11, 4, 8, 7, 10, 9, 9, 10, 8, 6, 4, 3, 2, 2, 3, 3, 5, 7, 4, 4, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 2, 2, 4, 4, 4, 4, 6, 4, 8, 9, 7, 6, 7, 6, 6, 5, 5, 4, 2, 4, 4, 4, 4, 4, 6, 5, 3, 2, 3, 4, 2, 1, 2, 4, 6, 6, 6, 5, 2, 3, 4, 2, 1, 3, 3, 3, 3, 2, 2, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 2, 4, 5, 10, 9, 10, 10, 10, 8, 10, 9, 9, 8, 7, 7, 4, 5, 5, 6, 4, 3, 4, 2, 4, 4, 4, 5, 4, 2, 3, 2, 4, 2, 2, 2, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 3, 4, 3, 4, 6, 6, 3, 4, 2, 1, 2, 3, 3, 4, 2, 2, 4, 6, 4, 3, 2, 2, 2, 3, 4, 5, 4, 5, 4, 4, 3, 5, 5, 4, 4, 3, 3, 3, 2, 3, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 3, 6, 8, 8, 5, 5, 5, 6, 3, 4, 4, 5, 6, 6, 6, 4, 2, 2, 2, 2, 4, 2, 3, 3, 5, 6, 6, 6, 4, 3, 2, 2, 0, 2, 1, 1, 0, 0, 0, 0, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 6, 7, 7, 7, 6, 5, 5, 4, 4, 4, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 2, 1, 2, 3, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 5, 4, 5, 3, 3, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 2, 1, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 4, 3, 4, 4, 5, 5, 3, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 2, 2, 2, 3, 9, 9, 10, 15, 12, 8, 8, 11, 12, 12, 9, 6, 5, 9, 8, 10, 11, 11, 7, 5, 4, 5, 5, 5, 3, 0, 1, 3, 6, 7, 4, 4, 2, 1, 1, 2, 2, 2, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
            ]
        },
        "New Infections": {
            "Units": "",
            "Data": [
                [0, 2, 0, 0, 0, 0, 1, 4, 1, 0, 0, 3, 1, 1, 1, 2, 3, 1, 11, 14, 5, 9, 15, 30, 28, 50, 34, 47, 42, 48, 46, 36, 37, 17, 25, 33, 22, 31, 33, 37, 28, 36, 21, 21, 27, 26, 28, 15, 14, 20, 21, 15, 17, 19, 23, 17, 7, 15, 10, 10, 7, 14, 2, 13, 10, 1, 2, 0, 8, 4, 6, 1, 4, 3, 4, 4, 1, 3, 2, 1, 3, 0, 1, 1, 1, 1, 0, 1, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 5, 0, 3, 1, 2, 7, 6, 4, 3, 2, 11, 9, 15, 19, 16, 30, 34, 46, 51, 49, 39, 27, 32, 37, 22, 23, 19, 25, 17, 28, 15, 25, 28, 25, 22, 24, 17, 15, 25, 13, 24, 17, 14, 17, 12, 14, 11, 19, 9, 11, 10, 5, 8, 5, 6, 3, 6, 5, 4, 2, 6, 1, 2, 1, 2, 2, 0, 2, 2, 2, 1, 0, 1, 1, 0, 1, 1, 0, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 3, 1, 5, 6, 8, 6, 9, 7, 19, 12, 19, 30, 46, 25, 35, 35, 33, 21, 23, 19, 20, 12, 21, 19, 15, 19, 16, 14, 20, 17, 17, 6, 15, 14, 14, 14, 12, 11, 7, 10, 6, 9, 8, 7, 3, 4, 3, 5, 5, 4, 6, 7, 3, 3, 6, 2, 2, 2, 7, 0, 2, 2, 2, 2, 1, 2, 0, 4, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 1, 1, 2, 2, 2, 4, 3, 5, 4, 5, 8, 13, 10, 23, 18, 19, 23, 26, 32, 26, 21, 15, 9, 16, 17, 17, 16, 17, 13, 9, 19, 10, 15, 11, 15, 12, 13, 10, 16, 13, 9, 13, 13, 4, 6, 7, 6, 8, 2, 4, 2, 5, 5, 4, 3, 5, 3, 1, 5, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 2, 0, 1, 1, 0, 0, 2, 1, 1, 2, 0, 0, 2, 6, 2, 4, 6, 6, 6, 10, 12, 20, 16, 15, 20, 16, 18, 14, 15, 14, 12, 13, 12, 9, 13, 10, 13, 11, 9, 9, 6, 15, 9, 9, 7, 8, 7, 6, 8, 6, 6, 3, 5, 5, 4, 4, 4, 0, 4, 0, 3, 0, 3, 2, 1, 3, 4, 0, 0, 3, 1, 2, 1, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 5, 2, 2, 3, 5, 10, 9, 17, 15, 14, 14, 26, 20, 11, 14, 10, 14, 10, 8, 11, 9, 12, 13, 7, 12, 11, 9, 11, 8, 12, 7, 7, 9, 6, 6, 5, 2, 4, 3, 3, 7, 2, 0, 2, 2, 3, 4, 3, 0, 1, 0, 1, 1, 2, 2, 0, 3, 1, 1, 1, 2, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 3, 6, 6, 6, 6, 9, 12, 17, 25, 14, 14, 17, 12, 8, 12, 10, 9, 2, 8, 5, 11, 9, 7, 4, 2, 11, 15, 4, 11, 4, 9, 6, 3, 12, 4, 2, 6, 6, 3, 2, 4, 2, 1, 1, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 1, 0, 0, 0, 3, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 1, 1, 8, 3, 2, 5, 7, 13, 6, 9, 8, 10, 10, 4, 13, 8, 8, 5, 6, 9, 6, 5, 5, 4, 5, 7, 2, 6, 3, 7, 2, 5, 2, 5, 5, 5, 4, 5, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 3, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 7, 0, 5, 3, 10, 6, 8, 12, 3, 10, 5, 6, 10, 8, 4, 4, 5, 6, 2, 4, 3, 7, 2, 1, 6, 5, 5, 4, 6, 3, 3, 3, 3, 1, 1, 1, 4, 1, 1, 1, 2, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 2, 3, 3, 2, 4, 4, 6, 7, 8, 10, 8, 6, 7, 4, 4, 1, 3, 0, 7, 4, 5, 6, 5, 4, 6, 7, 3, 4, 4, 2, 2, 3, 0, 1, 1, 0, 2, 0, 4, 2, 1, 0, 1, 1, 1, 3, 0, 1, 1, 0, 1, 1, 0, 1, 2, 0, 2, 0, 1, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 2, 1, 2, 1, 3, 4, 9, 5, 7, 7, 3, 6, 5, 1, 1, 2, 2, 2, 2, 2, 3, 3, 4, 5, 7, 0, 2, 4, 2, 0, 1, 1, 7, 1, 1, 1, 2, 0, 0, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 0, 1, 1, 0, 3, 2, 5, 4, 3, 5, 2, 2, 4, 6, 1, 1, 1, 2, 3, 3, 1, 3, 1, 3, 5, 4, 3, 1, 8, 1, 4, 1, 3, 0, 4, 3, 3, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 1, 2, 5, 3, 6, 3, 4, 4, 5, 3, 2, 2, 1, 2, 2, 4, 2, 4, 0, 5, 4, 4, 1, 3, 4, 1, 1, 0, 0, 0, 1, 2, 1, 2, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 3, 0, 2, 0, 4, 1, 6, 1, 1, 1, 3, 1, 1, 2, 2, 2, 0, 2, 1, 1, 1, 1, 2, 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 1, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 7, 2, 2, 3, 3, 1, 2, 3, 2, 3, 0, 2, 1, 1, 2, 1, 1, 1, 2, 0, 2, 0, 1, 2, 0, 0, 2, 0, 2, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 2, 1, 1, 3, 2, 2, 0, 2, 0, 0, 2, 1, 1, 2, 0, 0, 3, 2, 0, 1, 0, 1, 1, 1, 2, 1, 1, 1, 0, 1, 0, 2, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 3, 2, 2, 0, 2, 0, 2, 0, 1, 0, 2, 1, 0, 2, 0, 0, 1, 0, 0, 4, 0, 1, 1, 2, 3, 2, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 2, 0, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 3, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 1, 1, 1, 1, 2, 0, 0, 1, 0, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 2, 6, 3, 3, 8, 3, 0, 3, 4, 3, 4, 0, 2, 0, 4, 1, 3, 1, 3, 1, 0, 1, 1, 1, 1, 0, 0, 1, 2, 3, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
            ]
        },
        "Population": {
            "Units": "",
            "Data": [
                [1908, 1908, 1905, 1905, 1904, 1900, 1899, 1897, 1896, 1895, 1894, 1894, 1893, 1892, 1892, 1891, 1890, 1890, 1888, 1888, 1886, 1886, 1886, 1885, 1884, 1884, 1884, 1883, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1880, 1878, 1877, 1876, 1876, 1875, 1874, 1871, 1870, 1867, 1866, 1865, 1864, 1863, 1863, 1863, 1861, 1861, 1861, 1861, 1861, 1859, 1859, 1859, 1859, 1859, 1858, 1857, 1855, 1855, 1853, 1852, 1852, 1852, 1851, 1851, 1850, 1849, 1849, 1848, 1848, 1847, 1846, 1846, 1846, 1846, 1845, 1844, 1842, 1842, 1841, 1840, 1838, 1836, 1835, 1832, 1830, 1827, 1826, 1826, 1826, 1825, 1825, 1823, 1821, 1821, 1820, 1820, 1819, 1819, 1818, 1818, 1818, 1817, 1816, 1816, 1815, 1815, 1813, 1811, 1811, 1811, 1811, 1810, 1810, 1809, 1807, 1805, 1803, 1803, 1803, 1799, 1797, 1794, 1794, 1792, 1792, 1792, 1791, 1790, 1789, 1787, 1787, 1786, 1786, 1786, 1785, 1784, 1783, 1782, 1779, 1777, 1776, 1775, 1774],
                [1592, 1591, 1592, 1592, 1592, 1596, 1596, 1597, 1597, 1598, 1599, 1597, 1598, 1598, 1597, 1598, 1599, 1599, 1601, 1600, 1601, 1600, 1599, 1599, 1600, 1600, 1599, 1600, 1602, 1602, 1602, 1602, 1601, 1599, 1599, 1599, 1601, 1601, 1601, 1600, 1601, 1602, 1604, 1604, 1607, 1607, 1608, 1607, 1606, 1606, 1605, 1607, 1607, 1605, 1605, 1605, 1605, 1604, 1604, 1602, 1599, 1599, 1599, 1601, 1600, 1600, 1601, 1600, 1598, 1598, 1597, 1597, 1597, 1596, 1595, 1593, 1592, 1593, 1592, 1591, 1591, 1590, 1591, 1592, 1592, 1592, 1593, 1594, 1596, 1597, 1598, 1598, 1601, 1602, 1602, 1601, 1602, 1601, 1602, 1604, 1603, 1604, 1603, 1603, 1603, 1602, 1601, 1600, 1600, 1600, 1597, 1598, 1597, 1598, 1599, 1598, 1598, 1598, 1598, 1597, 1598, 1599, 1599, 1600, 1599, 1595, 1599, 1601, 1604, 1602, 1604, 1604, 1602, 1602, 1602, 1602, 1603, 1601, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1605, 1606, 1606, 1605, 1605],
                [1252, 1252, 1254, 1252, 1252, 1252, 1253, 1253, 1254, 1254, 1253, 1255, 1253, 1253, 1253, 1253, 1253, 1253, 1252, 1251, 1252, 1252, 1253, 1252, 1252, 1252, 1253, 1253, 1253, 1253, 1252, 1252, 1253, 1254, 1253, 1253, 1251, 1250, 1251, 1252, 1250, 1248, 1248, 1247, 1247, 1248, 1247, 1247, 1247, 1247, 1248, 1247, 1246, 1248, 1248, 1248, 1249, 1250, 1250, 1252, 1254, 1253, 1254, 1254, 1255, 1256, 1255, 1256, 1258, 1259, 1260, 1261, 1262, 1262, 1264, 1266, 1268, 1268, 1269, 1269, 1269, 1271, 1269, 1269, 1269, 1270, 1270, 1270, 1269, 1268, 1270, 1272, 1272, 1272, 1272, 1273, 1273, 1272, 1273, 1271, 1271, 1271, 1272, 1272, 1272, 1273, 1271, 1270, 1271, 1272, 1275, 1275, 1274, 1274, 1274, 1272, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1272, 1273, 1277, 1276, 1276, 1274, 1276, 1275, 1275, 1277, 1278, 1279, 1279, 1278, 1280, 1278, 1277, 1276, 1277, 1278, 1279, 1280, 1279, 1280, 1280, 1282, 1282],
                [1034, 1035, 1034, 1036, 1035, 1034, 1034, 1033, 1033, 1031, 1032, 1032, 1034, 1033, 1034, 1034, 1034, 1033, 1033, 1035, 1035, 1035, 1034, 1035, 1035, 1035, 1034, 1033, 1031, 1031, 1032, 1032, 1031, 1032, 1033, 1034, 1036, 1038, 1036, 1035, 1037, 1039, 1039, 1041, 1041, 1041, 1042, 1044, 1046, 1046, 1046, 1047, 1048, 1048, 1048, 1046, 1046, 1046, 1046, 1046, 1047, 1049, 1049, 1049, 1049, 1049, 1050, 1050, 1050, 1050, 1049, 1048, 1048, 1049, 1049, 1049, 1047, 1047, 1047, 1047, 1045, 1045, 1047, 1048, 1048, 1047, 1047, 1046, 1047, 1047, 1047, 1046, 1045, 1045, 1044, 1044, 1044, 1046, 1045, 1047, 1048, 1048, 1048, 1049, 1049, 1049, 1052, 1053, 1053, 1053, 1053, 1052, 1052, 1051, 1051, 1054, 1054, 1054, 1054, 1055, 1054, 1055, 1056, 1056, 1054, 1053, 1052, 1052, 1054, 1054, 1052, 1050, 1049, 1048, 1048, 1049, 1051, 1051, 1053, 1053, 1054, 1053, 1053, 1051, 1050, 1051, 1051, 1051, 1050, 1051],
                [793, 793, 794, 794, 796, 796, 796, 798, 798, 800, 799, 797, 797, 798, 798, 798, 798, 799, 800, 800, 800, 800, 801, 801, 801, 800, 801, 802, 804, 803, 802, 801, 802, 802, 802, 802, 801, 800, 802, 802, 802, 802, 800, 800, 800, 799, 799, 799, 799, 799, 798, 798, 797, 796, 796, 798, 799, 799, 798, 798, 798, 798, 797, 797, 797, 798, 797, 797, 797, 797, 798, 799, 799, 798, 798, 797, 798, 798, 797, 798, 800, 800, 800, 800, 800, 799, 799, 801, 801, 800, 800, 801, 801, 801, 802, 802, 801, 800, 801, 801, 799, 799, 798, 798, 797, 798, 797, 798, 798, 798, 797, 798, 800, 802, 803, 803, 803, 803, 804, 804, 805, 805, 805, 805, 806, 807, 807, 807, 807, 807, 810, 812, 813, 813, 813, 813, 813, 812, 812, 813, 813, 814, 813, 815, 815, 815, 815, 816, 817, 817],
                [665, 665, 665, 665, 662, 663, 663, 663, 663, 662, 663, 664, 664, 664, 664, 664, 664, 662, 662, 662, 662, 662, 661, 661, 660, 661, 661, 661, 660, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 662, 661, 661, 664, 664, 664, 665, 665, 665, 664, 663, 664, 664, 665, 666, 666, 666, 666, 666, 667, 667, 666, 666, 666, 666, 666, 666, 666, 665, 665, 665, 665, 665, 665, 665, 665, 666, 667, 667, 667, 667, 667, 667, 667, 667, 667, 669, 669, 668, 668, 670, 670, 669, 669, 668, 668, 667, 668, 667, 666, 666, 668, 668, 669, 669, 670, 670, 671, 670, 669, 669, 669, 669, 669, 669, 669, 668, 667, 666, 666, 664, 664, 662, 663, 662, 663, 661, 662, 661, 661, 661, 661, 661, 661, 662, 662, 662, 662, 662, 662, 662, 662, 662, 663, 663, 663, 663, 663, 663, 662, 662],
                [567, 567, 565, 565, 568, 567, 567, 567, 567, 567, 566, 565, 565, 566, 565, 565, 565, 566, 566, 566, 566, 567, 568, 568, 569, 567, 566, 566, 567, 567, 568, 569, 569, 569, 569, 569, 570, 571, 571, 571, 572, 572, 572, 572, 572, 570, 570, 570, 571, 572, 572, 571, 571, 570, 570, 570, 570, 569, 568, 568, 569, 569, 569, 569, 569, 569, 569, 569, 568, 568, 568, 568, 568, 569, 569, 569, 568, 567, 568, 568, 567, 567, 567, 566, 566, 565, 565, 564, 564, 564, 564, 564, 565, 566, 566, 567, 567, 569, 570, 570, 569, 569, 568, 568, 567, 567, 566, 567, 567, 567, 567, 567, 567, 567, 567, 568, 570, 571, 571, 573, 573, 575, 575, 576, 576, 578, 578, 579, 577, 577, 577, 577, 577, 576, 574, 573, 573, 574, 573, 573, 573, 573, 573, 573, 574, 574, 573, 573, 574, 574],
                [398, 398, 400, 399, 399, 399, 399, 399, 399, 400, 401, 402, 402, 402, 403, 402, 402, 403, 403, 403, 403, 403, 403, 404, 404, 406, 407, 407, 407, 407, 407, 407, 407, 407, 407, 406, 406, 406, 406, 406, 406, 405, 403, 403, 403, 405, 404, 404, 403, 403, 403, 404, 403, 404, 404, 404, 403, 403, 404, 404, 404, 404, 405, 405, 405, 405, 405, 406, 407, 406, 405, 405, 405, 405, 405, 404, 405, 406, 406, 406, 407, 407, 407, 408, 408, 409, 409, 411, 411, 411, 411, 411, 411, 410, 410, 410, 409, 409, 409, 408, 409, 409, 410, 410, 411, 411, 412, 412, 413, 413, 414, 413, 413, 413, 413, 413, 413, 412, 412, 412, 411, 410, 410, 410, 410, 408, 409, 409, 411, 411, 410, 410, 410, 410, 412, 412, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 412, 412, 412, 412],
                [349, 349, 349, 350, 350, 351, 351, 351, 350, 350, 350, 351, 351, 350, 350, 351, 351, 351, 351, 351, 350, 350, 350, 350, 350, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 350, 350, 350, 349, 349, 349, 350, 351, 351, 351, 350, 351, 351, 352, 352, 352, 351, 352, 352, 352, 351, 352, 353, 352, 352, 352, 352, 352, 352, 352, 352, 353, 353, 353, 354, 355, 355, 354, 354, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 354, 354, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 355, 355, 355, 356, 356, 356, 356, 356, 356, 356, 355, 355, 354, 354, 354, 355, 355, 355, 355, 354, 354, 355, 355, 355, 356, 357, 357, 357, 357, 359, 359, 359, 359, 358, 359, 359, 359, 360, 360, 361, 362, 362, 363, 363, 363, 361, 361, 360, 359, 359, 359, 359, 359, 359],
                [281, 281, 281, 281, 281, 281, 280, 280, 281, 281, 281, 281, 281, 282, 282, 282, 282, 282, 282, 282, 283, 283, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 282, 281, 281, 282, 282, 281, 281, 282, 282, 282, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 285, 285, 285, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 287, 287, 286, 286, 286, 286, 285, 285, 285, 285, 285, 285, 286, 286, 286, 286, 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 286, 286, 286, 285, 285, 285, 285, 285, 286, 284, 284, 284, 284, 283, 282, 283, 283, 283, 283, 283, 283, 282, 282, 282, 282, 282, 282, 282, 281, 282, 282, 282, 282, 282, 282, 281, 281, 281, 281, 281, 281, 283, 283, 283, 284, 283, 283, 282, 282, 282],
                [218, 218, 218, 218, 218, 218, 219, 219, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219, 218, 216, 216, 215, 215, 215, 215, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 214, 214, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 216, 216, 216, 217, 217, 216, 218, 218, 218, 218, 219, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 220, 220, 221, 221, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 223, 223, 224, 224, 224],
                [188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 188, 188, 188, 188, 188, 187, 187, 187, 187, 186, 186, 184, 182, 182, 182, 182, 182, 182, 181, 181, 182, 184, 184, 185, 185, 186, 187, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 188, 188, 188, 188, 187, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 187, 186, 186, 186, 186, 186, 185, 184, 184, 184, 184, 184, 184, 184, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186],
                [158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 163, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 169, 169, 169, 169, 169, 170, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 168, 168, 168, 168, 168, 168, 168, 167, 166, 166, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 163, 163, 163, 163, 163, 163, 163],
                [115, 115, 115, 114, 114, 114, 114, 114, 114, 114, 114, 114, 113, 113, 113, 113, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 110, 110, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 109, 109, 109, 109, 109, 109, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 106, 106, 106, 106, 108, 108, 108, 108, 110, 109, 109, 109, 109, 109, 109, 110, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 114, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114],
                [95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105],
                [78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 77, 77, 77, 77, 77, 77, 77, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 74, 75, 75, 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74],
                [72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 74, 74, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74],
                [49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50],
                [39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42],
                [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29],
                [119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121]
            ]
        }
    }
}
Demographic summary output report

The demographic summary output report is a JSON-formatted file with the demographic channel output results of the simulation, consisting of simulation-wide averages by time step. The format is identical to the inset chart output report, except the channels reflect demographic categories, such as gender ratio. The file name is DemographicsSummary.json.

To generate the demographics summary report, set the Enable_Demographics_Reporting configuration parameter to 1. The binned output report will also be generated.

The file contains a header and a channels section.

Channels

The channels section contains the following parameters.

Parameter

Data type

Description

<Channel_Title>

string

The title of the particular demographic channel.

Units

string

The units used for this channel.

Data

array

A list of the channel data at each time step.

Example

The following is a sample of a DemographicsSummary.json file.

{
    "Header": {
        "DateTime": "Mon Mar 16 07:45:10 2015",
        "DTK_Version": "4777 v2.0-HIV 2015/02/26 10:51:25",
        "Report_Type": "InsetChart",
        "Report_Version": "3.2",
        "Start_Time": 0,
        "Simulation_Timestep": 1,
        "Timesteps": 5,
        "Channels": 28
    },
    "Channels": {
        "Average Age": {
            "Units": "",
            "Data": [
                8592.415039063,
                8593.427734375,
                8594.439453125,
                8595.41796875,
                8596.412109375
            ]
        },
        "Gender Ratio (fraction male)": {
            "Units": "",
            "Data": [
                0.5350999832153,
                0.5350999832153,
                0.5350999832153,
                0.5350999832153,
                0.5350999832153
            ]
        },
        "New Births": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "New Natural Deaths": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Population Age 10-14": {
            "Units": "",
            "Data": [
                1203,
                1204,
                1202,
                1203,
                1203
            ]
        },
        "Population Age 15-19": {
            "Units": "",
            "Data": [
                1056,
                1057,
                1059,
                1059,
                1059
            ]
        },
        "Population Age 20-24": {
            "Units": "",
            "Data": [
                810,
                810,
                810,
                809,
                809
            ]
        },
        "Population Age 25-29": {
            "Units": "",
            "Data": [
                732,
                732,
                732,
                732,
                732
            ]
        },
        "Population Age 30-34": {
            "Units": "",
            "Data": [
                540,
                539,
                539,
                539,
                539
            ]
        },
        "Population Age 35-39": {
            "Units": "",
            "Data": [
                410,
                411,
                411,
                411,
                411
            ]
        },
        "Population Age 40-44": {
            "Units": "",
            "Data": [
                351,
                351,
                351,
                352,
                352
            ]
        },
        "Population Age 45-49": {
            "Units": "",
            "Data": [
                294,
                294,
                294,
                294,
                294
            ]
        },
        "Population Age 5-9": {
            "Units": "",
            "Data": [
                1599,
                1597,
                1598,
                1597,
                1599
            ]
        },
        "Population Age 50-54": {
            "Units": "",
            "Data": [
                201,
                201,
                201,
                201,
                201
            ]
        },
        "Population Age 55-59": {
            "Units": "",
            "Data": [
                194,
                194,
                194,
                193,
                193
            ]
        },
        "Population Age 60-64": {
            "Units": "",
            "Data": [
                163,
                163,
                163,
                164,
                164
            ]
        },
        "Population Age 65-69": {
            "Units": "",
            "Data": [
                111,
                111,
                111,
                111,
                111
            ]
        },
        "Population Age 70-74": {
            "Units": "",
            "Data": [
                104,
                104,
                104,
                103,
                103
            ]
        },
        "Population Age 75-79": {
            "Units": "",
            "Data": [
                86,
                86,
                86,
                87,
                87
            ]
        },
        "Population Age 80-84": {
            "Units": "",
            "Data": [
                55,
                55,
                55,
                55,
                55
            ]
        },
        "Population Age 85-89": {
            "Units": "",
            "Data": [
                61,
                61,
                61,
                61,
                61
            ]
        },
        "Population Age 90-94": {
            "Units": "",
            "Data": [
                49,
                49,
                49,
                49,
                49
            ]
        },
        "Population Age 95-99": {
            "Units": "",
            "Data": [
                30,
                30,
                30,
                30,
                30
            ]
        },
        "Population Age <5": {
            "Units": "",
            "Data": [
                1829,
                1829,
                1828,
                1828,
                1826
            ]
        },
        "Population Age >100": {
            "Units": "",
            "Data": [
                122,
                122,
                122,
                122,
                122
            ]
        },
        "Possible Mothers": {
            "Units": "",
            "Data": [
                1912,
                1912,
                1912,
                1913,
                1913
            ]
        },
        "Pseudo-Population": {
            "Units": "",
            "Data": [
                10000,
                10000,
                10000,
                10000,
                10000
            ]
        },
        "Statistical Population": {
            "Units": "",
            "Data": [
                10000,
                10000,
                10000,
                10000,
                10000
            ]
        }
    }
}
Property output report

The property output report is a JSON-formatted file with the channel output results of the simulation, defined by the groups set up using IndividualProperties in the demographics file. See Configure heterogeneity using individual and node properties. For example, it allows you to compare disease deaths for people in the high risk group versus the low risk group. If you want to aggregate the data, you must create a script for aggregating information. The file name is PropertyReport.json.

To generate the property report, set the Enable_Property_Output configuration parameter to 1.

The file contains a header and a channels section.

Channels

The channels section contains the following parameters.

Parameter

Data type

Description

<Channel_Title>

string

The title of the particular property channel. The channel titles use the following conventions: for a single property, <channel type>:<property>:<value>, and for multiple properties, <channel type>:<property 1>:<value>,<property 2>:<value>. For example, Infected:Accessibility:Easy or New Infections:Accessibility:Difficult,Risk:High.

Units

string

The units used for this channel.

Data

array

A list of the channel data at each time step.

Example

The following is a sample of a PropertyReport.json file.

{
    "Header": {
        "DateTime": "Mon Feb 15 21:49:24 2016",
        "DTK_Version": "5538 trunk 2015/08/07 14:40:43",
        "Report_Type": "InsetChart",
        "Report_Version": "3.2",
        "Start_Time": 0,
        "Simulation_Timestep": 1,
        "Timesteps": 10,
        "Channels": 8
    },
    "Channels": {
        "Disease Deaths:Accessibility:Easy": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Disease Deaths:Accessibility:Hard": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Infected:Accessibility:Easy": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Infected:Accessibility:Hard": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
            ]
        },
        "New Infections:Accessibility:Easy": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
            ]
        },
        "New Infections:Accessibility:Hard": {
            "Units": "",
            "Data": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
            ]
        },
        "Statistical Population:Accessibility:Easy": {
            "Units": "",
            "Data": [
                6946,
                6946,
                6946,
                6946,
                6946,
                6946,
                6946,
                6946,
                6946,
                6946
            ]
        },
        "Statistical Population:Accessibility:Hard": {
            "Units": "",
            "Data": [
                3054,
                3054,
                3054,
                3054,
                3054,
                3054,
                3054,
                3054,
                3054,
                3054
            ]
        }
    }
}
Spatial output report

The spatial output report breaks the channel data down per node, rather than across the entire simulation. It is a set of binary files, consisting of one file per channel. For each value set in the Spatial_Output_Channels configuration parameter array, a binary file with the name convention SpatialReport_<channel>.bin is generated. In addition, Enable_Spatial_Output must be set to 1.

The binary format of the file consists of a stream of 4-byte integers followed by a stream of 4-byte floating point values. The first value is a 4-byte integer representing the number of nodes in the file and the second is a 4-byte integer that contains the number of time steps in the file. Following these two values is a stream of 4-byte integers that contain the node ID values in the order they will appear in the rest of the file. Following the node IDs is an array of 4-byte floating point values that represent the output values at the first time step for each node. The next array contains the values at the second time step, and so on.

The following diagram shows the format for data in the spatial output report file:

_images/spatialOutputBFF.jpg

Error and logging files

When you run a simulation, EMOD will output basic error and logging information to help track the progress and help debug any issues that may occur. If you run the simulation on an HPC cluster, the cluster will generate additional logging and error files. See Troubleshooting EMOD simulations if you need help resolving an error.

Status

A status.txt file will be saved to the working directory that provides one output line per time step and includes the total run time of the simulation. A simulation with 50 time steps will look something like this:

Beginning Simulation...
1 of 50 steps complete.
2 of 50 steps complete.
3 of 50 steps complete.
4 of 50 steps complete.
5 of 50 steps complete.
6 of 50 steps complete.
7 of 50 steps complete.
8 of 50 steps complete.
9 of 50 steps complete.
10 of 50 steps complete.
11 of 50 steps complete.
12 of 50 steps complete.
13 of 50 steps complete.
14 of 50 steps complete.
15 of 50 steps complete.
16 of 50 steps complete.
17 of 50 steps complete.
18 of 50 steps complete.
19 of 50 steps complete.
20 of 50 steps complete.
21 of 50 steps complete.
22 of 50 steps complete.
23 of 50 steps complete.
24 of 50 steps complete.
25 of 50 steps complete.
26 of 50 steps complete.
27 of 50 steps complete.
28 of 50 steps complete.
29 of 50 steps complete.
30 of 50 steps complete.
31 of 50 steps complete.
32 of 50 steps complete.
33 of 50 steps complete.
34 of 50 steps complete.
35 of 50 steps complete.
36 of 50 steps complete.
37 of 50 steps complete.
38 of 50 steps complete.
39 of 50 steps complete.
40 of 50 steps complete.
41 of 50 steps complete.
42 of 50 steps complete.
43 of 50 steps complete.
44 of 50 steps complete.
45 of 50 steps complete.
46 of 50 steps complete.
47 of 50 steps complete.
48 of 50 steps complete.
49 of 50 steps complete.
50 of 50 steps complete.
Done - 0:00:02
Standard output

When you run a simulation on an HPC cluster, it will generate a standard output logging file (StdOut.txt) in the working directory that captures all standard output messages. When you run a simulation locally, the Command Prompt window will display the same information. If you want to save this information to a text file instead, you can append > stdout.txt to the command used to run the local EMOD simulation to redirect the console output to the file specified.

The file contains information about a particular simulation, such as the EMOD version used and the files in use, as well as other initialization information, including the default logging level and the logging levels set for particular modules. The file follows that information with log output using the following format: <timestep><HPC rank><log level><module><message>.

By default, the logging level is set to “INFO”. If you want to change the logging level, see Set log levels.

For example:

C:\EMOD\CampaignTesting\00_DefaultDemographics>..\Eradication.exe -C config.json -I ../input
Intellectual Ventures(R)/EMOD Disease Transmission Kernel 2.8.1331.0
Built on Sep 30 2016 08:39:43 by cwiswell from master (482fdae) checked in on 2016-09-28 14:47:20 -0700
Supports sim_types: GENERIC, VECTOR, MALARIA, AIRBORNE, POLIO, TB, TBHIV, STI, HIV, PY.
Using config file: config.json
Using input path: ../input
Using output path: output
using dll path:
--python-script-path (-P) not on command line - not using embedded python
Initializing environment...
Log-levels:
        Default -> INFO
        Eradication -> INFO
00:00:00 [0] [I] [Eradication] Loaded Configuration...
00:00:00 [0] [I] [Eradication] 99 parameters found.
00:00:00 [0] [I] [Eradication] Initializing Controller...
00:00:00 [0] [I] [Controller] DefaultController::execute_internal()...
00:00:00 [0] [I] [Simulation] Using PSEUDO_DES random number generator.
00:00:00 [0] [I] [Controller] DefaultController::execute_internal() populate simulation...
00:00:00 [0] [I] [Simulation] Campaign file name identified as: campaign.json
00:00:00 [0] [I] [NodeDemographics] Using default 3x3 torus geography
00:00:00 [0] [I] [Climate] Initialize
00:00:00 [0] [I] [LoadBalanceScheme] Using Checkerboard Load Balance Scheme.
00:00:01 [0] [I] [Simulation] Looking for campaign file campaign.json
00:00:01 [0] [I] [Simulation] Found campaign file successfully.
00:00:01 [0] [I] [DllLoader] ReadEmodulesJson: no file, returning.
00:00:01 [0] [I] [DllLoader] dllPath not passed in, getting from EnvPtr
00:00:01 [0] [I] [DllLoader] Trying to copy from string to wstring.
00:00:01 [0] [I] [DllLoader] DLL ws root path:
00:00:01 [0] [W] [Simulation] Failed to load intervention emodules for SimType: GENERIC_SIM from path: interventions
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Number_Repetitions" : -1 ) for unspecified parameter.
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Timesteps_Between_Repetitions" : -1 ) for unspecified parameter.
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Intervention_Name" : "struct Kernel::BaseIntervention" ) for unspecified parameter.
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Intervention_Name" : "struct Kernel::BaseIntervention" ) for unspecified parameter.
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Intervention_Name" : "struct Kernel::BaseIntervention" ) for unspecified parameter.
00:00:01 [0] [I] [Simulation] populateFromDemographics() created 9 nodes
00:00:01 [0] [I] [Simulation] populateFromDemographics() generated 9 nodes.
00:00:01 [0] [I] [Simulation] Rank 0 contributes 9 nodes...
00:00:01 [0] [I] [Simulation] Merging node rank maps...
00:00:01 [0] [I] [Simulation] Merged rank 0 map now has 9 nodes.
00:00:01 [0] [I] [Simulation] Rank 0 map contents:
{ NodeRankMap:
[1,000000000C10A960]
[2,000000000BF4EAF0]
[3,000000000BFA2250]
[4,000000000BFF1C10]
[5,000000000BE37B60]
[6,000000000BE87380]
[7,000000000BEE74F0]
[8,000000000B721980]
[9,000000000B7AE280]
}

00:00:01 [0] [I] [Simulation] Initialized 'InsetChart.json' reporter
00:00:01 [0] [I] [Simulation] Initialized 'BinnedReport.json' reporter
00:00:01 [0] [I] [Simulation] Initialized 'DemographicsSummary.json' reporter
00:00:01 [0] [I] [Simulation] Update(): Time: 1.0 Rank: 0 StatPop: 900 Infected: 0
00:00:01 [0] [I] [SimulationEventContext] Time for campaign event. Calling Dispatch...
00:00:01 [0] [I] [SimulationEventContext] 9 node(s) visited.
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Intervention_Name" : "struct Kernel::BaseIntervention" ) for unspecified parameter.
00:00:01 [0] [I] [JsonConfigurable] Using the default value ( "Intervention_Name" : "struct Kernel::BaseIntervention" ) for unspecified parameter.
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 0 'OutbreakIndividual' interventions at node 1
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 2 'OutbreakIndividual' interventions at node 2
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 0 'OutbreakIndividual' interventions at node 3
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 0 'OutbreakIndividual' interventions at node 4
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 0 'OutbreakIndividual' interventions at node 5
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 0 'OutbreakIndividual' interventions at node 6
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 0 'OutbreakIndividual' interventions at node 7
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 1 'OutbreakIndividual' interventions at node 8
00:00:01 [0] [I] [StandardEventCoordinator] UpdateNodes() gave out 1 'OutbreakIndividual' interventions at node 9
00:00:01 [0] [I] [Simulation] Update(): Time: 2.0 Rank: 0 StatPop: 900 Infected: 4
00:00:01 [0] [I] [Simulation] Update(): Time: 3.0 Rank: 0 StatPop: 900 Infected: 18
00:00:01 [0] [I] [Simulation] Update(): Time: 4.0 Rank: 0 StatPop: 900 Infected: 63
00:00:01 [0] [I] [Simulation] Update(): Time: 5.0 Rank: 0 StatPop: 900 Infected: 161
00:00:01 [0] [I] [Simulation] Update(): Time: 6.0 Rank: 0 StatPop: 900 Infected: 232
00:00:01 [0] [I] [Simulation] Update(): Time: 7.0 Rank: 0 StatPop: 900 Infected: 203
00:00:01 [0] [I] [Simulation] Update(): Time: 8.0 Rank: 0 StatPop: 900 Infected: 165
00:00:01 [0] [I] [Simulation] Update(): Time: 9.0 Rank: 0 StatPop: 900 Infected: 132
00:00:01 [0] [I] [Simulation] Update(): Time: 10.0 Rank: 0 StatPop: 900 Infected: 110
00:00:01 [0] [I] [Simulation] Update(): Time: 11.0 Rank: 0 StatPop: 900 Infected: 83
00:00:01 [0] [I] [Simulation] Update(): Time: 12.0 Rank: 0 StatPop: 900 Infected: 69
00:00:01 [0] [I] [Simulation] Update(): Time: 13.0 Rank: 0 StatPop: 900 Infected: 54
00:00:01 [0] [I] [Simulation] Update(): Time: 14.0 Rank: 0 StatPop: 900 Infected: 40
00:00:01 [0] [I] [Simulation] Update(): Time: 15.0 Rank: 0 StatPop: 900 Infected: 30
00:00:01 [0] [I] [Simulation] Update(): Time: 16.0 Rank: 0 StatPop: 900 Infected: 22
00:00:01 [0] [I] [Simulation] Update(): Time: 17.0 Rank: 0 StatPop: 900 Infected: 17
00:00:01 [0] [I] [Simulation] Update(): Time: 18.0 Rank: 0 StatPop: 900 Infected: 14
00:00:01 [0] [I] [Simulation] Update(): Time: 19.0 Rank: 0 StatPop: 900 Infected: 12
00:00:01 [0] [I] [Simulation] Update(): Time: 20.0 Rank: 0 StatPop: 900 Infected: 9
00:00:01 [0] [I] [Simulation] Update(): Time: 21.0 Rank: 0 StatPop: 900 Infected: 7
00:00:01 [0] [I] [Simulation] Update(): Time: 22.0 Rank: 0 StatPop: 900 Infected: 7
00:00:01 [0] [I] [Simulation] Update(): Time: 23.0 Rank: 0 StatPop: 900 Infected: 7
00:00:01 [0] [I] [Simulation] Update(): Time: 24.0 Rank: 0 StatPop: 900 Infected: 5
00:00:01 [0] [I] [Simulation] Update(): Time: 25.0 Rank: 0 StatPop: 900 Infected: 3
00:00:01 [0] [I] [Simulation] Update(): Time: 26.0 Rank: 0 StatPop: 900 Infected: 3
00:00:01 [0] [I] [Simulation] Update(): Time: 27.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 28.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 29.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 30.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 31.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 32.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 33.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 34.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 35.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 36.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 37.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 38.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 39.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 40.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 41.0 Rank: 0 StatPop: 900 Infected: 1
00:00:02 [0] [I] [Simulation] Update(): Time: 42.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 43.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 44.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 45.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 46.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 47.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 48.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 49.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Update(): Time: 50.0 Rank: 0 StatPop: 900 Infected: 0
00:00:02 [0] [I] [Simulation] Finalizing 'InsetChart.json' reporter.
00:00:02 [0] [I] [Simulation] Finalizing 'BinnedReport.json' reporter.
00:00:02 [0] [I] [Simulation] Finalizing 'DemographicsSummary.json' reporter.
00:00:02 [0] [I] [Eradication] Controller executed successfully.
Standard error

When you run a simulation on an HPC cluster, it will also generate a standard error logging file (StdErr.txt) in the working directory that captures all standard error messages.

Troubleshooting EMOD simulations

If you encounter any of the following problems when attempting to run EMOD simulations, see the information below to resolve the issue.

If you need assistance, you can contact support for help with solving issues. You can contact Institute for Disease Modeling (IDM) support at support@idmod.org. When submitting the issue, please include any error information. See Debugging and testing for troubleshooting issues when attempting to build Eradication.exe or Eradication binary.

Exceptions

Whenever EMOD encounters an error condition while running a simulation, it should throw an exception. These exceptions are designed to help you diagnose any problems so that you can quickly resolve the issue. You can find the exceptions code in the utils directory of the EMOD source code within the files Exceptions.h and Exceptions.cpp.

Each exception will return, at a minimum, the following information:

  • Exception type caught

  • The filename where the exception occurred

  • The line number in the file where the exception was thrown (which may not be exactly where the error actually occurred in the code)

  • The function name where the exception was thrown

Specific exceptions may also return additional information in a message format. This message (msg) may contain variable names or the values of those variables, the name of a file that wasn’t found, and other informational text regarding the nature of the problem. For example, a file not found exception (FileNotFoundException) might look similar to the following:

00:00:00 [0] [E] [Eradication] FileNotFoundException caught: msg = Could not find
file ./Namawala_single_node_demographics.compiled.json, filename = NodeDemographics.cpp,
lineNumber = 227
BadEnumInSwitchStatementException

This exception is thrown when an enumeration value is not handled in the switch statement. In other words, this exception signals that there is a problem with an enumeration value, typically stemming from one of the configuration files, though this is not always the case.

It is possible the enumeration value is not a valid value (out of range of the numeric range of the enumeration), or perhaps the string value is currently not implemented in the code (and should not be used in configuration settings yet).

BadMapKeyException

This exception is thrown when there is a standard template library (STL) mapping error. Usually, this occurs where spatial output channel names are specified in the configuration file if an unrecognized channel name is used.

If you have not modified the EMOD source code or used an unrecognized channel name, this error could signal an internal problem with the code. Contact support@idmod.org.

CalculatedValueOutOfRangeException

EMOD performs a large number of mathematical operations on parameter values. Therefore, it is possible that, despite original parameter values being with range, the values resulting from these multiple calculations may end up outside its valid range. For example, a probability value (range: 0 to 1.0) that after multiple calculations during a simulation now exceeds 1.0.

This exception is thrown when such a situation is detected. This exception only applies to numeric or Boolean values, not enumeration values.

ConfigurationRangeException

This exception is thrown if a parameter value read from a configuration file is detected to be outside its valid range. This exception is similar to the more general case OutOfRangeException. However, this exception is only thrown if the out of range exception comes from a numeric or Boolean value, not enumeration value, read from a configuration file.

DllLoadingException

The EMOD architecture is modularized and can be built as a core Eradication.exe along with a series of custom reporter EMODules, as opposed to a single monolithic Eradication.exe. This exception indicates that EMOD couldn’t load on of the EMODule DLLs.

This situation could occur for several reasons:

  • EMOD couldn’t find the EMODule

  • Unresolved symbols were found (Windows)

  • EMOD could not find the necessary symbol during the GetProcAddress call

  • The custom reporter EMODules were built using a version of Visual Studio that is no longer supported. Rebuild the EMODules using Visual Studio 2015 (Professional, Premium, or Ultimate).

FactoryCreateFromJsonException

EMOD implements class factories that instantiate objects at run time and use information from JSON- based configuration information in the creation of these objects. The exception indicates something is incorrect with the JSON information.

In particular, in some cases, the JSON information is nested into a hierarchy of information. Therefore, as the factories are called to create the objects described by the outer layers of one of these nested hierarchies, the factories do not have any knowledge yet of the inner layers of the hierarchies. This inner information contains information the factory needs to complete the object instantiation, but this information might not be correct. If that happens, then the factory will throw this exception.

Campaign files often have this kind of nested hierarchical structure, so it’s important to t verify that the hierarchy is set up correctly. For example, if the class name were mistyped and EMOD had no implementation of that class, this exception will be thrown.

FileIOException

This exception is generated if there is an unrecoverable problem loading data from a file. The data might be corrupted or there may be a mismatch. For example, if the file format or configuration information indicates that there should be ten values of some array and there are only nine included in the file, then this exception would be thrown.

This exception is not the same as the exception thrown for a file that is not found. In this case, the file is found and loaded, but there is a problem with the data in the file.

FileNotFoundException

This exception is thrown if a file cannot be found. Possible causes might include a incorrectly typed filename in the configuration file, a wrong path to the file, or even the path not being set in the system environment leading to the system not finding a relative path to the file. One of the most likely causes is that quotes are missing around the file name.

GeneralConfigurationException

This exception is only thrown if a more specific exception cannot be used for the configuration problem detected. This exception is likely thrown when there is very little information available about the root problem.

For example, this exception might be thrown if a parameter name is invalid, such as using an older, deprecated version of a parameter name.

IllegalOperationException

This exception is thrown if an illegal operation was detected. In most cases, a more specific exception will be thrown rather than this more general one. This exception is likely thrown when there is very little information available about the root problem. For example, when a utility function error is detected, there is very sparse information available as to what may have led to the error. As a result, calling a more specific exception with more context is not an option.

IncoherentConfigurationException

This exception is thrown if mutually contradictory or incompatible configuration settings have been detected. For example, if mutually exclusive parameters are set, the minimum parameter value is greater than the maximum value, or two distribution axes are specified in a demographics file but there is a mismatch with the number of axes scale factors included. The exception can also occur if there isn’t a corresponding mapping between an reference ID in the metadata of a demographics file and its corresponding data file.

InitializationException

This exception is thrown if a problem with initialization was detected. In most cases, a more specific exception will be thrown rather than this more general one. This exception is likely thrown when there is very little information available about the root problem.

For example, if the very first part of a JSON file has corrupted or badly formatted data, this exception may be thrown instead of the more expected file input/output exception, FileIOException.

InvalidInputDataException

This exception is thrown when a problem with an input data file is detected. For example, if the wrong data type was detected, such as a float being detected when a string is expected you would see this exception thrown, or even, if a parameter has an invalid value even if the value is of the correct type. As the input data file most likely to have significant modifications, verify that the demographics file is set up correctly.

MissingParameterFromConfigurationException

This exception occurs when required parameters are missing. Verify that you are not using deprecated parameters and that all required parameters are specified (or set Use_Defaults to 1).

MPIException

This exception is thrown if there is an MPI error. As such, these types of issues are related to interfacing with MPI (and/or networking issues) and do not necessary imply something wrong with the EMOD code or JSON files.

NotYetImplementedException

This exception is thrown if an attempt is made to execute code that is not yet implemented. For example, there are areas of EMOD where placeholder enumeration values are defined but not yet implemented. If you specify a value like this, it is considered within a valid range, but this exception will be thrown in response. Verify that any enumeration values use one of the available values as described in the documentation and do not contain any typos.

NullPointerException

This exception is thrown when a NULL pointer is detected in the code, or rather when a NULL pointer - that should NOT be NULL - is used. When thrown at the application level, a NULL pointer exception is usually caused by some sort of initialization error, for example, a file not being found.

As a result, in most cases, a more specific exception will be thrown before the code execution reaches a point where this exception would occur. Therefore, this exception is uncommon and likely thrown only when there is very little information available about the root problem.

OutOfRangeException

This exception is thrown when a numeric or Boolean value is out of range. For example, if you index an array outside of its valid range, this exception will be thrown. There are other situations where more specific exceptions are thrown instead of this more general one. For example, when the numeric or Boolean values are from a configuration file, but are detected to be out of range, the ConfigurationRangeException is thrown. Likewise, if the value goes out of range as the result of a calculation, the CalculatedValueOutOfRangeException is thrown instead.

QueryInterfaceException

The EMOD architecture is modularized and many components now implement QueryInterface. This exception is thrown when a required interface is queried on an object and the object that returns that the interface is not supported.

If you have not modified the EMOD source code and receive this error, it could signal an internal problem with the code. Contact support@idmod.org.

SerializationException

This exception is thrown when there is a serialization (or de-serialization) issue. For example, if data is being passed over the network (MPI) and the connection drops, then the serialization fails and this exception is thrown.

CentOS on Azure environment

The following problems are specific to running simulations using the Eradication binary on CentOS 7.1 on Azure.

Regression test graphs differ when run on CentOS on Azure

After you run regression simulations on CentOS on Azure using runemod.sh in the Scripts directory, it plots graphs from the simulation output data with a red line for the reference output and a blue line for the new output. The reference output was created by running the simulation on Windows, which in some cases may be slightly different than the output from CentOS on Azure.

For simulations that plot a baseline, you can override the Windows reference output by modifying runemod.sh to use output/InsetChart.linux.json as the output location. In that case, the red reference plots should always be completely covered by the blue plots.

Eradication binary cannot locate the input data files

If you chose not to have the PrepareLinuxEnvironment.sh script download the EMOD source code and input data files, you need to set up the environment variable, path and symlink that are needed to run simulations on CentOS on Azure. See Install EMOD on CentOS on Azure.

Glossary

The Epidemiological MODeling software (EMOD) glossary is divided into the following subsections that define terms related to software usage, general epidemiology, and the particular disease being modeled.

Software terms

The following terms are used to describe both general computing processes and concepts and the files, features, and functionality related to running simulations with Epidemiological MODeling software (EMOD).

agent-based model

A type of simulation that models the actions and interactions of autonomous agents (both individual and collective entities such as organizations or groups).

Boost

Free, peer-reviewed, portable C++ source libraries aimed at a wide range of uses including parallel processing applications (Boost.MPI). For more information, please see the Boost website, http://www.boost.org.

boxcar function

A mathematical function that is equal to zero over the entire real line except for a single interval where it is equal to a constant.

campaign

A collection of events that use interventions to modify a simulation.

campaign event

A JSON object that determines when and where an intervention is distributed during a campaign.

campaign file

A JavaScript Object Notation (JSON) formatted file that contains the parameters that specify the distribution instructions for all interventions used in a campaign, such as diagnostic tests, the target demographic, and the timing and cost of interventions. The location of this file is specified in the configuration file with the Campaign_Filename parameter. Typically, the file name is campaign.json.

channel

A property of the simulation (for example, “Parasite Prevalence”) that is accumulated once per simulated time step and written to file, typically as an array of the accumulated values.

class factory

A function that instantiate objects at run-time and use information from JSON-based configuration information in the creation of these objects.

configuration file

A JavaScript Object Notation (JSON) formatted file that contains the parameters sufficient for initiating a simulation. It controls many different aspects of the simulation, such as population size, disease dynamics, and length of the simulation. Typically, the file name is config.json.

core

In computing, a core refers to an independent central processing unit (CPU) in the computer. Multi-core computers have more than one CPU. However, through technologies such as Hyper- Threading Technology (HTT or HT), a single physical core can actually act like two virtual or logical cores, and appear to the operating system as two processors.

demographics file

A JavaScript Object Notation (JSON) formatted file that contains the parameters that specify the demographics of a population, such as age distribution, risk, birthrate, and more. IDM provides demographics files for many geographic regions. This file is considered part of the input data files and is typically named <region>_demographics.json.

disease-specific build

A build of the EMOD executable (Eradication.exe) built using SCons without any dynamic link libraries (DLLs).

Microsoft’s implementation of a shared library, separate from the EMOD executable (Eradication.exe), that can be dynamically loaded (and unloaded when unneeded) at runtime. This loading can be explicit or implicit.

EMODule

A modular component of EMOD that are consumed and used by the EMOD executable (Eradication.exe). Under Windows, a EMODule is implemented as a dynamic link library (DLL) and, under CentOS on Azure, EMODules are currently not supported. EMODules are primarily custom reporters.

Epidemiological MODeling software (EMOD)

The modeling software from the Institute for Disease Modeling (IDM) for disease researchers and developers to investigate disease dynamics, and to assist in combating a host of infectious diseases. You may see this referred to as Disease Transmission Kernel (DTK) in the source code.

Eradication.exe

Typical (default) name for the EMOD executable (Eradication.exe), whether built using monolithic build or modular (EMODule-enabled) build.

event coordinator

A JSON object that determines who will receive a particular intervention during a campaign.

flattened file

A single campaign or configuration file created by combining a default file with one or more overlay files. Multiple files must be flattened prior to running a simulation. Configuration files are flattened to a single-depth JSON file without nesting, the format required for consumption by the EMOD executable (Eradication.exe). Separating the parameters into multiple files is primarily used for testing and experimentation.

Heterogeneous Intra-Node Transmission (HINT)

A feature for modeling person-to-person transmission of diseases in heterogeneous population segments within a node for generic simulations.

high-performance computing (HPC)

The use of parallel processing for running advanced applications efficiently, reliably, and quickly.

input data files

Fixed information used as input to a simulation. Examples of such data are population, altitude, demographics, and transportation migrations. The configurable config.json and campaign.json files do not fall into this category of static fixed input.

intervention

An object aimed at reducing the spread of a disease that is distributed either to an individual; such as a vaccine, drug, or bednet; or to a node; such as a larvicide. Additionally, initial disease outbreaks and intermediate interventions that schedule another intervention are implemented as interventions in the campaign file.

JavaScript Object Notation (JSON)

A human-readable, open standard, text-based file format for data interchange. It is typically used to represent simple data structures and associative arrays, and is language- independent.

Keyhole Markup Language (KML)

A file format used to display geographic data in an Earth browser, for example, Google Maps. The format uses an XML-based structure (tag-based structure with nested elements and attributes). Tags are case-sensitive.

A method for the linker to optimize code (for size and/or speed) after compilation has occurred. The compiled code is turned not into actual code, but instead into an intermediate language form (IL, but not to be confused with .NET IL which has a different purpose). The LTCG then, unlike the compiler, can see the whole body of code in all object files and be able to optimize the result more effectively.

Message Passing Interface (MPI)

An interface used to pass information between computing cores in parallel simulations. One example is the migration of individuals from one geographic location to another within EMOD simulations.

microsolver

A microsolver is a type of “miniature model” that operates within the framework of EMOD to compute a particular set of parameters. Each microsolver, in effect, is creating a microsimulation in order to accurately capture the dynamics of that particular aspect of the model.

Monte Carlo

Monte Carlo methods, or Monte Carlo experiments, are a class of computational algorithms utilizing repeated random sampling to obtain numerical results. Monte Carlo simulations create probability distributions for possible outcome values, which provides a more realistic way of describing uncertainty in variables.

monolithic build

A single EMOD executable (Eradication.exe) with no DLLs that includes all components as part of Eradication.exe itself. You can still use EMODules with the monolithic build; for example, a custom reporter is a common type of EMODule. View the documentation on EMODules and emodules_map.json for more information about creation and use of EMODules.

node

A grid size that is used for modeling geographies. Within EMOD, a node is a geographic region containing simulated individuals. Individuals migrate between nodes either temporarily or permanently using mobility patterns driven by local, regional, and long- distance transportation.

node-targeted intervention

An intervention that is distributed to a geographical node rather than to a single individual. One example is larvicides, which affect all mosquitoes living and feeding within a given node.

output report

A file that is the output from an EMOD simulation. Output reports are in JSON, CSV, or binary file format. You must pass the data from an output report to graphing software if you want to visualize the output of a simulation.

overlay file

An additional configuration, campaign, or demographic file that overrides the default parameter values in the primary file. Separating the parameters into multiple files is primarily used for testing a nd experimentation. In the case of configuration and campaign files, the files can use an arbitrary hierarchical structure to organize parameters into logical groups. Configuration and campaign files must be flattened into a single file before running a simulation.

preview

Software that undergoes a shorter testing cycle in order to make it available more quickly. Previews may contain software defects that could result in unexpected behavior. Use EMOD previews at your own discretion.

regression test

A test to verify that existing EMOD functionality works with new updates, typically used to refer to one of a set of scenarios included in the EMOD bundle and located in the Regression subdirectory of the bundle. Directory names of each subdirectory in Regression describe the main regression attributes, for example, “1_Generic_Seattle_MultiNode”. Also can refer to the process of regression testing of software.

release

Software that includes new functionality, scientific tutorials leveraging new or existing functionality, and/or bug fixes that have been thoroughly tested so that any defects have been fixed before release. EMOD releases undergo full regression testing.

reporter

Functionality that extracts simulation data, aggregates it, and saves it as an output report. EMOD provides several built-in reporters for outputting data from simulations and you also have the ability to create a custom reporter.

scenario

A collection of input, configuration, and campaign files that describes a real-world example of a disease outbreak and interventions. Many scenarios are included with EMOD source installations or are available in the Regression directory of the EMOD GitHub repository. The tutorials describe how to run simulations using these scenarios to learn more about epidemiology and disease modeling.

schema

A text or JSON file that can be generated from the EMOD executable (Eradication.exe) that defines all configuration and campaign parameters.

simulation

An EMOD software execution performed by the kernel. Each simulation has an associated set of files that control the inputs, configuration, and campaign.

simulation type

The disease or disease class to model.

EMOD supports the following simulation types for modeling a variety of diseases:

  • Generic disease (GENERIC_SIM)

  • Vector-borne diseases (VECTOR_SIM)

  • Malaria (MALARIA_SIM)

  • Tuberculosis (TB_SIM)

  • Sexually transmitted infections (STI_SIM)

  • HIV (HIV_SIM)

solvers

Solvers are used to find computational solutions to problems. In simulations, they can be used, for example, to determine the time of the next simulation step, or to compute the states of a model at particular time steps.

Standard Template Library (STL)

A library that contains a set of common C++ classes (including generic algorithms and data structures) that are independent of container and implemented as templates, which enables compile-time polymorphism (often more efficient than run-time polymorphism). For more information and discussion of STL, see Wikipedia.

state transition event

A change in state (e.g. healthy to infected, undiagnosed to positive diagnosis, or birth) that may trigger a subsequent action, often an intervention. “Campaign events” should not be confused with state transition events.

time step

A discrete number of hours or days in which the “simulation states” of all “simulation objects” (interventions, infections, immune systems, or individuals) are updated in a simulation. Each time step will complete processing before launching the next one. For example, a time step would process the migration data for populations moving between nodes via rail, airline, and road. The migration of individuals between nodes is the last step of the time step after updating states.

tutorial

A set of instructions in the documentation to learn more about epidemiology and disease modeling. Tutorials are based on real-world scenarios and demonstrate the mechanics of the the model. Each tutorial consists of one or more scenarios.

working directory

The directory that contains the configuration and campaign files for a simulation. You must be in this directory when you invoke Eradication.exe at the command line to run a simulation.

Epidemiology terms

The following terms are used to describe general concepts and processes in the field of epidemiology and disease modeling.

antigen

A substance that is capable of inducing a specific immune response and that evokes the production of one or more antibodies.

Clausius-Clayperon relation

A way of characterizing a transition between two phases of matter; provides a method to find a relationship between temperature and pressure along phase boundaries. Frequently used in meteorology and climatology to describe the behavior of water vapor. See Wikipedia - Clausius-Clayperon relation for more information.

deterministic

Characterized by the output being fully determined by the parameter values and the initial conditions. Given the same inputs, a deterministic model will always produce the same output.

diffusive migration

The diffusion of people in and out of nearby nodes by foot travel.

epitope

The portion of an antigen that the immune system recognizes. An epitope is also called an antigenic determinant.

Euler method

Used in mathematics and computational science, this method is a first-order numerical procedure for solving ordinary differential equations with a given initial value.

exp(

The exponential function, \(e^x\), where \(e\) is the number (approximately 2.718281828) such that the function \(e^x\) is its own derivative. The exponential function is used to model a relationship in which a constant change in the independent variable gives the same proportional change (i.e. percentage increase or decrease) in the dependent variable. The function is often written as \(exp(x)\). The graph of \(y = exp(x)\) is upward-sloping and increases faster as \(x\) increases.

herd immunity

The resistance to the spread of a contagious disease within a population that results if a sufficiently high proportion of individuals are immune to the disease, especially through vaccination.

incidence

The rate of new cases of a disease during a specified time period. This is a measure of the risk of contracting a disease.

Koppen-Geiger Climate Classification System

A system based on the concept that native vegetation is a good expression of climate. Thus, climate zone boundaries have been selected with vegetation distribution in mind. It combines average annual and monthly temperatures and precipitation, and the seasonality of precipitation. EMOD has several options for configuring the climate, namely air temperature, rainfall, and humidity. One option utilizes Input Files that associate geographic nodes with Koppen climate indices. The modified Koppen classification uses three letters to divide the world into five major climate regions (A, B, C, D, and E) based on average annual precipitation, average monthly precipitation, and average monthly temperature. Each category is further divided into sub-categories based on temperature and precipitation. While the Koppen system does not take such things as temperature extremes, average cloud cover, number of days with sunshine, or wind into account, it is a good representation of our earth’s climate.

loss to follow-up (LTFU)

Patients who at one point were actively participating in disease treatment or clinical research, but have become lost either by error or by becoming unreachable at the point of follow-up.

ordinary differential equation (ODE)

A differential equation containing one or more functions of one independent variable and its derivatives.

prevalence

The rate of all cases of a disease during a specified time period. This is a measure of how widespread a disease is.

reproductive number

In a fully susceptible population, the basic reproductive number R:sub:0is the number of new cases generated by one infectious case over the course of the infectious period. The effective reproductive number takes into account non-susceptible individuals.

routine immunization (RI)

The standard practice of vaccinating the majority of susceptible people in a population against vaccine-preventable diseases.

stochastic

Characterized by having a random probability distribution that may be analyzed statistically but not predicted precisely.

subpatent

When an individual is infected but asymptomatic, so the infection is not readily detectable.

SEIR model

A generic epidemiological model that provides a simplified means of describing the transmission of an infectious disease through individuals where those individuals can pass through the following five states: susceptible, exposed, infectious, and recovered.

SEIRS model

A generic epidemiological model that provides a simplified means of describing the transmission of an infectious disease through individuals where those individuals can pass through the following five states: susceptible, exposed, infectious, recovered, and susceptible.

SI model

A generic epidemiological model that provides a simplified means of describing the transmission of an infectious disease through individuals where those individuals can pass through the following five states: susceptible and infectious.

SIR model

A generic epidemiological model that provides a simplified means of describing the transmission of an infectious disease through individuals where those individuals can pass through the following five states: susceptible, infectious, and recovered.

SIRS model

A generic epidemiological model that provides a simplified means of describing the transmission of an infectious disease through individuals where those individuals can pass through the following five states: susceptible, infectious, recovered, and susceptible.

SIS model

A generic epidemiological model that provides a simplified means of describing the transmission of an infectious disease through individuals where those individuals can pass through the following five states: susceptible, infectious, and susceptible.

supplemental immunization activity (SIA)

In contrast to routine immunization (RI), SIAs are large-scale operations with a goal of delivering vaccines to every household.

WAIFW matrix

A matrix of values that describes the rate of transmission between different population groups. WAIFW is an abbrevation for Who Acquires Infection From Whom.

Weibull distribution

A probability distribution often used in EMOD and that requires both a shape parameter and a scale parameter. The shape parameter governs the shape of the density function. When the shape parameter is equal to 1, it is an exponential distribution. For shape parameters above 1, it forms a unimodal (hump-shaped) density function. As the shape parameter becomes large, the function forms a sharp peak. The inverse of the shape parameter is sometimes referred to here as the “heterogeneity” of the distribution (heterogeneity = 1/shape), because it can be helpful to think about the degree of heterogeneity of draws from the distribution, especially for hump-shaped functions with heterogeneity values between 0 and 1 (i.e., shape parameters greater than 1). The scale parameter shifts the distribution from left to right. When heterogeneity is small (i.e., the shape parameter is large), the scale parameter sets the location of the sharp peak.

EMOD source code installation

This section describes how to install the software needed to build the EMOD executable (Eradication.exe) or Eradication binary from the EMOD source code. This is necessary if you want to modify the source code to extend the capabilities of the model beyond what’s available with the latest EMOD release. For example, you may want to model a disease that isn’t currently supported in EMOD. You can build Eradication.exe from source code on computers running Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit) or build the Eradication binary on computers running CentOS 7.1 on Azure.

After building, you should run a single simulation to verify basic functionality. We recommend the 27_Vector_Sandbox scenario in the Regression directory, which is a simple five-year vector simulation with an indoor residual spraying (IRS) campaign in the third year, executed on a single-node geography that is based on Namawala, Tanzania. This simulation generally takes a few minutes to execute.

However, you can run a simulation using any of the subdirectories under Regression, which when used with the input data files provided by IDM, contain complete sets of files for EMOD simulations. See Run simulations and Use input data files for more information.

After that, we recommend running full regression tests to further verify that EMOD is behaving as expected and that none of the source code changes inadvertently changed the EMOD functionality. See Regression testing for more information.

The EMOD executable (Eradication.exe) is tested using Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit). Windows HPC Server is used for testing remote simulations on a high-performance computing (HPC) cluster and the other Windows operating systems are used to test local simulations.

The Eradication binary is tested and supported on a CentOS 7.1 on Azure virtual machine. It has also been successfully built and run on Ubuntu, SUSE, and Arch, but has not been tested and is not supported on those Linux distributions.

Prerequisites for working with EMOD source code

This section describes the software packages or utilities must be installed to build the EMOD executable (Eradication.exe) or Eradication binary from source code and run regression tests.

If additional software is needed for the prerequisite software due to your specific environment, the installer for the prerequisite software should provide instructions. For example, if Microsoft MPI v8 requires additional Visual C++ redistributable packages, the installer will display that information.

Note

IDM does not provide support or guarantees for any third-party software, even software that we recommend you install. Send feedback if you encounter any issues, but any support must come from the makers of those software packages and their user communities.

Install prerequisites for building Eradication.exe

The following software packages are required to build the Eradication.exe from EMOD source code on Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit).

Note

You must also have already installed the required software to run EMOD simulations. If you have not, see EMOD installation.

Visual Studio
  1. Purchase a license from Microsoft or use an MSDN subscription to install Visual Studio 2015 (Professional, Premium, or Ultimate). Other versions of Visual Studio are not supported.

    While you can use a free copy of Visual Studio Community, IDM does not test on or support this version.

  2. Select the Visual C++ tools for Windows desktop during installation.

Python

Python is required for building the disease-specific Eradication.exe and running Python scripts.

Note

EMOD does not support the current version of Python.

  1. Install Python 2.7.11 or 2.7.12. See https://www.python.org/downloads/ for instructions.

    • In the Customize Python dialog box, verify that Add python.exe to PATH is selected to add Python to the PATH environment variable on your computer.

  2. From Control Panel, select Advanced system settings, and then click Environment Variables.

  3. Add a new variable called IDM_PYTHON_PATH and set it to the directory where you installed Python, and then click OK.

  4. Open a Command Prompt window and type the following to verify installation:

    python --version
    

The Python package manager, pip, is installed as part of Python 2.7.11 or 2.7.12 and is used to install other software packages.

HPC SDK
Boost
  1. Go to https://sourceforge.net/projects/boost/files/boost/1.61.0/ and select one of the compressed files.

  2. Unpack the libraries to the location of your choice.

  3. From Control Panel, select Advanced system settings, and then click Environment Variables.

  4. Add a new variable called IDM_BOOST_PATH and set it to the directory where you installed Boost, and then click OK.

SCons

SCons is required for the building disease-specific Eradication.exe and is optional for the monolithic Eradication.exe that includes all simulation types.

  1. Go to http://www.lfd.uci.edu/~gohlke/pythonlibs#scons and select the WHL file for SCons 2.5.0 that is compatible with Python 2.7.11 or 2.7.12.

  2. Save the file to your Python installation directory.

  3. Open a Command Prompt window and navigate to the Python installation directory, then enter the following, substituting the name of the specific matplotlib WHL file you downloaded:

    pip install scons-2.x.x-py2-none-any.whl
    
Install prerequisites for building the Eradication binary

For CentOS 7.1 on Azure, all prerequisites for building the Eradication binary are installed by the setup script described in Install EMOD on CentOS on Azure. If you originally installed EMOD without including the source code and input data files that are optional for running simulations using a pre-built Eradication binary, rerun the script and install those.

Install prerequisites for running regression tests

The following plotting software is required for running regression tests, where graphs of model output are created both before and after source code changes are made to see if those changes created a discrepancy in the regression test output. For more information, see Regression testing. For CentOS 7.1 on Azure, all Python packages are installed by the setup script, but you may want to install R or MATLAB.

We recommended that you download some of the Python packages from http://www.lfd.uci.edu/~gohlke/pythonlibs, a page compiled by Christoph Gohlke, University of California, Irvine. The libraries there are compiled Windows binaries, including the 64-bit versions required by EMOD.

Python utilities

The Python utilities dateutil, six, and pyparsing provide text parsing and datetime functionality.

  1. Open a Command Prompt window.

  2. Enter the following commands:

    pip install python-dateutil
    pip install pyparsing
    
NumPy

The NumPy package adds support for large, multi-dimensional arrays and matrices to Python.

  1. Go to http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy and select the WHL file for NumPy 1.11.3 (64-bit) that is compatible with Python 2.7.11 or 2.7.12.

  2. Save the file to your Python installation directory.

  3. Open a Command Prompt window and navigate to the Python installation directory, then enter the following, substituting the name of the specific NumPy WHL file you downloaded:

    pip install numpy-1.x.x+mkl-cp27m-win_amd64.whl
    
Matplotlib

Matplotlib is a Python library for making publication quality plots using syntax familiar to MATLAB users. Matplotlib also uses NumpPy for numeric manipulation. Output formats include PDF, Postscript, SVG, and PNG, as well as a screen display.

  1. Go to http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib and select the WHL file for Matplotlib 1.5.3 (64-bit) that is compatible with Python 2.7.11 or 2.7.12.

  2. Save the file to your Python installation directory.

  3. Open a Command Prompt window and navigate to the Python installation directory, then enter the following, substituting the name of the specific matplotlib WHL file you downloaded:

    pip install matplotlib-1.x.x+mkl-cp27m-win_amd64.whl
    
R

The IDM test team uses R 3.2.0 (64-bit) for regression testing, but it is considered optional.

R is a free software environment for statistical computing and graphics.

MATLAB

The IDM test team uses MATLAB R2015a and the MATLAB Statistics and Machine Learning Toolbox™ R2015a for regression testing, but they are both considered optional.

MATLAB is a high-level language and interactive environment for numerical computation, visualization, and programming. The MATLAB Statistics and Machine Learning Toolbox™ provides functions and applications to describe, analyze and model data using statistics and machine learning algorithms.

  1. Go to http://www.mathworks.com/products/matlab/ and install MATLAB R2015a.

  2. If desired, go to https://www.mathworks.com/products/statistics.html and install the MATLAB Statistics and Machine Learning Toolbox™ R2015a.

Download the EMOD source code

The EMOD source code is available on GitHub. The EMOD source includes the source code, Visual Studio solution, sample configuration files, as well as regression test and other files needed to fully build and test the EMOD executable (Eradication.exe).

You can have multiple versions of the EMOD source code in separate directories on your local computer. For example, you might want to download a new release of EMOD but also keep a previous release of the source. In the following examples, the source code is downloaded to the directory EMOD at C:/IDM, but you can save to any location you want.

You can use a Git client of your choice to download from GitHub, however, these instructions show how to use Git GUI and Git Bash.

Install Git GUI and Git Bash

To install Git GUI and Git Bash, download a 64-bit version of Git from https://git-scm.com/download. On the Select Components installer window, you can select one or both of Git GUI Here for a GUI or Git Bash Here for a command window.

Use Git GUI to download the EMOD source
  1. Launch the Git GUI application and click Clone Existing Repository.

  2. From the Clone Existing Repository window:

    1. In Source Location, enter https://github.com/InstituteforDiseaseModeling/EMOD

    2. In Target Directory, enter the location and target directory name: C:/IDM/EMOD

    3. Click Clone. Git GUI will create the directory and download the source code.

  3. Close the Git GUI window when the download completes.

Use Git Bash to download the EMOD source

Note

For a list of the Git Bash commands, you can type git help git from Git Bash, or git help <command> for information about a specific command.

  1. Launch the Git Bash application. From the command line:

    1. Go to the location where you want your copy of the EMOD source located:

      cd C:\IDM
      
    2. Clone the repository from GitHub:

      git clone https://github.com/InstituteforDiseaseModeling/EMOD
      

Git Bash will copy the EMOD source to a directory named EMOD by default as a different directory name was not specified after the URL.

Verify that all directories on https://github.com/InstituteforDiseaseModeling/EMOD are now reflected on your local clone of the repository. The table below describes each of the directories.

Directory

Description

Dependencies

The ComputeClusterPack.

Eradication

Eradication project. Main project for Visual Studio solution.

Regression

Scripts to perform regression tests for modified code. It also includes a copy of the Scenarios directory that contains simulation configuration, batch, input, and script files that are associated with tutorials.

Scripts

Scripts used in file creation.

UnitTest++

Software for early release of additional regression testing.

baseReportLib

Static library of classes used by EMOD built-in reports and custom reports.

cajun

Cajun C++ API for JavaScript Object Notation (JSON) project.

campaign

Campaign project.

componentTests

Tests that work in conjunction with the UnitTest++ directory.

interventions

Interventions project.

rapidjson

Rapid JSON project.

reporters

Collection of custom reporter projects.

snappy

Compression utilities used by the EMOD software.

utils

Miscellaneous utilities.

Additionally, the repository includes additional files, such as the Visual Studio solution file, SCons scripts, the README, and more.

Build EMOD from source code

You can build the Eradication.exe for Windows 10, Windows Server 12, and Windows HPC Server 12 (64-bit) using Microsoft Visual Studio or SCons. You can build the Eradication binary for CentOS 7.1 on Azure using SCons.

If you want full debugging support, you must build using Visual Studio. However, Visual Studio is only capable of a monolithic build that includes all supported simulation types.

EMOD supports the following simulation types for modeling a variety of diseases:

  • Generic disease (GENERIC_SIM)

  • Vector-borne diseases (VECTOR_SIM)

  • Malaria (MALARIA_SIM)

  • Tuberculosis (TB_SIM)

  • Sexually transmitted infections (STI_SIM)

  • HIV (HIV_SIM)

If you want to create a disease-specific build, you must build using SCons. However, SCons builds build only the release version without extensive debugging information.

Build a monolithic Eradication.exe with Visual Studio

You can use the Microsoft Visual Studio solution file in the EMOD source code repository to build the monolithic version of the EMOD executable (Eradication.exe), which can be either a release or debug build. Visual Studio 2015 (Professional, Premium, or Ultimate) is the currently supported version.

Warning

Visual Studio creates a debug build by default. However, you must use a release build to commission simulations to COMputational Platform Service (COMPS); attempting to use a debug build will result in an error.

  1. Open the EradicationKernel solution in Visual Studio.

  2. From the Solution Configurations ribbon, select Debug or Release.

  3. On the Build menu, select Build Solution.

Eradication.exe will be in a subdirectory of the Eradication directory.

Build Eradication.exe or Eradication binary with SCons

SCons is a software construction tool that is an alternative to the well-known “Make” build tool. It is implemented in Python and the SCons configuration files, SConstruct and SConscript, are executed as Python scripts. This allows for greater flexibility and extensibility, such as the creation of custom SCons abilities just for EMOD. For more information on Scons, see www.scons.org. SCons 2.5.0 is the currently supported version.

Warning

EMOD will not build if you use the --Debug flag. To build a debug version, you must use Visual Studio.

  1. Open a command window.

  2. Go to the directory where EMOD is installed:

    cd C:\IDM\EMOD
    
  3. Run the following command to build Eradication.exe:

    • For a monolithic build:

      scons --Release
      
    • For a disease-specific build, specify one of the supported disease types using the --Disease flag:

      scons --Release --Disease=Vector
      
  4. The executable will be placed, by default, in the subdirectory build\x64\Release\Eradication\ of your local EMOD source.

Additionally, you can parallelize the build process with the --jobs flag. This flag indicates the number of jobs that can be run at the same time (a single core can only run one job at a time). For example:

scons --Release --Disease=Vector --jobs=4

EMOD architecture

Epidemiological MODeling software (EMOD) is implemented in C++ and has two subsystems: the environment and the simulation controller. the environment contains the interfaces to the simulation controller subsystem and the external inputs and outputs. the simulation controller contains the epidemiological model (simulation and campaign management), and reporters that capture output data and create reports from a simulation. The following figure shows a high-level view of the system components of EMOD and how they are related to each other.

_images/ArchSystemComponents.png

EMOD system components

Warning

If you modify the source code to add or remove configuration or campaign parameters, you may need to update the code used to produce the schema. You must also verify that your simulations are still scientifically valid.

Environment subsystem

The environment subsystem provides access to global resources and most of the external input and output interfaces. Output reports are the only output not handled through the environment subsystem. It consists of a a singleton utility class, Environment. The environment subsystem consists of five logical components.

The following figure shows a high-level view of the system components of EMOD and how they are related to each other.

_images/ArchSystemComponents.png

EMOD system components

Input file readers

Provide small utility functions for reading in the input data, configuration, and campaign files. The actual parsing of the configuration and campaign files is done by the configuration manager component. The parsing of the input data files is done by the model classes that consume that data, which are part of the simulation controller subsystem.

Configuration manager

Parses the configuration files, stores the parsed values for system-global configuration values, and provides a central container resource for the configuration as JSON to those classes that need to parse out the remaining configuration values locally for themselves. It retains the contents of the configuration file and the directories provided on the command line.

Error handler

Provides an application-level exception library and a centralized mechanism for handling all errors that occur during program execution. These errors are ultimately reported through the logging component.

Logger

Writes the output logs and errors. Output reports, such as time-series channel data reports, spatial channel data reports, progress and status summary, and custom reports, are handled by the simulation controller. For information and setting the logging level, see Set log levels.

Message Passing Interface (MPI)

EMOD is designed to support large-scale multi-node simulations by running multiple instances of EMOD in parallel across multiple compute nodes on a cluster. During initialization, geographical nodes are assigned to compute nodes. Individuals who migrate between geographical nodes that are not on the same compute node are migrated via a process of serialization, network I/O, and deserialization. The network communication is handled through a mixture of direct calls to the MPI library and use of Boost’s MPI facilities. This component provides the system-wide single interface to MPI, caching the number of tasks and rank of current process from the MPI environment.

Simulation controller subsystem

The simulation controller is the top-level structure for the epidemiological model. The controller’s capabilities are simple, running a single simulation in a single time direction at a constant rate. It exists to support future capabilities, such as running multiple simulations, pausing a simulation, or bootstrapping a simulation from an archived simulation. It contains two components: simulation and reporters.

The following figure shows a high-level view of the system components of EMOD and how they are related to each other.

_images/ArchSystemComponents.png

EMOD system components

Simulation

The simulation component contains core functionality that models the behavior of a disease without any interventions and extended functionality to include migration, climate, or other input data to create a more realistic simulation. Disease transmission may be more or less complex depending on the disease being modeled.

Campaign management

The simulation component also includes a campaign manager sub-component for including disease interventions in a simulation.

Reporter

The reporter component creates output reports for both simulation-wide aggregate reporting and spatial reporting.

Simulation core components

The simulation component contains core functionality that models the behavior of a disease without any interventions and extended functionality to include migration, climate, or other input data to create a more realistic simulation. Disease transmission may be more or less complex depending on the disease being modeled.

Warning

If you modify the source code to add or remove configuration or campaign parameters, you may need to update the code used to produce the schema. You must also verify that your simulations are still scientifically valid.

Each generic EMOD simulation contains the following core base classes:

Simulation

Created by the simulation controller via a SimulationFactory with each run of EMOD.

Node

Corresponds to a geographic area. Each simulation maintains a collection of one or more nodes.

IndividualHuman

Represents a human being. Creates Susceptibility and Infection objects for the collection of individuals it maintains. The file name that defines this class is “Individual” and you may see it likewise shortened in diagrams.

Susceptibility

Manages an individual’s immunity.

Infection

Represents an individual’s infection with a disease.

For generic simulations, each node has a homogeneous contagion pool. Every individual in the node sheds disease into the pool and acquires disease from the pool. You can add heterogeneous disease transmission within a node by enabling and configuring the Heterogeneous Intra-Node Transmission (HINT) feature. For more information, see Configure heterogeneous disease transmission.

The relationship between these classes is captured in the following figure.

_images/ArchSimulation.png

Simulation components

After the simulation is initialized, all objects in the simulation are updated at each time step, typically a single day. Each object implements a method Update that advances the state of the objects it contains, as follows:

  • Controller updates Simulation

  • Simulation updates Nodes

  • Node updates IndividualHuman

  • IndividualHuman updates Susceptibility, Infections, and InterventionsContainer

  • InterventionsContainer updates Interventions

Simulation

As a stochastic model, EMOD uses a random number seed for all simulations. The Simulation object has a data member (RNG) that is an object maintaining the state of the random number generator for the parent Simulation object. The only generator currently supported is pseudo-DES. The random seed is initialized from the configuration parameter Run_Number and from the process MPI rank. All child objects needing access to the RNG must be provided an appropriate (context) pointer by their owners.

The Simulation class contains the following methods:

Method

Description

Populate()

Initializes the simulation. The Populate method initializes the simulation using both the configuration file and the demographic files. Populate calls through to populateFromDemographics to enable the Simulation object to create one or many Node objects populated with IndividualHumans as dictated by the demographics file, in conjunction with the sampling mode and value dictated by the configuration file. If the configuration file indicates that a migration and a climate model are to be used, those input file are also read. Populate also initializes all Reporters.

Update()

Advances the state of nodes.

_images/ArchSimulationTree.png

Simulation object hierarchy

For multi-core parallelization, the demographics file is read in order on each process and identity of each node and is compared with a policy assigning nodes to processes embodied in objects implementing InitialLoadBalancingScheme. If the initial load balancing scheme allows a node for the current rank, the node is created via addNewNodeFromDemographics. After all nodes have been created and propagated, the NodeRankMaps are merged across all processes. See Load-balancing file structure for more information.

Node

Nodes are model abstractions that represent a population of individuals that interact in a way that does not depend on their geographic location. However, they represent a geographic location with latitude and longitude coordinates, climate information, migration links to other nodes, and miscellaneous demographic information. The Node is always the container for IndividualHumans and the contagion pool. The Node provides important capabilities for how IndividualHumans are created and managed. It can also contain a Climate object and Migration links if those features are enabled. The climate and migration settings are initialized based on the information in the input data files.

The Node class contains the following methods:

Method

Description

PopulateFromDemographics()

The entry point that invokes populateNewIndividualsFromDemographics(InitPop), which adds individuals to a simulation and initializes them. PopulateNewIndividualsFromBirth() operates similarly, but can use different distributions for demographics and initial infections.

Update()

Advances the state of individuals.

updateInfectivity()

The workhorse of the simulation, it processes the list of all individuals attached to the Node object and updates the force of infection data members in the contagion pool object. It calls a base class function updatePopulationStatistics, which processes all individuals, sets the counters for prevalence reporting, and calls IndividualHuman::GetInfectiousness for all IndividualHuman objects.

The code in GetInfectiousness governs the interaction of the IndividualHuman with the contagion pool object. The rest of the code in updateInfectivity processes the contagion beyond individual contributions. This can include decay of persisting contagion, vector population dynamics, seasonality, etc. This is also where the population-summed infectivity must be scaled by the population in the case of density-independent transmission.

updateVitalDynamics()

Manages community level vital dynamics, primarily births, since deaths occur at the individual level.

By default, an IndividualHuman object is created, tracked, and updated for every person within a node. To reduce memory usage and processing time, you may want to sample such that each IndividualHuman object represents multiple people. There are several different sampling strategies implemented, with different strategies better suited for different simulations. See Sampling for more information.

If migration is enabled, at the end of the Node update, the Node moves all migrating individuals to a separate migration queue for processing. Once the full simulation time step is completed, all migrating individuals are moved from the migration queue and added to their destination nodes.

IndividualHuman

The IndividualHuman class corresponds to human beings within the simulation. Individuals are always contained by a Node object. Each IndividualHuman object may represent one or more human beings, depending on the sampling strategy and value chosen.

The IndividualHuman class contains components for susceptibility, infection, and interventions. Infection and Susceptibility cooperate to represent the detailed dynamics of infection and immune mechanisms. Every IndividualHuman contains a Susceptibility object that represents the state of the immune system over time. Only an infected IndividualHuman contains an Infection object, and may contain multiple Infection objects.. Susceptibility is passed to initialize the infection immunology in Infection::InitInfectionImmunology(). The state of an individual’s susceptibility and infection are updated with Update() methods. Disease-specific models have additional derived classes with properties and methods to represent specifics of the disease biology.

The InterventionsContainer is the mediating structure for how interventions interrupt disease transmission or progression. Campaign distribution results in an Intervention object being added to an individual’s InterventionsContainer, where it remains unless and until it is removed. When an IndividualHuman calls Update(), the InterventionsContainer is updated and its effects are applied to the IndividualHuman. These effects are used in the individual, infection, and susceptibility update operations. If migration is enabled, at the end of each individual’s update step EMOD checks if the individual is scheduled for migration (IndividualHuman::CheckForMigration()), setting a flag accordingly.

The IndividualHuman class contains the following methods:

Method

Description

Update()

Advances the state of both the infection and the immune system and then registers any necessary changes in an individual’s state resulting from those dynamics (that is, death, paralysis, or clearance). It also updates intrinsic vital dynamics, intervention effects, migration, and exposure to infectivity of the appropriate social network.

ExposeToInfectivity()

Passes the IndividualHuman to the ExposeIndividual() function if it is exposed to infectivity at a time step.

UpdateInfectiousness()

Advances the quantity of contagion deposited to the contagion pool by an IndividualHuman at each time step of their infectious period. This is explained in more detail below.

Disease transmission

Transmission of disease is mediated through a pool mechanism which tracks abstract quantities of contagion. The pool mediates individual acquisition and transmission of infections as well as external processes that modify the infectivity dynamics external to individuals. The pool provides basic mechanisms for depositing, decaying, and querying quantities of contagion which are associated with a specific StrainIdentity. The pool internally manages a separate ContagionPopulation for each possible antigen identity. ContagionPopulations have further structure and manage an array of contagion quantities for each substrain identity.

Each IndividualHuman has a sampling weight \(W_i\) and a total infectiousness \(X_i\), the rate at which contacts with the infectious individual become infected. This rate can be modified by transmission-reducing immunity or heterogeneous contact rates, which are gathered in \(Y_{i,transmit}\), and the transmission-reducing effects of interventions, such as transmission- blocking vaccines in the factor \(Z_{i,transmit}\). The sampling weight \(W_i\) is not included in the probability of acquiring a new infection. Sample particles are simulated as single individuals, their weighting \(W_i\) is used to determine their effects upon the rest of the simulation.The total infectiousness \(T\) of the local human population is then calculated as:

\[T = \sum_iW_iX_iY_{i,transmit}Z_{i,transmit}\]

For simulation of population density-independent transmission, individual infectiousness \(X_i\) includes the average contact rate of the infectious individual, so this total infectiousness is divided by the population \(P\) to get the force of infection \(FI=\frac{T}{P}\) for each individual in the population. The base rate of acquisition of new infections per person is then \(FI\), which can be modified for each individual \(I\) by their characteristics \(Y_{i,acquire}\) and interventions \(Z_{i,acquire}\). Over a time step \(\Delta t\), the probability of an individual acquiring a new infection is then:

\[P_{I,i} = 1- \text{exp}(-F_IY_{i,acquire}Z_{i,acquire}\Delta t)\]

A new infection receives an incubation period and infectious period from the input configuration (a constant at present, but possibly from specified distributions in the future) and a counter tracks the full latency, which is possible when simulating individual particles. After the incubation period, the counter for the infectious period begins, during which time the infection contributes to the individual’s infectiousness \(X_i\).

Campaign management

Campaigns are structured into campaign events that determine when, where, and to whom the intervention will be distributed and interventions that determine what is distributed, for example vaccines or other treatments. This section describes the software architecture used for managing campaigns.

Campaigns can be very simple, such as a single intervention with fixed parameters at a point in time, or a complex, adaptive, repetitive, and responsive combination of interventions. A Campaign is a collection of events that modify a simulation. An Event is a distribution within a campaign, and an Intervention is an item that is given out, such as a vaccine, a drug or a bednet.

_images/ArchCampaignManagement.png

Warning

If you modify the source code to add or remove configuration or campaign parameters, you may need to update the code used to produce the schema. You must also verify that your simulations are still scientifically valid.

Campaign events

A campaign event triggers the campaign management system to evaluate when, where, and to whom the intervention will be distributed. This section describes the SimulationEventContext, CampaignEvent, NodeSet, and EventCoordinator classes used to manage this process.

For more information on setting up campaign files, see Create a campaign file.

SimulationEventContext

The Simulation class has a nested helper class called SimulationEventContextHost, referred to as SimulationEventContext. It serves as the interface to, or manager of, CampaignEvents for the Simulation class.

Incoming: The Simulation to SimulationEventContext interface contains the following methods:

Method

Description

LoadCampaignFromFile()

Loads the campaign file during simulation initialization (t=0).

RegisterEventCoordinator()

Registers new event coordinators. Also used by CampaignEvent during activation to notify the SimulationEventContext of a new active EventCoordinator.

Update()

Advances the state at each time step.

VisitNodes()

Called from CampaignEvent during its activation. CampaignEvent is not a Node container, so it needs to communicate with the Simulation class to do anything with nodes.

Outgoing: The SimulationEventContext communicates with CampaignEvents and EventCoordinators, which are described below.

CampaignEvent

The CampaignEvent class exists primarily as an initialization-time, minimal intelligence container with a 1-to-1 mapping for CampaignEvents found in the JSON campaign file. They do not do much in the way of run-time campaign distribution or control.

Incoming: The public interface for CampaignEvent contains the following methods:

Method

Description

CreateInstance()

For each campaign event that the SimulationEventContext finds in the campaign file, it creates a corresponding CampaignEvent instance via CampaignEventFactory. The nested JSON elements in a campaign event are stored as an opaque (that is, unparsed) JSON object known as Event_Coordinator_Config. Immediate parameters like Start_Day are parsed out of the JSON and stored in explicit variables in the CampaignEvent class.

Dispatch()

In its steady-state, the SimulationEventContext checks the start day for all existing CampaignEvents and invokes this method to when the time step matches the start day.

Outgoing: The CampaignEvent communicates with two other classes: NodeSet and EventCoordinator.

NodeSet

The NodeSet class parses the Nodeset_Config and helps the EventCoordinator determine if a given node is included in a particular intervention distribution. It can be as simple as NodeSetAll, which includes all nodes, or something much more involved. Usual cases include NodeSetPolygon and NodeSetCommunityList.

Incoming: The public interface for NodeSet contains the following methods:

Method

Description

Contains()

The caller passes a Node via the INodeEventContext interface and gets back a Boolean. The NodeSet class completely encapsulates whatever logic is used to evaluate node membership.

EventCoordinator

EventCoordinator is a base type that contains most of the functionality in the event distribution mechanism. There are two actual EventCoordinator classes implemented, but you can new implementations easily by creating a new EventCoordinator class.

Incoming: There are four classes or class groups that make calls into EventCoordinator:

  • CampaignEvents, which create and activate them.

  • The SimulationEventContext that invokes their steady-state methods.

  • Nodes (via the NodeEventContext helper class)

  • Interventions, which get EventCoordinator-level configuration data needed for intervention execution.

The public interface for EventCoordinator contains the following methods:

Method

Description

AddNode()

Invoked by CampaignEvent::Dispatch() to allow the EventCoordinator to act as a node container and have access to all its constituent nodes via the INodeEventContext interface.

Note

The AddNode calls actually come via a delegate function that is in the EventCoordinator, but is invoked from the VisitNodes method up in the SimulationEventContext. The CampaignEvent passes the delegate function it wants used when it calls SimulationEventContext::VisitNodes() . This circuitous journey is needed because EMOD operates on a node-by-node basis and the SimulationEventContext, not the CampaignEvent, is the primary node container.

CreateInstance()

During their instantiation, CampaignEvents create EventCoordinators as the CampaignEvents parse the Event_Coordinator_Config, which specifies the class name and is passed by SimulationEventContext. Nothing then happens until CampaignEvent::Dispatch() is called.

IsFinished()

When an EventCoordinator determines that it is finished distributing its interventions, it sets an internal flag. The SimulationEventContext queries the IsFinished() function on each registered EventCoordinator and disposes of it if true. An EventCoordinator can activate and complete in a single time step, or it could last the entire length of the simulation.

Update()

The SimulationEventContext calls this on all registered EventCoordinators to advance their state at each time step. This method exists for global EventCoordinator communication and logic.

UpdateNodes()

Distributes the actual intervention. For the simplest possible use case, an EventCoordinator will distribute an intervention on its start day and then finish in that same time step. However, an EventCoordinator may implement repeating interventions, phased distributions, or sustained distributions that are contingent on node or individual attributes.

Outgoing: The outgoing function calls consist of the distribution of the intervention either to individuals or nodes. For the interface between the EventCoordinator and the actual Intervention, the EventCoordinator calls InterventionFactory and passes it the remaining unparsed JSON from the campaign file. Namely, this is the Intervention_Config, the actual intervention-level campaign parameters including the intervention class. The InterventionFactory returns the newly created intervention instance for each individual via a one of two types of IDistributableIntervention interfaces.

Interventions

Interventions are the actual objects aimed at reducing the spread of disease, such as a vaccine or drug. THey can be either distributed to individuals or to nodes. For example, a vaccine is an individual-distributed intervention and a larvicide is a node-distributed intervention. Intervention is an abstract type class and specific interventions are classes that implement either IDistributableIntervention, for individual-distributed interventions, or INodeDistributableIntervention, for node-distributed interventions.

The determination of whether an intervention is individual-distributed or node-distributed is contained by logic in InterventionFactory. At the beginning of the EventCoordinator::UpdateNodes()**method, the **InterventionFactory is queried with the unparsed JSON campaign file to see if it returns an INodeDistributableInterface pointer. If it does, the intervention is executed as a node-distributed intervention; if it does not, the individual- distributed intervention execution is used.

Incoming: The interface to the abstract type Intervention class is the Distribute() method. It functions slightly differently for each intervention type.

Outgoing: Intervention is an abstract type that interacts with Nodes or IndividualHumans with an interface specific to that intervention type. The intervention calls QueryInterface on the container to ask for a consumer interface, for example IBednetConsumer. If supported, a Give method specific to that intervention will be called, for example, GiveBednet(this) to give itself to this individual. It is then up to the internal IndividualHuman or Node logic to decide what to do with this intervention.

Individual-distributed interventions

An individual-distributed intervention implements IDistributableIntervention, a container for the actual parameter name-value pairs from the campaign file, that is contained by an IndividualContainer, an IndividualHuman helper class. The EventCoordinator calls IDistributableIntervention::Distribute(), passing the pointer IIndividualHumanDistributionContext, which provides an ISupports interface to the individual by which the intervention can request a consumer interface. This interface can then be used with Give().

In the EventCoordinator::UpdateNodes() method, the EventCoordinator organizes the distribution of Interventions to IndividualHumans mediated by Nodes, which contain the IndividualHuman objects. The EventCoordinator also applies campaign parameters at the event coordinator level (for example, Target_Demographic, Demographic_Coverage, Num_Repetitions, and Days_Between_Reps) which mainly consists of filtering the distribution to individuals based on individual attributes.

Node-distributed interventions

A node-distributed intervention implements INodeDistributableIntervention, a container for the actual parameter name-value pairs from the campaign file, that is contained by a Node. The EventCoordinator calls INodeDistributableIntervention::Distribute(), passing the pointer INodeEventContext, which provides an ISupports interface to the individual by which the intervention can request a consumer interface. This interface can then be used with Give(). Similar to individual-distributed interventions, the EventCoordinator also applies campaign parameters for filtering the distribution.

The architectural diagram below illustrates how campaign file settings are processed by an EMOD simulation.

_images/ArchCampaignFlow.png

EMOD campaign architecture

Reporter component

After running simulations, EMOD creates output reports that contain the model results. Two methods of coordinated reporting are implemented: simulation-wide aggregated reporting and spatial reporting. See Output report structure for more information about the different output reports available.

Simulation-wide aggregate

Simulation-wide aggregate reporting is the most commonly used. This reporting method generates the output written to InsetChart.json. Conceptually, for each time step, the value of a named channel is derived from values provided for that channel by each node. The values are accumulated (summed) over all nodes and then transformed (often normalized by an internal parameter or another channel) just prior to writing. This is implemented through the simulation’s insetChartDataAccumulator.

Basic usage of the NodeTimestepDataAccumulator is explained in Report.h. The simulation is responsible for calling Begin/EndTimestep() and collecting and writing out the data at the end of the simulation. The accumulation calls occur in Node::accumulateInsetChartData().

Spatial

The second method is spatial reporting which is facilitated by SpatialReporter. In spatial reporting, each node again produces values for named channels, but no simulation-wide accumulation takes place. Instead, the values of each channel for each node are written to a binary table (ReportNNNN.dat) where NNNN is the time step. The format of this file is simple and can be summarized as the maximally packed layout of this structure:

struct ReportDataFormat
{
    int32_t num_nodes;
    int32_t num_channels;
    float data[num_nodes*num_channels];
}

Num_Channels is the number of user channels implicitly generated by the number of different channel names requested in calls to Node::reportSpatialDataReportChannels() plus two additional channels for longitude and latitude. JSON metadata for the ReportNNNN.dat files is written to Report.header.dat after the first time step. It does not include entries for latitude and longitude.

In general, the value of channel \(c\) for node \(n\), starting at zero, is found at \(data[n\times num\_channels+c]\). The latitude is \(data[n\times num\_channels+0]\) and the longitude is \(data[n\times num\_channels+1]\).

The report data files are written after every time step at the request of the Controller by calling WriteTimestep(). Under MPI, the default implementation reduces all the data to rank 0 and writes the combined data out to file on rank 0.

See Custom reporters for information about how to use a custom reporter.

Debugging and testing

When you build Eradication.exe or Eradication binary from the EMOD source code, it’s important to debug the code and run regression tests to be sure your changes didn’t inadvertently change EMOD functionality. You can run simulations directly from Visual Studio to step through the code, troubleshoot any build errors you encounter, and run the standard IDM regression tests or create a new regression test.

Warning

If you modify the source code to add or remove configuration or campaign parameters, you may need to update the code used to produce the schema. You must also verify that your simulations are still scientifically valid.

Set log levels

EMOD simulations output several files, including log files. See Error and logging files for more information on the logging files that are created by a simulation. By default, logging is at the “INFO” level, but you can set the level at which you want logging information generated. If you see redundant log messages, you can also throttle logging to eliminate them.

There are five log levels. The level chosen will log messages for that level and all higher levels (levels of smaller numeric value). You can set default log levels across the entire Eradication.exe or for individual files in the Eradication.exe; individual file settings will override the default. For example, if you want to increase logging for a particular file you are debugging without increasing logging across the entire Eradication.exe, you can set the default log level to “WARNING” and set the log level for the file to “DEBUG”. The standard output will reflect the default log level for all settings except “ERROR” or “WARNING”. For example:

Log-levels:
        Default -> INFO
        Eradication -> INFO

The following log levels are available:

ERROR (1)

This is the highest level. Only errors, including critical errors, are logged to standard output.

WARNING (2)

Warnings and errors are logged to standard output.

INFO (3)

This is the default logging level for the executable and is set implicitly. Informational messages, warnings, and errors are logged to standard output.

DEBUG (4)

Debug information, informational messages, warnings, and errors are logged to standard output. Debug level logging messages do not require a debug build of Eradication.exe. This setting will generate a large number of messages and may impact performance. If you need the debugging messages, we recommend that you limit the number of files with this setting and not set it as the default across the entire Eradication.exe.

VALID (5)

This is the lowest level. Validation information, debug information, informational messages, warnings, and errors are logged to standard output. This log level is for very low-level debugging of specific values, including values in tight loops. Because it could severely impact performance, this level will only output to standard output during a debug build of Eradication.exe.

Set default Eradication.exe level

To set the default log level across the entire Eradication.exe, add the parameter logLevel_default to your configuration file and set it to the log level desired. For example:

{
    "logLevel_default": "WARNING"
}
Set level for individual files

You can set the log level for an individual file, if it supports the ability. This is typically only used for debugging after making source code changes. This setting will override the default set using logLevel_default, whether set to a higher or lower level.

  1. In the C++ files that make up the EMOD source code, open the file for which you want to set the log level.

  2. Search for static const char * _module.

    “Module” refers to the C++ file and is not the same as an EMODule. If this string isn’t present, you cannot set a log level for the file.

  3. Look for logging macros in the file, such as LOG_WARN(x).

    If macros are present, this indicates that the file supports that log level setting. The file may not support all log levels. Logging macros can be found in utils/Log.h. You can also add your own logging messages to the file using the logging macros.

  4. In the configuration file, add the logLevel_<FileName> parameter with the log level desired. For example:

    {
        "logLevel_SimulationVectorExport":"DEBUG"
    }
    
Throttle redundant logging

It’s possible that multiple identical logging messages are generated by a file of Eradication.exe. This is normal behavior, but the verbosity can be unwanted or unnecessary. You can eliminate duplicate messages by turning on “throttling”, which retains only one logging message instead of a series of duplicate messages from each file.

Only one copy of the message will be generated when it is one of a series of duplicates from the same file. The identical messages need not be output one right after one another to be throttled. If an identical message is output from a different file, it will still be generated. Throttling can only be enabled across the entire Eradication.exe, not per file. It is off by default.

To enable throttling, add the following parameter and value to your configuration file:

{
    "Enable_Log_Throttling": 1
}

For example, the following log messages are seen with throttling turned off:

00:00:00 [0] [D] [FileA] identical message: I'm in FileA
00:00:00 [0] [D] [FileB] another message from B
00:00:00 [0] [D] [FileA] identical message: I'm in FileA
00:00:00 [0] [D] [FileB] different message from B
00:00:00 [0] [D] [FileA] identical message: I'm in FileA
00:00:00 [0] [D] [FileB] yet another message from B.
00:00:00 [0] [D] [FileA] identical message: I'm in FileA

With throttling on, the repeated messages from file A are removed, even though they are intermixed with other log messages from file B:

00:00:00 [0] [D] [FileA] identical message: I'm in FileA
00:00:00 [0] [D] [FileB] another message from B
00:00:00 [0] [D] [FileB] different message from B
00:00:00 [0] [D] [FileB] yet another message from B.

Run debug simulations in Visual Studio

If you have modified the EMOD source code, you can run simulations directly from Visual Studio as part of debugging your changes by using the built-in debugger. For example, you may want to run one or more of the simulations in the Regression directory to verify that the results match those obtained prior to your changes.

  1. Open the EradicationKernel solution in Visual Studio.

  2. On the Solution Explorer pane, right-click the Eradication project and select Properties.

  3. On the Property Pages window, in the Configuration Properties pane, click Debugging.

  4. Set the Command Arguments and Working Directory to the appropriate values and click OK. See Run a simulation using the command line for more information.

  5. On the Debug menu, do one of the following:

    • Click Start Without Debugging to run the simulation in Release mode, where the simulation runs with essentially the same behavior and performance as running it at the command line.

    • Click Start Debugging to run the simulation in Debug mode, where you have the ability to add break points and step through the code, inspecting the values of different variables throughout the simulation.

Troubleshooting EMOD builds

If you encounter any of the following warnings or errors when attempting to build the EMOD executable (Eradication.exe) or Eradication binary, see the information below to resolve the issue.

If you need assistance, you can contact support for help with solving issues. You can contact Institute for Disease Modeling (IDM) support at support@idmod.org. When submitting the issue, please include any error information.

Unknown compiler version

If you encounter the warning “Unknown compiler version - please run the configure tests and report the results” when attempting to build the Eradication.exe or Eradication binary, this indicates you are using a version of Boost that is no longer supported. Install Boost 1.61.0.

Inconsistent DLL linkage

If you see the following warning on some files, “c:python27includepymath.h(22): warning C4273: ‘round’: inconsistent dll linkage”, this indicates that you are using a version of Python that is no longer supported. Install Python 2.7.11 or 2.7.12.

Error 255

Check to see if you have any white spaces in the path to your local EMOD source code. If you do, remove the white spaces in all of the directory names in the path.

Error LNK4272

If you see the error “LNK4272 library machine type ‘X86’ conflicts with target machine type ‘x64’”, this indicates that you need to uninstall 32-bit Python and reinstall 64-bit Python. Install Python 2.7.11 or 2.7.12.

Regression testing

After building the EMOD executable (Eradication.exe), it’s important to verify that Eradication.exe is performing properly. Regression testing is a method by which the built code is tested to see if it has “regressed” or moved backwards in any way, such as previously reported (and fixed) issues reappearing.

Within the EMOD Regression directory there are many subdirectories that correspond to different disease scenarios in a variety of locations. Each of these contains the configuration and campaign files needed to run the simulation and the reference output, which represents the expected results. These reference outputs have been calculated by the scientific researchers modeling each scenario.

EMOD regression testing consists of running one or more of these simulations and comparing the output to the reference output. If the two outputs are comparable, the test passes; if they differ, the test fails. Because EMOD is stochastic, a passing test will fall within some acceptable range of the reference output, rather than be an identical match. If a regression test fails, EMOD will produce a matplotlib chart of the first 16 channels in the InsetChart.json output report. You can then review the charts to identify the problem.

If you want to quickly compare a simulation output to the reference output, you can also run any of the regression scenarios as a typical simulation, as described in Run simulations. However, this will not include the comparison and pass/fail evaluation that regression_test.py conducts. In addition, if you choose to do this, be sure to specify a different output directory, such as “testing”, so as not to overwrite the reference output.

Run regression tests

The Python script regression_test.py runs a suite of regression simulations and compares the output to the reference output for each simulation. It is set up to run the simulations on an HPC cluster; however, you can run modify the script to run tests locally. However, the script was written with remote execution in mind and running it locally can be time-consuming. Running the entire regression suite locally will take several hours on average.

The regression scenarios, script, configuration file, and other relevant files are all in the Regression directory. Be aware that many of these tests, due to abnormally high or low values, will produce output that should not be considered scientifically accurate.

  1. Modify the configuration file, regression_test.cfg, for your environment, setting the values for the location of the working directory, input data files, binary file, and cluster settings.

    • For local Windows simulations, set the values under [WINDOWS].

    • For local CentOS on Azure simulations, set the values under [POSIX]. Note that CentOS on Azure simulations are run locally by default and cannot be commissioned to an HPC cluster.

    • For simulations on IDM HPC clusters, no changes are necessary if your username and password are cached locally.

    • For simulations on your own HPC cluster, create [HPC-<cluster>] and [ENVIRONMENT-<cluster>] sections for your cluster that contain the same variables as shown for IDM HPC clusters.

  2. Select the suite of regression tests you want to run. This is indicated by a JSON file in the following format:

    {
        "tests": [{
            "path": "Relative path to test directory."
        }, {
            "path": "Relative path to test directory."
        }]
    }
    

    You can use one of the JSON files in the Regression directory or create your own. The sanity.json file is recommended for quickly testing a wide range of EMOD functionality.

  3. From the Regression directory, open a Command Prompt window and run the regression test script, regression_test.py. It requires the name of the regression suite (without the .json extension) and the relative path to Eradication.exe. For example:

    regression_test.py sanity ..\Eradication\x64\Release\Eradication.exe
    

    In addition, you may need to include the following optional arguments depending on your testing environment or how Eradication.exe was built.

    Argument

    Default

    Description

    --perf

    False

    Measure Eradication.exe performance.

    --hidegraphs

    False

    Suppress pop-up graphs in case of validation failures.

    --debug

    False

    Use the debug path for EMODules.

    --label

    Add a custom suffix for HPC job name.

    --config

    regression_test.cfg

    The regression test configuration file.

    --disable-schema-test

    True

    Include to suppress schema testing, which is on by default.

    --use-dlls

    False

    Use EMODules when running tests.

    --all-outputs

    False

    Use all output JSON files for validation, not just InsetChart.json.

    --dll-path

    The path to the root directory of the EMODules to use.

    --skip-emodule-check

    False

    Skip checking if EMODules on the cluster are up-to-date, which can be slow.

    --scons

    False

    Indicate that this is a SCons build so custom DLLs are found in the build/64/Release directory.

    --local

    False

    Run all simulations locally.

  4. Review the output and examine any failures.

    EMOD will output the standard error and logging files, StdErr.txt and StdOut.txt, produced from any simulation (see Error and logging files). In addition, regression_test.py will output time.txt under the regression test working directory and report_xxxx.xml under Regression/reports. The time report contains the EMOD version and total run time of the simulation. The regression report is in JUnit standard form and captures run information, including pass/fail/complete and time to complete.

    If a simulation completes saying the run passed but the channel order was different than the reference output, this is considered a pass. However, if any output completes but does not match the reference output, this is considered a failure and a matplotlib chart of the output will appear in a pop-up window. The chart will appear immediately after the simulation, before the entire suite of regression tests completes. You can manipulate the output of the charts, such as adjusting the scale of the plots, zooming or panning, and so forth, through the icons at the bottom of the chart window.

    _images/matplotlibPopupChart.png

If any of the regression tests fail and you have not made any changes to the EMOD source code, email support@idmod.org.

Create a new regression test

You can create a new regression based off one of the ones included with the EMOD source code using the steps below.

  1. Under the Regression directory, create a new subdirectory.

  2. Copy the contents of the regression test that you want to base the new test on into the subdirectory.

  3. Modify the configuration, campaign, and demographic files as desired.

  4. Create the reference output by doing one of the following:

    • Modify the InsetChart.json file to match the output you expect.

    • Run simulations until you have an acceptable InsetChart.json that you wish to use as the reference.