From c02737cf92b3373050aa9a0ca576aa85b8c8d92c Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Thu, 7 Mar 2024 16:44:31 +0100 Subject: [PATCH] updated schema to reflect v2.0.0 --- .../apps/calculator/co2_model_generator.py | 2 +- caimira/apps/calculator/model_generator.py | 10 +- caimira/apps/calculator/report_generator.py | 10 +- caimira/models.py | 12 +- caimira/monte_carlo/data.py | 58 +-- caimira/store/data_registry.py | 406 ++++++++---------- 6 files changed, 236 insertions(+), 262 deletions(-) diff --git a/caimira/apps/calculator/co2_model_generator.py b/caimira/apps/calculator/co2_model_generator.py index e2584256..a4a6a9c2 100644 --- a/caimira/apps/calculator/co2_model_generator.py +++ b/caimira/apps/calculator/co2_model_generator.py @@ -159,7 +159,7 @@ class CO2FormData(FormData): return tuple((self.CO2_data['times'][0], self.CO2_data['times'][-1])) def build_model(self, size=None) -> models.CO2DataModel: # type: ignore - size = size or self.data_registry.monte_carlo_sample_size + size = size or self.data_registry.monte_carlo['sample_size'] # Build a simple infected and exposed population for the case when presence # intervals and number of people are dynamic. Activity type is not needed. infected_presence = self.infected_present_interval() diff --git a/caimira/apps/calculator/model_generator.py b/caimira/apps/calculator/model_generator.py index 5d6e1a34..69c198dd 100644 --- a/caimira/apps/calculator/model_generator.py +++ b/caimira/apps/calculator/model_generator.py @@ -200,10 +200,10 @@ class VirusFormData(FormData): if self.arve_sensors_option == False: if self.room_heating_option: - humidity = self.data_registry.room['defaults']['humidity_with_heating'] + humidity = self.data_registry.room['humidity_with_heating'] else: - humidity = self.data_registry.room['defaults']['humidity_without_heating'] - inside_temp = self.data_registry.room['defaults']['inside_temp'] + humidity = self.data_registry.room['humidity_without_heating'] + inside_temp = self.data_registry.room['inside_temp'] else: humidity = float(self.humidity) inside_temp = self.inside_temp @@ -245,11 +245,11 @@ class VirusFormData(FormData): ) def build_model(self, sample_size=None) -> models.ExposureModel: - sample_size = sample_size or self.data_registry.monte_carlo_sample_size + sample_size = sample_size or self.data_registry.monte_carlo['sample_size'] return self.build_mc_model().build_model(size=sample_size) def build_CO2_model(self, sample_size=None) -> models.CO2ConcentrationModel: - sample_size = sample_size or self.data_registry.monte_carlo_sample_size + sample_size = sample_size or self.data_registry.monte_carlo['sample_size'] infected_population: models.InfectedPopulation = self.infected_population().build_model(sample_size) exposed_population: models.Population = self.exposed_population().build_model(sample_size) diff --git a/caimira/apps/calculator/report_generator.py b/caimira/apps/calculator/report_generator.py index 8ae92987..53f67249 100644 --- a/caimira/apps/calculator/report_generator.py +++ b/caimira/apps/calculator/report_generator.py @@ -233,8 +233,8 @@ def conditional_prob_inf_given_vl_dist( for vl_log in viral_loads: specific_prob = infection_probability[np.where((vl_log-step/2-specific_vl)*(vl_log+step/2-specific_vl)<0)[0]] #type: ignore pi_means.append(specific_prob.mean()) - lower_percentiles.append(np.quantile(specific_prob, data_registry.conditional_prob_inf_given_viral_load['lower_percentile'])) - upper_percentiles.append(np.quantile(specific_prob, data_registry.conditional_prob_inf_given_viral_load['upper_percentile'])) + lower_percentiles.append(np.quantile(specific_prob, 0.05)) + upper_percentiles.append(np.quantile(specific_prob, 0.95)) return pi_means, lower_percentiles, upper_percentiles @@ -245,8 +245,8 @@ def manufacture_conditional_probability_data( ): data_registry: DataRegistry = exposure_model.data_registry - min_vl = data_registry.conditional_prob_inf_given_viral_load['min_vl'] - max_vl = data_registry.conditional_prob_inf_given_viral_load['max_vl'] + min_vl = 2 + max_vl = 10 step = (max_vl - min_vl)/100 viral_loads = np.arange(min_vl, max_vl, step) specific_vl = np.log10(exposure_model.concentration_model.virus.viral_load_in_sputum) @@ -442,7 +442,7 @@ def scenario_statistics( sample_times: typing.List[float], compute_prob_exposure: bool ): - model = mc_model.build_model(size=mc_model.data_registry.monte_carlo_sample_size) + model = mc_model.build_model(size=mc_model.data_registry.monte_carlo['sample_size']) if (compute_prob_exposure): # It means we have data to calculate the total_probability_rule prob_probabilistic_exposure = model.total_probability_rule() diff --git a/caimira/models.py b/caimira/models.py index 441b70ff..b06c9d9b 100644 --- a/caimira/models.py +++ b/caimira/models.py @@ -879,7 +879,7 @@ class _PopulationWithVirus(Population): The fraction of infectious virus. """ - return self.data_registry.population_with_virus['fraction_of_infectious_virus'] # type: ignore + return 1 def aerosols(self): """ @@ -1052,7 +1052,7 @@ class _ConcentrationModelBase: (in the same unit as the concentration). Its the value towards which the concentration will decay to. """ - return self.data_registry.concentration_model['min_background_concentration'] # type: ignore + return self.data_registry.concentration_model['virus_concentration_model']['min_background_concentration'] # type: ignore def normalization_factor(self) -> _VectorisedFloat: """ @@ -1242,7 +1242,7 @@ class ConcentrationModel(_ConcentrationModelBase): def __post_init__(self): if self.evaporation_factor is None: - self.evaporation_factor = self.data_registry.particle['evaporation_factor'] + self.evaporation_factor = self.data_registry.expiration_particle['particle']['evaporation_factor'] @property def population(self) -> InfectedPopulation: @@ -1335,7 +1335,7 @@ class ShortRangeModel: ''' The dilution factor for the respective expiratory activity type. ''' - _dilution_factor = self.data_registry.short_range_model['dilution_factor'] + _dilution_factor = self.data_registry.short_range_model['dilution_factor'] # Average mouth opening diameter (m) mouth_diameter: float = _dilution_factor['mouth_diameter'] # type: ignore @@ -1359,7 +1359,7 @@ class ShortRangeModel: tstar: float = _dilution_factor['tstar'] # type: ignore # Streamwise and radial penetration coefficients - _df_pc = _dilution_factor['penetration_coefficients'] + _df_pc = _dilution_factor['penetration_coefficients'] # type: ignore 𝛽r1: float = _df_pc['𝛽r1'] # type: ignore 𝛽r2: float = _df_pc['𝛽r2'] # type: ignore 𝛽x1: float = _df_pc['𝛽x1'] # type: ignore @@ -1585,7 +1585,7 @@ class ExposureModel: #: The number of times the exposure event is repeated (default 1). @property def repeats(self) -> int: - return self.data_registry.exposure_model['repeats'] # type: ignore + return 1 def __post_init__(self): """ diff --git a/caimira/monte_carlo/data.py b/caimira/monte_carlo/data.py index d82970aa..feac2368 100644 --- a/caimira/monte_carlo/data.py +++ b/caimira/monte_carlo/data.py @@ -148,21 +148,21 @@ class BLOmodel: # total concentration of aerosols for each mode. @property def cn(self) -> typing.Tuple[float, float, float]: - _cn = self.data_registry.BLOmodel['cn'] + _cn = self.data_registry.expiration_particle['BLOmodel']['cn'] # type: ignore return (_cn['B'],_cn['L'],_cn['O']) # Mean of the underlying normal distributions (represents the log of a # diameter in microns), for resp. the B, L and O modes. @property def mu(self) -> typing.Tuple[float, float, float]: - _mu = self.data_registry.BLOmodel['mu'] + _mu = self.data_registry.expiration_particle['BLOmodel']['mu'] # type: ignore return (_mu['B'], _mu['L'], _mu['O']) # Std deviation of the underlying normal distribution, for resp. # the B, L and O modes. @property def sigma(self) -> typing.Tuple[float, float, float]: - _sigma = self.data_registry.BLOmodel['sigma'] + _sigma = self.data_registry.expiration_particle['BLOmodel']['sigma'] # type: ignore return (_sigma['B'],_sigma['L'],_sigma['O']) def distribution(self, d): @@ -250,51 +250,51 @@ symptomatic_vl_frequencies = LogCustomKernel( def viral_load(data_registry): return np.linspace( weibull_min.ppf( - data_registry.covid_overal_vl_data['start'], - c=data_registry.covid_overal_vl_data['shape_factor'], - scale=data_registry.covid_overal_vl_data['scale_factor'] + data_registry.virological_data['covid_overal_vl_data']['start'], + c=data_registry.virological_data['covid_overal_vl_data']['shape_factor'], + scale=data_registry.virological_data['covid_overal_vl_data']['scale_factor'] ), weibull_min.ppf( - data_registry.covid_overal_vl_data['stop'], - c=data_registry.covid_overal_vl_data['shape_factor'], - scale=data_registry.covid_overal_vl_data['scale_factor'] + data_registry.virological_data['covid_overal_vl_data']['stop'], + c=data_registry.virological_data['covid_overal_vl_data']['shape_factor'], + scale=data_registry.virological_data['covid_overal_vl_data']['scale_factor'] ), - int(data_registry.covid_overal_vl_data['num']) + int(data_registry.virological_data['covid_overal_vl_data']['num']) ) def frequencies_pdf(data_registry): return weibull_min.pdf( viral_load(data_registry), - c=data_registry.covid_overal_vl_data['shape_factor'], - scale=data_registry.covid_overal_vl_data['scale_factor'] + c=data_registry.virological_data['covid_overal_vl_data']['shape_factor'], + scale=data_registry.virological_data['covid_overal_vl_data']['scale_factor'] ) def covid_overal_vl_data(data_registry): return LogCustom( - bounds=(data_registry.covid_overal_vl_data['min_bound'], data_registry.covid_overal_vl_data['max_bound']), + bounds=(data_registry.virological_data['covid_overal_vl_data']['min_bound'], data_registry.virological_data['covid_overal_vl_data']['max_bound']), function=lambda d: np.interp( d, viral_load(data_registry), frequencies_pdf(data_registry), - data_registry.covid_overal_vl_data['interpolation_fp_left'], - data_registry.covid_overal_vl_data['interpolation_fp_right'] + data_registry.virological_data['covid_overal_vl_data']['interpolation_fp_left'], + data_registry.virological_data['covid_overal_vl_data']['interpolation_fp_right'] ), - max_function=data_registry.covid_overal_vl_data['max_function'] + max_function=data_registry.virological_data['covid_overal_vl_data']['max_function'] ) # Derived from data in doi.org/10.1016/j.ijid.2020.09.025 and # https://iosh.com/media/8432/aerosol-infection-risk-hospital-patient-care-full-report.pdf (page 60) def viable_to_RNA_ratio_distribution(data_registry): - return Uniform(data_registry.viable_to_RNA_ratio_distribution['low'], data_registry.viable_to_RNA_ratio_distribution['high']) + return Uniform(data_registry.virological_data['viable_to_RNA_ratio_distribution']['low'], data_registry.virological_data['viable_to_RNA_ratio_distribution']['high']) # From discussion with virologists def infectious_dose_distribution(data_registry): - return Uniform(data_registry.infectious_dose_distribution['low'], data_registry.infectious_dose_distribution['high']) + return Uniform(data_registry.virological_data['infectious_dose_distribution']['low'], data_registry.virological_data['infectious_dose_distribution']['high']) # From https://doi.org/10.1101/2021.10.14.21264988 and references therein def virus_distributions(data_registry): - vd = data_registry.virus_distributions + vd = data_registry.virological_data['virus_distributions'] return { 'SARS_CoV_2': mc.SARSCoV2( viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2']['viral_load_in_sputum'], data_registry), @@ -392,10 +392,10 @@ def expiration_distribution( def expiration_BLO_factors(data_registry): - breathing = data_registry.expiration_BLO_factors['Breathing'] - speaking = data_registry.expiration_BLO_factors['Speaking'] - singing = data_registry.expiration_BLO_factors['Singing'] - shouting = data_registry.expiration_BLO_factors['Shouting'] + breathing = data_registry.expiration_particle['expiration_BLO_factors']['Breathing'] + speaking = data_registry.expiration_particle['expiration_BLO_factors']['Speaking'] + singing = data_registry.expiration_particle['expiration_BLO_factors']['Singing'] + shouting = data_registry.expiration_particle['expiration_BLO_factors']['Shouting'] return { 'Breathing': ( param_evaluation(breathing, 'B'), @@ -425,8 +425,8 @@ def expiration_distributions(data_registry): exp_type: expiration_distribution( data_registry=data_registry, BLO_factors=BLO_factors, - d_min=param_evaluation(data_registry.long_range_expiration_distributions, 'minimum_diameter'), - d_max=param_evaluation(data_registry.long_range_expiration_distributions, 'maximum_diameter') + d_min=param_evaluation(data_registry.expiration_particle['long_range_expiration_distributions'], 'minimum_diameter'), + d_max=param_evaluation(data_registry.expiration_particle['long_range_expiration_distributions'], 'maximum_diameter') ) for exp_type, BLO_factors in expiration_BLO_factors(data_registry).items() } @@ -437,8 +437,8 @@ def short_range_expiration_distributions(data_registry): exp_type: expiration_distribution( data_registry=data_registry, BLO_factors=BLO_factors, - d_min=param_evaluation(data_registry.short_range_expiration_distributions, 'minimum_diameter'), - d_max=param_evaluation(data_registry.short_range_expiration_distributions, 'maximum_diameter') + d_min=param_evaluation(data_registry.expiration_particle['short_range_expiration_distributions'], 'minimum_diameter'), + d_max=param_evaluation(data_registry.expiration_particle['short_range_expiration_distributions'], 'maximum_diameter') ) for exp_type, BLO_factors in expiration_BLO_factors(data_registry).items() } @@ -452,8 +452,8 @@ frequencies = np.array((0.0598036, 0.0946154, 0.1299152, 0.1064905, 0.1099066, 0 def short_range_distances(data_registry): return Custom( bounds=( - param_evaluation(data_registry.short_range_distances, 'minimum_distance'), - param_evaluation(data_registry.short_range_distances, 'maximum_distance') + param_evaluation(data_registry.short_range_model['conversational_distance'], 'minimum_distance'), + param_evaluation(data_registry.short_range_model['conversational_distance'], 'maximum_distance') ), function=lambda x: np.interp(x, distances, frequencies, left=0., right=0.), max_function=0.13 diff --git a/caimira/store/data_registry.py b/caimira/store/data_registry.py index cced1032..eb5759f3 100644 --- a/caimira/store/data_registry.py +++ b/caimira/store/data_registry.py @@ -6,23 +6,31 @@ class DataRegistry: version = None - BLOmodel = { - "cn": { - "B": 0.06, - "L": 0.2, - "O": 0.0010008, + expiration_particle = { + "long_range_expiration_distributions": { + "minimum_diameter": 0.1, + "maximum_diameter": 30, }, - "mu": { - "B": 0.989541, - "L": 1.38629, - "O": 4.97673, + "short_range_expiration_distributions": { + "minimum_diameter": 0.1, + "maximum_diameter": 100, }, - "sigma": { - "B": 0.262364, - "L": 0.506818, - "O": 0.585005, + "BLOmodel": { + "cn": {"B": 0.06, "L": 0.2, "O": 0.0010008}, + "mu": {"B": 0.989541, "L": 1.38629, "O": 4.97673}, + "sigma": {"B": 0.262364, "L": 0.506818, "O": 0.585005}, }, + "expiration_BLO_factors": { + "Breathing": {"B": 1., "L": 0., "O": 0., }, + "Speaking": {"B": 1., "L": 1., "O": 1., }, + "Singing": {"B": 1., "L": 5., "O": 5., }, + "Shouting": {"B": 1., "L": 5., "O": 5., }, + }, + "particle": { + "evaporation_factor": 0.3, + } } + activity_distributions = { "Seated": { "inhalation_rate": { @@ -105,160 +113,164 @@ class DataRegistry: }, }, } - symptomatic_vl_frequencies = { - "log_variable": [ - 2.46032, - 2.67431, - 2.85434, - 3.06155, - 3.25856, - 3.47256, - 3.66957, - 3.85979, - 4.09927, - 4.27081, - 4.47631, - 4.66653, - 4.87204, - 5.10302, - 5.27456, - 5.46478, - 5.6533, - 5.88428, - 6.07281, - 6.30549, - 6.48552, - 6.64856, - 6.85407, - 7.10373, - 7.30075, - 7.47229, - 7.66081, - 7.85782, - 8.05653, - 8.27053, - 8.48453, - 8.65607, - 8.90573, - 9.06878, - 9.27429, - 9.473, - 9.66152, - 9.87552, - ], - "frequencies": [ - 0.001206885, - 0.007851618, - 0.008078144, - 0.01502491, - 0.013258014, - 0.018528495, - 0.020053765, - 0.021896167, - 0.022047184, - 0.018604005, - 0.01547796, - 0.018075445, - 0.021503523, - 0.022349217, - 0.025097721, - 0.032875078, - 0.030594727, - 0.032573045, - 0.034717482, - 0.034792991, - 0.033267721, - 0.042887485, - 0.036846816, - 0.03876473, - 0.045016819, - 0.040063473, - 0.04883754, - 0.043944602, - 0.048142864, - 0.041588741, - 0.048762031, - 0.027921732, - 0.033871788, - 0.022122693, - 0.016927718, - 0.008833228, - 0.00478598, - 0.002807662, - ], - "kernel_bandwidth": 0.1, - } - covid_overal_vl_data = { - "shape_factor": 3.47, - "scale_factor": 7.01, - "start": 0.01, - "stop": 0.99, - "num": 30.0, - "min_bound": 2, - "max_bound": 10, - "interpolation_fp_left": 0, - "interpolation_fp_right": 0, - "max_function": 0.2, - } - viable_to_RNA_ratio_distribution = { - "low": 0.01, - "high": 0.6, - } - infectious_dose_distribution = { - "low": 10, - "high": 100, - } - virus_distributions = { - "SARS_CoV_2": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 1, - "infectiousness_days": 14, + + virological_data = { + "symptomatic_vl_frequencies": { + "log_variable": [ + 2.46032, + 2.67431, + 2.85434, + 3.06155, + 3.25856, + 3.47256, + 3.66957, + 3.85979, + 4.09927, + 4.27081, + 4.47631, + 4.66653, + 4.87204, + 5.10302, + 5.27456, + 5.46478, + 5.6533, + 5.88428, + 6.07281, + 6.30549, + 6.48552, + 6.64856, + 6.85407, + 7.10373, + 7.30075, + 7.47229, + 7.66081, + 7.85782, + 8.05653, + 8.27053, + 8.48453, + 8.65607, + 8.90573, + 9.06878, + 9.27429, + 9.473, + 9.66152, + 9.87552, + ], + "frequencies": [ + 0.001206885, + 0.007851618, + 0.008078144, + 0.01502491, + 0.013258014, + 0.018528495, + 0.020053765, + 0.021896167, + 0.022047184, + 0.018604005, + 0.01547796, + 0.018075445, + 0.021503523, + 0.022349217, + 0.025097721, + 0.032875078, + 0.030594727, + 0.032573045, + 0.034717482, + 0.034792991, + 0.033267721, + 0.042887485, + 0.036846816, + 0.03876473, + 0.045016819, + 0.040063473, + 0.04883754, + 0.043944602, + 0.048142864, + 0.041588741, + 0.048762031, + 0.027921732, + 0.033871788, + 0.022122693, + 0.016927718, + 0.008833228, + 0.00478598, + 0.002807662, + ], + "kernel_bandwidth": 0.1, }, - "SARS_CoV_2_ALPHA": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 0.78, - "infectiousness_days": 14, + 'covid_overal_vl_data': { + "shape_factor": 3.47, + "scale_factor": 7.01, + "start": 0.01, + "stop": 0.99, + "num": 30.0, + "min_bound": 2, + "max_bound": 10, + "interpolation_fp_left": 0, + "interpolation_fp_right": 0, + "max_function": 0.2, }, - "SARS_CoV_2_BETA": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 0.8, - "infectiousness_days": 14, + "viable_to_RNA_ratio_distribution": { + "low": 0.01, + "high": 0.6, }, - "SARS_CoV_2_GAMMA": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 0.72, - "infectiousness_days": 14, + "infectious_dose_distribution": { + "low": 10, + "high": 100, }, - "SARS_CoV_2_DELTA": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 0.51, - "infectiousness_days": 14, - }, - "SARS_CoV_2_OMICRON": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 0.2, - "infectiousness_days": 14, - }, - "SARS_CoV_2_Other": { - "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, - "infectious_dose": InfectiousDoses.DISTRIBUTION.value, - "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, - "transmissibility_factor": 0.1, - "infectiousness_days": 14, + "virus_distributions": { + "SARS_CoV_2": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 1, + "infectiousness_days": 14, + }, + "SARS_CoV_2_ALPHA": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 0.78, + "infectiousness_days": 14, + }, + "SARS_CoV_2_BETA": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 0.8, + "infectiousness_days": 14, + }, + "SARS_CoV_2_GAMMA": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 0.72, + "infectiousness_days": 14, + }, + "SARS_CoV_2_DELTA": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 0.51, + "infectiousness_days": 14, + }, + "SARS_CoV_2_OMICRON": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 0.2, + "infectiousness_days": 14, + }, + "SARS_CoV_2_Other": { + "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, + "infectious_dose": InfectiousDoses.DISTRIBUTION.value, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION.value, + "transmissibility_factor": 0.1, + "infectiousness_days": 14, + }, }, } + mask_distributions = { "Type I": { "η_inhale": { @@ -301,50 +313,15 @@ class DataRegistry: "factor_exhale": 1, }, } - expiration_BLO_factors = { - "Breathing": { - "B": 1.0, - "L": 0.0, - "O": 0.0, - }, - "Speaking": { - "B": 1.0, - "L": 1.0, - "O": 1.0, - }, - "Singing": { - "B": 1.0, - "L": 5.0, - "O": 5.0, - }, - "Shouting": { - "B": 1.0, - "L": 5.0, - "O": 5.0, - }, - } - long_range_expiration_distributions = { - "minimum_diameter": 0.1, - "maximum_diameter": 30, - } - short_range_expiration_distributions = { - "minimum_diameter": 0.1, - "maximum_diameter": 100, - } - short_range_distances = { - "minimum_distance": 0.5, - "maximum_distance": 2.0, - } #################################### room = { - "defaults": { - "inside_temp": 293, - "humidity_with_heating": 0.3, - "humidity_without_heating": 0.5, - }, + "inside_temp": 293, + "humidity_with_heating": 0.3, + "humidity_without_heating": 0.5, } + ventilation = { "natural": { "discharge_factor": { @@ -353,19 +330,17 @@ class DataRegistry: }, "infiltration_ventilation": 0.25, } - particle = { - "evaporation_factor": 0.3, - } - population_with_virus = { - "fraction_of_infectious_virus": 1, - } + concentration_model = { - "min_background_concentration": 0.0, + "virus_concentration_model": { + "min_background_concentration": 0.0, + }, "CO2_concentration_model": { "CO2_atmosphere_concentration": 440.44, "CO2_fraction_exhaled": 0.042, }, } + short_range_model = { "dilution_factor": { "mouth_diameter": 0.02, @@ -377,17 +352,16 @@ class DataRegistry: "𝛽x1": 2.4, }, }, + "conversational_distance": { + "minimum_distance": 0.5, + "maximum_distance": 2.0, + }, } - exposure_model = { - "repeats": 1, + + monte_carlo = { + "sample_size": 250000, } - conditional_prob_inf_given_viral_load = { - "lower_percentile": 0.05, - "upper_percentile": 0.95, - "min_vl": 2, - "max_vl": 10, - } - monte_carlo_sample_size = 250000 + population_scenario_activity = { "office": {"placeholder": "Office", "activity": "Seated", "expiration": {"Speaking": 1, "Breathing": 2}}, "smallmeeting": {