337.1 / 777.4 nm photometer

Physicist verification companion · source release r4 · mathematical checks and unresolved limits

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

1. Check the copied reference inputs

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']))
233
 pinned copied inputs match
filebyteshash_matches
data/cloud_results.json11468702True
data/statistics_results.json439658True
data/design_results.json493260True
data/analytic_results.json657745True
data/release_content.json383577True
data/release_manifest.json18940True
data/cloud_QA.json7778True
data/cloud_validation_summary.json18029True

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.

Eγ=hc/λ,S=ηAΦ,G=Aπsin⁡2(Θ/2).E_\gamma=hc/\lambda,\quad S=\eta A\Phi,\quad G=A\pi\sin^2(\Theta/2).
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)
quantityvalueunit
photon energy337.1nm5.8927495e-19J
entrance area1.9634954e-05m^2
projected etendue1.5421257e-05m^2 sr
expected source count392.69908primary PE
continuum count rate37056.555s^-1
on-window background expectation111.31967counts

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']
questionscopenotebooksremaining_gap_count
initialTransmission to nadir at 550 km versus overhead cloud optical depth; cloud-top/above-top source; Rayleigh versus particles.["01", "02"]2
1Which radiative-transfer calculation/tool should be used, and alternatives to CloudScat?["02"]2
2Multiple scattering and temporal profile; robustness of 30-80 us versus>200 us rise-time discrimination.["02", "03", "04"]3
4Absolute nightside 337 nm radiance: quiet airglow, moon, zodiacal light and integrated starlight.["01"]2
5Auroral 337 nm 4 nm-band brightness and shot-noise floor during moderate/disturbed conditions.["01", "03"]2
6Lunar phase/elevation at which cloud background dominates detector noise.["01"]2
7Detector choice at 337 nm, large area and 10-50 kHz; claimed photodiode/TIA floor.["01", "03"]2
8NEP and aperture photons per event for candidate detectors.["01", "03"]2
9DC coupling and preservation of a>3 ms pulse.["01"]2
102-3 year 550 km polar/SAA radiation effects on dark current and gain.[]2
11European suppliers for flight or near-flight detectors.[]1
12Maximise nonimaging photometer etendue within roughly 1U.["01"]1
13Maintain narrowband filter response over 60-90 degree full field.["01"]2
14Is 4 nm FWHM optimal for the N2(0, 0)band and background?["01"]2
15Required optical density and rejection wavelength range.["01"]2
16777.4 nm null-channel detector and comparable photon thresholds.["01", "03"]2
17Cross-calibration of different detector technologies for a trustworthy ratio.["01", "03"]2
18On-orbit gain drift, absolute radiometric stability and peak brightness versus current.[]2
19Ground calibration/characterisation and facilities.[]2
20Laboratory 337 nm source with 30 us rise and>3 ms duration.["01", "02"]2
21Can 2-4 kg/5-10 W deliver a useful event rate at 550 km?["03", "04"]3
22What assumptions or physics are missing?["00", "01", "02", "03", "04"]3

22 rows total; 22 shown.

Cell 8 · navigation

4. Review in this order

  1. 01_units_budget_optics: photon units, etendue, background/count conversion, filter assumptions, electronics and optical algebra.
  2. 02_transport: RTE, phase normalization, direct light, next-event estimator, native batch reconstruction, timing convolution and rare-path convergence controls.
  3. 03_statistics: likelihood derivation, worked fitted counts, exact on/off tests, red upper limits and all saved confusion denominators.
  4. 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

5. Full jobs and missing physical inputs

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.