\chapter{Doses}\label{ch:doses}
\section{Ingestion}
\subsection*{Physics}
Ingestion dose is calculated from food concentration, daily consumption and
an age-dependent dose coefficient, summed over foods and exposure intervals
(\cref{eq:ingest}). These are potential doses for the assumed diet and
food supply \cite{mueller1993}.

Cohort ages advance with elapsed time, changing consumption rates and dose
coefficients. Seasonal multipliers represent variation in diet over the
year. Exposure to stored plant foods begins when contaminated supplies
become available; the ingestion integral accounts for this onset
(\cref{eq:onset}).
\subsection*{Equations}
For interval duration $\Delta t_i=t_i-t_{i-1}$ in days and endpoints
$a=C_m(t_{i-1})$, $b=C_m(t_i)$ in
\si{\becquerel\per\kilogram}, define
\begin{equation}\label{eq:logmean}
L(a,b)=\begin{cases}(a-b)/\ln(a/b),&a,b>0\text{ and distinguishable},\\
(a+b)/2,&\text{otherwise}.
\end{cases}
\end{equation}
For a stored plant's onset $o_m$, put
$\phi_{mi}=\operatorname{clip}((t_i-o_m)/\Delta t_i,0,1)$ and substitute
$a=C_m(o_m^+)$ if $t_{i-1}<o_m$; then
\begin{equation}\label{eq:ingest}
D^{\rm ing}_{cmi}=\Delta t_i\,\phi_{mi}\,L(a,b)\,
Q_{cm}(\mathrm{age}_c+t_i)\,\bar s_{mi}\,
e_c(\mathrm{age}_c+t_i).
\end{equation}
$\mathrm{age}_c$ is cohort $c$'s age at the event; elapsed time is converted
to the same age unit when evaluating $Q$ and $e$. $\bar s_{mi}$ is the
dimensionless mean seasonal factor for material $m$ over interval $i$.
$Q$ is in \si{\kilogram\per\day}, $e$ in
\si{\sievert\per\becquerel}, and $D$ in Sv. For foods
without a known step, $\phi=1$ and ordinary endpoint values are used.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$Q_{cm}$ & \si{\kilogram\per\day} & consumption\_rate.kg\_day,age\_years & consumption\_rates\_kg\_day\\
$s_m$ & 1 & seasonal\_consumption\_factor.factor,start\_day,end\_day & seasonal\_factors,seasonal\_start\_days,seasonal\_end\_days\\
$e_c$ & \si{\sievert\per\becquerel} & dose\_factor.value,unit (ingestion/effective\_dose) & effective\_dose\_factor\_values\\\bottomrule\end{tabular}\end{center}
Loader \coderef{ecosys/data/loader.py}{545}{582}; compiler
\coderef{ecosys/data/compile.py}{744}{829}.
\subsection*{Implementation}
\coderef{ecosys/kernels/dosimetry.py}{83}{107} interpolates ages;
\coderef{ecosys/kernels/dosimetry.py}{110}{174} implements the mean and step;
\coderef{ecosys/kernels/dosimetry.py}{177}{225} forms interval and cumulative
dose. \coderef{ecosys/engine.py}{1821}{1903} averages seasonal factors;
\coderef{ecosys/engine.py}{1951}{2098} assembles batch+time+cohort+food.
\subsection*{Numerical treatment}
Age-indexed consumption rates and dose coefficients are interpolated at the
interval's right node. Daily calendar overlaps give $\bar s$, including on
multi-year intervals. The logarithmic mean integrates a single exponential
exactly, but approximates more complex concentration histories. Zero or
nearly equal endpoints use the arithmetic mean, with equality tolerance
$|a-b|\leq 10^{-12}\max(a,b)$. The available fraction and post-onset
concentration restrict exposure to the period after contaminated supplies
arrive (\sd{18}).
\relation{Equations~(17)--(18) of \cite{mueller1993} describe ingestion.
Age interpolation and onset-aware logarithmic-mean quadrature are specified
by \sd{16} and \sd{18}. Historical quadrature and clock conventions are
described in Appendix~\ref{sec:history-doses}.}
\evidence{\codefn{tests/kernels/test_ingestion_dose.py::test_availability_onset_enters_continuously_for_sensitivity_analysis},
\codefn{tests/kernels/test_consumption.py},
\codefn{tests/integration/test_event_ingestion.py},
\codefn{tests/integration/test_time_support_contract.py}.}

\section{Cloud and resuspension inhalation}
\subsection*{Physics}
Cloud inhalation uses the time-integrated air concentration during passage.
Multiplication by the inhalation rate gives total inhaled activity for the
event.

