Example #1
0
    bool ConcurrencyConfigurationByProperty::Configure( const ::Configuration *json )
    {
        initConfig( "Extra_Relational_Flag_Type", 
                    m_ExtraRelFlag,
                    json, 
                    MetadataDescriptor::Enum("Extra_Relational_Flag_Type", "TBD", MDD_ENUM_ARGS( ExtraRelationalFlagType ) ) );

        bool ret = true;
        if( m_ExtraRelFlag == ExtraRelationalFlagType::Correlated )
        {
            std::set<std::string> allowable_relationship_types = GetAllowableRelationshipTypes();
            std::vector<std::string> rel_type_strings ;
            initConfigTypeMap( "Correlated_Relationship_Type_Order", &rel_type_strings, "TBD", nullptr, allowable_relationship_types );

            ret = JsonConfigurable::Configure( json );
            if( ret )
            {
                if( rel_type_strings.size() != RelationshipType::COUNT )
                {
                    std::stringstream ss;
                    ss << "Reading '" << m_PropretyValue << ": 'Correlated_Relationship_Type_Order' has " << rel_type_strings.size() << " types and must have " << RelationshipType::COUNT;
                    throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
                }

                for( auto& rel_type_str : rel_type_strings )
                {
                    int rel_type_val = RelationshipType::pairs::lookup_value( rel_type_str.c_str() );

                    // I don't think I need this but just in case.
                    if( rel_type_val == -1 )
                    {
                        std::stringstream ss;
                        ss << "Unknown relationship type = " << rel_type_str;
                        throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
                    }
                    if( std::find( m_RelTypeOrder.begin(), m_RelTypeOrder.end(), RelationshipType::Enum(rel_type_val) ) != m_RelTypeOrder.end() )
                    {
                        std::stringstream ss;
                        ss << "Duplicate(='" << rel_type_str << "') found in 'Correlated_Relationship_Type_Order'.  There must be one and only one of each RelationshipType.";
                        throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
                    }

                    m_RelTypeOrder.push_back( RelationshipType::Enum(rel_type_val) );
                }
            }
        }
        else
        {
            for( int i = 0 ; i < RelationshipType::pairs::count() ; ++i )
            {
                m_RelTypeOrder.push_back( RelationshipType::Enum(RelationshipType::pairs::get_values()[i]) );
            }
        }
        return ret;
    }
    bool PairFormationParametersImpl::Configure( const Configuration* inputJson )
    {
        initConfig( "Formation_Rate_Type", 
                    formation_rate_type,
                    inputJson, 
                    MetadataDescriptor::Enum("Formation_Rate_Type", "TBD"/*Formation_Rate_Type_DESC_TEXT*/, MDD_ENUM_ARGS( FormationRateType ) ) );

        if( formation_rate_type == FormationRateType::CONSTANT )
        {
            initConfigTypeMap( "Formation_Rate_Constant", &formation_rate_constant, "TBD"/*Formation_Rate_DESC_TEXT*/, 0, 1, 0.001f );
        }
        else if( formation_rate_type == FormationRateType::SIGMOID_VARIABLE_WIDTH_HEIGHT )
        {
            initConfigTypeMap( "Formation_Rate_Sigmoid", &formation_rate_sigmoid, "TBD"/*Formation_Rate_Sigmoid_DESC_TEXT*/ );
        }
        else if( formation_rate_type == FormationRateType::INTERPOLATED_VALUES )
        {
            initConfigComplexType("Formation_Rate_Interpolated_Values", &formation_rate_value_map, "TBD"/*Formation_Rate_Interpolated_Values_DESC_TEXT*/ );
        }
        else
        {
            throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, "Formation_Rate_Type", formation_rate_type );
        }

        initConfigTypeMap( "Extra_Relational_Rate_Ratio_Male",   &rate_ratio[Gender::MALE  ], PFA_Extra_Relational_Rate_Ratio_Male_DESC_TEXT,   1.0, FLT_MAX, 1.0f );
        initConfigTypeMap( "Extra_Relational_Rate_Ratio_Female", &rate_ratio[Gender::FEMALE], PFA_Extra_Relational_Rate_Ratio_Female_DESC_TEXT, 1.0, FLT_MAX, 1.0f );

        initConfigTypeMap( "Update_Period",                  &update_period,            "TBD"/*Update_Period_DESC_TEXT*/,         0,    FLT_MAX,    0      );
        initConfigTypeMap( "Number_Age_Bins_Male",           &male_age_bin_count,       Number_Age_Bins_Male_DESC_TEXT,           1,       1000,    1      );
        initConfigTypeMap( "Number_Age_Bins_Female",         &female_age_bin_count,     Number_Age_Bins_Female_DESC_TEXT,         1,       1000,    1      );
        initConfigTypeMap( "Age_of_First_Bin_Edge_Male",     &initial_male_age,         Age_of_First_Bin_Edge_Male_DESC_TEXT,     0,        100,    1      );
        initConfigTypeMap( "Age_of_First_Bin_Edge_Female",   &initial_female_age,       Age_of_First_Bin_Edge_Female_DESC_TEXT,   0,        100,    1      );
        initConfigTypeMap( "Years_Between_Bin_Edges_Male",   &male_age_increment,       Years_Between_Bin_Edges_Male_DESC_TEXT,   0.1f,     100.0f, 1.0f   );
        initConfigTypeMap( "Years_Between_Bin_Edges_Female", &female_age_increment,     Years_Between_Bin_Edges_Female_DESC_TEXT, 0.1f,     100.0f, 1.0f   );
        initConfigTypeMap( "Joint_Probabilities",            &joint_probabilities,      Joint_Probabilities_DESC_TEXT,            0.0,  FLT_MAX,    0.0f   ); 

        bool ret = false;
        bool prev_use_defaults = JsonConfigurable::_useDefaults ;
        bool reset_track_missing = JsonConfigurable::_track_missing;
        JsonConfigurable::_track_missing = false;
        JsonConfigurable::_useDefaults = false ;
        
        try
        {

            ret = JsonConfigurable::Configure( inputJson );

            JsonConfigurable::_useDefaults = prev_use_defaults ;
            JsonConfigurable::_track_missing = reset_track_missing;
        }
        catch( DetailedException& e )
        {
            JsonConfigurable::_useDefaults = prev_use_defaults ;
            JsonConfigurable::_track_missing = reset_track_missing;

            std::stringstream ss ;
            ss << e.GetMsg() << "\n" << "Was reading values for " << RelationshipType::pairs::lookup_key( rel_type ) << "." ;
            throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
        }
        catch( json::Exception& e )
        {
            JsonConfigurable::_useDefaults = prev_use_defaults ;
            JsonConfigurable::_track_missing = reset_track_missing;

            std::stringstream ss ;
            ss << e.what() << "\n" << "Was reading values for " << RelationshipType::pairs::lookup_key( rel_type ) << "." ;
            throw InvalidInputDataException( __FILE__, __LINE__, __FUNCTION__, ss.str().c_str() );
        }

        if( ret )
        {
            CheckArraySizes();

            InitializeAgeBins( Gender::MALE,   male_age_bin_count,   initial_male_age,   male_age_increment   );
            InitializeAgeBins( Gender::FEMALE, female_age_bin_count, initial_female_age, female_age_increment );

            InitializeMarginalValues();
            InitializeCumulativeProbabilities();
        }
        return ret ;
    }
    bool DiagnosticTreatNeg::Configure(
        const Configuration * inputJson
    )
    {
        EventOrConfig::Enum use_event_or_config;
        initConfig( "Event_Or_Config", use_event_or_config, inputJson, MetadataDescriptor::Enum("EventOrConfig", Event_Or_Config_DESC_TEXT, MDD_ENUM_ARGS( EventOrConfig ) ) );
        if( use_event_or_config == EventOrConfig::Event || JsonConfigurable::_dryrun )
        {
            initConfigTypeMap( "Negative_Diagnosis_Event", &negative_diagnosis_event, DTN_Negative_Diagnosis_Config_Event_DESC_TEXT );
            initConfigTypeMap( "Defaulters_Event", &defaulters_event, DTN_Defaulters_Diagnosis_Config_Event_DESC_TEXT );
        }

        if( use_event_or_config == EventOrConfig::Config || JsonConfigurable::_dryrun )
        {
            initConfigComplexType("Negative_Diagnosis_Config", &negative_diagnosis_config, DTN_Negative_Diagnosis_Config_DESC_TEXT, "Event_Or_Config", "Config" );
            initConfigComplexType("Defaulters_Config", &defaulters_config, DTN_Defaulters_Diagnosis_Config_DESC_TEXT, "Event_Or_Config", "Config" );
        }

        bool ret = SimpleDiagnostic::Configure( inputJson );
        if( ret  )
        {
            if( use_event_or_config == EventOrConfig::Config || JsonConfigurable::_dryrun )
            {
                InterventionValidator::ValidateIntervention( negative_diagnosis_config._json );
                InterventionValidator::ValidateIntervention( defaulters_config._json );
            }

            if( !JsonConfigurable::_dryrun && 
                negative_diagnosis_event.IsUninitialized() &&
                (negative_diagnosis_config._json.Type() == ElementType::NULL_ELEMENT) )
            {
                const char* msg = "You must define either Negative_Diagnosis_Event or Negative_Diagnosis_Config";
                throw GeneralConfigurationException( __FILE__, __LINE__, __FUNCTION__, msg );
            }

            if( !JsonConfigurable::_dryrun && 
                defaulters_event.IsUninitialized() &&
                (defaulters_config._json.Type() == ElementType::NULL_ELEMENT) )
            {
                const char* msg = "You must define either Defaulters_Event or Defaulters_Config";
                throw GeneralConfigurationException( __FILE__, __LINE__, __FUNCTION__, msg );
            }
        }
        return ret ;
    }
