PandaRoot
PndTrackingQATimebased.h
Go to the documentation of this file.
1 //****************************************************************************
2 //* This file is part of PandaRoot. *
3 //* *
4 //* PandaRoot is distributed under the terms of the *
5 //* GNU General Public License (GPL) version 3, *
6 //* copied verbatim in the file "LICENSE". *
7 //* *
8 //* Copyright (C) 2006 - 2024 FAIR GmbH and copyright holders of PandaRoot *
9 //* The copyright holders are listed in the file "COPYRIGHTHOLDERS". *
10 //* The authors are listed in the file "AUTHORS". *
11 //****************************************************************************
12 
13 /*
14  * PndTrackingQATimebased.h
15  *
16  * Created on: Aug 23, 2013
17  * Author: stockman
18  */
19 
20 #ifndef PndTrackingQATimebased_H_
21 #define PndTrackingQATimebased_H_
22 
23 #include "FairMultiLinkedData.h"
24 #include "FairRootManager.h"
25 
26 #include "PndMCTrack.h"
27 #include "PndTrack.h"
28 #include "PndTrackCand.h"
30 #include "PndTrackingCloneInfo.h"
31 
32 #include <TObject.h>
33 #include <TString.h>
34 #include <TClonesArray.h>
35 
36 #include <vector>
37 #include <map>
38 
39 #include <functional>
40 #include "PndTrackFunctor.h"
41 
53  static const int
54  // Following: Default statuses.
55  // Are the 'not found' tracks in the quality histogram of PndTrackingQualityTask.
56  kPossibleSec = -1, // possible: As defined through the possibleFunctor; secondary: a non-primary particle
57  kPossiblePrim = -2, // possible: As defined through the possibleFunctor; primary: coming directly from particle generator (e.g. EvtGen)
58  kAtLeastThreeSec = -3, // atLeastThree: min. 3 hit points in central tracking detectors (MVD, STT, GEM); secondary: a non-primary particle
59  kAtLeastThreePrim = -4, // atLeastThree: min. 3 hit points in central tracking detectors (MVD, STT, GEM); primary: coming directly from particle generator (e.g. EvtGen)
60  kLessThanThreePrim = -5, // LessThanThree: fewer than 3 hit points in central tracking detectors (MVD, STT, GEM); primar: coming directly from particle generator (e.g. EvtGen)
61 
62  // Following: MC statuses of all (found+notfound) tracks
63  kMcPossibleSec = -7, // see above
65  kMcAllTracksWithHits = -12, // sum of -7 - -10
66  kMcAllTracks = -13, // sum of -11 and -12
67 
68  // Following: Status of reconstructed tracks (= created PndTracks)
69  kPartiallyImpure = 1, // PartiallyImpure: at least 70% of hits of reco'd track come from one MC track ('mostProbableTrack')
70  kPartiallyPure = 2, // PartiallyPure: all hits of reco'd track come from one single MC track; at least 70% of hits of MC track have been found in reco'd track
71  kFullyImpure = 3, // FullyImpure: all hits of MC track have been found in reco'd track but some impurities from other tracks are allowed
72  kFullyPure = 4, // FullyPure: all hits of reco'd track come from one single MC track; all hits of MC track have been found in reco'd track
73 
74  kGhost = 5, // ghost: less than 70% of hits of reco'd track come from one MC track ('mostProbableTrack')
75  kClone = 6, // clone: sum of (number of times one mc track was found -1) over all mc tracks
76 
77  kNotFound = 7, // notFound: total number of not reco'd tracks
78  kFound = 8; // found: total number of reco'd tracks; the sum of FullyPure, FullyImpure, PartiallyPure, PartiallyImpure
79 
80  static std::string QualityNumberToString(int qNumber)
81  {
82  if (qNumber == kPossiblePrim)
83  return "PossiblePrimary";
84  if (qNumber == kPossibleSec)
85  return "PossibleSec";
86  if (qNumber == kAtLeastThreeSec)
87  return "AtLeastThreeSec";
88  if (qNumber == kAtLeastThreePrim)
89  return "AtLeastThreePrim";
90  if (qNumber == kLessThanThreePrim)
91  return "LessThanThreePrim";
92  if (qNumber == kMcPossibleSec)
93  return "McPossibleSec";
94  if (qNumber == kMcAtLeastThreeSec)
95  return "McAtLeastThreeSec";
96  if (qNumber == kMcAtLeastThreePrim)
97  return "McAtLeastThreePrim";
98  if (qNumber == kMcLessThanThreePrim)
99  return "McLessThanThreePrim";
100  if (qNumber == kMcAllTracksWithHits)
101  return "McAllTracksWithHits";
102  if (qNumber == kMcAllTracks)
103  return "McAllTracks";
104  if (qNumber == kPartiallyImpure)
105  return "PartiallyImpure";
106  if (qNumber == kPartiallyPure)
107  return "PartiallyPure";
108  if (qNumber == kFullyPure)
109  return "FullyPure";
110  if (qNumber == kFullyImpure)
111  return "FullyImpure";
112  if (qNumber == kGhost)
113  return "Ghost";
114  if (qNumber == kClone)
115  return "Clone";
116  if (qNumber == kNotFound)
117  return "NotFound";
118  if (qNumber == kFound)
119  return "Found";
120  return std::to_string(qNumber);
121  };
122 };
123 
124 class PndTrackingQATimebased : public TObject {
125  public:
126  PndTrackingQATimebased(TString trackBranchName, TString idealTrackName, Bool_t pndTrackData = kTRUE);
127  PndTrackingQATimebased(TString trackBranchName, TString idealTrackName, PndTrackFunctor *posTrack, Bool_t pndTrackData = kTRUE);
128  virtual ~PndTrackingQATimebased();
129 
130  virtual void Init();
131  void SetVerbose(Int_t val) { fVerbose = val; }
132 
134  void AddHitsBranchName(TString name) { fBranchNames.push_back(name); }
135  void SetHitsBranchNames(std::vector<TString> names) { fBranchNames = names; }
136  void SetSecondaryDefinitionPCAXY(double dPCA)
137  {
138  fSecondaryDefinitionPCAXY = kTRUE;
139  fdPCA = dPCA;
140  }
141 
142  void AnalyseEvent(TClonesArray *recoTrackInfo);
143 
144  // Int_t GetNIdealHits(Int_t trackId, TString branchName);
145  Int_t GetNIdealHits(FairMultiLinkedData &track, TString branchName);
146  std::map<Int_t, Int_t> GetMCTrackFound() { return fMCTrackFound; }
147  std::map<FairLink, Int_t> GetMCTrackFoundTimeBased() { return fTimeBasedMCTrackFound; }
148  std::map<Int_t, Int_t> GetTrackQualification() { return fMapTrackQualification; }
149  std::map<FairLink, Int_t> GetTrackQualificationTimeBased() { return fTimeBasedMapTrackQualification; }
150  std::map<Int_t, Int_t> GetTrackMCStatus() { return fMapTrackMCStatus; }
151  std::map<FairLink, Int_t> GetTrackMCStatusTimeBased() { return fTimeBasedMapTrackMCStatus; }
152  std::map<Int_t, std::map<TString, std::pair<Double_t, Int_t>>> GetEfficiencies() { return fMapEfficiencies; }
153  std::map<FairLink, std::map<TString, std::pair<Double_t, Int_t>>> GetEfficienciesTimeBased() { return fMapEfficienciesTimeBased; }
154 
155  // Event based
156  std::map<Int_t, Double_t> GetPResolution() { return fMapPResolution; }
157  std::map<Int_t, TVector3> GetP() { return fMapP; }
158  std::map<Int_t, Double_t> GetPtResolution() { return fMapPtResolution; }
159  std::map<Int_t, Double_t> GetPt() { return fMapPt; }
160  std::map<Int_t, Double_t> GetPlResolution() { return fMapPlResolution; }
161  std::map<Int_t, Double_t> GetPl() { return fMapPl; }
162  std::map<Int_t, Double_t> GetPResolutionRel() { return fMapPResolutionRel; }
163  std::map<Int_t, Double_t> GetPtResolutionRel() { return fMapPtResolutionRel; }
164  std::map<Int_t, Double_t> GetPlResolutionRel() { return fMapPlResolutionRel; }
165 
166  // Time based
167  std::map<FairLink, Double_t> GetTimeBasedPResolution() { return fTimeBasedMapPResolution; }
168  std::map<FairLink, TVector3> GetTimeBasedP() { return fTimeBasedMapP; }
169  std::map<FairLink, Double_t> GetTimeBasedPtResolution() { return fTimeBasedMapPtResolution; }
170  std::map<FairLink, Double_t> GetTimeBasedPt() { return fTimeBasedMapPt; }
171  std::map<FairLink, Double_t> GetTimeBasedPlResolution() { return fTimeBasedMapPlResolution; }
172  std::map<FairLink, Double_t> GetTimeBasedPl() { return fTimeBasedMapPl; }
173  std::map<FairLink, Double_t> GetTimeBasedPResolutionRel() { return fTimeBasedMapPResolutionRel; }
174  std::map<FairLink, Double_t> GetTimeBasedPtResolutionRel() { return fTimeBasedMapPtResolutionRel; }
175  std::map<FairLink, Double_t> GetTimeBasedPlResolutionRel() { return fTimeBasedMapPlResolutionRel; }
176 
177  std::map<Int_t, Int_t> GetTrackIdMCId() { return fTrackIdMCId; }
178  Int_t GetNGhosts() { return fNGhosts; }
179  Int_t GetNClones() { return fNClones; }
180 
181  void PrintTrackDataSummary(FairMultiLinkedData &trackData, Bool_t detailedInfo = kFALSE);
182  void PrintTrackDataSummaryCompare(FairMultiLinkedData &recoTrackData, FairMultiLinkedData &idealTrackData);
183 
187  void PrintTrackQualityMap(Bool_t detailedInfo = kFALSE);
188  void PrintTrackMCStatusMap();
189  void PrintTrackInfo(std::map<TString, FairMultiLinkedData> info);
190 
191  Int_t GetIdealTrackIdFromMCTrackId(int mctrackid)
192  {
193  if (fMCIdIdealTrackId.count(mctrackid) == 0)
194  return -1;
195  return fMCIdIdealTrackId[mctrackid];
196  }
197  // Time based verson
198  FairLink GetIdealTrackFairLinkFromMCTrackFairLink(FairLink mctrackFairLink)
199  {
200  // if (fTimeBasedMCIdIdealTrackId.count(mctrackFairLink) == 0) return -1;
201  return fTimeBasedMCIdIdealTrackId[mctrackFairLink];
202  }
204  {
205  int mctrackid = fTrackIdMCId[trackid];
206  if (fMCIdIdealTrackId.count(mctrackid) == 0)
207  return -1;
208  return fMCIdIdealTrackId[mctrackid];
209  }
210 
211  void SetRunTimeBased(bool runTimeBased) { fRunTimeBased = runTimeBased; }
212 
213  PndTrackingQualityRecoInfo GetRecoInfoFromRecoTrack(Int_t trackId, Int_t mctrackId, FairLink mctrackFairLink);
214  PndTrackingQualityRecoInfo GetRecoInfoFromRecoTrackTimeBased(FairLink recoFairLink, Int_t mctrackId, FairLink mctrackFairLink);
215  std::map<FairLink, Int_t> GetCloneInfoforMCTrack() { return fTimeBasedMapTrackMCStatus; };
216 
217  std::vector<double> GetEventPurityVector() { return fEventPurityVector; }
218 
219  private:
220  virtual void FillMapTrackQualifikation();
221  Bool_t IsBetterTrackExisting(Int_t &mcIndex, int quality);
222  // virtual Bool_t PossibleTrack(FairMultiLinkedData& mcForward);
223  Int_t GetSumOfAllValidMCHits(FairMultiLinkedData *trackData);
224  // AnalyseTrackInfo used event based, in this case the track id is set to an Int_t
225  virtual Int_t AnalyseTrackInfo(std::map<TString, FairMultiLinkedData> &trackInfo, Int_t trackId);
226  // Analyse track info used time based, in this case the track id is set to a FairLink
227  FairLink AnalyseTrackInfoTimeBased(std::map<TString, FairMultiLinkedData> &trackInfo, FairLink trackId);
228  virtual void CalcEfficiencies(Int_t mostProbableTrack, std::map<TString, FairMultiLinkedData> &trackInfo);
229  virtual void CalcEfficienciesTimeBased(FairLink mostProbableTrackFairLink, std::map<TString, FairMultiLinkedData> &trackInfo);
230  FairMultiLinkedData
231  GetMCInfoForBranch(TString branchName, PndTrackCand *trackCand);
232  std::map<TString, FairMultiLinkedData>
233  AnalyseTrackCand(PndTrackCand *trackCand);
234  double CalcPCAXY(PndTrack *track);
235  // virtual Bool_t IsCorrectGemHit(FairLink& gemLink);
236 
237  FairRootManager *ioman;
238  // Double_t fTotClonesTimeBased;
239  TString fTrackBranchName;
240  TString fIdealTrackName;
241  Bool_t fPndTrackOrTrackCand; // kTRUE if track and kFALSE if track cand
242  std::string fPossibleTrackName;
243  PndTrackFunctor *fPossibleTrack;
244  Bool_t fCleanFunctor;
245  Int_t fNGhosts;
246  Int_t fNClones;
247  Bool_t fUseCorrectedSkewedHits;
248  Bool_t fRunTimeBased;
249  Int_t fVerbose;
250  bool fSecondaryDefinitionPCAXY;
251  double fdPCA;
252 
253  std::vector<TString> fBranchNames;
254  std::map<Int_t, Int_t> fTrackIdMCId;
255  std::map<Int_t, Int_t> fMCIdTrackId;
256  std::map<Int_t, Int_t> fMCIdIdealTrackId;
257 
259 
260  std::map<FairLink, FairLink> fTimeBasedTrackIdMCId;
261  std::map<FairLink, FairLink> fTimeBasedMCIdTrackId;
262  std::map<FairLink, FairLink> fTimeBasedMCIdIdealTrackId;
263  FairMultiLinkedData linksMCTrack;
264 
265  std::map<Int_t, Int_t> fMCTrackFound;
266  std::map<FairLink, Int_t> fTimeBasedMCTrackFound;
267 
268  std::map<Int_t, Int_t> fMapTrackMCStatus;
269  std::map<FairLink, Int_t> fTimeBasedMapTrackMCStatus;
270  // Used event based
271  std::map<Int_t, Int_t> fMapTrackQualification;
272  std::map<FairLink, Int_t> fTimeBasedMapTrackQualification; // Used time based, the FairLink is that of the MC track
273 
274  std::map<Int_t, std::map<TString, std::pair<Double_t, Int_t>>> fMapEfficiencies;
275  std::map<FairLink, std::map<TString, std::pair<Double_t, Int_t>>> fMapEfficienciesTimeBased;
276 
277  // Event based maps
278  std::map<Int_t, Double_t> fMapPResolution;
279  std::map<Int_t, TVector3> fMapP;
280  std::map<Int_t, Double_t> fMapPtResolution;
281  std::map<Int_t, Double_t> fMapPt;
282  std::map<Int_t, Double_t> fMapPResolutionRel;
283  std::map<Int_t, Double_t> fMapPtResolutionRel;
284  std::map<Int_t, Double_t> fMapPlResolution;
285  std::map<Int_t, Double_t> fMapPl;
286  std::map<Int_t, Double_t> fMapPlResolutionRel;
287 
288  // Time based maps
289  std::map<FairLink, Double_t> fTimeBasedMapPResolution;
290  std::map<FairLink, TVector3> fTimeBasedMapP;
291  std::map<FairLink, Double_t> fTimeBasedMapPtResolution;
292  std::map<FairLink, Double_t> fTimeBasedMapPt;
293  std::map<FairLink, Double_t> fTimeBasedMapPResolutionRel;
294  std::map<FairLink, Double_t> fTimeBasedMapPtResolutionRel;
295  std::map<FairLink, Double_t> fTimeBasedMapPlResolution;
296  std::map<FairLink, Double_t> fTimeBasedMapPl;
297  std::map<FairLink, Double_t> fTimeBasedMapPlResolutionRel;
298 
299  TClonesArray *fTrack;
300  TClonesArray *fMCTrack;
301  TClonesArray *fIdealTrack;
302  TClonesArray *fTrackCand;
303  TClonesArray *fIdealTrackCand;
304 
305  double fEventPurity;
306  std::vector<double> fEventPurityVector;
307 
308  std::map<int, int> fMapHitIdTimesUsedInEvent;
309  std::map<int, int> fMapHitIdTimesUsedInTrack;
310 
311  ClassDef(PndTrackingQATimebased, 1)
312 };
313 
314 #endif /* PNDTRACKINGQUALITY_H_ */
std::map< FairLink, Double_t > GetTimeBasedPl()
std::map< Int_t, std::map< TString, std::pair< Double_t, Int_t > > > GetEfficiencies()
std::map< FairLink, Double_t > GetTimeBasedPResolution()
std::map< Int_t, Double_t > GetPtResolutionRel()
std::map< Int_t, TVector3 > GetP()
Int_t GetIdealTrackIdFromRecoTrackId(int trackid)
static const int kMcAtLeastThreeSec
std::map< FairLink, Int_t > GetTrackQualificationTimeBased()
static const int kGhost
std::map< FairLink, Int_t > GetCloneInfoforMCTrack()
void SetRunTimeBased(bool runTimeBased)
static const int kLessThanThreePrim
static const int kPossiblePrim
static const int kAtLeastThreeSec
std::map< Int_t, Double_t > GetPlResolutionRel()
std::map< FairLink, std::map< TString, std::pair< Double_t, Int_t > > > GetEfficienciesTimeBased()
static const int kMcPossibleSec
std::map< Int_t, Int_t > GetTrackMCStatus()
static const int kPartiallyPure
std::map< FairLink, Double_t > GetTimeBasedPt()
std::map< Int_t, Double_t > GetPResolutionRel()
std::map< FairLink, Double_t > GetTimeBasedPlResolution()
static std::string QualityNumberToString(int qNumber)
static const int kPossibleSec
static const int kPartiallyImpure
void SetHitsBranchNames(std::vector< TString > names)
std::map< Int_t, Int_t > GetTrackIdMCId()
std::map< FairLink, TVector3 > GetTimeBasedP()
static const int kAtLeastThreePrim
FairLink GetIdealTrackFairLinkFromMCTrackFairLink(FairLink mctrackFairLink)
std::map< Int_t, Double_t > GetPl()
std::vector< double > GetEventPurityVector()
Holding statically callable quality numbers.
std::map< Int_t, Double_t > GetPlResolution()
static const int kMcLessThanThreePrim
std::map< FairLink, Int_t > GetMCTrackFoundTimeBased()
static const int kMcAllTracksWithHits
std::map< Int_t, Double_t > GetPt()
std::map< FairLink, Int_t > GetTrackMCStatusTimeBased()
static const int kFound
std::map< FairLink, Double_t > GetTimeBasedPtResolutionRel()
static const int kMcAllTracks
static const int kFullyImpure
void AddHitsBranchName(TString name)
Adds branch names of detector data which should be taken into account in the analysis.
std::map< Int_t, Int_t > GetTrackQualification()
std::map< FairLink, Double_t > GetTimeBasedPtResolution()
static const int kMcAtLeastThreePrim
std::map< FairLink, Double_t > GetTimeBasedPlResolutionRel()
std::map< Int_t, Double_t > GetPResolution()
std::map< Int_t, Double_t > GetPtResolution()
static const int kClone
void SetSecondaryDefinitionPCAXY(double dPCA)
Int_t GetIdealTrackIdFromMCTrackId(int mctrackid)
std::map< Int_t, Int_t > GetMCTrackFound()
std::map< FairLink, Double_t > GetTimeBasedPResolutionRel()
static const int kMcPossiblePrim
static const int kFullyPure
static const int kNotFound