BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnRoot DST Format

Reference guide to the reconstructed data of the BM@N experiment for physics analysis

  • Document: Description of the DST (Data Summary Tape) format, version 1.0
  • Date: 9 October 2026
  • Experiment: BM@N (Baryonic Matter at Nuclotron), NICA facility, JINR
  • Software: BmnRoot, dev branch (commit 027633c4)
  • Applies to: Simulated and experimental DSTs (one common format)

1 Introduction

1.1 Purpose and scope

The DST (Data Summary Tape) is the main output of the BmnRoot reconstruction and the input of physics analyses in the BM@N experiment. This document describes the DST format: the layout of the ROOT file, every branch of the event tree, the stored data classes and their fields, the links between the stored objects, and the differences between DSTs of simulated and experimental events.

The DST format is common for simulated and experimental data: both are produced by the same reconstruction macro, written into the same tree and stored with the same classes. A few branches exist in only one type of DST: Monte Carlo information is stored only for simulated events, and beam tracks only for experimental ones. Some fields are also filled differently. Appendix A gives a short overview of all objects of a DST file with their main methods, Appendix C summarises all differences, and Appendix D lists the fields that are currently not filled or need care.

The description corresponds to the BmnRoot dev branch as of October 2026.

1.2 Two processing chains, one DST format

The DST is the end point of two processing chains that share the reconstruction step:

Stage Simulated data Experimental data
Input Output of an event generator: the particles produced in the collision with their momenta Raw data files written by the BM@N data acquisition system
First step run_sim_bmn.C: macro simulates passing of the generated particles through the BM@N setup with Geant4 transport package, producing Monte Carlo tracks, their points and detector responses (digits) run_raw_bmn.C macro converts the raw data to the ROOT format and decodes to digits
Intermediate file Simulation file: MC tracks, MC points, digits Digit file
Reconstruction run_reco_bmn.C macro reconstructs event data: hits, tracks, vertices, particle identification information, data of the forward detectors, centrality information run_reco_bmn.C – the same macro with the similar output format
Output DST file with the reconstructed data of the simulated events DST file with the reconstructed data of the experimental events

run_reco_bmn.C recognises the type of its input file automatically (BmnFunctionSet::isSimulationFile). For experimental data the geometry is loaded from the Geometry Database, and the magnetic field scale, beam, target and run times are taken from the Condition Database (UniConDa). For simulated data this information comes from the metadata of the input simulation file.

1.3 Reconstruction tasks and their DST output

Every DST branch is produced by a task of run_reco_bmn.C. The table lists the tasks for run periods ≥ 8 in the order in which they are executed in run_reco_bmn.C. Availability: Both – simulated and experimental DSTs, Sim – simulated only, Exp – experimental only.

Task (class) DST branch(es) Content Avail.
BmnFillTrigInfoDst BmnTrigInfo. Trigger and beam counter information Both
BmnSiBTHitMaker BmnSiBTHit Hits in the Silicon Beam Tracker upstream of the target Exp
BmnVSPHitMaker BmnVSPHit, BmnVSPUpper/LowerCluster Vertex Silicon Plane hits and clusters Both
BmnSiliconHitMaker BmnSiliconHit, BmnSiliconUpper/LowerCluster Forward Silicon Detector hits and clusters Both
BmnGemStripHitMaker BmnGemStripHit, BmnGemUpper/LowerCluster GEM hits and clusters Both
BmnCSCHitMaker BmnCSCHit, BmnCSCUpper/LowerCluster Cathode Strip Chamber hits and clusters Both
BmnTof1HitProducer BmnTof400Hit, BmnTof700Hit TOF-400 and TOF-700 hits Both
BmnFHCalReconstructor FHCalEvent Forward Hadron Calorimeter Both
BmnScWallReconstructor ScWallEvent Scintillation Wall Both
BmnHodoReconstructor HodoEvent Forward (fragment) Hodoscope Both
BmnNdetReconstructor NdetEvent; NdetSurfacePoint (Sim) Neutron Detector Both
BmnToCbmHitConverter StsHit VSP, Silicon and GEM hits prepared for tracking Both
BmnStsVectorFinderV9, BmnStsMatchTracks StsVector; StsTrackMatch (Sim) Inner tracks (VSP + Silicon + GEM) and their MC matching Both
BmnBeamTracking BmnBeamTrack Beam ion tracks in the SiBT Exp
CbmFindPrimaryVertex (CbmPVFinderKF) PrimaryVertex. Primary vertex, CBM KF finder Both
BmnKFPrimaryVertexFinder MpdVertex. Primary vertex, default for global tracks Both
BmnCombineVertexFinder CombineVertex Vertices combined with the beam track Exp
BmnGlobalTracking BmnGlobalTrack Global tracks with TOF and Neutron Detector matching Both
BmnMatchRecoToMC BmnGlobalTrackMatch Matching of global tracks to MC tracks Sim
BmnDedx fields of BmnGlobalTrack dE/dx and charge estimate (period 8 only) Both
CentralityClusterizer EventCentrality Centrality class Both
BmnFillDstTask DstEventHeader., DstRunHeader; BmnMCInfo. (Sim) Event and run headers, MC event information and MC tracks Both

Note: If the reconstruction is run with the L1Tracking option instead of the default VectorFinder, the inner tracks are stored in the branch StsTrack instead of StsVector (same class CbmStsTrack). For experimental data of period 8 the pile-up classifier BmnEventSelector also runs and can add the branch BmnBC1hitInfo.. Run periods ≤ 7 use a different chain (MWPC, DCH, ZDC) that is not covered here.

1.4 Conventions

  • Units: coordinates and lengths in cm, momenta in GeV/c, energies in GeV, times in ns, angles in rad, unless stated otherwise.
  • Coordinate system: global BM@N (laboratory) system with the z axis along the beam direction; the nominal target position is near z = 0.
  • Events: one entry of the tree bmndata is one event; all objects of an event are in the same entry.
  • Index links: integer links such as GetTof1HitIndex() are positions (starting from 0) in the TClonesArray of another branch of the same event. The value −1 means “no link”.
  • Branch names: names ending with a dot (for example DstEventHeader.) are single objects; names without a dot are TClonesArray collections, except EventCentrality, FHCalEvent, HodoEvent, NdetEvent and ScWallEvent, which are single objects too.
  • Getters and members: the tables give the getter to be used and, where useful, the data member name (prefix f). The branches are split, so member names can be used directly in TTree::Draw, for example bmndata->Draw("BmnGlobalTrack.fParamFirst.fQp").
  • Availability column: Both, Sim (simulated DST only) or Exp (experimental DST only). Remarks such as “Sim: …; Exp: …” describe fields that exist in both but are filled differently.

2 File structure

2.1 Objects stored in the file

Besides the event tree, a DST file contains run-level objects written once per file:

Key Class Content Avail.
bmndata TTree Event tree: one entry per reconstructed event (Section 2.2) Both
DstRunHeader DstRunHeader Run information: period, run, beam, target, energy, field (Section 3.1) Both
FairGeoParSet FairGeoParSet Full geometry (TGeoManager) used in the reconstruction; the description holds the geometry tag Both
run ID FairRtdbRun Runtime database bookkeeping; the key name is the run ID (period number for MC) Both
FileHeader FairFileHeader FairRoot file header Both
BranchList, TimeBasedBranchList TList FairRoot bookkeeping: names of all branches known during the reconstruction, including input branches that are not stored in the DST Both
bmnroot TFolder FairRoot folder structure: which branch belongs to which detector folder Both
FairBaseParSet FairBaseParSet Simulation run parameters: beam energy, description “beam;target” Sim
BmnFieldPar BmnFieldPar Magnetic field parameters of the simulation Sim
FairGeoPassivePar FairGeoPassivePar Passive geometry parameters of the simulation Sim

Note: A file can contain several cycles of the tree key (for example bmndata;2 and bmndata;3). ROOT automatically uses the latest cycle when the tree is read by name.

2.2 The event tree bmndata

The table lists all branches of bmndata with the class of the object (for TClonesArray branches, the class of the elements), the FairRoot folder and the availability.

Branch Class Folder Content Avail.
DstEventHeader. DstEventHeader EvtHeader Event header Both
BmnTrigInfo. BmnTrigInfoDst TRIGGER Trigger, beam counters, T0 Both
BmnVSPHit BmnVSPHit VSP Vertex Silicon Plane hits Both
BmnVSPUpperCluster, BmnVSPLowerCluster StripCluster VSP VSP strip clusters Both
BmnSiliconHit BmnSiliconHit SILICON Forward Silicon Detector hits Both
BmnSiliconUpperCluster, BmnSiliconLowerCluster StripCluster SILICON Silicon strip clusters Both
BmnGemStripHit BmnGemStripHit GEM GEM hits Both
BmnGemUpperCluster, BmnGemLowerCluster StripCluster GEM GEM strip clusters Both
BmnCSCHit BmnCSCHit CSC Cathode Strip Chamber hits Both
BmnCSCUpperCluster, BmnCSCLowerCluster StripCluster CSC CSC strip clusters Both
BmnTof400Hit BmnTofHit TOF400 TOF-400 hits Both
BmnTof700Hit BmnTofHit TOF700 TOF-700 hits Both
StsHit CbmStsHit STSHIT Tracking hits (VSP + Silicon + GEM) Both
StsVector CbmStsTrack STS Inner tracks Both
PrimaryVertex. CbmVertex Global Primary vertex (CBM KF finder) Both
MpdVertex. CbmVertex Global Primary vertex (default for global tracks) Both
BmnGlobalTrack BmnGlobalTrack GLOBAL Global tracks Both
EventCentrality BmnEventCentrality – Centrality class Both
FHCalEvent BmnFHCalEvent – FHCal modules Both
HodoEvent BmnHodoEvent – Forward Hodoscope: strips Both
NdetEvent BmnNdetEvent – Neutron Detector cells Both
ScWallEvent BmnScWallEvent – ScWall: 174 cells Both
BmnSiBTHit BmnSiBTHit SiBT Silicon Beam Tracker hits Exp
BmnBeamTrack BmnTrack BEAM Beam tracks (SiBT) Exp
CombineVertex CbmVertex VERTEX Vertices combined with the beam track Exp
NdetSurfacePoint BmnNdetSurfacePoint NDET MC points on the Neutron Detector surfaces Sim
StsTrackMatch CbmTrackMatch STS MC matching of inner tracks Sim
BmnGlobalTrackMatch BmnTrackMatch GLOBAL MC matching of global tracks Sim
BmnMCInfo. BmnMCInfoDst MC MC event information and MC tracks Sim