Example #4
0
    bool
    SimpleVaccine::Configure(
        const Configuration * inputJson
    )
    {
        initConfigTypeMap("Vaccine_Take", &vaccine_take, SV_Vaccine_Take_DESC_TEXT, 0.0, 1.0, 1.0 ); 

        initConfig( "Vaccine_Type", vaccine_type, inputJson, MetadataDescriptor::Enum("Vaccine_Type", SV_Vaccine_Type_DESC_TEXT, MDD_ENUM_ARGS(SimpleVaccineType)));

        initConfigComplexType("Waning_Config",  &waning_config, IVM_Killing_Config_DESC_TEXT );

        bool configured = JsonConfigurable::Configure( inputJson );
        if( !JsonConfigurable::_dryrun )
        {
            auto tmp_waning = Configuration::CopyFromElement( waning_config._json );
            waning_effect = WaningEffectFactory::CreateInstance( tmp_waning );
            delete tmp_waning;
            tmp_waning = nullptr;
        }
        //release_assert( vaccine_type );
        LOG_DEBUG_F( "Vaccine configured with type %d and take %f.\n", vaccine_type, vaccine_take );
        return configured;
    }
    bool
    NodeLevelHealthTriggeredIVScaleUpSwitch::Configure(
        const Configuration * inputJson
    )
    {
        initConfig("Demographic_Coverage_Time_Profile",  demographic_coverage_time_profile, inputJson, MetadataDescriptor::Enum("Demographic_Coverage_Time_Profile", NodeHTI_Demographic_Coverage_Time_Profile_DESC_TEXT, MDD_ENUM_ARGS(ScaleUpProfile) ) );
        if ( demographic_coverage_time_profile == ScaleUpProfile::Linear || JsonConfigurable::_dryrun )
        {
            initConfigTypeMap("Initial_Demographic_Coverage", &initial_demographic_coverage, NodeHTI_Initial_Demographic_Coverage_DESC_TEXT, 0.0f, 1.0f, 0.0f);
            initConfigTypeMap("Primary_Time_Constant", &primary_time_constant, NodeHTI_Primary_Time_Constant_DESC_TEXT, 0, INFINITE_TIME); //this is actually the time to reach the final demographic coverage, input as absolute days, not number of dts
        }
        //this has to be an array rather than a single intervention json so that it can be empty if you don't want to phase anything out
        initConfigComplexType("Not_Covered_IndividualIntervention_Configs", &not_covered_intervention_configs, NodeHTI_Not_Covered_IndividualIntervention_Configs_DESC_TEXT);


        bool ret= NodeLevelHealthTriggeredIV::Configure(inputJson);
        return ret;

    }
    bool
    ReferenceTrackingEventCoordinatorHIV::Configure(
        const Configuration * inputJson
    )
    {
        initConfig("Target_Disease_State", target_disease_state, inputJson, MetadataDescriptor::Enum("Target_Disease_State", RTEC_HIV_Target_Disease_State_DESC_TEXT, MDD_ENUM_ARGS(TargetDiseaseStateType))) ;

        auto ret = ReferenceTrackingEventCoordinator::Configure( inputJson );
        return ret;
    }
    bool SusceptibilityConfig::Configure(const Configuration* config)
    {
        // Infection derived immunity
        // Maximum values were revised down to 1.0 from 1000.0. Values > 1.0 imply greater than 
        // baseline susceptibility post infection, which is almost certainly not the desired behavior.
        // If that IS the desired behavior, then consider a disease specific build.
        initConfigTypeMap( "Post_Infection_Acquisition_Multiplier",  &baseacqupdate,  Post_Infection_Acquisition_Multiplier_DESC_TEXT,  0.0f, 1.0f, 0.0f, "Enable_Immunity" );
        initConfigTypeMap( "Post_Infection_Transmission_Multiplier", &basetranupdate, Post_Infection_Transmission_Multiplier_DESC_TEXT, 0.0f, 1.0f, 0.0f, "Enable_Immunity" );
        initConfigTypeMap( "Post_Infection_Mortality_Multiplier",    &basemortupdate, Post_Infection_Mortality_Multiplier_DESC_TEXT,    0.0f, 1.0f, 0.0f, "Enable_Immunity" );

        // Decay of infection derived immunity
        // Maximum values were revised down to 1.0 from 1000.0. Values > 1.0 imply waning rate >100%/day.
        // If that IS the desired behavior, consider turning off immunity.
        initConfigTypeMap( "Enable_Immune_Decay", &enable_immune_decay, Enable_Immune_Decay_DESC_TEXT, true, "Enable_Immunity");
        initConfigTypeMap( "Acquisition_Blocking_Immunity_Decay_Rate",  &acqdecayrate,  Acquisition_Blocking_Immunity_Decay_Rate_DESC_TEXT,  0.0f, 1.0f, 0.001f, "Enable_Immune_Decay" );
        initConfigTypeMap( "Transmission_Blocking_Immunity_Decay_Rate", &trandecayrate, Transmission_Blocking_Immunity_Decay_Rate_DESC_TEXT, 0.0f, 1.0f, 0.001f, "Enable_Immune_Decay" );
        initConfigTypeMap( "Mortality_Blocking_Immunity_Decay_Rate",    &mortdecayrate, Mortality_Blocking_Immunity_Decay_Rate_DESC_TEXT,    0.0f, 1.0f, 0.001f, "Enable_Immune_Decay" );
        initConfigTypeMap( "Acquisition_Blocking_Immunity_Duration_Before_Decay",  &baseacqoffset,  Acquisition_Blocking_Immunity_Duration_Before_Decay_DESC_TEXT,  0.0f, MAX_HUMAN_LIFETIME, 0.0f, "Enable_Immune_Decay" );
        initConfigTypeMap( "Transmission_Blocking_Immunity_Duration_Before_Decay", &basetranoffset, Transmission_Blocking_Immunity_Duration_Before_Decay_DESC_TEXT, 0.0f, MAX_HUMAN_LIFETIME, 0.0f, "Enable_Immune_Decay" );
        initConfigTypeMap( "Mortality_Blocking_Immunity_Duration_Before_Decay",    &basemortoffset, Mortality_Blocking_Immunity_Duration_Before_Decay_DESC_TEXT,    0.0f, MAX_HUMAN_LIFETIME, 0.0f, "Enable_Immune_Decay" );

        // Maternal protection options (does not require infection derived immunity; does not decay)
        initConfigTypeMap("Enable_Maternal_Protection", &maternal_protection, Enable_Maternal_Protection_DESC_TEXT, false, "Enable_Birth");
        initConfig("Maternal_Protection_Type", maternal_protection_type, config, MetadataDescriptor::Enum("Maternal_Protection_Type", Maternal_Protection_Type_DESC_TEXT, MDD_ENUM_ARGS(MaternalProtectionType)),"Enable_Maternal_Protection");
        initConfigTypeMap("Maternal_Linear_Slope",       &matlin_slope,    Maternal_Linear_Slope_DESC_TEXT,          0.0001f, 1.0f,   0.01f, "Maternal_Protection_Type", "LINEAR");
        initConfigTypeMap("Maternal_Linear_SusZero",     &matlin_suszero,  Maternal_Linear_SusZero_DESC_TEXT,        0.0f,    1.0f,   0.2f,  "Maternal_Protection_Type", "LINEAR");
        initConfigTypeMap("Maternal_Sigmoid_SteepFac",   &matsig_steepfac, Maternal_Sigmoid_SteepFac_DESC_TEXT,      0.1f, 1000.0f,  30.0f,  "Maternal_Protection_Type", "SIGMOID");
        initConfigTypeMap("Maternal_Sigmoid_HalfMaxAge", &matsig_halfmax,  Maternal_Sigmoid_HalfMaxAge_DESC_TEXT, -270.0f, 3650.0f, 180.0f,  "Maternal_Protection_Type", "SIGMOID");
        initConfigTypeMap("Maternal_Sigmoid_SusInit",    &matsig_susinit,  Maternal_Sigmoid_SusInit_DESC_TEXT,       0.0f,    1.0f,   0.0f,  "Maternal_Protection_Type", "SIGMOID");

        // Implementation of an individual's susceptibility
        // Currently (May2018) implemented for maternal protection only, but other functionality is expected to follow.
        initConfig( "Susceptibility_Type", susceptibility_type, config, MetadataDescriptor::Enum("Susceptibility_Type", Susceptibility_Type_DESC_TEXT, MDD_ENUM_ARGS(SusceptibilityType)), "Enable_Maternal_Protection");

        initConfigTypeMap( "Enable_Initial_Susceptibility_Distribution",   &enable_initial_susceptibility_distribution,     Enable_Initial_Susceptibility_Distribution_DESC_TEXT, false, "Enable_Immunity" );
        initConfig( "Susceptibility_Initialization_Distribution_Type",     susceptibility_initialization_distribution_type, config, MetadataDescriptor::Enum("Susceptibility_Initialization_Distribution_Type", Susceptibility_Initialization_Distribution_Type_DESC_TEXT, MDD_ENUM_ARGS(DistributionType)), "Enable_Initial_Susceptibility_Distribution");

        bool bRet = JsonConfigurable::Configure( config );

        LogConfigs();

        return bRet;
    }
    bool Action::Configure( const Configuration * inputJson )
    {
        initConfigTypeMap( "Threshold", &m_Threshold, ICE_Action_Threshold_DESC_TEXT, 0.0, FLT_MAX, 0.0 );
        initConfig("Event_Type", m_EventType, inputJson, MetadataDescriptor::Enum("Event_Type", ICE_Event_Type_DESC_TEXT, MDD_ENUM_ARGS( EventType )));
        initConfigTypeMap( "Event_To_Broadcast", &m_EventToBroadcast, ICE_Action_Event_To_Broadcast_DESC_TEXT );

        bool ret = JsonConfigurable::Configure( inputJson );

        if( ret && !JsonConfigurable::_dryrun )
        {
            CheckConfigurationTriggers();
        }
        return ret;
    }
    bool Responder::Configure( const Configuration * inputJson )
    {
        initConfig( "Threshold_Type", m_ThresholdType, inputJson, MetadataDescriptor::Enum( "ThresholdType", ICE_Threshold_Type_DESC_TEXT, MDD_ENUM_ARGS( ThresholdType ) ) );

        initConfigComplexType( "Action_List", &m_ActionList, ICE_Action_List_DESC_TEXT );

        bool ret = JsonConfigurable::Configure( inputJson );
        if( ret && !JsonConfigurable::_dryrun )
        {
            CheckConfiguration( inputJson );
            m_ActionList.CheckConfiguration();
        }
        return ret;
    }
    bool IncidenceCounterSurveillance::Configure( const Configuration * inputJson )
    {
        initConfig( "Counter_Event_Type", m_CounterEventType, inputJson, MetadataDescriptor::Enum("Counter_Event_Type", ICS_Counter_Event_Type_DESC_TEXT, MDD_ENUM_ARGS(EventType)) );
        initConfig( "Counter_Type", m_CounterType, inputJson, MetadataDescriptor::Enum("Counter_Type", ICS_Counter_Type_DESC_TEXT, MDD_ENUM_ARGS(CounterType) ) ) ;
        initConfigTypeMap( "Counter_Period", &m_CounterPeriod, ICS_Counter_Period_DESC_TEXT, 1.0f, 1000.0f, 1.0f );        

        bool retValue = IncidenceCounter::Configure( inputJson );
        if( retValue && !JsonConfigurable::_dryrun )
        {
            m_CounterPeriod_current = m_CounterPeriod;
        }
        return retValue;
    }
