FairRoot/PandaRoot
PndPatternDBGenerator.cxx
Go to the documentation of this file.
1 /*
2  * PndPatternDBGenerator.cxx
3  *
4  * Created on: Nov 8, 2017
5  * Author: Michael Papenbrock
6  */
7 
8 #include <FairRootManager.h>
9 #include <FairRunAna.h>
10 #include <FairRuntimeDb.h>
11 #include <PndSttMapCreator.h>
12 #include <PndSttTube.h>
13 #include <PndTrackCand.h>
14 #include <TClonesArray.h>
15 #include "PndPatternDBGenerator.h"
16 
18 
20  fSttParameters = NULL;
21  fEventHeader = NULL;
22  fTubeArray = NULL;
23  fSttHitArray = NULL;
24  fMCTrackArray = NULL;
25  trackCands = NULL;
26  sttBranchID = -1;
27  mcTrackID = -1;
28 
29  foutputFile = NULL;
30  fsectorPatternTree = NULL;
31  ftrackPatternTree = NULL;
32  bPattern = NULL;
33  foutputFilename = "patternDB.root";
34 
35  nTotalTracks = 0;
36  nMultipleMCTrackLinks = 0;
37 }
38 
40 }
41 
43  FairRuntimeDb *rtdb = FairRunAna::Instance()->GetRuntimeDb();
44  fSttParameters = (PndGeoSttPar*) rtdb->getContainer("PndGeoSttPar");
45 }
47  std::cout << "Filename for pattern DB: " << foutputFilename << std::endl;
48  foutputFile = new TFile(foutputFilename,"RECREATE");
49  fsectorPatternTree = new TTree("sectorPatterns","Tree containing sector patterns");
50  fsectorPatternTree->Branch("pattern",&bPattern);
51  ftrackPatternTree = new TTree("trackPatterns","Tree containing track patterns");
52  ftrackPatternTree->Branch("pattern",&bPattern);
53 
54 // Get instance of the FairRootManager to access tree branches
55  FairRootManager *ioman = FairRootManager::Instance();
56  if(!ioman) {
57  std::cout << "-E- PndPatternDBGenerator::Init: FairRootManager not instantiated!" << std::endl;
58  return kFATAL;
59  }
60 
61 // Get the EventHeader
62  fEventHeader = (TClonesArray*) ioman->GetObject("EventHeader.");
63  if(!fEventHeader) {
64  std::cout << "-E- PndPatternDBGenerator::Init: EventHeader not loaded!" << std::endl;
65  return kFATAL;
66  }
67 
68 // Access STTHit branch and determine its branch ID
69  fSttHitArray = (TClonesArray*) ioman->GetObject("STTHit");
70  sttBranchID = ioman->GetBranchId("STTHit");
71 
72 // Initialise STT map and get array of all tubes
74  fTubeArray = mapper->FillTubeArray();
75 
76 // Access MCTrack branch and determine its branch ID
77  fMCTrackArray = (TClonesArray*) ioman->GetObject("MCTrack");
78  mcTrackID = ioman->GetBranchId("MCTrack");
79 
80 // Get track candidates from ideal track finder
81  trackCands = (TClonesArray*) ioman->GetObject("SttMvdGemIdealTrackCand");
82 
83  std::cout << "-I- PndPatternDBGenerator: Initialisation successful" << std::endl;
84  return kSUCCESS;
85 }
86 void PndPatternDBGenerator::Exec(Option_t* /*opt*/) { //[R.K. 9/2018] unused
88 }
90  fsectorPatternTree->AutoSave();
91  ftrackPatternTree->AutoSave();
92  foutputFile->Close();
93 
94  std::cout << "Total number of tracks found: " << nTotalTracks << std::endl;
95  std::cout << "Number of track with multiple MCTrack links: " << nMultipleMCTrackLinks << std::endl;
96  float ratio = 100. * (float)nMultipleMCTrackLinks / (float)nTotalTracks;
97  std::cout << "Ratio: " << ratio << "%" << std::endl;
98 }
99 
101 // This method generates hit patterns for each track
102 
103 // Get FairRootManager instance to access objects through FairLinks
104  FairRootManager *ioman = FairRootManager::Instance();
105 
106 // Loop over all track candidates
107  short nTrackCands = trackCands->GetEntriesFast();
108  for (int iTrackCand = 0; iTrackCand < nTrackCands; ++iTrackCand) {
109 // Get the next track candidate
110  PndTrackCand *cand = (PndTrackCand*) trackCands->At(iTrackCand);
111 // Get the FairLinks from the candidate pointing at STTHit branch
112  FairMultiLinkedData sttLinks = cand->GetLinksWithType(sttBranchID);
113 // Construct sttHitArray for each track candidate,
114 // taking into account all STTHits of the corresponding track
115  HitArray sttHitArray;
116  for (int iLink = 0; iLink < sttLinks.GetNLinks(); ++iLink) {
117  FairLink sttLink = sttLinks.GetLink(iLink);
118  PndSttHit *sttHit = (PndSttHit*) ioman->GetCloneOfLinkData(sttLink);
119  sttHitArray.push_back(sttHit);
120  }
121 // Get link to corresponding MC track
122  FairMultiLinkedData mcTrackLinks = cand->GetLinksWithType(mcTrackID);
123 // Check if only one MC track was found
124  nTotalTracks++;
125  if (mcTrackLinks.GetNLinks() == 0) {
126  std::cout << "WARNING: PndPatternDBGenerator::GenerateTrackPatterns: No MCTrackfound, skipping event!" << std::endl;
127  continue;
128  }
129  if (mcTrackLinks.GetNLinks() > 1) {
131  std::cout << "WARNING: PndPatternDBGenerator::GenerateTrackPatterns: Found more than one MCTrack link!!!" << std::endl;
132  }
133 // Get only first link since only one should be associated with track candidate
134  FairLink mcTrackLink = mcTrackLinks.GetLink(0);
135  PndMCTrack *mcTrack = (PndMCTrack*) ioman->GetCloneOfLinkData(mcTrackLink);
136 
137  PndPatterns sectorPatterns = FillSectorPatterns(sttHitArray, mcTrack);
138  AddPatternsToTree(sectorPatterns,fsectorPatternTree);
139  PndPatterns trackPatterns = FillTrackPatterns(sttHitArray, mcTrack);
140  AddPatternsToTree(trackPatterns,ftrackPatternTree);
141  }
142 }
144  HitSectorMap hitMap;
145  for (auto const& sttHit : sttHitArray) {
146  short tubeID = sttHit->GetTubeID();
147  PndSttTube *tube = (PndSttTube*) fTubeArray->At(tubeID);
148  short sectorID = tube->GetSectorID();
149  hitMap.insert(std::make_pair(sectorID, tubeID));
150  }
151  return hitMap;
152 }
154  PndPatterns patterns;
155  HitSectorMap hitMap = FillSectorHitMap(sttHitArray);
156  TVector3 momentum = mcTrack->GetMomentum();
157  for (int iSector = 0; iSector < 6; ++iSector) {
158  auto hitMapSectorRange = hitMap.equal_range(iSector);
159  PndPattern pattern;
160  pattern.SetSectorID(iSector);
161  pattern.AddMomentum(momentum);
162  for (auto iter = hitMapSectorRange.first; iter != hitMapSectorRange.second; ++iter) {
163  int tubeID = iter->second;
164  pattern.AddTubeID(tubeID);
165  }
166  pattern.RaisePatternCount();
167  if (!pattern.IsEmpty()) {
168  patterns.push_back(pattern);
169  }
170  }
171 
172  return patterns;
173 }
175  PndPatterns patterns;
176  TVector3 momentum = mcTrack->GetMomentum();
177  PndPattern pattern;
178  pattern.SetSectorID(-1); // sectorID undefined for whole track patterns
179  pattern.AddMomentum(momentum);
180  for (auto const& sttHit: sttHitArray) {
181  int tubeID = sttHit->GetTubeID();
182  pattern.AddTubeID(tubeID);
183  }
184  pattern.RaisePatternCount();
185  if (!pattern.IsEmpty()) {
186  patterns.push_back(pattern);
187  }
188 
189  return patterns;
190 }
192  for (auto pattern: patterns) {
193  bPattern = &pattern;
194  tree->Fill();
195  }
196 }
virtual InitStatus Init()
std::vector< PndPattern > PndPatterns
TTree * tree
Definition: plot_dirc.C:12
TVector3 GetMomentum() const
Definition: PndMCTrack.h:78
HitSectorMap FillSectorHitMap(HitArray sttHitArray)
std::multimap< int, int > HitSectorMap
PndPatterns FillTrackPatterns(HitArray hitArray, PndMCTrack *mcTrack)
void RaisePatternCount()
Definition: PndPattern.h:28
void SetSectorID(int sectorID)
Definition: PndPattern.h:23
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
TClonesArray * FillTubeArray()
virtual void Exec(Option_t *opt)
void AddMomentum(TVector3 momentum)
Definition: PndPattern.h:24
void AddPatternsToTree(PndPatterns patterns, TTree *tree)
void AddTubeID(int tubeID)
Definition: PndPattern.h:26
bool IsEmpty()
Definition: PndPattern.cxx:28
ClassImp(PndAnaContFact)
PndPatterns FillSectorPatterns(HitArray hitArray, PndMCTrack *mcTrack)
std::vector< PndSttHit * > HitArray
int GetSectorID()
Definition: PndSttTube.cxx:124