Tip: Hits and clusters make up most of the data volume of a DST (Appendix E). Analyses that need only tracks, vertices and forward detectors read much faster if the hit and cluster branches are not read (Section 9.3).

2.3 Links between objects

The objects of an event are connected through integer indices. The most important links are:

From Accessor To Avail.
BmnGlobalTrack GetGemTrackIndex() StsVector: the inner track of the global track Both
BmnGlobalTrack GetTof1HitIndex(), GetTof2HitIndex(); per particle hypothesis GetTof1HitIndex(type), GetTof2HitIndex(type) BmnTof400Hit, BmnTof700Hit Both
StsVector (CbmStsTrack) GetStsHitIndex(i), i < GetNStsHits() StsHit Both
StsHit (CbmStsHit) fDigiF % 1000000, fDigiB % 1000000 Lower and upper cluster of the hit in Bmn<Det>LowerCluster / Bmn<Det>UpperCluster, detector given by GetSystemId() (Section 6.4) Both
Strip hits (BmnHit) GetUpperClusterIndex(), GetLowerClusterIndex() Bmn<Det>UpperCluster, Bmn<Det>LowerCluster of the same detector Both
MpdVertex. GetTrackInds() (member trkID) StsVector: tracks used in the vertex fit Both
StsHit −GetRefIndex() − 1 Original hit in BmnVSPHit / BmnSiliconHit / BmnGemStripHit (by GetSystemId()) Exp
BmnBeamTrack GetHitIndex(i), i < GetNHits() BmnSiBTHit Exp
BmnGlobalTrackMatch[i] same index i BmnGlobalTrack[i] Sim
StsTrackMatch[i] same index i StsVector[i] Sim
StsVector GetTrkID() BmnMCInfo. MC track array Sim
CbmMCTrack GetMotherId() Mother MC track in the same array (−1 for primary particles) Sim

3 Run-level information

3.1 DstRunHeader

DstRunHeader is written once per file by BmnFillDstTask. For experimental data it is filled from the Condition Database, for simulated data from the metadata of the input simulation file.

Getter (member) Type Description Sim / Exp
GetPeriodId() (fPeriodNumber) UInt_t Run period (session) number, e.g. 9 Both
GetRunId() (fRunNumber) UInt_t Run number Both; Sim: 0
GetBeam() TString Beam particle, e.g. “Xe”; empty string – not defined Both
GetBeamA(), GetBeamZ() Int_t Mass number and charge of the beam ion (−1 – unknown) Both
GetBeamEnergy() Float_t Beam energy per nucleon [GeV], e.g. 3.0 Both; Sim: from the generator file name
GetTarget() TString Target, e.g. “Sn”, “CsI (2%)”, “Empty”; empty string – not defined Both
GetTargetA(), GetTargetZ() Int_t Target A and Z. A = 0 – empty target; Z = 0 – compound target (A is then the sum of the atomic weights, e.g. 260 for CsI) or empty target; −1 – not defined Both
GetFieldType() Int_t Magnetic field type: 0 – constant field, 1 – field map Both
GetFieldScale() Double_t Scale factor of the field map (−1 for a constant field). Exp: magnet voltage from the database divided by the map voltage, with an energy-dependent correction Both
GetFieldName() TString Field map file; for a constant field the string “xmin:xmax:ymin:ymax:zmin:zmax:Bx:By:Bz” Both
GetStartTime(), GetFinishTime() TTimeStamp Start and end of the run from the Condition Database. The database stores local (Moscow) time; the values are put into TTimeStamp as if they were UTC Exp; Sim: time of the DST production, not meaningful

3.2 Geometry and parameter containers

The geometry used in the reconstruction is stored in the container FairGeoParSet. Its description holds the geometry tag of the Geometry Database (e.g. run9_26.09.0). When the DST is processed with FairRunAna (for example, in run_ana_bmn.C), the geometry is loaded automatically as gGeoManager during fRunAna->Init(), so the detector volumes and materials are available in the analysis tasks, e.g. for track extrapolation. Only if FairRunAna is not used, for example when the DST file is read directly, the geometry can be taken from the container itself, which is seldom needed:

TFile* file = TFile::Open("bmndst.root");
FairGeoParSet* geoPar = (FairGeoParSet*)file->Get("FairGeoParSet");
cout << "Geometry tag: " << geoPar->getDescription() << endl;
TGeoManager* geometry = geoPar->GetGeometry(); // the same object as gGeoManager

Simulated DSTs also contain FairBaseParSet, whose beam momentum field holds the beam energy per nucleon and whose description holds “beam;target” (e.g. “Xe;Sn”). This is where DstRunHeader takes the beam and target of simulated data from.

4 Event header, trigger and centrality

4.1 DstEventHeader.

The event header (DstEventHeader, derived from FairEventHeader) is filled by BmnFillDstTask: from the MC event header for simulated data and from the digit event header (BmnEventHeader) for experimental data.

Getter (member) Type Description Sim / Exp
GetRunId() (fRunId) UInt_t Exp: run number. Sim: run ID of the simulation Both
GetEventId() (fEventId) UInt_t Exp: event number from the DAQ; unique within a run, not consecutive in the DST. Sim: MC event number, starting from 1 Both
GetPeriodId() (fPeriodId) UInt_t Run period. Exp: from the digit event header; Sim: from the simulation file Both
GetEventTime() (fEventTime) Double_t Exp: absolute (astronomical) time of the event in UTC as UNIX time: seconds since 1970-01-01, equal to GetEventTimeTS().AsDouble(). At present dates the double value resolves about 0.24 µs. Sim: MC event time of the generator, not an absolute time (0 if the generator does not set it) Both
GetEventTimeTS() (fEventTimeTS) TTimeStamp Exp: the same moment as GetEventTime() as a time stamp in UTC with nanosecond precision: GetSec(), GetNanoSec(). Sim: the MC event time converted to a time stamp (1970-01-01 00:00:00 for time 0) Both
GetTriggerType() (fTriggerType) BmnTriggerType Trigger type: kBMNBEAM = 6, kBMNMINBIAS = 1. Currently not filled: always 1. Use the trigger input signals of BmnTrigInfo. for trigger selection Both (not filled)
GetZ2in(), GetZ2out(), GetADCin(), GetADCout(), GetZin() Double_t, Short_t Beam ion charge squared (Z²) and ADC signals before (BC1, BC2) and after (BC3, BC4) the target. Computed only when the T0 and BC1–BC4 TQDC digit branches exist in the input; otherwise −100 Exp (older runs)
GetADC1() … GetADC4() Double_t Single beam counter amplitudes for 2D charge cuts; same conditions as above, −100 otherwise Exp (older runs)
GetB() (fB) Double_t Impact parameter [fm] from the generator Sim; Exp: 0
GetMCEntryNumber(), GetInputFileId() Int_t FairRoot bookkeeping: entry number of the source event in the simulation file; input file index Sim; Exp: 0
GetZ1() … GetZ4() Double_t Reserved (charge from single counters), not used –

4.2 BmnTrigInfo.

BmnTrigInfoDst collects trigger-related information of the event: trigger input signals, amplitudes of the beam counters and of the fragment detector, the T0 start time, and the corresponding digits. In simulated DSTs only the Barrel Detector digits and the Fragment Detector MC points are available.

Getter (member) Type Description Sim / Exp
GetBDMult(), GetSiMDMult() UInt_t Number of fired channels of the Barrel Detector (BD) and of the Silicon Multiplicity Detector (SiMD); 0 if the corresponding digit branch is absent in the input Both; SiMD: Exp
GetFDDigits() TClonesArray* Exp: BmnTrigWaveDigit of the FD. Sim: BmnFDPoint (MC points in the FD) Both
GetBDDigits() TClonesArray* of BmnTrigDigit Barrel Detector digits Both
GetInputSignalsAR(), IsTriggerBitTrueAR(bit) UInt_t Bit mask of the trigger input signals after reduction (prescaling) Exp; Sim: 0
GetInputSignalsBR(), IsTriggerBitTrueBR(bit) UInt_t Bit mask of the trigger input signals before reduction Exp; Sim: 0
GetInputSignalsVector() vector<uint32_t> Trigger input signal words as delivered by the trigger system Exp; Sim: empty
GetT0_time(), GetT0_amp() Float_t Start time T0 [ns, TDC time scale] and its amplitude, reconstructed from the BC1 top and bottom waveforms with slewing correction; the start time of the TOF measurement. Available since Run 9 Exp (Run 9+); Sim: 0
GetVCAmp() Float_t Peak amplitude of the veto counter (VC) Exp
GetBC0Amp(), GetBC1Amp(), GetBC2Amp(), GetBC1Integral() Float_t Peak amplitudes of the beam counters BC0, BC1, BC2 and the integral of the BC1 signal [ADC counts] Exp
GetFDAmp() Float_t Peak amplitude of the Fragment Detector (FD) Exp
GetBC0Digits(), GetBC1Digits(), GetBC2Digits() TClonesArray* of BmnTrigWaveDigit Waveform digits of the beam counters Exp

Classes of the trigger digits:

Class Fields
BmnTrigWaveDigit fMod channel; fNsmpl number of samples; fValue waveform samples (GetValue()); fTime time; fTdcTimes TDC times (TdcVector()); fTrigTimestamp, fAdcTimestamp time stamps; GetPeak(), GetIntegral()
BmnTrigDigit fMod channel (40 channels for BD); fTime time [ns]; fAmp amplitude; fTimestamp
BmnFDPoint FairMCPoint (track index, position, momentum, time, energy loss) plus exit position and momentum, fCharge, fPdgId, fIsPrimary, fLightYield, fTimeIn, fTimeOut, fLengthtrack

