def add_nets(cb, coverage=0.6, number=0, num_nodes=0, start_day=180): # # ITN add_ITN_age_season( cb, 180, demographic_coverage=coverage, discard_times={ "Expiration_Distribution_Type": "EXPONENTIAL_DURATION", "Expiration_Period": 639 }, blocking_config=WaningEffectExponential(Decay_Time_Constant=730, Initial_Effect=0.6), killing_config=WaningEffectExponential(Decay_Time_Constant=1460, Initial_Effect=0.7)) add_ITN_age_season( cb, 180 + 3 * 365, demographic_coverage=coverage, discard_times={ "Expiration_Distribution_Type": "EXPONENTIAL_DURATION", "Expiration_Period": 639 }, blocking_config=WaningEffectExponential(Decay_Time_Constant=730, Initial_Effect=0.6), killing_config=WaningEffectExponential(Decay_Time_Constant=1460, Initial_Effect=0.7)) return { 'ITN_Coverage': coverage, 'Release_Number': number, 'Num_Nodes': num_nodes, 'Start_Day': start_day }
def fn(self, cb): add_ITN_age_season(cb, start=self.start, age_dep=self.age_dep, coverage_all=self.coverage, as_birth=False, seasonal_dep=self.seasonal_dep, discard=self.discard)
def add_bednets_for_population_and_births( cb, coverage, start_day=1, seasonal_dependence=None, discard_config_type="default", age_dependence=default_bednet_age_usage, killing_config=None, blocking_config=None): if seasonal_dependence is None: seasonal_dependence = {} # regular_bednet_distribution add_ITN_age_season(cb, birth_triggered=False, start=start_day, age_dependence=age_dependence, demographic_coverage=coverage, seasonal_dependence=seasonal_dependence, discard_times=discard_config[discard_config_type], blocking_config=blocking_config, killing_config=killing_config) # birth_triggered_bednet_distribution add_ITN_age_season(cb, birth_triggered=True, start=start_day, age_dependence=age_dependence, demographic_coverage=coverage, seasonal_dependence=seasonal_dependence, discard_times=discard_config[discard_config_type], blocking_config=blocking_config, killing_config=killing_config)
def add_itn(cb, events_df): itn_field_list = ["age_cov", "cov_all", "min_season_cov", "fast_fraction"] binned_intervene_events, binned_and_grouped, data_fields = try_campaign_compression(events_df, itn_field_list) birthnet_df = events_df.copy(deep=True) birthnet_df.sort_values(by='simday', inplace=True) birthnet_df['duration'] = birthnet_df.groupby('grid_cell')['simday'].shift(-1).sub(birthnet_df['simday']) birthnet_df['duration'].fillna(-1, inplace=True) birthnet_field_list = itn_field_list + ["duration"] BIRTH_binned_intervene_events, BIRTH_binned_and_grouped, BIRTH_data_fields = try_campaign_compression(birthnet_df, birthnet_field_list) for table, group in binned_and_grouped: table_dict = dict(zip((data_fields), table)) node_list = sorted(list(set(group['grid_cell']))) # fixme Needed to add this because sometimes there are duplicate nodes in the list, and this breaks things start = float(table_dict['simday']) if start >= 0: # Regular bednet distribution add_ITN_age_season(cb, start=float(table_dict['simday']), age_dep={'youth_cov': float(table_dict['age_cov']), 'youth_min_age': 5, 'youth_max_age': 20}, coverage_all=float(table_dict['cov_all']), as_birth=False, seasonal_dep={'min_cov': float(table_dict['min_season_cov']), 'max_day': 60}, discard={'halflife1': 260, 'halflife2': 2106, 'fraction1': float(table_dict['fast_fraction'])}, nodeIDs=node_list) # Birthnet distribution for table, group in BIRTH_binned_and_grouped: table_dict = dict(zip((BIRTH_data_fields), table)) node_list = sorted(group['grid_cell']) start = float(table_dict['simday']) if start >= 0: add_ITN_age_season(cb, as_birth=True, duration=table_dict['duration'], start=float(table_dict['simday']), age_dep={'youth_cov': float(table_dict['age_cov']), 'youth_min_age': 5, 'youth_max_age': 20}, coverage_all=float(table_dict['cov_all']), seasonal_dep={'min_cov': float(table_dict['min_season_cov']), 'max_day': 60}, discard={'halflife1': 260, 'halflife2': 2106, 'fraction1': float(table_dict['fast_fraction'])}, nodeIDs=node_list)
def add_annual_itns(cb, year_count=1, coverage=0.8, start_day=0, initial_killing=0.3, discard_time=270, IP=[]): for year in range(year_count): add_ITN_age_season(cb, coverage_all=coverage, discard={"halflife": discard_time}, waning={'kill_initial': initial_killing}, start=(365 * year) + start_day, ind_property_restrictions=IP) return {"ITN_Coverage": coverage, "ITN_Start": start_day, "ITN_killing" : initial_killing, 'ITN_discard' : discard_time}
def add_ITNs(cb, start=0, coverage=0.8, insecticide='', label='No_nets', killing=0.9): add_ITN_age_season( cb, start=start, demographic_coverage=coverage, insecticide=insecticide, discard_times={ "Expiration_Distribution_Type": "EXPONENTIAL_DISTRIBUTION", "Expiration_Period_Exponential": 660 }, blocking_config=WaningEffectExponential(Initial_Effect=0.9, Decay_Time_Constant=730), killing_config=WaningEffectExponential(Initial_Effect=killing, Decay_Time_Constant=1460)) cb.update_params({ "Report_Event_Recorder": 1, "Report_Event_Recorder_Events": ["Bednet_Got_New_One", "Bednet_Discarded"], "Report_Event_Recorder_Ignore_Events_In_List": 0, "Report_Event_Recorder_Individual_Properties": [] }) return { 'Insecticide': insecticide, 'Coverage': coverage, 'Start': start, 'Label': label }
def add_itn(self, cb, filename=None): if not filename: filename = self.dropbox_base + "inputs/grid_csv/grid_all_itn_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 ] itn_field_list = [ "age_cov", "cov_all", "min_season_cov", "fast_fraction" ] binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2( intervene_events, itn_field_list) birthnet_df = intervene_events.copy(deep=True) birthnet_df['duration'] = birthnet_df.groupby( 'grid_cell')['simday'].shift(-1).sub(birthnet_df['simday']) birthnet_df['duration'].fillna(-1, inplace=True) birthnet_field_list = itn_field_list + ["duration"] BIRTH_binned_intervene_events, BIRTH_binned_and_grouped, BIRTH_data_fields = self.try_campaign_compression_v2( birthnet_df, birthnet_field_list) for table, group in binned_and_grouped: table_dict = dict(zip((data_fields), table)) node_list = sorted( list(set(group['grid_cell'])) ) #fixme Needed to add this because sometimes there are duplicate nodes in the list, and this breaks things if node_list == sorted(self.catch_cells): nodeIDs = [] else: nodeIDs = node_list start = float(table_dict['simday']) if start >= 0: # Regular bednet distribution add_ITN_age_season(cb, start=float(table_dict['simday']), age_dep={ 'youth_cov': float(table_dict['age_cov']), 'youth_min_age': 5, 'youth_max_age': 20 }, coverage_all=float(table_dict['cov_all']), as_birth=False, seasonal_dep={ 'min_cov': float(table_dict['min_season_cov']), 'max_day': 60 }, discard={ 'halflife1': 260, 'halflife2': 2106, 'fraction1': float(table_dict['fast_fraction']) }, nodeIDs=nodeIDs) # Birthnet distribution for table, group in BIRTH_binned_and_grouped: table_dict = dict(zip((BIRTH_data_fields), table)) node_list = sorted(group['grid_cell']) if node_list == sorted(self.catch_cells): nodeIDs = [] else: nodeIDs = node_list start = float(table_dict['simday']) if start >= 0: add_ITN_age_season(cb, as_birth=True, duration=table_dict['duration'], start=float(table_dict['simday']), age_dep={ 'youth_cov': float(table_dict['age_cov']), 'youth_min_age': 5, 'youth_max_age': 20 }, coverage_all=float(table_dict['cov_all']), seasonal_dep={ 'min_cov': float(table_dict['min_season_cov']), 'max_day': 60 }, discard={ 'halflife1': 260, 'halflife2': 2106, 'fraction1': float(table_dict['fast_fraction']) }, nodeIDs=nodeIDs)
def add_itns(self): # Add ITN events: itn_events_list = ["Bednet_Got_New_One","Bednet_Using","Bednet_Discarded"] self.cb.update_params({ "Report_Event_Recorder_Ignore_Events_In_List": 0, "Listed_Events": itn_events_list, "Report_Event_Recorder_Events": [], "Report_Event_Recorder": 1 }) itn_events = pd.read_csv(self.itn_filename) itn_events['simday'] = [convert_to_day(x, self.sim_start_date, "%Y-%m-%d") for x in itn_events.fulldate] itn_events = itn_events[np.in1d(itn_events['grid_cell'], self.demo_cells)] itn_events.reset_index(inplace=True, drop=True) itn_events = itn_events[['event','fulldate','cov_all','age_cov','min_season_cov','fast_fraction','grid_cell','simday']] birthnet_events = generate_birthnets_df_from_itn_event_file(itn_events) birthnet_events = birthnet_events[['event','fulldate','cov_all','age_cov','min_season_cov','fast_fraction','grid_cell','simday','duration']] [binned_and_grouped, grouped_by_fields] = self.try_campaign_compression(itn_events[itn_events['simday'] >= 0]) 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 # Regular bednet distribution cov_all = float(table['cov_all']) if cov_all > 0: add_ITN_age_season(self.cb, start=float(table['simday']), age_dep={'youth_cov': float(table['age_cov']), 'youth_min_age': 5, 'youth_max_age': 20}, coverage_all=float(table['cov_all']), as_birth=False, seasonal_dep={'min_cov': float(table['min_season_cov']), 'max_day': 1}, discard={'halflife1': 260, 'halflife2': 2106, 'fraction1': float(table['fast_fraction'])}, nodeIDs=nodeIDs) # Separately handle birth nets: [binned_and_grouped, grouped_by_fields] = self.try_campaign_compression(birthnet_events[birthnet_events['simday'] >= 0]) 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_ITN_age_season(self.cb, start=float(table['simday']), age_dep={'youth_cov': float(table['age_cov']), 'youth_min_age': 5, 'youth_max_age': 20}, coverage_all=float(table['cov_all']), seasonal_dep={'min_cov': float(table['min_season_cov']), 'max_day': 60}, discard={'halflife1': 260, 'halflife2': 2106, 'fraction1': float(table['fast_fraction'])}, nodeIDs=nodeIDs, as_birth=True, duration=table['duration'])
builder = ModBuilder.from_combos( #[ModFn(DTKConfigBuilder.set_param, 'HEG_Infection_Modification', im) for im in [1.0]], #[ModFn(DTKConfigBuilder.set_param, 'HEG_Fecundity_Limiting', fl) for fl in [0.05, 0.1, 0.15]], #[ModFn(DTKConfigBuilder.set_param, 'HEG_Homing_Rate', hr) for hr in [0.9, 0.95, 1.0]], #[ModFn(heg_release, num_released, d) for (num_released, d) in release_combs], [ModFn(set_habs_scale, habs) for habs in habitat_scales], # set habitat scales [ModFn(DTKConfigBuilder.set_param, 'Run_Number', r) for r in range(1)]) cb = DTKConfigBuilder.from_defaults('MALARIA_SIM') for year in range(0, nyears, 3): add_ITN_age_season(cb, start=(365 * (baseline_year + year)) + 1, coverage_all=0.95, seasonal_dep={ 'times': [0, 365], 'values': [0.65, 0.65] }) ''' for year in range(nyears): add_IRS(cb, start=(365 * (baseline_year + year)) + 1, coverage_by_ages=[{'min': 0, 'max': 100, 'coverage': 0.95}]) add_health_seeking(cb, start_day=(365 * baseline_year) + 1, targets=[{'trigger': 'NewClinicalCase', 'coverage': 0.95, 'agemin': 0, 'agemax': 100, 'seek': 1, 'rate': 0.3}]) ''' cb.update_params({ 'Num_Cores': 1, 'Simulation_Duration': (nyears + baseline_year) * 365, # 'Simulation_Duration' : 500, 'Enable_Demographics_Reporting': 1,