# Decay product
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/1dKbR6vAT" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Decay_product.png" alt="Decay_product microsim poster" style="width:100%;border:1px solid #4445;border-radius:6px;">
<p><em>Live microsim (desktop) · <a href="https://editor.p5js.org/sciencenibber/sketches/1dKbR6vAT">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/1dKbR6vAT
**Description (100 words):**
A 1500-atom lattice runs a Pattern E "decay clock" for a two-step chain: each parent atom (yellow-green) Bernoulli-trials each frame with probability `1 - exp(-lambda_p * dt)` and turns into a daughter (orange); each daughter does the same with `lambda_d` and freezes as a stable nuclide (green). Three sliders set the parent half-life Tp, daughter half-life Td (defaulting to Mo-99 → Tc-99m → Tc-99 in hours), and simulation speed in sim-hours per real second. A right-hand strip-chart traces N_p(t), N_d(t), N_s(t) normalised to N_0; the bottom HUD names the regime — secular, transient, or no equilibrium — live.
```js
// =============================================================================
// Decay_product - Wikitube microsim
// en.wikitube.io/wiki/Decay_product
//
// Topic: a "decay product" (a.k.a. daughter nuclide) is what is left behind
// after a radioactive parent decays. In nature the parent's daughter is
// usually itself unstable, so a chain forms: Parent -> Daughter -> ... ->
// (stable). This microsim draws a Pattern E "decay clock" with a TWO-STEP
// chain so the reader can see the daughter pop up, build, and then drain
// once the parent is gone.
//
// Defaults model the canonical medical example
// Mo-99 (T_{1/2} ~ 65.94 h) -> Tc-99m (T_{1/2} ~ 6.007 h) -> Tc-99
// because Mo-99 / Tc-99m generators are the textbook secular-equilibrium
// case (T_p >> T_d => A_d / A_p -> 1).
//
// Visual idiom (Nuclear room palette, dark BG, glowing particles):
// * a lattice of atoms drawn as small filled circles, colored by species
// * a strip-chart of N_p(t), N_d(t), N_s(t) on the right
// * live readouts of half-lives, populations, activities
// * regime label: "transient" / "secular equilibrium" / "no equilibrium"
//
// Math primitives used per frame:
// * Per-atom Bernoulli trial with p = 1 - exp(-lambda * dt) for both
// parent and daughter atoms. The exponential form is essential — the
// linear approximation lambda*dt fails the moment dt is comparable to
// the half-life. (Pattern E pitfalls, Nuclear room.)
// * lambda = ln(2) / T_{1/2} with T in hours and dt scaled by a
// "speed" slider so the clock can be sped through several half-lives.
//
// Controls (right-hand HUD prints these in ASCII):
// slider Tp : parent half-life in hours
// slider Td : daughter half-life in hours
// slider sp : simulation speed (sim-hours per real second)
// button reset : reseed N0 atoms back into the parent population
//
// All non-ASCII characters live in COMMENTS only. Editor-wrapper Babel /
// regex transforms choke on Unicode inside template literals or text()
// arguments — see Skills/P5js Microsim Standards and Best Practices/pitfalls.md
// (entry: 2026-04-30 - Unicode in template literals).
// =============================================================================
const ARTICLE = "Decay_product";
p5.disableFriendlyErrors = true;
// --- palette (Nuclear room) -------------------------------------------------
const BG = [ 8, 16, 28]; // deep field
const FG = 240; // primary HUD text
const PARENT_C = [180, 200, 80]; // FUEL yellow-green
const DAUGHT_C = [220, 110, 60]; // FISSION orange
const STABLE_C = [ 80, 200, 140]; // STABLE green
const STRUCT_C = [120, 130, 150]; // muted struct grey
const DIM = 110; // dim HUD text
// --- canvas / layout constants (computed in setup) --------------------------
let MATH_LEFT, MATH_TOP, MATH_W, MATH_H;
let SCOPE_LEFT, SCOPE_TOP, SCOPE_W, SCOPE_H;
// --- simulation state -------------------------------------------------------
const N0 = 1500; // initial parent population
const COLS = 50; // lattice width (COLS * ROWS = N0 + slack)
const ROWS = 32; // lattice height
let atoms = []; // [{i, j, x, y, sp}] sp = 0 parent, 1 daughter, 2 stable
let history = []; // ring of {tH, np, nd, ns, ap, ad}
const HIST_MAX = 360; // ~6 sim-hour scrub at default speed
// --- controls ---------------------------------------------------------------
let tpSlider, tdSlider, spSlider, resetBtn;
let simHours = 0; // simulated hours since seed
// --- setup ------------------------------------------------------------------
function setup() {
createCanvas(720, 520);
pixelDensity(2);
textFont("system-ui");
// layout: 720 x 520 split horizontally — atom field on the left, scope on
// the right, slider strip across the bottom.
MATH_LEFT = 16;
MATH_TOP = 56;
MATH_W = 380;
MATH_H = 360;
SCOPE_LEFT = MATH_LEFT + MATH_W + 24;
SCOPE_TOP = MATH_TOP;
SCOPE_W = 720 - SCOPE_LEFT - 16;
SCOPE_H = MATH_H;
// sliders live in a dedicated bottom strip so the thumb cannot overlap
// the bottom-left readout band (pitfalls 2026-04-30 - slider thumb).
const SY = height - 36;
tpSlider = createSlider(0.5, 200, 65.94, 0.05).position( 80, SY ).size(140);
tdSlider = createSlider(0.05, 50, 6.007, 0.005).position(80, SY+18).size(140);
spSlider = createSlider(0.05, 50, 1.0, 0.05).position(280, SY ).size(140);
resetBtn = createButton("reset").position(280, SY + 18);
resetBtn.mousePressed(seed);
seed();
}
// --- (re)seed the system ----------------------------------------------------
function seed() {
atoms = [];
history = [];
simHours = 0;
// pack N0 atoms into a tidy lattice inside the math pane. The lattice
// gives us a clean visual that reads as "a sample" without the eye
// having to track random positions across resets.
const cellW = MATH_W / COLS;
const cellH = MATH_H / ROWS;
let placed = 0;
for (let j = 0; j < ROWS && placed < N0; j++) {
for (let i = 0; i < COLS && placed < N0; i++) {
atoms.push({
i: i, j: j,
x: MATH_LEFT + (i + 0.5) * cellW,
y: MATH_TOP + (j + 0.5) * cellH,
sp: 0 // start every atom as a parent
});
placed++;
}
}
}
// --- core physics: advance every atom by dt sim-hours -----------------------
function stepDecay(dtHours) {
// half-lives -> decay constants (per sim-hour). guard against zero.
const Tp = max(tpSlider.value(), 1e-6);
const Td = max(tdSlider.value(), 1e-6);
const lambdaP = log(2) / Tp;
const lambdaD = log(2) / Td;
// Bernoulli probabilities for THIS frame. Exponential form, NOT
// lambda*dt — see Nuclear pitfalls.
const pP = 1 - exp(-lambdaP * dtHours);
const pD = 1 - exp(-lambdaD * dtHours);
for (const a of atoms) {
if (a.sp === 0 && random() < pP) { a.sp = 1; continue; }
if (a.sp === 1 && random() < pD) { a.sp = 2; }
}
}
// --- bookkeeping: count populations and activities --------------------------
function countSpecies() {
let np = 0, nd = 0, ns = 0;
for (const a of atoms) {
if (a.sp === 0) np++;
else if (a.sp === 1) nd++;
else ns++;
}
return { np: np, nd: nd, ns: ns };
}
function regimeLabel(Tp, Td) {
// secular equilibrium when T_parent >> T_daughter (rule of thumb x100)
if (Tp / Td > 100) return "secular equilibrium";
if (Tp > Td) return "transient equilibrium";
return "no equilibrium";
}
// --- draw -------------------------------------------------------------------
function draw() {
background(BG[0], BG[1], BG[2]);
// 1. step the simulation.
const speed = spSlider.value(); // sim-hours per real second
const dtHours = min(deltaTime / 1000, 0.05) * speed;
if (dtHours > 0) stepDecay(dtHours);
simHours += dtHours;
// 2. count populations + record history.
const c = countSpecies();
const Tp = tpSlider.value();
const Td = tdSlider.value();
const lambdaP = log(2) / max(Tp, 1e-6);
const lambdaD = log(2) / max(Td, 1e-6);
const Ap = lambdaP * c.np; // activity in "decays per sim-hour"
const Ad = lambdaD * c.nd;
history.push({ tH: simHours, np: c.np, nd: c.nd, ns: c.ns, ap: Ap, ad: Ad });
if (history.length > HIST_MAX) history.shift();
// 3. draw the atom field.
drawAtoms();
// 4. draw the strip-chart of populations + activity ratio.
drawScope();
// 5. HUD — title, control hints, readouts, equation.
drawHud(c, Tp, Td);
}
function drawAtoms() {
noStroke();
// a faint frame so the math pane reads as a "sample".
stroke(STRUCT_C[0], STRUCT_C[1], STRUCT_C[2], 80);
noFill();
rect(MATH_LEFT - 4, MATH_TOP - 4, MATH_W + 8, MATH_H + 8);
noStroke();
for (const a of atoms) {
if (a.sp === 0) fill(PARENT_C[0], PARENT_C[1], PARENT_C[2], 220);
else if (a.sp === 1) fill(DAUGHT_C[0], DAUGHT_C[1], DAUGHT_C[2], 220);
else fill(STABLE_C[0], STABLE_C[1], STABLE_C[2], 200);
circle(a.x, a.y, a.sp === 2 ? 3.0 : 4.5);
}
}
function drawScope() {
// background panel
noStroke();
fill(20, 30, 40);
rect(SCOPE_LEFT, SCOPE_TOP, SCOPE_W, SCOPE_H);
// axes (light grey grid)
stroke(STRUCT_C[0], STRUCT_C[1], STRUCT_C[2], 80);
for (let g = 0; g <= 4; g++) {
const yy = SCOPE_TOP + (g / 4) * SCOPE_H;
line(SCOPE_LEFT, yy, SCOPE_LEFT + SCOPE_W, yy);
}
// three population traces, normalised to N0 so they share the y-axis.
drawTrace(history, "np", PARENT_C);
drawTrace(history, "nd", DAUGHT_C);
drawTrace(history, "ns", STABLE_C);
// scope title + axis labels (ASCII only)
noStroke();
fill(FG);
textSize(11);
textAlign(LEFT, TOP);
text("populations N(t) / N0", SCOPE_LEFT + 8, SCOPE_TOP + 6);
textAlign(LEFT, BOTTOM);
text("t = " + nf(simHours, 1, 2) + " h",
SCOPE_LEFT + 8, SCOPE_TOP + SCOPE_H - 6);
textAlign(RIGHT, BOTTOM);
text("1.0", SCOPE_LEFT + SCOPE_W - 6, SCOPE_TOP + 14);
text("0.0", SCOPE_LEFT + SCOPE_W - 6, SCOPE_TOP + SCOPE_H - 6);
}
function drawTrace(hist, key, col) {
if (hist.length < 2) return;
stroke(col[0], col[1], col[2], 230);
strokeWeight(1.6);
noFill();
beginShape();
for (let i = 0; i < hist.length; i++) {
const xx = SCOPE_LEFT + (i / (HIST_MAX - 1)) * SCOPE_W;
const yy = SCOPE_TOP + SCOPE_H - (hist[i][key] / N0) * SCOPE_H;
vertex(xx, yy);
}
endShape();
strokeWeight(1);
}
function drawHud(c, Tp, Td) {
noStroke();
// 2a. top-left title block
fill(20);
textAlign(LEFT, TOP);
textSize(20);
text("Decay product", 14, 8);
fill(DIM);
textSize(12);
text("Wikitube microsim - en.wikitube.io/wiki/" + ARTICLE, 14, 32);
// 2b. top-right control hint (two lines)
fill(DIM);
textSize(11);
textAlign(RIGHT, TOP);
text("sliders: Tp, Td (half-lives, hours); sp (sim-h per real s)",
width - 12, 8);
text("click reset to reseed N0 = " + N0 + " parent atoms",
width - 12, 24);
// 2c. bottom-left readouts
textAlign(LEFT, BOTTOM);
textSize(12);
fill(PARENT_C[0], PARENT_C[1], PARENT_C[2]);
text("Np = " + c.np, 14, height - 56);
fill(DAUGHT_C[0], DAUGHT_C[1], DAUGHT_C[2]);
text("Nd = " + c.nd, 90, height - 56);
fill(STABLE_C[0], STABLE_C[1], STABLE_C[2]);
text("Ns = " + c.ns, 170, height - 56);
fill(FG);
text("Tp = " + nf(Tp, 1, 2) + " h", 14, height - 40);
text("Td = " + nf(Td, 1, 3) + " h", 110, height - 40);
fill(STRUCT_C[0], STRUCT_C[1], STRUCT_C[2]);
text("regime: " + regimeLabel(Tp, Td), 230, height - 40);
// 2d. bottom-right equation footer (ASCII only)
fill(80);
textSize(11);
textAlign(RIGHT, BOTTOM);
text("dNp/dt = -lambda_p Np dNd/dt = lambda_p Np - lambda_d Nd",
width - 12, height - 52);
text("secular eq.: A_d / A_p -> 1 as Tp / Td -> inf",
width - 12, height - 38);
// slider labels (left of each slider)
textSize(11);
textAlign(RIGHT, CENTER);
fill(60);
const SY = height - 36;
fill(PARENT_C[0], PARENT_C[1], PARENT_C[2]);
text("Tp", 76, SY + 7);
fill(DAUGHT_C[0], DAUGHT_C[1], DAUGHT_C[2]);
text("Td", 76, SY + 25);
fill(FG);
textAlign(LEFT, CENTER);
text("speed " + nf(spSlider.value(), 1, 2) + " h/s",
226, SY + 7);
}
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Decay_product.json (2026-07-30T02:09:12Z) -->
`Aage_Bohr` · `Ab_initio_methods_(nuclear_physics)` · `Alexandru_Proca` · [[Alpha_decay]] · `Atomic_nucleus` · `Atomic_number` · [[Beta_decay]] · `Big_Bang_nucleosynthesis` · [[Bismuth]] · `Borromean_nucleus` · `Clinton_Davisson` · `Cluster_decay` · `Cosmic_ray_spallation` · `Cosmogenic_nuclide` · [[Decay_chain]] · `Decay_energy` · `Double_beta_decay` · `Double_electron_capture` · `Edward_Mills_Purcell` · `Edward_Teller` · `Electron_capture` · `Enrico_Fermi` · `Ernest_Lawrence` · `Ernest_Rutherford` · `Ernest_Walton` · `Eugene_Wigner` · `Even_and_odd_atomic_nuclei` · `Frederick_Soddy` · `Fritz_Strassmann` · `Frédéric_Joliot-Curie` · `Gamma_ray` · `Gas_mantle` · `Halo_nucleus` · `Hans_Bethe` · `Henri_Becquerel` · `High-energy_nuclear_physics` · `Interacting_boson_model` · `Internal_conversion` · `Irène_Joliot-Curie` · `Island_of_stability` · `Isobar_(nuclide)` · `Isotone` · `Isotope` · `Isotopes_of_protactinium` · `J._Hans_D._Jensen` · `J._J._Thomson` · `J._Robert_Oppenheimer` · `James_Chadwick` · `John_Cockcroft` · `Large_Hadron_Collider` · [[Lead]] · `Lise_Meitner` · `Luis_Walter_Alvarez` · `Magic_number_(physics)` · `Marie_Curie` · `Mark_Oliphant` · `Mass_number` · `Mirror_nuclei` · `Neutrinoless_double_beta_decay` · [[Neutron]] · `Neutron_capture` · `Neutron_emission` · `Neutron_number` · `Niels_Bohr` · `Nuclear_astrophysics` · `Nuclear_binding_energy` · `Nuclear_drip_line` · `Nuclear_fission` · `Nuclear_fission_product` · `Nuclear_force` · [[Nuclear_fusion]] · `Nuclear_isomer` · `Nuclear_matter` · `Nuclear_physics` · `Nuclear_reaction` · `Nuclear_shell_model` · `Nuclear_structure` · `Nucleon` · `Nucleon_pair_breaking_in_fission` · [[Nucleosynthesis]] · `Nuclide` · `Otto_Hahn` · `P-process` · `Patrick_Blackett` · `Photodisintegration` · `Photofission` · `Pierre_Curie` · [[Positron_emission]] · `Primordial_nuclide` · [[Proton]] · `Proton_capture` · `Proton_emission` · `Quark–gluon_plasma` · `R-process` · [[Radioactive_decay]] · `Radioactive_waste` · `Radiogenic_nuclide` · `Radium-226` · `Relativistic_Heavy_Ion_Collider` · `Rp-process` · `S-process` · `Semi-empirical_mass_formula` · `Spallation` · [[Spontaneous_fission]] · `Stable_nuclide` · `Stellar_nucleosynthesis` · `Supernova_nucleosynthesis` · `Synthetic_element` · [[Thallium]] · [[Thorium]] · `Uraninite` · `Uranium-238` · `Valley_of_stability` · [[Wayback_Machine]] · `Władysław_Świątecki_(physicist)`
## From the Real GENERATIVE library

*Decay product — placed from the Real G.E.N.E.R.A.T.I.V.E. course library (Nuclear room). Source: Wikimedia Commons (via Wikipedia article media). [Details & license](https://commons.wikimedia.org/wiki/File:NuclearReaction.svg).*
> In nuclear physics, a decay product (also known as a daughter product, daughter isotope, radio-daughter, or daughter nuclide) is the remaining nuclide left over from radioactive decay. Radioactive decay often proceeds via a sequence of steps (decay chain). ([Wikipedia](https://en.wikipedia.org/wiki/Decay_product))
<!-- REAL-GENERATIVE-MEDIA:END -->
<!-- LOCAL-MEDIA-PASS:START -->
## From the vault media library
!Decay product thumb.png
*Decay Product — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.*
<!-- LOCAL-MEDIA-PASS:END -->
> **Room:** Nuclear · **Status:** ✅ shipped
## Overview
A **decay product**, also known as a **daughter product**, **daughter isotope**, **radio-daughter**, or simply **daughter**, is the nuclide that remains after a radioactive parent nuclide has undergone [[Radioactive_decay|radioactive decay]]. Whenever an unstable parent nucleus emits an [[Alpha_particle|alpha particle]], beta particle, gamma [[Photon|photon]], or transforms via electron capture, internal conversion, or [[Spontaneous_fission|spontaneous fission]], the residual nucleus carries a different [[Proton|proton]]-and-[[Neutron|neutron]] count and is by definition the decay product. Because that daughter is itself often unstable, real-world radioactive matter rarely decays in a single step: it walks down a **[[Decay_chain|decay chain]]** of successive parent–daughter–granddaughter transformations until it lands on a stable nuclide. The four classical natural chains — uranium-238, uranium-235, [[Thorium|thorium]]-232, and the now-extinct neptunium-237 series — each terminate on a specific isotope of lead (or, for neptunium, bismuth-209), and every intermediate isotope along the way is somebody's daughter and somebody else's parent. When the daughter's [[Half-life|half-life]] is short relative to its parent's, the chain reaches **secular equilibrium**, where the activity of the daughter equals that of the parent. Decay products dominate radon-in-basements exposure, govern the design of medical generators such as Mo-99 → Tc-99m, and underpin uranium–lead geochronology.
## See also
- Room hub: Nuclear
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 0 of the Nuclear sheet on 2026-04-30T17:27:52Z.*
Letters: exponential · equilibrium · lattice · probability · clock_time · stability · transformation · mined_system
<!-- REAL-GENERATIVE-MEDIA:START -->
<!-- CRAFT-LINK:START g12 -->
*Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].*
<!-- CRAFT-LINK:END -->
## Wikipedia : Wikitube
**Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Decay_product) : [Wikitube](https://en.wikitube.io/wiki/Decay_product)
## Previous hub tags
Tree parents: [[Helium]] · [[Helium-3]] · [[Hydrogen]] · [[Oxygen]].
Legacy hubs: `GENERATIVE`.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*