4.3 EventCentrality

BmnEventCentrality holds the centrality classification of the event made by CentralityClusterizer. The event is classified in the plane (FHCal total energy, Forward Hodoscope total signal) using two-dimensional probability density functions of 7 clusters. Every cluster gets a probability, and the class is the most probable cluster. If the event lies outside all distributions, the class is the cluster with the nearest centroid, and the probability is set to 0.

Getter Type Description
GetClass() int Index (0–6) of the most probable cluster, method FHCalHodo
GetProbability() float Probability of that cluster (0 if assigned by the nearest centroid)
GetSoftCentrality() vector<float> Probabilities of all clusters (7 values)
GetClass(method), GetProbability(method), GetSoftCentrality(method) The same for a given method; BmnCentralityClass::Method::FHCalHodo is the only method

Caution: The cluster index is a label of the calibration, not an ordered centrality percentile. The classes are meaningful only if the calibration file set in run_reco_bmn.C was obtained for the analysed collision system and beam energy.

5 Tracks and vertices

5.1 Track parameters (FairTrackParam)

All track classes store the track state as FairTrackParam objects at two points: GetParamFirst() and GetParamLast().

Getter (member) Description
GetX(), GetY(), GetZ() Position of the track state [cm]
GetTx(), GetTy() Slopes tx = dx/dz = px/pz, ty = dy/dz = py/pz
GetQp() (fQp) Charge over momentum q/p [(GeV/c)⁻¹]; the sign is the charge sign
GetCovariance(i, j), CovMatrix(...) (fCovMatrix[15]) 5 × 5 covariance matrix of (x, y, tx, ty, q/p); the 15 elements of the upper triangle are stored row by row: a[0,0..4], a[1,1..4], a[2,2..4], a[3,3..4], a[4,4]

Momentum components follow from the track parameters:

p = 1 / |q/p| charge sign = sign(q/p)
pz = p / sqrt(1 + tx² + ty²)
px = tx · pz, py = ty · pz, pt = pz · sqrt(tx² + ty²)

Note: The track fit assumes unit charge: for a particle with charge |Z| > 1 the value 1/|q/p| is the rigidity p/|Z|, and the momentum is |Z|/|q/p|. The inner track fit uses the pion mass hypothesis for material effects (CbmStsTrack::GetPidHypo() = 211).

5.2 Global tracks: BmnGlobalTrack

Global tracks are the main objects for physics analysis. BmnGlobalTracking creates one global track for every inner track of StsVector with at least 4 hits and then matches the tracks to the TOF-400 and TOF-700 hits and to the cells of the Neutron Detector. Global tracks are created only if the vertex MpdVertex. was reconstructed with at least 2 tracks; otherwise the event has no global tracks.

  • GetParamFirst() is the inner track state propagated to the z of MpdVertex. (the track is not refitted with the vertex constraint).
  • GetParamLast() is the state at the last hit of the inner track.
  • GetLength() is the track length from the target plane to ParamLast. The length from the target to a TOF hit is stored in the hit (BmnTofHit::GetLength()).
  • The TOF matching is done separately for the TOF-400 and the TOF-700. The tracks are extrapolated to the TOF hits, and the track–hit pairs are taken one-to-one in the order of increasing distance. A pair is accepted if the residuals in x and y are within 3σ. The acceptance is checked for the common case (kCommon) and separately for the particle hypotheses kPion, kProton, kDeutron and kTriton (enumeration BmnGlobalTrack::ParticleType); for each accepted hypothesis the hit index, m² and the residuals are stored.
  • For period 8 the extrapolated positions and the widths σ are corrected with momentum-dependent functions fitted to the data (Akima interpolation), with particle-specific corrections for the hypotheses. For other periods no corrections are applied, σ = 1 cm, and all hypotheses give the same result as kCommon.
  • m² = p² (1/β² − 1) with p = GetP() and β = L / (c·t), where L is the track length from the target to the TOF hit and t is the time of flight of the hit (BmnTofHit::GetLength() and GetTimeStamp()). For |Z| > 1 this gives (m/Z)². β is not stored; it is computed from the matched hit as hit->GetLength() / hit->GetTimeStamp() / 29.9792458 (L in cm, t in ns).
Getter (member) Type Description Sim / Exp
GetParamFirst() FairTrackParam* Track parameters at the z of MpdVertex. Both
GetParamLast() FairTrackParam* Track parameters at the last hit of the inner track Both
GetP() Double_t 1 / (q/p) of ParamFirst: signed momentum (rigidity for |Z| > 1) Both
GetPx(), GetPy(), GetPz(), GetPt(), GetTheta(), GetPhi(), GetEta() Float_t Kinematics computed from ParamFirst; θ and φ in rad, η is the pseudorapidity Both
GetNHits() (fNhits) Int_t Number of inner track hits plus one for each TOF detector in which the track was paired with a hit, also if the pair was not accepted (Appendix D) Both
GetChi2(), GetNDF() Float_t, Int_t χ² and NDF of the inner track fit Both
GetLength() (fLength) Float_t Track length from the target plane to ParamLast [cm] Both
GetGemTrackIndex(), GetInnerTrackIndex() (fInnerTrack) Int_t Index of the inner track in StsVector Both
GetTof1HitIndex(), GetTof2HitIndex() Int_t Index of the matched hit in BmnTof400Hit / BmnTof700Hit for kCommon, −1 if none Both
GetTof1HitIndex(type), GetTof2HitIndex(type) (fTof400Hit, fTof700Hit) Int_t The same for the particle hypothesis type: kCommon = 0, kPion = 1, kProton = 2, kDeutron = 3, kTriton = 4 Both
GetMass2(tof), GetMass2(tof, type) (fMass2Tof400, fMass2Tof700) Float_t m² [GeV²/c⁴] from the TOF-400 (tof = 1) or the TOF-700 (tof = 2) for kCommon or the given hypothesis; −1000 if no hit is matched. See the caution in Section 6.5 for experimental data Both
GetResX(tof), GetResY(tof), GetResX(tof, type), GetResY(tof, type) Float_t Residuals track − hit in x and y at the TOF hit, after the corrections of the period [cm]; −1000 if no hit is matched Both
GetParticleName(type) TString Name of the hypothesis: Common, pi, p, d, t Both
GetDCAInVertex() (fDCAInVertex) Float_t Distance in the xy plane between ParamFirst and MpdVertex. at the vertex z [cm] Both
GetChi2InVertex() (fChi2InVertex) Float_t χ² of the track–vertex compatibility (Kalman update of ParamFirst with MpdVertex. as a measurement) Both
GetNdetCellId() (fNDetCellId) Int_t Index of the matched cell in the cell array of NdetEvent (GetCells()). Undefined value if no cell is matched (Appendix D) Both
GetDedx(), GetQ() (fDedx, fQ) Float_t, Short_t dE/dx (truncated mean of calibrated cluster signals in the GEM and Silicon detectors) and charge estimate (1 or 2). Filled only for period 8 (BmnDedx); 0 otherwise Both (period 8)
GetScWallCellId(), GetScWallSignal() Int_t, Float_t Matched ScWall cell and its signal. Not filled: the ScWall matching is switched off (−1 and −1000) –
GetRefIndex() Int_t Always −1, kept for compatibility. The matched MC track is given by the inner track: StsVector[GetGemTrackIndex()]->GetTrkID() (Section 8.2) –
GetFlag(), GetB(), GetHitIndex(i) Not filled for global tracks (−1, 0, empty hit list) –

Tip: Primary track selection: take the inner track StsVector[track->GetGemTrackIndex()] and require FromVertex(), i.e. the track was used in the fit of MpdVertex.. Cuts on GetDCAInVertex(), GetChi2InVertex() and the number of hits can be added.

5.3 Inner tracks: StsVector

StsVector contains the tracks found by the vector finder in the inner tracker: the Vertex Silicon Plane, the Forward Silicon Detector and the GEM stations. The hits of these tracks are in StsHit (Section 6.4).

Getter (member) Type Description Sim / Exp
GetNStsHits(), GetStsHitIndex(i) (fStsHits) Int_t Number of hits and their indices in StsHit, ordered along z Both
GetParamFirst(), GetParamLast() FairTrackParam* Track parameters at the first and the last hit Both
GetChi2(), GetNDF() Double_t, Int_t χ² and NDF of the Kalman filter fit Both
GetFlag(), FromVertex() Int_t Bit 2 (value 2) is set if the track was used in the fit of MpdVertex.; FromVertex() returns GetFlag() & 2 Both
GetPidHypo() Int_t Mass hypothesis of the fit (211, pion) Both
GetB() (fB) Double_t Response of the BDT (TMVA) classifier used by the track finder to reject fake tracks (set to 1 when the classifier is not applied). The header comment “impact parameter” is outdated Both
GetPt(), GetEta() Double_t Transverse momentum and pseudorapidity from ParamFirst Both
GetTrkID() (ststrk) int Sim: index of the matched MC track (−1 if not matched). Exp: undefined value Sim
fMvdHits, fnEv, fHitsArr Not used (empty) –

5.4 Primary vertices

The DST contains several estimates of the primary vertex, all stored as CbmVertex objects:

Branch Algorithm Remarks Avail.
MpdVertex. BmnKFPrimaryVertexFinder: pre-estimate from histograms of extrapolated tracks, then an iterative Kalman fit with a χ² cut; StsVector tracks with ≥ 4 hits and χ² < 12.25·NDF Default vertex of the global tracks. The indices of the used tracks are in GetTrackInds(), and these tracks are flagged in StsVector. GetUniqueID() holds the number of peaks found in the z distribution of the extrapolated tracks: 0 – no clear peak, 1 – single peak, 2 – an additional peak (possible second interaction or interaction outside the target) Both
PrimaryVertex. CbmFindPrimaryVertex with CbmPVFinderKF (CBM KF vertex fit); same track selection GetTrackInds() is empty. If no track is accepted, the vertex has GetNTracks() = 0 and a covariance of 100 cm² Both
CombineVertex BmnCombineVertexFinder: array of 2 vertices, [0] from PrimaryVertex., [1] from MpdVertex., combined with the first beam track of BmnBeamTrack x and y are the weighted mean of the vertex and the beam track extrapolated to the vertex z (weights from the variances). z, χ² and the covariance are copied from the input vertex; NTracks = input + 1, NDF = 2·NTracks. Without a beam track the entries are copies of the input vertices Exp

