From 364f20930e6c60553d1b16af17769688b44d167f Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Mon, 20 Sep 2021 15:06:35 +0200 Subject: [PATCH] Changed P(I) formula and added host immunity for exposed Population Fixed values for viable_to_RNA_ratio and transmissibility_factor of each Virus variant Updated probability of infection formula --- cara/apps/calculator/model_generator.py | 1 + cara/apps/expert.py | 1 + cara/models.py | 36 ++++++++++++++----------- cara/monte_carlo/data.py | 8 +++--- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/cara/apps/calculator/model_generator.py b/cara/apps/calculator/model_generator.py index 1a7712d9..6e4a5527 100644 --- a/cara/apps/calculator/model_generator.py +++ b/cara/apps/calculator/model_generator.py @@ -449,6 +449,7 @@ class FormData: presence=self.exposed_present_interval(), activity=activity, mask=self.mask(), + host_immunity=0., ) return exposed diff --git a/cara/apps/expert.py b/cara/apps/expert.py index 10a38501..b06c8702 100644 --- a/cara/apps/expert.py +++ b/cara/apps/expert.py @@ -507,6 +507,7 @@ baseline_model = models.ExposureModel( presence=models.SpecificInterval(((8., 12.), (13., 17.))), activity=models.Activity.types['Seated'], mask=models.Mask.types['No mask'], + host_immunity=0., ), ) diff --git a/cara/models.py b/cara/models.py index 35e5d6b7..157eb256 100644 --- a/cara/models.py +++ b/cara/models.py @@ -50,6 +50,7 @@ from .utils import method_cache from .dataclass_utils import nested_replace +oneoverln2 = 1 / np.log(2) # Define types for items supporting vectorisation. In the future this may be replaced # by ``np.ndarray[]`` once/if that syntax is supported. Note that vectorization @@ -433,7 +434,7 @@ class Virus: viable_to_RNA_ratio: _VectorisedFloat #: Reported increase of transmissibility of a VOC - transmissibility_VOC: float + transmissibility_factor: float #: Pre-populated examples of Viruses. types: typing.ClassVar[typing.Dict[str, "Virus"]] @@ -472,26 +473,26 @@ Virus.types = { # 50 comes from Buonanno et al. infectious_dose=50., viable_to_RNA_ratio = 0.5, - transmissibility_VOC=1.0, + transmissibility_factor=1.0, ), 'SARS_CoV_2_B117': SARSCoV2( # also called VOC-202012/01 viral_load_in_sputum=1e9, - infectious_dose=30., + infectious_dose=50., viable_to_RNA_ratio = 0.5, - transmissibility_VOC=0.6, + transmissibility_factor=0.6, ), 'SARS_CoV_2_P1': SARSCoV2( viral_load_in_sputum=1e9, - infectious_dose=1/0.045, + infectious_dose=50., viable_to_RNA_ratio = 0.5, - transmissibility_VOC=0.45, + transmissibility_factor=0.45, ), 'SARS_CoV_2_B16172': SARSCoV2( viral_load_in_sputum=1e9, - infectious_dose=30/1.6, + infectious_dose=50., viable_to_RNA_ratio = 0.5, - transmissibility_VOC=0.38, + transmissibility_factor=0.38, ), } @@ -667,6 +668,11 @@ class Population: #: The physical activity being carried out by the people. activity: Activity + #: The ratio of virions that are inactivated by the person's immunity. + # This parameter considers the potential antibodies in the person, + # which might render inactive some RNA copies (virions). + host_immunity: float + def person_present(self, time): return self.presence.triggered(time) @@ -726,12 +732,7 @@ class EmittingPopulation(_PopulationWithVirus): @dataclass(frozen=True) class InfectedPopulation(_PopulationWithVirus): #: The type of expiration that is being emitted whilst doing the activity. - expiration: _ExpirationBase - - #: The ratio of virions that are inactivated by the infected person's immunity. - # This parameter considers the potential antibodies in the infected person, - # which might render inactive some RNA copies (virions). - host_immunity: _VectorisedFloat + expiration: _ExpirationBase @method_cache def fraction_of_infectious_virus(self) -> _VectorisedFloat: @@ -1002,10 +1003,13 @@ class ExposureModel: exposure * self.fraction_deposited * f_inf ) - infectious_dose = 1.44 * self.concentration_model.virus.infectious_dose * self.concentration_model.virus.transmissibility_VOC * (1 / (1 - self.concentration_model.infected.host_immunity)) + # oneoverln2 multiplied by ID_50 corresponds to ID_63. + infectious_dose = oneoverln2 * self.concentration_model.virus.infectious_dose # Probability of infection. - return (1 - np.exp(-(inf_aero/infectious_dose))) * 100 + return (1 - np.exp(-((inf_aero * (1 - self.exposed.host_immunity))/(infectious_dose * + self.concentration_model.virus.transmissibility_factor)))) * 100 + def expected_new_cases(self) -> _VectorisedFloat: prob = self.infection_probability() diff --git a/cara/monte_carlo/data.py b/cara/monte_carlo/data.py index f9f3c92c..115020f6 100644 --- a/cara/monte_carlo/data.py +++ b/cara/monte_carlo/data.py @@ -111,25 +111,25 @@ virus_distributions = { viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=infectious_dose_distribution, viable_to_RNA_ratio=viable_to_RNA_ratio_distribution, - transmissibility_VOC=1., + transmissibility_factor=1., ), 'SARS_CoV_2_B117': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=infectious_dose_distribution, viable_to_RNA_ratio=viable_to_RNA_ratio_distribution, - transmissibility_VOC=0.6, + transmissibility_factor=0.6, ), 'SARS_CoV_2_P1': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=infectious_dose_distribution, viable_to_RNA_ratio=viable_to_RNA_ratio_distribution, - transmissibility_VOC=0.45, + transmissibility_factor=0.45, ), 'SARS_CoV_2_B16172': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=infectious_dose_distribution, viable_to_RNA_ratio=viable_to_RNA_ratio_distribution, - transmissibility_VOC=0.38, + transmissibility_factor=0.38, ), }