PandaRoot
PndTrackingQAMCInfo.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 
20 #pragma once
21 
23 #include "TVector3.h"
24 #include "TString.h"
25 #include "TObject.h"
26 
27 #include "TClonesArray.h"
28 
29 #include "FairLink.h"
30 
31 #include <map>
32 #include <functional>
33 
34 class PndTrackingQAMCInfo : public TObject {
35  public:
37  virtual ~PndTrackingQAMCInfo();
38 
39  void SetdPCA2d(Double_t val) { fdPCA2d = val; }
40  void SetCharge(int ch) { fCharge = ch; }
41  void SetIsPrimary(Bool_t val) { fIsPrimary = val; }
42  void SetVertex(TVector3 val) { fVertex = val; }
43  void SetMomentum(TVector3 val) { fMomentum = val; }
44  void SetPositionFirst(TVector3 pos) { fPosFirst = pos; }
45  void SetMomentumFirst(TVector3 mom) { fMomFirst = mom; }
46  void SetPositionLast(TVector3 pos) { fPosLast = pos; }
47  void SetMomentumLast(TVector3 mom) { fMomLast = mom; }
48  void SetPDGCode(int pdg) { fPDGCode = pdg; }
49  void SetMCTrackID(FairLink mctrackid) { fMCTrackID = mctrackid; }
50  void SetRecoTrackIDs(std::vector<FairLink> recotrkids) { fRecoTrackIDs = recotrkids; }
51  void AddRecoTrackID(FairLink recotrkid) { fRecoTrackIDs.push_back(recotrkid); }
52  void SetAssoRecoTrackID(FairLink asso) { fAssoRecoTrackID = asso; }
53  void SetQuality(int quality) { fQuality = quality; }
54  void SetMCQuality(int mcquality) { fMCQuality = mcquality; }
55  void SetIdealTrackLink(FairLink link) { fIdealTrackLink = link; }
56  void SetNofPoints(TString branchName, int points) { fMapBranchNameMCHits[TrackingQA::StringToBranchEnum(branchName.Data())] = points; }
57 
58  FairLink GetAssoRecoTrackID() const { return fAssoRecoTrackID; }
59  FairLink GetMCTrackID() const { return fMCTrackID; } //< Returns the corresponding MCTrack to an ideal track
60  Short_t GetNofRecoTracks(void) const { return fRecoTrackIDs.size(); } //< Returns the number of reco tracks associated to the ideal track
61  FairLink GetRecoTrackID(Int_t i = 0) const
62  { //< Returns the id of the ith reco track associated to the ideal track
63  if (i < GetNofRecoTracks())
64  return fRecoTrackIDs[i];
65  return FairLink();
66  }
67 
69 
70  Int_t GetNofSttParalPoints() { return fMapBranchNameMCHits[TrackingQA::branchEnum::STTHitParal]; }
71  Int_t GetNofSttSkewPoints() { return fMapBranchNameMCHits[TrackingQA::branchEnum::STTHitSkew]; }
72 
73  Int_t GetNofMCPoints(TString branchName) { return GetNofMCPoints(TrackingQA::StringToBranchEnum(branchName)); }
74 
76  {
77  if (branch == TrackingQA::branchEnum::STTHit) {
78  return GetNofSttPoints();
79  } else {
80  if (fMapBranchNameMCHits.count(branch) > 0)
81  return fMapBranchNameMCHits[branch];
82  else
83  return 0;
84  }
85  }
86 
87  Int_t GetNofMCPoints() const
88  {
89  int nPoints = 0;
90  for (auto val : fMapBranchNameMCHits) {
91  nPoints += val.second;
92  }
93  return nPoints;
94  }
95 
96  TVector3 GetPositionFirst() const { return fPosFirst; }
97  TVector3 GetMomentumFirst() const { return fMomFirst; }
98  TVector3 GetPositionLast() const { return fPosLast; }
99  TVector3 GetMomentumLast() const { return fMomLast; }
100  Double_t GetdPCA2d() const { return fdPCA2d; }
101 
102  Int_t GetCharge() const { return fCharge; }
103  Bool_t GetIsPrimary() const { return fIsPrimary; }
104  TVector3 GetVertex() const { return fVertex; }
105  TVector3 GetStartMomentum() const { return fMomentum; }
106  Int_t GetPDGCode() const { return fPDGCode; }
107  Int_t GetQuality() const { return fQuality; }
108  Int_t GetMCQuality() const { return fMCQuality; }
109  FairLink GetIdealTrackLink() const { return fIdealTrackLink; }
110  std::map<TrackingQA::branchEnum, Int_t> GetMCHits() const { return fMapBranchNameMCHits; }
111 
112  void FindBestRecoTrack(TClonesArray *recoInfo);
113  void FindBestRecoTrack(TClonesArray *recoInfo, std::function<bool(FairLink &, FairLink &)> function);
114 
115  friend std::ostream &operator<<(std::ostream &os, const PndTrackingQAMCInfo &mcInfo)
116  {
117  os << "MCTrack: " << mcInfo.GetMCTrackID() << " MCQuality: " << mcInfo.GetMCQuality() << std::endl;
118  for (auto hits : mcInfo.fMapBranchNameMCHits) {
119  os << "MCInfo " << TrackingQA::BranchEnumToString(hits.first) << " : " << hits.second << std::endl;
120  }
121  os << "RecoTrackIDs: ";
122  for (auto trackID : mcInfo.fRecoTrackIDs)
123  os << trackID << " ";
124  os << std::endl;
125  os << "AssociatedTrackID: " << mcInfo.fAssoRecoTrackID << " Quality: " << mcInfo.GetQuality() << std::endl;
126  return os;
127  }
128 
129  protected:
130  void SetBestRecoTrack(TClonesArray *recoInfo);
131  void SetRecoTrackIsClone(TClonesArray *recoInfo);
132 
133  private:
134  std::map<TrackingQA::branchEnum, Int_t> fMapBranchNameMCHits; // branchID, MCHits
135 
136  FairLink fMCTrackID;
137  std::vector<FairLink> fRecoTrackIDs;
138  TVector3 fPosFirst, fMomFirst;
139  TVector3 fPosLast, fMomLast;
140 
141  Int_t fCharge = -10; //< Charge from MCTrack
142  Bool_t fIsPrimary = kFALSE;
143  TVector3 fVertex = {-10000., -10000., -10000.}; //< Vertex position from MCTrack
144  TVector3 fMomentum; //< Momentum at vertex position from MCTrack
145  Int_t fPDGCode = 0; //< PDG code from MCTrack
146  Double_t fdPCA2d = 0.; //< Distance of closest approach of track circle to primary vertex in xy plane
147 
148  Int_t fQuality = 0;
149  Int_t fMCQuality = 0;
150  FairLink fAssoRecoTrackID; //< Id of the reco track with the highest efficiency (or highest purity if two tracks with identical eff. exist)
151  FairLink fIdealTrackLink;
152  ClassDef(PndTrackingQAMCInfo, 3);
153 };
void SetNofPoints(TString branchName, int points)
TVector3 GetStartMomentum() const
void AddRecoTrackID(FairLink recotrkid)
virtual ~PndTrackingQAMCInfo()
Int_t GetNofMCPoints(TrackingQA::branchEnum branch)
Int_t GetNofMCPoints() const
TVector3 GetVertex() const
void SetMomentumFirst(TVector3 mom)
void SetMomentum(TVector3 val)
unsigned int i
Definition: P4_F32vec4.h:33
void SetMCQuality(int mcquality)
Int_t GetNofMCPoints(TString branchName)
std::map< TrackingQA::branchEnum, Int_t > GetMCHits() const
void SetVertex(TVector3 val)
Double_t GetdPCA2d() const
FairLink GetMCTrackID() const
void SetIdealTrackLink(FairLink link)
void SetIsPrimary(Bool_t val)
TVector3 GetPositionFirst() const
Bool_t GetIsPrimary() const
void SetRecoTrackIsClone(TClonesArray *recoInfo)
void SetPositionLast(TVector3 pos)
Short_t GetNofRecoTracks(void) const
void SetMCTrackID(FairLink mctrackid)
FairLink GetIdealTrackLink() const
TVector3 GetPositionLast() const
void SetMomentumLast(TVector3 mom)
void SetBestRecoTrack(TClonesArray *recoInfo)
void SetQuality(int quality)
void FindBestRecoTrack(TClonesArray *recoInfo)
void SetdPCA2d(Double_t val)
void SetAssoRecoTrackID(FairLink asso)
branchEnum StringToBranchEnum(TString branchString)
FairLink GetAssoRecoTrackID() const
friend std::ostream & operator<<(std::ostream &os, const PndTrackingQAMCInfo &mcInfo)
void SetPositionFirst(TVector3 pos)
void SetRecoTrackIDs(std::vector< FairLink > recotrkids)
FairLink GetRecoTrackID(Int_t i=0) const
TVector3 GetMomentumFirst() const
TString BranchEnumToString(branchEnum branch)
TVector3 GetMomentumLast() const