\(\renewcommand\AA{\text{Å}}\)

Neutron activation

periodictable.activation

Calculate expected neutron activation from time spent in beam line.

Notation information for activation product:

m, m1, m2: indicate metastable states. Decay may be to the ground state or to another nuclide.

+: indicates radioactive daughter production already included in daughter listing several parent t1/2’s required to acheive calculated daughter activity. All activity assigned at end of irradiation. In most cases the added activity to the daughter is small.

*: indicates radioactive daughter production NOT calculated, approximately secular equilibrium

s: indicates radioactive daughter of this nuclide in secular equilibrium after several daughter t1/2’s

t: indicates transient equilibrium via beta decay. Accumulation of that nuclide during irradiation is separately calculated.

Reaction = b indicates production via decay from an activation produced parent

Accounts for burnup and 2n, g production.

This is only a gross estimate. Many effects are not taken into account, such as self-shielding in the sample and secondary activation from the decay products.

Example:

>>> from periodictable import activation
>>> env = activation.ActivationEnvironment(fluence=1e5, Cd_ratio=70, fast_ratio=50, location="BT-2")
>>> sample = activation.Sample("Co30Fe70", 10)
>>> sample.calculate_activation(env, exposure=10, rest_times=[0, 1, 24, 360])
>>> sample.show_table()
                                       ----------------- activity (uCi) ------------------
isotope  product   reaction  half-life        0 hrs        1 hrs       24 hrs      360 hrs
-------- --------- -------- ---------- ------------ ------------ ------------ ------------
Co-59    Co-60          act    5.272 y    0.0004959    0.0004959    0.0004958    0.0004933
Co-59    Co-60m+        act     10.5 m        1.664      0.03169          ---          ---
-------- --------- -------- ---------- ------------ ------------ ------------ ------------
                                 total        1.664       0.0322    0.0005084    0.0005049
-------- --------- -------- ---------- ------------ ------------ ------------ ------------

>>> print("%.3f"%sample.decay_time(0.001)) # number of hours to reach 1 nCi
2.053

The default rest times used above show the sample activity at the end of neutron activation and after 1 hour, 1 day, and 15 days.

The neutron activation table, activation.dat,[1] contains details about the individual isotopes, with interaction cross sections taken from from IAEA-273[2].

Activation can be run from the command line using:

$ python -m periodictable.activation FORMULA

where FORMULA is the chemical formula for the material.

class periodictable.activation.ActivationEnvironment(fluence=100000.0, Cd_ratio=0.0, fast_ratio=0.0, location='')

Bases: object

Neutron activation environment.

The activation environment provides details of the neutron flux at the sample position.

fluence : float | n/cm^2/s

Thermal neutron fluence on sample. For COLD neutrons enter equivalent thermal neutron fluence.

Cd_ratio : float

Neutron cadmium ratio. Use 0 to suppress epithermal contribution.

fast_ratio : float

Thermal/fast ratio needed for fast reactions. Use 0 to suppress fast contribution.

property epithermal_reduction_factor

Used as a multiplier times the resonance cross section to add to the thermal cross section for all thermal induced reactions.

class periodictable.activation.ActivationResult(**kw)

Bases: object

class periodictable.activation.Sample(formula, mass, name=None)

Bases: object

Sample properties.

formula : chemical formula

Chemical formula. Any format accepted by formulas.formula() can be used, including formula string.

mass : float | g

Sample mass.

name : string

Name of the sample (defaults to formula).

calculate_activation(environment, exposure=1, rest_times=(0, 1, 24, 360), abundance=<function NIST2001_isotopic_abundance>)

Calculate sample activation after exposure to a neutron flux.

environment is the exposure environment.

exposure is the exposure time in hours (default is 1 h).

rest_times is the list of deactivation times in hours (default is [0, 1, 24, 360]).

abundance is a function that returns the relative abundance of an isotope. By default it uses NIST2001_isotopic_abundance(), and there is the alternative IAEA1987_isotopic_abundance().

