CbmRoot
Loading...
Searching...
No Matches
CbmKFParticleFinderPID.cxx
Go to the documentation of this file.
1/* Copyright (C) 2014-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Maksym Zyzak, Volker Friese [committer] */
4
5//-----------------------------------------------------------
6//-----------------------------------------------------------
7
8// Cbm Headers ----------------------
10
11#include "CbmDigiManager.h"
12#include "CbmEvent.h"
13#include "CbmGlobalTrack.h"
14#include "CbmMCDataManager.h"
15#include "CbmMCTrack.h"
16#include "CbmMuchTrack.h"
17#include "CbmRichRing.h"
18#include "CbmStsCluster.h"
19#include "CbmStsDigi.h"
20#include "CbmStsHit.h"
21#include "CbmStsTrack.h"
22#include "CbmTofHit.h"
23#include "CbmTrackMatchNew.h"
24#include "CbmTrdHit.h"
25#include "CbmTrdTrack.h"
26#include "FairRunAna.h"
27
28//ROOT headers
29#include "TClonesArray.h"
30
31//c++ and std headers
32#include <iostream>
33#include <vector>
34using std::vector;
35
37
38double vecMedian(const vector<double>& vec)
39{
40 double median = 0.;
41 vector<double> vecCopy = vec;
42 sort(vecCopy.begin(), vecCopy.end());
43 int size = vecCopy.size();
44 if (size % 2 == 0) {
45 median = (vecCopy[size / 2 - 1] + vecCopy[size / 2]) / 2;
46 }
47 else {
48 median = vecCopy[size / 2];
49 }
50 return median;
51}
52
53CbmKFParticleFinderPID::CbmKFParticleFinderPID(const char* name, Int_t iVerbose) : FairTask(name, iVerbose)
54{
55 //MuCh cuts
56 fMuchCutsInt[0] = 7; // N sts hits
57 fMuchCutsInt[1] = 14; // N MuCh hits for LMVM
58 fMuchCutsInt[2] = 17; // N MuCh hits for J/Psi
59 fMuchCutsFloat[0] = 1.e6; // STS Chi2/NDF for muons
60 fMuchCutsFloat[1] = 1.5; // MuSh Chi2/NDF for muons
61}
62
64
66{
67 std::string prefix = std::string(GetName()) + "::Init: ";
68
69 //Get ROOT Manager
70 FairRootManager* ioman = FairRootManager::Instance();
71
72 if (ioman == nullptr) {
73 LOG(error) << prefix << "FairRootManager not instantiated!";
74 return kERROR;
75 }
76
77 if (fPIDMode == 1) { // PID from MC
78 auto* mcManager = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
79 if (mcManager == nullptr) {
80 LOG(error) << prefix << "MC Data Manager not found!";
81 return kERROR;
82 }
83 fMcTrackArray = mcManager->InitBranch("MCTrack");
84 if (fMcTrackArray == nullptr) {
85 LOG(error) << prefix << "MC track array not found!";
86 return kERROR;
87 }
88 fStsTrackMatchArray = (TClonesArray*) ioman->GetObject("StsTrackMatch");
90 LOG(error) << prefix << "track match array not found!";
91 return kERROR;
92 }
93 }
94
95 // Get sts tracks
96 fStsTrackArray = (TClonesArray*) ioman->GetObject("StsTrack");
97 if (fStsTrackArray == nullptr) {
98 LOG(error) << prefix << "track-array not found!";
99 return kERROR;
100 }
101
102 if (fPIDMode == 2) { // PID from reconstructed data
103
104 // Get reconstructed events
105
106 fRecoEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
107 if (nullptr == fRecoEvents) {
108 LOG(error) << prefix << ": No event branch found. Run the event builder first.";
109 return kERROR;
110 }
111
112 // Get global tracks
113 fGlobalTrackArray = dynamic_cast<TClonesArray*>(ioman->GetObject("GlobalTrack"));
114 if (fGlobalTrackArray == nullptr) {
115 LOG(error) << prefix << "global track array not found!";
116 return kERROR;
117 }
118
119 // Get STS hit
120 fStsHitArray = dynamic_cast<TClonesArray*>(ioman->GetObject("StsHit"));
121 if (fStsHitArray == nullptr) {
122 LOG(error) << prefix << "STS hit array not found!";
123 return kERROR;
124 }
125
126 // Get sts clusters
127 fStsClusterArray = dynamic_cast<TClonesArray*>(ioman->GetObject("StsCluster"));
128 if (fStsClusterArray == nullptr) {
129 LOG(error) << prefix << "STS cluster array not found!";
130 return kERROR;
131 }
132
133 // --- Digi Manager
136
137 // --- Check input array (StsDigis)
139 LOG(fatal) << GetName() << ": No StsDigi branch in input!";
140 return kERROR;
141 }
142
143 // Get ToF hits
144 fTofHitArray = dynamic_cast<TClonesArray*>(ioman->GetObject("TofHit"));
145 if (fTofHitArray == nullptr) {
146 LOG(error) << prefix << "TOF hit array not found!";
147 return kERROR;
148 }
149
150 fTrdTrackArray = dynamic_cast<TClonesArray*>(ioman->GetObject("TrdTrack"));
151
152 if ((fTrdPIDMode > 0) && (fTrdTrackArray == nullptr)) {
153 LOG(error) << prefix << "TRD track-array not found!";
154 return kERROR;
155 }
156
157 if (fTrdTrackArray != nullptr) {
158 fTrdHitArray = dynamic_cast<TClonesArray*>(ioman->GetObject("TrdHit"));
159 if (fTrdHitArray == nullptr) {
160 LOG(error) << prefix << "TRD hit array not found!";
161 return kERROR;
162 }
163 }
164
165 if (fRichPIDMode > 0) {
166 fRichRingArray = dynamic_cast<TClonesArray*>(ioman->GetObject("RichRing"));
167 if (fRichRingArray == nullptr) {
168 LOG(error) << prefix << "Rich ring array not found!";
169 return kERROR;
170 }
171 }
172
173 if (fMuchMode > 0) {
174 fMuchTrackArray = dynamic_cast<TClonesArray*>(ioman->GetObject("MuchTrack"));
175 if (fMuchTrackArray == nullptr) {
176 LOG(error) << prefix << "Much track-array not found!";
177 return kERROR;
178 }
179 }
180
181 } // if (fPIDMode == 2)
182
183 return kSUCCESS;
184}
185
186void CbmKFParticleFinderPID::Exec(Option_t* /*opt*/)
187{
188 fPID.clear();
189
190 Int_t nTracks = fStsTrackArray->GetEntriesFast();
191 fPID.resize(nTracks, -1);
192
193 if (fPIDMode == 1) {
194 SetMCPID();
195 }
196 if (fPIDMode == 2) {
197 SetRecoPID();
198 }
199}
200
202
204{
205 Int_t nTracks = fStsTrackArray->GetEntriesFast();
206
207 for (int iTr = 0; iTr < nTracks; iTr++) {
208 fPID[iTr] = -2;
209
210 CbmTrackMatchNew* stsTrackMatch = (CbmTrackMatchNew*) fStsTrackMatchArray->At(iTr);
211 if (stsTrackMatch->GetNofLinks() == 0) {
212 continue;
213 }
214 Float_t bestWeight = 0.f;
215 Float_t totalWeight = 0.f;
216 Int_t mcTrackId = -1;
217 Int_t iFile = -1;
218 Int_t iEvent = -1;
219
220 for (int iLink = 0; iLink < stsTrackMatch->GetNofLinks(); iLink++) {
221 totalWeight += stsTrackMatch->GetLink(iLink).GetWeight();
222 if (stsTrackMatch->GetLink(iLink).GetWeight() > bestWeight) {
223 bestWeight = stsTrackMatch->GetLink(iLink).GetWeight();
224 mcTrackId = stsTrackMatch->GetLink(iLink).GetIndex();
225 iFile = stsTrackMatch->GetLink(iLink).GetFile();
226 iEvent = stsTrackMatch->GetLink(iLink).GetEntry();
227 }
228 }
229 if (bestWeight / totalWeight < 0.7) {
230 continue;
231 }
232
233 CbmMCTrack* cbmMCTrack = dynamic_cast<CbmMCTrack*>(fMcTrackArray->Get(iFile, iEvent, mcTrackId));
234
235 if (!(TMath::Abs(cbmMCTrack->GetPdgCode()) == 11 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 13
236 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 211 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 321
237 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 2212 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 1000010020
238 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 1000010030 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 1000020030
239 || TMath::Abs(cbmMCTrack->GetPdgCode()) == 1000020040)) {
240 fPID[iTr] = -1;
241 }
242 else {
243 fPID[iTr] = cbmMCTrack->GetPdgCode();
244 }
245
246 } // track loop
247}
248
249
251{
252 std::string prefix = std::string(GetName()) + "::SetRecoPID: ";
253
254 const Double_t m2TOF[7] = {0.885, 0.245, 0.019479835, 0., 3.49, 7.83, 1.95};
255
256 const Int_t PdgHypo[9] = {2212, 321, 211, -11, 1000010029, 1000010030, 1000020030, -13, -19};
257
258 if (!fRecoEvents) {
259 LOG(fatal) << GetName() << " no reco events! ";
260 return;
261 }
262
263 int nRecoEvents = fRecoEvents->GetEntriesFast();
264
265 for (int iEvent = 0; iEvent < nRecoEvents; iEvent++) {
266
267 CbmEvent* event = dynamic_cast<CbmEvent*>(fRecoEvents->At(iEvent));
268
269 double eventTime = event->GetTzero();
270
271 if (eventTime < 0.) {
272 LOG(error) << prefix << "T0 of the event " << iEvent
273 << " is undefined. Ensure that the CbmRecoT0 task is run before this task.";
274 continue;
275 }
276
277 int nTracksEvent = event->GetNofData(ECbmDataType::kGlobalTrack);
278
279 for (Int_t iTrack = 0; iTrack < nTracksEvent; iTrack++) {
280
281 int globalTrackIndex = event->GetIndex(ECbmDataType::kGlobalTrack, iTrack);
282 auto* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTrackArray->At(globalTrackIndex));
283
284 Int_t stsTrackIndex = globalTrack->GetStsTrackIndex();
285 if (stsTrackIndex < 0) {
286 continue;
287 }
288 assert(stsTrackIndex < (int) fPID.size());
289
290 Bool_t isElectronTRD = 0;
291 Bool_t isElectronRICH = 0;
292 Bool_t isElectron = 0;
293
294 CbmStsTrack* cbmStsTrack = (CbmStsTrack*) fStsTrackArray->At(stsTrackIndex);
295
296 const FairTrackParam* stsPar = cbmStsTrack->GetParamFirst();
297 TVector3 mom;
298 stsPar->Momentum(mom);
299
300 Double_t p = mom.Mag();
301 Double_t pt = mom.Perp();
302 Double_t pz = sqrt(p * p - pt * pt);
303 Int_t q = stsPar->GetQp() > 0 ? 1 : -1;
304
305 if (fRichPIDMode == 1) {
306 if (fRichRingArray) {
307 Int_t richIndex = globalTrack->GetRichRingIndex();
308 if (richIndex > -1) {
309 CbmRichRing* richRing = (CbmRichRing*) fRichRingArray->At(richIndex);
310 if (richRing) {
311 Double_t axisA = richRing->GetAaxis();
312 Double_t axisB = richRing->GetBaxis();
313 Double_t dist = 0; // richRing->GetDistance();
314
315 Double_t fMeanA = 4.95;
316 Double_t fMeanB = 4.54;
317 Double_t fRmsA = 0.30;
318 Double_t fRmsB = 0.22;
319 Double_t fRmsCoeff = 3.5;
320 Double_t fDistCut = 1.;
321
322
323 // if(fElIdAnn->DoSelect(richRing, p) > -0.5) isElectronRICH = 1;
324 if (p < 5.) {
325 if (fabs(axisA - fMeanA) < fRmsCoeff * fRmsA && fabs(axisB - fMeanB) < fRmsCoeff * fRmsB
326 && dist < fDistCut) {
327 isElectronRICH = 1;
328 }
329 }
330 else {
332 // Double_t polAaxis = 5.80008 - 4.10118 / (momentum - 3.67402);
333 // Double_t polBaxis = 5.58839 - 4.75980 / (momentum - 3.31648);
334 // Double_t polRaxis = 5.87252 - 7.64641/(momentum - 1.62255);
336 Double_t polAaxis = 5.64791 - 4.24077 / (p - 3.65494);
337 Double_t polBaxis = 5.41106 - 4.49902 / (p - 3.52450);
338 //Double_t polRaxis = 5.66516 - 6.62229/(momentum - 2.25304);
339 if (axisA < (fMeanA + fRmsCoeff * fRmsA) && axisA > polAaxis && axisB < (fMeanB + fRmsCoeff * fRmsB)
340 && axisB > polBaxis && dist < fDistCut) {
341 isElectronRICH = 1;
342 }
343 }
344 }
345 }
346 }
347 }
348
349 if (fTrdPIDMode == 1) {
350 if (fTrdTrackArray) {
351 Int_t trdIndex = globalTrack->GetTrdTrackIndex();
352 if (trdIndex > -1) {
353 CbmTrdTrack* trdTrack = (CbmTrdTrack*) fTrdTrackArray->At(trdIndex);
354 if (trdTrack) {
355 if (trdTrack->GetPidWkn() > 0.635) {
356 isElectronTRD = 1;
357 }
358 }
359 }
360 }
361 }
362
363 if (fTrdPIDMode == 2) {
364 if (fTrdTrackArray) {
365 Int_t trdIndex = globalTrack->GetTrdTrackIndex();
366 if (trdIndex > -1) {
367 CbmTrdTrack* trdTrack = (CbmTrdTrack*) fTrdTrackArray->At(trdIndex);
368 if (trdTrack) {
369 if (trdTrack->GetPidANN() > 0.9) {
370 isElectronTRD = 1;
371 }
372 }
373 }
374 }
375 }
376
377 // dEdX in TRD
378 double dEdXTRD = 1e6; // in case if TRD is not used
379 if (fTrdTrackArray) {
380 Int_t trdIndex = globalTrack->GetTrdTrackIndex();
381 if (trdIndex > -1) {
382 CbmTrdTrack* trdTrack = (CbmTrdTrack*) fTrdTrackArray->At(trdIndex);
383 if (trdTrack) {
384 Double_t eloss = 0.;
385 for (Int_t iTRD = 0; iTRD < trdTrack->GetNofHits(); iTRD++) {
386 Int_t TRDindex = trdTrack->GetHitIndex(iTRD);
387 CbmTrdHit* trdHit = (CbmTrdHit*) fTrdHitArray->At(TRDindex);
388 eloss += trdHit->GetELoss();
389 }
390 if (trdTrack->GetNofHits() > 0.) {
391 dEdXTRD = 1e6 * pz / p * eloss / trdTrack->GetNofHits();
392 }
393 }
394 }
395 }
396
397 //STS dE/dX
398 vector<double> dEdxAllveto;
399 int nClustersWveto = cbmStsTrack->GetNofStsHits() + cbmStsTrack->GetNofStsHits(); //assume all clusters with veto
400 double dr = 1.;
401 for (int iHit = 0; iHit < cbmStsTrack->GetNofStsHits(); ++iHit) {
402 bool frontVeto = kFALSE, backVeto = kFALSE;
403 CbmStsHit* stsHit = (CbmStsHit*) fStsHitArray->At(cbmStsTrack->GetStsHitIndex(iHit));
404
405 double x, y, z, xNext, yNext, zNext;
406 x = stsHit->GetX();
407 y = stsHit->GetY();
408 z = stsHit->GetZ();
409
410 if (iHit != cbmStsTrack->GetNofStsHits() - 1) {
411 CbmStsHit* stsHitNext = (CbmStsHit*) fStsHitArray->At(cbmStsTrack->GetStsHitIndex(iHit + 1));
412 xNext = stsHitNext->GetX();
413 yNext = stsHitNext->GetY();
414 zNext = stsHitNext->GetZ();
415 dr = sqrt((xNext - x) * (xNext - x) + (yNext - y) * (yNext - y) + (zNext - z) * (zNext - z))
416 / (zNext - z); // if *300um, you get real reconstructed dr
417 } // else dr stay previous
418
419 CbmStsCluster* frontCluster = (CbmStsCluster*) fStsClusterArray->At(stsHit->GetFrontClusterId());
420 CbmStsCluster* backCluster = (CbmStsCluster*) fStsClusterArray->At(stsHit->GetBackClusterId());
421
422 if (!frontCluster || !backCluster) {
423 LOG(info) << "CbmKFParticleFinderPID: no front or back cluster";
424 continue;
425 }
426
427 //check if at least one digi in a cluster has overflow --- charge is registered in the last ADC channel #31
428 for (int iDigi = 0; iDigi < frontCluster->GetNofDigis(); ++iDigi) {
429 if (31 == (fDigiManager->Get<CbmStsDigi>(frontCluster->GetDigi(iDigi))->GetCharge())) {
430 frontVeto = kTRUE;
431 }
432 }
433 for (int iDigi = 0; iDigi < backCluster->GetNofDigis(); ++iDigi) {
434 if (31 == (fDigiManager->Get<CbmStsDigi>(backCluster->GetDigi(iDigi))->GetCharge())) {
435 backVeto = kTRUE;
436 }
437 }
438
439 if (!frontVeto) {
440 dEdxAllveto.push_back((frontCluster->GetCharge()) / dr);
441 nClustersWveto--;
442 }
443 if (!backVeto) {
444 dEdxAllveto.push_back((backCluster->GetCharge()) / dr);
445 nClustersWveto--;
446 }
447 }
448 float dEdXSTS = 1.e6;
449 if (dEdxAllveto.size() != 0) {
450 dEdXSTS = vecMedian(dEdxAllveto);
451 }
452
453
454 int isMuon = 0;
455 if (fMuchTrackArray && fMuchMode > 0) {
456 Int_t muchIndex = globalTrack->GetMuchTrackIndex();
457 if (muchIndex > -1) {
458 CbmMuchTrack* muchTrack = (CbmMuchTrack*) fMuchTrackArray->At(muchIndex);
459 if (muchTrack) {
460 if ((cbmStsTrack->GetChiSq() / cbmStsTrack->GetNDF()) < fMuchCutsFloat[0]
461 && (muchTrack->GetChiSq() / muchTrack->GetNDF()) < fMuchCutsFloat[1]
462 && cbmStsTrack->GetTotalNofHits() >= fMuchCutsInt[0]) {
463 if (muchTrack->GetNofHits() >= fMuchCutsInt[1]) {
464 isMuon = 2;
465 }
466 if (muchTrack->GetNofHits() >= fMuchCutsInt[2]) {
467 isMuon = 1;
468 }
469 }
470 }
471 }
472 }
473
474 if (p > 1.5) {
475 if (isElectronRICH && isElectronTRD) {
476 isElectron = 1;
477 }
478 if (fRichPIDMode == 0 && isElectronTRD) {
479 isElectron = 1;
480 }
481 if (fTrdPIDMode == 0 && isElectronRICH) {
482 isElectron = 1;
483 }
484 }
485 else if (isElectronRICH) {
486 isElectron = 1;
487 }
488
489 if (fTofHitArray && isMuon == 0) {
490 Double_t l = globalTrack->GetLength(); // l is calculated by global tracking
491 if (!((l > fCuts.fTrackLengthMin) && (l < fCuts.fTrackLengthMax))) {
492 continue;
493 }
494
495 Int_t tofHitIndex = globalTrack->GetTofHitIndex();
496 if (tofHitIndex < 0) {
497 continue;
498 }
499
500 const CbmTofHit* tofHit = static_cast<const CbmTofHit*>(fTofHitArray->At(tofHitIndex));
501 if (!tofHit) {
502 LOG(error) << "null Tof hit pointer";
503 continue;
504 }
505
506 Double_t time = tofHit->GetTime() - eventTime;
507
508 if (!((time > fCuts.fTrackTofTimeMin) && (time < fCuts.fTrackTofTimeMax))) {
509 continue;
510 }
511
512 Double_t m2 = p * p * (1. / ((l / time / 29.9792458) * (l / time / 29.9792458)) - 1.);
513
514 Double_t sigma[7];
515 Double_t dm2[7];
516
517 for (int iSigma = 0; iSigma < 7; iSigma++) {
518 sigma[iSigma] = fCuts.fSP[iSigma][0] + fCuts.fSP[iSigma][1] * p + fCuts.fSP[iSigma][2] * p * p
519 + fCuts.fSP[iSigma][3] * p * p * p + fCuts.fSP[iSigma][4] * p * p * p * p;
520 dm2[iSigma] = fabs(m2 - m2TOF[iSigma]) / sigma[iSigma];
521 }
522
523 if (isElectron) {
524 if (dm2[3] > 3.) {
525 isElectron = 0;
526 }
527 }
528
529 int iPdg = 2;
530 Double_t dm2min = dm2[2];
531
532 if (!isElectron && isMuon == 0) {
533 // if(p>12.) continue;
534
535 for (int jPDG = 0; jPDG < 7; jPDG++) {
536 if (jPDG == 3) {
537 continue;
538 }
539 if (dm2[jPDG] < dm2min) {
540 iPdg = jPDG;
541 dm2min = dm2[jPDG];
542 }
543 }
544
545 if (dm2min > 2) {
546 iPdg = -1;
547 }
548
549 Double_t dEdXTRDthresholdProton = 10.;
550 if (iPdg == 6) {
551 if (fUseTRDdEdX && (dEdXTRD < dEdXTRDthresholdProton)) {
552 iPdg = 0;
553 }
554 if (fUseSTSdEdX && (dEdXSTS < 7.5e4)) {
555 iPdg = 0;
556 }
557 }
558
559 if (iPdg > -1) {
560 fPID[stsTrackIndex] = q * PdgHypo[iPdg];
561 }
562 }
563 }
564
565 if (isElectron) {
566 fPID[stsTrackIndex] = q * PdgHypo[3];
567 }
568
569 if (isMuon == 1) {
570 fPID[stsTrackIndex] = q * PdgHypo[7];
571 }
572 if (isMuon == 2) {
573 fPID[stsTrackIndex] = q * PdgHypo[8];
574 }
575 } // track loop
576 } // event loop
577}
@ kSts
Silicon Tracking System.
double vecMedian(const vector< double > &vec)
ClassImp(CbmKFParticleFinderPID)
Data class for STS clusters.
Data class for a reconstructed hit in the STS.
Data class for STS tracks.
Class for hits in TRD detector.
friend fvec sqrt(const fvec &a)
static constexpr size_t size()
Definition KfSimdPseudo.h:2
int32_t GetDigi(int32_t index) const
Get digi at position index.
Definition CbmCluster.h:76
int32_t GetNofDigis() const
Number of digis in cluster.
Definition CbmCluster.h:69
static Bool_t IsPresent(ECbmModuleId systemId)
Presence of a digi branch.
InitStatus Init()
Initialisation.
const Digi * Get(Int_t index) const
Get a digi object.
static CbmDigiManager * Instance()
Static instance.
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
double GetTzero() const
Definition CbmEvent.h:146
int32_t GetStsTrackIndex() const
double GetTime() const
Definition CbmHit.h:76
double GetZ() const
Definition CbmHit.h:71
virtual void Exec(Option_t *opt)
CbmKFParticleFinderPID(const char *name="CbmKFParticleFinderPID", Int_t iVerbose=0)
TObject * Get(const CbmLink *lnk)
Task class creating and managing CbmMCDataArray objects.
int32_t GetPdgCode() const
Definition CbmMCTrack.h:68
const CbmLink & GetLink(int32_t i) const
Definition CbmMatch.h:39
int32_t GetNofLinks() const
Definition CbmMatch.h:42
double GetY() const
Definition CbmPixelHit.h:74
double GetX() const
Definition CbmPixelHit.h:73
double GetAaxis() const
Definition CbmRichRing.h:80
double GetBaxis() const
Definition CbmRichRing.h:81
Data class for STS clusters.
double GetCharge() const
Get cluster charge @value Total cluster charge [e].
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
data class for a reconstructed 3-d hit in the STS
Definition CbmStsHit.h:35
int32_t GetFrontClusterId() const
Definition CbmStsHit.h:105
int32_t GetBackClusterId() const
Definition CbmStsHit.h:65
int32_t GetStsHitIndex(int32_t iHit) const
virtual int32_t GetTotalNofHits() const
Definition CbmStsTrack.h:81
int32_t GetNofStsHits() const
Definition CbmStsTrack.h:93
int32_t GetNDF() const
Definition CbmTrack.h:64
virtual int32_t GetNofHits() const
Definition CbmTrack.h:58
const FairTrackParam * GetParamFirst() const
Definition CbmTrack.h:68
int32_t GetHitIndex(int32_t iHit) const
Definition CbmTrack.h:59
double GetChiSq() const
Definition CbmTrack.h:63
data class for a reconstructed Energy-4D measurement in the TRD
Definition CbmTrdHit.h:40
double GetELoss() const
Definition CbmTrdHit.h:79
double GetPidANN() const
Definition CbmTrdTrack.h:41
double GetPidWkn() const
Definition CbmTrdTrack.h:40