Fields of CbmVertex:

Getter (member) Type Description
GetX(), GetY(), GetZ(), Position(TVector3&) Double_t Vertex position [cm]
GetChi2(), GetNDF() Double_t, Int_t χ² and number of degrees of freedom of the vertex fit (NDF = 2·NTracks)
GetNTracks() Int_t Number of tracks used in the fit. Check it: 0 means that the fit failed
GetCovariance(i, j), CovMatrix(TMatrixFSym&) (fCovMatrix[6]) Double_t 3 × 3 covariance matrix of (x, y, z); stored as a[0,0], a[0,1], a[0,2], a[1,1], a[1,2], a[2,2]
GetTrackInds() (trkID) vector<Int_t> Indices of the used tracks in StsVector (MpdVertex. only)

5.5 Beam tracks: BmnBeamTrack

In experimental DSTs BmnBeamTracking reconstructs the beam ions in the three stations of the Silicon Beam Tracker upstream of the target. Track candidates are combinations of one hit per station with signals above 200 in both strip layers; up to 10 candidates are fitted with a Kalman filter (forward and backward pass). The beam momentum is not measured: q/p is fixed.

Getter (member) Description
GetNHits(), GetHitIndex(i) 3 hits, indices in BmnSiBTHit
GetParamFirst() Track parameters at the first SiBT station
GetParamLast() Track parameters propagated to z = 0 (target)
GetB() Distance of the track from the beam axis (x = y = 0) at z = 0 [cm]
GetChi2() Sum of the χ² of the forward and backward Kalman filter passes
GetQp() of the parameters Fixed value, not a measurement
GetFlag(), GetNDF(), GetLength() Not filled

6 Hits and clusters

The DST keeps the hits of all tracking detectors and the strip clusters, so that detector studies, calibrations and track refits can be done on the DST level. The strip detectors (SiBT, VSP, Silicon, GEM, CSC) have two strip layers (“lower” and “upper”); a hit is the crossing of a lower-layer and an upper-layer cluster.

6.1 Common hit fields (FairHit, BmnHit)

All hit classes of the tracking detectors derive from BmnHit (itself derived from FairHit).

Getter (member) Description Sim / Exp
GetX(), GetY(), GetZ() Hit position in the global coordinate system [cm] Both
GetDx(), GetDy(), GetDz() Position errors [cm] Both
GetCovXY() Covariance of x and y [cm²] Both
GetStation(), GetModule() Station and module of the hit within the detector, starting from 0 Both
GetUpperClusterIndex(), GetLowerClusterIndex() Strip detectors: indices of the upper and lower clusters in Bmn<Det>UpperCluster / Bmn<Det>LowerCluster. TOF: see Section 6.5 Both
GetRefIndex() Sim: index of the MC point that produced the hit (the MC points are not stored in the DST), −1 if there is none. Exp: −1 (TOF: see Section 6.5) Both
GetDigitNumberMatch() BmnMatch with two links to the central strips of the lower and upper clusters Both
IsPseudo() Pseudo hit reconstructed from a cluster in one layer only Both
IsUsed(), GetLength(), GetResX(), GetResY() TOF hits: paired with a global track in the TOF matching and the track length from the target to the hit [cm]; the residuals are not filled (Section 6.5). SiBT hits: residuals to the beam track. Otherwise: false, −1, −1000 Both
GetTimeStamp() TOF hits: time of flight [ns] (Section 6.5). Strip hits: −1 (not used) Both
GetDetectorID(), GetDetId() TOF hits: volume UID and DetectorId (Section 6.5). Strip hits: not filled (0) Both
GetType() (fType) Strip hits. Sim: 1 – hit matched to an MC point, 0 – fake (combinatorial) hit. Exp: −1 (undefined) Sim
GetNLinks(), GetLink(i) FairLinks to MC truth. Strip hits: links to the contributing MC points (index = MC point index, weight = contribution). TOF hits: type 1 – MC point, type 2 – MC track index, type 4 – detector UID. Exp: no links Sim
GetFlag() Not used (true for all hits) –

6.2 Hits of the strip detectors

Branch Class Detector Avail.
BmnVSPHit BmnVSPHit Vertex Silicon Plane Both
BmnSiliconHit BmnSiliconHit Forward Silicon Detector (FSD) Both
BmnGemStripHit BmnGemStripHit GEM tracker Both
BmnCSCHit BmnCSCHit Cathode Strip Chambers Both
BmnSiBTHit BmnSiBTHit Silicon Beam Tracker, upstream of the target Exp

Station and module numbers start from 0. The number of stations and modules is defined by the detector configuration of the run period.

The strip hit classes provide getters for the characteristics of the lower and upper strip layers:

Getter (member) Description Source
GetStripPositionInLowerLayer(), GetStripPositionInUpperLayer() Cluster positions in the two layers [strip units] SiBT: stored in the hit; VSP, Silicon, GEM, CSC: clusters
GetStripTotalSignalInLowerLayer(), GetStripTotalSignalInUpperLayer() Total cluster signals in the two layers SiBT: stored in the hit; VSP, Silicon, GEM, CSC: clusters
GetClusterSizeInLowerLayer(), GetClusterSizeInUpperLayer() Number of strips in the clusters SiBT: stored in the hit; VSP, Silicon, GEM, CSC: clusters
GetSignalDiff() (fNormSignalDiff) Normalised signal difference of the two layers (GEM, CSC, SiBT) Not filled
GetEnergyLoss() (fELoss), GetPdg() Energy loss; PDG code (VSP, Silicon) Not filled

Note: VSP, Silicon, GEM and CSC hits do not store the layer characteristics: the getters take them from the clusters of the hit (GetLowerClusterIndex(), GetUpperClusterIndex()) in the branches Bmn<Det>LowerCluster and Bmn<Det>UpperCluster of the current event (Section 6.3); the strip position is the mean position of the cluster. The clusters are obtained via FairRootManager, so these getters work in FairRoot tasks, e.g. in run_ana_bmn.C (Section 9.2). When the DST tree is read directly (Section 9.3), they return the default values 0, 0 and −1: read the cluster branches in this case. For a pseudo hit (one-layer hit) the upper-layer getters return the default values.

6.3 Strip clusters (StripCluster)

The branches Bmn<Det>UpperCluster and Bmn<Det>LowerCluster (for VSP, Silicon, GEM and CSC) contain all reconstructed strip clusters, including clusters that are not part of any hit. Upper clusters have type 1, lower clusters type 0. The fields of StripCluster are public members:

Member (getter) Description
Station (GetStation()), Module (GetModule()) Station and module of the cluster, starting from 0
fType (GetType()) 0 – lower layer, 1 – upper layer
MeanPosition Cluster position after fitting [strip units]
OriginPosition, PositionResidual Position of the central strip and residual from it
TotalSignal Sum of the strip signals [ADC counts]; the basis of the dE/dx measurement
Width (GetWidth()) Number of strips in the cluster
Strips, Signals vector<Int_t> strip numbers and vector<Double_t> strip signals
Error (GetError()) Position error
IsCorrect Not used (false)

6.4 Tracking hits: StsHit

Before the track finding, BmnToCbmHitConverter converts the VSP, Silicon and GEM hits into CbmStsHit objects with a common station numbering (pseudo hits are excluded). The hit coordinates are modified during the conversion:

  • Exp: alignment corrections and, for the GEM in the magnetic field, a correction of the Lorentz shift are applied.
  • Sim: MC corrections are applied (y shifted by +0.30 cm, smearing).
  • In both cases the position errors are set to fixed values: GEM σx = 0.028 cm; Silicon and VSP σx = 0.0029 cm (VSP in experimental data: 0.0058 cm); σy = 0.123 cm for all.

Therefore the StsHit coordinates differ from those of the original BmnVSPHit, BmnSiliconHit and BmnGemStripHit. The StsHit coordinates are the ones used in the track fit.

Getter (member) Description Sim / Exp
GetX(), GetY(), GetZ(), GetDx(), GetDy() Corrected position and fixed errors [cm] Both
GetSystemId() Detector: kVSP = 8, kGEM = 2, kSILICON = 12 (bits 24–27 of fDetectorID) Both
GetStationNr() Tracking station, starting from 1 (bits 16–23): Run 9 – VSP 1, Silicon 2–5, GEM 6–13; without VSP (Run 8) – Silicon 1–4, GEM 5–11 Both
GetSectorNr() GEM: 2·module + 1 + layer/2; Silicon and VSP: module + 1 (bits 4–15). GetSensorNr() is always 1 Both
fDigiF, fDigiB (public) Index of the lower (F) and upper (B) cluster plus a detector offset: GEM 0 / 1 000 000, Silicon 2 000 000 / 3 000 000, VSP 4 000 000 / 5 000 000. Cluster index = value % 1 000 000 Both
GetSignalDiv() Cluster signal asymmetry (Q_upper − Q_lower) / (Q_upper + Q_lower) Both
GetTimeStamp() Not a time: cluster width asymmetry (N_upper − N_lower) / (N_upper + N_lower) Both
GetStrip(0), GetStrip(1) Mean positions of the lower and upper clusters [strip units] Both
GetRefIndex() Sim: MC point index. Exp: −(index of the original hit) − 1, i.e. original index = −GetRefIndex() − 1 in the hit branch given by GetSystemId() Both
GetNLinks(), GetLink(i) MC links copied from the original hit Sim
GetStatLayer(), GetPosSensorX/Y(), GetCovXY() Not used (0) –

6.5 TOF-400 and TOF-700 hits

BmnTof400Hit and BmnTof700Hit contain BmnTofHit objects (derived from BmnHit without additional members). A hit is reconstructed in a strip of a multigap resistive plate chamber from the signals at both strip ends; the position is the crossing point along the strip.

