def add_scenario_specific_smc(cb, age_range="default"): # Both years get 2 years of 90% coverage SMC for year in [0, 1]: dtk_start_days = year * 365 + smc_days_in_year if age_range in ["default", "u10", "u15"]: add_smc(cb, u5_coverage=0.9, start_days=dtk_start_days, age_range=age_range) elif age_range == "u10_with_DP": add_drug_campaign(cb, campaign_type="MDA", drug_code="DP", start_days=list(dtk_start_days), coverage=0.9, target_group={ 'agemin': 0.25, 'agemax': 10 }, receiving_drugs_event_name="Received_SMC") elif age_range == "u15_with_DP": add_drug_campaign(cb, campaign_type="MDA", drug_code="DP", start_days=list(dtk_start_days), coverage=0.9, target_group={ 'agemin': 0.25, 'agemax': 15 }, receiving_drugs_event_name="Received_SMC")
def add_rcd(self): rcd_events = pd.read_csv(self.rcd_filename) rcd_events['simday'] = [convert_to_day(x, self.sim_start_date, "%Y-%m-%d") for x in rcd_events.fulldate] rcd_events = rcd_events[np.in1d(rcd_events['grid_cell'], self.demo_cells)] rcd_events.reset_index(inplace=True, drop=True) rcd_events = rcd_events[['grid_cell','event','fulldate','simday','coverage','trigger_coverage','interval']] [binned_and_grouped, grouped_by_fields] = self.try_campaign_compression(rcd_events) for tup, group in binned_and_grouped: table = self.convert_group_tuple_to_dict(tup, grouped_by_fields) node_list = list(group['grid_cell']) if sorted(node_list) == self.demo_cells: nodeIDs = [] else: nodeIDs = node_list coverage = float(table['coverage']) if coverage > 0: add_drug_campaign(self.cb, campaign_type='rfMSAT', drug_code='AL', start_days=[float(table['simday'])], coverage=float(table['coverage']), trigger_coverage=float(table['trigger_coverage']), interval=float(table['interval']), nodes=nodeIDs)
def add_smc_group(cb, coverage=1.0, start_days=[60], agemax=10, drug='DP', target_property_name='ReceivedIntervention', target_property_value='NoDrugs'): add_drug_campaign(cb, 'SMC', drug, start_days=start_days, repetitions=4, tsteps_btwn_repetitions=30, coverage=coverage, target_group={ 'agemin': 0, 'agemax': agemax }) # ind_property_restrictions=[{target_property_name: target_property_value}]) return { 'Coverage': coverage, 'Start': start_days[0], 'Intervention_type': 'SMC%i' % agemax }
def add_ipt_for_timing_sweep(cb, scenario_number, archetype, num_years=1): if archetype == "Southern": timings_df = pd.read_csv("southern_term_sweep_scenarios.csv") elif archetype == "Sahel": timings_df = pd.read_csv("sahel_term_sweep_scenarios.csv") elif archetype == "Central": timings_df = pd.read_csv("central_term_sweep_scenarios.csv") else: raise NotImplementedError scenario_dict = dict( timings_df[timings_df["scenario_number"] == scenario_number].reset_index(drop=True).iloc[0]) for y in range(num_years): campaign_days = np.array([ scenario_dict["term1_day"] + y * 365, scenario_dict["term2_day"] + y * 365, scenario_dict["term3_day"] + y * 365 ]) add_drug_campaign(cb, campaign_type="MDA", drug_code="DP", start_days=list(campaign_days), coverage=1, ind_property_restrictions=[{ "SchoolStatus": "AttendsSchool" }]) return {"scenario_number": scenario_number}
def add_mda(self): mda_events = pd.read_csv(self.mda_filename) mda_events['simday'] = [convert_to_day(x, self.sim_start_date, "%Y-%m-%d") for x in mda_events.fulldate] mda_events = mda_events[np.in1d(mda_events['grid_cell'], self.demo_cells)] mda_events.reset_index(inplace=True, drop=True) mda_events = mda_events[['grid_cell','event','fulldate','simday','cov_all']] [binned_and_grouped, grouped_by_fields] = self.try_campaign_compression(mda_events) for tup, group in binned_and_grouped: table = self.convert_group_tuple_to_dict(tup, grouped_by_fields) node_list = list(group['grid_cell']) if sorted(node_list) == self.demo_cells: nodeIDs = [] else: nodeIDs = node_list cov_all = float(table['cov_all']) if cov_all > 0: add_drug_campaign(self.cb, campaign_type='MDA', drug_code='DP', start_days=[float(table['simday'])], coverage=float(table['cov_all']), repetitions=1, interval=60, nodes=nodeIDs)
def add_smc_group(cb, coverage=1.0, start_days=[60, 60 + 365], agemax=10, drug='DP'): ''' This function sets up an SMC campaign for children under a certain age. Drug parameters can be changed to include or exclude gametocyte killing. :param cb: config builder :param coverage: coverage for SMC :param start_days: campaign start day :param agemax: children under this age will receive SMC drugs :param drug: type of drug to be used in SMC campaign :return: tags for SMC campaign ''' add_drug_campaign(cb, 'SMC', drug, start_days=start_days, repetitions=3, interval=30, coverage=coverage, target_group={ 'agemin': 0, 'agemax': agemax }) return { 'Coverage': coverage, 'Start': start_days[0], 'Intervention_type': 'SMC%i' % agemax }
def add_primaquine(cb): add_drug_campaign(cb, 'MDA', drug_code="PMQ", start_days=[1], trigger_condition_list=[ 'Received_Campaign_Drugs', 'Received_RCD_Drugs' ], receiving_drugs_event_name='Received_Primaquine')
def rcd_followthrough(cb, coverage=1, delivery_method="MTAT"): # Listen for Diagnostic_Survey_0 and implement a diagnostic survey, then broadcast TestedPositive or TestedNegative. # Then, if TestedPositive, then administer drugs and broadcast Received_RCD_Drugs # Drug setup drug_code = 'AL' drug_configs = drug_configs_from_code(cb, drug_code=drug_code) # set up events to broadcast when receiving reactive campaign drug receiving_drugs_event = { "class": "BroadcastEvent", "Broadcast_Event": "Received_RCD_Drugs" } event_config = drug_configs + [receiving_drugs_event] if delivery_method == "MTAT": add_diagnostic_survey(cb, coverage=coverage, start_day=1, diagnostic_type='BLOOD_SMEAR_PARASITES', diagnostic_threshold=0, trigger_condition_list=['Diagnostic_Survey_0'], event_name='Reactive MSAT level 0', positive_diagnosis_configs=event_config, listening_duration=-1) elif delivery_method == "MDA": add_drug_campaign(cb, coverage=coverage, drug_code=drug_code, start_days=[1], campaign_type="MDA", trigger_condition_list=["Diagnostic_Survey_0"], listening_duration=-1 ) # def add_drug_campaign(cb, campaign_type: str = 'MDA', drug_code: str = None, start_days: list = None, # coverage: float = 1.0, # repetitions: int = 1, tsteps_btwn_repetitions: int = 60, # diagnostic_type: str = 'BLOOD_SMEAR', # diagnostic_threshold: float = 40, fmda_radius: int = 0, # node_selection_type: str = 'DISTANCE_ONLY', # trigger_coverage: float = 1.0, snowballs: int = 0, treatment_delay: int = 0, # triggered_campaign_delay: int = 0, nodeIDs: list = None, target_group: any = 'Everyone', # drug_ineligibility_duration: int = 0, # node_property_restrictions: list = None, ind_property_restrictions: list = None, # disqualifying_properties: list = None, trigger_condition_list: list = None, # listening_duration: int = -1, adherent_drug_configs: list = None, # target_residents_only: int = 1, # check_eligibility_at_trigger: bool = False): return {"delivery_method": delivery_method, "coverage": coverage}
def add_mda(cb, events_df): mda_field_list = ["cov_all"] binned_intervene_events, binned_and_grouped, data_fields = try_campaign_compression(events_df, mda_field_list) for table, group in binned_and_grouped: table_dict = dict(zip((data_fields), table)) node_list = sorted(group['grid_cell']) add_drug_campaign(cb, campaign_type='MDA', drug_code='DP', start_days=[float(table_dict['simday'])], coverage=table_dict['cov_all'], repetitions=1, interval=60, nodes=node_list)
def add_smc(cb, u5_coverage, start_days, age_range="default"): # Copied from HBHI setup default_adherence = 0.8 default_sp_resist_day1_multiply = 0.87 adherent_drug_configs = smc_adherent_configuration( cb=cb, adherence=default_adherence, sp_resist_day1_multiply=default_sp_resist_day1_multiply) if age_range == "default": add_drug_campaign(cb, 'SMC', start_days=start_days, coverage=u5_coverage, target_group={ 'agemin': 0.25, 'agemax': 5 }, adherent_drug_configs=[adherent_drug_configs], receiving_drugs_event_name='Received_SMC') o5_coverage = (0.2 / 0.9) * u5_coverage add_drug_campaign(cb, 'SMC', start_days=start_days, coverage=o5_coverage, target_group={ 'agemin': 5, 'agemax': 10 }, adherent_drug_configs=[adherent_drug_configs], receiving_drugs_event_name='Received_SMC') elif age_range == "u10": add_drug_campaign(cb, 'SMC', start_days=start_days, coverage=u5_coverage, target_group={ 'agemin': 0.25, 'agemax': 10 }, adherent_drug_configs=[adherent_drug_configs], receiving_drugs_event_name='Received_SMC') elif age_range == "u15": add_drug_campaign(cb, 'SMC', start_days=start_days, coverage=u5_coverage, target_group={ 'agemin': 0.25, 'agemax': 15 }, adherent_drug_configs=[adherent_drug_configs], receiving_drugs_event_name='Received_SMC')
def add_smc_group(cb, coverage=1.0, start_days=[60, 60+365], agemax=10, drug='DP', dp_gam_kill_on=1): add_drug_campaign(cb, 'SMC', drug, start_days=start_days, repetitions=3, interval=30, coverage=coverage, target_group={'agemin': 0, 'agemax': agemax}) if not dp_gam_kill_on: malaria_drug_params = update_drugs(['DHA', 'Drug_Gametocyte02_Killrate'], 0.0) malaria_drug_params = update_drugs(['DHA', 'Drug_Gametocyte34_Killrate'], 0.0, malaria_drug_params=malaria_drug_params) malaria_drug_params = update_drugs(['DHA', 'Drug_GametocyteM_Killrate'], 0.0, malaria_drug_params=malaria_drug_params) malaria_drug_params = update_drugs(['Piperaquine', 'Drug_Gametocyte02_Killrate'], 0.0, malaria_drug_params=malaria_drug_params) cb.update_params({"Malaria_Drug_Params": malaria_drug_params}) return {'Coverage': coverage, 'Start': start_days[0], 'Intervention_type': 'SMC_GK%i_' %dp_gam_kill_on+str(agemax)+drug}
def __call__(self, cb): from malaria.interventions.malaria_drug_campaigns import add_drug_campaign return add_drug_campaign(cb, self.campaign_type, self.drug_code, start_days=self.start_days, coverage=self.coverage, repetitions=self.repetitions, interval=self.interval, diagnostic_threshold=self.diagnostic_threshold, diagnostic_type=self.diagnostic_type, drug_ineligibility_duration=self.drug_ineligibility_duration, snowballs=self.snowballs, treatment_delay=self.delay, nodes=self.nodes, target_group=self.target_group, node_property_restrictions=self.NP_restrictions)
def add_rcd(self, cb, filename=None): if not filename: # filename = self.dropbox_base + "inputs/grid_csv/grid_all_react_events.csv" filename = self.dropbox_base + "inputs/grid_csv/grid_all_react_events_SIMPLE.csv" print( "WARNING: using simplified RCD file-- grid_all_react_events_SIMPLE.csv" ) intervene_events = pd.read_csv(filename) # Restrict to catchment of interest intervene_events = intervene_events[np.in1d( intervene_events['grid_cell'], self.catch_cells)] intervene_events.reset_index(inplace=True) # Compute simulation days relative to start date or use default in file intervene_events['simday'] = [ convert_to_day_365(x, self.start_date, "%Y-%m-%d") for x in intervene_events.fulldate ] rcd_field_list = ["coverage", "trigger_coverage", "interval"] binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2( intervene_events, rcd_field_list) for table, group in binned_and_grouped: table_dict = dict(zip((data_fields), table)) node_list = sorted(group['grid_cell']) if node_list == sorted(self.catch_cells): nodeIDs = [] else: nodeIDs = node_list for i in range(len(intervene_events)): add_drug_campaign(cb, campaign_type='rfMSAT', drug_code='AL', diagnostic_type='BLOOD_SMEAR_PARASITES', diagnostic_threshold=0, start_days=[float(table_dict['simday'])], coverage=float(table_dict['coverage']), trigger_coverage=float( table_dict['trigger_coverage']), interval=float(table_dict['interval']), nodes=nodeIDs)
def add_rcd(cb, events_df): rcd_field_list = ["coverage", "trigger_coverage", "interval"] binned_intervene_events, binned_and_grouped, data_fields = try_campaign_compression( events_df, rcd_field_list) for table, group in binned_and_grouped: table_dict = dict(zip((data_fields), table)) node_list = sorted(group['grid_cell']) add_drug_campaign(cb, campaign_type='rfMSAT', drug_code='AL', diagnostic_type='BLOOD_SMEAR_PARASITES', diagnostic_threshold=0, start_days=[float(table_dict['simday'])], coverage=float(table_dict['coverage']), trigger_coverage=float( table_dict['trigger_coverage']), nodeIDs=node_list)
def add_scenario_specific_ipt( cb, scenario_dict, archetype, receiving_drugs_event_name="Received_Campaign_Drugs"): # scenario dict has drug_type,screen_type,interval,school_coverage if scenario_dict["screen_type"] == "IPT": dtk_campaign_type = "MDA" elif scenario_dict["screen_type"] == "IST": dtk_campaign_type = "MSAT" else: raise NotImplementedError drug_code = scenario_dict["drug_type"] if drug_code == "SPAQ": drug_code = "SPA" if drug_code == "ASAQ": drug_code = "ASA" # timing: timings_df = pd.read_csv("ipt_schedule.csv") timings_df = timings_df[np.logical_and( timings_df["archetype"] == archetype, timings_df["interval"] == scenario_dict["interval"])].reset_index( drop=True) campaign_days = np.array(timings_df["day"]) # Assuming that we do the same thing for 2 years: campaign_days = np.append(campaign_days, campaign_days + 365) add_drug_campaign(cb, campaign_type=dtk_campaign_type, drug_code=drug_code, start_days=list(campaign_days), coverage=scenario_dict["within_school_coverage"], ind_property_restrictions=[{ "SchoolStatus": "AttendsSchool" }], diagnostic_type='BLOOD_SMEAR_PARASITES', diagnostic_threshold=0, receiving_drugs_event_name=receiving_drugs_event_name)
def sample_point_fn(cb, sample_dimension_values): # require multinode to read in burn-in cb.update_params({'Simulation_Duration': sample_dimension_values['Serialization'], 'Spatial_Output_Channels': ['New_Diagnostic_Prevalence', 'Population', 'Prevalence'], 'Serialization_Time_Steps': [sample_dimension_values['Serialization']], 'New_Diagnostic_Sensitivity': 50 }) # also need to pick up serialization path to load serialized file for each iteration. if sample_dimension_values['NodeIDs'] : # adjust the start date of VMW campaigns for event in cb.campaign['Events']: if event['Start_Day'] < sample_dimension_values['Serialization']: event['Start_Day'] = sample_dimension_values['Serialization'] add_drug_campaign(cb, 'MDA', 'DP', [sample_dimension_values['Serialization']], coverage=0.5, nodes=sample_dimension_values['NodeIDs'], interval=30) # for the second round, we want to set the start time equal to the last day of the old sim. # We also want duration to be equal to the new duration value, and for it to serialize at the # proper point. cb.update_params({'Start_Time': sample_dimension_values['Serialization'], 'Simulation_Duration': sample_dimension_values['New_Duration'], 'Serialization_Time_Steps': [sample_dimension_values['Serialization']+ sample_dimension_values['New_Duration']]}) if 'Serialized_Population_Path' in sample_dimension_values: cb.set_param('Serialized_Population_Path',sample_dimension_values['Serialized_Population_Path']) if 'Serialized_Population_Filenames' in sample_dimension_values: cb.set_param('Serialized_Population_Filenames',sample_dimension_values['Serialized_Population_Filenames']) tags = {'Prevalence_date':sample_dimension_values['Prevalence_date'], 'Prevalence_threshold': sample_dimension_values['Prevalence_threshold'], 'Serialization': sample_dimension_values['New_Duration'] if sample_dimension_values['NodeIDs'] else sample_dimension_values['Serialization']} tags.update(cb.set_param('Run_Number', sample_dimension_values['Run_Number'])) return tags
def add_long_term_ipt(cb, ipt_on): if ipt_on: term_days = [15, 165, 254] for y in range(num_years): for t in [1, 2, 3]: dtk_day = y * 365 + term_days[t - 1] add_drug_campaign( cb, campaign_type="MDA", drug_code="DP", start_days=[dtk_day], coverage=0.9, ind_property_restrictions=[{ "SchoolStatus": "AttendsSchool" }], receiving_drugs_event_name="Received_Campaign_Drugs") else: pass return {"ipt_on": ipt_on}
def add_smc_variant(cb, scenario_num): ''' :param cb: :param scenario_num: 0 = no intervention. 1 = regular SMC. 2 = SMC + iver. 3 = SMC + prim 4 = SMC + iver + prim :return: ''' if scenario_num == 0: pass else: add_scenario_specific_smc(cb, age_range="default") if scenario_num == 2 or scenario_num == 4: add_ivermectin( cb, box_duration="WEEK", start_days=[ 1 ], #Listening for drug delivery in other methods, then give this drug trigger_condition_list=['Received_SMC']) if scenario_num == 3 or scenario_num == 4: add_drug_campaign(cb, 'MDA', drug_code="PMQ", start_days=[1], trigger_condition_list=['Received_SMC'], receiving_drugs_event_name='Received_Primaquine') return { "scenario_num": scenario_num, "scenario_description": scenario_descriptions[scenario_num] }
def add_msat(self, cb, filename=None): if not filename: filename = self.dropbox_base + "inputs/grid_csv/grid_all_msat_events.csv" intervene_events = pd.read_csv(filename) # Restrict to catchment of interest intervene_events = intervene_events[np.in1d( intervene_events['grid_cell'], self.catch_cells)] intervene_events.reset_index(inplace=True) # Compute simulation days relative to start date or use default in file intervene_events['simday'] = [ convert_to_day_365(x, self.start_date, "%Y-%m-%d") for x in intervene_events.fulldate ] msat_field_list = ["cov_all"] binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2( intervene_events, msat_field_list) for table, group in binned_and_grouped: table_dict = dict(zip((data_fields), table)) node_list = sorted(group['grid_cell']) if node_list == sorted(self.catch_cells): nodeIDs = [] else: nodeIDs = node_list add_drug_campaign(cb, campaign_type='MSAT', drug_code='AL', diagnostic_type='BLOOD_SMEAR_PARASITES', diagnostic_threshold=0, start_days=[float(table_dict['simday'])], coverage=table_dict['cov_all'], repetitions=1, interval=60, nodes=nodeIDs)
def add_ipt_with_iver_skipping_one_term(cb, term_to_skip): term_days = [15, 165, 254] for y in [0, 1]: for t in [1, 2, 3]: dtk_day = y * 365 + term_days[t - 1] add_drug_campaign( cb, campaign_type="MDA", drug_code="DP", start_days=[dtk_day], coverage=scenario_dict["within_school_coverage"], ind_property_restrictions=[{ "SchoolStatus": "AttendsSchool" }], diagnostic_type='BLOOD_SMEAR_PARASITES', diagnostic_threshold=0, receiving_drugs_event_name="Received_Campaign_Drugs_Term_{}". format(t)) terms_with_iver = [1, 2, 3] terms_with_iver.remove(term_to_skip) iver_trigger_list = [ "Received_Campaign_Drugs_Term_{}".format(t) for t in terms_with_iver ] add_ivermectin( cb, box_duration="WEEK", start_days=[ 1 ], #Listening for drug delivery in other methods, then give this drug trigger_condition_list=iver_trigger_list) return {"term_skipped": term_to_skip}
def add_intervention(cb, intervention, coverage, target, ivm_duration) : IPR = [{'HomeVillage' : 'Village1'}] if target == 'vill1' else None if intervention == 'ivermectin_to_forest' : add_ivermectin(cb, box_duration=ivm_duration, coverage=coverage, start_days=[365], trigger_condition_list=['Immigrating'], nodeIDs=forest_nodes, target_group={'agemin': 5, 'agemax': 200, 'gender': 'Male'}, target_residents_only=False, ind_property_restrictions=IPR ) elif intervention == 'drug_to_forest' : add_drug_campaign(cb, 'MDA', 'DP', coverage=coverage, start_days=[365], repetitions=1, trigger_condition_list=['Immigrating'], nodeIDs=forest_nodes, target_residents_only=False, ind_property_restrictions=IPR ) elif intervention == 'drug_MDA' : add_drug_campaign(cb, 'MDA', 'DP', coverage=coverage, start_days=[365 + 152], repetitions=3, tsteps_btwn_repetitions=30, nodeIDs=village_nodes, target_residents_only=False, ind_property_restrictions=IPR ) elif intervention == 'drug_ivermectin_MDA' : add_drug_campaign(cb, 'MDA', 'DP', coverage=coverage, start_days=[365 + 152], repetitions=3, tsteps_btwn_repetitions=30, nodeIDs=village_nodes, target_residents_only=False, ind_property_restrictions=IPR ) add_ivermectin(cb, box_duration=ivm_duration, coverage=1, start_days=[365], trigger_condition_list=['Received_Campaign_Drugs'], target_group={'agemin': 5, 'agemax': 200, 'gender': 'Male'}, nodeIDs=village_nodes, target_residents_only=False ) add_ivermectin(cb, box_duration=ivm_duration, coverage=1, start_days=[365], trigger_condition_list=['Received_Campaign_Drugs'], target_group={'agemin': 51, 'agemax': 200, 'gender': 'Female'}, nodeIDs=village_nodes, target_residents_only=False ) add_ivermectin(cb, box_duration=ivm_duration, coverage=1, start_days=[365], trigger_condition_list=['Received_Campaign_Drugs'], target_group={'agemin': 5, 'agemax': 12, 'gender': 'Female'}, nodeIDs=village_nodes, target_residents_only=False ) elif intervention == 'ivermectin_MDA' : add_ivermectin(cb, box_duration=ivm_duration, coverage=coverage, start_days=[365 + 152 + 30 * x for x in range(3)], nodeIDs=village_nodes, target_group={'agemin': 5, 'agemax': 200, 'gender': 'Male'}, target_residents_only=False, ind_property_restrictions=IPR ) add_ivermectin(cb, box_duration=ivm_duration, coverage=coverage, start_days=[365 + 152 + 30 * x for x in range(3)], nodeIDs=village_nodes, target_group={'agemin': 51, 'agemax': 200, 'gender': 'Female'}, target_residents_only=False, ind_property_restrictions=IPR ) add_ivermectin(cb, box_duration=ivm_duration, coverage=coverage, start_days=[365 + 152 + 30 * x for x in range(3)], nodeIDs=village_nodes, target_group={'agemin': 5, 'agemax': 12, 'gender': 'Female'}, target_residents_only=False, ind_property_restrictions=IPR ) forest_HS_coverage = coverage if intervention == 'forest_HS' else 0.4 add_health_seeking(cb, start_day=0, drug=['Artemether', 'Lumefantrine'], nodes=village_nodes, targets=[ {'trigger': 'NewClinicalCase', 'coverage': forest_HS_coverage, 'seek': 1, 'rate': 0.2}], ind_property_restrictions=[{'ForestGoing': 'LovesForest'}] ) event_trigger_list=['Received_Treatment'] if 'ivermectin' in intervention : event_trigger_list.append('Received_Ivermectin') if 'drug' in intervention : event_trigger_list.append('Received_Campaign_Drugs') add_event_counter_report(cb, event_trigger_list=event_trigger_list) return { 'intervention' : intervention, 'coverage' : coverage, 'target' : target, 'IVM duration' : ivm_duration}