This repository accompanies the paper
“Hoax or Real? On the Uniqueness of Nuclear Radiation Signatures”
by Christopher Fichtlscherer and Moritz Kütt, published in Science & Global Security (2024).
It contains every input file, simulation result, and script required to reproduce the figures and tables in the article.
| Folder | What’s inside |
|---|---|
unique/ |
Reusable library code – detector / geometry models, data I/O helpers, etc. |
scripts/ |
One-off scripts that reproduce every figure and table. |
data/ |
Experimental datasets and nuclear-data libraries used as inputs. |
results/ |
Computed simulation outputs and rendered figures. |
git clone https://github.com/cfichtlscherer/Hoax_or_Real_Code.git cd Hoax_or_Real_Code pip install -e .
python scripts/plot_detector_response.py
| Module | Purpose |
|---|---|
data.py |
Collects constants and tables: Spontaneous-fission Watt parameters, branching ratios, half-lives, neutron-multiplicities, plus the list of isotopes available from the DOE Isotope Program. |
detector.py |
Detector utilities. Simulates the NaI(Tl) response in OpenMC, broadens pulse-height tallies, converts them to IBX II/TRIS formats, and evaluates the corresponding test statistics. |
models.py |
OpenMC geometries for all theoretical weapon models: the FPS model, a bare plutonium pit, and the W78 / W87 designs (each with and without their re-entry vehicle). |
nndc_decay.py |
Decays arbitrary material vectors and computes γ- and n-emission spectra using ENSDF data. |
nndc_download.py |
Bulk-downloads the ENSDF decay database from NuDat 3. |
nndc_extraction.py |
Cleans and restructures the raw ENSDF files into pandas-friendly tables. |
Generated figures are written to results/figures/ unless stated otherwise.
| Category | Script / folder | Purpose |
|---|---|---|
| Detector-response simulation | simulate_detector_response/ |
Monte-Carlo simulation of the Mirion 802 NaI(Tl) 2×2″ detector using the pulse-height tally. • unique/detector.py – detector geometry & materials• run.py – runs 15 mono-energetic γ simulations• slurm.sh – SLURM batch template for one job• multi_starter.sh – submits ≈800 jobs in parallel• run_broadening.py – converts raw spectra (XXX.0_detector_sharp.npy) with the fitted resolution, producing XXX.0_detector_broad.npy (stored in results/detector_response/). Raw spectra are not included in the repository to keep its size reasonable. |
| Emission-source simulation | simulate_pit_emissions/simulate_fps_emissions/simulate_w78_emissions/simulate_w87_emissions/ |
OpenMC source-term simulations for the plutonium pit, the FPS, W78 and W87 weapon models, respectively. Each folder contains a run.py, slurm.sh, and multi_starter.sh. The pit geometry is defined in unique/models.py. Results reside in results/<model>_emissions/. |
| Radioactive decay utilities | decay_all_isotopes.py |
Decays every isotope with t½ > 7 days and stores the activities in all_decay_results_7hl_decay_3d.pickle and all_decay_results.pickle. |
decay_weapon_material.py |
Performs the decay calculation for different plutonium and uranium compositions used in nuclear weapons. | |
| Spectrum / system-signal generation | detector_and_system_signals_from_objects_and_isotopes.py |
Generates detector count spectra and confirmation-system signals from the simulated object emissions. |
| Detector-resolution fit | fit_detector_resolution.py |
Derives the NaI detector resolution parameters (a, b, c) from the experimental dataset osprey-35mm-na-cs (copied from sgs-lab/ibxII-measurements). |
| Plotting & figure generation | plot_detector_response.py |
Creates Figure 1 (simulated detector response). |
plot_pit_emissions.py |
Combines pit emission spectra for different ages and plots Figure 2 (0-year vs 50-year). Stores merged spectra in results/object_emission_spectra/pit_<age>_emissions.npy. |
|
plot_models_ray_tracing.py |
Produces Figure 3 (ray-tracing views of the weapon models). Requires OpenMC PR #2655 “Raytrace plots”. | |
plot_fps_emissions.py |
Generates Figure 4 (FPS emissions). | |
plot_total_emissions_thermo_nuclear_weapon_model.py |
Generates Figures 5 & 6 (thermonuclear-weapon model emissions). | |
plot_heatmap.py |
Generates Figure 7. | |
plot_emissions_PGPU_hoax.py |
Produces Figure 8 (top & bottom). | |
plot_halflife_vs_activity.py |
Generates Figure 9 (half-life vs activity of γ-emitters in NNDC). | |
determine_and_plot_hoaxes.py |
Creates Figures 10 & 11 and the appendix examples. | |
plot_alphan_energy_spectrum.py |
Generates Figure 12 – (α,n) neutron-energy spectrum from Sources4C. | |
find_and_plot_number_bins.py |
Computes test results for different bin numbers (stored in results/test_results_number_of_bins.pickle) and plots Figure 13. |
|
| Hoax-search utilities | greedy_minimize.py |
Iteratively removes isotopes and searches the remaining subset for minimal-isotope hoaxes for finding isotopes using only a very small number of isotopes. |
| Tables & printed outputs | print_pu3013_vector_and_U_emissions.py |
Reads results/nndc_data_processed/* and prints the Pu-3013 vector plus uranium emissions (Tables 2 & 3 of the paper). |
| Item | Description | Origin / Notes |
|---|---|---|
IBX_II_measurement_data/ |
Experimental NaI(Tl) pulse‑height spectra used to fit the detector resolution. | Copied from the ibxII‑measurements repository. |
Q_values.csv |
Nuclear Q‑values (MeV) for all relevant decay modes. | Downloaded directly from NuDat 3. |
nuclear_walled_decay_data.csv |
Needed for (i) stable nuclides and (ii) spontaneous‑fission branching ratios. | https://www.nndc.bnl.gov/walletcards/. |
pyne_nuclide_names.txt |
Canonical nuclide names. | Taken from PyNE. |
PoBe_equal_atom_fraction.npy |
Neutron‑energy spectrum of a PoBe (α,n) source with equal atom fraction. | Calculated by M. Kütt using SOURCES‑4C on a local workstation. |
| Path | Description |
|---|---|
detector_response/ |
NaI(Tl) response functions for mono-energetic γ-rays from 0 keV to 12,029 keV (already Gaussian-broadened). - 30,000 channels (0.1 keV each) per spectrum - Filenames: XXX.0_detector_broad.npy |
figures/ |
All PDF figures cited in the paper (Figure 1 – 13). |
isotope_emission_spectra/ |
Photon-emission and detector-signal libraries for every nuclide considered in the hoax search. For each isotope you will find: • *_emissions.npy – differential γ-emission rate (1 keV bins, units = γ s⁻¹ mol⁻¹)• *_detector.npy – 30 000-channel detector spectrum (0.1 keV bins)• *_ibx.npy – 12-channel IBX-II signature• *_tris.npy – 14-channel TRIS signature. |
object_emission_spectra/ |
Combined emission spectra and detector signals for the theoretical weapon models (pit, FPS, W78, W87, …). Range: 0–12 MeV in 1 keV steps. |
test_results_number_of_bins.pickle |
Simulation results from find_and_plot_number_bins.py used in Figure 13. |
nndc_data_processed/ |
Processed ENSDF decay data and derived material vectors: • big_df_all_nuclide_data.pickle – master dataframe containing all NNDC decay information(~200 k rows)• all_gamma_intensities.pickle – γ-intensity per isotope (1 mol s⁻¹)• all_equilibria.pickle / all_decay_results_7hl.pickle – equilibria / decaying all isotopes in which the parent has the longest half-live for 7hl of the parent• all_decay_results.pickle – composition of 3-day decay of all t½ > 7d nuclides• all_decay_results_7hl_3d.pickle – all_equilibria plus 3 days extra decay• Additional pickles with the compositions & emissions of WGPu, LEU, etc. |