diff --git a/app/covid-calculator.ipynb b/app/covid-calculator.ipynb deleted file mode 100644 index f663be53..00000000 --- a/app/covid-calculator.ipynb +++ /dev/null @@ -1,370 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 182, - "metadata": {}, - "outputs": [], - "source": [ - "import ipywidgets as w" - ] - }, - { - "cell_type": "code", - "execution_count": 183, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "name_text = w.Text(placeholder=\"E.g. Workshop without masks\", description=\"Simulation name:\",\n", - " style={'description_width': 'auto'}, layout=w.Layout(width='auto'))\n", - "room_number_text = w.Text(placeholder=\"E.g. 17/R-033\", description=\"Room number:\",\n", - " style={'description_width': 'auto'}, layout=w.Layout(width='auto'))\n", - "intro_box = w.VBox(children=(w.HTML(value='CARA Covid Calculator'),\n", - " name_text,\n", - " room_number_text),\n", - " layout=w.Layout(padding='0px 0px 50px 0px'))" - ] - }, - { - "cell_type": "code", - "execution_count": 184, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "volume_text = w.Text(placeholder=\"Room volume (m³)\", description=\"Room volume\", layout=w.Layout(width='auto'))\n", - "area_text = w.Text(placeholder=\"Room floor area (m²)\", description=\"Floor area\", layout=w.Layout(width='auto'))\n", - "height_text = w.Text(placeholder=\"Room ceiling height (m²)\", description=\"Ceiling height\", layout=w.Layout(width='auto'))\n", - "\n", - "room_dimensions_box = w.VBox(children=(volume_text, w.Label(value=\"------- OR -------\"),area_text, height_text),\n", - " layout=w.Layout(padding='0px 0px 50px 0px'))\n", - "\n", - "def manage_room_text_fields(_):\n", - " volume_text.disabled = bool(area_text.value) or bool(height_text.value)\n", - " area_text.disabled = bool(volume_text.value)\n", - " height_text.disabled = bool(volume_text.value)\n", - "\n", - "for text in [volume_text, area_text, height_text]:\n", - " text.observe(manage_room_text_fields)\n", - " text.style.description_width = \"auto\"\n", - "\n", - "volume_text.observe(manage_room_text_fields)\n", - "area_text.observe(manage_room_text_fields)\n", - "height_text.observe(manage_room_text_fields)" - ] - }, - { - "cell_type": "code", - "execution_count": 185, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "ventilation_label = w.Label(\"Ventilation type:\")\n", - "mechanical_button = w.ToggleButton(value=False, description='Mechanical', layout={'width': 'auto'})\n", - "natural_button = w.ToggleButton(value=False, description='Natural', layout={'width': 'auto'})\n", - "\n", - "acph_text = w.Text(description=\"Air changes per hour\", style={'description_width': 'auto'}, layout=w.Layout(width='auto'))\n", - "asfr_text = w.Text(description=\"Air supply flow rate\", style={'description_width': 'auto'}, layout=w.Layout(width='auto'))\n", - "\n", - "w.jsdlink((acph_text, 'value'), (asfr_text, 'disabled'))\n", - "w.jsdlink((asfr_text, 'value'), (acph_text, 'disabled'))\n", - "\n", - "mech_vent_box = w.VBox(\n", - " children=(acph_text, w.Label(value=\"------- OR -------\"), asfr_text),\n", - " layout=w.Layout(display='none', width='auto')\n", - ")\n", - "\n", - "number_of_windows_text = w.Text(description='Number of windows:', style={'description_width': 'auto'},\n", - " layout=w.Layout(width='auto'))\n", - "height_of_window_text = w.Text(description='Height of window:', placeholder='meters',\n", - " style={'description_width': 'auto'}, layout=w.Layout(width='auto'))\n", - "width_of_window_text = w.Text(description='Width of window:', placeholder='meters', style={'description_width': 'auto'},\n", - " layout=w.Layout(width='auto'))\n", - "opening_distance_text = w.Text(description='Opening distance:', placeholder='centimeters', style={'description_width': 'auto'},\n", - " layout=w.Layout(width='auto'))\n", - "window_open_buttons = w.RadioButtons(options=('Always', '15 min / 2h'), layout=w.Layout(width='auto'))\n", - "\n", - "nat_vent_box = w.VBox(\n", - " children=(\n", - " number_of_windows_text,\n", - " opening_distance_text,\n", - " width_of_window_text,\n", - " opening_distance_text,\n", - " w.HBox(children=(\n", - " w.Label('Windows open', layout=w.Layout(width='auto')),\n", - " window_open_buttons\n", - " ))\n", - " ),\n", - " layout=w.Layout(display='none', width='auto'),\n", - ")\n", - "\n", - "\n", - "\n", - "tab_bar = w.HBox(children=(mechanical_button, natural_button))\n", - "ventilation_type_menu = w.VBox(children=(ventilation_label, tab_bar), layout=w.Layout(padding='0px 0px 20px 0px'))\n", - "ventilation_box = w.VBox(children=(ventilation_type_menu, mech_vent_box, nat_vent_box),\n", - " layout=w.Layout(padding='0px 0px 50px 0px'))\n", - "\n", - "def handle_natural_toggle(_):\n", - " if natural_button.value:\n", - " mechanical_button.value = False\n", - " ventilation_box.children[2].layout.display = 'contents'\n", - " else:\n", - " ventilation_box.children[2].layout.display = 'none'\n", - "\n", - "def handle_mechanical_toggle(_):\n", - " if mechanical_button.value:\n", - " natural_button.value = False\n", - " ventilation_box.children[1].layout.display = 'contents'\n", - " else:\n", - " ventilation_box.children[1].layout.display = 'none'\n", - "\n", - "natural_button.observe(handle_natural_toggle)\n", - "mechanical_button.observe(handle_mechanical_toggle)\n", - "left_column = w.VBox(children=(intro_box, room_dimensions_box, ventilation_box),\n", - " layout=w.Layout(width='25%', padding=\"0px 20px 0px 0px\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 186, - "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "scrolled": false - }, - "outputs": [], - "source": [ - "event_data_label = w.Label(\"Event data:\")\n", - "attendees_label = w.Label(\"Attendees:\")\n", - "total_people_text = w.Text(description=\"Total number of people:\", style={'description_width': 'auto'},\n", - " layout=w.Layout(width='auto'))\n", - "infected_people_text = w.Text(description=\"Number of infected people:\", style={'description_width': 'auto'},\n", - " layout=w.Layout(width='auto'))\n", - "activity_dropdown = w.Dropdown(description=\"Activity type:\", options=[\"Training\", \"Workshop\", \"Office\"], value=None,\n", - " layout=w.Layout(width='auto'))\n", - "start_hour = w.Dropdown(options=[\"HH\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(24)], value=\"HH\")\n", - "start_minute = w.Dropdown(options=[\"MM\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(60)], value=\"MM\")\n", - "finish_hour = w.Dropdown(options=[\"HH\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(24)], value=\"HH\")\n", - "finish_minute = w.Dropdown(options=[\"MM\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(60)], value=\"MM\")\n", - "start_box = w.VBox(children=(w.Label(\"Start:\"),\n", - " w.HBox(children=(start_hour, start_minute))),\n", - " layout=w.Layout(padding=\"0px 20px 0px 0px\"))\n", - "finish_box = w.VBox(children=(w.Label(\"Finish:\"),\n", - " w.HBox(children=(finish_hour, finish_minute))))\n", - "event_time_box = w.HBox(children=(start_box, finish_box), layout=w.Layout(width='auto'))\n", - "\n", - "event_intro_box = w.VBox(children=(event_data_label,\n", - " attendees_label,\n", - " total_people_text,\n", - " infected_people_text,\n", - " activity_dropdown,\n", - " event_time_box),\n", - " layout=w.Layout(padding=\"50px 0px 20px 0px\"))\n", - "\n", - "months = (\"january\", \"february\", \"march\", \"april\", \"may\", \"june\",\n", - " \"july\", \"august\", \"september\", \"october\", \"november\", \"december\")\n", - "\n", - "single_button = w.ToggleButton(value=False, description='Single event', layout={'width': 'auto'})\n", - "recurrent_button = w.ToggleButton(value=False, description='Recurrent usage', layout={'width': 'auto'})\n", - "single_recurrent_selection_bar = w.HBox(children=(single_button, recurrent_button), layout=w.Layout(width='auto'), style={'description_width': 'auto'})\n", - "month_dropdown = w.Dropdown(options=months, value=None, description=\"Month:\", layout=w.Layout(width='auto'), style={'description_width': 'auto'})\n", - "day_dropdown = w.Dropdown(options=[i for i in range(1, 32)], value=None, description=\"Day:\", layout=w.Layout(width='auto'))\n", - "date_selector = w.HBox(children=(month_dropdown, day_dropdown), layout=w.Layout(display='none', width='auto'))\n", - "\n", - "months_bar = w.HBox(children=[w.ToggleButton(value=False, description=month[0].upper()) for month in months],\n", - " layout = w.Layout(display='none'))\n", - "\n", - "def handle_single_click(_):\n", - " if single_button.value:\n", - " date_selector.layout.display = 'contents'\n", - " recurrent_button.value = False\n", - " else:\n", - " date_selector.layout.display = 'none'\n", - "\n", - "def handle_recurrent_click(_):\n", - " if recurrent_button.value:\n", - " months_bar.layout.display = 'contents'\n", - " single_button.value = False\n", - " else:\n", - " months_bar.layout.display = 'none'\n", - "\n", - "single_button.observe(handle_single_click)\n", - "recurrent_button.observe(handle_recurrent_click)\n", - "\n", - "date_box = w.VBox(children=(w.HBox(children=(single_button, recurrent_button)),\n", - " w.HBox(children=(date_selector, months_bar))),\n", - " layout=w.Layout(padding=\"0px 0px 30px 0px\"))\n", - "\n", - "lunch_start_hour = w.Dropdown(options=[\"HH\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(24)],\n", - " value=\"HH\", disabled=True)\n", - "lunch_start_minute = w.Dropdown(options=[\"MM\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(60)],\n", - " value=\"MM\", disabled=True)\n", - "lunch_finish_hour = w.Dropdown(options=[\"HH\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(24)],\n", - " value=\"HH\", disabled=True)\n", - "lunch_finish_minute = w.Dropdown(options=[\"MM\"] + [(\"0\" + str(i)) if len(str(i)) == 1 else str(i) for i in range(60)],\n", - " value=\"MM\", disabled=True)\n", - "lunch_start_box = w.VBox(children=(w.Label(\"Start:\"),\n", - " w.HBox(children=(lunch_start_hour, lunch_start_minute))),\n", - " layout=w.Layout(padding=\"0px 20px 0px 0px\"))\n", - "lunch_finish_box = w.VBox(children=(w.Label(\"Finish:\"),\n", - " w.HBox(children=(lunch_finish_hour, lunch_finish_minute))))\n", - "lunch_time_box = w.HBox(children=(lunch_start_box, lunch_finish_box), layout=w.Layout(width='auto'))\n", - "\n", - "lunch_button = w.ToggleButton(value=False, description=\"Lunch break\")\n", - "\n", - "def handle_lunch(_):\n", - " for dropdown in (lunch_start_hour, lunch_start_minute, lunch_finish_hour, lunch_finish_minute):\n", - " dropdown.disabled = not lunch_button.value\n", - "\n", - "lunch_button.observe(handle_lunch)\n", - "\n", - "lunch_break_box = w.VBox(children=(lunch_button, lunch_time_box), layout=w.Layout(padding='0px 0px 20px 0px'))\n", - "\n", - "coffee_button = w.ToggleButton(value=False, description=\"Coffee breaks\")\n", - "coffee_breaks_text = w.Text(description=\"Number of breaks:\", disabled=True, style={'description_width': 'auto'},\n", - " layout=w.Layout(width='auto'))\n", - "coffee_duration = w.Dropdown(description=\"Duration:\", options=[\"MM\"] + [str(i) for i in range(1, 31)], value=\"MM\",\n", - " disabled=True, style={'description_width': 'auto'}, layout=w.Layout(width='auto'))\n", - "regular_breaks_label = w.Label(\"Regular breaks are spread evenly throughout the day\")\n", - "coffee_break_box = w.VBox(children=(coffee_button, coffee_breaks_text, coffee_duration, regular_breaks_label))\n", - "def handle_coffee_button(_):\n", - " coffee_duration.disabled = not coffee_button.value\n", - " coffee_breaks_text.disabled = not coffee_button.value\n", - "\n", - "coffee_button.observe(handle_coffee_button)\n", - "break_box = w.VBox(children=(lunch_break_box, coffee_break_box))\n", - "\n", - "middle_column = w.VBox(children=(event_intro_box, date_box, break_box),\n", - " layout=w.Layout(width='40%', padding='0px 20px 0px 0px'))" - ] - }, - { - "cell_type": "code", - "execution_count": 187, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "mask_label = w.Label(\"Mask wearing:\")\n", - "mask_buttons = w.ToggleButtons(options=[\"Continuous\", \"Removed when seated >2m\"])\n", - "mask_box = w.VBox(children=(mask_label, mask_buttons), layout=w.Layout(padding='50px 0px 30px 0px'))\n", - "\n", - "info_box = w.HTML(value=''\n", - " '

This tool estimates the risk of COVID-19 spread. It is based on current scientific data and '\n", - " 'can be used to provide an illustration for different real world scenarios.


'\n", - " '

How to use this tool:

'\n", - " '

Room data

'\n", - " '

Enter the data about the area you wish to study. You can find these in GIS, or by measuring '\n", - " 'them yourself.

For mechanical ventilation, you should check with a specialist for the '\n", - " 'air flow or air change rate.


'\n", - " '

Event data

'\n", - " '

Enter the total number of people and how many you assume are infected.


'\n", - " '

Activity types:

'\n", - " '

Office = typical scenario all persons seated, talking quietly.

'\n", - " '

Workshop = assembly workshop environment, all persons doing light exercise, talking.

'\n", - " '

Training = one person standing, talking, all others seated, breathing normally.

'\n", - " '

Seminar = As training, but all participants take turns in standing and talking.

'\n", - " '

You should specify if the event is a one off (give date) or recurrent use of the same space '\n", - " 'for the same activity, in which case tick the months when the activity takes place.

'\n", - " '

Specify if a lunch break should be included, and when it starts/stops.

'\n", - " '

If you will take coffee breaks, they are spread out evenly throughout the day, '\n", - " 'in addition to lunch.

Mask wearing: Specify if they are worn all the time, '\n", - " 'or only when less than 2 meters apart.

',\n", - " layout=w.Layout(padding='0px 0px 30px 0px'))\n", - "\n", - "report_button = w.Button(description=\"Generate report\")\n", - "\n", - "right_column = w.VBox(children=(mask_box, info_box, report_button), layout=w.Layout(width='35%'))\n", - "\n", - "components = {'name_text', 'room_number_text', 'volume_text', 'area_text', 'height_text', 'mechanical_button',\n", - " 'acph_text', 'asfr_text', 'natural_button', 'number_of_windows_text', 'height_of_window_text',\n", - " 'width_of_window_text', 'opening_distance_text', 'opening_distance_text', 'window_open_buttons',\n", - " 'total_people_text', 'infected_people_text', 'activity_dropdown', 'start_hour', 'start_minute',\n", - " 'finish_hour', 'finish_minute', 'single_button', 'recurrent_button', 'month_dropdown', 'day_dropdown',\n", - " 'lunch_button', 'lunch_start_hour', 'lunch_start_minute', 'lunch_finish_hour', 'lunch_finish_minute',\n", - " 'coffee_button', 'coffee_breaks_text', 'coffee_duration', 'mask_buttons'}\n", - "components.update(set(months))\n", - "\n", - "def get_value(component_name: str):\n", - " assert component_name in components, f\"{component_name} is not the name of any UI-element with a value-attribute. \" \\\n", - " \"Valid names are:\\n\" + '\\n'.join(sorted(components))\n", - " if component_name in months:\n", - " return months_bar.children[months.index(component_name)].value\n", - "\n", - " return globals()[component_name].value" - ] - }, - { - "cell_type": "code", - "execution_count": 188, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ed8a32168798491b94b149a42af469a2", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(VBox(children=(VBox(children=(HTML(value='CARA Covid Calculator')…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "w.HBox(children=(left_column, middle_column, right_column))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} \ No newline at end of file diff --git a/cara/apps/calculator/README.md b/cara/apps/calculator/README.md index e097863d..ef6883ae 100644 --- a/cara/apps/calculator/README.md +++ b/cara/apps/calculator/README.md @@ -2,7 +2,7 @@ This is a guide to help you use the calculator tool. If you are using the expert version of the tool, you should look at the expert notes. -Please bear in mind that this beta version is for an extensive testing of the functionality of the tool and analyse the results. +Please bear in mind that this beta version is for an extensive testing of the functionality of the tool and analyse the results. At this stage, do not use the results as final output of the workplace risk assessment. For more information on the Airborne Transmission of SARS-CoV-2, feel free to check out the HSE Seminar: https://cds.cern.ch/record/2743403 @@ -13,7 +13,7 @@ For more information on the Airborne Transmission of SARS-CoV-2, feel free to ch The risk assessment tool simulates the long range airborne spread SARS-CoV-2 virus in a finite volume, assuming a homogenous mixture, and estimates the risk of COVID-19 infection thereto. The results DO NOT include short-range airborne exposure (where the physical distance plays a factor) nor the other know modes of transmission of SARS-CoV-2. Hence, this model implies that proper physical distancing, good hand hygiene and other barrier measures are ensured. -It is based on current scientific data and can be used to measures the effectiveness of different mitigation measures. +It is based on current scientific data and can be used to measures the effectiveness of different mitigation measures. Note that this model is based on a deterministic approach, i.e., at least one person is infected and shedding viruses into the volume. Nonetheless, it is also important to understand that the absolute risk of infection is uncertain as it will depend on the probability that someone infected attends the event. @@ -22,7 +22,7 @@ This application is meant for informative and educational purposes. The user can be able to adapt different settings and measure the relative impact on the estimated infection probabilities to allow for a targeted decision making and investment. The user should acknowledge that until the virus is in circulation among the population, the notion of 'zero risk' or a 'completely safe scenario' does not exist. Each event is unique and the results are as accurate as the inputs. -The app is based on our scientific understanding of infectious diseases transmission, exposure and aerosol science as of November 2020. +The app is based on our scientific understanding of infectious diseases transmission, exposure and aerosol science as of November 2020. We do not assume responsibility for any injury or damage to persons or property arising out of or related to any use of this app. @@ -63,8 +63,8 @@ The window opening distance (in m) is: * In the case of windows that slide, the length the window is moved open. * For hinged windows, it is the distance between the fixed frame and the movable glazed part when open. + ![Window Opening Distance](static/images/window_opening.png "How to measure window opening distance") - ![Window Opening Distance](static/images/window_opening.png "How to measure window opening distance") **Notes**: If you are unsure about the opening distance for the window, it is recommended to choose a conservative value (5 cms, 0.05m or 10cms, 0.10m). If you open the window at different distances throughout the day, choose an average value. @@ -89,7 +89,7 @@ The default air flow rate for the HEPA filter in the model is 250m3/hour. Here we capture the information about the event being simulated. First enter the number of occupants in the space, if you have a (small) variation in the number of people, please input the average or consider using the expert tool. -Within the number of people occupying the space, you should specify how many are infected. +Within the number of people occupying the space, you should specify how many are infected. As an example, for a shared office with 4 people, where one person is infected, we enter 4 occupants and 1 infected person. @@ -102,7 +102,7 @@ There are three predefined activities in the tool at present. **Workshop** = Based on a mechanical assembly workshop, all persons are doing light exercise (standing, moving around, using tools) and talking. Everyone (occupants and infected occupants) is treated the same in this model. **Training** = Based on a typical training course scenario. -One individual (the trainer) is doing light exercise (standing) and talking, with all other individuals seated and talking quietly (whispering). +One individual (the trainer) is doing light exercise (standing) and talking, with all other individuals seated and talking quietly (whispering). In this case it is assumed that the infected person is the trainer, because this is the worst case in terms of viral sheeding. @@ -132,7 +132,7 @@ If you plan to eat lunch in the same area where you have been working, you shoul You have the option to choose no coffee breaks, 2 or 4 during the simulated period. It is assumed that all occupants vacate the space during the break period. -If coffee breaks are taken in-situ, this option should be set to 'No breaks'. +If coffee breaks are taken in-situ, this option should be set to 'No breaks'. When enabled, the breaks are spread evenly throughout the day - for example if we simulate the period from 9:00 to 18:00, with a lunch break from 13:00 to 14:00, with 2 coffee breaks, one will be scheduled at 11:00 and the second at 16:00. The exact timing of the breaks within the day is not particularly critical to an accurate simulation, so you do not need to be concerned about major differences if you take a coffee break at 10:00 instead of 11:00. @@ -167,18 +167,18 @@ It is estimated based on the emission rate of virus into the simulated volume, a This probability is valid for the simulation duration - i.e. if you have simulated one day and plan to work 5 days in these conditions and the infected person emits the same amoung of viruses each day, the cumulative probability of infection is ``(1-(1-P(i))^5)```. If you are using the natural ventilation option, the simulation is only valid for the selected month, because the following or preceding month will have a different average temperature profile. -The ``R0`` for the simulation is calculated based on the probability of infection, multiplied by the number of exposed people. +The ``R0`` for the simulation is calculated based on the probability of infection, multiplied by the number of exposed people. ### Exposure graph -The graph shows the variation in the concentration of infectious quanta (one quanta is the amount of inhaled viruses which can cause infection in 63) within the simulated volume. +The graph shows the variation in the concentration of infectious quanta (one quanta is the amount of inhaled viruses which can cause infection with a probability of 63%) within the simulated volume. It is determined by: * The presence of the infected person, who emits airborne viruses in the volume. * The emission rate is related to the type of activity of the infected person (sitting, light exercise), their level of vocalisation (whispering or talking). * The accumulation of infectious quanta in the space is driven by ventilation, if applicable (either natural or mechanical, and or HEPA filtration). * In a mechanical ventilation scenario, the removal rate is constant, based on air flow in and out of the simulated space. * Under natural ventilation conditions, the effectiveness of ventilation relies upon the hourly temperature difference between the inside and outside air temperature. - * A HEPA filter removes infectious quanta from the air at a constant rate and is modelled in the same way as mechanical ventilation, however air passed through a HEPA filter is recycled not renewed (i.e. it is not fresh air). + * A HEPA filter removes infectious quanta from the air at a constant rate and is modelled in the same way as mechanical ventilation, however air passed through a HEPA filter is recycled not renewed (i.e. it is not fresh air). # Conclusion diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index 5573d497..6f05e286 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -172,10 +172,10 @@
This tool simulates the long range airborne spread SARS-CoV-2 virus in a finite volume and estimates the risk of COVID-19 infection. It is based on current scientific data and can be used to measures the effectiveness of different mitigation measures.
- + For detailed explanations on how to use this tool please see the COVID Calculator user-guide .
- Usage summary:
+ Usage summary:
Room data
Enter the data about the area you wish to study. You can find these figures in GIS Portal, or by measuring them yourself.
@@ -198,7 +198,7 @@ You should specify if the event is a one off (give date) or recurrent use of the
-

This software is provided with a disclaimer and code license.

This software is provided with a disclaimer and code license.

Event data: