|
SHiP Geometry
SHiP experiment geometry implementation using GeoModel.
|
Sampling calorimeter (ECAL + HCAL).
The Calorimeter subsystem builds a layered ECAL + HCAL stack. Each calorimeter module is a tile in an nx × ny grid; each tile is built from a sequence of layer types that interleave absorber plates, scintillator bars and HPL fibre layers.
All parameters — layer sequences, thicknesses, module tiling — are constexpr constants in CalorimeterConstants.h (namespace SHiPGeometry::Calo).
The kEcalLayers / kHcalLayers sequences in CalorimeterConstants.h are arrays of the LayerCode enum:
| Enumerator | Layer type |
|---|---|
WidePVT_H | WidePVT bar layer, bars along X (H orientation) |
WidePVT_V | WidePVT bar layer, bars along Y (V orientation) |
ThinPS_H | ThinPS bar layer, bars along X (H orientation) |
ThinPS_V | ThinPS bar layer, bars along Y (V orientation) |
FibreHPL_Y | HPL fibre layer, fibres along Y |
FibreHPL_X | HPL fibre layer, fibres along X |
Absorber | Absorber plate (Lead in ECAL section, Iron in HCAL) |
AirGap | Air gap (no volume placed, just advances Z cursor) |
| Material | Density | Composition | Notes |
|---|---|---|---|
| Air | 1.29 mg/cm³ | already in catalog | container & layer envelopes |
| Lead | 11.34 g/cm³ | Pb | ECAL absorber plates |
| Iron | 7.87 g/cm³ | Fe | HCAL absorber plates |
| PVT | 1.032 g/cm³ | C₉H₁₀, mass-fraction-normalised | bar scintillator |
| Polystyrene | 1.05 g/cm³ | C₈H₈, mass-fraction-normalised | HPL fibre core |
Lead, PVT and Polystyrene are added by this subsystem; Air and Iron were already present in the central SHiPMaterials catalog.
The parameters are validated at compile time by static_asserts in CalorimeterConstants.h:
kModuleNX and kModuleNY must be strictly positive.kGapEcalHcal + the HCAL sequence (kTotalStackZ, 2600 mm) must fit inside the container's full Z extent (2 × kContainerHalfZ, 2900 mm).kContainerHalfX / kContainerHalfY).kFiberCoreDiameter cannot exceed kFiberDiameter.kPlateXY must be a whole number of bars at both bar pitches.A violation fails the build with a descriptive message.
test_calorimeter.cpp exercises:
CalorimeterBuilds — the factory returns a non-null GeoPhysVol of the expected envelope size.CalorimeterHasChildren — the container holds exactly kModuleNX × kModuleNY × kVolsPerModule children (588), so a dropped or duplicated layer placement cannot pass unnoticed.TotalStackZMatchesReference — Calo::kTotalStackZ matches the hand-computed reference, guarding the layer-sequence transcription.CaloBarLayer)CaloFibreHPLayer)