CbmRoot
Loading...
Searching...
No Matches
CbmTofHitFinderTBQa.cxx
Go to the documentation of this file.
1/* Copyright (C) 2017-2020 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
5/*
6 * To change this license header, choose License Headers in Project Properties.
7 * To change this template file, choose Tools | Templates
8 * and open the template in the editor.
9 */
10
11#include "CbmTofHitFinderTBQa.h"
12
13#include "CbmMCDataManager.h"
14#include "CbmMatch.h"
15#include "CbmTofAddress.h"
16#include "CbmTofHit.h"
17#include "CbmTofPoint.h"
18
19#include <FairRootManager.h>
20#include <Logger.h>
21
22#include "TH1.h"
23#include <TFile.h>
24
25using std::cout;
26using std::endl;
27using std::list;
28using std::pair;
29using std::set;
30using std::vector;
31
32/*
33struct TofHitDesc
34{
35 CbmTofHit hit;
36 list<const CbmTofPoint*> pointRefs;
37};
38
39struct TofPointDesc
40{
41 CbmTofPoint point;
42 Int_t trackId;
43 list<const CbmTofHit*> hitRefs;
44};
45
46struct TrackDesc
47{
48 list<CbmTofPoint*> tofPoints;
49 list<CbmTofDigiExp> topDigis;
50 list<CbmTofDigiExp> bottomDigis;
51 list<TofHitDesc*> tofHits;
52};
53
54static vector<vector<TofHitDesc> > tofHitsAll;
55static vector<vector<TofPointDesc> > tofPointsAll;
56static vector<vector<TrackDesc> > tofTracksAll;
57*/
58
59struct QAMCTrack;
60
61struct QAMCPoint {
62 double x;
63 double y;
64 double t;
65 int detId;
67 bool isInit;
68
69 // QAMCPoint() : x(0.), y(0.), t(0.), detId(0), track(nullptr), isInit(false) {}
70};
71
72struct QAHit {
73 double x;
74 double dx;
75 double y;
76 double dy;
77 double t;
78 double dt;
79 set<const QAMCPoint*> points;
80 set<const QAMCTrack*> tracks;
81 int detId;
82
83 QAHit() : x(0.), dx(0.), y(0.), dy(0.), t(0.), dt(0.), points(), tracks(), detId(0) {}
84
85 QAHit(double _x, double _dx, double _y, double _dy, double _t, double _dt, set<const QAMCPoint*> _points,
86 set<const QAMCTrack*> _tracks, int _detId)
87 : x(_x)
88 , dx(_dx)
89 , y(_y)
90 , dy(_dy)
91 , t(_t)
92 , dt(_dt)
93 , points(_points)
94 , tracks(_tracks)
95 , detId(_detId)
96 {
97 }
98};
99
100struct QAMCTrack {
101 list<const QAMCPoint*> points;
102 list<const QAHit*> hits;
104};
105
106static vector<vector<QAMCTrack>> mcTracks;
107static vector<vector<QAMCPoint>> mcPoints;
108static vector<vector<QAHit>> hits;
109
110static TH1F* deltaTHisto = 0;
111static TH1F* deltaXHisto = 0;
112static TH1F* deltaYHisto = 0;
113static TH1F* pullTHisto = 0;
114static TH1F* pullXHisto = 0;
115static TH1F* pullYHisto = 0;
116static TH1F* nofHitsHisto = 0;
117static TH1F* nofTracksDepositedHisto = 0;
118
120 : isEvByEv(false)
121 , fTofHits(0)
122 , fTofDigiMatchs(0)
123 , fTofDigis(0)
124 , fTofDigiPointMatchs(0)
125 , fTofMCPoints(0)
126 , fMCTracks(0)
127 , fTimeSlice(0)
128 , fEventList(0)
129{
130}
131
133{
134 FairRootManager* ioman = FairRootManager::Instance();
135
136 if (0 == ioman) LOG(fatal) << "No FairRootManager";
137
138 fTofHits = static_cast<TClonesArray*>(ioman->GetObject("TofHit"));
139 fTofDigiMatchs = static_cast<TClonesArray*>(ioman->GetObject("TofDigiMatch"));
140 fTofDigis = static_cast<TClonesArray*>(ioman->GetObject("TofDigiExp"));
141 fTofDigiPointMatchs = static_cast<TClonesArray*>(ioman->GetObject("TofDigiMatchPoints"));
142
143 CbmMCDataManager* mcManager = static_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
144 fTofMCPoints = mcManager->InitBranch("TofPoint");
145 fMCTracks = mcManager->InitBranch("MCTrack");
146 /*tofHitsAll.resize(1000);
147 tofPointsAll.resize(1000);
148 tofTracksAll.resize(1000);
149
150 for (int i = 0; i < 1000; ++i)
151 {
152 Int_t nofmct = fMCTracks->Size(0, i);
153
154 for (int j = 0; j < nofmct; ++j)
155 tofTracksAll[i].push_back( { {}, {}, {}, {} } );
156
157 Int_t evSize = fTofMCPoints->Size(0, i);
158
159 for (int j = 0; j < evSize; ++j)
160 {
161 CbmTofPoint tp = *static_cast<const CbmTofPoint*> (fTofMCPoints->Get(0, i, j));
162 tofPointsAll[i].push_back( { tp, tp.GetTrackID(), {} } );
163 tofTracksAll[i][tp.GetTrackID()].tofPoints.push_back(&(tofPointsAll[i].back().point));
164 }
165 }*/
166
167 mcTracks.resize(1000);
168 mcPoints.resize(1000);
169 hits.resize(1000);
170
171 fTimeSlice = static_cast<CbmTimeSlice*>(ioman->GetObject("TimeSlice."));
172
173 if (0 == fTimeSlice) LOG(fatal) << "No time slice";
174
175 fEventList = static_cast<CbmMCEventList*>(ioman->GetObject("MCEventList."));
176
177 if (0 == fEventList) LOG(fatal) << "No event list";
178
179 for (int i = 0; i < 1000; ++i) {
180 vector<QAMCTrack>& evMcTracks = mcTracks[i];
181 vector<QAMCPoint>& evMcPoints = mcPoints[i];
182
183 Int_t nofmct = fMCTracks->Size(0, i);
184
185 if (nofmct > 0) evMcTracks.resize(nofmct);
186
187 Int_t nofmcp = fTofMCPoints->Size(0, i);
188
189 if (nofmcp > 0) evMcPoints.resize(nofmcp);
190
191 for (int j = 0; j < nofmcp; ++j) {
192 const CbmTofPoint* tp = static_cast<const CbmTofPoint*>(fTofMCPoints->Get(0, i, j));
193 int trackId = tp->GetTrackID();
194 evMcPoints[j] = {tp->GetX(), tp->GetY(), tp->GetTime(), tp->GetDetectorID(), &evMcTracks[trackId], false};
195 const QAMCPoint* lastPoint = &evMcPoints[j];
196 evMcTracks[trackId].points.push_back(lastPoint);
197 }
198 }
199
200 deltaTHisto = new TH1F("deltaTHisto", "deltaTHisto", 100, -1., 1.);
201 deltaXHisto = new TH1F("deltaXHisto", "deltaXHisto", 100, -5., 5.);
202 deltaYHisto = new TH1F("deltaYHisto", "deltaYHisto", 100, -5., 5.);
203 pullTHisto = new TH1F("pullTHisto", "pullTHisto", 100, -5., 5.);
204 pullXHisto = new TH1F("pullXHisto", "pullXHisto", 100, -5., 5.);
205 pullYHisto = new TH1F("pullYHisto", "pullYHisto", 100, -5., 5.);
206 nofHitsHisto = new TH1F("nofHitsHisto", "nofHitsHisto", 5, 0., 5.);
207 nofTracksDepositedHisto = new TH1F("nofTracksDepositedHisto", "nofTracksDepositedHisto", 8, 0., 8.);
208
209 return kSUCCESS;
210}
211
212static Int_t currentEvN = 0;
213// static int minEntry = 100000; (VF) not used
214// static int maxEntry = -100000; (VF) not used
215static int globalNofHits = 0;
216static int globalNofDigis = 0;
217
219{
220 /*vector<TofHitDesc>& tofHitsEv = tofHitsAll[currentEvN];
221 Int_t nofHits = fTofHits->GetEntriesFast();
222
223 for (Int_t i = 0; i < nofHits; ++i)
224 {
225 CbmTofHit hit = *static_cast<const CbmTofHit*> (fTofHits->At(i));
226 tofHitsEv.push_back( { hit, {} } );
227 TofHitDesc& lastHit = tofHitsEv.back();
228 int nofRefs = lastHit.pointRefs.size();
229 const CbmMatch* pDigiMatch = static_cast<const CbmMatch*> (fTofDigiMatchs->At(i));
230 Int_t nofDigis = pDigiMatch->GetNofLinks();
231 set<pair<Int_t, Int_t> > trackIds;
232
233 for (Int_t j = 0; j < nofDigis; ++j)
234 {
235 const CbmLink& lnk = pDigiMatch->GetLink(j);
236 Int_t digiInd = lnk.GetIndex();
237 Int_t digiEvN = lnk.GetEntry();
238 CbmTofDigiExp* pDigi = static_cast<CbmTofDigiExp*> (fTofDigis->At(digiInd));
239 const CbmMatch* pPointMatch = pDigi->GetMatch();
240 Int_t nofPoints = pPointMatch->GetNofLinks();
241
242 for (Int_t k = 0; k < nofPoints; ++k)
243 {
244 const CbmLink& pointLnk = pPointMatch->GetLink(k);
245 Int_t evN = pointLnk.GetEntry() - 1;
246 Int_t pointInd = pointLnk.GetIndex();
247
248 int qq = 0;
249
250 if (evN >= tofPointsAll.size())
251 ++qq;
252 else if (pointInd >= tofPointsAll[evN].size())
253 ++qq;
254
255 lastHit.pointRefs.push_back(&(tofPointsAll[evN][pointInd].point));
256 tofPointsAll[evN][pointInd].hitRefs.push_back(&(lastHit.hit));
257
258 if (tofPointsAll[evN][pointInd].trackId >= tofTracksAll[evN].size())
259 ++qq;
260
261 if (tofPointsAll[evN][pointInd].trackId < 0)
262 ++qq;
263
264 trackIds.insert( { evN, tofPointsAll[evN][pointInd].trackId } );
265 }
266 }
267
268 for (set<pair<Int_t, Int_t> >::const_iterator j = trackIds.begin(); j != trackIds.end(); ++j)
269 tofTracksAll[j->first][j->second].tofHits.push_back(&lastHit);
270 }
271
272 Int_t nofAllDigis = fTofDigis->GetEntriesFast();
273
274 for (Int_t i = 0; i < nofAllDigis; ++i)
275 {
276 const CbmTofDigiExp* pDigi = static_cast<const CbmTofDigiExp*> (fTofDigis->At(i));
277 const CbmMatch* pPointMatch = pDigi->GetMatch();
278 Int_t nofPoints = pPointMatch->GetNofLinks();
279 set<pair<Int_t, Int_t> > trackIds;
280
281 for (Int_t j = 0; j < nofPoints; ++j)
282 {
283 const CbmLink& pointLnk = pPointMatch->GetLink(j);
284
285 int entry = pointLnk.GetEntry();
286
287 if (minEntry > entry)
288 minEntry = entry;
289
290 if (maxEntry < entry)
291 maxEntry = entry;
292
293 Int_t evN = pointLnk.GetEntry() - 1;
294 Int_t pointInd = pointLnk.GetIndex();
295 trackIds.insert( { evN, tofPointsAll[evN][pointInd].trackId } );
296 }
297
298 for (set<pair<Int_t, Int_t> >::const_iterator j = trackIds.begin(); j != trackIds.end(); ++j)
299 {
300 if (0 == pDigi->GetSide())
301 tofTracksAll[j->first][j->second].topDigis.push_back(*pDigi);
302 else
303 tofTracksAll[j->first][j->second].bottomDigis.push_back(*pDigi);
304 }
305 }*/
306
307 hits.push_back({});
308 vector<QAHit>& evHits = hits[currentEvN];
309 Int_t nofHits = fTofHits->GetEntriesFast();
310 evHits.resize(nofHits);
311 globalNofHits += nofHits;
312 Int_t nofDigis = fTofDigis->GetEntriesFast();
313 globalNofDigis += nofDigis;
314
315 for (int i = 0; i < nofHits; ++i) {
316 const CbmTofHit* hit = static_cast<const CbmTofHit*>(fTofHits->At(i));
317 const CbmMatch* hitMatch = static_cast<const CbmMatch*>(fTofDigiMatchs->At(i));
318 // evHits[i] = { hit->GetX(), hit->GetDx(), hit->GetY(), hit->GetDy(), hit->GetTime(), hit->GetTimeError(), {}, {}, CbmTofAddress::GetModFullId(hit->GetAddress()) } ;
319 evHits[i] = QAHit {hit->GetX(),
320 hit->GetDx(),
321 hit->GetY(),
322 hit->GetDy(),
323 hit->GetTime(),
324 hit->GetTimeError(),
325 set<const QAMCPoint*> {},
326 set<const QAMCTrack*> {},
328 QAHit& lastHit = evHits[i];
329
330 nofDigis = hitMatch->GetNofLinks();
331
332 for (int j = 0; j < nofDigis; ++j) {
333 const CbmLink& lnk = hitMatch->GetLink(j);
334 Int_t digiInd = lnk.GetIndex();
335 // CbmTofDigiExp* pDigi = static_cast<CbmTofDigiExp*> (fTofDigis->At(digiInd)); (VF) not used
336 const CbmMatch* pPointMatch = static_cast<const CbmMatch*>(fTofDigiPointMatchs->At(digiInd));
337
338 Int_t nofPoints = pPointMatch->GetNofLinks();
339
340 for (Int_t k = 0; k < nofPoints; ++k) {
341 const CbmLink& pointLnk = pPointMatch->GetLink(k);
342 Int_t evN = pointLnk.GetEntry() - 1;
343 Int_t pointInd = pointLnk.GetIndex();
344 lastHit.points.insert(&mcPoints[evN][pointInd]);
345 lastHit.tracks.insert(mcPoints[evN][pointInd].track);
346
347 if (!mcPoints[evN][pointInd].isInit) {
348 double eventTime = fEventList->GetEventTime(evN + 1, 0);
349 mcPoints[evN][pointInd].t += eventTime;
350 mcPoints[evN][pointInd].isInit = true;
351 }
352 }
353 }
354
355 set<QAMCTrack*> tracks;
356
357 for (set<const QAMCPoint*>::const_iterator j = lastHit.points.begin(); j != lastHit.points.end(); ++j) {
358 const QAMCPoint* point = *j;
359 tracks.insert(point->track);
360 }
361
362 for (set<QAMCTrack*>::iterator j = tracks.begin(); j != tracks.end(); ++j) {
363 QAMCTrack* track = *j;
364 track->hits.push_back(&lastHit);
365 }
366 }
367
368 ++currentEvN;
369}
370
371static void SaveHisto(TH1* histo)
372{
373 TFile* curFile = TFile::CurrentFile();
374 TString histoName = histo->GetName();
375 histoName += ".root";
376 TFile fh(histoName.Data(), "RECREATE");
377 histo->Write();
378 fh.Close();
379 delete histo;
380 TFile::CurrentFile() = curFile;
381}
382
384{
385 /*cout << "min entry = " << minEntry << endl;
386 cout << "max entry = " << maxEntry << endl;
387 int nofHits = 0;
388 int nofPoints = 0;
389 int nofPointsWithHits = 0;
390 int nofMCTracks = 0;
391 int nofMCTracksWithHits = 0;
392 int nofMCTracksWithDigis = 0;
393 int nofMCTracksWithBothDigis = 0;
394
395 for (int i = 0; i < 1000; ++i)
396 {
397 nofHits += tofHitsAll[i].size();
398 nofPoints += tofPointsAll[i].size();
399
400 for (int j = 0; j < tofPointsAll[i].size(); ++j)
401 {
402 if (!tofPointsAll[i][j].hitRefs.empty())
403 ++nofPointsWithHits;
404 }
405
406 for (int j = 0; j < tofTracksAll[i].size(); ++j)
407 {
408 if (!tofTracksAll[i][j].tofPoints.empty())
409 {
410 ++nofMCTracks;
411
412 if (!tofTracksAll[i][j].tofHits.empty())
413 {
414 ++nofMCTracksWithHits;
415
416 for(list<TofHitDesc*>::const_iterator k = tofTracksAll[i][j].tofHits.begin(); k != tofTracksAll[i][j].tofHits.end(); ++k)
417 {
418 const TofHitDesc* hitDesc = *k;
419 const CbmTofHit* hit = &(hitDesc->hit);
420 set<Int_t> detIds;
421 int nofRefs = hitDesc->pointRefs.size();
422
423 for (list<const CbmTofPoint*>::const_iterator l = hitDesc->pointRefs.begin(); l != hitDesc->pointRefs.end(); ++l)
424 {
425 const CbmTofPoint* point = *l;
426 detIds.insert(point->GetDetectorID());
427 }
428
429 Double_t x = 0;
430 Double_t y = 0;
431 int nofPts = 0;
432
433 for(list<CbmTofPoint*>::const_iterator l = tofTracksAll[i][j].tofPoints.begin(); l != tofTracksAll[i][j].tofPoints.end(); ++l)
434 {
435 const CbmTofPoint* point = *l;
436
437 if (detIds.find(point->GetDetectorID()) == detIds.end())
438 continue;
439
440 x += point->GetX();
441 y += point->GetY();
442 ++nofPts;
443 }
444
445 if (nofPts > 0)
446 {
447 deltaXHisto->Fill(hit->GetX() - x / nofPts);
448 deltaYHisto->Fill(hit->GetY() - y / nofPts);
449 }
450
451 nofHitsHisto->Fill(tofTracksAll[i][j].tofHits.size());
452 }
453 }
454
455 if (!tofTracksAll[i][j].topDigis.empty() || !tofTracksAll[i][j].bottomDigis.empty())
456 ++nofMCTracksWithDigis;
457
458 if (!tofTracksAll[i][j].topDigis.empty() && !tofTracksAll[i][j].bottomDigis.empty())
459 {
460 ++nofMCTracksWithBothDigis;
461
462 if (tofTracksAll[i][j].tofHits.empty())
463 {
464 for (list<CbmTofDigiExp>::const_iterator k = tofTracksAll[i][j].topDigis.begin(); k != tofTracksAll[i][j].topDigis.end(); ++k)
465 {
466 for (list<CbmTofDigiExp>::const_iterator l = tofTracksAll[i][j].bottomDigis.begin(); l != tofTracksAll[i][j].bottomDigis.end(); ++l)
467 deltaTHisto->Fill(k->GetTime() - l->GetTime());
468 }
469 }
470 }
471 }
472 }
473 }
474
475 cout << "NOF hits = " << nofHits << ", NOF MC points = " << nofPoints << ", NOF MC points with hits = " << nofPointsWithHits << ", NOF MC tracks = " << nofMCTracks
476 << ", NOF MC tracks with hits = " << nofMCTracksWithHits << ", NOF MC tracks with digis = " << nofMCTracksWithDigis << ", NOF MC tracks with both digis = "
477 << nofMCTracksWithBothDigis << endl;*/
478
479 int nofTracksTof = 0;
480 int nofTracksHit = 0;
481 int nofMCEvents = 0;
482
483 for (vector<vector<QAMCTrack>>::const_iterator i = mcTracks.begin(); i != mcTracks.end(); ++i) {
484 const vector<QAMCTrack>& evTracks = *i;
485
486 if (!evTracks.empty()) ++nofMCEvents;
487
488 for (vector<QAMCTrack>::const_iterator j = evTracks.begin(); j != evTracks.end(); ++j) {
489 const QAMCTrack& track = *j;
490
491 if (!track.points.empty()) {
492 ++nofTracksTof;
493
494 if (!track.hits.empty()) ++nofTracksHit;
495 }
496
497 for (list<const QAHit*>::const_iterator k = track.hits.begin(); k != track.hits.end(); ++k) {
498 const QAHit* hit = *k;
499 //set<int> detIds;
500 set<const QAMCPoint*> hitPoints;
501
502 //if (hit->points.empty())
503 //continue;
504
505 double x = 0;
506 double y = 0;
507 double t = 0;
508
509 /*for (set<const QAMCPoint*>::const_iterator l = hit->points.begin(); l != hit->points.end(); ++l)
510 {
511 const QAMCPoint* point = *l;
512 //x += point->x;
513 //y += point->y;
514 //t += point->t;
515 detIds.insert(point->detId);
516 }*/
517
518 for (list<const QAMCPoint*>::const_iterator l = track.points.begin(); l != track.points.end(); ++l) {
519 const QAMCPoint* point = *l;
520
521 //if (detIds.find(point->detId) != detIds.end())
522 if (point->isInit && hit->detId == point->detId) hitPoints.insert(point);
523 }
524
525 if (hitPoints.empty()) continue;
526
527 for (set<const QAMCPoint*>::const_iterator l = hitPoints.begin(); l != hitPoints.end(); ++l) {
528 const QAMCPoint* point = *l;
529 x += point->x;
530 y += point->y;
531 t += point->t;
532 }
533
534 int nofPoints = hitPoints.size(); //hit->points.size();//hitPoints.size();
535 double deltaX = hit->x - x / nofPoints;
536 double deltaY = hit->y - y / nofPoints;
537 double deltaT = hit->t - t / nofPoints;
538 deltaXHisto->Fill(deltaX);
539 deltaYHisto->Fill(deltaY);
540 deltaTHisto->Fill(deltaT);
541 pullXHisto->Fill(deltaX / hit->dx);
542 pullYHisto->Fill(deltaY / hit->dy);
543 pullTHisto->Fill(deltaT / hit->dt);
544 }
545 }
546 }
547
548 int nofHitEvents = 0;
549 int nofHits = 0;
550 int nofSingleHits = 0;
551
552 for (vector<vector<QAHit>>::const_iterator i = hits.begin(); i != hits.end(); ++i) {
553 const vector<QAHit>& evHits = *i;
554
555 if (!evHits.empty()) ++nofHitEvents;
556
557 nofHits += evHits.size();
558
559 for (vector<QAHit>::const_iterator j = evHits.begin(); j != evHits.end(); ++j) {
560 const QAHit& hit = *j;
561 nofTracksDepositedHisto->Fill(hit.tracks.size());
562
563 if (hit.tracks.size() == 1) ++nofSingleHits;
564 }
565 }
566
575
576 double eff = 100 * nofTracksHit;
577 eff /= nofTracksTof;
578 cout << "Clustering efficiency: " << eff << " % [ " << nofTracksHit << " / " << nofTracksTof << " ]" << endl;
579 cout << "NOF hit events: " << nofHitEvents << endl;
580 cout << "NOF hits: " << nofHits << endl;
581 cout << "NOF hits2: " << globalNofHits << endl;
582 cout << "NOF digis: " << globalNofDigis << endl;
583 cout << "NOF MC Events: " << nofMCEvents << endl;
584 eff = 100 * nofSingleHits;
585 eff /= nofHits;
586 cout << "Pure hits: " << eff << " % [ " << nofSingleHits << " / " << nofHits << " ]" << endl;
587}
588
TClonesArray * tracks
ClassImp(CbmConverterManager)
static Int_t currentEvN
static vector< vector< QAMCTrack > > mcTracks
static TH1F * deltaTHisto
static TH1F * pullTHisto
static TH1F * pullXHisto
static vector< vector< QAMCPoint > > mcPoints
static TH1F * nofTracksDepositedHisto
static TH1F * deltaXHisto
static TH1F * pullYHisto
static TH1F * deltaYHisto
static void SaveHisto(TH1 *histo)
static TH1F * nofHitsHisto
static int globalNofDigis
static int globalNofHits
static vector< vector< QAHit > > hits
double GetTimeError() const
Definition CbmHit.h:77
double GetTime() const
Definition CbmHit.h:76
int32_t GetAddress() const
Definition CbmHit.h:74
TObject * Get(const CbmLink *lnk)
Int_t Size(Int_t fileNumber, Int_t eventNumber)
Task class creating and managing CbmMCDataArray objects.
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.
const CbmLink & GetLink(int32_t i) const
Definition CbmMatch.h:39
int32_t GetNofLinks() const
Definition CbmMatch.h:42
double GetDy() const
Definition CbmPixelHit.h:76
double GetDx() const
Definition CbmPixelHit.h:75
double GetY() const
Definition CbmPixelHit.h:74
double GetX() const
Definition CbmPixelHit.h:73
Bookkeeping of time-slice content.
static int32_t GetModFullId(uint32_t address)
CbmMCEventList * fEventList
void Exec(Option_t *option)
CbmMCDataArray * fTofMCPoints
CbmMCDataArray * fMCTracks
TClonesArray * fTofDigiPointMatchs
TClonesArray * fTofDigiMatchs
Geometric intersection of a MC track with a TOFb detector.
Definition CbmTofPoint.h:44
set< const QAMCPoint * > points
set< const QAMCTrack * > tracks
QAHit(double _x, double _dx, double _y, double _dy, double _t, double _dt, set< const QAMCPoint * > _points, set< const QAMCTrack * > _tracks, int _detId)
QAMCTrack * track
list< const QAHit * > hits
list< const QAMCPoint * > points