Source code for emodpy_malaria.interventions.treatment_seeking

from emod_api.interventions.common import *
from emodpy_malaria.interventions.drug import _antimalarial_drug
from emodpy_malaria.interventions.common import add_triggered_campaign_delay_event
import random


def _get_events(
        campaign,
        start_day: int = 1,
        targets: list = None,
        drug: list = None,
        node_ids: list = None,
        ind_property_restrictions: list = None,
        drug_ineligibility_duration: float = 0,
        duration: int = -1,
        broadcast_event_name: str = 'Received_Treatment'):
    if not drug:
        drug = ['Artemether', 'Lumefantrine']

    if not targets:
        raise ValueError("Please define targets for treatment seeking. It is a list of dictionaries:\n "
                         "ex: [{\"trigger\":\"NewClinicalCase\", \"coverage\":0.8, \"agemin\":15, \"agemax\":70, \"rate\":0.3}]\n")
    for target in targets:
        if "trigger" not in target:
            raise ValueError("Please define \"trigger\" for each target dictionary. \n"
                             "ex: [{\"trigger\":\"NewClinicalCase\", \"coverage\":0.7, \"agemax\":3 }]")
        if "seek" in target:
            raise ValueError("Notice: \"seek\" parameter has been removed. Please remove it from your \"targets\""
                             " dictionary."
                             " Please modify the \"coverage\" parameter "
                             "directly to attain a different coverage for the intervention. Previously, "
                             "\"Demographic_Coverage\" was \"coverage\"x\"seek\". It is now just \"coverage\".\n")

    drugs = [_antimalarial_drug(campaign, drug_type=d) for d in drug]
    drugs.append(BroadcastEvent(campaign, Event_Trigger=broadcast_event_name))

    if drug_ineligibility_duration > 0:
        drug_ineligibility = PropertyValueChanger(campaign,
                                                  Target_Property_Key="DrugStatus",
                                                  Target_Property_Value="RecentDrug",
                                                  Revert=drug_ineligibility_duration)
        drugs.append(drug_ineligibility)

    drug_config = MultiInterventionDistributor(campaign, Intervention_List=drugs)
    ret_events = list()
    for target in targets:
        if 'rate' in target and target['rate'] > 0:
            actual_config = DelayedIntervention(
                campaign,
                Delay_Dict={"Delay_Period_Exponential": 1.0 / target['rate']},
                Configs=drugs)
        else:
            actual_config = drug_config

        target_age_min = 0  # age is in years
        target_age_max = 125  # setting defaults in case these are unused
        coverage = 1
        if 'agemin' in target:
            target_age_min = target['agemin']
        if 'agemax' in target:
            target_age_max = target['agemax']
        if 'coverage' in target:
            coverage = target['coverage']

        treatment_seeking_event = TriggeredCampaignEvent(
            campaign,
            Event_Name="Treatment_Seeking_Behavior",
            Start_Day=start_day,
            Node_Ids=node_ids,
            Triggers=[target['trigger']],
            Duration=duration,
            Target_Age_Min=target_age_min,
            Target_Age_Max=target_age_max,
            Demographic_Coverage=coverage,
            Property_Restrictions=ind_property_restrictions,
            Intervention_List=[actual_config])

        ret_events.append(treatment_seeking_event)

    return ret_events


[docs]def add_treatment_seeking(campaign, start_day: int = 1, targets: list = None, drug: list = None, node_ids: list = None, ind_property_restrictions: list = None, drug_ineligibility_duration: float = 0, duration: int = -1, broadcast_event_name: str = 'Received_Treatment'): """ Add an event-triggered drug-seeking behavior intervention to the campaign using the **NodeLevelHealthTriggeredIV**. The intervention will distribute drugs to targeted individuals within the node. targets is a list of dictionaries defining the trigger event and coverage for and properties of individuals to target with the intervention with all possible options being: [{"trigger":"NewClinicalCase","coverage":0.8,"agemin":15,"agemax":70, "rate":0.3}] "rate" is the inverse of the average delay in time to treatment seeking from an exponential distribution "trigger" must be defined, but everything else has defaults: coverage = 1, affects all agemin/agemax = 0/125, affects all rate = 0, no delay, seek treatment immediately Args: campaign: object for building, modifying, and writing campaign configuration files. start_day: Start day of intervention. targets: List of dictionaries defining the trigger event and coverage for and properties of individuals to target with the intervention. "trigger" must be defined, other defaults are as follows - "coverage":1,"agemin":0,"agemax":125, "rate":0 (no delay) Example:: [{"trigger":"NewClinicalCase","coverage":0.8,"agemin":15,"agemax":70, "rate":0.3}] drug: List of drug(s) to administer from the drugs defined in config. Default is ``["Artemether","Lumefantrine"]`` node_ids: The list of nodes to apply this intervention to (**Node_List** parameter). If not provided, set value of NodeSetAll. ind_property_restrictions: List of IndividualProperty key:value pairs that individuals must have to receive the intervention. For example, ``["IndividualProperty1:PropertyValue1", "IndividualProperty2:PropertyValue2"]``. drug_ineligibility_duration: number of days for which an individual will be ineligible for more drugs duration: duration from start_day until people will no longer seek drugs when sick. Default is -1, meaning they will always seek drugs when sick broadcast_event_name: Event to broadcast when successful health seeking behavior. Default is "Received_Treatment". Returns: None """ camp_events = _get_events(campaign=campaign, start_day=start_day, targets=targets, drug=drug, node_ids=node_ids, ind_property_restrictions=ind_property_restrictions, drug_ineligibility_duration=drug_ineligibility_duration, duration=duration, broadcast_event_name=broadcast_event_name) for event in camp_events: campaign.add(event)