| name | interspec-nuclide-id |
| description | Identifies radioactive sources (nuclides, x-ray elements, nuclear reactions) in gamma-ray spectra using InterSpec MCP tools. Covers systematic peak investigation, source validation via energy matching and relative efficiency, the Ultimate Parent rule, and NORM background handling. Use when identifying unknown peaks or performing full-spectrum source identification. |
| metadata | {"author":"InterSpec","version":"0.1"} |
Nuclide Identification Workflow
Systematic workflow for identifying the source of photopeaks in a gamma-ray spectrum.
Goal
Identify the source (nuclide, x-ray, nuclear reaction) of every significant peak in the spectrum. Work until all peaks are identified or rigorously determined to be unidentifiable.
The Ultimate Parent Rule
Do not assign peaks to short-lived daughters. Report the actual source — usually the long-lived parent whose chain is in secular equilibrium with the observed lines:
- Pb-214, Bi-214 peaks -> assign to Ra-226 (or U-238)
- Ac-228, Pb-212, Tl-208 peaks -> assign to Th-232
- Pa-234m, Th-234 peaks -> assign to U-238
- Ba-137m -> assign to Cs-137
But do NOT climb past the source: only assign to a higher parent if that parent's presence is actually supported by the data. A produced, milked, or medical isotope IS the source — e.g. report Ac-225 (milked from Th-229), NOT Th-229; report Tc-99m / I-131 etc. themselves, not their generators. Only assign to the daughter if there is evidence of chemical separation.
Decide parent vs. daughter from the gamma lines: if the parent's diagnostic upstream lines are present → report the parent (equilibrium); if those upstream lines are absent → separated, report the specific daughter observed; if no lines can differentiate them (observable lines common to both, nothing upstream resolvable) → report the daughter observed and note it is most likely from the parent (don't force a parent call the data can't support). E.g. Bi-213 (440.4 keV) with no Fr-221 218 keV → Bi-213 (separated); with the upstream lines present → Ac-225.
Workflow
Step 1: Assess Spectrum State
Call these tools first:
get_loaded_spectra - What spectra are available?
get_spectrum_info - Detector type, energy range, live time
get_identified_sources - Sources already assigned to analysis peaks
get_peaks with {"filter": "analysis"} - Current analysis peak state
get_automated_id_results - Hints from automated algorithms (may be wrong)
Use source_info on any already-identified sources to learn about commonly associated nuclides.
Decision: Proceed to Step 2 (Get Unidentified Peaks). If a background spectrum is loaded, NORM peaks are handled automatically. If no background, NORM peaks are handled on-demand during investigation when encountered.
Step 2: Get Unidentified Peaks
Call get_peaks with {"filter": "unidentified", "maxResults": 3} (or more).
Select the most distinct or easiest-to-identify peak (highest amplitude, highest energy, or tightest FWHM). If all peaks have been investigated, proceed to Step 6a (Check Non-Peak Signatures).
Important: After fitting any peaks (add_analysis_peak or add_analysis_peaks_for_source), the unidentified peaks list becomes stale. Call get_peaks with the 'unidentified' filter again.
Step 3: Investigate Peak
For the selected peak energy:
search_sources_by_energy with the peak energy. Prefer single-energy searches. The profile_score metric (higher = better) accounts for spectrum fit.
- Check for escape peaks:
escape_peak_check
- Check for sum peaks:
sum_peak_check
- Look for parent/daughter relationships (e.g., if 351.9 keV found, consider Ra-226).
If a plausible candidate is found, proceed to Step 4. If not, return to Step 2 and skip this peak.
NORM Detection (no background only): If no background spectrum is loaded and NORM peaks have not yet been fit, check if the peak matches common NORM energies:
- K-40: 1460.8 keV
- Ra-226 chain: 609.3, 1120.3, 1764.5, 295.2, 351.9 keV
- Th-232 chain: 583.2, 2614.5, 911.2, 968.9, 338.3, 238.6 keV
If the peak matches NORM, or NORM interference is suspected (e.g., 186 keV where Ra-226 could interfere with U-235), fit all NORM peaks at once:
add_analysis_peaks_for_source({source: null, options: ["FitNormPeaks"]})
Then check NORM ratios (Ra-226 and Th-232 activities within ~1 order of magnitude, 609.3 keV area > 583.2 keV, K-40 present at 1460.8 keV) and return to Step 2.
Step 4: Validate Candidate
Before accepting a source identification:
- Context: Call
source_info on the candidate. Check for associated nuclides, common mis-IDs, and whether it makes sense given other identified sources. source_info also flags how to separate look-alikes — e.g. Th-228 vs Th-232: the Ac-228 lines come from Th-232 but not Th-228. Use the strongest lines, 911.2 and 969.0 keV, and judge elevation by fit peak area (whether they are in the elevated-above-background/unidentified list, or their elevatedOverBackgroundPeakNumSigma) — NOT gross counts (get_counts_in_energy_range), whose continuum is raised across the whole spectrum by the source's Compton scatter (so e.g. the 338.3 keV region can show elevated gross counts with no real peak). If the 911.2/969.0 keV Ac-228 fit peaks are not elevated while Pb-212 (238.6) and Tl-208 (583.2, 2614.5) ARE, the source is Th-228 (U-232), not Th-232.
General rule: to judge whether a line is elevated over background, use its fit peak area (continuum-subtracted), not gross region counts — Compton continuum from a source raises gross counts everywhere.
511 keV-only sources: if the only significantly elevated peak is the 511 keV annihilation line (no other distinguishing gammas), report a positron/β+ emitter (elevated 511 keV) — do not force one nuclide, since many β+ emitters produce only 511 (F-18, Ga-68, …). Naming F-18 as a likely candidate is fine, but as a possibility, not a definitive ID.
-
Energy fit: Source energy must be within ~1 FWHM of the peak mean.
-
Corroborating peaks: Use source_photons({source: "...", sortOrder: "intensity", maxResults: 25}) to check if other significant gammas from this source have corresponding peaks in the spectrum. Consider:
- Attenuation may suppress low-energy lines
- Low branching ratio lines may be below detection threshold
- Nearby stronger peaks may obscure weaker lines
- The
prominent_energies_keV field of the source_photons result gives the most characteristic energies for a quick check
-
Ultimate Parent: If the candidate is a short-lived daughter, determine the parent.
-
Single-line sources — verify before committing (biggest source of false positives): If the candidate's only support is one peak with no corroborating line from that source (e.g. lone 662 keV → Cs-137, 835 keV → Mn-54, or a line near an already-identified source), verify from TOOL RESULTS: (a) confirm the peak is a genuine significant fit (good numSigma, not a marginal bump); (b) sum_peak_check/escape_peak_check/compton_scatter_peak_check — if any matches, it's that artifact; (c) check source_photons/source_info on already-identified sources for a line at this energy — if one emits there, it's that source's line, not a new nuclide. Add the single-line source only if significant AND unexplained by artifact/companion; otherwise leave that peak unattributed rather than reporting a speculative nuclide. SCOPE: applies ONLY to lone uncorroborated single peaks — do NOT use it to drop a genuine multi-line source or the dominant/primary source (those are corroborated).
-
Peaks below ~50 keV — look at them before assigning a source: call get_spectrum_image({energy_range: {min_keV: 0, max_keV: (peak mean + 60)}, y_axis_scale: "log"}) (log, not linear: a nearby large peak flattens a linear view of this region). Leave the peak unattributed if it sits on the detector turn-on edge where the data begins, or is a shoulder/knee on a falling continuum rather than a separated bump. Also rule out a detector x-ray escape peak — escape_peak_check does NOT cover these: if a strong line sits ~9.9 keV above it (HPGe, Ge K x-ray escape) or ~28.6 keV above it (NaI, iodine K x-ray escape), this peak is that line's escape, not a new source. Genuine sub-50 keV lines are common (Am-241 26.3, Cd-109 22, Ba/Cs K x-rays 30-36, Gd-153 41/47 keV), so confirm rather than reject on principle.
Example: Searching on a peak at 186 keV, top candidates might be Ra-226 and U-235. Check for U-235 corroborating peaks at 205.3 and 163.4 keV. If present, U-235 is confirmed. Note that Ra-226 may also be present; its 295.2 and 351.9 keV peaks should be much larger than 186 keV if Ra-226 is the source (higher branching ratios).
If validation passes, proceed to Step 5. If it fails, try another candidate or return to Step 2.
Step 5: Add Source Peaks
- Create checkpoint first:
create_peak_checkpoint({name_hint: "before_Co60"}) so you can roll back.
- Add peaks: Use
add_analysis_peaks_for_source (preferred) to fit all detectable peaks for the source at once. This produces better fits than adding peaks individually.
- Default (no options): If the source already has analysis peaks, they are replaced. New ROIs are trimmed to avoid existing ROIs from other sources.
- If a source gamma overlaps an existing ROI from a different source (e.g., U-235 186 keV overlapping Ra-226 186 keV): use
options: ["RefitInterferingAnalysisPeaks"] so both sources are properly fit in the shared region.
- If you want to leave all existing peaks untouched: use
options: ["DoNotUseExistingRois"] — source gammas overlapping existing ROIs will be skipped.
- Verify: Check that peaks were added with correct source assignment.
If the source has >2 peaks, validate with relative efficiency (Step 5a).
Step 5a: Check Relative Efficiency
Call peak_based_relative_efficiency with a single nuclide (e.g., sources: ["Co60"]).
Setup:
- Set
eqn_order to at most (number_of_peaks - 1). E.g., 3 peaks -> order 2.
- If a peak near 511 keV is not among the top ~3 gamma lines for the source, exclude it via
exclude_peak_energies.
- Set
background_subtract: true if source peaks overlap with background peaks.
Interpretation:
- Good: All
residual_sigma < 5.
- Acceptable if
residual_sigma > 5 but: peak is small next to a large one, near 511 keV, low energy vs high energy lines (shielding effects), or secular equilibrium issues.
- Poor: Try different
eqn_form values (LnX, LnY, LnXLnY, FramEmpirical). Try excluding problematic small peaks.
- Reject: If amplitudes are physically impossible, use
restore_peaks_to_checkpoint to revert and reconsider.
Step 5b: Check Associated Sources
After adding a source, use source_info to check for associated nuclides:
- Does the source imply a parent or chain member? (e.g., Ra-226 -> check for U-235; Cs-137 -> check for Cs-134 indicating reactor origin)
- If an associated nuclide is plausible and has detectable peaks, validate it (back to Step 4).
Then return to Step 2 for the next unidentified peak.
Step 6: Check Non-Peak Signatures
Before finalizing, check for radiation signatures that do not manifest as discrete photopeaks:
Neutron checks (MANDATORY — always do 1 and 2; do not conclude "no sources" without them):
- Check
get_spectrum_info for neutronCPS field. If background is loaded, check neutronCPS_excess_sigma (>2 indicates significant neutron excess).
- Always check the continuum ABOVE 2614.5 keV with
get_counts_in_energy_range (~2640-3000 keV, and ~3000-4000 keV if present) and compare the sigma elevation to background. A significant excess above 2614.5 keV — even with no discrete peaks — indicates neutrons / a neutron source and must be reported. This is the primary way to detect a bare neutron source (e.g. Cf-252) whose own gammas are not identifiable. (Note: this is the region ABOVE 2614 keV — do not confuse it with the beta-continuum broad-band check at 100-2000 keV below.) Neutron vs. beta-bremsstrahlung: both give a smooth high-energy continuum, but beta ends near its endpoint (typically < ~3–3.5 MeV); a net excess continuing well above 2614 keV into the multi-MeV region indicates a neutron/spontaneous-fission source — classify it as neutron/fission, and this takes precedence even if beta_continuum_check returns BremLike. Caveat: less diagnostic if Co-56 or similar high-energy emitters are identified.
- Look for neutron reaction peaks among identified sources: H(n,g) 2223.2 keV, Fe(n,n') 846.8 keV, B-10(n,a) 477.6 keV, Ge(n,n') inelastic scatter.
- If 477 keV region shows excess, use
get_spectrum_image (430-530 keV) to check for Doppler-broadened triangular B-10 feature.
- If spectrum extends above 4 MeV, check 4.2-4.7 MeV range for alpha-Be (AmBe/PuBe) signature using
get_counts_in_energy_range and get_spectrum_image.
- If detector is HPGe, check low-energy region (~50-200 keV) with
get_spectrum_image for "ski-slope" continuum indicating neutron interactions in the germanium crystal.
Alpha checks:
- 4.44 MeV broad feature indicates alpha-Be neutron source (AmBe/PuBe).
- Note any recoil-broadened peaks observed during investigation.
Beta source check (MANDATORY gate — pure-beta emitters produce NO photopeaks, only bremsstrahlung, so without this they are missed and wrongly called "background"):
- Whenever neutrons are NOT definitively present AND you are about to conclude "no source"/"only background" (no photopeaks beyond background ones), you MUST rule out a beta source before finalizing. Do NOT conclude "only background" or leave this state without this check.
- Primary check: call
beta_continuum_check (no arguments). It deterministically background-subtracts the foreground, excludes peak regions, and analyzes the net continuum shape. Interpret the Verdict:
BremLike: strong evidence of a bremsstrahlung continuum, most commonly a pure beta emitter — report "bremsstrahlung from a beta emitter" (noting an x-ray generator or heavily shielded DU can look similar). Present ConsistentPureBetaNuclides as candidates (consistency, NOT an identification). TerminationEnergy_keV_LowerBoundOnBetaEndpoint is a statistics-limited LOWER bound on the beta endpoint — the true endpoint is typically well above it. A BremLike verdict IS a positive source finding: you MUST report a beta source and MUST NOT downgrade it to "background"/"environmental"/"inconclusive". Two rationalizations are forbidden: (i) "brems is common in background" — the check ALREADY background-subtracted, so this is a NET excess, not background; (ii) "no accompanying gamma photopeaks" — for a pure-beta emitter the absence of gamma lines is EXPECTED and corroborates the finding (requiring gamma corroboration for a pure-beta source is self-contradictory). Only override BremLike if actual discrete photopeaks fully account for the elevated continuum.
NotBremLike: continuum elevation has gamma-source character (see ElevatedGammaPeaks, or a Compton-edge-like cliff) — investigate as a gamma source instead.
Ambiguous: genuinely inconclusive — a directive to INVESTIGATE, not to guess. Do NOT default to "background"/"environmental" (repeats the dismissal error) and do NOT declare a beta source on Ambiguous alone. Run the fallback check (below) and let evidence decide: clear smooth continuum EXCESS with no photopeaks → beta/bremsstrahlung; flat or peak-shaped residual with no broad excess → "background / no beta" is correct. Only conclude "background" AFTER the fallback shows no continuum excess. (False-positive guard: a truly background/NORM-only spectrum has no net continuum excess, so the fallback shows none — never report brems without a clear net excess.)
NoContinuumElevation: no beta source indicated; proceed.
AnnihilationDominated: a positron source (e.g. F-18) is more likely than a beta-minus emitter.
BackgroundNotLoaded: ask the user for a background measurement, or use the fallback below at reduced confidence.
Sanity check before finalizing: Confirm (a) every source you will report has at least one genuinely elevated peak. Report a NORM nuclide (K-40, U/Ra/Th chains) as a source only if it is notably elevated over the background rate — if its lines are clearly elevated it is a legitimate source, but if they are at/near background level, attribute them to background instead. And (b) the largest elevated peaks are all explained — re-check get_peaks (elevated_above_background/unidentified); if the dominant elevated peak is unattributed, you have likely missed the primary source, so go back and investigate it rather than finalizing.
Note findings for the final summary, then proceed to Step 7.
Step 7: Finalize
Summarize findings:
- List all identified sources (ultimate parents) with confidence levels
- List peaks that remain unidentified, with explanation of why they could not be resolved
- Note any non-peak signatures detected: neutron excess, neutron reaction indicators, alpha-Be features, HPGe ski-slope, beta continuum, Doppler-broadened features
- Note any anomalies (unusual NORM ratios, unexpected sources, failed fits)
Do not add unidentified peaks with source "Unknown" to the analysis state.