Cherenkov CO2 radiator + spherical mirror

A standalone solid_gemc study, built from scratch in one session. Run completed 2026-05-12; report refreshed 2026-05-14. N = 1000 validated

Local dev view — images loaded from analysis/runs/<id>/; for upload, see report_portable.html.
Project uses the legacy nested layout (analysis/, geometry/ subdirs) — the workspace standard moved to flat in v0.0.3 of solid-gemc-claude; this project predates it and its analysis/runs/ dirs are immutable per the workspace non-negotiables, so the nested layout stays.

Scope

Three volumes inside a 1 m × 1 m × 1 m CO2 (1 atm) radiator box: the gas itself, a spherical-mirror cap with R = 80 cm, and a flat photon sensor sitting at the mirror focal plane. A 1 GeV e⁻ pencil beam enters the gas on the z-axis, emits Cherenkov light, the mirror focuses it onto the sensor. The mirror is tilted 45° around the beam-transverse axis so the sensor catches the focused light off the beam path.

Goals were narrow and incremental: verify the Cherenkov ring image at the mirror focal point; iterate the geometry to compactify it, tilt it, parameterize it; finally take a 1000-event production sample and characterise the image on the sensor.

Final geometry

beam ─►       │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
 e⁻ 1 GeV     │   CO₂ 1 atm   (gas mother volume, 1 m × 1 m × 1 m)              │
 vertex       │                                                                  │
 (0,0,−80)    │             ┌── spherical mirror cap, R = 80 cm,  ──┐            │
              │             │    apex on beam axis at (0, 0, +40),  │            │
              │             │    tilted +45° about x,               │            │
              │             │    sphere centre at (0,+56.57,−16.57)  ╲           │
              │                                                       ╲          │
              │                                                        ╲ sensor  │
              │       photons reflect upward ───────────►              ╱ at      │
              │                                                       ╱  (0,+40, │
              │                                                       ╱   +40)   │
              │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
              z=−50                       z=0                                z=+50
  
ParameterValueNotes
Radiator materialSL_LGCCgasCO₂ 1 atm, ρ = 1.842 × 10⁻³ g/cm³; n ≈ 1.000418 across 2 – 6.2 eV
Radiator size100 × 100 × 100 cmcentred at world origin
Mirror radius of curvatureR = 80 cmfocal length f = R/2 = 40 cm
Mirror caphalf-angle 10°rim radius ≈ 14 cm, ≈ 1 cm Al shell
Mirror reflectivity≈ 0.87 (peak)SoLID LGC_Mirror curve
Mirror tilt+45° about +xchief reflected ray → +y
Sensor size15 × 15 × 0.1 cmthin Box, face perpendicular to chief reflected ray
Sensor position(0, +40, +40) cmat the chief-ray geometric focus
Cherenkov half-angleθC ≈ 1.66°arccos(1/n) for β ≈ 1
Predicted ring radiusf · tan θC ≈ 1.16 cmideal, paraxial

Progress timeline

04:51 UTC
First geometry, on-axis, R = 160 cm
CO₂ box + on-axis spherical mirror (apex at z = +120) + sensor at z = +10 (the geometric focus). Hand-edited TEXT files modelled on solid_gemc/analysis/hgc_study/cherenkov. First run with HALL_MATERIAL = G4_Galactic produced zero back-reflected photons and zero mirror hits — Geant4 kills optical photons at the gas/world boundary when the world material has no refractive index.
04:56 UTC
Switch to HALL_MATERIAL = Air_Opt
Result: a clean Cherenkov ring at radius ≈ 2 cm on the focal plane, matching f · tan θC = 80 · tan 1.66° ≈ 2.32 cm. 50-event smoke ran in < 1 s.
10:30 UTC
Compactify: R = 80 cm, mirror inside the gas
Mirror moved from daughter-of-root to daughter-of-co2_radiator; R halved. Focal point now on-axis at (0, 0, 0). GUI verified.
10:40 UTC
Tilt mirror 45° → sensor off the beam path
First attempt with rotation string +45*deg crashed Geant4's overlap check: the apex landed at world (0, +113, +40) instead of (0, 0, +40). gemc applies the rotation string with an inverted sign relative to the obvious reading. Flipping to -45*deg fixed it; all volumes pass overlap. Saved as workspace memory so the next rotation we write doesn't repeat the mistake.
10:58 UTC
Convert to a Perl-driven pipeline
Hand-editing the TEXT files made me compute sphere centre and the inverted-sign rotation manually — twice already, with one miss. Promoted the geometry to a parameterised Perl pipeline matching upstream geometry/hgc_moved/. One knob ($mirror_R_cm, $mirror_tilt_deg) now drives all the derived placements + the rotation string. Generated files pass overlap check; smoke ran clean.
15:10 UTC
N = 1000 production run on the tilted geometry
11.8 s gemc time. 105,861 photon hits across 1000 events. 2D map shows astigmatism, not a clean ring — the trade-off the 45° tilt buys us.

Results

1000 events, 1 GeV e⁻ pencil beam, tilted-mirror geometry.

