# 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](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NuclearReaction.svg/200px-NuclearReaction.svg.png) *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).*