Skip to content

Photon dose

Three levels of calculation, each building on the previous:

Function What it computes Considers geometry?
calculate_transmission Material attenuation only (exp(-Sigma*t)) No
calculate_flux 1 / (4piR^2) * exp(-Sigma*t) * B per source particle Yes (inverse square law)
calculate_dose Flux * ICRP-116 dose coefficient (per source particle) Yes (inverse square law)

calculate_dose adds an ICRP-116 fluence-to-effective-dose conversion on top of calculate_flux. You must specify the irradiation geometry. The result is per source particle; apply an absolute strength via result.scale(strength=...). If your strength is in particles/sec the resulting dose is in Sv/s; multiply the strength by 3600 to land in Sv/hr; for a pulsed source pass particles/shot to get Sv/shot.

Example

import rad_point_kernel as rpk

iron = rpk.Material(composition={"Fe": 1.0}, density=7.874)
layers = [
    rpk.Layer(thickness=1000),               # 10 m void
    rpk.Layer(thickness=10, material=iron),  # 10 cm iron
]

source = rpk.Source(particle="photon", energy=662e3)
# Continuous source: 1e12 photons/sec activity, scale by photons per hour
result = rpk.calculate_dose(layers=layers, source=source, geometry="AP").scale(
    strength=1e12 * 3600,
)
print(f"Dose rate: {result.dose} Sv/hr")
Dose rate: 2.8758853233463794e-06 Sv/hr

Irradiation geometries

Six geometries from ICRP-116 are supported:

Geometry Description
"AP" Anterior-posterior (front exposure)
"PA" Posterior-anterior (back exposure)
"RLAT" Right lateral
"LLAT" Left lateral
"ROT" Rotational (averaged over rotation)
"ISO" Isotropic (averaged over all directions)

AP is the most conservative for most scenarios. Compare all six:

import rad_point_kernel as rpk

iron = rpk.Material(composition={"Fe": 1.0}, density=7.874)
layers = [
    rpk.Layer(thickness=1000),
    rpk.Layer(thickness=10, material=iron),
]

source = rpk.Source(particle="photon", energy=662e3)
for geo in ["AP", "PA", "RLAT", "LLAT", "ROT", "ISO"]:
    result = rpk.calculate_dose(layers=layers, source=source, geometry=geo).scale(
        strength=1e12 * 3600,
    )
    print(f"{geo}: {result.dose} Sv/hr")
AP: 2.8758853233463794e-06 Sv/hr
PA: 2.3859868770981002e-06 Sv/hr
RLAT: 1.7872221094613147e-06 Sv/hr
LLAT: 1.923305011196948e-06 Sv/hr
ROT: 2.3043371360567204e-06 Sv/hr
ISO: 1.9686659784421587e-06 Sv/hr

With a manual build-up factor

If you already have a dose build-up factor from tabulated data or a prior run, pass it via BuildupModel.constant. See Calculate build-up with MC for how to compute B yourself.

import rad_point_kernel as rpk

iron = rpk.Material(composition={"Fe": 1.0}, density=7.874)
layers = [
    rpk.Layer(thickness=1000),
    rpk.Layer(thickness=10, material=iron),
]

source = rpk.Source(particle="photon", energy=662e3)

B_dose = 1.8
result = rpk.calculate_dose(
    layers=layers,
    source=source,
    geometry="AP",
    buildup=rpk.BuildupModel.constant(B_dose),
).scale(strength=1e12 * 3600)
print(f"Dose rate (B={B_dose}): {result.dose} Sv/hr")
print(f"Applied build-up:     {result.buildup_factor}")
Dose rate (B=1.8): 5.1765935820234835e-06 Sv/hr
Applied build-up:     1.8