Resuspension produces a time-dependent air concentration after deposition.
Inhaled activity depends on this concentration, inhalation rate and exposure
duration. Both routes apply an age-dependent inhalation coefficient and
environmental reduction factors reflecting the cohort's residence pattern
(\cref{eq:inh}).
\subsection*{Equations}
For $B_c$ in \si{\cubic\metre\per\hour}, $h_c$ in
\si{\sievert\per\becquerel}, inhalation reduction $\rho_c^{\rm inh}$ unitless,
\begin{align}\label{eq:inh}
D^{\rm cloud}_{c}&=C_a B_c(1\,\mathrm h/3600\,\mathrm s)h_c\rho_c^{\rm inh},\\
D^{\rm res}_{ci}&=C_{\rm res}(t_i)B_c(t_i)
\,[24\Delta t_i\,\mathrm{h\,d}^{-1}]h_c(t_i)\rho_c^{\rm inh}.
\end{align}
The units cancel to Sv. The cloud term is assigned to the first non-pre-event
support node; the resuspension concentration is right-node held.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$B_c$ & \si{\cubic\metre\per\hour} & human\_inhalation\_rate.m3\_h & human\_inhalation\_rates\_m3\_h\\
$h_c$ & \si{\sievert\per\becquerel} & dose\_factor.value (inhalation) & effective\_dose\_factor\_values\\
$\rho_c^{\rm inh}$ & 1 & time\_activity.inhalation\_reduction\_factor & time\_activity\_values\\\bottomrule\end{tabular}\end{center}
Loader \coderef{ecosys/data/loader.py}{568}{581},
\coderef{ecosys/data/loader.py}{643}{662}; compiler
\coderef{ecosys/data/compile.py}{875}{900}.
\subsection*{Implementation}
\coderef{ecosys/kernels/exposure.py}{71}{134} computes both doses;
\coderef{ecosys/engine.py}{2123}{2128} weights residence fractions and
\coderef{ecosys/engine.py}{2212}{2363} allocates intervals.
\subsection*{Numerical treatment}
Cloud inhalation dose is assigned once at the event node. Resuspension dose
uses the concentration, inhalation rate and coefficient at the right support
node for the entire interval; its accuracy therefore depends on time support.
Integrated air concentration and inhalation rate are converted to compatible
time units before multiplication (\sd{01}).
\relation{Cloud inhalation follows Eq.~(19) of \cite{mueller1993}.
Physical air-input units and enriched resuspension are specified by \sd{01}
and \sd{04}; see Appendix~\ref{sec:history-doses}.}
\evidence{\codefn{tests/kernels/test_cloud_inhalation.py::test_cloud_inhalation_uses_physical_air_activity_and_rate_conversion},
\codefn{tests/kernels/test_resuspension_inhalation.py::test_resuspension_inhalation_interval_and_cumulative_dose},
\codefn{tests/integration/test_event_exposure.py}.}

\section{External ground and population dose}
\subsection*{Physics}
Activity on the ground can irradiate a person without being eaten or
inhaled. The engine starts this route from the ground-target deposit plus
dry deposition on turf (lawn), its prescribed grassland-like source.
Initially the deposited activity is exposed; over time physical radioactive
decay lowers its activity and migration beneath the surface reduces the
radiation reaching people. The latter effect is represented by two
empirical shielding components, one faster and one slower, with rates
distinct from those governing root-zone availability
(\cref{eq:ground,eq:soilfrac}).

Indoor and outdoor environments have different ground-dose reduction factors.
The engine weights these factors by each cohort's residence fractions,
then combines that reduction with an age-dependent ground dose coefficient.

