Scalar dose
The example uses one Cs-137 deposition event and one adult cohort. The default event-anchored grid supplies the integration nodes for a one-year calculation.
from datetime import date
import astropy.units as u
import numpy as np
from ecosys import EcosysEngine
from ecosys.domain.events import DepositionEvent
from ecosys.domain.populations import PopulationCohorts
from ecosys.domain.request import SimulationRequest
event = DepositionEvent(
nuclide_id="cs_137",
date=np.datetime64("2001-01-01"),
integrated_air_activity=1 * u.Bq * u.s / u.m**3,
wet_ground_deposition=1 * u.Bq / u.m**2,
rainfall=1 * u.mm,
)
population = PopulationCohorts(
initial_age=np.array([30]) * u.year,
population=np.array([1]) * u.dimensionless_unscaled,
)
request = SimulationRequest.on_default_grid(
(event,),
population,
output_start_date=date(2001, 1, 1),
horizon_years=1,
)
result = EcosysEngine().run(request)
# The complete tree is returned directly; no internal kernel call is required.
result.per_capita.interval # batch + time + cohort
result.per_capita.cumulative # batch + time + cohort
result.collective.collective # batch + time
result.materials.concentration # batch + time + material
result.animal_products.concentration # batch + time + animal_product
result.event_contributions # per-event aligned detail
Per-capita interval and cumulative doses are in Sv; collective dose is in person-Sv. Material and animal-product concentrations are in Bq/kg. This scalar request has no leading batch dimensions. Cohort age is specified at the output origin and advances throughout the calculation. See time support and reports for custom grids and dose intervals.
For a constant concentration over a known exposure interval, supply the concentration and duration separately rather than labelling the concentration as an integrated quantity:
one_day_event = DepositionEvent.from_constant_air_concentration(
nuclide_id="cs_137",
date=date(1986, 4, 29),
air_concentration=300 * u.Bq / u.m**3,
exposure_duration=1 * u.day,
wet_ground_deposition=16000 * u.Bq / u.m**2,
rainfall=4.5 * u.mm,
)
assert one_day_event.integrated_air_activity.to_value(u.Bq * u.s / u.m**3) == 300 * u.day.to(u.s)