diff --git a/cara/apps/calculator/report_generator.py b/cara/apps/calculator/report_generator.py index 1d8061db..22aaf932 100644 --- a/cara/apps/calculator/report_generator.py +++ b/cara/apps/calculator/report_generator.py @@ -249,37 +249,41 @@ def comparison_plot(scenarios: typing.Dict[str, dict], sample_times: np.ndarray) datetimes = [datetime(1970, 1, 1) + timedelta(hours=time) for time in sample_times] for name, statistics in scenarios.items(): + model = statistics['model'] concentrations = statistics['concentrations'] - factor = statistics['factor'] - present_indexes = statistics['present_indexes'] - + + #See CERN-OPEN-2021-004, p. 15, eq. 16. - Cumulative Dose + factor = 0.6 * np.mean(model.exposed.activity.inhalation_rate) * (1 - model.exposed.mask.η_inhale) + present_indexes = np.array([model.exposed.person_present(t) for t in sample_times]) + modified_concentrations = np.array(concentrations) modified_concentrations[~present_indexes] = 0 qds = [np.trapz(modified_concentrations[:i + 1], sample_times[:i + 1]) * factor for i in range(len(sample_times))] + # Plot concentrations and cumulative dose if name in dash_styled_scenarios: ax.plot(datetimes, concentrations, label=name, linestyle='--') - ax1.plot(datetimes, qds, label='Mean cumulative dose', linestyle='dotted') + ax1.plot(datetimes, qds, label=f'Mean cumulative dose:\n{name}', linestyle='dotted') else: ax.plot(datetimes, concentrations, label=name, linestyle='-', alpha=0.5) - ax1.plot(datetimes, qds, label='Mean cumulative dose', linestyle='dotted', alpha=0.5) - + ax1.plot(datetimes, qds, label=f'Mean cumulative dose:\n{name}', linestyle='dotted', alpha=0.5) + + # Place a legend outside of the axes itself. + fig.legend(bbox_to_anchor=(1.05, 0.95), loc='upper left') + + ax.spines['right'].set_visible(False) + ax.spines['top'].set_visible(False) + ax.set_xlabel('Time of day', fontsize=14) + ax.set_ylabel('Mean viral concentration\n(virion m$^{-3}$)', fontsize=14) + ax.set_title('Concentration profile') + ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%H:%M")) + ax1.spines['top'].set_visible(False) ax1.spines["right"].set_linestyle("--") ax1.spines["right"].set_linestyle((0,(1,5))) ax1.set_ylabel('Mean cumulative dose\n(virion)', fontsize=14) ax1.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%H:%M")) - - # Place a legend outside of the axes itself. - ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left') - ax.spines['right'].set_visible(False) - ax.spines['top'].set_visible(False) - ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%H:%M")) - - ax.set_xlabel('Time of day') - ax.set_ylabel('Mean concentration ($q/m^3$)') - ax.set_title('Mean concentration of infectious quanta') return fig @@ -287,14 +291,13 @@ def comparison_plot(scenarios: typing.Dict[str, dict], sample_times: np.ndarray) def scenario_statistics(mc_model: mc.ExposureModel, sample_times: np.ndarray): model = mc_model.build_model(size=_DEFAULT_MC_SAMPLE_SIZE) return { + 'model': model, 'probability_of_infection': np.mean(model.infection_probability()), 'expected_new_cases': np.mean(model.expected_new_cases()), 'concentrations': [ - np.mean(model.concentration_model.concentration(time)) + np.mean(model.concentration_model.concentration(time)) * model.concentration_model.virus.quantum_infectious_dose for time in sample_times ], - 'factor': 0.6 * np.mean(model.exposed.activity.inhalation_rate) * (1 - model.exposed.mask.η_inhale), - 'present_indexes': np.array([model.exposed.person_present(t) for t in sample_times]), } diff --git a/cara/apps/calculator/templates/base/calculator.report.html.j2 b/cara/apps/calculator/templates/base/calculator.report.html.j2 index 64a44cfa..98655d8c 100644 --- a/cara/apps/calculator/templates/base/calculator.report.html.j2 +++ b/cara/apps/calculator/templates/base/calculator.report.html.j2 @@ -219,7 +219,7 @@

Alternative scenarios:

-

+ {% block report_scenarios_summary_table %} @@ -242,7 +242,7 @@ {% endblock report_scenarios_summary_table %} -

+

Notes for alternative scenarios: