Source code for emodpy_malaria.interventions.outbreak

from emod_api import schema_to_class as s2c
from emod_api.interventions.common import utils, BroadcastEvent, MultiInterventionDistributor


[docs]def add_outbreak_individual(campaign, start_day: int = 1, demographic_coverage: float = 1.0, target_num_individuals: int = None, node_ids: list = None, repetitions: int = 1, timesteps_between_repetitions: int = 365, ind_property_restrictions: list = None, target_age_min: int = 0, target_age_max: int = 125, target_gender: str = "All", ignore_immunity: bool = True, incubation_period_override: int = -1, antigen: int = 0, genome: int = 0, broadcast_event: str = None): """ Adds a scheduled OutbreakIndividual intervention. This is set up to be used with Malaria-Ongoing branch. Args: campaign: campaign object to which the intervention will be added, and schema_path container start_day: The day the intervention is given out. 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. target_num_individuals: The exact number of people to select out of the targeted group. If this value is set, demographic_coverage parameter is ignored node_ids: List of nodes to which to distribute the intervention. [] or None, indicates all nodes will get the intervention repetitions: The number of times an intervention is given, used with timesteps_between_repetitions. -1 means the intervention repeats forever. Sets **Number_Repetitions** timesteps_between_repetitions: The interval, in timesteps, between repetitions. Ignored if repetitions = 1. Sets **Timesteps_Between_Repetitions** ind_property_restrictions: A list of dictionaries of IndividualProperties, which are needed for the individual to receive the intervention. Sets the **Property_Restrictions_Within_Node** target_age_min: The lower end of ages targeted for an intervention, in years. Sets **Target_Age_Min** target_age_max: The upper end of ages targeted for an intervention, in years. Sets **Target_Age_Max** target_gender: The gender targeted for an intervention: All, Male, or Female. ignore_immunity: Individuals will be force-infected (with a specific strain) regardless of actual immunity level when set to True (1). Default is True (1). The person will or will not get an infection based on their immunity level if this is set to False. incubation_period_override: 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 antigen: The antigenic base strain ID of the outbreak infection genome: The genetic substrain ID of the outbreak infection broadcast_event: Optional event that will be sent out at the same time as outbreak is distributed Returns: Nothing """ schema_path = campaign.schema_path # configuring the intervention itself intervention = s2c.get_class_with_defaults("OutbreakIndividual", schema_path) intervention.Antigen = antigen intervention.Genome = genome intervention.Ignore_Immunity = 1 if ignore_immunity else 0 intervention.Incubation_Period_Override = incubation_period_override if broadcast_event: intervention = MultiInterventionDistributor(campaign, [intervention, BroadcastEvent(campaign, Event_Trigger=broadcast_event)]) add_campaign_event(campaign, start_day=start_day, demographic_coverage=demographic_coverage, repetitions=repetitions, timesteps_between_repetitions=timesteps_between_repetitions, ind_property_restrictions=ind_property_restrictions, target_age_min=target_age_min, target_age_max=target_age_max, target_gender=target_gender, target_num_individuals=target_num_individuals, node_ids=node_ids, intervention=intervention)
[docs]def add_outbreak_malaria_genetics(campaign, start_day: int = 1, demographic_coverage: float = 1.0, target_num_individuals: int = None, node_ids: list = None, repetitions: int = 1, timesteps_between_repetitions: int = 365, ind_property_restrictions: list = None, target_age_min: int = 0, target_age_max: int = 125, target_gender: str = "All", ignore_immunity: bool = True, incubation_period_override: int = -1, create_nucleotide_sequence_from: str = "BARCODE_STRING", barcode_string: str = None, drug_resistant_string: str = None, msp_variant_value: int = None, pfemp1_variants_values: list = None, barcode_allele_frequencies_per_genome_location: list = None, drug_resistant_allele_frequencies_per_genome_location: list = None, hrp_allele_frequencies_per_genome_location: list = None, hrp_string: str = None, broadcast_event: str = None): """ Creates a scheduled OutbreakIndividualMalariaGenetics CampaignEvent which can then be added to a campaign. Args: campaign: campaign object to which the intervention will be added, and schema_path container start_day: The day the intervention is given out. 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. target_num_individuals: The exact number of people to select out of the targeted group. If this value is set, demographic_coverage parameter is ignored. node_ids: List of nodes to which to distribute the intervention. [] or None, indicates all nodes will get the intervention repetitions: The number of times an intervention is given, used with timesteps_between_repetitions. -1 means the intervention repeats forever. Sets **Number_Repetitions** timesteps_between_repetitions: The interval, in timesteps, between repetitions. Ignored if repetitions = 1. Sets **Timesteps_Between_Repetitions** ind_property_restrictions: A list of dictionaries of IndividualProperties, which are needed for the individual to receive the intervention. Sets the **Property_Restrictions_Within_Node** target_age_min: The lower end of ages targeted for an intervention, in years. Sets **Target_Age_Min** target_age_max: The upper end of ages targeted for an intervention, in years. Sets **Target_Age_Max** target_gender: The gender targeted for an intervention: All, Male, or Female. ignore_immunity: Individuals will be force-infected (with a specific strain) regardless of actual immunity level when set to True (1). Default is True (1). The person will or will not get an infection based on their immunity level if this is set to False. incubation_period_override: 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 create_nucleotide_sequence_from: A string that indicates how the genomes are created. Possible values are: BARCODE_STRING, ALLELE_FREQUENCIES, NUCLEOTIDE_SEQUENCE. barcode_string: Used with 'BARCODE_STRING' or 'NUCLEOTIDE_SEQUENCE'. A series of nucleotide base letters (A, C, G, T) that represent the values at locations in the genome. The length of the string depends on the number of locations defined in config.Parasite_Genetics.Barcode_Genome_Locations. Each character of the string corresponds to one of the locations. The locations are assumed to be in ascending order. drug_resistant_string: Used with 'BARCODE_STRING' or 'NUCLEOTIDE_SEQUENCE'. A series of nucleotide base letters (A, C, G, T) that represent the values at locations in the genome. The length of the string depends on the number of locations defined in config.Parasite_Genetics.Drug_Resistant_Genome_Locations. Each character of the string corresponds to one of the locations. The locations are assumed to be in ascending order. msp_variant_value: Used with 'NUCLEOTIDE_SEQUENCE'. The Merozoite Surface Protein value used to determine how the antibodies recognizes the merzoites. This value depends on config.Falciparum_MSP_Variants and must be less than or equal to it. pfemp1_variants_values: Used with 'NUCLEOTIDE_SEQUENCE'. The PfEMP1 Variant values / major epitopes used to define how the antibodies recognize the infected red blood cells. The values of the array depend on config. Falciparum_PfEMP1_Variants and must be less than or equal to it. There must be exactly 50 values – one for each epitope. barcode_allele_frequencies_per_genome_location: Used with 'ALLELE_FREQUENCIES'. The fractions of allele occurrences for each location in the barcode. This 2D array should have one array for each location/character in the barcode. For each location, there should be four values between 0 and 1 indicating the probability that specific character appears. The possible letters are: A=0, C=1, G=2, T=3. The frequencies should sum up to 1. drug_resistant_allele_frequencies_per_genome_location:Used with 'ALLELE_FREQUENCIES'. The fractions of allele occurrences for each location in the drug resistant markers. This 2D array should have one array for each drug resistant location. For each location, there should be four values between 0 and 1 indicating the probability that specific character will appear. The possible letters are S'A'=0, 'C'=1, 'G'=2, 'T'=3. The frequencies should sum up to 1. hrp_allele_frequencies_per_genome_location: Used with 'ALLELE_FREQUENCIES'. The fractions of allele occurrences for each location in the HRP markers. This 2D array should have one array for each HRP location. For each location, there should be four values between 0 and 1 indicating the probability that specific character will appear. The possible letters are 'A'=0, 'C'=1, 'G'=2, 'T'=3. hrp_string: Used with 'BARCODE_STRING' or 'NUCLEOTIDE_SEQUENCE'. A series of nucleotide base letters (A, C, G, T) that represent the HRP values at locations in the genome. There must be one character for each location defined in <config>.Parasite_Genetics.HRP_Genome_Locations. 'A' means HRP marker is present and a non-'A' means it isn't. broadcast_event: Optional event that will be sent out at the same time as outbreak is distributed Returns: CampaignEvent which then can be added to the campaign file """ if create_nucleotide_sequence_from == "BARCODE_STRING" and not barcode_string: raise ValueError(f"You must define barcode_string with {create_nucleotide_sequence_from} setting.\n") elif create_nucleotide_sequence_from == "BARCODE_STRING" and (msp_variant_value or pfemp1_variants_values or barcode_allele_frequencies_per_genome_location or hrp_allele_frequencies_per_genome_location): raise ValueError(f"With {create_nucleotide_sequence_from} setting does not use msp_variant_value or " f"pfemp1_variants_values or barcode_allele_frequencies_per_genome_location or " f"hrp_allele_frequencies_per_genome_location. Please do not set them.\n") elif create_nucleotide_sequence_from == "NUCLEOTIDE_SEQUENCE" and not ( msp_variant_value and pfemp1_variants_values): raise ValueError(f"You must define msp_variant_value and pfemp1_variants_values with " f"{create_nucleotide_sequence_from} setting.\n") elif create_nucleotide_sequence_from == "NUCLEOTIDE_SEQUENCE" and (barcode_string or barcode_allele_frequencies_per_genome_location or hrp_allele_frequencies_per_genome_location): raise ValueError(f"With {create_nucleotide_sequence_from} setting does not use barcode_string " f"or barcode_allele_frequencies_per_genome_location or " f"hrp_allele_frequencies_per_genome_location. Please do not set them.\n") elif create_nucleotide_sequence_from == "ALLELE_FREQUENCIES" and not barcode_allele_frequencies_per_genome_location: raise ValueError(f"You must define barcode_allele_frequencies_per_genome_location with " f"{create_nucleotide_sequence_from} setting.\n") elif create_nucleotide_sequence_from == "ALLELE_FREQUENCIES" and (barcode_string or hrp_string or msp_variant_value or pfemp1_variants_values): raise ValueError(f"With {create_nucleotide_sequence_from} setting does not use barcode_string " f"or msp_variant_value or pfemp1_variants_values or hrp_string. Please do not set them.\n") schema_path = campaign.schema_path intervention = s2c.get_class_with_defaults("OutbreakIndividualMalariaGenetics", schema_path) if create_nucleotide_sequence_from == "BARCODE_STRING": intervention.Barcode_String = barcode_string if drug_resistant_string: intervention.Drug_Resistant_String = drug_resistant_string if hrp_string: intervention.HRP_String = hrp_string elif create_nucleotide_sequence_from == "NUCLEOTIDE_SEQUENCE": intervention.MSP_Variant_Value = msp_variant_value intervention.Barcode_String = barcode_string intervention.PfEMP1_Variants_Values = pfemp1_variants_values if drug_resistant_string: intervention.Drug_Resistant_String = drug_resistant_string if hrp_string: intervention.HRP_String = hrp_string elif create_nucleotide_sequence_from == "ALLELE_FREQUENCIES": intervention.Barcode_Allele_Frequencies_Per_Genome_Location = barcode_allele_frequencies_per_genome_location if drug_resistant_allele_frequencies_per_genome_location: intervention.Drug_Resistant_Allele_Frequencies_Per_Genome_Location = drug_resistant_allele_frequencies_per_genome_location if hrp_allele_frequencies_per_genome_location: intervention.HRP_Allele_Frequencies_Per_Genome_Location = hrp_allele_frequencies_per_genome_location else: raise ValueError(f"Unknown create_nucleotide_sequence_from option - {create_nucleotide_sequence_from}.\n") intervention.Create_Nucleotide_Sequence_From = create_nucleotide_sequence_from intervention.Ignore_Immunity = 1 if ignore_immunity else 0 intervention.Incubation_Period_Override = incubation_period_override if broadcast_event: intervention = MultiInterventionDistributor(campaign, [intervention, BroadcastEvent(campaign, Event_Trigger=broadcast_event)]) add_campaign_event(campaign, start_day=start_day, demographic_coverage=demographic_coverage, repetitions=repetitions, timesteps_between_repetitions=timesteps_between_repetitions, ind_property_restrictions=ind_property_restrictions, target_age_min=target_age_min, target_age_max=target_age_max, target_gender=target_gender, target_num_individuals=target_num_individuals, node_ids=node_ids, intervention=intervention)
[docs]def add_outbreak_malaria_var_genes(campaign, start_day: int = 1, demographic_coverage: float = 1.0, target_num_individuals: int = None, node_ids: list = None, repetitions: int = 1, timesteps_between_repetitions: int = 365, ind_property_restrictions: list = None, target_age_min: int = 0, target_age_max: int = 125, target_gender: str = "All", ignore_immunity: bool = True, incubation_period_override: int = -1, irbc_type: list = None, minor_epitope_type: list = None, msp_type: int = None): """ Creates a scheduled OutbreakIndividualMalariaGenetics CampaignEvent which can then be added to a campaign. Args: campaign: campaign object to which the intervention will be added, and schema_path container start_day: The day the intervention is given out. 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. target_num_individuals: The exact number of people to select out of the targeted group. If this value is set, demographic_coverage parameter is ignored node_ids: List of nodes to which to distribute the intervention. [] or None, indicates all nodes will get the intervention repetitions: The number of times an intervention is given, used with timesteps_between_repetitions. -1 means the intervention repeats forever. Sets **Number_Repetitions** timesteps_between_repetitions: The interval, in timesteps, between repetitions. Ignored if repetitions = 1. Sets **Timesteps_Between_Repetitions** ind_property_restrictions: A list of dictionaries of IndividualProperties, which are needed for the individual to receive the intervention. Sets the **Property_Restrictions_Within_Node** target_age_min: The lower end of ages targeted for an intervention, in years. Sets **Target_Age_Min** target_age_max: The upper end of ages targeted for an intervention, in years. Sets **Target_Age_Max** target_gender: The gender targeted for an intervention: All, Male, or Female. ignore_immunity: Individuals will be force-infected (with a specific strain) regardless of actual immunity level when set to True (1). Default is True (1). The person will or will not get an infection based on their immunity level if this is set to False. incubation_period_override: 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 irbc_type: The array PfEMP1 Major epitope variant values. There must be exactly 50 values. Min value = 0, MAX value = config.Falciparum_PfEMP1_Variants. minor_epitope_type: The array PfEMP1 Minor epitope variant values. There must be exactly 50 values. Min value = 0, MAX value = config.Falciparum_Nonspecific_Types * MINOR_EPITOPE_VARS_PER_SET(=5) . msp_type: The Merozoite Surface Protein variant value of this infection. Min value = 0, MAX value = config.Falciparum_MSP_Variants. Returns: CampaignEvent which then can be added to the campaign file """ if not irbc_type or not minor_epitope_type or not msp_type: raise ValueError(f"irbc_type, minor_epitope_type, msp_type all must be defined.\n") elif irbc_type and len(irbc_type) != 50: raise ValueError(f"irbc_type needs to have 50 values, you have {len(irbc_type)}.\n") elif minor_epitope_type and len(minor_epitope_type) != 50: raise ValueError(f"minor_epitope_type needs to have 50 values, you have {len(minor_epitope_type)}.\n") schema_path = campaign.schema_path intervention = s2c.get_class_with_defaults("OutbreakIndividualMalariaVarGenes", schema_path) intervention.MSP_Type = msp_type intervention.Minor_Epitope_Type = minor_epitope_type intervention.IRBC_Type = irbc_type intervention.Ignore_Immunity = 1 if ignore_immunity else 0 intervention.Incubation_Period_Override = incubation_period_override add_campaign_event(campaign, start_day=start_day, demographic_coverage=demographic_coverage, repetitions=repetitions, timesteps_between_repetitions=timesteps_between_repetitions, ind_property_restrictions=ind_property_restrictions, target_age_min=target_age_min, target_age_max=target_age_max, target_gender=target_gender, target_num_individuals=target_num_individuals, node_ids=node_ids, intervention=intervention)
[docs]def add_campaign_event(campaign, start_day: int = 1, demographic_coverage: float = 1.0, target_num_individuals: int = None, node_ids: list = None, repetitions: int = 1, timesteps_between_repetitions: int = 365, ind_property_restrictions: list = None, target_age_min: int = 0, target_age_max: int = 125, target_gender: str = "All", intervention: any = None): """ Adds a campaign event to the campaign with a passed in intervention. Args: campaign: campaign object to which the intervention will be added, and schema_path container start_day: The day the intervention is given out. 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. target_num_individuals: The exact number of people to select out of the targeted group. If this value is set, demographic_coverage parameter is ignored node_ids: List of nodes to which to distribute the intervention. [] or None, indicates all nodes will get the intervention repetitions: The number of times an intervention is given, used with timesteps_between_repetitions. -1 means the intervention repeats forever. Sets **Number_Repetitions** timesteps_between_repetitions: The interval, in timesteps, between repetitions. Ignored if repetitions = 1. Sets **Timesteps_Between_Repetitions** ind_property_restrictions: A list of dictionaries of IndividualProperties, which are needed for the individual to receive the intervention. Sets the **Property_Restrictions_Within_Node** target_age_min: The lower end of ages targeted for an intervention, in years. Sets **Target_Age_Min** target_age_max: The upper end of ages targeted for an intervention, in years. Sets **Target_Age_Max** target_gender: The gender targeted for an intervention: All, Male, or Female. intervention: Intervention or a list of interventions to be distributed by this event Returns: Nothing, add the CampaignEvent to the campaign """ schema_path = campaign.schema_path event = s2c.get_class_with_defaults("CampaignEvent", schema_path) event.Start_Day = start_day event.Nodeset_Config = utils.do_nodes(schema_path, node_ids) if isinstance(intervention, list): multi_intervention_distributor = s2c.get_class_with_defaults("MultiInterventionDistributor", schema_path) multi_intervention_distributor.Intervention_List = intervention intervention = multi_intervention_distributor # configuring the coordinator coordinator = s2c.get_class_with_defaults("StandardEventCoordinator", schema_path) if target_num_individuals is not None: coordinator.Target_Num_Individuals = target_num_individuals else: coordinator.Demographic_Coverage = demographic_coverage coordinator.Number_Repetitions = repetitions coordinator.Timesteps_Between_Repetitions = timesteps_between_repetitions coordinator.Property_Restrictions_Within_Node = ind_property_restrictions if ind_property_restrictions else [] coordinator.Property_Restrictions = [] # not using; Property_Restrictions_Within_Node are more flexible if target_age_min > 0 or target_age_max < 125: coordinator.Target_Age_Min = target_age_min coordinator.Target_Age_Max = target_age_max if target_gender != "All": coordinator.Target_Gender = target_gender coordinator.Target_Demographic = "ExplicitAgeRangesAndGender" event.Event_Coordinator_Config = coordinator coordinator.Intervention_Config = intervention campaign.add(event)