compare_concentration_curves methods

This commit is contained in:
Luis Aleixo 2021-09-15 15:59:10 +02:00
parent d83b86de4b
commit e6818c6661
4 changed files with 170 additions and 13 deletions

View file

@ -246,7 +246,8 @@ class FormData:
ventilation=self.ventilation(),
infected=self.infected_population(),
),
exposed=self.exposed_population()
exposed=self.exposed_population(),
fraction_deposited=self.
)
def build_model(self, sample_size=_DEFAULT_MC_SAMPLE_SIZE) -> models.ExposureModel:

View file

@ -486,4 +486,100 @@ def shouting_heavy_exercise_exposure():
mask=models.Mask.types["No mask"],
),
)
return exposure_mc
########## Concentration curves ###########
def classroom_no_mask_windows_closed_exposure():
exposure_mc = mc.ExposureModel(
concentration_model=mc.ConcentrationModel(
room=models.Room(volume=100, humidity=0.5),
ventilation=models.AirChange(
active=models.SpecificInterval(((0, 24),)),
air_exch=0.25,
),
infected=mc.InfectedPopulation(
number=1,
virus=mc.SARSCoV2(
viral_load_in_sputum=symptomatic_vl_frequencies,
infectious_dose=infectious_dose_distribution,
viable_to_RNA=infectious_virus_distribution,
),
presence=models.SpecificInterval(((0, 1.5), (2, 3.5), (4.5, 6), (6.5, 8))),
mask=models.Mask.types["No mask"],
activity=activity_distributions['Light activity'],
expiration=models.Expiration.types['Talking'],
),
),
exposed=mc.Population(
number=14,
presence=models.SpecificInterval(((0, 1.5), (2, 3.5), (4.5, 6), (6.5, 8))),
activity=models.Activity.types['Seated'],
mask=models.Mask.types["No mask"],
),
)
return exposure_mc
def classrom_no_mask_windows_open_breaks():
exposure_mc = mc.ExposureModel(
concentration_model=mc.ConcentrationModel(
room=models.Room(volume=100, humidity=0.5),
ventilation=models.SlidingWindow(
active=models.SpecificInterval(((1.5, 2), (3.5, 4.5), (6, 6.5))),
inside_temp=models.PiecewiseConstant((0, 24), (295,)),
outside_temp=models.PiecewiseConstant((0, 24), (291,)),
window_height=1.6,
opening_length=0.6,
),
infected=mc.InfectedPopulation(
number=1,
virus=mc.SARSCoV2(
viral_load_in_sputum=symptomatic_vl_frequencies,
infectious_dose=infectious_dose_distribution,
viable_to_RNA=infectious_virus_distribution,
),
presence=models.SpecificInterval(((0, 1.5), (2, 3.5), (4.5, 6), (6.5, 8))),
mask=models.Mask.types["No mask"],
activity=activity_distributions['Light activity'],
expiration=models.Expiration.types['Talking'],
),
),
exposed=mc.Population(
number=14,
presence=models.SpecificInterval(((0, 1.5), (2, 3.5), (4.5, 6), (6.5, 8))),
activity=models.Activity.types['Seated'],
mask=models.Mask.types["No mask"],
),
)
return exposure_mc
def classrom_no_mask_windows_open_alltimes():
exposure_mc = mc.ExposureModel(
concentration_model=mc.ConcentrationModel(
room=models.Room(volume=100, humidity=0.5),
ventilation=models.SlidingWindow(
active=models.PeriodicInterval(period=120, duration=120),
inside_temp=models.PiecewiseConstant((0, 24), (295,)),
outside_temp=models.PiecewiseConstant((0, 24), (291,)),
window_height=1.6, opening_length=0.6,
),
infected=mc.InfectedPopulation(
number=1,
virus=mc.SARSCoV2(
viral_load_in_sputum=symptomatic_vl_frequencies,
infectious_dose=infectious_dose_distribution,
viable_to_RNA=infectious_virus_distribution,
),
presence=models.SpecificInterval(((0, 1.5), (2, 3.5), (4.5, 6), (6.5, 8))),
mask=models.Mask.types["No mask"],
activity=activity_distributions['Light activity'],
expiration=models.Expiration.types['Talking'],
),
),
exposed=mc.Population(
number=14,
presence=models.SpecificInterval(((0, 1.5), (2, 3.5), (4.5, 6), (6.5, 8))),
activity=models.Activity.types['Seated'],
mask=models.Mask.types["No mask"],
),
)
return exposure_mc

View file

