From 61be4a57f56f2c2ec7dc42d62121d85886c9ea27 Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Fri, 17 Sep 2021 14:46:45 +0200 Subject: [PATCH] Updated infected probability with f_inf that considers the host immunity and the viable-to-RNA distribution --- cara/models.py | 15 +++++++++++++-- cara/monte_carlo/data.py | 6 ++++++ cara/tests/models/test_concentration_model.py | 1 + cara/tests/models/test_exposure_model.py | 1 + cara/tests/test_infected_population.py | 1 + 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/cara/models.py b/cara/models.py index 7b5d034d..410c48e3 100644 --- a/cara/models.py +++ b/cara/models.py @@ -429,6 +429,9 @@ class Virus: #: Dose to initiate infection, in RNA copies infectious_dose: _VectorisedFloat + #: viable-to-RNA virus ratio as a function of the viral load + viable_to_RNA: _VectorisedFloat + #: Pre-populated examples of Viruses. types: typing.ClassVar[typing.Dict[str, "Virus"]] @@ -465,19 +468,23 @@ Virus.types = { # as per https://www.dhs.gov/publication/st-master-question-list-covid-19 # 50 comes from Buonanno et al. infectious_dose=50., + viable_to_RNA = 0.5, ), 'SARS_CoV_2_B117': SARSCoV2( # also called VOC-202012/01 viral_load_in_sputum=1e9, infectious_dose=30., + viable_to_RNA = 0.5, ), 'SARS_CoV_2_P1': SARSCoV2( viral_load_in_sputum=1e9, infectious_dose=1/0.045, + viable_to_RNA = 0.5, ), 'SARS_CoV_2_B16172': SARSCoV2( viral_load_in_sputum=1e9, infectious_dose=30/1.6, + viable_to_RNA = 0.5, ), } @@ -706,6 +713,9 @@ class InfectedPopulation(_PopulationWithVirus): #: The type of expiration that is being emitted whilst doing the activity. expiration: _ExpirationBase + #: The percentage of host immunity + host_immunity: float = 0. + @method_cache def emission_rate_when_present(self) -> _VectorisedFloat: """ @@ -962,9 +972,10 @@ class ExposureModel: inf_aero = ( self.exposed.activity.inhalation_rate * (1 - self.exposed.mask.inhale_efficiency()) * - exposure * self.fraction_deposited + exposure * self.fraction_deposited * + (self.concentration_model.infected.virus.viable_to_RNA * (1 - self.concentration_model.infected.host_immunity)) ) - + # Probability of infection. return (1 - np.exp(-(inf_aero/self.concentration_model.virus.infectious_dose))) * 100 diff --git a/cara/monte_carlo/data.py b/cara/monte_carlo/data.py index 71498ee0..1ecb25a1 100644 --- a/cara/monte_carlo/data.py +++ b/cara/monte_carlo/data.py @@ -99,24 +99,30 @@ symptomatic_vl_frequencies = LogCustomKernel( kernel_bandwidth=0.1 ) +# From https://doi.org/10.1093/cid/ciaa1579 +infectious_virus_distribution = Uniform(0.15, 0.45) # From CERN-OPEN-2021-04 and refererences therein virus_distributions = { 'SARS_CoV_2': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=100, + viable_to_RNA=infectious_virus_distribution, ), 'SARS_CoV_2_B117': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=60, + viable_to_RNA=infectious_virus_distribution, ), 'SARS_CoV_2_P1': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=100/2.25, + viable_to_RNA=infectious_virus_distribution, ), 'SARS_CoV_2_B16172': mc.SARSCoV2( viral_load_in_sputum=symptomatic_vl_frequencies, infectious_dose=60/1.6, + viable_to_RNA=infectious_virus_distribution, ), } diff --git a/cara/tests/models/test_concentration_model.py b/cara/tests/models/test_concentration_model.py index 7437f41d..117f00d5 100644 --- a/cara/tests/models/test_concentration_model.py +++ b/cara/tests/models/test_concentration_model.py @@ -42,6 +42,7 @@ def test_concentration_model_vectorisation(override_params): virus=models.SARSCoV2( viral_load_in_sputum=defaults['viral_load_in_sputum'], infectious_dose=50., + viable_to_RNA = 0.5, ), expiration=models._ExpirationBase.types['Breathing'], ) diff --git a/cara/tests/models/test_exposure_model.py b/cara/tests/models/test_exposure_model.py index ac82dae3..98d4e361 100644 --- a/cara/tests/models/test_exposure_model.py +++ b/cara/tests/models/test_exposure_model.py @@ -190,6 +190,7 @@ def test_infectious_dose_vectorisation(): virus=models.SARSCoV2( viral_load_in_sputum=1e9, infectious_dose=np.array([50, 20, 30]), + viable_to_RNA = 0.5, ), expiration=models.Expiration.types['Talking'] ) diff --git a/cara/tests/test_infected_population.py b/cara/tests/test_infected_population.py index 13467f9f..9f7b06ab 100644 --- a/cara/tests/test_infected_population.py +++ b/cara/tests/test_infected_population.py @@ -32,6 +32,7 @@ def test_infected_population_vectorisation(override_params): virus=cara.models.Virus( viral_load_in_sputum=defaults['viral_load_in_sputum'], infectious_dose=50., + viable_to_RNA = 0.5, ), expiration=cara.models._ExpirationBase.types['Breathing'], )