CGV-WEB
Calorimeter Geometry Viewer Web
CGV-WEB renders CERN ATLAS calorimeter collision events in real-time 3D, colour-coding each detector cell by energy deposit. Built on Rust/WebAssembly, Three.js, and backed by ROOT data pipelines, it is NIPSCERN's most technically ambitious project — led by Chrysthofer Arthur — and is being integrated into the ATLAS Control Room at CERN.
ATLAS Calorimeter — Interactive Preview
Interactive 3D rendering of the ATLAS calorimeter. Each coloured cell represents energy deposited by particles in a collision event.
A browser-native engine for ATLAS calorimetry
CGV Web is a zero-install, browser-native event display for the ATLAS calorimeter system. It loads the real detector geometry exported from the ATLAS GeoModel database and draws on top of it the quantities shifters and analysers care about during a run: energy deposits per cell, topological clusters, reconstructed inner-detector tracks, and the associated kinematic summary.
The viewer runs entirely in WebGL2 via Three.js. Cell identifiers are decoded by a Rust-compiled-to-WebAssembly module, so mapping a 32-bit caloId to (subDet, side, sampling, η-bin, φ-bin) costs a few microseconds and never blocks the main thread. The geometry payload CaloGeometry.glb.gz (~45 MB compressed) is fetched once and cached by the browser service worker; subsequent loads are sub-second.
Geometry is produced off-line by a custom ROOT → glTF pipeline. A Node.js build script (setup/root2scene.mjs) reads CaloGeometry.root from the GeoModel export, compiles it to glTF-binary, strips and quantises unused attributes (setup/optimize_glb.mjs), and gzip-compresses the final .glb.gz shipped to clients. At runtime the page never touches ROOT or ATHENA — any modern browser with WebGL2 is enough.
Stack overview
| Layer | Technology | Role |
|---|---|---|
| Renderer | Three.js · WebGL2 | Scene, camera, cell meshes, tracks and cluster outlines |
| ID decoder | Rust → WebAssembly | Decodes compact 32-bit ATLAS cell IDs into (subDet, side, sampling, η, φ) |
| Geometry source | ATLAS GeoModel → ROOT → glTF | Off-line build; runtime loads the ~45 MB .glb.gz |
| Event data | JiveXML (.xml / .xml.gz) | Produced by ATHENA's JiveXML algorithm; served by ATLANTIS in Live mode |
| Build pipeline | Node.js scripts · wasm-pack | Compiles geometry and Rust parser; one-shot via build.bat on Windows |
Lineage — from CGV to CGV Web
CGV Web is the direct successor of the original CGV (Calorimeter Geometry Viewer), developed by Prof. Dr. Luciano Manhães de Andrade Filho as part of his doctoral thesis. The original CGV was built in JSROOT, ran on Linux in the ATLAS Control Room during the early days of the LHC in 2008, and served as the reference calorimeter-geometry event display for shifters of that era.
In 2026 the project was rebuilt from scratch at NIPSCERN as a modern web application: a WebGL2 renderer, WASM-based JiveXML parser, live-feed ingestion, an entirely new UI with cinema mode, slicer, guided tour and multi-language support — and many more capabilities beyond what the original tool offered. CGV Web inherits the spirit of the original CGV while targeting a browser-first, Run 3 / Run 4 workflow.
What you see inside the detector
The scene is a faithful reconstruction of the real ATLAS calorimeter geometry. Cell meshes come from the ATLAS GeoModel database, exported via a custom ROOT → glTF pipeline, repacked as a single CaloGeometry.glb.gz payload and preloaded at first paint. Active cells and ATLAS-Ghost envelopes share the same glTF file and are toggled independently at runtime, so the wire-up cost is paid once.
Active sub-detectors
| Sub-detector | Region | η range | Cells (approx.) | Panel |
|---|---|---|---|---|
| TileCal LB | Long barrel | 0 – 1.0 | ~2,900 | TILE |
| TileCal EB± | Extended barrel | 0.8 – 1.7 | ~2,400 | TILE |
| LAr EMB | EM barrel | 0 – 1.475 | ~109,000 | LAr |
| LAr EMEC± | EM end-cap | 1.375 – 3.2 | ~63,000 | LAr |
| HEC | Hadronic end-cap | 1.5 – 3.2 | ~5,600 | HEC |
| FCAL 1 / 2 / 3 | Forward | 3.1 – 4.9 | ~3,500 | FCAL |
By default only cells with a hit (E ≥ min_threshold) are drawn. To visualise the bare geometry of a sub-detector even where the current event carries no deposit, enable All cells with the V key — empty cells are then painted with the coldest colour of their sub-detector palette.
ATLAS Ghost envelopes
"Ghosts" are the inactive support, cryostat and structural volumes. CGV Web renders them as semi-transparent grey shells so that shifters can see where the beam axis and the sub-detector boundaries sit without occluding the event itself. The current build exposes the Ghost as a single on/off control tied to the TileCal outer shell: the Ghost toolbar button (or G) toggles the whole ATLAS-Ghost envelope bundle as one unit. When any ghost is visible, a dashed φ-segmentation grid is drawn on top of the Tile envelopes to mark the 64 × 11.25° module boundaries.
Colour convention
| Sub-detector / object | Accent | Hex |
|---|---|---|
| TileCal | orange | #c87c18 |
| LAr EM | green | #27b568 |
| HEC | cyan | #66e0f6 |
| FCAL | copper | #b87333 |
| Tracks | yellow | #ffea00 |
| Clusters | red | #ff4400 |
Active cells use a per-sub-detector cold-to-hot gradient between their minimum-palette accent (low E) and a bright saturated shade (high E). Track lines are thin and solid; cluster outlines are dashed. Inactive ghost envelopes are a shared semi-transparent grey, rendered at 15% opacity so they never compete with the active data.
Three ways to feed the viewer
Events enter CGV Web through three independent pathways, selected in the mode bar at the top of the left panel. Only one mode is active at a time; switching modes stops the previous ingestion without discarding the scene, so you can hop between Live and a local file without losing the camera state or threshold configuration.
Live mode long-polls the ATLAS Live service hosted by the ATLANTIS project. It is the default mode in the Control Room deployment and typically delivers an event every few seconds during a run. The CGV Web left panel mirrors exactly the event list served by atlas-live.cern.ch. A green pulsing dot marks an active feed, amber warns that the last event is older than 60 s, red signals an unreachable endpoint. The ⏸ / ▶ controls pause and resume polling; Space toggles the same state from the keyboard.
Local mode parses JiveXML entirely in the browser — files never leave the machine, no upload, no server round-trip, no telemetry. Select Folder walks a directory recursively and adds every .xml entry to the event list (File System Access API on Chromium, webkitdirectory fallback on Firefox and Safari); Upload XML opens a single file. Multi-event XMLs are expanded into their constituent events, and a carousel bar offers 2 s / 5 s / 10 s / 30 s auto-advance. Drag-and-drop of .xml or .xml.gz onto the 3D canvas is equivalent to Upload XML.
A curated set of events shipped in default_xml/ is listed at start-up — useful for demos, shifter training, and for regression-testing a new build without touching production data. Each row shows a short description together with the run / event number; the list is populated from default_xml/index.json, bundled with the deployment.
Accepted file formats
| Format | Source | Status |
|---|---|---|
JiveXML .xml | ATHENA JiveXML / ATLANTIS | supported |
JiveXML .xml.gz | gzipped JiveXML | supported (auto-decompressed) |
.root | xAOD / D3PD | not supported — convert via ATHENA first |
.json | custom formats | not supported |
.xml.zst | Zstandard-compressed JiveXML | not supported |
The interface in three regions
The CGV Web interface is organised into three functional regions placed around the 3D canvas: a retractable left panel for data ingestion, a retractable right panel for energy threshold sliders, and a bottom toolbar for scene controls and output. Transient widgets — cell tooltip, collision HUD, dialogs and popovers — appear contextually on top of the canvas. Every control is keyboard-reachable.
Three exclusive modes at the top (Live, Local, Samples) reveal the corresponding list or picker. A status bar reports the current pipeline stage (request, recognise, download, acquire, load) and a session-wide request counter. Once an event is loaded, a collision footer condenses run number, event number, luminosity block, timestamp and JiveXML producer version into a compact strip; hovering promotes it to a full per-field tooltip. The panel is pinnable via a pin icon at top-right and auto-opens on edge-hover when the Auto-open sidebar on hover preference is enabled.
Stacked per-sub-detector tabs with a vertical slider each. The Cluster tab is pinned at the top as an always-visible fixed pane; TILE, LAr, FCAL, HEC and Track are sibling tabs below. Each slider exposes a gradient track from 0 to the current ceiling, a max read-out driven by the 97th-percentile of the current event (P97 auto-scaling), and a numeric input accepting typed values with unit suffixes — 200 MeV, 1.5 GeV, 2e3. The Cluster tab adds a Cluster Threshold on/off switch that bypasses the cluster filter when disengaged.
Pin toggles for the side panels (Sidebar, Energy), a Layers popover to switch TILE / LAr / HEC / FCAL independently, a single-unit ATLAS Ghost toggle, show/hide for Tracks and Clusters, a Cell info (hover tooltip) switch, the Beam axis indicator, a scene-Background colour picker, the cylindrical-wedge Slicer gizmo, an All cells reveal, Reset view, Cinema mode, the Screenshot resolution picker, Settings, and a Language cycle (EN / FR / PT / NO).
Cell tooltip
Displayed on hover whenever Cell info is enabled. The tooltip reports the compact ATLAS-ID (sub-detector, side, sampling, η-bin, φ-bin), the cell's η/φ coordinates and the deposited energy. Units auto-scale between MeV and GeV so the read-out stays readable across four orders of magnitude. A thin outline is drawn around the hovered cell; both tooltip and outline are suppressed during screenshot capture unless explicitly pinned.
Slicer — cylindrical wedge
The slicer carves a z-aligned cylindrical wedge out of the scene, hiding every cell whose centre falls inside the cut volume — useful to peek at a shower core when outer layers occlude it. Activate with Shift+S. A screen-Y drag on the 3D handle sweeps the wedge angle θ from 0 to 2π; a screen-X drag scales the cylinder height (default 3 m, max 20 m) symmetrically around the anchor; right-click + drag translates the whole cut volume along z. Culling respects every other filter (sub-detector toggles, energy thresholds, clusters, All cells), and the gizmo is hidden automatically during screenshot capture.
Cinema & guided tour
C hides all non-essential UI and slowly rotates the camera around the detector. Only the Exit Cinema pill and the collision HUD remain visible, so the frame is suitable for presentation capture. With Guided tour in cinema enabled in Settings, the auto-rotation is replaced by a scripted fly-through: a wide establishing shot, a face-on approach along +z, a glide through the central bore, a face-on exit through −z, and an outer arc back to the start — a single continuous motion. Any canvas click (without drag) exits cinema.
Screenshot output
P or the camera toolbar button opens the resolution picker. The scene re-renders at the chosen resolution with the UI hidden — slicer gizmo, beam-axis cones and cursor crosshair are suppressed during capture; pinned tooltips are composited back in. Available resolutions depend on form factor: mobile and tablet cap at 2K; desktop and laptop go up to 10K (10 240 × 5 760). A transparent background toggle saves the PNG with an alpha channel; a collision info overlay toggle composites event metadata (timestamp, run, event, lumi block, version) into the top-left corner. Captured files are named CGVWEB_{W}x{H}_{YYYY-MM-DDTHH-MM-SS}.png.
Preferences persist in localStorage under the cgv-* prefix — button hints, auto-open sidebar on hover, guided-tour mode, scene background, and interface language. The first visit auto-detects the browser's navigator.language.
Keyboard shortcuts
All shortcuts are single-press (except where Shift is noted). Typing into a text field suppresses the hotkeys until focus leaves the field; Ctrl, Cmd and Alt combinations are reserved for the browser.
| Camera | |
|---|---|
| Mouse drag | Orbit camera |
| Scroll | Zoom |
| Right-drag | Pan |
| R | Reset to default isometric |
| 1 / 2 / 3 | Top / side / isometric presets |
| Panels | |
|---|---|
| M | Pin / unpin left (sidebar) panel |
| E | Pin / unpin right (energy) panel |
| G | ATLAS Ghost envelopes popover |
| S | Settings panel |
| ? | Shortcuts cheat-sheet (in Settings) |
| Esc | Close topmost overlay / exit cinema |
| Scene toggles | |
|---|---|
| T | Toggle TILE |
| L / A | Toggle LAr (EMB + EMEC) |
| H | Toggle HEC |
| F | Toggle FCAL |
| J | Toggle reconstructed tracks |
| K | Toggle topological clusters |
| Shift+K | Toggle cluster-ET threshold switch |
| I | Toggle cell tooltip & outline |
| B | Toggle beam-axis indicator |
| V | Toggle All cells |
| Shift+B | Scene-background colour picker |
| Shift+S | Cylindrical-wedge slicer |
| C | Cinema mode |
| Data source & output | |
|---|---|
| ← / → | Previous / next event |
| Space | Pause / resume live polling |
| P | Screenshot — resolution picker |
| / | Focus event-list search |
Status & roadmap
CGV Web is being prepared to serve as the official CERN event-display tool for the ATLAS experiment during Run 4. The current code base is the candidate build for that role: the geometry, parser, live-feed ingestion and UI are feature-ready and are being validated against Run 3 Control Room operations ahead of the Run 4 integration window.
The tool works today on Run 3 data and is optimised for the Run 3 workflow of the ATLAS Control Room: open the page, see the most recent event rotating in, filter by sub-detector or energy threshold, and grab a publication-quality screenshot in one click. No install, no ROOT, no Athena — any modern browser with WebGL2 is enough.
For Run 4 (scheduled to start around 2030), CGV Web is planned to become the official CERN ATLAS calorimeter-geometry event-display tool, integrated directly into the ATLAS Control Room as the reference shifter-facing visualiser for calorimeter data.
Try CGV-WEB
Load the full application — connect to the ATLAS Live feed, open a JiveXML event, or pick a bundled sample, and explore the calorimeter geometry cell by cell.