CbmRoot
Loading...
Searching...
No Matches
CbmKFTrackQa.cxx
Go to the documentation of this file.
1/* Copyright (C) 2015-2018 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Maksym Zyzak [committer], Grigory Kozlov */
4
5//-----------------------------------------------------------
6//-----------------------------------------------------------
7
8// Cbm Headers ----------------------
9#include "CbmKFTrackQa.h"
10
11#include "CbmMCTrack.h"
12#include "CbmTrack.h"
13#include "CbmTrackMatchNew.h"
14#include "FairRunAna.h"
15
16//KF Particle headers
17#include "CbmKFVertex.h"
18#include "CbmL1PFFitter.h"
19#include "KFMCTrack.h"
20#include "KFParticleMatch.h"
21#include "KFParticleTopoReconstructor.h"
22#include "KFTopoPerformance.h"
23
24//ROOT headers
25#include "TClonesArray.h"
26#include "TDatabasePDG.h"
27#include "TDirectory.h"
28#include "TFile.h"
29#include "TH1F.h"
30#include "TH2F.h"
31#include "TMath.h"
32#include "TObject.h"
33#include "TProfile.h"
34
35//c++ and std headers
36#include "CbmGlobalTrack.h"
37#include "CbmMCDataArray.h"
38#include "CbmMCDataManager.h"
39#include "CbmMCEventList.h"
40#include "CbmMuchTrack.h"
41#include "CbmRichRing.h"
42#include "CbmStsTrack.h"
43#include "CbmTofHit.h"
44#include "CbmTofPoint.h"
45#include "CbmTrack.h"
46#include "CbmTrdHit.h"
47#include "CbmTrdTrack.h"
48
49#include <cmath>
50#include <iomanip>
51#include <iostream>
52
53using std::map;
54using std::vector;
55
56CbmKFTrackQa::CbmKFTrackQa(const char* name, Int_t iVerbose, TString outFileName)
57 : FairTask(name, iVerbose)
58 , fMcEventListBranchName("MCEventList.")
59 , fStsTrackBranchName("StsTrack")
60 , fGlobalTrackBranchName("GlobalTrack")
61 , fRichBranchName("RichRing")
62 , fTrdBranchName("TrdTrack")
63 , fTrdHitBranchName("TrdHit")
64 , fTofBranchName("TofHit")
65 , fMuchTrackBranchName("MuchTrack")
66 , fMCTracksBranchName("MCTrack")
67 , fStsTrackMatchBranchName("StsTrackMatch")
68 , fRichRingMatchBranchName("RichRingMatch")
69 , fTrdTrackMatchBranchName("TrdTrackMatch")
70 , fTofHitMatchBranchName("TofHitMatch")
71 , fMuchTrackMatchBranchName("MuchTrackMatch")
72 , fStsTrackArray(nullptr)
73 , fGlobalTrackArray(nullptr)
74 , fRichRingArray(nullptr)
75 , fTrdTrackArray(nullptr)
76 , fTrdHitArray(nullptr)
77 , fTofHitArray(nullptr)
78 , fMuchTrackArray(nullptr)
79 , fMCTrackArray(nullptr)
80 , fStsTrackMatchArray(nullptr)
81 , fRichRingMatchArray(nullptr)
82 , fTrdTrackMatchArray(nullptr)
83 , fTofHitMatchArray(nullptr)
84 , fMuchTrackMatchArray(nullptr)
85 , fOutFileName(outFileName)
86 , fOutFile(nullptr)
87 , fHistoDir(nullptr)
88 , fNEvents(0)
89 , fPDGtoIndexMap()
90{
91 TFile* curFile = gFile;
92 TDirectory* curDirectory = gDirectory;
93
94 if (!(fOutFileName == "")) {
95 fOutFile = new TFile(fOutFileName.Data(), "RECREATE");
96 }
97 else {
98 fOutFile = gFile;
99 }
100
101 fOutFile->cd();
102
103 fHistoDir = fOutFile->mkdir("KFTrackQA");
104 fHistoDir->cd();
105
106 gDirectory->mkdir("STS");
107 gDirectory->cd("STS");
108 {
109 TString histoName[NStsHisto] = {"NHits", "chi2/NDF", "prob"};
110 TString axisName[NStsHisto] = {"N hits", "#chi^{2}/NDF", "prob"};
111 int nBins[NStsHisto] = {16, 100, 100};
112 float xMin[NStsHisto] = {-0.5, 0.f, 0.f};
113 float xMax[NStsHisto] = {15.5, 20.f, 1.f};
114
115 TString subdirs[8] = {"Tracks", "e", "mu", "pi", "K", "p", "fragments", "ghost"};
116
117 for (int iDir = 0; iDir < 8; iDir++) {
118 gDirectory->mkdir(subdirs[iDir].Data());
119 gDirectory->cd(subdirs[iDir].Data());
120 {
121 gDirectory->mkdir("TrackFitQA");
122 gDirectory->cd("TrackFitQA");
123 {
124 TString res = "res";
125 TString pull = "pull";
126
127 TString parName[5] = {"X", "Y", "Tx", "Ty", "QP"};
128 int nBinsFit = 100;
129 // float xMaxFit[5] = {0.15,0.15,0.01,0.01,3.5};
130 float xMaxFit[5] = {0.05, 0.045, 0.01, 0.01, 0.1};
131
132 for (int iH = 0; iH < 5; iH++) {
133 hStsFitHisto[iDir][iH] =
134 new TH1F((res + parName[iH]).Data(), (res + parName[iH]).Data(), nBinsFit, -xMaxFit[iH], xMaxFit[iH]);
135 hStsFitHisto[iDir][iH + 5] =
136 new TH1F((pull + parName[iH]).Data(), (pull + parName[iH]).Data(), nBinsFit, -10, 10);
137 }
138 }
139 gDirectory->cd("..");
140
141 for (int iH = 0; iH < NStsHisto; iH++) {
142 hStsHisto[iDir][iH] = new TH1F(histoName[iH].Data(), histoName[iH].Data(), nBins[iH], xMin[iH], xMax[iH]);
143 hStsHisto[iDir][iH]->GetXaxis()->SetTitle(axisName[iH].Data());
144 }
145 }
146 gDirectory->cd(".."); //STS
147 }
148 }
149 gDirectory->cd("..");
150
151 gDirectory->mkdir("MuCh");
152 gDirectory->cd("MuCh");
153 {
154 TString histoName[NMuchHisto] = {"NHits", "FirstStation", "LastStation", "chi2/NDF", "prob"};
155 TString axisName[NMuchHisto] = {"N hits", "First Station", "Last Station", "#chi^{2}/NDF", "prob"};
156 int nBins[NMuchHisto] = {16, 16, 16, 100, 100};
157 float xMin[NMuchHisto] = {-0.5f, -0.5f, -0.5f, 0.f, 0.f};
158 float xMax[NMuchHisto] = {15.5f, 15.5f, 15.5f, 20.f, 1.f};
159
160 TString subdirs[3] = {"mu", "Background", "Ghost"};
161
162 for (int iDir = 0; iDir < 3; iDir++) {
163 gDirectory->mkdir(subdirs[iDir].Data());
164 gDirectory->cd(subdirs[iDir].Data());
165 for (int iH = 0; iH < NMuchHisto; iH++) {
166 hMuchHisto[iDir][iH] = new TH1F(histoName[iH].Data(), histoName[iH].Data(), nBins[iH], xMin[iH], xMax[iH]);
167 hMuchHisto[iDir][iH]->GetXaxis()->SetTitle(axisName[iH].Data());
168 }
169 gDirectory->cd(".."); //MuCh
170 }
171 }
172 gDirectory->cd("..");
173
174 gDirectory->mkdir("RICH");
175 gDirectory->cd("RICH");
176 {
177 TString subdirs[10] = {"AllTracks", "e", "mu", "pi", "K", "p", "Fragments", "Mismatch", "GhostTrack", "GhostRing"};
178 TString histoName2D[NRichRingHisto2D] = {"r", "axisA", "axisB"};
179
180 for (int iDir = 0; iDir < 10; iDir++) {
181 gDirectory->mkdir(subdirs[iDir]);
182 gDirectory->cd(subdirs[iDir]);
183 for (int iH = 0; iH < NRichRingHisto2D; iH++) {
184 hRichRingHisto2D[iDir][iH] = new TH2F(histoName2D[iH], histoName2D[iH], 1000, 0, 15., 1000, 0, 10.);
185 hRichRingHisto2D[iDir][iH]->GetYaxis()->SetTitle(histoName2D[iH] + TString(" [cm]"));
186 hRichRingHisto2D[iDir][iH]->GetXaxis()->SetTitle("p [GeV/c]");
187 }
188 gDirectory->cd(".."); //RICH
189 }
190 }
191 gDirectory->cd("..");
192
193 gDirectory->mkdir("TRD");
194 gDirectory->cd("TRD");
195 {
196 TString histoName[NTrdHisto] = {"Wkn", "ANN"};
197 TString axisName[NTrdHisto] = {"Wkn", "ANN"};
198 int nBins[NTrdHisto] = {1000, 1000};
199 float xMin[NTrdHisto] = {-1.5f, -1.5f};
200 float xMax[NTrdHisto] = {1.5f, 1.5f};
201
202 TString subdirs[14] = {"AllTracks", "e", "mu", "pi", "K", "p", "Fragments", "Mismatch", "GhostTrack",
203 "GhostTrdTrack", "d", "t", "He3", "He4"};
204
205 for (int iDir = 0; iDir < 14; iDir++) {
206 gDirectory->mkdir(subdirs[iDir].Data());
207 gDirectory->cd(subdirs[iDir].Data());
208 for (int iH = 0; iH < NTrdHisto; iH++) {
209 hTrdHisto[iDir][iH] = new TH1F(histoName[iH].Data(), histoName[iH].Data(), nBins[iH], xMin[iH], xMax[iH]);
210 hTrdHisto[iDir][iH]->GetXaxis()->SetTitle(axisName[iH].Data());
211 }
212 hTrdHisto2D[iDir][0] = new TH2F("dE/dx", "dE/dx", 1500, 0., 15., 1000, 0., 1000.);
213 hTrdHisto2D[iDir][0]->GetYaxis()->SetTitle("dE/dx [keV/(cm)]");
214 hTrdHisto2D[iDir][0]->GetXaxis()->SetTitle("p [GeV/c]");
215 gDirectory->cd(".."); //Trd
216 }
217 }
218 gDirectory->cd("..");
219
220 gDirectory->mkdir("TOF");
221 gDirectory->cd("TOF");
222 {
223 TString histoName2D[NTofHisto2D] = {"M2P", "M2dEdX"};
224 TString xAxisName[NTofHisto2D] = {"p [GeV/c]", "dE/dx [keV/(cm)]"};
225 TString yAxisName[NTofHisto2D] = {"m^{2} [GeV^{2}/c^{4}]", "m^{2} [GeV^{2}/c^{4}]"};
226 float xMin[NTofHisto2D] = {-15., 0.};
227 float xMax[NTofHisto2D] = {15., 1000.};
228 Int_t xBins[NTofHisto2D] = {3000, 1000};
229 float yMin[NTofHisto2D] = {-2., -2.};
230 float yMax[NTofHisto2D] = {14., 14.};
231 Int_t yBins[NTofHisto2D] = {1600, 1600};
232
233 TString profName[NTofProfiles] = {"MatchEff", "Mismatch", "NoMatch"};
234
235 TString subdirs[14] = {"AllTracks", "e", "mu", "pi", "K", "p", "Fragments", "Mismatch", "GhostTrack",
236 "WrongTofPoint", "d", "t", "He3", "He4"};
237
238 for (int iDir = 0; iDir < 14; iDir++) {
239 gDirectory->mkdir(subdirs[iDir].Data());
240 gDirectory->cd(subdirs[iDir].Data());
241
242 for (int iH = 0; iH < NTofHisto2D; iH++) {
243 hTofHisto2D[iDir][iH] = new TH2F(histoName2D[iH].Data(), histoName2D[iH].Data(), xBins[iH], xMin[iH], xMax[iH],
244 yBins[iH], yMin[iH], yMax[iH]);
245 hTofHisto2D[iDir][iH]->GetXaxis()->SetTitle(xAxisName[iH]);
246 hTofHisto2D[iDir][iH]->GetYaxis()->SetTitle(yAxisName[iH]);
247 }
248
249 for (int iH = 0; iH < NTofProfiles; iH++) {
250 hTofProfiles[iDir][iH] = new TProfile(profName[iH].Data(), profName[iH].Data(), 100, 0., 15.);
251 hTofProfiles[iDir][iH]->GetXaxis()->SetTitle("p [GeV/c]");
252 }
253
254 gDirectory->cd(".."); //Tof
255 }
256 }
257 gDirectory->cd("..");
258
259 gFile = curFile;
260 gDirectory = curDirectory;
261
262 fPDGtoIndexMap[11] = 1;
263 fPDGtoIndexMap[13] = 2;
264 fPDGtoIndexMap[211] = 3;
265 fPDGtoIndexMap[321] = 4;
266 fPDGtoIndexMap[2212] = 5;
267 fPDGtoIndexMap[1000010020] = 10;
268 fPDGtoIndexMap[1000010030] = 11;
269 fPDGtoIndexMap[1000020030] = 12;
270 fPDGtoIndexMap[1000020040] = 13;
271}
272
274
276{
277 //Get ROOT Manager
278 FairRootManager* ioman = FairRootManager::Instance();
279
280 if (ioman == nullptr) {
281 Warning("CbmKFTrackQa::Init", "RootManager not instantiated!");
282 return kERROR;
283 }
284
285 // Get mc event list
286 fMcEventList = static_cast<CbmMCEventList*>(ioman->GetObject(fMcEventListBranchName));
287 if (!fMcEventList) {
288 Warning("CbmKFTrackQa::Init", "mc event list not found!");
289 return kERROR;
290 }
291
292 // Get sts tracks
293 fStsTrackArray = (TClonesArray*) ioman->GetObject(fStsTrackBranchName);
294 if (fStsTrackArray == nullptr) {
295 Warning("CbmKFTrackQa::Init", "track-array not found!");
296 return kERROR;
297 }
298
299 // Get global tracks
300 fGlobalTrackArray = (TClonesArray*) ioman->GetObject(fGlobalTrackBranchName);
301 if (fGlobalTrackArray == nullptr) {
302 Warning("CbmKFTrackQa::Init", "global track array not found!");
303 }
304
305 // Get ToF hits
306 fTofHitArray = (TClonesArray*) ioman->GetObject(fTofBranchName);
307 if (fTofHitArray == nullptr) {
308 Warning("CbmKFTrackQa::Init", "TOF hit-array not found!");
309 }
310
311 // TRD
312 fTrdTrackArray = (TClonesArray*) ioman->GetObject(fTrdBranchName);
313 if (fTrdTrackArray == nullptr) {
314 Warning("CbmKFTrackQa::Init", "TRD track-array not found!");
315 }
316
317 fTrdHitArray = (TClonesArray*) ioman->GetObject(fTrdHitBranchName);
318 if (fTrdHitArray == nullptr) {
319 Warning("CbmKFTrackQa::Init", "TRD hit-array not found!");
320 }
321
322 fRichRingArray = (TClonesArray*) ioman->GetObject(fRichBranchName);
323 if (fRichRingArray == nullptr) {
324 Warning("CbmKFTrackQa::Init", "Rich ring array not found!");
325 }
326
327 fMCTrackArray = (TClonesArray*) ioman->GetObject(fMCTracksBranchName);
328 if (fMCTrackArray == nullptr) {
329 Warning("CbmKFTrackQa::Init", "mc track array not found!");
330 return kERROR;
331 }
332
333 //Track match
334 fStsTrackMatchArray = (TClonesArray*) ioman->GetObject(fStsTrackMatchBranchName);
335 if (fStsTrackMatchArray == nullptr) {
336 Warning("CbmKFTrackQa::Init", "track match array not found!");
337 return kERROR;
338 }
339
340 //Ring match
341 fRichRingMatchArray = (TClonesArray*) ioman->GetObject(fRichRingMatchBranchName);
342 if (fRichRingMatchArray == nullptr) {
343 Warning("CbmKFTrackQa::Init", "RichRing match array not found!");
344 }
345
346 //Tof match
347 fTofHitMatchArray = (TClonesArray*) ioman->GetObject(fTofHitMatchBranchName);
348 if (fTofHitMatchArray == nullptr) {
349 Warning("CbmKFTrackQa::Init", "TofHit match array not found!");
350 }
351
352 //TRD match
353 fTrdTrackMatchArray = (TClonesArray*) ioman->GetObject(fTrdTrackMatchBranchName);
354 if (fTrdTrackMatchArray == nullptr) {
355 Warning("CbmKFTrackQa::Init", "TrdTrack match array not found!");
356 }
357
358 //Much track match
359 fMuchTrackMatchArray = (TClonesArray*) ioman->GetObject(fMuchTrackMatchBranchName);
360 if (fMuchTrackMatchArray == nullptr) {
361 Warning("CbmKFTrackQa::Init", "Much track match array not found!");
362 }
363 //Much
364 fMuchTrackArray = (TClonesArray*) ioman->GetObject(fMuchTrackBranchName);
365 if (fMuchTrackArray == nullptr) {
366 Warning("CbmKFTrackQa::Init", "Much track-array not found!");
367 }
368
369 // mc data manager
370 CbmMCDataManager* mcManager = (CbmMCDataManager*) ioman->GetObject("MCDataManager");
371 if (mcManager == nullptr) {
372 Warning("CbmKFTrackQa::Init", "mc manager not found!");
373 }
374
375 // Tof points
376 fTofPoints = (CbmMCDataArray*) mcManager->InitBranch("TofPoint");
377 if (fTofPoints == nullptr) {
378 Warning("CbmKFTrackQa::Init", "tof points not found!");
379 }
380
381 return kSUCCESS;
382}
383
384void CbmKFTrackQa::Exec(Option_t* /*opt*/)
385{
386 fNEvents++;
387
388 Int_t nMCTracks = fMCTrackArray->GetEntriesFast();
389 vector<KFMCTrack> mcTracks(nMCTracks);
390 for (Int_t iMC = 0; iMC < nMCTracks; iMC++) {
391 CbmMCTrack* cbmMCTrack = (CbmMCTrack*) fMCTrackArray->At(iMC);
392
393
394 mcTracks[iMC].SetX(cbmMCTrack->GetStartX());
395 mcTracks[iMC].SetY(cbmMCTrack->GetStartY());
396 mcTracks[iMC].SetZ(cbmMCTrack->GetStartZ());
397 mcTracks[iMC].SetPx(cbmMCTrack->GetPx());
398 mcTracks[iMC].SetPy(cbmMCTrack->GetPy());
399 mcTracks[iMC].SetPz(cbmMCTrack->GetPz());
400
401 Int_t pdg = cbmMCTrack->GetPdgCode();
402 Double_t q = 1;
403 if (pdg < 9999999 && ((TParticlePDG*) TDatabasePDG::Instance()->GetParticle(pdg))) {
404 q = TDatabasePDG::Instance()->GetParticle(pdg)->Charge() / 3.0;
405 }
406 else if (pdg == 1000010020) {
407 q = 1;
408 }
409 else if (pdg == -1000010020) {
410 q = -1;
411 }
412 else if (pdg == 1000010030) {
413 q = 1;
414 }
415 else if (pdg == -1000010030) {
416 q = -1;
417 }
418 else if (pdg == 1000020030) {
419 q = 2;
420 }
421 else if (pdg == -1000020030) {
422 q = -2;
423 }
424 else if (pdg == 1000020040) {
425 q = 2;
426 }
427 else if (pdg == -1000020040) {
428 q = -2;
429 }
430 else {
431 q = 0;
432 }
433 Double_t p = cbmMCTrack->GetP();
434
435 mcTracks[iMC].SetMotherId(cbmMCTrack->GetMotherId());
436 mcTracks[iMC].SetQP(q / p);
437 mcTracks[iMC].SetPDG(pdg);
438 mcTracks[iMC].SetNMCPoints(0);
439 }
440
441 Int_t ntrackMatches = fStsTrackMatchArray->GetEntriesFast();
442 vector<int> trackMatch(ntrackMatches, -1);
443
444 for (int iTr = 0; iTr < ntrackMatches; iTr++) {
445 CbmTrackMatchNew* stsTrackMatch = (CbmTrackMatchNew*) fStsTrackMatchArray->At(iTr);
446 if (stsTrackMatch->GetNofLinks() == 0) {
447 continue;
448 }
449 Float_t bestWeight = 0.f;
450 Float_t totalWeight = 0.f;
451 Int_t mcTrackId = -1;
452 for (int iLink = 0; iLink < stsTrackMatch->GetNofLinks(); iLink++) {
453 totalWeight += stsTrackMatch->GetLink(iLink).GetWeight();
454 if (stsTrackMatch->GetLink(iLink).GetWeight() > bestWeight) {
455 bestWeight = stsTrackMatch->GetLink(iLink).GetWeight();
456 mcTrackId = stsTrackMatch->GetLink(iLink).GetIndex();
457 }
458 }
459 if (bestWeight / totalWeight < 0.7) {
460 continue;
461 }
462 if (mcTrackId >= nMCTracks || mcTrackId < 0) {
463 std::cout << "Sts Matching is wrong! StsTackId = " << mcTrackId << " N mc tracks = " << nMCTracks << std::endl;
464 continue;
465 }
466
467 mcTracks[mcTrackId].SetReconstructed();
468 trackMatch[iTr] = mcTrackId;
469 }
470
471 //Check fit quality of the STS tracks
472 vector<CbmStsTrack> vRTracks(fStsTrackArray->GetEntriesFast());
473 vector<int> pdg(fStsTrackArray->GetEntriesFast(), 211);
474 for (int iTr = 0; iTr < fStsTrackArray->GetEntriesFast(); iTr++) {
475 CbmStsTrack* stsTrack = ((CbmStsTrack*) fStsTrackArray->At(iTr));
476 vRTracks[iTr] = *stsTrack;
477 if (trackMatch[iTr] > -1) {
478 pdg[iTr] = mcTracks[trackMatch[iTr]].PDG();
479 }
480 }
481
482 CbmL1PFFitter fitter;
483 vector<CbmL1PFFitter::PFFieldRegion> vField;
484 fitter.Fit(vRTracks, pdg);
485
486 // CbmKFVertex kfVertex; ! the MC vertex is not at 0,0,0 any longer. !
487 // vector<float> vChiToPrimVtx;
488 // fitter.GetChiToVertex(vRTracks, vField, vChiToPrimVtx, kfVertex, 3000000);
489
490 for (unsigned int iTr = 0; iTr < vRTracks.size(); iTr++) {
491 if (trackMatch[iTr] < 0) {
492 continue;
493 }
494
495 const KFMCTrack& mcTrack = mcTracks[trackMatch[iTr]];
496 if (mcTrack.MotherId() > -1) {
497 continue;
498 }
499 // if ( vRTracks[iTr].GetNofHits() < 11 ) continue;
500
501 const FairTrackParam* parameters = vRTracks[iTr].GetParamFirst();
502
503 Double_t recoParam[5] = {parameters->GetX(), parameters->GetY(), parameters->GetTx(), parameters->GetTy(),
504 parameters->GetQp()};
505 Double_t recoError[5] = {parameters->GetCovariance(0, 0), parameters->GetCovariance(1, 1),
506 parameters->GetCovariance(2, 2), parameters->GetCovariance(3, 3),
507 parameters->GetCovariance(4, 4)};
508 Double_t mcParam[5] = {mcTrack.X(), mcTrack.Y(), mcTrack.Px() / mcTrack.Pz(), mcTrack.Py() / mcTrack.Pz(),
509 mcTrack.Par()[6]};
510
511 int iDir = GetHistoIndex(mcTrack.PDG());
512 if (iDir < 8) {
513
514 for (int iParam = 0; iParam < 5; iParam++) {
515 Double_t residual = recoParam[iParam] - mcParam[iParam];
516 if (iParam == 4) {
517 Double_t pReco = fabs(1. / recoParam[iParam]);
518 Double_t pMC = fabs(1. / mcParam[iParam]);
519
520 hStsFitHisto[0][iParam]->Fill((pReco - pMC) / pMC);
521 hStsFitHisto[iDir][iParam]->Fill((pReco - pMC) / pMC);
522 }
523 else {
524 hStsFitHisto[0][iParam]->Fill(residual);
525 hStsFitHisto[iDir][iParam]->Fill(residual);
526 }
527
528 if (recoError[iParam] >= 0.) {
529 Double_t pull = residual / sqrt(recoError[iParam]);
530 hStsFitHisto[0][iParam + 5]->Fill(pull);
531 hStsFitHisto[iDir][iParam + 5]->Fill(pull);
532 }
533 }
534 }
535 }
536
537 //Check quality of global tracks
538
539 vector<int> trackMuchMatch;
540 if (fMuchTrackMatchArray != nullptr) {
541 Int_t nMuchTrackMatches = fMuchTrackMatchArray->GetEntriesFast();
542 trackMuchMatch.resize(nMuchTrackMatches, -1);
543
544 for (int iTr = 0; iTr < nMuchTrackMatches; iTr++) {
545 CbmTrackMatchNew* muchTrackMatch = (CbmTrackMatchNew*) fMuchTrackMatchArray->At(iTr);
546 if (muchTrackMatch->GetNofLinks() == 0) {
547 continue;
548 }
549 Float_t bestWeight = 0.f;
550 Float_t totalWeight = 0.f;
551 Int_t mcTrackId = -1;
552 for (int iLink = 0; iLink < muchTrackMatch->GetNofLinks(); iLink++) {
553 totalWeight += muchTrackMatch->GetLink(iLink).GetWeight();
554 if (muchTrackMatch->GetLink(iLink).GetWeight() > bestWeight) {
555 bestWeight = muchTrackMatch->GetLink(iLink).GetWeight();
556 mcTrackId = muchTrackMatch->GetLink(iLink).GetIndex();
557 }
558 }
559 if (bestWeight / totalWeight < 0.7) {
560 continue;
561 }
562 if (mcTrackId >= nMCTracks || mcTrackId < 0) {
563 std::cout << "Much Matching is wrong! MuchTackId = " << mcTrackId << " N mc tracks = " << nMCTracks
564 << std::endl;
565 continue;
566 }
567
568 trackMuchMatch[iTr] = mcTrackId;
569 }
570 }
571
572 if (fGlobalTrackArray == nullptr) {
573 Warning("KF Track QA", "No GlobalTrack array!");
574 }
575 else {
576 for (Int_t igt = 0; igt < fGlobalTrackArray->GetEntriesFast(); igt++) {
577 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTrackArray->At(igt));
578
579 Int_t stsTrackIndex = globalTrack->GetStsTrackIndex(); //for STS histos
580 CbmStsTrack* cbmStsTrack = (CbmStsTrack*) fStsTrackArray->At(stsTrackIndex);
581 double stsHistoData[NStsHisto] = {
582 (double) cbmStsTrack->GetTotalNofHits(), //NHits
583 cbmStsTrack->GetChiSq() / cbmStsTrack->GetNDF(), //Chi2/NDF
584 TMath::Prob(cbmStsTrack->GetChiSq(), cbmStsTrack->GetNDF()) //prob
585 };
586
587 for (int iH = 0; iH < NStsHisto; iH++) {
588 hStsHisto[0][iH]->Fill(stsHistoData[iH]);
589 }
590
591 int stsTrackMCIndex = trackMatch[stsTrackIndex];
592 if (stsTrackMCIndex >= 0) {
593 int iDir = GetHistoIndex(mcTracks[stsTrackMCIndex].PDG());
594 if (iDir < 3) {
595 for (int iH = 0; iH < NStsHisto; iH++) {
596 hStsHisto[iDir][iH]->Fill(stsHistoData[iH]);
597 }
598 }
599 }
600 else { //ghost
601 for (int iH = 0; iH < NStsHisto; iH++) {
602 hStsHisto[7][iH]->Fill(stsHistoData[iH]);
603 }
604 }
605
606 Int_t muchIndex = globalTrack->GetMuchTrackIndex(); //for MuCh histos
607 if (muchIndex > -1) {
608 CbmMuchTrack* muchTrack = (CbmMuchTrack*) fMuchTrackArray->At(muchIndex);
609
610 int muchTrackMCIndex = trackMuchMatch[muchIndex];
611
612 Double_t* muchHistoData = new Double_t[NMuchHisto];
613 muchHistoData[0] = muchTrack->GetNofHits(); //NHits
614 muchHistoData[1] = GetZtoNStation(muchTrack->GetParamFirst()->GetZ()); //FirstStation
615 muchHistoData[2] = GetZtoNStation(muchTrack->GetParamLast()->GetZ()); //LastStation
616 muchHistoData[3] = muchTrack->GetChiSq() / muchTrack->GetNDF(); //Chi2/NDF
617 muchHistoData[4] = TMath::Prob(muchTrack->GetChiSq(), muchTrack->GetNDF()); //prob
618
619 if (stsTrackMCIndex < 0 || stsTrackMCIndex != muchTrackMCIndex) { //ghost
620 for (int iH = 0; iH < NMuchHisto; iH++) {
621 hMuchHisto[2][iH]->Fill(muchHistoData[iH]);
622 }
623 }
624 else {
625 if (TMath::Abs(mcTracks[stsTrackMCIndex].PDG()) == 13) { //muon
626 for (int iH = 0; iH < NMuchHisto; iH++) {
627 hMuchHisto[0][iH]->Fill(muchHistoData[iH]);
628 }
629 }
630 else { //BG
631 for (int iH = 0; iH < NMuchHisto; iH++) {
632 hMuchHisto[1][iH]->Fill(muchHistoData[iH]);
633 }
634 }
635 }
636 delete[] muchHistoData;
637 }
638
639 //Check RICH quality
640 const FairTrackParam* stsPar = cbmStsTrack->GetParamFirst();
641 TVector3 mom;
642 stsPar->Momentum(mom);
643
644 Double_t p = mom.Mag();
645 Double_t pt = mom.Perp();
646 Double_t pz = sqrt(p * p - pt * pt);
647
649 Int_t richIndex = globalTrack->GetRichRingIndex();
650 if (richIndex > -1) {
651 CbmRichRing* richRing = (CbmRichRing*) fRichRingArray->At(richIndex);
652 if (richRing) {
653 int richTrackMCIndex = -1;
654 CbmTrackMatchNew* richRingMatch = (CbmTrackMatchNew*) fRichRingMatchArray->At(richIndex);
655 if (richRingMatch) {
656 if (richRingMatch->GetNofLinks() > 0) {
657 float bestWeight = 0.f;
658 float totalWeight = 0.f;
659 int bestMCTrackId = -1;
660 for (int iLink = 0; iLink < richRingMatch->GetNofLinks(); iLink++) {
661 totalWeight += richRingMatch->GetLink(iLink).GetWeight();
662 if (richRingMatch->GetLink(iLink).GetWeight() > bestWeight) {
663 bestWeight = richRingMatch->GetLink(iLink).GetWeight();
664 bestMCTrackId = richRingMatch->GetLink(iLink).GetIndex();
665 }
666 }
667 if (bestWeight / totalWeight >= 0.7) {
668 richTrackMCIndex = bestMCTrackId;
669 }
670 }
671 }
672
673 Double_t r = richRing->GetRadius();
674 Double_t axisA = richRing->GetAaxis();
675 Double_t axisB = richRing->GetBaxis();
676
677 hRichRingHisto2D[0][0]->Fill(p, r);
678 hRichRingHisto2D[0][1]->Fill(p, axisA);
679 hRichRingHisto2D[0][2]->Fill(p, axisB);
680
681 int iTrackCategory = -1;
682 if (stsTrackMCIndex < 0) {
683 iTrackCategory = 8; // ghost sts track + any ring
684 }
685 else if (richTrackMCIndex < 0) {
686 iTrackCategory = 9; // normal sts track + ghost ring
687 }
688 else if (stsTrackMCIndex != richTrackMCIndex) {
689 iTrackCategory = 7; // mismatched sts track and ring
690 }
691 else {
692 iTrackCategory = GetHistoIndex(pdg[stsTrackIndex]);
693 }
694
695 if (iTrackCategory < 10) {
696 hRichRingHisto2D[iTrackCategory][0]->Fill(p, r);
697 hRichRingHisto2D[iTrackCategory][1]->Fill(p, axisA);
698 hRichRingHisto2D[iTrackCategory][2]->Fill(p, axisB);
699 }
700 }
701 }
702 }
703
704
705 // Check Trd quality
706 Int_t ntrackTrdMatches = fTrdTrackMatchArray->GetEntriesFast();
707 vector<int> trackTrdMatch(ntrackTrdMatches, -1);
708
709 Double_t eloss = 0;
710 Double_t dedx = 0.0;
711
713 Int_t trdIndex = globalTrack->GetTrdTrackIndex(); //for Trd histos
714 if (trdIndex > -1) {
715 CbmTrdTrack* trdTrack = (CbmTrdTrack*) fTrdTrackArray->At(trdIndex);
716 if (trdTrack) {
717 Int_t trdTrackMCIndex = -1;
718 CbmTrackMatchNew* trdTrackMatch = (CbmTrackMatchNew*) fTrdTrackMatchArray->At(trdIndex);
719 for (int iTr = 0; iTr < ntrackTrdMatches; iTr++) {
720 if (trdTrackMatch->GetNofLinks() == 0) {
721 continue;
722 }
723 Float_t bestWeight = 0.f;
724 Float_t totalWeight = 0.f;
725 for (int iLink = 0; iLink < trdTrackMatch->GetNofLinks(); iLink++) {
726 totalWeight += trdTrackMatch->GetLink(iLink).GetWeight();
727 if (trdTrackMatch->GetLink(iLink).GetWeight() > bestWeight) {
728 bestWeight = trdTrackMatch->GetLink(iLink).GetWeight();
729 trdTrackMCIndex = trdTrackMatch->GetLink(iLink).GetIndex();
730 }
731 }
732 if (bestWeight / totalWeight < 0.7) {
733 continue;
734 }
735 if (trdTrackMCIndex >= nMCTracks || trdTrackMCIndex < 0) {
736 std::cout << "Trd Matching is wrong! TrdTackId = " << trdTrackMCIndex
737 << " N mc tracks = " << nMCTracks << std::endl;
738 continue;
739 }
740
741 mcTracks[trdTrackMCIndex].SetReconstructed();
742 trackTrdMatch[iTr] = trdTrackMCIndex;
743 }
744
745 Double_t* trdHistoData = new Double_t[NTrdHisto];
746 trdHistoData[0] = trdTrack->GetPidWkn(); //Wkn
747 trdHistoData[1] = trdTrack->GetPidANN(); //ANN
748
749
750 for (Int_t iTRD = 0; iTRD < trdTrack->GetNofHits(); iTRD++) {
751 Int_t TRDindex = trdTrack->GetHitIndex(iTRD);
752 CbmTrdHit* trdHit = (CbmTrdHit*) fTrdHitArray->At(TRDindex);
753 eloss += trdHit->GetELoss();
754 }
755 if (trdTrack->GetNofHits() > 0.) {
756 eloss = eloss / trdTrack->GetNofHits(); // average of dE/dx per station
757 }
758 int iTrackCategory = -1;
759 if (stsTrackMCIndex < 0) {
760 iTrackCategory = 8; // ghost sts track + any trd track
761 }
762 else if (trdTrackMCIndex < 0) {
763 iTrackCategory = 9; // normal sts track + ghost trd track
764 }
765 else if (stsTrackMCIndex != trdTrackMCIndex) {
766 iTrackCategory = 7; // mismatched sts track and trd track
767 }
768 else {
769 iTrackCategory = GetHistoIndex(pdg[stsTrackIndex]);
770 }
771
772 for (int iH = 0; iH < NTrdHisto; iH++) {
773 hTrdHisto[0][iH]->Fill(trdHistoData[iH]);
774 hTrdHisto[iTrackCategory][iH]->Fill(trdHistoData[iH]);
775 }
776 dedx = 1e6 * (pz / p) * eloss;
777 hTrdHisto2D[0][0]->Fill(mom.Mag(), dedx);
778 hTrdHisto2D[iTrackCategory][0]->Fill(mom.Mag(), dedx);
779
780 delete[] trdHistoData;
781 }
782 }
783 }
784
785
786 do { // Check Tof quality.
787
788 // ( the use of "do{ .. } while(0);" let us exit the scope with the "break" operator.
789 // it makes the code lighter. )
790
792 break;
793 }
794
795 Int_t tofIndex = globalTrack->GetTofHitIndex(); // for tof histo
796 Int_t stsIndex = globalTrack->GetStsTrackIndex();
797 // std::cout << "tofIndex: " << tofIndex << " stsIndex: " << stsIndex << std::endl;
798
799 if (stsIndex < 0) {
800 break;
801 }
802
803 // check Sts -> Tof matching efficiency
804
805 bool isReconstructible = 0;
806
807 for (Int_t ih = 0; ih < fTofHitMatchArray->GetEntriesFast(); ih++) {
808 CbmMatch* tofHitMatch = (CbmMatch*) fTofHitMatchArray->At(ih);
809 CbmTofPoint* tofPoint = (CbmTofPoint*) fTofPoints->Get(tofHitMatch->GetMatchedLink());
810 if (!tofPoint) {
811 continue;
812 }
813 Int_t tofMCTrackId = tofPoint->GetTrackID();
814 if (tofMCTrackId == stsTrackMCIndex) {
815 isReconstructible = 1;
816 break;
817 }
818 }
819
820 if (stsTrackMCIndex < 0) {
821 isReconstructible = 0;
822 }
823
824 if (isReconstructible) {
825 bool reconstructed = 0;
826 bool mismatched = 0;
827 bool matched = 0;
828 if (tofIndex >= 0) {
829 matched = 1;
830 mismatched = 1;
831 //CbmTofHit* tofHit = (CbmTofHit*) fTofHitArray->At(tofIndex);
832 CbmMatch* tofHitMatch = (CbmMatch*) fTofHitMatchArray->At(tofIndex);
833 CbmTofPoint* tofPoint = (CbmTofPoint*) fTofPoints->Get(tofHitMatch->GetMatchedLink());
834 Int_t tofMCTrackId = tofPoint->GetTrackID();
835 if (tofMCTrackId == stsTrackMCIndex) {
836 reconstructed = 1;
837 mismatched = 0;
838 }
839 }
840
841 int iTrackCategory = GetHistoIndex(pdg[stsTrackIndex]);
842
843 hTofProfiles[0][0]->Fill(p, reconstructed);
844 hTofProfiles[0][1]->Fill(p, mismatched);
845 hTofProfiles[0][2]->Fill(p, !matched);
846
847 hTofProfiles[iTrackCategory][0]->Fill(p, reconstructed);
848 hTofProfiles[iTrackCategory][1]->Fill(p, mismatched);
849 hTofProfiles[iTrackCategory][2]->Fill(p, !matched);
850 }
851
852 if (tofIndex < 0) {
853 break;
854 }
855
856 CbmTofHit* tofHit = (CbmTofHit*) fTofHitArray->At(tofIndex);
857 CbmMatch* tofHitMatch = (CbmMatch*) fTofHitMatchArray->At(tofIndex);
858 CbmTrackMatchNew* stsMatch = (CbmTrackMatchNew*) fStsTrackMatchArray->At(stsIndex);
859 CbmLink tofLink = tofHitMatch->GetMatchedLink();
860
861 // a valid mc link is needed to get the event time
862
863 if (tofLink.GetFile() < 0 || tofLink.GetEntry() < 0) {
864 break;
865 }
866
867 double eventTime = fMcEventList->GetEventTime(tofLink);
868
869 Double_t l = globalTrack->GetLength();
870 Double_t time = tofHit->GetTime() - eventTime;
871 Double_t q = stsPar->GetQp() > 0 ? 1. : -1.;
872 // Double_t beta = l / time / 29.9792458;
873 // std::cout << " l: " << l << " time: " << time << " beta: " << beta << std::endl;
874 Double_t m2 = p * p * (1. / ((l / time / 29.9792458) * (l / time / 29.9792458)) - 1.);
875 // std::cout << "p: " << p << " m2: " << m2 << std::endl;
876
877 hTofHisto2D[0][0]->Fill(p * q, m2);
878 hTofHisto2D[0][1]->Fill(eloss * 1e6, m2);
879
880 if (!tofHit || !tofHitMatch || !stsMatch) {
881 break;
882 }
883
884 CbmTofPoint* tofPoint = (CbmTofPoint*) fTofPoints->Get(tofLink);
885 Int_t tofMCTrackId = tofPoint->GetTrackID();
886 // Double_t tofMCTime = tofPoint->GetTime();
887 // Double_t tofMCl = tofPoint->GetLength();
888 // Double_t MCm2 = p * p * (1. / (( tofMCl/ tofMCTime / 29.9792458) * (tofMCl / tofMCTime / 29.9792458)) - 1.);
889 // hTofHisto2D[0][0]->Fill(p * q, MCm2);
890 // hTofHisto2D[0][1]->Fill(eloss * 1e6, MCm2);
891
892 // std::cout << " mcl: " << tofMCl << " mc time: " << tofMCTime << " mc beta: " << tofMCl/tofMCTime/29.9792458 << std::endl;
893
894 int iHitCategory = -1;
895 if (stsTrackMCIndex < 0) {
896 iHitCategory = 8; // ghost sts track + any tof hit
897 }
898 else if (tofMCTrackId < 0) {
899 iHitCategory = 9; // normal sts track + ghost tof hit
900 }
901 else if (stsTrackMCIndex != tofMCTrackId) {
902 iHitCategory = 7; // mismatched sts track and tof hit
903 }
904 else {
905 iHitCategory = GetHistoIndex(pdg[stsTrackIndex]);
906 }
907
908 hTofHisto2D[iHitCategory][0]->Fill(p * q, m2);
909 hTofHisto2D[iHitCategory][1]->Fill(eloss * 1e6, m2);
910
911 } while (0); // Tof quality
912 }
913 }
914}
915
917{
918 TDirectory* curr = gDirectory;
919 TFile* currentFile = gFile;
920 // Open output file and write histograms
921
922 fOutFile->cd();
924 if (!(fOutFileName == "")) {
925 fOutFile->Close();
926 fOutFile->Delete();
927 }
928 gFile = currentFile;
929 gDirectory = curr;
930}
931
933{
934
935
936 if (!obj->IsFolder()) {
937 obj->Write();
938 }
939 else {
940 TDirectory* cur = gDirectory;
941 TFile* currentFile = gFile;
942
943 TDirectory* sub = cur->GetDirectory(obj->GetName());
944 sub->cd();
945 TList* listSub = (static_cast<TDirectory*>(obj))->GetList();
946 TIter it(listSub);
947 while (TObject* obj1 = it())
948 WriteHistosCurFile(obj1);
949 cur->cd();
950 gFile = currentFile;
951 gDirectory = cur;
952 }
953}
954
956{
957 map<int, int>::iterator it;
958 it = fPDGtoIndexMap.find(TMath::Abs(pdg));
959 if (it != fPDGtoIndexMap.end()) {
960 return it->second;
961 }
962 else {
963 return 6;
964 }
965}
966
968{
969 if (TMath::Abs(getZ - 145) <= 2.0) {
970 return 1;
971 }
972 if (TMath::Abs(getZ - 155) <= 2.0) {
973 return 2;
974 }
975 if (TMath::Abs(getZ - 165) <= 2.0) {
976 return 3;
977 }
978 if (TMath::Abs(getZ - 195) <= 2.0) {
979 return 4;
980 }
981 if (TMath::Abs(getZ - 205) <= 2.0) {
982 return 5;
983 }
984 if (TMath::Abs(getZ - 215) <= 2.0) {
985 return 6;
986 }
987 if (TMath::Abs(getZ - 245) <= 2.0) {
988 return 7;
989 }
990 if (TMath::Abs(getZ - 255) <= 2.0) {
991 return 8;
992 }
993 if (TMath::Abs(getZ - 265) <= 2.0) {
994 return 9;
995 }
996 if (TMath::Abs(getZ - 305) <= 2.0) {
997 return 10;
998 }
999 if (TMath::Abs(getZ - 315) <= 2.0) {
1000 return 11;
1001 }
1002 if (TMath::Abs(getZ - 370) <= 2.0) {
1003 return 13;
1004 }
1005 if (TMath::Abs(getZ - 325) <= 2.0) {
1006 return 12;
1007 }
1008 if (TMath::Abs(getZ - 380) <= 2.0) {
1009 return 14;
1010 }
1011 if (TMath::Abs(getZ - 390) <= 2.0) {
1012 return 15;
1013 }
1014 if (TMath::Abs(getZ - 500) <= 2.0) {
1015 return 16;
1016 }
1017 if (TMath::Abs(getZ - 510) <= 2.0) {
1018 return 17;
1019 }
1020 if (TMath::Abs(getZ - 520) <= 2.0) {
1021 return 18;
1022 }
1023
1024 return -1;
1025}
1026
Int_t nMCTracks
ClassImp(CbmKFTrackQa)
Data class for STS tracks.
static vector< vector< QAMCTrack > > mcTracks
Class for hits in TRD detector.
friend fvec sqrt(const fvec &a)
int32_t GetStsTrackIndex() const
int32_t GetRichRingIndex() const
int32_t GetTofHitIndex() const
int32_t GetMuchTrackIndex() const
double GetLength() const
int32_t GetTrdTrackIndex() const
double GetTime() const
Definition CbmHit.h:76
virtual void Exec(Option_t *opt)
TString fTofHitMatchBranchName
TString fMuchTrackBranchName
static const int NTrdHisto
TH1F * hTrdHisto[14][NTrdHisto]
TClonesArray * fRichRingMatchArray
virtual InitStatus Init()
TH1F * hStsFitHisto[8][10]
TString fStsTrackBranchName
TClonesArray * fTrdTrackArray
CbmMCEventList * fMcEventList
TClonesArray * fTofHitArray
TClonesArray * fTrdHitArray
TString fTrdTrackMatchBranchName
TClonesArray * fMuchTrackArray
TH2F * hTrdHisto2D[14][NTrdHisto2D]
TString fTrdBranchName
TDirectory * fHistoDir
virtual void Finish()
TClonesArray * fMCTrackArray
TClonesArray * fStsTrackMatchArray
TClonesArray * fGlobalTrackArray
TString fOutFileName
TString fTrdHitBranchName
static const int NTofHisto2D
static const int NTofProfiles
int GetHistoIndex(int pdg)
TH2F * hTofHisto2D[14][NTofHisto2D]
static const int NRichRingHisto2D
std::map< int, int > fPDGtoIndexMap
TH1F * hStsHisto[8][NStsHisto]
TH1F * hMuchHisto[3][NMuchHisto]
static const int NMuchHisto
TString fGlobalTrackBranchName
TClonesArray * fStsTrackArray
TString fMCTracksBranchName
TString fRichRingMatchBranchName
static const int NStsHisto
TClonesArray * fMuchTrackMatchArray
TProfile * hTofProfiles[14][NTofProfiles]
TString fTofBranchName
TString fStsTrackMatchBranchName
CbmKFTrackQa(const char *name="CbmKFTrackQa", Int_t iVerbose=0, TString outFileName="CbmKFTrackQa.root")
Int_t GetZtoNStation(Double_t getZ)
TString fRichBranchName
TString fMcEventListBranchName
TH2F * hRichRingHisto2D[10][NRichRingHisto2D]
TClonesArray * fTofHitMatchArray
TFile * fOutFile
void WriteHistosCurFile(TObject *obj)
CbmMCDataArray * fTofPoints
TString fMuchTrackMatchBranchName
TClonesArray * fTrdTrackMatchArray
TClonesArray * fRichRingArray
void Fit(std::vector< CbmStsTrack > &Tracks, const std::vector< CbmMvdHit > &vMvdHits, const std::vector< CbmStsHit > &vStsHits, const std::vector< int > &pidHypo)
Access to a MC data branch for time-based analysis.
TObject * Get(const CbmLink *lnk)
Task class creating and managing CbmMCDataArray objects.
CbmMCDataObject * GetObject(const char *name)
CbmMCDataArray * InitBranch(const char *name)
Container class for MC events with number, file and start time.
double GetEventTime(uint32_t event, uint32_t file)
Event start time.
double GetPz() const
Definition CbmMCTrack.h:72
double GetP() const
Definition CbmMCTrack.h:98
double GetPx() const
Definition CbmMCTrack.h:70
double GetStartZ() const
Definition CbmMCTrack.h:75
int32_t GetMotherId() const
Definition CbmMCTrack.h:69
double GetStartX() const
Definition CbmMCTrack.h:73
int32_t GetPdgCode() const
Definition CbmMCTrack.h:68
double GetStartY() const
Definition CbmMCTrack.h:74
double GetPy() const
Definition CbmMCTrack.h:71
const CbmLink & GetLink(int32_t i) const
Definition CbmMatch.h:39
int32_t GetNofLinks() const
Definition CbmMatch.h:42
const CbmLink & GetMatchedLink() const
Definition CbmMatch.h:41
float GetRadius() const
Definition CbmRichRing.h:79
double GetAaxis() const
Definition CbmRichRing.h:80
double GetBaxis() const
Definition CbmRichRing.h:81
virtual int32_t GetTotalNofHits() const
Definition CbmStsTrack.h:81
Geometric intersection of a MC track with a TOFb detector.
Definition CbmTofPoint.h:44
const FairTrackParam * GetParamLast() const
Definition CbmTrack.h:69
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