Example #11
0
    bool InputEIR::Configure( const Configuration * inputJson )
    {
        initConfig( "Age_Dependence", age_dependence, inputJson, MetadataDescriptor::Enum("Age_Dependence", IE_Age_Dependence_DESC_TEXT, MDD_ENUM_ARGS(AgeDependentBitingRisk)) );
        initConfigComplexType( "Monthly_EIR", &monthly_EIR, IE_Config_Type_DESC_TEXT);

        switch(age_dependence)
        {
            case AgeDependentBitingRisk::OFF:
                risk_function=nullptr;
                break;

            case AgeDependentBitingRisk::LINEAR:
                risk_function = SusceptibilityVector::LinearBitingFunction;
                break;

            case AgeDependentBitingRisk::SURFACE_AREA_DEPENDENT:
                risk_function = SusceptibilityVector::SurfaceAreaBitingFunction;
                break;

            default:
                if( !JsonConfigurable::_dryrun )
                {
                    throw BadEnumInSwitchStatementException( __FILE__, __LINE__, __FUNCTION__, 
                        "age_dependence", age_dependence, 
                        AgeDependentBitingRisk::pairs::lookup_key(age_dependence) );
                }
        }

        bool configured = BaseNodeIntervention::Configure( inputJson );

        if(monthly_EIR.size() != MONTHSPERYEAR && JsonConfigurable::_dryrun == false )
        {
            throw GeneralConfigurationException( __FILE__, __LINE__, __FUNCTION__, 
                "'Monthly_EIR' parameterizes the mean number of infectious bites experienced by an individual for each month of the year.  As such, it must be an array of EXACTLY length 12." );
        }

        return configured;
    }