Per-capita pathway doses can be added for a cohort and
accumulated through time. Multiplying each cohort's accumulated dose by its
population count and adding cohorts gives a collective dose, customarily
reported in person-Sv (\cref{eq:pop}).
\subsection*{Equations}
For component fraction $a_j$ and half-life $T_j$, let
$\gamma_j=\ln2/T_j$ after converting $T_j$ to days. The component rate
$\gamma_j$ and physical rate $\lambda_{\phys}$ are both in \si{\per\day}.
With ground coefficient $g_c$ in
\si{\sievert\square\metre\per\becquerel\per\day} and dimensionless
residence-weighted ground reduction $\rho_c^{\rm ground}$, the result is
\begin{equation}\label{eq:ground}
D^{\rm ground}_{ci}=A_{\rm shine}g_c(t_i)\rho_c^{\rm ground}
\sum_{j=1}^{2}a_j
\frac{e^{-(\lambda_{\phys}+\gamma_j)t_{i-1}}-
e^{-(\lambda_{\phys}+\gamma_j)t_i}}
{\lambda_{\phys}+\gamma_j}.
\end{equation}
The fraction has units days; the entire expression is Sv. For pathway
interval doses $D_{cik}$ and dimensionless cohort counts $N_c$,
\begin{equation}\label{eq:pop}
D^{\rm cum}_{ck}(t_n)=\sum_{i\leq n}D_{cik},\qquad
D^{\rm collective}(t_n)=\sum_c N_c\sum_k D^{\rm cum}_{ck}(t_n).
\end{equation}
Collective dose is customarily person-Sv (numerically Sv times persons).
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$a_j,T_j$ & 1, yr & ground\_decay\_component.fraction,half\_life\_years & ground\_decay\_fractions,ground\_decay\_half\_lives\_years\\
$g_c$ & \si{\sievert\square\metre\per\becquerel\per\second} & dose\_factor.value (ground\_external) & effective\_dose\_factor\_values\\
$\rho_c^{\rm ground}$ & 1 & nuclide\_environment\_factor.factor; time\_activity.long\_term\_fraction & environment\_factors,standard\_environment\_distribution\\\bottomrule\end{tabular}\end{center}
The input coefficient is in seconds and converted by Astropy to a per-day
coefficient in the kernel. Loader \coderef{ecosys/data/loader.py}{568}{581},
\coderef{ecosys/data/loader.py}{606}{654}; compiler
\coderef{ecosys/data/compile.py}{831}{900}.
\subsection*{Implementation}
\coderef{ecosys/kernels/integration.py}{20}{69} integrates exponentials;
\coderef{ecosys/kernels/exposure.py}{146}{196} composes ground dose;
\coderef{ecosys/engine.py}{2131}{2137} reduces environments and
\coderef{ecosys/engine.py}{2364}{2401} fills batch+time+cohort+pathway.
\coderef{ecosys/engine.py}{2668}{2693} and
\coderef{ecosys/engine.py}{2745}{2770} aggregate cohorts.
\subsection*{Numerical treatment}
Ground exponentials integrate exactly using \codefn{expm1}, but changing
right-node age or environment factors between nodes is not integrated
continuously. Cumulative arrays sum right-owned interval measures.
\relation{Ground irradiation follows Eqs.~(22)--(23) of \cite{mueller1993}.
Shielding and root-zone migration are distinct processes (\sd{12}). Source
and clock comparisons are in Appendix~\ref{sec:history-doses}.}
\evidence{\codefn{tests/kernels/test_ground_dose.py::test_ground_dose_matches_closed_form_component_integral},
\codefn{tests/kernels/test_shielding.py},
\codefn{tests/integration/test_population_dose.py}.}

\section{External irradiation by the passing cloud}\label{sec:cloud-submersion}
\subsection*{Physics}
The passing cloud produces external irradiation independently of inhalation
and ground deposition. Integrated air concentration is multiplied by an
age-dependent effective-dose coefficient and a shielding factor weighted by
the cohort's short-term environmental residence fractions. Noble gases can
contribute despite having no terrestrial
deposition.
\subsection*{Equations}
Let $C_a$ be integrated air activity in
\si{\becquerel\second\per\cubic\metre}, $g^{\rm sub}_{\nu c}$ the
initial-age effective-dose coefficient in
\si{\sievert\cubic\metre\per\becquerel\per\second}, and $s_{\nu j}$
the dimensionless nuclide/cloud shielding factor in environment $j$.
For short-term fractions $f^{\rm short}_{cj}$,
\begin{equation}\label{eq:cloudsub}
D^{\rm sub}_{c,0}=C_a g^{\rm sub}_{\nu c}
\underbrace{\sum_j f^{\rm short}_{cj}s_{\nu j}}_{\rho^{\rm sub}_{\nu c}}.
\end{equation}
The fractions use the reference short-term distribution unless an explicit
cohort activity profile overrides them. The result has units Sv.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$g^{\rm sub}$ & Sv m$^3$/(Bq s) & dose\_factor.value,unit (cloud\_external/effective\_dose) & effective\_dose\_factor\_values\\
$s_{\nu j}$ & 1 & nuclide\_environment\_factor.factor (cloud) & environment\_factors\\
$f^{\rm short}_{cj}$ & 1 & time\_activity.cloud\_passage\_fraction or cohort override & time\_activity\_values or activity\_fractions\\\bottomrule\end{tabular}\end{center}
\subsection*{Implementation}
The loader \pathref{ecosys/data/loader.py}{_RESOLVED_DOSE_UNITS}
converts the stored coefficient to an Astropy quantity. The
\pathref{ecosys/kernels/exposure.py}{compute_external_cloud_dose} kernel is
called by \pathref{ecosys/engine.py}{compute_single_event_exposure}, which
applies \codefn{_cloud_reduction} and includes the impulse in effective-dose
totals when \codefn{cloud_external} is included in the request's pathway
list. This pathway is not selected by default.
\subsection*{Numerical treatment}
The entire cloud exposure is assigned to the first non-pre-event support
node. It is unchanged by refining later support. The kernel accepts
equivalent integrated-air units such as Bq h/m$^3$ through dimensional
conversion.
\relation{External-cloud exposure uses the coefficient and shielding
formulation of \cite{mueller1993}. Historical input-unit conventions are
documented in Appendix~\ref{sec:history-doses} (\sd{01}).}
\evidence{\codefn{tests/kernels/test_cloud_external.py},
\codefn{tests/integration/test_event_exposure.py::test_public_engine_opt_in_cloud_submersion_is_in_effective_total},
\codefn{tests/validation/legacy/test_vm_cloud_outputs.py}. The 66 preserved
reference cloud report cells agree within $3\times10^{-8}$ relative error across
three runs and two supports.}