Getter (member) Description Sim / Exp
GetX(), GetY(), GetZ() Hit position [cm]; Exp: errors σx = 0.5 cm, σy = 0.36 cm Both
GetTimeStamp() Time of flight [ns]. Exp: hit time minus the T0 time (Run 9: BmnTrigInfo. T0) with calibration and slewing corrections. Sim: MC time since the event start, smeared Both
GetModule(), GetStation() Chamber (plane) number and strip number, both starting from 0 Both
GetDetectorID() Volume UID: (plane + 1) << 8 | (strip + 1); decode with BmnTOF1Point::GetModule(uid) and BmnTOF1Point::GetStrip(uid) Both
GetDetId() kTOF1 (3) for TOF-400, kTOF701 (6) for TOF-700 Both
IsUsed(), GetLength() Paired with a global track in the TOF matching, also if the pair was not accepted (Section 5.2); track length from the target to the hit [cm], −1 if the hit was not paired Both
GetRefIndex() Sim: MC point index. Exp: packed indices of the digits at the two strip ends Both
GetUpperClusterIndex(), GetLowerClusterIndex() Exp: indices of the left-end and right-end digits (the digits are not stored). Sim: undefined Exp
GetLink(i) Type 1 – MC point, type 2 – MC track index, type 4 – volume UID Sim
GetResX(), GetResY() Not filled (−1000): the residuals of the matching are stored in the global track (BmnGlobalTrack::GetResX(tof), GetResY(tof)) –

Caution: In experimental DSTs the time of flight, and therefore β and m² of the global tracks, depend on the TOF time calibration (T0, slewing and strip corrections) applied in the reconstruction. A part of the hits can have times outside the physical range, e.g. negative ones. Check the time of flight distribution of the production before using β or m².

7 Forward detectors

The forward detectors are stored as single event objects: one object per event with all modules, cells or strips of the detector.

7.1 FHCal: FHCalEvent

Getter Description
BmnFHCalEvent::GetTotalEnergy() Total energy deposited in the Forward Hadron Calorimeter [MIP]
BmnFHCalEvent::GetTotalModules() Number of modules
BmnFHCalEvent::GetModule(id) Module BmnFHCalModule with id = 1 … GetTotalModules()
BmnFHCalModule::GetModuleId(), GetEnergy() Module number and module energy [MIP]
BmnFHCalModule::GetNsections(), GetSectionEnergy(sec) Number of longitudinal sections and section energy, sec = 1 … N
BmnFHCalModule::GetX(), GetY(), GetZ() Module centre in the global coordinate system [cm]

7.2 Scintillation Wall: ScWallEvent

Getter Description
BmnScWallEvent::GetCell(id) Cell BmnScWallCell with id = 1 … 174; all 174 cells are always stored
BmnScWallCell::GetCellId() Cell number
BmnScWallCell::GetSignal() Signal in the cell, calibrated in units of Z² of the crossing particle; 0 – no signal
BmnScWallCell::GetX(), GetY(), GetZ() Cell centre [cm]

7.3 Forward Hodoscope: HodoEvent

Getter Description
BmnHodoEvent::GetTotalSignal() Sum of the strip signals in units of Z² (the Xe beam peak corresponds to 54² ≈ 2916); input of the centrality classification
BmnHodoEvent::GetTotalSignalIntegral() Sum of the strip signal integrals
BmnHodoEvent::GetPileUpStatus() BmnHodoStrip::PileUp: No (0), Resolved (1), Unresolved (2); the maximum over the strips
BmnHodoEvent::GetStrips(), GetStrip(id) TClonesArray of BmnHodoStrip, one entry per strip; in experimental data additional read-out channels can appear as entries with other identifiers
BmnHodoStrip::GetStripId(), GetSignal(), GetIntegral(), GetPileUpStatus() Strip number, signal, integral, pile-up status
BmnHodoStrip::GetX(), GetY(), GetZ() Strip position [cm]
BmnHodoStrip::GetDigits() Not stored in the DST (empty)

7.4 Neutron Detector: NdetEvent

Getter Description
BmnNdetEvent::GetCells(), GetTotalCells() TClonesArray of fired cells BmnNdetCell and their number
BmnNdetEvent::GetCell(address), GetCell(arm, row, column, layer) Cell by address or by indices
BmnNdetCell::GetAddress() Packed cell address; decode with GetArmId(), GetRowId(), GetColumnId(), GetLayerId()
BmnNdetCell::GetSignal(), GetTime() Cell signal and time [ns]
BmnNdetCell::GetX(), GetY(), GetZ() Cell position [cm]

8 Monte Carlo information (simulated DSTs)

8.1 BmnMCInfo. and MC tracks

BmnMCInfoDst keeps the generator-level information of the event and all MC tracks of the simulation stack. The MC points of the detectors are not stored in the DST.

Getter (member) Description
GetB() Impact parameter [fm]
GetX(), GetY(), GetZ() Generated primary vertex [cm]
GetRotX(), GetRotY() Rotation around the x and y axes (beam tilt) [rad]
GetRotZ() Rotation around the z axis (reaction plane angle) [rad]
GetMCTracks() TClonesArray of CbmMCTrack: primary particles and secondaries stored by the simulation. The order is the same as in the simulation file, so MC track indices of the matching objects point into this array

Fields of CbmMCTrack:

Getter (member) Description
GetPdgCode() PDG code; nuclei have codes 100ZZZAAAI (e.g. 1000010020 for the deuteron)
GetMotherId() Index of the mother track in the same array; −1 for primary particles
GetPx(), GetPy(), GetPz(), GetMomentum(TVector3&) Momentum at the start vertex [GeV/c]
GetStartX(), GetStartY(), GetStartZ(), GetStartT() Start vertex [cm] and time [ns]
GetP(), GetPt(), GetRapidity(), GetEnergy(), GetMass() Derived kinematics; the mass is taken from TDatabasePDG
Get4Momentum(TLorentzVector&) Four-momentum
GetNPoints(DetectorId) Number of MC points of the track in a detector (bit-packed member fNPoints)
GetPolar(i) Polarisation components, i = 0, 1, 2

8.2 Matching of reconstructed tracks to MC tracks

BmnMatchRecoToMC links every global track to the MC track that produced most of its hits:

Object Getter Description
BmnGlobalTrackMatch[i] (BmnTrackMatch) GetNofLinks(), GetLink(j) All MC tracks contributing to the hits of global track i: BmnLink with GetIndex() = MC track index and GetWeight() = number of hits
GetMatchedLink() Link with the largest weight
GetNofTrueHits(), GetNofWrongHits(), GetTrueOverAllHitsRatio() Number of hits from the matched MC track, other hits, and their ratio
CbmStsTrack GetTrkID() Inner track StsVector[track->GetGemTrackIndex()] of a global track: index of the matched MC track if the true-hit ratio of the global track is ≥ 0.6, otherwise −1
BmnGlobalTrack GetRefIndex() Always −1, kept for compatibility: use GetTrkID() of the inner track
StsTrackMatch[i] (CbmTrackMatch) GetMCTrackId(), GetNofTrueHits(), GetNofWrongHits(), GetNofFakeHits(), GetNofMCTracks() Matching of inner track i of StsVector done by BmnStsMatchTracks

On the hit level, GetRefIndex() gives the MC point index, and the FairLinks point to the contributing MC points. For TOF hits the link of type 2 gives the MC track index directly (Section 6.1).

8.3 NdetSurfacePoint

NdetSurfacePoint contains BmnNdetSurfacePoint objects: MC points of particles crossing the surfaces of the Neutron Detector, for efficiency studies. The class extends FairMCPoint (track index, position, momentum, time, track length, energy loss) with fPdg, fArmID, fPlaneID and fDirectionID.

9 Physics analysis of reconstructed data

There are two ways to analyse DST files. The recommended way is to implement every analysis as a FairRoot task and to run it with the analysis macro macro/run/run_ana_bmn.C (Section 9.2). Reading the DST tree directly in a ROOT macro (Section 9.3) is an alternative for quick checks and simple studies.

9.1 Environment

The DST classes are BmnRoot and FairRoot classes, so the BmnRoot environment must be loaded before CERN ROOT is started; the class dictionaries are then found automatically:

source <bmnroot build directory>/config.sh

9.2 Recommended: analysis tasks in run_ana_bmn.C

run_ana_bmn.C is the main macro for the physics analysis of simulated and experimental DSTs. It sets up FairRunAna with the DST as input and executes a list of analysis tasks for every event. The macro takes care of the common steps, so that a task contains only the analysis itself:

  • the input can be one DST file, a text file with a list of DST files, or a ROOT file with a TChain of DST files; all files are processed as one data set;
  • the magnetic field and the run information (period, run, beam, target, energy) are taken from the first DST file, and the geometry is restored from its FairGeoParSet container;
  • the Kalman filter (CbmKF) is initialised, so that the tasks can extrapolate tracks through the detector material and the magnetic field;
  • the results of the tasks (histograms, trees, new branches) are written to the output file.

Arguments of the macro:

Argument Description
dstFileName Input: DST file, text file with a list of DST files, or ROOT file with a TChain of DST files
anaFileName Output file with the analysis results
nStartEvent First event to process, starting from 0
nEvents Number of events to process; 0 – all events of the input after nStartEvent
root -b -q '$VMCWORKDIR/macro/run/run_ana_bmn.C("bmndst.root", "bmnana.root", 0, 0)'

Each analysis is a class derived from FairTask with three main methods:

  • Init() – called once before the event loop: get the DST branches with FairRootManager::GetObject() (branch names as in Section 2.2), book histograms, read parameters;
  • Exec() – called for every event: the objects obtained in Init() contain the data of the current event;
  • Finish() – called once after the event loop: write the results to the output file.

The analysis tasks are kept in the physics library of BmnRoot. The class BmnAnalysisTask (physics/BmnAnalysisTask.h and .cxx) is a template to start from, and BmnTwoParticleDecay (physics/decay) is an example of a complete analysis task. A new task is added to physics/CMakeLists.txt and physics/PhysicsLinkDef.h. The example below fills the transverse momentum spectrum of the primary global tracks (for brevity the methods are defined in the class body):

