From 2658e36adde52749e394baa7e15facc424a9975d Mon Sep 17 00:00:00 2001 From: lrdossan Date: Wed, 9 Apr 2025 12:52:05 +0200 Subject: [PATCH] updated expiration definition --- caimira/src/caimira/calculator/models/models.py | 8 ++++---- caimira/src/caimira/calculator/models/monte_carlo/data.py | 5 ++++- .../src/caimira/calculator/report/virus_report_data.py | 4 +--- .../calculator/validators/virus/virus_validator.py | 4 ++-- .../src/cern_caimira/apps/calculator/static/js/report.js | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/caimira/src/caimira/calculator/models/models.py b/caimira/src/caimira/calculator/models/models.py index add4e848..e19b1ee0 100644 --- a/caimira/src/caimira/calculator/models/models.py +++ b/caimira/src/caimira/calculator/models/models.py @@ -711,6 +711,9 @@ class Expiration(_ExpirationBase): # to c_n,i in Eq. (4) of https://doi.org/10.1101/2021.10.14.21264988) cn: float = 1. + #: Expiration name + name: typing.Optional[str] = None + @property def particle(self) -> Particle: """ @@ -1313,7 +1316,7 @@ class ShortRangeModel: data_registry: DataRegistry #: Expiration type - expiration: _ExpirationBase + expiration: Expiration #: Activity type activity: Activity @@ -1324,9 +1327,6 @@ class ShortRangeModel: #: Interpersonal distances distance: _VectorisedFloat - #: Expiration definition - expiration_def: typing.Optional[str] = None - def dilution_factor(self) -> _VectorisedFloat: ''' The dilution factor for the respective expiratory activity type. diff --git a/caimira/src/caimira/calculator/models/monte_carlo/data.py b/caimira/src/caimira/calculator/models/monte_carlo/data.py index 88e7898e..ca62dfba 100644 --- a/caimira/src/caimira/calculator/models/monte_carlo/data.py +++ b/caimira/src/caimira/calculator/models/monte_carlo/data.py @@ -365,6 +365,7 @@ def expiration_distribution( BLO_factors, d_min=0.1, d_max=30., + exp_type=None, ): """ Returns an Expiration with an aerosol diameter distribution, defined @@ -382,6 +383,7 @@ def expiration_distribution( kernel_bandwidth=0.1, ), cn=BLOmodel(data_registry, BLO_factors).integrate(d_min, d_max), + name=exp_type, ) @@ -432,7 +434,8 @@ def short_range_expiration_distributions(data_registry): data_registry=data_registry, BLO_factors=BLO_factors, d_min=param_evaluation(data_registry.expiration_particle['particle_size_range']['short_range'], 'minimum_diameter'), - d_max=param_evaluation(data_registry.expiration_particle['particle_size_range']['short_range'], 'maximum_diameter') + d_max=param_evaluation(data_registry.expiration_particle['particle_size_range']['short_range'], 'maximum_diameter'), + exp_type=exp_type, ) for exp_type, BLO_factors in expiration_BLO_factors(data_registry).items() } diff --git a/caimira/src/caimira/calculator/report/virus_report_data.py b/caimira/src/caimira/calculator/report/virus_report_data.py index 5647f657..a49131a6 100644 --- a/caimira/src/caimira/calculator/report/virus_report_data.py +++ b/caimira/src/caimira/calculator/report/virus_report_data.py @@ -5,8 +5,6 @@ import io import typing import numpy as np import matplotlib.pyplot as plt -import matplotlib -matplotlib.use('Agg') from collections import defaultdict from caimira.calculator.models import models, dataclass_utils, profiler, monte_carlo as mc @@ -226,7 +224,7 @@ def group_results(form: VirusFormData, model_group: models.ExposureModelGroup) - # Short range outputs short_range_interactions: dict = defaultdict(list) for short_range_model in single_group.short_range: - short_range_interactions[short_range_model.expiration_def].extend( + short_range_interactions[short_range_model.expiration.name].extend( short_range_model.presence.boundaries() ) diff --git a/caimira/src/caimira/calculator/validators/virus/virus_validator.py b/caimira/src/caimira/calculator/validators/virus/virus_validator.py index 4718b116..247a3a6b 100644 --- a/caimira/src/caimira/calculator/validators/virus/virus_validator.py +++ b/caimira/src/caimira/calculator/validators/virus/virus_validator.py @@ -258,9 +258,10 @@ class VirusFormData(FormData): short_range = defaultdict(list) if self.short_range_option == "short_range_yes": + sr_expiration_distributions = short_range_expiration_distributions(self.data_registry) for key, group in self.short_range_interactions.items(): for interaction in group: - expiration = short_range_expiration_distributions(self.data_registry)[interaction['expiration']] + expiration = sr_expiration_distributions[interaction['expiration']] presence = self.short_range_interval(interaction) distances = short_range_distances(self.data_registry) short_range[key].append(mc.ShortRangeModel( @@ -269,7 +270,6 @@ class VirusFormData(FormData): activity=infected_population.activity, presence=presence, distance=distances, - expiration_def=interaction['expiration'] )) concentration_model: models.ConcentrationModel = mc.ConcentrationModel( diff --git a/cern_caimira/src/cern_caimira/apps/calculator/static/js/report.js b/cern_caimira/src/cern_caimira/apps/calculator/static/js/report.js index bfd9a43c..a91bd189 100644 --- a/cern_caimira/src/cern_caimira/apps/calculator/static/js/report.js +++ b/cern_caimira/src/cern_caimira/apps/calculator/static/js/report.js @@ -290,7 +290,7 @@ function draw_plot(svg_id, group_id, times, concentrations_zoomed, }); // Short-Range Area. - short_range_intervals.forEach((b, index) => { + short_range_intervals.flat().forEach((b, index) => { shortRangeArea[index].x(d => xTimeRange(d.time)) .y0(graph_height - 50) .y1(d => yRange(d.concentration));