@ -13,25 +13,25 @@ from itertools import product
from dataclasses import dataclass
# Exhaled virions while talking, seated #
print('\n<<<<<<<<<<< Vlout for Talking, seated >>>>>>>>>>>')
#print('\n<<<<<<<<<<< Vlout for Talking, seated >>>>>>>>>>>')
#exposure_model_from_vl_talking()
# Exhaled virions while breathing, seated #
print('\n<<<<<<<<<<< Vlout for Breathing, seated >>>>>>>>>>>')
#print('\n<<<<<<<<<<< Vlout for Breathing, seated >>>>>>>>>>>')
#exposure_model_from_vl_breathing()
# Exhaled virions while breathing, light activity #
print('\n<<<<<<<<<<< Vlout for Shouting, light activity >>>>>>>>>>>')
#print('\n<<<<<<<<<<< Vlout for Shouting, light activity >>>>>>>>>>>')
#exposure_model_from_vl_shouting()
# Exhaled virions while talking according to BLO model, seated #
print('\n<<<<<<<<<<< Vlout for Talking, seated with chosen Cn,L >>>>>>>>>>>')
#print('\n<<<<<<<<<<< Vlout for Talking, seated with chosen Cn,L >>>>>>>>>>>')
#exposure_model_from_vl_talking_cn()
# Exhaled virions while breathing according to BLO model, seated #
print('\n<<<<<<<<<<< Vlout for Breathing, seated with chosen Cn,B >>>>>>>>>>>')
#print('\n<<<<<<<<<<< Vlout for Breathing, seated with chosen Cn,B >>>>>>>>>>>')
#exposure_model_from_vl_breathing_cn()
print('\n')
#print('\n')
############ Plots with viral loads and emission rates + statistical data ############
#present_vl_er_histograms(activity='Seated', mask='No mask')
@ -42,8 +42,20 @@ print('\n')
#generate_cdf_curves()
############ Deposition Fraction Graph ############
print('\n<<<<<<<<<<< Deposition Fraction for Breathing, seated >>>>>>>>>>>')
calculate_deposition_factor()
#print('\n<<<<<<<<<<< Deposition Fraction for Breathing, seated >>>>>>>>>>>')
#calculate_deposition_factor()
############ Comparison between concentration curves ############
# compare_concentration_curves_virus([classroom_model_IGH_no_mask_windows_closed[0],classroom_model_IGH_no_mask_windows_open_breaks[0],
# classroom_model_IGH_no_mask_windows_open_alltimes[0]],
# labels=['Windows closed', 'Window open during breaks', 'Window open at all times'],
# colors=['tomato', 'lightskyblue', 'limegreen', '#1f77b4', 'seagreen', 'lightskyblue', 'deepskyblue'],
# title='No mask - Spring/Summer period'
# )
# print_qd_info(classroom_model_IGH_no_mask_windows_closed[0])
# print_qd_info(classroom_model_IGH_no_mask_windows_open_breaks[0])
# print_qd_info(classroom_model_IGH_no_mask_windows_open_alltimes[0])
compare_concentration_curves()
############ Used for testing ############
#exposure_model_from_vl_talking_new_points()

View file

@ -469,8 +469,7 @@ def generate_cdf_curves():
fig.set_figwidth(5)
plt.show()
############ Deposition Fraction Graph ############
#
############ Deposition Fraction Graph #############
def calculate_deposition_factor():
fig = plt.figure()
@ -526,6 +525,54 @@ def calculate_deposition_factor():
plt.tight_layout()
plt.show()
############ Compare concentration curves ############
def compare_concentration_curves():
exp_models=[classroom_no_mask_windows_closed_exposure().build_model(size=SAMPLE_SIZE),
classrom_no_mask_windows_open_breaks().build_model(size=SAMPLE_SIZE),
classrom_no_mask_windows_open_alltimes().build_model(size=SAMPLE_SIZE)]
labels=['Windows closed', 'Window open during breaks', 'Window open at all times']
colors=['tomato', 'lightskyblue', 'limegreen', '#1f77b4', 'seagreen', 'lightskyblue', 'deepskyblue']
start=min(min(model.concentration_model.infected.presence.transition_times()) for model in exp_models)
stop=max(max(model.concentration_model.infected.presence.transition_times()) for model in exp_models)
TIMESTEP = 0.01
times=np.arange(start, stop, TIMESTEP)
concentrations = [[np.mean(model.concentration_model.concentration(t)) for t in times] for model in exp_models]
fig, ax = plt.subplots()
for c, label, color in zip(concentrations, labels, colors):
ax.plot(times, c, label=label, color=color)
ax.legend(loc='upper left')
ax.set_ylim(ax.get_ylim()[0], ax.get_ylim()[1] * 1.2)
ax.spines["right"].set_visible(False)
# When merged, use the integrated_concentration function.
factors = [0.6 * model.exposed.activity.inhalation_rate * (1 - model.exposed.mask.η_inhale) for model in exp_models]
present_indexes = np.array([exp_models[0].exposed.person_present(t) for t in times])
modified_concentrations = [np.array(c) for c in concentrations]
for mc in modified_concentrations:
mc[~present_indexes] = 0
cumulative_doses = [[np.trapz(c[:i + 1], times[:i + 1]) * factor for i in range(len(times))]
for c, factor in zip(modified_concentrations, factors)]
plt.xlabel("Exposure time ($h$)", fontsize=14)
plt.ylabel("Mean viral concentration\n(virion m$^{-3}$)", fontsize=14)
ax1 = ax.twinx()
for qd, label, color in zip(cumulative_doses, labels, colors):
ax1.plot(times, qd, label='qD - ' + label, color=color, linestyle='dotted')
ax1.spines["right"].set_linestyle("--")
ax1.spines["right"].set_linestyle((0,(1,5)))
ax1.set_ylabel('Mean cumulative dose\n(virion)', fontsize=14)
ax1.set_ylim(ax1.get_ylim()[0], ax1.get_ylim()[1] * 1.2)
plt.show()
######### Auxiliar functions #########
def get_enclosure_points(x_coordinates, y_coordinates):
@ -647,8 +694,6 @@ def build_breathing_legend(fig):
def print_er_info(er: np.array, log_er: np.array):
"""
Prints statistical parameters of a given distribution of ER-values
:param er: A numpy-array of the ER-values
:return: Nothing, parameters are printed
"""
print(f"MEAN of ER = {np.mean(er)}\n"
f"MEAN of log ER = {np.mean(log_er)}\n"
@ -661,3 +706,6 @@ def print_er_info(er: np.array, log_er: np.array):
print(f"ER_{quantile} = {np.quantile(er, quantile)}")
return