Source code for pyEpiabm.property.place_foi

#
# Calculate place force of infection based on Covidsim code
#

from pyEpiabm.core import Parameters

from .personal_foi import PersonalInfection


[docs] class PlaceInfection: """Class to calculate the infectiousness and susceptibility parameters for the force of infection parameter, within places. """
[docs] @staticmethod def place_inf(place, infector, time: float): """Calculate the infectiousness of a place. Does not include interventions such as isolation, or whether individual is a carehome resident. Does not yet differentiate between places as we have not decided which places to implement, and what transmission to give them. Parameters ---------- place : Place Place infector : Person Infectious person time : float Current simulation time Returns ------- float Infectiousness parameter of place """ params = Parameters.instance().place_params transmission = params["place_transmission"] place_idx = place.place_type.value - 1 try: num_groups = params["mean_group_size"][place_idx] except IndexError: # For place types not in parameters num_groups = 1 # Use group-wise capacity not max_capacity once implemented place_inf = 0 if ((hasattr(infector.microcell, 'closure_start_time')) ) and (infector.is_place_closed( Parameters.instance().intervention_params[ 'place_closure']['closure_place_type'])) and ( infector.microcell.closure_start_time <= time ) else \ (transmission / num_groups * PersonalInfection.person_inf(infector, time)) return place_inf
[docs] @staticmethod def place_susc(place, infectee, time: float): """Calculate the susceptibility of a place. Intervention parameters are based on the microcell properties of the infectee. Does not include interventions such as isolation, or whether individual is a carehome resident. Parameters ---------- infectee : Person Infectee place : Place Place time : float Current simulation time Returns ------- float Susceptibility parameter of place """ place_susc = PersonalInfection.person_susc(infectee, time) place_idx = place.place_type.value - 1 if (hasattr(infectee.microcell, 'distancing_start_time')) and ( infectee.microcell.distancing_start_time is not None) and ( infectee.microcell.distancing_start_time <= time): if (hasattr(infectee, 'distancing_enhanced')) and ( infectee.distancing_enhanced is True): place_susc *= Parameters.instance().\ intervention_params[ 'social_distancing'][ 'distancing_place_enhanced_susc'][place_idx] else: place_susc *= Parameters.instance().\ intervention_params[ 'social_distancing'][ 'distancing_place_susc'][place_idx] return place_susc
[docs] @staticmethod def place_foi(place, infector, infectee, time: float): """Calculate the force of infection of a place, for a particular infector and infectee. Parameters ---------- infector : Person Infector infectee : Person Infectee place : Place Place time : float Current simulation time Returns ------- float Force of infection parameter of place """ carehome_scale_susc = 1 if place.place_type.value == 5 and (infectee.key_worker or infector.key_worker): carehome_scale_susc = Parameters.instance()\ .carehome_params["carehome_worker_group_scaling"] travel_isolation_scale = Parameters.instance().\ intervention_params['travel_isolation']['isolation' '_effectiveness'] \ if (hasattr(infector, 'travel_isolation_start_time')) and ( infector.travel_isolation_start_time is not None) and ( infector.travel_isolation_start_time <= time) else 1 isolation_scale = Parameters.instance().\ intervention_params['case_isolation']['isolation_effectiveness']\ if (hasattr(infector, 'isolation_start_time')) and ( infector.isolation_start_time is not None) and ( infector.isolation_start_time <= time) else 1 place_idx = place.place_type.value - 1 quarantine_scale = Parameters.instance().\ intervention_params['household_quarantine'][ 'quarantine_place_effectiveness'][place_idx]\ if (hasattr(infectee, 'quarantine_start_time')) and ( infectee.quarantine_start_time is not None) and ( infectee.quarantine_start_time <= time) else 1 # Dominant interventions: 1) travel_isolate; 2) case_isolate; isolation_scale_inf = 1 if travel_isolation_scale != 1: isolation_scale_inf = travel_isolation_scale elif isolation_scale != 1: isolation_scale_inf = isolation_scale infectiousness = (PlaceInfection.place_inf(place, infector, time) * isolation_scale_inf * quarantine_scale) susceptibility = (PlaceInfection.place_susc(place, infectee, time) * carehome_scale_susc * quarantine_scale) return (infectiousness * susceptibility)