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