Example #12
0
    bool
    GenericDrug::Configure(
        const Configuration * inputJson
    )
    {
        initConfigTypeMap("Primary_Decay_Time_Constant", &fast_decay_time_constant, DRUG_Primary_Decay_Time_Constant_DESC_TEXT, 0, 999999);
        initConfigTypeMap("Remaining_Doses", &remaining_doses, DRUG_Remaining_Doses_DESC_TEXT, -1, 999999);
        initConfigTypeMap("Dose_Interval", &time_between_doses, DRUG_Dose_Interval_DESC_TEXT, 0.0f, 99999.0f, 1.0f);
        initConfigTypeMap("Cost_To_Consumer", &cost_per_unit, DRUG_Cost_To_Consumer_DESC_TEXT, 0, 99999);
        initConfigTypeMap("Fraction_Defaulters", &fraction_defaulters, DRUG_Fraction_Defaulters_DESC_TEXT, 0.0f, 1.0f, 0.0f);

        initConfig( "Durability_Profile", durability_time_profile, inputJson, MetadataDescriptor::Enum("Durability_Profile", DRUG_Durability_Profile_DESC_TEXT, MDD_ENUM_ARGS(PKPDModel)) );
        if (durability_time_profile == PKPDModel::CONCENTRATION_VERSUS_TIME || JsonConfigurable::_dryrun)
        {
            initConfigTypeMap("Secondary_Decay_Time_Constant", &slow_decay_time_constant, DRUG_Secondary_Decay_Time_Constant_DESC_TEXT, 0, 999999);
            initConfigTypeMap("Drug_CMax", &Cmax, DRUG_Drug_CMax_DESC_TEXT, 0, 10000);
            initConfigTypeMap("Drug_Vd", &Vd, DRUG_Drug_Vd_DESC_TEXT, 0, 10000);
            initConfigTypeMap("Drug_PKPD_C50", &drug_c50, DRUG_Drug_PKPD_C50_DESC_TEXT, 0, 5000);
        }

        bool configured = BaseIntervention::Configure( inputJson );

        PkPdParameterValidation();

        return configured;
    }