Source code for emodpy_malaria.interventions.adherentdrug

from emod_api import schema_to_class as s2c


[docs]def adherent_drug(campaign, cost: int = 1, doses: list = None, dose_interval: int = 1, adherence_values: list = None, non_adherence_options: list = None, non_adherence_distribution: list = None, max_dose_consideration_duration: int = 40, took_dose_event: str = "Took_Dose", intervention_name: str = None): """ Configures adherent drug dictionary using the **AdherentDrug** class, an individual-level intervention which extends the **AntimalarialDrug** class. Args: campaign: campaign object to which the intervention will be added, and schema_path container cost: Unit cost per drug. doses: Lists of drugs for each dose. For example, ``[["DrugA", DrugB"], ["DrugB"], [], ["DrugB"]]``. The empty list, ``[]``, indicates no drugs for that dose. dose_interval: Interval between doses of drugs, in days. Default is 1. adherence_values: A list defining WaningEffectMapCount waning effect's "Values", to be used to set the probability for a particular dose. Where the "Times" is the dose number inferred from 'doses' parameter and "Values" is the probably of that dose being successfully taken. non_adherence_options: List of enums to define what happens when the user is not adherent. If not defined then NEXT_UPDATE is used. Enum values are: ["STOP", "NEXT_UPDATE", "NEXT_DOSAGE_TIME", "LOST_TAKE_NEXT"]. non_adherence_distribution: Non adherence probability value(s) assigned to the corresponding options in non_adherence_options. There must be one value in this list for each value in non_adherence_options. The sum of these values must equal 1.0. max_dose_consideration_duration: Maximum number of days that an individual will consider taking the doses of the drug. took_dose_event: Event that gets sent out every time a dose is taken. intervention_name: The optional name used to refer to this intervention as a means to differentiate it from others that use the same class. Default is AdeherentDrug_drug1_drug2 in alphabetical order. Returns: Configured **AdherentDrug** class dictionary """ # built-in default so we can run this function by just putting in the config builder. waning_map = s2c.get_class_with_defaults("WaningEffectMapCount", campaign.schema_path) waning_map.Initial_Effect = 1 if not doses: doses = [["Sulfadoxine", "Pyrimethamine", 'Amodiaquine'], ['Amodiaquine'], ['Amodiaquine']] inferred_times = [x + 1 for x in range(len(doses))] if not adherence_values: adherence_values = [1, 1, 1] # the default is for person to take everything every dose waning_map.Durability_Map.Times = inferred_times waning_map.Durability_Map.Values = adherence_values if len(adherence_values) != len(inferred_times): raise ValueError(f"Length of 'adherence_values' parameter ({len(adherence_values)}) does not match the " f"length of 'doses' ({len(doses)}). These need to be the same as we are defining the " f"probabilities of taking each dose.\n") if not non_adherence_options: non_adherence_options = ["NEXT_UPDATE"] if not non_adherence_distribution: non_adherence_distribution = [1] adherent_drug = s2c.get_class_with_defaults("AdherentDrug", campaign.schema_path) adherent_drug.Cost_To_Consumer = cost adherent_drug.Doses = doses adherent_drug.Dose_Interval = dose_interval adherent_drug.Adherence_Config = waning_map adherent_drug.Non_Adherence_Options = non_adherence_options adherent_drug.Non_Adherence_Distribution = non_adherence_distribution adherent_drug.Max_Dose_Consideration_Duration = max_dose_consideration_duration adherent_drug.Took_Dose_Event = campaign.get_send_trigger(took_dose_event, old=True) if not intervention_name: all_drugs = [] for day in doses: for drug in day: all_drugs.append(drug) all_drugs = sorted(list(set(all_drugs))) intervention_name = "AdherentDrug" for drug in all_drugs: intervention_name = intervention_name + "_" + drug adherent_drug.Intervention_Name = intervention_name return adherent_drug