decay_time(target)

After determining the activation, compute the number of hours required to achieve a total activation level after decay.

show_table(cutoff=0.0001, format='%.4g')

Tabulate the daughter products.

cutoff=1 : float | uCi

The minimum activation value to show.

format=”%.1f” : string

The number format to use for the activation.

periodictable.activation.IAEA1987_isotopic_abundance(iso)

Isotopic abundance in % from the IAEA, as provided in the activation.dat table.

Note: this will return an abundance of 0 if there is no neutron activation for the isotope even though for isotopes such as H[1], the natural abundance may in fact be rather large.

IAEA 273: Handbook on Nuclear Activation Data, 1987.

periodictable.activation.NIST2001_isotopic_abundance(iso)

Isotopic abundance in % from the periodic table package.

Böhlke, et al. Isotopic Compositions of the Elements, 2001. J. Phys. Chem. Ref. Data, Vol. 34, No. 1, 2005

periodictable.activation.activity(isotope, mass, env, exposure, rest_times)

Compute isotope specific daughter products after the given exposure time and rest period.

Activations are listed in isotope.neutron_activation. Most of the activations (n,g n,p n,a n,2n) define a single step process, where a neutron is absorbed yielding the daughter and some prompt radiation. The daughter itself will decay during exposure, yielding a balance between production and emission. Any exposure beyound about eight halflives will not increase activity for that product.

Activity for daughter products may undergo further neutron capture, reducing the activity of the daughter product but introducing a grand daughter with its own activity.

The data tables for activation are only precise to about three significant figures. Any changes to the calculations below this threshold, e.g., due to slightly different mass or abundance, are therefore of little concern.

Differences in formulas compare to the NCNR activation spreadsheet:

  • Column M: Use ln(2) rather than 0.693

  • Column N: Use ln(2) rather than 0.693

  • Column O: Rewrite to use expm1(x) = exp(x) - 1::

    = L (1 - exp(-M Y43)/(1-(M/N) ) + exp(-N Y43)/((N/M)-1) ) = L (1 - N exp(-M Y43)/(N-M) + M exp(-N Y43)/(N-M) ) = L/(N-M) ( (N-M) - N exp(-M Y43) + M exp(-N Y43) ) = L/(N-M) ( N(1 - exp(-M Y43)) + M (exp(-N Y43) - 1) ) = L/(N-M) ( -N expm1(-M Y43) + M expm1(-N) ) = L/(N-M) (M expm1(-N Y43) - N expm1(-M Y43))

  • Column X: Rewrite to use expm1(x) = exp(x) - 1::

    = W ((abs(U)<1e-10 and abs(V)<1e-10) ? (V-U + (V-U)(V+U)/2) : (exp(-U)-exp(-V))) = W (exp(-U) - exp(-V)) = W exp(-V) (exp(V-U) - 1) = W exp(-U) (1 - exp(U-V)) = W exp(-V) expm1(V-U) = -W exp(-U) expm1(U-V) = (U > V) ? (W exp(-V) expm1(V-U)) : (-W exp(-U) expm1(U-V))

Differences in the data tables:

  • AW1462 (W-186 => W-188 2n) t1/2 in hrs is not converting days to hours

  • AK1495 (Au-198 => Au-199 2n) target should be Au-197

  • AN1428 (Tm-169 => Tm-171 2n) t1/2 updated to Tm-171 rather than Tm-172

  • AN1420 (Er-162 => Ho-163 b) t1/2 updated to 4570 y from 10 y

periodictable.activation.demo()
periodictable.activation.find_root(x, f, df, max=20, tol=1e-10)

Find zero of a function.

Returns when \(|f(x)| < tol\) or when max iterations have been reached, so check that \(|f(x)|\) is small enough for your purposes.

Returns x, f(x).

periodictable.activation.init(table, reload=False)

Add neutron activation levels to each isotope.

periodictable.activation.sorted_activity(activity_pair)

Interator over activity pairs sorted by isotope then daughter product.