diff --git a/caimira/apps/calculator/__init__.py b/caimira/apps/calculator/__init__.py index 4a410646..4c56cee1 100644 --- a/caimira/apps/calculator/__init__.py +++ b/caimira/apps/calculator/__init__.py @@ -126,6 +126,7 @@ class ConcentrationModel(BaseRequestHandler): if self.get_cookie('conditional_plot'): form.conditional_probability_plot = True if self.get_cookie('conditional_plot') == '1' else False self.clear_cookie('conditional_plot') # Clears cookie after changing the form value. + report_task = executor.submit( report_generator.build_report, base_url, form, executor_factory=functools.partial( diff --git a/caimira/apps/calculator/report_generator.py b/caimira/apps/calculator/report_generator.py index b20bd259..65cbade5 100644 --- a/caimira/apps/calculator/report_generator.py +++ b/caimira/apps/calculator/report_generator.py @@ -139,7 +139,6 @@ def calculate_report_data(form: FormData, model: models.ExposureModel) -> typing expected_new_cases = np.array(model.expected_new_cases()).mean() uncertainties_plot_src = img2base64(_figure2bytes(uncertainties_plot(model))) if form.conditional_probability_plot else None exposed_presence_intervals = [list(interval) for interval in model.exposed.presence_interval().boundaries()] - manufacture_viral_load_scenarios(model) return { "model_repr": repr(model), @@ -307,13 +306,13 @@ def non_zero_percentage(percentage: int) -> str: def manufacture_viral_load_scenarios(model: mc.ExposureModel) -> typing.Dict[str, mc.ExposureModel]: viral_load = model.concentration_model.infected.virus.viral_load_in_sputum - viral_load_values = [np.quantile(viral_load, percentil) for percentil in (0.01, 0.05, 0.5, 0.95, 0.99)] scenarios = {} - for vl in viral_load_values: + for percentil in (0.01, 0.05, 0.5, 0.95, 0.99): + vl = np.quantile(viral_load, percentil) specific_vl_scenario = dataclass_utils.nested_replace(model, {'concentration_model.infected.virus.viral_load_in_sputum': vl} ) - scenarios[round(np.log10(vl))] = specific_vl_scenario + scenarios[round(np.log10(vl))] = np.mean(specific_vl_scenario.infection_probability()) return scenarios @@ -387,23 +386,6 @@ def scenario_statistics(mc_model: mc.ExposureModel, sample_times: typing.List[fl } -def comparison_report_viral_load(scenarios: typing.Dict[str, mc.ExposureModel]): - results = [] - for mc_model in scenarios.values(): - results.append({ - 'probability_of_infection': np.mean(mc_model.infection_probability()), - 'expected_new_cases': np.mean(mc_model.expected_new_cases()), - }) - - statistics = {} - for (name, _), model_stats in zip(scenarios.items(), results): - statistics[name] = model_stats - - return { - 'stats': statistics, - } - - def comparison_report( form: FormData, report_data: typing.Dict[str, typing.Any], @@ -480,9 +462,8 @@ class ReportGenerator: report_data = calculate_report_data(form, model) context.update(report_data) - alternative_viral_loads = manufacture_viral_load_scenarios(model) alternative_scenarios = manufacture_alternative_scenarios(form) - context['alternative_viral_load'] = comparison_report_viral_load(alternative_viral_loads) + context['alternative_viral_load'] = manufacture_viral_load_scenarios(model) context['alternative_scenarios'] = comparison_report( form, report_data, alternative_scenarios, scenario_sample_times, executor_factory=executor_factory, ) diff --git a/caimira/apps/templates/base/calculator.report.html.j2 b/caimira/apps/templates/base/calculator.report.html.j2 index ffc7644f..6091e55a 100644 --- a/caimira/apps/templates/base/calculator.report.html.j2 +++ b/caimira/apps/templates/base/calculator.report.html.j2 @@ -167,15 +167,15 @@ Scenario P(I) - Expected new cases + {# Expected new cases #} - {% for scenario_name, scenario_stats in alternative_viral_load.stats.items() %} + {% for scenario_name, scenario_stats in alternative_viral_load.items() %} Viral load: 10{{ scenario_name }} - {{ scenario_stats.probability_of_infection | non_zero_percentage }} - {{ scenario_stats.expected_new_cases | float_format }} + {{ scenario_stats | non_zero_percentage }} + {# {{ scenario_stats.expected_new_cases | float_format }} #} {% endfor %} diff --git a/caimira/models.py b/caimira/models.py index 9db3fcad..9ef7eece 100644 --- a/caimira/models.py +++ b/caimira/models.py @@ -1640,6 +1640,7 @@ class ExposureModel: return deposited_exposure * self.repeats + @method_cache def infection_probability(self) -> _VectorisedFloat: # Viral dose (vD) vD = self.deposited_exposure() diff --git a/caimira/tests/apps/calculator/test_report_generator.py b/caimira/tests/apps/calculator/test_report_generator.py index 18190777..2dd35320 100644 --- a/caimira/tests/apps/calculator/test_report_generator.py +++ b/caimira/tests/apps/calculator/test_report_generator.py @@ -16,7 +16,7 @@ def test_generate_report(baseline_form) -> None: # generate a report for it. Because this is what happens in the caimira # calculator, we confirm that the generation happens within a reasonable # time threshold. - time_limit: float = 20.0 # seconds + time_limit: float = 30.0 # seconds start = time.perf_counter() diff --git a/caimira/tests/apps/calculator/test_report_json.py b/caimira/tests/apps/calculator/test_report_json.py index 95cb60a1..9900bd03 100644 --- a/caimira/tests/apps/calculator/test_report_json.py +++ b/caimira/tests/apps/calculator/test_report_json.py @@ -5,7 +5,7 @@ import tornado.testing import caimira.apps.calculator from caimira.apps.calculator import model_generator -_TIMEOUT = 40. +_TIMEOUT = 30. class TestCalculatorJsonResponse(tornado.testing.AsyncHTTPTestCase): diff --git a/caimira/tests/apps/calculator/test_webapp.py b/caimira/tests/apps/calculator/test_webapp.py index 32d22352..587ec4d9 100644 --- a/caimira/tests/apps/calculator/test_webapp.py +++ b/caimira/tests/apps/calculator/test_webapp.py @@ -7,7 +7,7 @@ from retry import retry import caimira.apps.calculator from caimira.apps.calculator.report_generator import generate_permalink -_TIMEOUT = 20. +_TIMEOUT = 30. @pytest.fixture @@ -63,7 +63,7 @@ class TestBasicApp(tornado.testing.AsyncHTTPTestCase): assert 'expected number of new cases is' in response.body.decode() -@retry(tries=10) +@retry(tries=20) class TestCernApp(tornado.testing.AsyncHTTPTestCase): def get_app(self): cern_theme = Path(caimira.apps.calculator.__file__).parent.parent / 'themes' / 'cern' @@ -76,21 +76,6 @@ class TestCernApp(tornado.testing.AsyncHTTPTestCase): assert 'expected number of new cases is' in response.body.decode() -retry(tries=10) -class TestOpenApp(tornado.testing.AsyncHTTPTestCase): - def get_app(self): - return caimira.apps.calculator.make_app(calculator_prefix="/mycalc") - - @tornado.testing.gen_test(timeout=_TIMEOUT) - def test_report(self): - response = yield self.http_client.fetch(self.get_url('/mycalc/baseline-model/result')) - self.assertEqual(response.code, 200) - - def test_calculator_404(self): - response = self.fetch('/calculator') - assert response.code == 404 - - async def test_permalink_urls(http_server_client, baseline_form): base_url = 'proto://hostname/prefix' permalink_data = generate_permalink(base_url, lambda: "", lambda: "/calculator", baseline_form)