// BmnPtAnalysis: example analysis task - transverse momentum spectrum of primary global tracks
class BmnPtAnalysis : public FairTask
{
public:
BmnPtAnalysis()
: FairTask("BmnPtAnalysis")
{}
InitStatus Init() override
{
// get the DST branches from the input of FairRunAna
FairRootManager* ioman = FairRootManager::Instance();
fGlobalTracks = (TClonesArray*)ioman->GetObject("BmnGlobalTrack");
fInnerTracks = (TClonesArray*)ioman->GetObject("StsVector");
fVertex = (CbmVertex*)ioman->GetObject("MpdVertex.");
if (!fGlobalTracks || !fInnerTracks || !fVertex) {
LOG(error) << "BmnPtAnalysis::Init(): DST branches not found, the task is deactivated";
return kERROR;
}
fHistPt = new TH1D("hPt", "p_{T} of primary tracks;p_{T}, GeV/c;tracks", 100, 0., 3.);
return kSUCCESS;
}
void Exec(Option_t* /*option*/) override
{
if (fVertex->GetNTracks() < 2)
return;
for (Int_t i = 0; i < fGlobalTracks->GetEntriesFast(); i++) {
BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobalTracks->UncheckedAt(i);
CbmStsTrack* inner = (CbmStsTrack*)fInnerTracks->UncheckedAt(track->GetGemTrackIndex());
if (!inner->FromVertex()) // keep the tracks used in the primary vertex fit
continue;
fHistPt->Fill(track->GetPt());
}
}
void Finish() override
{
// write the results to the output file of run_ana_bmn.C
FairRootManager::Instance()->GetSink()->WriteObject(fHistPt, "hPt");
}
private:
TClonesArray* fGlobalTracks = nullptr;
TClonesArray* fInnerTracks = nullptr;
CbmVertex* fVertex = nullptr;
TH1D* fHistPt = nullptr;
ClassDefOverride(BmnPtAnalysis, 1);
};

The task is created in the “Analysis Tasks” block of run_ana_bmn.C:

// ====================================================================== //
// === Analysis Tasks === //
// ====================================================================== //
CbmKF* kalman_filter = new CbmKF();
fRunAna->AddTask(kalman_filter);
BmnPtAnalysis* pt_analysis = new BmnPtAnalysis();
fRunAna->AddTask(pt_analysis);

Tip: Several analyses can run in one pass over the data: add one task for each of them. The tasks are executed in the order in which they are added, so a task can use objects that a previous task registered with FairRootManager::Register().

9.3 Alternative: reading a DST file directly

For quick checks the DST tree can also be read directly in a ROOT macro. In this case the macro itself has to handle the input files and, if needed, the magnetic field and the geometry. The macro below works with simulated and experimental DSTs. It prints the run information and the vertex, and for the first tracks the charge, momentum, vertex association, TOF-400 information and, if available, the matched MC track.

// read_dst_example.C: loop over DST events and print basic information on vertices and global tracks
// works with simulated and experimental DSTs; MC information is read only if it is present in the file
void read_dst_example(TString dstFileName = "bmndst.root", Int_t nPrint = 3)
{
// run-level information is stored once per file
TFile* file = TFile::Open(dstFileName);
DstRunHeader* runHeader = (DstRunHeader*)file->Get("DstRunHeader");
cout << "Period " << runHeader->GetPeriodId() << ", run " << runHeader->GetRunId() << ": " << runHeader->GetBeam()
<< " + " << runHeader->GetTarget() << " at " << runHeader->GetBeamEnergy() << " AGeV, field scale "
<< runHeader->GetFieldScale() << endl;
TTree* tree = (TTree*)file->Get("bmndata");
tree->SetBranchStatus("*Cluster*", 0); // skip the heavy cluster branches, they are not used here
DstEventHeader* eventHeader = nullptr;
CbmVertex* vertex = nullptr;
TClonesArray *globalTracks = nullptr, *innerTracks = nullptr, *tof400Hits = nullptr;
tree->SetBranchAddress("DstEventHeader.", &eventHeader);
tree->SetBranchAddress("MpdVertex.", &vertex);
tree->SetBranchAddress("BmnGlobalTrack", &globalTracks);
tree->SetBranchAddress("StsVector", &innerTracks);
tree->SetBranchAddress("BmnTof400Hit", &tof400Hits);
// MC information exists only in simulated DSTs
BmnMCInfoDst* mcInfo = nullptr;
Bool_t isSimulation = (tree->GetBranch("BmnMCInfo.") != nullptr);
if (isSimulation)
tree->SetBranchAddress("BmnMCInfo.", &mcInfo);
for (Long64_t iEvent = 0; iEvent < TMath::Min(tree->GetEntries(), (Long64_t)nPrint); iEvent++) {
tree->GetEntry(iEvent);
printf("Event %u: vertex (%.2f, %.2f, %.2f) cm from %d tracks, %d global tracks\n", eventHeader->GetEventId(),
vertex->GetX(), vertex->GetY(), vertex->GetZ(), vertex->GetNTracks(), globalTracks->GetEntriesFast());
if (vertex->GetNTracks() < 2)
continue;
for (Int_t iTrack = 0; iTrack < TMath::Min(globalTracks->GetEntriesFast(), 3); iTrack++) {
BmnGlobalTrack* track = (BmnGlobalTrack*)globalTracks->UncheckedAt(iTrack);
CbmStsTrack* inner = (CbmStsTrack*)innerTracks->UncheckedAt(track->GetGemTrackIndex());
FairTrackParam* par = track->GetParamFirst(); // at the z of MpdVertex
Double_t p = 1. / TMath::Abs(par->GetQp()); // momentum for |Z| = 1, rigidity p/|Z| otherwise
Int_t charge = (par->GetQp() > 0) ? +1 : -1;
Double_t pz = p / TMath::Sqrt(1. + par->GetTx() * par->GetTx() + par->GetTy() * par->GetTy());
Double_t pt = pz * TMath::Sqrt(par->GetTx() * par->GetTx() + par->GetTy() * par->GetTy());
printf(" track %d: q = %+d, p = %.3f, pt = %.3f GeV/c, hits = %d, in vertex = %d, DCA = %.2f cm", iTrack,
charge, p, pt, inner->GetNStsHits(), inner->FromVertex() ? 1 : 0, track->GetDCAInVertex());
if (track->GetTof1HitIndex() >= 0) {
BmnTofHit* hit = (BmnTofHit*)tof400Hits->UncheckedAt(track->GetTof1HitIndex());
Double_t beta = hit->GetLength() / hit->GetTimeStamp() / 29.9792458; // length in cm, time in ns
printf(", TOF400: t = %.2f ns, beta = %.3f, m2 = %.3f", hit->GetTimeStamp(), beta, track->GetMass2(1));
}
// the matched MC track is stored in the inner track
if (isSimulation && inner->GetTrkID() >= 0) {
CbmMCTrack* mcTrack = (CbmMCTrack*)mcInfo->GetMCTracks()->UncheckedAt(inner->GetTrkID());
printf(", MC: pdg = %d, p = %.3f", mcTrack->GetPdgCode(), mcTrack->GetP());
}
printf("\n");
}
}
}
root -l 'read_dst_example.C("bmndst.root")'

As in the macro above, switch off the branches that are not needed before the event loop: the events are then read much faster. Most of the data volume is in the hit and cluster branches (Appendix E):

tree->SetBranchStatus("*Cluster*", 0); // all strip cluster branches
tree->SetBranchStatus("StsHit*", 0); // tracking hits
tree->SetBranchStatus("Bmn*Hit*", 0); // detector hits (switch on the TOF hits again if needed)
tree->SetBranchStatus("BmnTof*", 1);

9.4 Quick look with TTree::Draw

Member names can be used directly in TTree::Draw expressions:

TFile* f = TFile::Open("bmndst.root");
TTree* t = (TTree*)f->Get("bmndata");
t->Draw("MpdVertex.fZ", "MpdVertex.fNTracks > 1"); // vertex z
t->Draw("1./BmnGlobalTrack.fParamFirst.fQp"); // signed momentum
t->Draw("BmnGlobalTrack.fMass2Tof400[][0]", "BmnGlobalTrack.fTof400Hit[][0] >= 0"); // m2 from TOF-400
t->Draw("HodoEvent.fTotalSignal:FHCalEvent.fTotalEnergy", "", "colz"); // centrality plane

9.5 Further examples

  • macro/howTo/readDst.C – a basic example of reading a DST directly; it also shows how to obtain the magnetic field of the run with BmnFunctionAna::GetDSTField().

Appendix A. Summary of the DST content

The table lists all objects of a DST file with a short description and the main methods of their classes. The objects stored once per file come first, followed by the branches of the event tree bmndata, written as bmndata.<branch>. For TClonesArray branches the methods are those of the array elements, which are accessed with GetEntriesFast() and UncheckedAt(i). The notation GetX/Y/Z() stands for GetX(), GetY() and GetZ(). Objects marked Sim only or Exp only exist in one type of DST only; the details are given in Sections 2–8.