QuantityValue
Optical-photon sensor hits (total)105 861
Mean photons / event105.9
RMS10.2
Image type at sensorastigmatic diamond (not a ring)
Tangential-focus separation±2 cm in xlocal
Sagittal extent≈ ±1 cm in ylocal
gemc wall time11.8 s
Histogram of N optical-photon hits per event
Optical photons reaching the sensor, one entry per event of 1 GeV e⁻ through 1 m of CO₂. Gaussian-ish, mean ≈ 106. Source: runs/20260512-151035/h_nphoton.png.
2D sensor hit map for the tilted-mirror setup
Sensor hit map in local (x, y) coordinates [cm]. Diamond-shaped distribution with bright tangential foci at x ≈ ±2 cm — astigmatism of the off-axis spherical mirror. The sensor sits at the chief-ray geometric focus (R/2 from apex); tangential and sagittal rays focus at different distances, so the image at this plane is the "circle of least confusion". Source: runs/20260512-151035/h_xy.png.
2D sensor hit map for the on-axis R=160 setup
For comparison: the same plot from the on-axis R = 160 cm setup (50 events, before the tilt). Right panel is the back-reflected (pz < 0) subset — a clean ring at r ≈ 2 cm, matching f · tan θC. Off-axis tilt is what introduces the astigmatism above. Source: runs/20260512-045625/h_xy.png.

What this study taught

Note for future runs: the sensor sits inside the gas radiator (daughter of co2_radiator), so forward Cherenkov photons emitted upstream of z = +40 can in principle hit it on the way to the mirror. In the tilted geometry the sensor is far off-axis at y = +40 cm, so the Cherenkov cone (half-angle 1.66°, max transverse displacement ≈ 1.2 cm) cannot reach it directly — all sensor hits are post-mirror.

Reproduce

# from the workspace root
# 1. edit physics knobs at the top of:
#    cherenkov_co2_mirror/geometry/cherenkov_co2_box_geometry.pl
#    (R, tilt, apex, sensor size — derived quantities recompute)

# 2. regenerate the TEXT factory files
solid-gemc-run exec "cd cherenkov_co2_mirror/geometry && \
  ./cherenkov_co2_box.pl config_cherenkov_co2_box.dat"

# 3. run the simulation
RUN=cherenkov_co2_mirror/analysis/runs/$(date -u +%Y%m%d-%H%M%S)
mkdir -p $RUN
cp cherenkov_co2_mirror/analysis/cherenkov_co2_box.gcard $RUN/gcard.gcard
cp cherenkov_co2_mirror/geometry/cherenkov_co2_box__bank.txt $RUN/
solid-gemc-run exec "solid_gemc $(readlink -f $RUN/gcard.gcard) \
  -N=1000 -OUTPUT=evio,$(readlink -f $RUN)/out.evio"

# 4. convert EVIO → ROOT
solid-gemc-run exec "cd $RUN && evio2root -INPUTF=out.evio -B='cherenkov_co2_box'"

# 5. plot
solid-gemc-run exec "root -l -b -q \
  cherenkov_co2_mirror/analysis/analyze_cherenkov.C\(\\\"$(readlink -f $RUN)/out.root\\\",\\\"$(readlink -f $RUN)\\\"\)"

# 6. (optional) PDF → PNG, since ROOT's PNG output is disabled in this container
( cd $RUN && pdftoppm -png -r 120 h_nphoton.pdf h_nphoton && \
  pdftoppm -png -r 120 h_xy.pdf h_xy )

File map

cherenkov_co2_mirror/
├── CLAUDE.md          project rules (loaded by Claude Code)
├── log.md             chronological project log
├── result.md          human-readable summary of notable runs
├── report.html        this file
│
├── geometry/
│   ├── config_cherenkov_co2_box.dat    factory + variation
│   ├── cherenkov_co2_box.pl            master perl script
│   ├── cherenkov_co2_box_geometry.pl   PHYSICS KNOBS HERE (R, tilt, apex, ...)
│   ├── cherenkov_co2_box_materials.pl  SL_LGCCgas (CO2 1 atm + optical)
│   ├── cherenkov_co2_box_mirror.pl     cherenkov_mirror surface
│   ├── cherenkov_co2_box_hit.pl        solid_hgc hit definition
│   ├── cherenkov_co2_box_bank.pl       solid_hgc output-bank layout
│   ├── cherenkov_co2_box__*.txt        generated; do not edit
│   └── .baseline/                       stash of hand-edited TEXT files (reference)
│
└── analysis/
    ├── cherenkov_co2_box.gcard         runtime options for solid_gemc
    ├── cherenkov.vis                   Geant4 vis macro for the GUI
    ├── analyze_cherenkov.C             ROOT macro: 1D N_ph + 2D hit map
    ├── inspect.C                       tiny ROOT macro to list TTrees
    └── runs/
        ├── 20260512-045152/  G4_Galactic; failed (kept for reference)
        ├── 20260512-045625/  on-axis, R=160, 50 evts — clean ring
        └── 20260512-151035/  tilted, R=80, 1000 evts — astigmatic image

Generated 2026-05-12; report refreshed 2026-05-14. Sourced from log.md + result.md + the runs under analysis/runs/.