Use this file to discover all available pages before exploring further.
The Straw Tube Spectrometer (SST) is the primary charged-particle tracker in SHiP. It consists of four tracking stations — T1, T2, T3, and T4 — arranged around a dipole spectrometer magnet that sits between T2 and T3. Charged decay products from hidden particles traverse these stations, and the momentum measured from the bending angle in the magnetic field is one of the key quantities used to reconstruct the invariant mass of the decay vertex. Each station contains straw drift tubes arranged in two axial and two stereo views, providing a space-point resolution of ~120 μm per straw. The strawtubes C++ class builds the geometry from a YAML configuration file, and the strawtubesDetector Python class performs the digitisation from Monte Carlo hit points to measured drift distances.
c.z = 89.57 m is the absolute z-position of the spectrometer magnet centre, defined in geometry_config.py. All track-station positions are derived from this single anchor.
python/detectors/strawtubesDetector.py subclasses BaseDetector and implements the digitize() method:
# python/detectors/strawtubesDetector.py (excerpt)from BaseDetector import BaseDetectorclass strawtubesDetector(BaseDetector): def digitize(self) -> None: """Convert strawtubesPoint MC hits to strawtubesHit drift distances. The earliest hit per straw (smallest TDC value) is marked valid; all later hits in the same straw are marked invalid. """ earliest_per_det_id = {} for index, point in enumerate(self.intree.strawtubesPoint): hit = ROOT.strawtubesHit(point, self.intree.t0) self.det.push_back(hit) if hit.isValid(): detector_id = hit.GetDetectorID() if detector_id in earliest_per_det_id: earliest = earliest_per_det_id[detector_id] if self.det[earliest].GetTDC() > hit.GetTDC(): self.det[earliest].setInvalid() earliest_per_det_id[detector_id] = index else: self.det[index].setInvalid() else: earliest_per_det_id[detector_id] = index
The output branch in the ROOT tree is Digi_strawtubesHits.
# Open a simulated ROOT file and iterate over straw MC hitsimport ROOTf = ROOT.TFile.Open("ship.conical.Pythia8-TGeant4_000.root")tree = f.Get("cbmsim")for event in tree: for hit in event.strawtubesPoint: print( hit.GetDetectorID(), # encodes station, view, layer, straw number hit.GetTrackID(), # MC track index hit.GetTime(), # hit time (ns) hit.GetEnergyLoss(), # energy deposit (GeV) )
Track finding and fitting in the spectrometer uses the ACTS framework. The digitisation configuration is stored in python/StrawTracker-digi-config.json:
The standard deviation of 0.0168 cm matches the sigma_spatial = 0.012 cm intrinsic resolution convoluted with the drift distance uncertainty.
Straw hit smearing can be disabled during reconstruction for debugging by passing --noStrawSmearing to macro/ShipReco.py. This sets all drift distances to the wire position and uses a wider smearing window.
The dipole magnet is built by ShipMagnet (passive/ShipMagnet.h). For the 2025 baseline (magnetDesign = 4, MISIS design), aperture and yoke dimensions are:
The field map ROOT file is read by ShipBFieldMap and provides a full 3-D MgB₂ superconducting magnet field in the ECN3 cavern configuration. To override the map at runtime:
After digitisation, the withT0Estimate() method in strawtubesDetector performs a per-event t0 correction. It averages TDC values across all valid straws (corrected for time-of-flight from the first straw plane) to estimate the event t0, then recomputes drift distances:
# Simplified logic from strawtubesDetector.withT0Estimate()v_drift = global_variables.modules["strawtubes"].StrawVdrift()for aDigi in self.det: if not aDigi.isValid(): continue detID = aDigi.GetDetectorID() global_variables.modules["strawtubes"].StrawEndPoints(detID, start, stop) delt1 = (start[2] - z1) / u.speedOfLight t0 += aDigi.GetDigi() - delt1
The corrected drift distance GetDigi() (in cm) is what is passed to track fitting.
Spectrometer track fitting uses the GenFit2 framework with a Runge-Kutta track representation (RKTrackRep) and WireMeasurement objects built from each valid straw hit. The ACTS-based reconstruction path (python/ACTSReco.py) uses the smeared local coordinates from the digi config JSON above.
Detector Overview
Full downstream map of all SHiP sub-detectors with class references.
Muon Shield
The magnetised muon shield upstream of the spectrometer acceptance.