FairRoot/PandaRoot
PndSttCellTrackFinderTask.cxx
Go to the documentation of this file.
2 
3 #include <iostream>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 
8 // Root includes
9 #include "TROOT.h"
10 #include "TString.h"
11 #include "TClonesArray.h"
12 #include "TParticlePDG.h"
13 
14 // framework includes
15 #include "FairRootManager.h"
16 #include "FairRun.h"
17 #include "FairRuntimeDb.h"
18 #include "FairRunAna.h"
19 #include "FairEventHeader.h"
20 #include "FairField.h"
21 
22 // PndMvd includes
23 #include "PndTrackCand.h"
24 #include "PndRiemannTrack.h"
25 #include "PndSttMapCreator.h"
26 #include "PndSttCellTrackFinder.h"
27 
28 using std::cout;
29 using std::endl;
30 
31 //Macro for printing the calculation times into files called calcTimesCPU*.txt
32 //#define PRINT_CALC_TIMES
33 
35 
37  FairRuntimeDb* rtdb = FairRunAna::Instance()->GetRuntimeDb();
38  fSttParameters = (PndGeoSttPar*) rtdb->getContainer("PndGeoSttPar");
39 }
40 
42  FairRootManager* ioman = FairRootManager::Instance();
43 
44  if (!ioman) {
45  std::cout << "-E- PndSttCellTrackFinderTask::Init: "
46  << "RootManager not instantiated!" << std::endl;
47  return kFATAL;
48  }
49 
50  fEventHeader = (TClonesArray*) ioman->GetObject("EventHeader.");
51  if (!fEventHeader) {
52  cout
53  << "-W- PndSttCellTrackFinderTask::Init: No EventHeader array! Needed for EventNumber"
54  << endl;
55  return kERROR;
56  }
57 
58  if (fHitBranch.size() == 0) {
59  std::cout << "-W- PndSttCellTrackFinderTask::Init: "
60  << "No Branch Names given with AddHitBranch(TString branchName)! Standard BranchNames taken!"
61  << std::endl;
62  fHitBranch.push_back(fInBranchNamePrefix+"STTHit");
63  //fHitBranch.push_back("STTParalHit");
64  //fHitBranch.push_back("STTSkewHit");
65  fHitBranch.push_back("fInBranchNamePrefix+STTCombinedSkewedHits");
66  }
67 
68  for (int i = 0; i < (int) fHitBranch.size(); i++) {
70  }
71  if(fSTTHitArray.size()==0) {
72  std::cout << "No InputBranches containing STTHit data are initialised for the PndSttCellTrackFinderTask" << std::endl;
73  return kERROR;
74  }
75 
76  FairField* Field = FairRunAna::Instance()->GetField();
77  Double_t po[3], BB[3];
78  po[0]=0.;
79  po[1]=0.;
80  po[2]=0.;
81  Field->GetFieldValue(po,BB);
82  cout<<"Field Strength: "<<BB[2]/10.<<endl;
83 
85 
86  fTubeArray = mapper->FillTubeArray();
88 
94  fTrackFinder->SetBz(BB[2]/10.);
96 
97  if (fUseGPU) {
98  //Copy static data to device
99 
100  //Macros were defined in PndSttCellTrackletGenerator.h
101  int numElements = NUM_SKEWED_STRAWS * MAX_SKEWED_NEIGHBORS
103  //allocate cpu memory, initialize with 0 (important for gpu algorithm)
104  int *tubeNeighborings = (int*) calloc(numElements, sizeof(int));
105 
106  PndSttGeometryMap* tmpGeometryMap =
108 
109  PndSttTube* tube;
110  TVector3 pos;
111  TArrayI neighbors;
112  int tubeID;
113  int skewedOffset = NUM_UNSKEWED_STRAWS * MAX_UNSKEWED_NEIGHBORS;
114 
115  //fill array with neighborhood data
116  for (int i = 1; i < fTubeArray->GetEntriesFast(); ++i) {
117  tube = (PndSttTube*) fTubeArray->At(i);
118  tubeID = tube->GetTubeID();
119  neighbors = tmpGeometryMap->GetNeighboringsByMap(tubeID);
120 
121  //store at first data of unskewed tubes in array, at the end of the array: skewed tubes neighborings
122  if (tubeID >= START_TUBE_ID_SKEWED && tubeID <= END_TUBE_ID_SKEWED) {
123  //inner unskewed tube
124  for (int j = 0; j < neighbors.GetSize(); ++j) {
125  tubeNeighborings[skewedOffset + j * NUM_SKEWED_STRAWS
126  + (tubeID - START_TUBE_ID_SKEWED)] = neighbors[j];
127 
128  }
129 
130  } else if (tubeID < START_TUBE_ID_SKEWED) {
131  //middle skewed tube
132  for (int j = 0; j < neighbors.GetSize(); ++j) {
133  tubeNeighborings[j * NUM_UNSKEWED_STRAWS + (tubeID - 1)] =
134  neighbors[j];
135  }
136  } else if (tubeID > END_TUBE_ID_SKEWED) {
137  //outer unskewed tube
138  for (int j = 0; j < neighbors.GetSize(); ++j) {
139  tubeNeighborings[j * NUM_UNSKEWED_STRAWS
140  + (tubeID
142  + 1) - 1)] = neighbors[j];
143  }
144  }
145  }
146 
147  fDev_tubeNeighborings = AllocateStaticData(tubeNeighborings,
148  numElements);
150  free(tubeNeighborings);
151 
152  }
153 
154  if (fAnalyseSteps) {
155  //store information of primary tracklets
156  fFirstTrackCandArray = ioman->Register(fOutBranchNamePrefix+"FirstTrackCand", "PndTrackCand",
157  "STT", fPersistence);
158  fFirstTrackArray = ioman->Register(fOutBranchNamePrefix+"FirstTrack", "PndTrack", "STT",
159  fPersistence);
160  fFirstRiemannTrackArray = ioman->Register(fOutBranchNamePrefix+"FirstRiemannTrack",
161  "PndRiemannTrack", "STT", fPersistence);
162 
163  }
164 
165  fCombiTrackCandArray = ioman->Register(fOutBranchNamePrefix+"CombiTrackCand", "PndTrackCand",
166  "STT", fPersistence);
167  fCombiTrackArray = ioman->Register(fOutBranchNamePrefix+"CombiTrack", "PndTrack", "STT",
168  fPersistence);
169  fCombiRiemannTrackArray = ioman->Register(fOutBranchNamePrefix+"CombiRiemannTrack",
170  "PndRiemannTrack", "STT", fPersistence);
171 
173 
174  fCorrectedIsochronesArray = ioman->Register(fOutBranchNamePrefix+"CorrectedIsochrones",
175  "FairHit", "STT", fPersistence);
176  }
177 
178  std::cout << "-I- PndSttCellTrackFinderTask: Initialisation successfull"
179  << std::endl;
180 
181  //fInitDone = kTRUE;
182  return kSUCCESS;
183 }
184 
185 // ----- Public method Exec --------------------------------------------
187 
188  //FairEventHeader* myEventHeader = (FairEventHeader*) fEventHeader; //[R.K. 01/2017] unused variable?
189  //int eventNumber = myEventHeader->GetMCEntryNumber(); //[R.K. 01/2017] unused variable?
190 
191  if (fVerbose > 0) {
192  cout
193  << "====================Begin PndSttCellTrackFinderTask::Exec======================="
194  << endl;
195 
196  }
197  //cout << "Event #" << eventNumber << endl;
198 
199 // Reset output array
201  Fatal("Exec", "No trackCandArray");
202 
203  fTrackFinder->Reset();
204 
205 
206  for (int i = 0; i < (int) fSTTHitBranch.size(); i++) {
208  }
209 
211 
212  if (fAnalyseSteps) {
213  for (int i = 0; i < fTrackFinder->NumFirstTrackCands(); i++) {
214  //PndTrackCand* myCand = //[R.K.03/2017] unused variable
215  new ((*fFirstTrackCandArray)[i]) PndTrackCand(
217  }
218 
219  for (int i = 0; i < fTrackFinder->NumFirstRiemannTracks(); ++i) {
220  //PndRiemannTrack* myTrack = //[R.K.03/2017] unused variable
221  new ((*fFirstRiemannTrackArray)[i]) PndRiemannTrack(
223  }
224  }
225 
226  for (int i = 0; i < fTrackFinder->NumCombinedTracks(); ++i) {
227  PndTrackCand* myCand = new ((*fCombiTrackCandArray)[i]) PndTrackCand(
229  PndTrack* myTrack = new ((*fCombiTrackArray)[i]) PndTrack(
231  myTrack->SetTrackCandRef(myCand);
232  myTrack->SetTrackCand(*myCand);
233 
234  }
235 
236  for (int i = 0; i < fTrackFinder->NumCombinedRiemannTracks(); ++i) {
237  //PndRiemannTrack* myRiemannTrack = //[R.K.03/2017] unused variable
238  new ((*fCombiRiemannTrackArray)[i]) PndRiemannTrack(
240  }
241 
243  std::map<int, FairHit*> correctedIsochrones =
245 
246  //int indexCounter = 0;
247  for (std::map<int, FairHit*>::iterator iter =
248  correctedIsochrones.begin(); iter != correctedIsochrones.end();
249  iter++) {
250  //FairHit* myCorrectedHit = //[R.K.03/2017] unused variable
251  new ((*fCorrectedIsochronesArray)[fCorrectedIsochronesArray->GetEntries()]) FairHit(*iter->second);
252  }
253  }
254 
255  if (fVerbose > 0)
256  cout << "#FirstTracklets: " << fTrackFinder->GetNumPrimaryTracklets()
257  << ", #CombinedTracklets: " << fTrackFinder->NumCombinedTracks()
258  << endl;
259 
260  //fCombiTrackCandArray->Sort(); //WALTER CHANGED HERE!!!!!!!!!!!!!!!!
261  //fCombiTrackArray->Sort(); //WALTER CHANGED HERE!!!!!!!!!!!!!!!!
262 
263 }
264 
266  if (fAnalyseSteps) {
267  fFirstTrackCandArray->Delete();
268  fFirstRiemannTrackArray->Delete();
269  }
270  fCombiTrackCandArray->Delete();
271  fCombiTrackArray->Delete();
272  fCombiRiemannTrackArray->Delete();
274  fCorrectedIsochronesArray->Delete();
275 
276  vector<int> numHits;
277  numHits.push_back(fTrackFinder->NumHits());
278  numHits.push_back(fTrackFinder->NumHitsWithoutDouble());
279  numHits.push_back(fTrackFinder->NumUnambiguousNeighbors());
280  fNumHitsPerEvent.push_back(numHits);
281 
282 }
283 
285 
286  if (fUseGPU) {
288  }
289 
290 #ifdef PRINT_CALC_TIMES
291  // write calculation times, calcTimesTrackletGen.size()=#Events, calcTimesTrackletGen[i].size()=#measured times for Event #i
292  vector<vector<Double_t> > calcTimesTrackletGen =
294  vector<vector<Double_t> > calcTimesNeighborhood = fTrackFinder->GetTimeStampsGenerateNeighborhoodData();
295 
296  FILE* fp = fopen("calcTimesCPU.txt", "w");
297  fprintf(fp,
298  "%3s \t %3s \t %3s \t %3s \t %10s \t %10s \t %10s \t %10s \t %10s \t %10s \t %10s \t %10s \t %10s \t %10s \t %10s \n",
299  "#E", "#H", "#HWD", "#UHWD", "EvaluateState()", "InitStartTracklets()",
300  "EvaluateMultiState()", "GenerateTracklets()",
301  "CombineTrackletsMultiStages()", "AssignAmbiguousHits()",
302  "SplitData()", "AddMissingHits()", "CreatePndTrackCands()",
303  "FindTracks()", "CalcNeighborData");
304  for (int i = 0; i < calcTimesTrackletGen.size(); ++i) {
305  fprintf(fp, "%3i \t %3i \t %3i \t %3i", i, fNumHitsPerEvent.at(i).at(0), fNumHitsPerEvent.at(i).at(1), fNumHitsPerEvent.at(i).at(2));
306  //trackletGen data
307  for (int j = 0; j < calcTimesTrackletGen[i].size(); j += 2) {
308  fprintf(fp, "\t %.15f",
309  (calcTimesTrackletGen[i].at(j + 1) - calcTimesTrackletGen[i].at(j)) * 1000);
310  }
311  //neighborhood data
312  fprintf(fp, "\t %.15f",
313  (calcTimesNeighborhood[i].at(1) - calcTimesNeighborhood[i].at(0)) * 1000);
314 
315  fprintf(fp, "\n");
316  }
317 
318  fclose(fp);
319 #endif
320 
321 }
322 
324  TClonesArray* tempArray =
325  (TClonesArray*) FairRootManager::Instance()->GetObject(branchName);
326  if (tempArray == 0) {
327  std::cout << "-W- PndSttCellTrackFinderTask::Init: "
328  << "No hitArray for BranchName #############################################" << branchName.Data()
329  << std::endl;
330  }
331  if ( strcmp(tempArray->GetClass()->GetName(), "PndSttHit") == 0){
332  fSTTHitArray.push_back(tempArray);
333  fSTTHitBranch.push_back(branchName);
334  }
335 }
336 
TVector3 pos
Int_t i
Definition: run_full.C:25
void SetClusterTime(double val)
ClassImp(PndSttCellTrackFinderTask)
std::vector< TString > fHitBranch
void SetDevTubeNeighboringsPointer(int *dev_pointer)
PndSttCellTrackFinder * fTrackFinder
void SetRunTimeBased(Bool_t val)
PndRiemannTrack GetCombiRiemannTrack(int i)
void SetCalcFirstTrackletInf(Bool_t val)
void SetTrackCandRef(PndTrackCand *candPointer)
Definition: PndTrack.h:44
std::vector< std::vector< int > > fNumHitsPerEvent
#define START_TUBE_ID_SKEWED
#define NUM_UNSKEWED_STRAWS
std::vector< TString > fSTTHitBranch
virtual void Exec(Option_t *opt)
#define MAX_SKEWED_NEIGHBORS
std::vector< TClonesArray * > fSTTHitArray
std::vector< std::vector< Double_t > > GetTimeStampsTrackletGen()
PndRiemannTrack GetFirstRiemannTrack(int i)
Int_t GetTubeID()
Definition: PndSttTube.cxx:103
Double_t
PndSttCellTrackFinderData * GetTrackFinderDataObject()
PndSttGeometryMap * GetGeometryMap() const
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
TClonesArray * FillTubeArray()
void InitHitArray(TString branchName)
#define END_TUBE_ID_SKEWED
#define MAX_UNSKEWED_NEIGHBORS
void AddHits(TClonesArray *hits, TString branchName)
PndTrackCand GetFirstTrackCand(int i)
void SetCalcWithCorrectedIsochrones(Bool_t val)
void SetTrackCand(const PndTrackCand &cand)
Definition: PndTrack.h:43
#define NUM_SKEWED_STRAWS
std::vector< std::vector< Double_t > > GetTimeStampsGenerateNeighborhoodData()
int * AllocateStaticData(int *, int)
PndTrackCand GetCombiTrackCand(int i)
std::map< Int_t, FairHit * > GetCorrectedIsochrones()
TArrayI GetNeighboringsByMap(int tubeId)
void FreeStaticData(int *)