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