# Positron emission ## Microsim ### Live player <div class="microsim-player"> <iframe src="https://editor.p5js.org/sciencenibber/full/KkNndB-n5" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe> </div> <div class="microsim-fallback"> <img src="Microsims/thumbs/Positron_emission.png" alt="Positron_emission 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/KkNndB-n5">open sketch in the p5.js editor</a></em></p> </div> **Editor URL:** https://editor.p5js.org/sciencenibber/sketches/KkNndB-n5 **Description (100 words):** This microsim shows beta-plus decay as a population of proton-rich parent nuclei (yellow-green dots) drawn over a dark cloud-chamber field. Pick an isotope from the dropdown — C-11, N-13, O-15, F-18, Ga-68, or Custom — and each parent runs an independent exponential clock with the matching [[Half-life|half-life]]. When a clock fires, the dot fades to a green daughter nucleus and a red positron streaks outward; after a brief drift it annihilates with a nearby electron, emitting two back-to-back yellow gamma rays. The right panel scrolls a measured N(t) curve over the theoretical N0 · exp(−λt), an activity gauge, and the live (Z, A) → (Z−1, A) line. Sliders below tune T_1/2, sim speed, and N0; reset re-seeds the field. ```js // ======================================================================= // Positron_emission.js // ======================================================================= // ARTICLE : Positron_emission // PATTERN : Pattern E reskin -- Decay clocks and half-life (Nuclear) // PURPOSE : Visualize beta-plus (positron) decay of a population of // proton-rich nuclei. Each parent atom carries an independent // exponential clock with half-life T_1/2; on decay, a positron // is emitted, drifts a few millimetres, then annihilates with // a nearby electron, producing two back-to-back 511 keV gamma // rays. The chart of the nuclides shifts the daughter // down-and-left (Z -> Z - 1, A unchanged). // // PARAMETERS: // isotope -- presets for C-11, N-13, O-15, F-18, Ga-68, plus a // free-choice slider for arbitrary half-lives. // speedSlider -- simulation rate multiplier (sim seconds per real s). // nSlider -- initial population N0 of parent nuclei (50..600). // // PHYSICS: // Decay law: N(t) = N0 * exp(-lambda * t), lambda = ln 2 / T_1/2 // Per-frame prob: p_decay = 1 - exp(-lambda * dt_sim) // (the linear lambda*dt approximation breaks for short // half-lives -- see pitfalls.md, "Stochastic time // stepping"). // Annihilation: e+ + e- -> gamma + gamma (each 511 keV, back-to- // back in the e+ rest // frame). // // HUD: // top-left : title and en.wikitube.io URL // top-right : control hints // bottom-left : live readouts (N, A, gammas) // bottom-right : canonical decay equation (ASCII transliteration -- // Unicode-in-string-literal pitfall, see pitfalls.md // "Unicode in template literals breaks the editor"). // ======================================================================= const ARTICLE = "Positron_emission"; p5.disableFriendlyErrors = true; // -- Nuclear palette (per P5_JS_EDITOR.md section 5) --------------------- const BG = [ 8, 16, 28]; const FG = 240; const FUEL = [180, 200, 80]; // proton-rich parent (unstable) const NEUTRON = [240, 240, 255]; // (unused here; kept for parity) const FISSION = [220, 110, 60]; // (unused here) const DECAY = [255, 80, 80]; // positron (e+) tracer color const STABLE = [ 80, 200, 140]; // daughter nucleus (post-decay) const STRUCT = [120, 130, 150]; // gridlines / readouts const GAMMA = [255, 230, 120]; // 511 keV annihilation photons // -- Isotope presets (half-life in seconds) ------------------------------ // Choices are the workhorse PET tracers plus a custom slider option. const ISOTOPES = [ { name: "C-11", T12: 1224.0, dZ: 1, parent: "C-11", daughter: "B-11" }, { name: "N-13", T12: 597.9, dZ: 1, parent: "N-13", daughter: "C-13" }, { name: "O-15", T12: 122.24,dZ: 1, parent: "O-15", daughter: "N-15" }, { name: "F-18", T12: 6586.2, dZ: 1, parent: "F-18", daughter: "O-18" }, { name: "Ga-68", T12: 4062.6, dZ: 1, parent: "Ga-68", daughter: "Zn-68" }, { name: "Custom", T12: 120.0, dZ: 1, parent: "X", daughter: "Y" } ]; // -- Simulation state ---------------------------------------------------- let nuclei = []; // {x, y, alive, decayedAt} let positrons = []; // {x, y, vx, vy, t, alive} let gammas = []; // {x, y, vx, vy, life} let history = []; // N(t) samples for the strip-chart let isotopeSelect, halfLifeSlider, speedSlider, nSlider, resetBtn; let totalGammas = 0; let simTime = 0; // -- Layout constants ---------------------------------------------------- const PAD = 24; // outer padding const PANEL_W = 320; // right diagnostic panel width const CTRL_BAND = 110; // bottom band reserved for sliders+labels let field; // {x, y, w, h} -- the cloud-chamber region // ======================================================================= function setup() { createCanvas(windowWidth, windowHeight); textFont("monospace"); textAlign(LEFT, TOP); layout(); // dropdown for the isotope preset isotopeSelect = createSelect(); for (const iso of ISOTOPES) isotopeSelect.option(iso.name); isotopeSelect.selected("F-18"); isotopeSelect.position(PAD, height - CTRL_BAND + 12); isotopeSelect.size(120); isotopeSelect.changed(onIsotopeChange); // half-life slider (log-scaled in seed/loop) -- for the Custom preset halfLifeSlider = createSlider(1, 10000, 6586, 1); halfLifeSlider.position(PAD + 140, height - CTRL_BAND + 12); halfLifeSlider.size(220); // sim speed multiplier (so the reader doesn't wait minutes for F-18) speedSlider = createSlider(1, 200, 60, 1); speedSlider.position(PAD + 140, height - CTRL_BAND + 44); speedSlider.size(220); // initial population nSlider = createSlider(50, 600, 240, 10); nSlider.position(PAD + 140, height - CTRL_BAND + 76); nSlider.size(220); resetBtn = createButton("reset"); resetBtn.position(PAD + 380, height - CTRL_BAND + 12); resetBtn.mousePressed(seed); seed(); } function layout() { field = { x: PAD, y: PAD + 36, w: max(200, width - PANEL_W - 3 * PAD), h: max(200, height - CTRL_BAND - 2 * PAD - 36) }; } // -- Initial population layout: a Poisson-disc-ish jittered grid -------- function seed() { const N0 = nSlider ? nSlider.value() : 240; nuclei = []; positrons = []; gammas = []; history = []; totalGammas = 0; simTime = 0; for (let i = 0; i < N0; i++) { nuclei.push({ x: random(field.x + 8, field.x + field.w - 8), y: random(field.y + 8, field.y + field.h - 8), alive: true, decayedAt: -1 }); } } function onIsotopeChange() { // when the user picks a preset, snap the half-life slider to it. const iso = ISOTOPES.find(i => i.name === isotopeSelect.value()); if (iso && iso.name !== "Custom") { halfLifeSlider.value(round(iso.T12)); } seed(); } // ======================================================================= function draw() { // -- read parameters once at the top of draw() ----------------------- const isoName = isotopeSelect.value(); const iso = ISOTOPES.find(i => i.name === isoName) || ISOTOPES[5]; const T12 = iso.name === "Custom" ? halfLifeSlider.value() : iso.T12; const speed = speedSlider.value(); // sim seconds per real s const dtReal = min(deltaTime / 1000, 0.05); // cap real-time step const dtSim = dtReal * speed; // simulation step simTime += dtSim; const lambda = log(2) / T12; // decay constant (1/s) const pDecay = 1 - exp(-lambda * dtSim); // exponential, NOT linear background(BG); // -- decay sweep over parents --------------------------------------- let decaysThisFrame = 0; for (const n of nuclei) { if (!n.alive) continue; if (random() < pDecay) { n.alive = false; n.decayedAt = simTime; decaysThisFrame++; // emit a positron with random direction; positron drifts a short // distance before annihilating with a nearby electron. const ang = random(TWO_PI); positrons.push({ x: n.x, y: n.y, vx: cos(ang) * 35, vy: sin(ang) * 35, t: 0, alive: true }); } } // -- propagate positrons; on annihilation emit two back-to-back gammas for (const p of positrons) { if (!p.alive) continue; p.x += p.vx * dtReal; p.y += p.vy * dtReal; p.t += dtReal; if (p.t > 0.4) { // annihilation event: two 511 keV gammas in opposite directions p.alive = false; const ang = random(TWO_PI); const vx = cos(ang) * 280, vy = sin(ang) * 280; gammas.push({ x: p.x, y: p.y, vx: vx, vy: vy, life: 1.0 }); gammas.push({ x: p.x, y: p.y, vx: -vx, vy: -vy, life: 1.0 }); totalGammas += 2; } } // -- propagate gammas (decoration; they fade and are culled) -------- for (const g of gammas) { g.x += g.vx * dtReal; g.y += g.vy * dtReal; g.life -= dtReal * 1.6; } // garbage collect every ~2 seconds to keep arrays bounded if (frameCount % 120 === 0) { positrons = positrons.filter(p => p.alive); gammas = gammas.filter(g => g.life > 0); } // -- record N(t) sample (parents still alive) ----------------------- const aliveCount = nuclei.reduce((s, n) => s + (n.alive ? 1 : 0), 0); history.push({ t: simTime, N: aliveCount }); if (history.length > 400) history.shift(); // -- draw cloud-chamber field background and frame ------------------ noStroke(); fill(20, 30, 40); rect(field.x, field.y, field.w, field.h); // parent / daughter dots noStroke(); for (const n of nuclei) { if (n.alive) { fill(...FUEL, 220); circle(n.x, n.y, 6); } else { // daughter: smaller, cooler color, a fading halo while "fresh" const age = simTime - n.decayedAt; const halo = constrain(1.0 - age * 0.6, 0, 1); if (halo > 0) { fill(...STABLE, 60 * halo); circle(n.x, n.y, 14 - 8 * (1 - halo)); } fill(...STABLE, 200); circle(n.x, n.y, 4); } } // positron tracers for (const p of positrons) { if (!p.alive) continue; stroke(...DECAY, 220); strokeWeight(1.5); line(p.x - p.vx * 0.05, p.y - p.vy * 0.05, p.x, p.y); noStroke(); fill(...DECAY, 240); circle(p.x, p.y, 4); } // gamma rays as fading line segments for (const g of gammas) { if (g.life <= 0) continue; const a = 255 * g.life; stroke(...GAMMA, a); strokeWeight(1.2); line(g.x - g.vx * 0.02, g.y - g.vy * 0.02, g.x, g.y); } noStroke(); // -- right-side diagnostics panel ----------------------------------- drawPanel(iso, T12, lambda, aliveCount, decaysThisFrame, dtSim); // -- HUD blocks ----------------------------------------------------- drawHud(iso, T12, lambda, aliveCount); } // ----------------------------------------------------------------------- function drawPanel(iso, T12, lambda, aliveCount, decaysThisFrame, dtSim) { const px = width - PANEL_W - PAD; const py = PAD + 36; const pw = PANEL_W; const ph = field.h; noStroke(); fill(20, 30, 40); rect(px, py, pw, ph); fill(...STRUCT, 80); rect(px, py, pw, 2); // strip-chart: N(t) versus t const chartX = px + 12, chartY = py + 28; const chartW = pw - 24, chartH = 140; noFill(); stroke(...STRUCT, 120); strokeWeight(1); rect(chartX, chartY, chartW, chartH); // axis ticks: 0, N0 const N0 = nSlider.value(); textSize(10); noStroke(); fill(...STRUCT); text("N", chartX - 10, chartY - 2); text("0", chartX - 10, chartY + chartH - 10); text("N0", chartX - 14, chartY - 2); // theoretical exponential overlay if (history.length > 1) { const tStart = history[0].t; const tEnd = history[history.length - 1].t; stroke(...FUEL, 100); strokeWeight(1); noFill(); beginShape(); for (let i = 0; i <= 80; i++) { const t = lerp(tStart, tEnd, i / 80); const Ntheor = N0 * exp(-lambda * (t - tStart)); const xx = chartX + (i / 80) * chartW; const yy = chartY + chartH * (1 - Ntheor / N0); vertex(xx, yy); } endShape(); // measured stochastic curve stroke(...DECAY, 220); strokeWeight(1.5); noFill(); beginShape(); for (let i = 0; i < history.length; i++) { const h = history[i]; const xx = chartX + ((h.t - tStart) / max(0.001, (tEnd - tStart))) * chartW; const yy = chartY + chartH * (1 - h.N / N0); vertex(xx, yy); } endShape(); } noStroke(); fill(...DECAY); textSize(11); text("measured N(t)", chartX, chartY + chartH + 6); fill(...FUEL); text("theoretical N0 * exp(-lambda*t)", chartX, chartY + chartH + 20); // activity gauge const gaugeY = chartY + chartH + 56; fill(...STRUCT); textSize(11); text("activity (decays / s)", chartX, gaugeY); // smoothed activity = decaysThisFrame / dtSim, clamped + log-ish display const A = dtSim > 1e-6 ? decaysThisFrame / dtSim : 0; const Amax = max(1, lambda * N0); const frac = constrain(A / Amax, 0, 1); fill(20, 30, 40); rect(chartX, gaugeY + 16, chartW, 14); fill(...DECAY, 220); rect(chartX, gaugeY + 16, chartW * frac, 14); fill(...STRUCT); text("A = " + nf(A, 1, 1) + " ( max ~ " + nf(Amax, 1, 1) + " )", chartX, gaugeY + 36); // isotope info block const infoY = gaugeY + 60; fill(...FG); textSize(13); text("isotope: " + iso.name, chartX, infoY); textSize(11); fill(...STRUCT); text("parent : " + iso.parent, chartX, infoY + 20); text("daughter: " + iso.daughter + " ( Z -> Z - 1 )", chartX, infoY + 36); text("T_1/2 : " + formatTime(T12), chartX, infoY + 52); text("lambda : " + nf(lambda, 1, 4) + " s^-1", chartX, infoY + 68); text("annihilation gammas: " + totalGammas, chartX, infoY + 88); } // ----------------------------------------------------------------------- function drawHud(iso, T12, lambda, aliveCount) { // top-left title bar noStroke(); fill(0, 200); rect(8, 8, 420, 26); fill(255); textSize(13); textAlign(LEFT, TOP); text(ARTICLE + " - en.wikitube.io/wiki/" + ARTICLE, 16, 14); // top-right control hints const hintLines = [ "isotope: dropdown half-life: slider", "speed: slider N0: slider [reset]" ]; textAlign(RIGHT, TOP); fill(...STRUCT); textSize(11); for (let i = 0; i < hintLines.length; i++) { text(hintLines[i], width - 16, 14 + i * 14); } // bottom-left live readouts (sit ABOVE the slider band) textAlign(LEFT, TOP); const rx = PAD; const ry = height - CTRL_BAND - 56; fill(...FG); textSize(12); text("N(t) = " + aliveCount + " / " + nSlider.value(), rx, ry); text("sim t = " + formatTime(simTime), rx, ry + 16); text("positrons in flight: " + positrons.filter(p => p.alive).length, rx, ry + 32); // labels for the slider rows themselves textSize(11); fill(...STRUCT); text("isotope", rx, height - CTRL_BAND - 4); text("T_1/2 (s)", rx + 140 - 100, height - CTRL_BAND + 14); text("speed x", rx + 140 - 100, height - CTRL_BAND + 46); text("N0", rx + 140 - 100, height - CTRL_BAND + 78); // bottom-right canonical decay equation (ASCII transliteration) textAlign(RIGHT, TOP); const eqx = width - PAD; const eqy = height - CTRL_BAND - 56; fill(...FUEL); textSize(12); text("decay : (Z, A) X -> (Z-1, A) Y + e+ + nu_e", eqx, eqy); fill(...DECAY); text("annihl : e+ + e- -> gamma + gamma ( 2 x 511 keV )", eqx, eqy + 16); fill(...STRUCT); text("law : N(t) = N0 * exp( - lambda * t ), lambda = ln 2 / T_1/2", eqx, eqy + 32); } // ----------------------------------------------------------------------- function formatTime(seconds) { // smart-formats half-lives in their natural unit. if (seconds < 1e-9) return nf(seconds * 1e12, 1, 2) + " ps"; if (seconds < 1e-6) return nf(seconds * 1e9 , 1, 2) + " ns"; if (seconds < 1e-3) return nf(seconds * 1e6 , 1, 2) + " us"; if (seconds < 1) return nf(seconds * 1e3 , 1, 2) + " ms"; if (seconds < 60) return nf(seconds, 1, 2) + " s"; if (seconds < 3600) return nf(seconds / 60, 1, 2) + " min"; if (seconds < 86400) return nf(seconds / 3600, 1, 2) + " hr"; if (seconds < 86400 * 365.25) return nf(seconds / 86400, 1, 2) + " d"; return nf(seconds / (86400 * 365.25), 1, 2) + " yr"; } // ----------------------------------------------------------------------- function windowResized() { resizeCanvas(windowWidth, windowHeight); layout(); // re-anchor controls to the resized window bottom if (isotopeSelect) { isotopeSelect.position(PAD, height - CTRL_BAND + 12); halfLifeSlider.position(PAD + 140, height - CTRL_BAND + 12); speedSlider.position (PAD + 140, height - CTRL_BAND + 44); nSlider.position (PAD + 140, height - CTRL_BAND + 76); resetBtn.position (PAD + 380, height - CTRL_BAND + 12); } } ``` ## Links (Wikipedia order) <!-- injected from _registry/childlinks/Positron_emission.json (2026-07-30T02:09:12Z) --> `(n-p)_reaction` · `Aage_Bohr` · `Ab_initio_methods_(nuclear_physics)` · `Alexandru_Proca` · [[Alpha_decay]] · [[Alpha_particle]] · `Alpha_process` · `Aluminium-26` · `Atomic_nucleus` · `Atomic_number` · [[Beta_decay]] · `Beta_particle` · `Big_Bang_nucleosynthesis` · [[Boron]] · `Borromean_nucleus` · `Branching_fraction` · `CNO_cycle` · `Carbon-burning_process` · `Carl_David_Anderson` · `Clinton_Davisson` · `Cluster_decay` · `Copper-64` · `Cosmic_ray` · `Cosmic_ray_spallation` · `Cosmogenic_nuclide` · [[Decay_chain]] · `Decay_energy` · [[Decay_product]] · `Deuterium_fusion` · `Double_beta_decay` · `Double_electron_capture` · `Down_quark` · `Edward_Mills_Purcell` · `Edward_Teller` · `Electron_capture` · `Electron_neutrino` · `Electronvolt` · `Enrico_Fermi` · `Ernest_Lawrence` · `Ernest_Rutherford` · `Ernest_Walton` · `Eugene_Wigner` · `Even_and_odd_atomic_nuclei` · `Fluorine-18` · `Frederick_Soddy` · `Fritz_Strassmann` · `Frédéric_Joliot-Curie` · `Gamma_ray` · `Halo_nucleus` · `Hans_Bethe` · `Henri_Becquerel` · `High-energy_nuclear_physics` · `If_and_only_if` · `Interacting_boson_model` · `Internal_conversion` · `Irène_Joliot-Curie` · `Island_of_stability` · `Isobar_(nuclide)` · `Isotone` · `Isotope` · `Isotopes_of_iodine` · `Isotopes_of_oxygen` · `Isotopes_of_sodium` · `J._Hans_D._Jensen` · `J._J._Thomson` · `J._Robert_Oppenheimer` · `James_Chadwick` · `John_Cockcroft` · `Large_Hadron_Collider` · `Lise_Meitner` · `Lithium_burning` · `Luis_Walter_Alvarez` · `Magic_number_(physics)` · `Marie_Curie` · `Mark_Oliphant` · `Mass_number` · `Mirror_nuclei` · `Neon-burning_process` · `Neutrino` · `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` · `Nuclear_transmutation` · `Nucleon` · `Nucleon_pair_breaking_in_fission` · [[Nucleosynthesis]] · `Nuclide` · `Otto_Hahn` · `Oxygen-burning_process` · `P-process` · `Particle_physics` · `Patrick_Blackett` · `Photodisintegration` · `Photofission` · `Pierre_Curie` · [[Polonium]] · `Positron` · `Positron_emission_tomography` · `Potassium-40` · `Primordial_nuclide` · [[Proton]] · `Proton_capture` · `Proton_decay` · `Proton_emission` · `Proton–proton_chain` · `Quark` · `Quark–gluon_plasma` · `R-process` · [[Radioactive_decay]] · `Radiogenic_nuclide` · `Radionuclide` · `Relativistic_Heavy_Ion_Collider` · `Rp-process` · `S-process` · `Semi-empirical_mass_formula` · `Silicon-burning_process` · `Spallation` · [[Spontaneous_fission]] · `Stable_nuclide` · `Stellar_nucleosynthesis` · `Supernova_nucleosynthesis` · `Synthetic_element` · `Triple-alpha_process` · `Up_quark` · `Valley_of_stability` · `Weak_interaction` · `Władysław_Świątecki_(physicist)` ## From the Real GENERATIVE library ![Positron emission](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NuclearReaction.svg/200px-NuclearReaction.svg.png) *Positron emission — 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).* > Positron emission, beta plus decay, or β+ decay is a subtype of radioactive decay called beta decay, in which a proton inside a radionuclide nucleus is converted into a neutron while releasing a positron and an electron neutrino (νe).[1] Positron emission is mediated by the weak force. The positron is a type of beta particle (β+), the other beta particle bei ([Wikipedia](https://en.wikipedia.org/wiki/Positron_emission)) <!-- REAL-GENERATIVE-MEDIA:END --> <!-- LOCAL-MEDIA-PASS:START --> ## From the vault media library !Positron emission thumb.png *Positron Emission — 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 Positron emission, also called beta-plus decay (β⁺), is a [[Radioactive_decay|radioactive decay]] mode in which a [[Proton|proton]] inside a proton-rich nucleus is converted into a [[Neutron|neutron]], ejecting a positron (the antimatter counterpart of an [[Electron|electron]]) and an electron neutrino. The process can only occur when the parent atom's mass exceeds the daughter atom's mass by at least the [[Energy|energy]] of two electron masses, roughly 1.022 MeV, because the daughter is left one proton lighter and the freed positron carries away the matching positive charge. The atomic number Z drops by one while the mass number A stays fixed, shifting the nucleus down-and-left on the chart of the nuclides toward the valley of stability. Iconic positron emitters include carbon-11, nitrogen-13, oxygen-15, fluorine-18, and gallium-68, each engineered for short-lived diagnostic use in positron-emission tomography (PET): the emitted positron annihilates with a nearby electron almost immediately, producing two back-to-back 511 keV gamma rays that PET scanners detect in coincidence to reconstruct three-dimensional images of metabolic activity. Each isotope obeys a strictly exponential decay law N(t) = N₀ exp(−λt) with λ = ln 2 / T₁⸍₂, the same statistical clock that governs every radioactive species. ## 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-30T08:52:30Z.* Letters: exponential · mined_electron · probability · clock_time · filter · measurement · energy · iteration <!-- 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/Positron_emission) : [Wikitube](https://en.wikitube.io/wiki/Positron_emission) ## Previous hub tags Tree parent: [[Oxygen]]. Legacy hubs: `GENERATIVE`. --- *Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*