Source code for emodpy_malaria.interventions.vector_surveillance
import emod_api.config.default_from_schema_no_validation as dfs
from emod_api import schema_to_class as s2c
from emod_api.interventions import utils
from enum import Enum
from emod_api.utils import Distributions
[docs]
class CountType(Enum):
ALLELE_FREQ = "ALLELE_FREQ"
GENOME_FRACTION = "GENOME_FRACTION"
[docs]
class VectorGender(Enum):
VECTOR_FEMALE = "VECTOR_FEMALE"
VECTOR_MALE = "VECTOR_MALE"
VECTOR_BOTH_GENDERS = "VECTOR_BOTH_GENDERS"
[docs]
def add_vector_surveillance_event_coordinator(
campaign,
start_trigger_condition_list: list,
update_period: float,
sample_size: dict,
species: str,
gender: VectorGender,
count_type: CountType,
coordinator_name: str = None,
node_ids: list = None,
start_day: int = 0,
duration: int = None,
stop_trigger_condition_list: list = None,
survey_completed_event: str = None
):
"""
This function adds a VectorSurveillanceEventCoordinator to the campaign.
VectorSurveillanceEventCoordinator is a coordinator that samples the vector population at a given interval.
The vector population sampled is determined by the species and gender parameters. The number of vectors sampled
is determined by the sample_size parameter, which defines a distribution from which the sample size is drawn at each
sampling event.
The results of the surveillance are passed to the respond() function in dtk_vector_surveillance.py.
Surveillance results are two lists: list_data_names and list_data_values. The list_data_names list contains the
names of all the alleles present (when CountType.ALLELE_FREQ) or genomes possible (when CountType.GENOME_FRACTION)
in the vector population. The list_data_values list contains either the fraction of each of the alleles at its
locus of the vectors sampled (when CountType.ALLELE_FREQ) or the fraction of each of the genomes in the vectors
sampled (when CountType.GENOME_FRACTION).
The respond() function in dtk_vector_surveillance.py is called each time any VectorSurveillanceEventCoordinator
samples the vectors. The respond() function receives the following info from the VectorSurveillanceEventCoordinator:
time, responder_id, coordinator_name, num_vectors_sampled, list_data_names, list_data_values
You can write any code you want in the respond() function to process the data, using coordinator_name to
differentiate between different VectorSurveillanceEventCoordinators if needed. The respond() function returns a list
of event names to be broadcast as coordinator-level events at completion of the survey. The events are added by you
based on your processing of the sampled vectors. These events are used to trigger interventions in the campaign that
will run the next day. The events in the list should correspond to the events used in the campaign or be manually
added to the config.parameters.Custom_Coordinator_Events parameter list.
Args:
campaign: campaign object to which the intervention will be added, and schema_path container
start_trigger_condition_list: List of coordinator-level events. Any of the events in the list will activate
the run of vector surveillance intervention. The list cannot be empty. emod_api.interventions.common.py
has a function add_broadcast_coordinator_event that sends out coordinator-level events to act as triggers.
update_period: The number of days between the sampling of the mosquito population. If the mosquitoes are
sampled on day 1 and the period is 30, then the next sample will be taken on day 31
sample_size: Distribution that will be used to pick the sample size of the surveillance.
Please use emod_api.utils.Distributions to generate the distribution dictionary to pass in.
The distribution and values to use for determining the sample size we take of the
vector population. If the population is less than this number, then the entire population will
be selected.
species: The name of the species to sample the mosquitoes from. This string must be defined by the Name
parameter in the config.Vector_Species_Param parameters.
gender: The sex of the vectors we are sampling. Options are: VectorGender.VECTOR_FEMALE,
VectorGender.VECTOR_MALE, VectorGender.VECTOR_BOTH_GENDERS
count_type: The type of count to use for the vector counter. Options are: CountType.ALLELE_FREQ,
CountType.GENOME_FRACTION.
coordinator_name: The name of the coordinator - this name can be used in the embedded python code to help
differentiate between coordinators. It is recommended that this name be unique, but not enforced.
node_ids: The list of nodes whose mosquitoes will be surveyed. The mosquitoes from these nodes will be
considered to be one group when sampled. None or [] means sample from all nodes. Default: None
start_day: the day the surveillance coordinator is distributed, it needs to be triggered to run
duration: The time period (in days) that the event coordinator exists after it is distributed at start_time
before it expires and is removed from the simulation. On (start_day + duration) day of the simulation,
the coordinator will stop running if it's been triggered and will be removed from the simulation. It cannot
be activated again.
Default: None, meaning the coordinator never expires.
stop_trigger_condition_list: Optional list of coordinator-level events. Any of the events in the list will stop
the running of vector surveillance intervention. emod_api.interventions.common.py has a function
add_broadcast_coordinator_event that sends out coordinator-level events to act as triggers.
survey_completed_event: String representing coordinator-level event that will be sent out after every time a
vector survey runs the respond() function and its resulting events (if any) are sent out.
Returns:
configured VectorSurveillanceEventCoordinator intervention
"""
schema_path = campaign.schema_path
vector_counter = dfs.schema_to_config_subnode(schema_path, ["idmTypes", "idmType:VectorCounter"]).parameters
vector_counter.Count_Type = count_type.name
vector_counter.Gender = gender.name
vector_counter.Species = species
vector_counter.Update_Period = update_period
prefix = "Sample_Size_"
Distributions.set_distribution_parameters(vector_counter, sample_size, prefix)
v_s_e_c = s2c.get_class_with_defaults("VectorSurveillanceEventCoordinator", schema_path)
v_s_e_c.Start_Trigger_Condition_List = start_trigger_condition_list
campaign.custom_coordinator_events.extend(start_trigger_condition_list)
if coordinator_name:
v_s_e_c.Coordinator_Name = coordinator_name
v_s_e_c.Counter = vector_counter
if stop_trigger_condition_list:
v_s_e_c.Stop_Trigger_Condition_List = stop_trigger_condition_list
campaign.custom_coordinator_events.extend(stop_trigger_condition_list)
if duration:
v_s_e_c.Duration = duration
if survey_completed_event:
responder = dfs.schema_to_config_subnode(schema_path, ["idmTypes", "idmType:VectorResponder"]).parameters
responder.Survey_Completed_Event = survey_completed_event
campaign.custom_coordinator_events.append(survey_completed_event)
v_s_e_c.Responder = responder
event = s2c.get_class_with_defaults("CampaignEvent", schema_path)
event.Event_Coordinator_Config = v_s_e_c
event.Start_Day = start_day
event.Nodeset_Config = utils.do_nodes(schema_path, node_ids)
campaign.add(event)