From 57839595fc54d86ac9a070e7daca4dc0d7da76ba Mon Sep 17 00:00:00 2001 From: markus Date: Thu, 4 Feb 2021 13:51:57 +0100 Subject: [PATCH] rework concentration distribution calculation --- cara/montecarlo.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/cara/montecarlo.py b/cara/montecarlo.py index d3326670..2af51f42 100644 --- a/cara/montecarlo.py +++ b/cara/montecarlo.py @@ -158,15 +158,26 @@ class MCInfectedPopulation(MCPopulation): return lognormal(*br_params) @functools.lru_cache() - def _concentration_distribution(self) -> typing.Callable: + def _concentration_distribution_without_mask(self) -> typing.Callable: if self.expiratory_activity == 1: return concentration_vs_diameter[0] if self.expiratory_activity == 2: - return np.vectorize(lambda d: concentration_vs_diameter[1](d) + concentration_vs_diameter[2](d)) + return np.vectorize(lambda d: sum(f(d) for f in concentration_vs_diameter)) if self.expiratory_activity == 3: - return np.vectorize(lambda d: 5 * (concentration_vs_diameter[1](d) + concentration_vs_diameter[2](d))) + return np.vectorize(lambda d: 5 * sum(f(d) for f in concentration_vs_diameter)) + + @functools.lru_cache() + def _concentration_distribution_with_mask(self) -> typing.Callable: + function = self._concentration_distribution_without_mask() + return np.vectorize(lambda d: function(d) * mask_leak_out(d)) + + def calculate_emission_concentration(self) -> float: + function = self._concentration_distribution_with_mask if self.masked else \ + self._concentration_distribution_without_mask() + function = np.vectorize(lambda d: function(d) * np.pi * d ** 3 / 6.0) + return quad_vec(function, 0, 30)[0] def emission_rate_when_present(self) -> np.ndarray: """