\section{Skin-tissue dose from surface contamination}\label{sec:skin-tissue}
\subsection*{Physics}
Dry and wet deposition produce skin-surface contamination that undergoes
radioactive decay over a finite retention time. Radiation-specific
coefficients convert integrated surface activity to skin-tissue dose.
Contaminated clothing contributes gamma radiation alone; uncovered skin
receives alpha, beta and gamma radiation.
\subsection*{Equations}
With skin deposition velocity $v_H$ in m/s, wet retention fraction $f_H$
and wet ground activity $A_w$ in Bq/m$^2$, define
\begin{align}
\rho^{\rm dry}_c &= \sum_j f^{\rm short}_{cj}r^{\rm inh}_j,
\qquad \rho^{\rm wet}_c = f^{\rm short}_{c,\rm rural}+f^{\rm short}_{c,\rm urban},\notag\\
A_H &= C_a v_H\rho^{\rm dry}_c+A_w f_H\rho^{\rm wet}_c,\notag\\
g_H &= g_\gamma+(1-f_K)(g_\alpha+g_\beta),\notag\\
D^{\rm skin\ tissue}_{c,0} &= A_H\big|_{\Bq/\mathrm{cm}^2}\,g_H
\frac{1-e^{-\lambda T_H}}{\lambda}.\label{eq:skintissue}
\end{align}
$A_H$ is in Bq/m$^2$ before conversion to Bq/cm$^2$; $f_K$ is the
clothing-covered fraction. Each $g$ has units Sv cm$^2$/(Bq s), $T_H$
is retention time in seconds, and $\lambda=\ln2/T_{1/2}$ has units s$^{-1}$.
Here $j$ indexes environments, and $r^{\rm inh}_j$ is the inhalation
reduction factor in environment $j$.
The result is Sv to skin tissue, not effective dose.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$g_\alpha,g_\beta,g_\gamma$ & Sv cm$^2$/(Bq s) & skin\_dose\_factor.value,unit & skin\_dose\_factor\_values\\
$v_H,f_H$ & m/s, 1 & skin\_contamination\_parameter.value,unit & skin\_parameter\_values\\
$f_K,T_H$ & 1, h & skin\_contamination\_parameter.value,unit & skin\_parameter\_values\\
$r^{\rm inh},f^{\rm short}$ & 1 & time\_activity.inhalation\_reduction\_factor,cloud\_passage\_fraction & time\_activity\_values\\
$T_{1/2}$ & year & nuclide.half\_life\_years & physical\_half\_life\_years\\\bottomrule\end{tabular}\end{center}
\subsection*{Implementation}
The kernel \pathref{ecosys/kernels/exposure.py}{compute_skin_tissue_dose}
performs the dimensional calculation.
\codefn{EcosysEngine.skin_tissue_dose(request)} returns one
\codefn{SingleEventPathwayDose} per event under ID \codefn{skin_tissue},
separately from the effective-dose totals returned by \codefn{run}.
The distinct effective-dose \codefn{skin} pathway remains unsupported;
requesting it raises \codefn{UnsupportedPathwayError} (\sd{11}).
\subsection*{Numerical treatment}
The exponential retention integral is evaluated using \codefn{expm1} and
physical half-life conversion; the dose is assigned once at the event node,
with zero on pre-event nodes and later intervals. Noble gases have no skin
deposition and return zero.
\relation{The radiation-specific tissue formulation and its distinction from
the effective-dose skin-organ pathway are documented in
Appendix~\ref{sec:history-doses} (\sd{11}).}
\evidence{\codefn{tests/kernels/test_skin.py},
\codefn{tests/integration/test_event_exposure.py::test_skin_wet_deposition_uses_outdoor_environment_ids},
\codefn{tests/integration/test_event_exposure.py::test_skin_tissue_dose_is_separate_from_effective_total}.
The available reference runs do not provide independent skin-tissue
comparison values (\cref{ch:validation}).}
