diff --git a/caimira/apps/calculator/model_generator.py b/caimira/apps/calculator/model_generator.py index 69c198dd..aa35ba1e 100644 --- a/caimira/apps/calculator/model_generator.py +++ b/caimira/apps/calculator/model_generator.py @@ -208,7 +208,7 @@ class VirusFormData(FormData): humidity = float(self.humidity) inside_temp = self.inside_temp - return models.Room(volume=volume, inside_temp=models.PiecewiseConstant((0, 24), (inside_temp,)), humidity=humidity) + return models.Room(volume=volume, inside_temp=models.PiecewiseConstant((0, 24), (inside_temp,)), humidity=humidity) # type: ignore def build_mc_model(self) -> mc.ExposureModel: room = self.initialize_room() diff --git a/caimira/enums.py b/caimira/enums.py index 8b66443b..d3bf68cd 100644 --- a/caimira/enums.py +++ b/caimira/enums.py @@ -1,5 +1,5 @@ from enum import Enum class ViralLoads(Enum): - COVID_OVERALL = "Ref: Viral load - covid_overal_vl_data" - SYMPTOMATIC_FREQUENCIES = "Ref: Viral load - symptomatic_vl_frequencies" + COVID_OVERALL = "Ref: Viral load - covid overal viral load data" + SYMPTOMATIC_FREQUENCIES = "Ref: Viral load - symptomatic viral load frequencies" diff --git a/caimira/monte_carlo/data.py b/caimira/monte_carlo/data.py index d35ab37d..acca3207 100644 --- a/caimira/monte_carlo/data.py +++ b/caimira/monte_carlo/data.py @@ -18,7 +18,7 @@ def evaluate_vl(root: typing.Dict, value: str, data_registry: DataRegistry): if root[value] == ViralLoads.COVID_OVERALL.value: return covid_overal_vl_data(data_registry) elif root[value] == ViralLoads.SYMPTOMATIC_FREQUENCIES.value: - return symptomatic_vl_frequencies + return symptomatic_vl_frequencies(data_registry) elif root[value] == 'Custom': return param_evaluation(root, 'Viral load custom') else: @@ -66,11 +66,26 @@ def evaluate_custom_value_type(value_type: str, params: typing.Dict) -> typing.A if value_type == 'Constant value': return params elif value_type == 'Normal distribution': - return Normal(params['normal_mean_gaussian'], params['normal_standard_deviation_gaussian']) + return Normal( + mean=params['normal_mean_gaussian'], + standard_deviation=params['normal_standard_deviation_gaussian'] + ) elif value_type == 'Log-normal distribution': - return LogNormal(params['lognormal_mean_gaussian'], params['lognormal_standard_deviation_gaussian']) + return LogNormal( + mean_gaussian=params['lognormal_mean_gaussian'], + standard_deviation_gaussian=params['lognormal_standard_deviation_gaussian'] + ) elif value_type == 'Uniform distribution': - return Uniform(params['low'], params['high']) + return Uniform( + low=params['low'], + high=params['high'] + ) + elif value_type == 'Log Custom Kernel distribution': + return LogCustomKernel( + log_variable=np.array(params['log_variable']), + frequencies=np.array(params['frequencies']), + kernel_bandwidth=params['kernel_bandwidth'] + ) else: raise ValueError('Bad request - value type not found.') @@ -211,11 +226,7 @@ def activity_distributions(data_registry): # From https://doi.org/10.1101/2021.10.14.21264988 and references therein def symptomatic_vl_frequencies(data_registry): - return LogCustomKernel( - np.array(data_registry.virological_data['symptomatic_vl_frequencies']['log_variable']), - np.array(data_registry.virological_data['symptomatic_vl_frequencies']['frequencies']), - kernel_bandwidth=data_registry.virological_data['symptomatic_vl_frequencies']['kernel_bandwidth'] - ) + return param_evaluation(data_registry.virological_data, 'symptomatic_vl_frequencies') # Weibull distribution with a shape factor of 3.47 and a scale factor of 7.01. @@ -224,34 +235,34 @@ def symptomatic_vl_frequencies(data_registry): def viral_load(data_registry): return np.linspace( weibull_min.ppf( - 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'] + data_registry.virological_data['covid_overal_vl_data']['parameters']['start'], + c=data_registry.virological_data['covid_overal_vl_data']['parameters']['shape_factor'], + scale=data_registry.virological_data['covid_overal_vl_data']['parameters']['scale_factor'] ), weibull_min.ppf( - 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'] + data_registry.virological_data['covid_overal_vl_data']['parameters']['stop'], + c=data_registry.virological_data['covid_overal_vl_data']['parameters']['shape_factor'], + scale=data_registry.virological_data['covid_overal_vl_data']['parameters']['scale_factor'] ), - int(data_registry.virological_data['covid_overal_vl_data']['num']) + int(data_registry.virological_data['covid_overal_vl_data']['parameters']['num']) ) def frequencies_pdf(data_registry): return weibull_min.pdf( viral_load(data_registry), - c=data_registry.virological_data['covid_overal_vl_data']['shape_factor'], - scale=data_registry.virological_data['covid_overal_vl_data']['scale_factor'] + c=data_registry.virological_data['covid_overal_vl_data']['parameters']['shape_factor'], + scale=data_registry.virological_data['covid_overal_vl_data']['parameters']['scale_factor'] ) def covid_overal_vl_data(data_registry): return LogCustom( - bounds=(data_registry.virological_data['covid_overal_vl_data']['min_bound'], data_registry.virological_data['covid_overal_vl_data']['max_bound']), + bounds=(data_registry.virological_data['covid_overal_vl_data']['parameters']['min_bound'], data_registry.virological_data['covid_overal_vl_data']['parameters']['max_bound']), function=lambda d: np.interp( d, viral_load(data_registry), frequencies_pdf(data_registry), - data_registry.virological_data['covid_overal_vl_data']['interpolation_fp_left'], - data_registry.virological_data['covid_overal_vl_data']['interpolation_fp_right'] + data_registry.virological_data['covid_overal_vl_data']['parameters']['interpolation_fp_left'], + data_registry.virological_data['covid_overal_vl_data']['parameters']['interpolation_fp_right'] ), - max_function=data_registry.virological_data['covid_overal_vl_data']['max_function'] + max_function=data_registry.virological_data['covid_overal_vl_data']['parameters']['max_function'] ) @@ -274,37 +285,43 @@ def virus_distributions(data_registry): viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2'], 'viral_load_in_sputum', data_registry), infectious_dose=param_evaluation(vd['SARS_CoV_2'], 'infectious_dose'), viable_to_RNA_ratio=param_evaluation(vd['SARS_CoV_2'], 'viable_to_RNA_ratio'), - transmissibility_factor=vd['SARS_CoV_2']['transmissibility_factor'], + transmissibility_factor=vd['SARS_CoV_2']['transmissibility_factor']['value'], + infectiousness_days=vd['SARS_CoV_2']['infectiousness_days']['value'], ), 'SARS_CoV_2_ALPHA': mc.SARSCoV2( viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_ALPHA'], 'viral_load_in_sputum', data_registry), infectious_dose=param_evaluation(vd['SARS_CoV_2_ALPHA'], 'infectious_dose'), viable_to_RNA_ratio=param_evaluation(vd['SARS_CoV_2_ALPHA'], 'viable_to_RNA_ratio'), - transmissibility_factor=vd['SARS_CoV_2_ALPHA']['transmissibility_factor'], + transmissibility_factor=vd['SARS_CoV_2_ALPHA']['transmissibility_factor']['value'], + infectiousness_days=vd['SARS_CoV_2_ALPHA']['infectiousness_days']['value'], ), 'SARS_CoV_2_BETA': mc.SARSCoV2( viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_BETA'], 'viral_load_in_sputum', data_registry), infectious_dose=param_evaluation(vd['SARS_CoV_2_BETA'], 'infectious_dose'), viable_to_RNA_ratio=param_evaluation(vd['SARS_CoV_2_BETA'], 'viable_to_RNA_ratio'), - transmissibility_factor=vd['SARS_CoV_2_BETA']['transmissibility_factor'], + transmissibility_factor=vd['SARS_CoV_2_BETA']['transmissibility_factor']['value'], + infectiousness_days=vd['SARS_CoV_2_BETA']['infectiousness_days']['value'], ), 'SARS_CoV_2_GAMMA': mc.SARSCoV2( viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_GAMMA'], 'viral_load_in_sputum', data_registry), infectious_dose=param_evaluation(vd['SARS_CoV_2_GAMMA'], 'infectious_dose'), viable_to_RNA_ratio=param_evaluation(vd['SARS_CoV_2_GAMMA'], 'viable_to_RNA_ratio'), - transmissibility_factor=vd['SARS_CoV_2_GAMMA']['transmissibility_factor'], + transmissibility_factor=vd['SARS_CoV_2_GAMMA']['transmissibility_factor']['value'], + infectiousness_days=vd['SARS_CoV_2_GAMMA']['infectiousness_days']['value'], ), 'SARS_CoV_2_DELTA': mc.SARSCoV2( viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_DELTA'], 'viral_load_in_sputum', data_registry), infectious_dose=param_evaluation(vd['SARS_CoV_2_DELTA'], 'infectious_dose'), viable_to_RNA_ratio=param_evaluation(vd['SARS_CoV_2_DELTA'], 'viable_to_RNA_ratio'), - transmissibility_factor=vd['SARS_CoV_2_DELTA']['transmissibility_factor'], + transmissibility_factor=vd['SARS_CoV_2_DELTA']['transmissibility_factor']['value'], + infectiousness_days=vd['SARS_CoV_2_DELTA']['infectiousness_days']['value'], ), 'SARS_CoV_2_OMICRON': mc.SARSCoV2( viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_OMICRON'], 'viral_load_in_sputum', data_registry), infectious_dose=param_evaluation(vd['SARS_CoV_2_OMICRON'], 'infectious_dose'), viable_to_RNA_ratio=param_evaluation(vd['SARS_CoV_2_OMICRON'], 'viable_to_RNA_ratio'), - transmissibility_factor=vd['SARS_CoV_2_OMICRON']['transmissibility_factor'], + transmissibility_factor=vd['SARS_CoV_2_OMICRON']['transmissibility_factor']['value'], + infectiousness_days=vd['SARS_CoV_2_OMICRON']['infectiousness_days']['value'], ), } @@ -321,21 +338,24 @@ def mask_distributions(data_registry): data_registry.mask_distributions['Type I'], 'η_inhale'), η_exhale=param_evaluation( data_registry.mask_distributions['Type I'], 'η_exhale') - if data_registry.mask_distributions['Type I'].get('η_exhale') is not None else None + if data_registry.mask_distributions['Type I'].get('η_exhale') is not None else None, + factor_exhale=data_registry.mask_distributions['Type I']['factor_exhale']['value'] ), 'FFP2': mc.Mask( η_inhale=param_evaluation( data_registry.mask_distributions['FFP2'], 'η_inhale'), η_exhale=param_evaluation( data_registry.mask_distributions['FFP2'], 'η_exhale') - if data_registry.mask_distributions['FFP2'].get('η_exhale') is not None else None + if data_registry.mask_distributions['FFP2'].get('η_exhale') is not None else None, + factor_exhale=data_registry.mask_distributions['FFP2']['factor_exhale']['value'] ), 'Cloth': mc.Mask( η_inhale=param_evaluation( data_registry.mask_distributions['Cloth'], 'η_inhale'), η_exhale=param_evaluation( data_registry.mask_distributions['Cloth'], 'η_exhale') - if data_registry.mask_distributions['Cloth'].get('η_exhale') is not None else None + if data_registry.mask_distributions['Cloth'].get('η_exhale') is not None else None, + factor_exhale=data_registry.mask_distributions['Cloth']['factor_exhale']['value'] ), } @@ -399,8 +419,8 @@ def expiration_distributions(data_registry): exp_type: expiration_distribution( data_registry=data_registry, BLO_factors=BLO_factors, - 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') + d_min=param_evaluation(data_registry.expiration_particle['long_range_particle_diameter'], 'minimum_diameter'), + d_max=param_evaluation(data_registry.expiration_particle['long_range_particle_diameter'], 'maximum_diameter') ) for exp_type, BLO_factors in expiration_BLO_factors(data_registry).items() } @@ -411,8 +431,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.expiration_particle['short_range_expiration_distributions'], 'minimum_diameter'), - d_max=param_evaluation(data_registry.expiration_particle['short_range_expiration_distributions'], 'maximum_diameter') + d_min=param_evaluation(data_registry.expiration_particle['short_range_particle_diameter'], 'minimum_diameter'), + d_max=param_evaluation(data_registry.expiration_particle['short_range_particle_diameter'], 'maximum_diameter') ) for exp_type, BLO_factors in expiration_BLO_factors(data_registry).items() } diff --git a/caimira/store/data_registry.py b/caimira/store/data_registry.py index 498db95b..570a4fd9 100644 --- a/caimira/store/data_registry.py +++ b/caimira/store/data_registry.py @@ -7,28 +7,33 @@ class DataRegistry: version = None expiration_particle = { - "long_range_expiration_distributions": { + "long_range_particle_diameter": { "minimum_diameter": 0.1, "maximum_diameter": 30, + "references": "Morawska et al. (https://doi.org/10.1016/j.jaerosci.2008.11.002); Johnson et al. (https://doi.org/10.1016/j.jaerosci.2011.07.009).", }, - "short_range_expiration_distributions": { + "short_range_particle_diameter": { "minimum_diameter": 0.1, "maximum_diameter": 100, + "references": "Morawska et al. (https://doi.org/10.1016/j.jaerosci.2008.11.002); Johnson et al. (https://doi.org/10.1016/j.jaerosci.2011.07.009).", }, "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}, + "references": "Morawska et al. (https://doi.org/10.1016/j.jaerosci.2008.11.002); Johnson et al. (https://doi.org/10.1016/j.jaerosci.2011.07.009).", }, "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., }, + "references": "Morawska et al. (https://doi.org/10.1016/j.jaerosci.2008.11.002); Johnson et al. (https://doi.org/10.1016/j.jaerosci.2011.07.009).", }, "particle": { "evaporation_factor": 0.3, - } + "references": "Marr et al. (https://doi.org/10.1098/rsif.2018.0298).", + }, } activity_distributions = { @@ -39,6 +44,7 @@ class DataRegistry: "lognormal_mean_gaussian": -0.6872121723362303, "lognormal_standard_deviation_gaussian": 0.10498338229297108, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "exhalation_rate": { "associated_value": "Log-normal distribution", @@ -46,6 +52,7 @@ class DataRegistry: "lognormal_mean_gaussian": -0.6872121723362303, "lognormal_standard_deviation_gaussian": 0.10498338229297108, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, }, "Standing": { @@ -55,6 +62,7 @@ class DataRegistry: "lognormal_mean_gaussian": -0.5742377578494785, "lognormal_standard_deviation_gaussian": 0.09373162411398223, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "exhalation_rate": { "associated_value": "Log-normal distribution", @@ -62,6 +70,7 @@ class DataRegistry: "lognormal_mean_gaussian": -0.5742377578494785, "lognormal_standard_deviation_gaussian": 0.09373162411398223, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, }, "Light activity": { @@ -71,6 +80,7 @@ class DataRegistry: "lognormal_mean_gaussian": 0.21380242785625422, "lognormal_standard_deviation_gaussian": 0.09435378091059601, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "exhalation_rate": { "associated_value": "Log-normal distribution", @@ -78,6 +88,7 @@ class DataRegistry: "lognormal_mean_gaussian": 0.21380242785625422, "lognormal_standard_deviation_gaussian": 0.09435378091059601, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, }, "Moderate activity": { @@ -87,6 +98,7 @@ class DataRegistry: "lognormal_mean_gaussian": 0.551771330362601, "lognormal_standard_deviation_gaussian": 0.1894616357138137, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "exhalation_rate": { "associated_value": "Log-normal distribution", @@ -94,6 +106,7 @@ class DataRegistry: "lognormal_mean_gaussian": 0.551771330362601, "lognormal_standard_deviation_gaussian": 0.1894616357138137, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, }, "Heavy exercise": { @@ -103,6 +116,7 @@ class DataRegistry: "lognormal_mean_gaussian": 1.1644665696723049, "lognormal_standard_deviation_gaussian": 0.21744554768657565, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "exhalation_rate": { "associated_value": "Log-normal distribution", @@ -110,105 +124,114 @@ class DataRegistry: "lognormal_mean_gaussian": 1.1644665696723049, "lognormal_standard_deviation_gaussian": 0.21744554768657565, }, + "references": "Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, }, } 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, + "associated_value": "Log Custom Kernel distribution", + "parameters": { + "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, + }, + "references": "Henriques et al. (https://doi.org/10.1101/2021.10.14.21264988) and references therein.", }, - '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, + "covid_overal_vl_data": { + "associated_value": "Weibull distribution", + "parameters": { + "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, + }, + "references": "Chen et al. (https://elifesciences.org/articles/65774); First line of the figure in https://iiif.elifesciences.org/lax:65774%2Felife-65774-fig4-figsupp3-v2.tif/full/1500,/0/default.jpg.", }, "virus_distributions": { "SARS_CoV_2": { @@ -216,78 +239,126 @@ class DataRegistry: "infectious_dose": { "associated_value": "Uniform distribution", "parameters": {"low": 10, "high": 100}, + "references": "Lednicky et al. (https://doi.org/10.1016/j.ijid.2020.09.025); Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "viable_to_RNA_ratio": { - 'associated_value': 'Uniform distribution', - 'parameters': {'low': 0.01, 'high': 0.6}, + "associated_value": "Uniform distribution", + "parameters": {"low": 0.01, "high": 0.6}, + "references": "", + }, + "transmissibility_factor": { + "value": 1, + "references": "Campbell et al. (https://doi.org/10.2807/1560-7917.ES.2021.26.24.2100509.)", + }, + "infectiousness_days": { + "value": 14, + "references": "", }, - "transmissibility_factor": 1, - "infectiousness_days": 14, }, "SARS_CoV_2_ALPHA": { "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, "infectious_dose": { "associated_value": "Uniform distribution", "parameters": {"low": 10, "high": 100}, + "references": "Lednicky et al. (https://doi.org/10.1016/j.ijid.2020.09.025); Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "viable_to_RNA_ratio": { - 'associated_value': 'Uniform distribution', - 'parameters': {'low': 0.01, 'high': 0.6}, + "associated_value": "Uniform distribution", + "parameters": {"low": 0.01, "high": 0.6}, + "references": "", + }, + "transmissibility_factor": { + "value": 0.78, + "references": "Campbell et al. (https://doi.org/10.2807/1560-7917.ES.2021.26.24.2100509.)", + }, + "infectiousness_days": { + "value": 14, + "references": "", }, - "transmissibility_factor": 0.78, - "infectiousness_days": 14, }, "SARS_CoV_2_BETA": { "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, "infectious_dose": { "associated_value": "Uniform distribution", "parameters": {"low": 10, "high": 100}, + "references": "Lednicky et al. (https://doi.org/10.1016/j.ijid.2020.09.025); Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "viable_to_RNA_ratio": { - 'associated_value': 'Uniform distribution', - 'parameters': {'low': 0.01, 'high': 0.6}, + "associated_value": "Uniform distribution", + "parameters": {"low": 0.01, "high": 0.6}, + "references": "", + }, + "transmissibility_factor": { + "value": 0.8, + "references": "Campbell et al. (https://doi.org/10.2807/1560-7917.ES.2021.26.24.2100509.)", + }, + "infectiousness_days": { + "value": 14, + "references": "", }, - "transmissibility_factor": 0.8, - "infectiousness_days": 14, }, "SARS_CoV_2_GAMMA": { "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, "infectious_dose": { "associated_value": "Uniform distribution", "parameters": {"low": 10, "high": 100}, + "references": "Lednicky et al. (https://doi.org/10.1016/j.ijid.2020.09.025); Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "viable_to_RNA_ratio": { - 'associated_value': 'Uniform distribution', - 'parameters': {'low': 0.01, 'high': 0.6}, + "associated_value": "Uniform distribution", + "parameters": {"low": 0.01, "high": 0.6}, + "references": "", + }, + "transmissibility_factor": { + "value": 0.72, + "references": "Campbell et al. (https://doi.org/10.2807/1560-7917.ES.2021.26.24.2100509.)", + }, + "infectiousness_days": { + "value": 14, + "references": "", }, - "transmissibility_factor": 0.72, - "infectiousness_days": 14, }, "SARS_CoV_2_DELTA": { "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, "infectious_dose": { "associated_value": "Uniform distribution", "parameters": {"low": 10, "high": 100}, + "references": "Lednicky et al. (https://doi.org/10.1016/j.ijid.2020.09.025); Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "viable_to_RNA_ratio": { - 'associated_value': 'Uniform distribution', - 'parameters': {'low': 0.01, 'high': 0.6}, + "associated_value": "Uniform distribution", + "parameters": {"low": 0.01, "high": 0.6}, + "references": "", + }, + "transmissibility_factor": { + "value": 0.51, + "references": "Campbell et al. (https://doi.org/10.2807/1560-7917.ES.2021.26.24.2100509.)", + }, + "infectiousness_days": { + "value": 14, + "references": "", }, - "transmissibility_factor": 0.51, - "infectiousness_days": 14, }, "SARS_CoV_2_OMICRON": { "viral_load_in_sputum": ViralLoads.COVID_OVERALL.value, "infectious_dose": { "associated_value": "Uniform distribution", "parameters": {"low": 10, "high": 100}, + "references": "Lednicky et al. (https://doi.org/10.1016/j.ijid.2020.09.025); Henriques et al. (https://doi.org/10.1098/rsfs.2021.0076) and references therein.", }, "viable_to_RNA_ratio": { - 'associated_value': 'Uniform distribution', - 'parameters': {'low': 0.01, 'high': 0.6}, + "associated_value": "Uniform distribution", + "parameters": {"low": 0.01, "high": 0.6}, + "references": "", + }, + "transmissibility_factor": { + "value": 0.2, + "references": "", + }, + "infectiousness_days": { + "value": 14, + "references": "", }, - "transmissibility_factor": 0.2, - "infectiousness_days": 14, }, }, } @@ -300,8 +371,12 @@ class DataRegistry: "low": 0.25, "high": 0.80, }, + "references": "Pan et al. (https://doi.org/10.1080/02786826.2021.1890687); Booth et al. (https://doi.org/10.1016/j.jhin.2013.02.007); Monn et al. (https://doi.org/10.4209/aaqr.2020.08.0531).", + }, + "factor_exhale": { + "value": 1, + "references": "", }, - "factor_exhale": 1, }, "FFP2": { "η_inhale": { @@ -310,8 +385,12 @@ class DataRegistry: "low": 0.83, "high": 0.91, }, + "references": "Pan et al. (https://doi.org/10.1080/02786826.2021.1890687); Booth et al. (https://doi.org/10.1016/j.jhin.2013.02.007); Monn et al. (https://doi.org/10.4209/aaqr.2020.08.0531).", + }, + "factor_exhale": { + "value": 1, + "references": "", }, - "factor_exhale": 1, }, "Cloth": { "η_inhale": { @@ -320,6 +399,7 @@ class DataRegistry: "low": 0.05, "high": 0.40, }, + "references": "Pan et al. (https://doi.org/10.1080/02786826.2021.1890687); Booth et al. (https://doi.org/10.1016/j.jhin.2013.02.007); Monn et al. (https://doi.org/10.4209/aaqr.2020.08.0531).", }, "η_exhale": { "associated_value": "Uniform distribution", @@ -327,17 +407,22 @@ class DataRegistry: "low": 0.20, "high": 0.50, }, + "references": "Pan et al. (https://doi.org/10.1080/02786826.2021.1890687); Booth et al. (https://doi.org/10.1016/j.jhin.2013.02.007); Monn et al. (https://doi.org/10.4209/aaqr.2020.08.0531).", + }, + "factor_exhale": { + "value": 1, + "references": "", }, - "factor_exhale": 1, }, } #################################### room = { - "inside_temp": 293, + "inside_temp": 293., "humidity_with_heating": 0.3, "humidity_without_heating": 0.5, + "references": "", } ventilation = { @@ -347,15 +432,18 @@ class DataRegistry: }, }, "infiltration_ventilation": 0.25, + "references": "Henriques et al. (https://doi.org/10.1101/2021.10.14.21264988).", } concentration_model = { "virus_concentration_model": { "min_background_concentration": 0.0, + "references": "", }, "CO2_concentration_model": { "CO2_atmosphere_concentration": 440.44, "CO2_fraction_exhaled": 0.042, + "references": "", }, } @@ -369,15 +457,18 @@ class DataRegistry: "𝛽r2": 0.2, "𝛽x1": 2.4, }, + "references": "Jia et al. (https://doi.org/10.1016/j.buildenv.2022.109166).", }, "conversational_distance": { "minimum_distance": 0.5, "maximum_distance": 2.0, + "references": "Derived from Fig. 8 a) 'stand-stand' in Zhang et al. (https://www.mdpi.com/1660-4601/17/4/1445).", }, } monte_carlo = { "sample_size": 250000, + "references": "", } population_scenario_activity = {