Object in the DST file Content Main methods
File objects: FairRoot bookkeeping
bmnroot FairRoot folder structure: which branch belongs to which detector folder (TFolder) FindObjectAny(name), GetListOfFolders()
BranchList Names of all branches known during the reconstruction, including input branches that are not stored in the DST (TList of TObjString) GetEntries(), At(i)->GetName()
TimeBasedBranchList FairRoot list of the time-based branches (TList), not used in BmnRoot GetEntries()
File objects: parameter containers
BmnFieldPar Sim only: magnetic field parameters of the simulation GetType(), GetScale(), MapName(name), GetPositionX/Y/Z(), IsFieldOff()
FairBaseParSet Sim only: simulation run parameters; the beam momentum field holds the beam energy per nucleon, the description holds “beam;target” GetBeamMom(), getDescription(), GetRndSeed()
FairGeoParSet Geometry of the reconstruction (TGeoManager); the description holds the geometry tag GetGeometry(), getDescription(), GetGeoNodes()
FairGeoPassivePar Sim only: passive geometry parameters of the simulation GetGeoPassiveNodes(), GetGeoSensitiveNodes()
<run ID> Runtime database bookkeeping (FairRtdbRun); the key name is the run ID (the period number for MC) getRunId(), getParVersions()
File objects: headers
DstRunHeader Run information: period, run, start and finish times, beam, target, beam energy, magnetic field (DstRunHeader) GetPeriodId(), GetRunId(), GetStartTime(), GetFinishTime(), GetBeam(), GetBeamA(), GetBeamZ(), GetBeamEnergy(), GetTarget(), GetTargetA(), GetTargetZ(), GetFieldType(), GetFieldScale(), GetFieldName()
FileHeader FairRoot file header (FairFileHeader) GetRunId(), GetListOfTasks()
Event tree bmndata: event information
bmndata.BmnTrigInfo. Trigger input signals, amplitudes of the beam counters and of the fragment detector, T0 start time, trigger digits (BmnTrigInfoDst) GetInputSignalsAR(), GetInputSignalsBR(), IsTriggerBitTrueAR(bit), IsTriggerBitTrueBR(bit), GetInputSignalsVector(), GetT0_time(), GetT0_amp(), GetVCAmp(), GetBC0Amp(), GetBC1Amp(), GetBC1Integral(), GetBC2Amp(), GetFDAmp(), GetBDMult(), GetSiMDMult(), GetBC0Digits(), GetBC1Digits(), GetBC2Digits(), GetBDDigits(), GetFDDigits()
bmndata.DstEventHeader. Event header: run and event numbers, period, event time, impact parameter (DstEventHeader) GetRunId(), GetEventId(), GetPeriodId(), GetEventTime(), GetEventTimeTS(), GetB(), GetTriggerType(), GetZ2in(), GetZ2out(), GetADCin(), GetADCout()
bmndata.EventCentrality Centrality class of the event from the FHCal energy and the Forward Hodoscope signal (BmnEventCentrality) GetClass(), GetProbability(), GetSoftCentrality()
Event tree bmndata: strip clusters
bmndata.BmnCSCLowerCluster Lower layer (|||) strip clusters of the CSC (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnCSCUpperCluster Upper layer (\\\ or ///) strip clusters of the CSC (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnGemLowerCluster Lower layer (|||) strip clusters of the GEM (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnGemUpperCluster Upper layer (\\\ or ///) strip clusters of the GEM (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnSiliconLowerCluster Lower layer (|||) strip clusters of the Silicon detector (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnSiliconUpperCluster Upper layer (\\\ or ///) strip clusters of the Silicon detector (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnVSPLowerCluster Lower layer (|||) strip clusters of the VSP (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
bmndata.BmnVSPUpperCluster Upper layer (\\\ or ///) strip clusters of the VSP (TClonesArray of StripCluster) GetStation(), GetModule(), GetType(), GetWidth(), GetError(); members MeanPosition, TotalSignal, Strips, Signals
Event tree bmndata: hits
bmndata.BmnCSCHit Hits of the Cathode Strip Chambers (TClonesArray of BmnCSCHit) GetX/Y/Z(), GetDx/Dy/Dz(), GetStation(), GetModule(), GetLowerClusterIndex(), GetUpperClusterIndex(), GetStripTotalSignalInLowerLayer(), GetStripTotalSignalInUpperLayer(), GetClusterSizeInLowerLayer(), GetClusterSizeInUpperLayer(), GetStripPositionInLowerLayer(), GetStripPositionInUpperLayer(), IsPseudo(), GetRefIndex()
bmndata.BmnGemStripHit GEM hits (TClonesArray of BmnGemStripHit) GetX/Y/Z(), GetDx/Dy/Dz(), GetStation(), GetModule(), GetLowerClusterIndex(), GetUpperClusterIndex(), GetStripTotalSignalInLowerLayer(), GetStripTotalSignalInUpperLayer(), GetClusterSizeInLowerLayer(), GetClusterSizeInUpperLayer(), GetStripPositionInLowerLayer(), GetStripPositionInUpperLayer(), IsPseudo(), GetRefIndex()
bmndata.BmnSiBTHit Exp only: hits of the Silicon Beam Tracker upstream of the target (TClonesArray of BmnSiBTHit) GetX/Y/Z(), GetDx/Dy/Dz(), GetStation(), GetModule(), GetLowerClusterIndex(), GetUpperClusterIndex(), GetStripTotalSignalInLowerLayer(), GetStripTotalSignalInUpperLayer(), GetClusterSizeInLowerLayer(), GetClusterSizeInUpperLayer(), GetStripPositionInLowerLayer(), GetStripPositionInUpperLayer(), IsPseudo(), GetRefIndex(), GetResX/Y()
bmndata.BmnSiliconHit Hits of the Forward Silicon Detector (TClonesArray of BmnSiliconHit) GetX/Y/Z(), GetDx/Dy/Dz(), GetStation(), GetModule(), GetLowerClusterIndex(), GetUpperClusterIndex(), GetStripTotalSignalInLowerLayer(), GetStripTotalSignalInUpperLayer(), GetClusterSizeInLowerLayer(), GetClusterSizeInUpperLayer(), GetStripPositionInLowerLayer(), GetStripPositionInUpperLayer(), IsPseudo(), GetRefIndex()
bmndata.BmnTof400Hit TOF-400 hits (TClonesArray of BmnTofHit) GetX/Y/Z(), GetTimeStamp() (time of flight), GetModule(), GetStation() (strip), GetDetectorID(), IsUsed(), GetLength(), GetResX/Y(), GetRefIndex()
bmndata.BmnTof700Hit TOF-700 hits (TClonesArray of BmnTofHit) GetX/Y/Z(), GetTimeStamp() (time of flight), GetModule(), GetStation() (strip), GetDetectorID(), IsUsed(), GetLength(), GetResX/Y(), GetRefIndex()
bmndata.BmnVSPHit Hits of the Vertex Silicon Plane (TClonesArray of BmnVSPHit) GetX/Y/Z(), GetDx/Dy/Dz(), GetStation(), GetModule(), GetLowerClusterIndex(), GetUpperClusterIndex(), GetStripTotalSignalInLowerLayer(), GetStripTotalSignalInUpperLayer(), GetClusterSizeInLowerLayer(), GetClusterSizeInUpperLayer(), GetStripPositionInLowerLayer(), GetStripPositionInUpperLayer(), IsPseudo(), GetRefIndex()
bmndata.StsHit Tracking hits: VSP, Silicon and GEM hits with the corrected positions used in the track fit (TClonesArray of CbmStsHit) GetX/Y/Z(), GetDx/Dy(), GetSystemId(), GetStationNr(), GetSectorNr(), GetSignalDiv(), GetStrip(side), GetRefIndex(); members fDigiF, fDigiB (cluster indices)
Event tree bmndata: tracks
bmndata.BmnBeamTrack Exp only: beam ion tracks in the Silicon Beam Tracker (TClonesArray of BmnTrack) GetNHits(), GetHitIndex(i), GetParamFirst(), GetParamLast(), GetChi2(), GetB()
bmndata.StsTrackMatch Sim only: MC matching of the inner tracks (TClonesArray of CbmTrackMatch) GetMCTrackId(), GetNofTrueHits(), GetNofWrongHits(), GetNofFakeHits(), GetNofMCTracks()
bmndata.StsVector Inner tracks in the VSP, Silicon and GEM detectors (TClonesArray of CbmStsTrack) GetNStsHits(), GetStsHitIndex(i), GetParamFirst(), GetParamLast(), GetChi2(), GetNDF(), GetFlag(), FromVertex(), GetB(), GetPt(), GetEta(), GetTrkID()
Event tree bmndata: vertices
bmndata.CombineVertex Exp only: primary vertices combined with the beam track, [0] from PrimaryVertex., [1] from MpdVertex. (TClonesArray of CbmVertex) GetX/Y/Z(), GetChi2(), GetNDF(), GetNTracks(), GetCovariance(i, j), GetTrackInds()
bmndata.MpdVertex. Primary vertex, the reference vertex of the global tracks (CbmVertex) GetX/Y/Z(), GetChi2(), GetNDF(), GetNTracks(), GetCovariance(i, j), GetTrackInds()
bmndata.PrimaryVertex. Primary vertex of the CBM KF vertex finder (CbmVertex) GetX/Y/Z(), GetChi2(), GetNDF(), GetNTracks(), GetCovariance(i, j), GetTrackInds()
Event tree bmndata: global tracks
bmndata.BmnGlobalTrack Global tracks: inner tracks with matched TOF-400 and TOF-700 hits and m² for the common case and for particle hypotheses (TClonesArray of BmnGlobalTrack) GetParamFirst(), GetParamLast(), GetP(), GetPx/Py/Pz(), GetPt(), GetEta(), GetTheta(), GetPhi(), GetGemTrackIndex(), GetTof1HitIndex(type), GetTof2HitIndex(type), GetMass2(tof, type), GetResX/Y(tof, type), GetDCAInVertex(), GetChi2InVertex(), GetNHits(), GetChi2(), GetNDF(), GetLength(), GetDedx(), GetQ()
bmndata.BmnGlobalTrackMatch Sim only: MC matching of the global tracks (TClonesArray of BmnTrackMatch) GetNofLinks(), GetLink(i), GetMatchedLink(), GetNofTrueHits(), GetNofWrongHits(), GetTrueOverAllHitsRatio()
Event tree bmndata: forward detectors
bmndata.FHCalEvent Forward Hadron Calorimeter: total energy, modules and their sections (BmnFHCalEvent) GetTotalEnergy(), GetTotalModules(), GetModule(id); module: GetModuleId(), GetEnergy(), GetNsections(), GetSectionEnergy(sec), GetX/Y/Z()
bmndata.HodoEvent Forward Hodoscope: total signal in Z² units and strips (BmnHodoEvent) GetTotalSignal(), GetTotalSignalIntegral(), GetPileUpStatus(), GetStrips(), GetStrip(id); strip: GetStripId(), GetSignal(), GetIntegral(), GetPileUpStatus(), GetX/Y/Z()
bmndata.NdetEvent Neutron Detector: fired cells (BmnNdetEvent) GetCells(), GetTotalCells(), GetCell(address); cell: GetAddress(), GetArmId(), GetRowId(), GetColumnId(), GetLayerId(), GetSignal(), GetTime(), GetX/Y/Z()
bmndata.ScWallEvent Scintillation Wall: 174 cells with their signals (BmnScWallEvent) GetCell(id); cell: GetCellId(), GetSignal(), GetX/Y/Z()
Event tree bmndata: Monte Carlo information
bmndata.BmnMCInfo. Sim only: generator information of the event and MC tracks (BmnMCInfoDst) GetB(), GetX/Y/Z(), GetRotX/Y/Z(), GetMCTracks(); MC track: GetPdgCode(), GetMotherId(), GetPx/Py/Pz(), GetP(), GetPt(), GetRapidity(), GetStartX/Y/Z/T(), GetNPoints(detector)
bmndata.NdetSurfacePoint Sim only: MC points of particles crossing the Neutron Detector surfaces (TClonesArray of BmnNdetSurfacePoint) GetTrackID(), GetX/Y/Z(), GetPx/Py/Pz(), GetTime(), GetPdg(), GetArmID(), GetPlaneID(), GetDirectionID()

Appendix B. Detector identifiers (DetectorId)

Values of the enumeration DetectorId (base/BmnDetectorList.h) used in hits and MC tracks:

Value Name Detector Value Name Detector
0 kREF Reference plane 14 kSiMD Silicon Multiplicity Detector
1 kBD Barrel Detector 15 kSiBT Silicon Beam Tracker
2 kGEM GEM detectors 16 kSiProf Silicon Beam Profilometer
3 kTOF1 TOF-400 17 kARMTRIG SRC arm triggers
4 kDCH Drift Chambers 18 kBC Beam counters
5 kTOF TOF-700 (old code) 19 kSCWALL Scintillation Wall
6 kTOF701 TOF-700 (since 2025) 20 kHODO Forward Hodoscope
7 kZDC Zero Degree Calorimeter 21 kFHCAL Forward Hadron Calorimeter
8 kVSP Vertex Silicon Plane 22 kNDET Neutron Detector
9 kMWPC MWPC 23 kHGND Full-scale Neutron Detector
10 kECAL Electromagnetic calorimeter 24 kSSD –
11 kCSC Cathode Strip Chambers 25 kVACWALL Vacuum wall
12 kSILICON Silicon detectors (FSD) 26 kMSC MSC data
13 kFD Fragment Detector

Appendix C. Differences between simulated and experimental DSTs

The structure of the DST is the same; the table summarises what differs in availability or content.

Item Simulated DST Experimental DST
BmnMCInfo., BmnGlobalTrackMatch, StsTrackMatch, NdetSurfacePoint Present Absent
BmnSiBTHit, BmnBeamTrack, CombineVertex Absent (no beam tracking) Present
Extra objects in the file FairBaseParSet, BmnFieldPar, FairGeoPassivePar –
DstRunHeader: run number, times Run 0; times not meaningful From the Condition Database
DstRunHeader: beam, target, energy From the simulation metadata From the Condition Database
DstEventHeader: run and event IDs MC run ID, MC event number (from 1) DAQ run and event numbers
DstEventHeader: event time MC event time of the generator Absolute time of the event (UTC)
DstEventHeader: impact parameter From the generator 0
BmnTrigInfo. BD digits and FD MC points only Amplitudes, waveforms, trigger input signals, T0
Hits: GetRefIndex(), links, GetType() MC point index, MC links, true/fake flag −1, no links, −1
StsHit coordinates MC corrections (y shift, smearing) Alignment and Lorentz shift corrections
StsHit::GetRefIndex() MC point index −(original hit index) − 1
CbmStsTrack::GetTrkID() Matched MC track Undefined – do not use
TOF hit time Smeared MC time Measured time relative to T0; depends on the TOF calibration

Appendix D. Fields that are not filled or need care

The following fields exist in the format but are not filled in the current reconstruction, contain undefined values, or need special care.

Field Status Recommendation
DstEventHeader::GetTriggerType() Always 1 (default) Use the trigger input signals of BmnTrigInfo.
DstEventHeader Z2in/Z2out/ADC fields −100 when the BC digit branches are missing in the input Use BmnTrigInfo. amplitudes
BmnGlobalTrack::GetRefIndex() Always −1 Use GetTrkID() of the inner track (simulated data only)
BmnGlobalTrack::GetDedx(), GetQ() Filled only for period 8 –
BmnGlobalTrack::GetNdetCellId() Undefined value if no cell is matched: the member is not initialised in the constructor Do not use; match with NdetEvent in the analysis if needed
BmnGlobalTrack::GetScWallCellId(), GetScWallSignal() Not filled: the ScWall matching is switched off Match with ScWallEvent in the analysis if needed
BmnGlobalTrack::GetNHits() Includes one hit per TOF detector in which the track was paired with a hit, also if the pair was not accepted Count the hits of the inner track and the matched TOF hits separately
TOF matching for particle hypotheses Corrections and widths exist only for period 8; for other periods all hypotheses give the same result as kCommon Use kCommon for periods other than 8
BmnTofHit::IsUsed(), GetLength() Set for all track–hit pairs of the TOF matching, also for the pairs that were not accepted Take the matched hits from the indices of the global tracks
BmnTofHit::GetResX(), GetResY() Not filled (−1000) Use the residuals of the global track
BmnGlobalTrack::GetFlag(), GetB(), hit list Not filled Use the inner track in StsVector
CbmStsTrack::GetTrkID() Undefined in experimental DSTs Use only for simulated data
PrimaryVertex. track indices Empty Use MpdVertex. indices
CombineVertex χ² and covariance Copied from the input vertex (not updated) Use for x, y only
TOF β, m² in experimental DSTs Depend on the TOF time calibration applied in the reconstruction Check the TOF time distribution of the production
Layer getters of VSP, Silicon, GEM and CSC hits Taken from the clusters via FairRootManager; default values when the DST tree is read directly Use them in FairRoot tasks, or read the cluster branches
StsHit::GetTimeStamp() Cluster width asymmetry, not a time –
TOF hit cluster indices Exp: digit indices; Sim: undefined –
EventCentrality One calibration file (set in run_reco_bmn.C) is used for all run periods Use only with a calibration for the analysed system
DstRunHeader start and finish times Moscow local time stored as UTC; not meaningful for MC Take into account when comparing with event time stamps (UTC)

Appendix E. Data volume per event

The tables give the size of the DST branches per event as stored in the file, sorted by the size. The values are typical for the Run 9 setup (Xe + Sn at 3 AGeV); they depend on the collision system, the beam energy, the detector configuration and the running conditions.

E.1 Simulated data

Branch Size [kB/event] Share
BmnMCInfo. 39.0 21.0 %
StsHit 35.2 19.0 %
BmnGemStripHit 27.1 14.6 %
BmnGemLowerCluster 17.0 9.2 %
BmnGemUpperCluster 15.9 8.6 %
BmnSiliconHit 6.5 3.5 %
BmnGlobalTrack 6.4 3.4 %
StsVector 6.1 3.3 %
BmnSiliconLowerCluster 5.0 2.7 %
BmnSiliconUpperCluster 4.9 2.6 %
BmnCSCUpperCluster 3.8 2.0 %
BmnCSCLowerCluster 3.7 2.0 %
BmnCSCHit 3.2 1.7 %
FHCalEvent 2.8 1.5 %
BmnVSPHit 2.3 1.2 %
BmnVSPUpperCluster 1.3 0.7 %
BmnTof700Hit 1.3 0.7 %
BmnVSPLowerCluster 1.2 0.7 %
BmnTof400Hit 0.9 0.5 %
ScWallEvent 0.7 0.4 %
BmnGlobalTrackMatch 0.5 0.3 %
BmnTrigInfo. 0.3 0.2 %
HodoEvent 0.2 0.1 %
StsTrackMatch 0.2 0.1 %
MpdVertex. 0.1 < 0.1 %
PrimaryVertex. 0.1 < 0.1 %
DstEventHeader. < 0.1 < 0.1 %
NdetSurfacePoint < 0.1 < 0.1 %
EventCentrality < 0.1 < 0.1 %
NdetEvent < 0.1 < 0.1 %
Total 185.6 100 %

E.2 Experimental data

Branch Size [kB/event] Share
StsHit 34.9 25.2 %
BmnGemStripHit 20.5 14.8 %
BmnGemUpperCluster 16.2 11.7 %
BmnGemLowerCluster 15.7 11.4 %
BmnGlobalTrack 7.3 5.3 %
StsVector 7.1 5.1 %
BmnSiliconUpperCluster 5.5 4.0 %
BmnSiliconLowerCluster 5.1 3.7 %
BmnCSCUpperCluster 4.8 3.5 %
BmnCSCLowerCluster 4.6 3.3 %
BmnSiliconHit 4.0 2.9 %
BmnCSCHit 2.9 2.1 %
BmnTof700Hit 2.0 1.4 %
BmnTrigInfo. 1.6 1.2 %
BmnVSPHit 1.2 0.9 %
ScWallEvent 1.1 0.8 %
FHCalEvent 0.9 0.6 %
BmnTof400Hit 0.8 0.6 %
BmnVSPUpperCluster 0.6 0.5 %
BmnVSPLowerCluster 0.6 0.4 %
BmnSiBTHit 0.3 0.2 %
BmnBeamTrack 0.3 0.2 %
HodoEvent 0.1 0.1 %
CombineVertex 0.1 0.1 %
MpdVertex. 0.1 0.1 %
PrimaryVertex. 0.1 < 0.1 %
DstEventHeader. < 0.1 < 0.1 %
EventCentrality < 0.1 < 0.1 %
NdetEvent < 0.1 < 0.1 %
Total 138.4 100 %