Review index · Download editable notebook
Executed top-to-bottom in a fresh kernel.
Cell 0 · scope
Physicist review index
This is a reproducible verification companion to release r4, not an experimental validation of a spacecraft. The specialist notebooks expose equations, inputs, source, residuals and uncertainty. They distinguish mathematical recomputation, bookkeeping reconciliation and incomplete physical/numerical claims.
Read this first: the tabulated-ice point-nadir estimator remains unconverged. The raw ice table is not distributed. A saved response can be reconciled without reproducing the physical scattering experiment. A pulse-shape classifier is not a validated source-depth classifier.
Cell 1 · setup · execution 1
from pathlib import Path
import sys, json, hashlib, math, platform
ROOT = next(p for p in (Path.cwd(), *Path.cwd().parents) if (p/'modules/common.py').is_file())
sys.path.insert(0, str(ROOT/'modules'))
from common import H, C, PHOTON_ENERGY_337, PHOTON_ENERGY_777, R_PHOTONS_PER_R_M2_SR_S, table
import numpy as np
import scipy
print('Python', platform.python_version(), 'NumPy', np.__version__, 'SciPy', scipy.__version__)
print('All package paths resolve relative to', ROOT)
Python 3.12.14 NumPy 2.3.5 SciPy 1.18.1
All package paths resolve relative to D:\Photometer_research_20261022\verification_20261022_r1
Cell 2 · integrity-description
SHA256 detects changes to the reference artefacts. It does not validate the physics or prove source licensing. Missing original physical inputs are separately declared in the manifest.
Cell 3 · integrity-check · execution 2
manifest = json.loads((ROOT/'input_manifest.json').read_text(encoding='utf-8'))
integrity = []
for item in manifest['files']:
path = ROOT/item['package_path']
actual = hashlib.sha256(path.read_bytes()).hexdigest()
integrity.append({'file':item['package_path'], 'bytes':path.stat().st_size, 'hash_matches':actual == item['sha256']})
assert all(row['hash_matches'] for row in integrity)
print(len(integrity), 'pinned copied inputs match')
table(integrity, max_rows=8)
print('Not bundled:', '; '.join(manifest['excluded_inputs']))
pinned copied inputs match
| file | bytes | hash_matches |
|---|
| data/cloud_results.json | 11468702 | True |
| data/statistics_results.json | 439658 | True |
| data/design_results.json | 493260 | True |
| data/analytic_results.json | 657745 | True |
| data/release_content.json | 383577 | True |
| data/release_manifest.json | 18940 | True |
| data/cloud_QA.json | 7778 | True |
| data/cloud_validation_summary.json | 18029 | True |
233 rows total; 8 shown.
Not bundled: Raw GHM ice LUT: redistribution permission not established; Restricted RAIDS/GLIMS observations; Proprietary observed waveform data
Cell 4 · units-description
2. Inspect a complete SI worked example
The input is an assumed aperture-plane source fluence. Atmospheric propagation has already occurred. The continuum is an illustrative processed ground component, not a total polar night background.
Inspect original LaTeX
E_\gamma=hc/\lambda,\quad S=\eta A\Phi,\quad G=A\pi\sin^2(\Theta/2).
The admitted rayleigh brightness is already band-integrated. Do not multiply that contribution by the optical bandwidth again.
Cell 5 · units-worked · execution 3
p = json.loads((ROOT/'parameters/worked_example.json').read_text(encoding='utf-8'))
A = math.pi*p['aperture_diameter_m']**2/4
G = A*math.pi*math.sin(p['full_circular_fov_rad']/2)**2
energy = H*C/p['wavelength_m']
source_PE = p['end_to_end_primary_efficiency']*A*p['received_source_fluence_ph_m2']
continuum_cps = p['end_to_end_primary_efficiency']*G*p['continuum_W_m2_sr_nm']*p['equivalent_rectangular_bandwidth_nm']/energy
aurora_cps = p['end_to_end_primary_efficiency']*G*p['admitted_auroral_brightness_R']*p['projected_aurora_filling']*R_PHOTONS_PER_R_M2_SR_S
background_PE = (continuum_cps+aurora_cps+p['dark_primary_rate_s_inverse'])*p['on_window_s']
rows = [{'quantity':'photon energy337.1nm','value':energy,'unit':'J'}, {'quantity':'entrance area','value':A,'unit':'m^2'}, {'quantity':'projected etendue','value':G,'unit':'m^2 sr'}, {'quantity':'expected source count','value':source_PE,'unit':'primary PE'}, {'quantity':'continuum count rate','value':continuum_cps,'unit':'s^-1'}, {'quantity':'on-window background expectation','value':background_PE,'unit':'counts'}]
assert source_PE > 0 and background_PE > 0
assert abs(energy-PHOTON_ENERGY_337)<1e-32
table(rows)
| quantity | value | unit |
|---|
| photon energy337.1nm | 5.8927495e-19 | J |
| entrance area | 1.9634954e-05 | m^2 |
| projected etendue | 1.5421257e-05 | m^2 sr |
| expected source count | 392.69908 | primary PE |
| continuum count rate | 37056.555 | s^-1 |
| on-window background expectation | 111.31967 | counts |
6 rows total; 6 shown.
Cell 6 · mapping-description
3. Follow a calculation or original question
The map identifies source functions/lines and methods. Its status distinguishes executed formulas from blocked physical predictions and retained legacy calculations. Reading a source implementation and independently verifying it are different actions.
Cell 7 · mapping · execution 4
mapping = json.loads((ROOT/'calculation_map.json').read_text(encoding='utf-8'))
print('Crosswalk structure:', list(mapping))
coverage = json.loads((ROOT/'question_coverage.json').read_text(encoding='utf-8'))
table([{'question':q['original_label'], 'scope':q['question'], 'notebooks':q['notebooks'], 'remaining_gap_count':len(q['remaining_gaps'])} for q in coverage], max_rows=22)
Crosswalk structure: ['schema_version', 'generated_utc', 'title', 'source_manifest', 'calculation_count', 'calculations', 'plots', 'retained_legacy', 'warnings', 'path_convention', 'function_line_policy', 'source_snapshots']
| question | scope | notebooks | remaining_gap_count |
|---|
| initial | Transmission to nadir at 550 km versus overhead cloud optical depth; cloud-top/above-top source; Rayleigh versus particles. | ["01", "02"] | 2 |
| 1 | Which radiative-transfer calculation/tool should be used, and alternatives to CloudScat? | ["02"] | 2 |
| 2 | Multiple scattering and temporal profile; robustness of 30-80 us versus>200 us rise-time discrimination. | ["02", "03", "04"] | 3 |
| 4 | Absolute nightside 337 nm radiance: quiet airglow, moon, zodiacal light and integrated starlight. | ["01"] | 2 |
| 5 | Auroral 337 nm 4 nm-band brightness and shot-noise floor during moderate/disturbed conditions. | ["01", "03"] | 2 |
| 6 | Lunar phase/elevation at which cloud background dominates detector noise. | ["01"] | 2 |
| 7 | Detector choice at 337 nm, large area and 10-50 kHz; claimed photodiode/TIA floor. | ["01", "03"] | 2 |
| 8 | NEP and aperture photons per event for candidate detectors. | ["01", "03"] | 2 |
| 9 | DC coupling and preservation of a>3 ms pulse. | ["01"] | 2 |
| 10 | 2-3 year 550 km polar/SAA radiation effects on dark current and gain. | [] | 2 |
| 11 | European suppliers for flight or near-flight detectors. | [] | 1 |
| 12 | Maximise nonimaging photometer etendue within roughly 1U. | ["01"] | 1 |
| 13 | Maintain narrowband filter response over 60-90 degree full field. | ["01"] | 2 |
| 14 | Is 4 nm FWHM optimal for the N2(0, 0)band and background? | ["01"] | 2 |
| 15 | Required optical density and rejection wavelength range. | ["01"] | 2 |
| 16 | 777.4 nm null-channel detector and comparable photon thresholds. | ["01", "03"] | 2 |
| 17 | Cross-calibration of different detector technologies for a trustworthy ratio. | ["01", "03"] | 2 |
| 18 | On-orbit gain drift, absolute radiometric stability and peak brightness versus current. | [] | 2 |
| 19 | Ground calibration/characterisation and facilities. | [] | 2 |
| 20 | Laboratory 337 nm source with 30 us rise and>3 ms duration. | ["01", "02"] | 2 |
| 21 | Can 2-4 kg/5-10 W deliver a useful event rate at 550 km? | ["03", "04"] | 3 |
| 22 | What assumptions or physics are missing? | ["00", "01", "02", "03", "04"] | 3 |
22 rows total; 22 shown.
Cell 8 · navigation
4. Review in this order
- 01_units_budget_optics: photon units, etendue, background/count conversion, filter assumptions, electronics and optical algebra.
- 02_transport: RTE, phase normalization, direct light, next-event estimator, native batch reconstruction, timing convolution and rare-path convergence controls.
- 03_statistics: likelihood derivation, worked fitted counts, exact on/off tests, red upper limits and all saved confusion denominators.
- 04_analytic_diagnostics: molecular column, Lambert reflection, diffusion ambiguity, deadtime and FOV population proxies.
Each specialist identifies what it does not independently recompute. A small residual or a passed assertion is not evidence that the hypothetical source, cloud phase, background or detector describes the mission.
Cell 9 · limits
The retained source code and explicit full-run commands are available under reference and scripts. Full Monte Carlo/pulse-grid jobs are opt-in. They must use new output folders and do not run when opening this notebook. Input source hashes and the raw-ice acquisition/extraction recipe are provided; raw licensed/restricted inputs are excluded.
No software check establishes the target fluence population, source-depth ground truth, actual polar/Kp/lunar radiance distribution, selected-device radiation lifetime, minimum thermal777/337ratio, or photon-to-discharge-current relation.