Changed type of short range presence and added tests
This commit is contained in:
parent
2f0ea6110d
commit
8566657f81
2 changed files with 80 additions and 1 deletions
|
|
@ -673,6 +673,7 @@ class Expiration(_ExpirationBase):
|
|||
return self.cn * (volume(self.diameter) *
|
||||
(1 - mask.exhale_efficiency(self.diameter))) * 1e-12
|
||||
|
||||
@cached()
|
||||
def jet_origin_concentration(self):
|
||||
def volume(d):
|
||||
return (np.pi * d**3) / 6.
|
||||
|
|
@ -1075,7 +1076,7 @@ class ConcentrationModel:
|
|||
@dataclass(frozen=True)
|
||||
class ShortRangeModel:
|
||||
#: Short range interactions
|
||||
presence: typing.List[Interval]
|
||||
presence: typing.List[SpecificInterval]
|
||||
|
||||
#: Expiration type
|
||||
expirations: typing.List[Expiration]
|
||||
|
|
|
|||
78
cara/tests/models/test_short_range_model.py
Normal file
78
cara/tests/models/test_short_range_model.py
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
import typing
|
||||
from unicodedata import decimal
|
||||
|
||||
import numpy as np
|
||||
import pytest
|
||||
|
||||
from cara import models
|
||||
from cara.models import ShortRangeModel
|
||||
from cara.apps.calculator.model_generator import build_expiration
|
||||
from cara.monte_carlo.data import dilution_factor, short_range_expiration_distributions
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def concentration_model():
|
||||
return models.ConcentrationModel(
|
||||
room=models.Room(volume=75),
|
||||
ventilation=models.AirChange(
|
||||
active=models.SpecificInterval(present_times=((8.5, 12.5), (13.5, 17.5))),
|
||||
air_exch=30.,
|
||||
),
|
||||
infected=models.InfectedPopulation(
|
||||
number=1,
|
||||
virus=models.Virus.types['SARS_CoV_2'],
|
||||
presence=models.SpecificInterval(present_times=((8.5, 12.5), (13.5, 17.5))),
|
||||
mask=models.Mask.types['No mask'],
|
||||
activity=models.Activity.types['Light activity'],
|
||||
expiration=build_expiration({'Speaking': 0.33, 'Breathing': 0.67}).build_model(250000),
|
||||
host_immunity=0.,
|
||||
),
|
||||
evaporation_factor=0.3,
|
||||
)
|
||||
|
||||
|
||||
activities = ['Breathing', 'Speaking', 'Shouting']
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def presences():
|
||||
return [models.SpecificInterval((10.5, 11.0)),
|
||||
models.SpecificInterval((14.5, 15.0)),
|
||||
models.SpecificInterval((16.5, 17.5)),]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def expirations():
|
||||
return [short_range_expiration_distributions[activity] for activity in activities]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def dilutions():
|
||||
return dilution_factor(activities=activities,
|
||||
distance=np.random.uniform(0.5, 1.5, 250000))
|
||||
|
||||
|
||||
def test_short_range_model_ndarray(concentration_model, presences, expirations, dilutions):
|
||||
model = ShortRangeModel(presences, expirations, dilutions)
|
||||
assert isinstance(model._normed_concentration(concentration_model, 10.75), np.ndarray)
|
||||
assert isinstance(model.short_range_concentration(concentration_model, 14.75), np.ndarray)
|
||||
assert isinstance(model.normed_exposure_between_bounds(concentration_model, 16.6, 17.7), np.ndarray)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"time, expected_sr_normed_concentration, expected_concentration", [
|
||||
[10.75, 1.1066751695e-07, 110.66751695458098],
|
||||
[14.75, 3.451543659539623e-07, 345.15431668253206],
|
||||
[16.75, 3.433877350917482e-07, 343.38772746180666],
|
||||
]
|
||||
)
|
||||
def test_short_range_model(time, expected_sr_normed_concentration, expected_concentration,
|
||||
concentration_model, presences, expirations, dilutions):
|
||||
|
||||
model = ShortRangeModel(presences, expirations, dilutions)
|
||||
np.testing.assert_almost_equal(
|
||||
model._normed_concentration(concentration_model, time).mean(), expected_sr_normed_concentration
|
||||
)
|
||||
np.testing.assert_almost_equal(
|
||||
model.short_range_concentration(concentration_model, time).mean(), expected_concentration, decimal=0
|
||||
)
|
||||
Loading…
Reference in a new issue