FairRoot/PandaRoot
PndMvdRiemannTrackFinderTask.cxx
Go to the documentation of this file.
2 
3 #include <iostream>
4 
5 // Root includes
6 #include "TROOT.h"
7 #include "TString.h"
8 #include "TClonesArray.h"
9 #include "TParticlePDG.h"
10 
11 // framework includes
12 #include "FairRootManager.h"
13 #include "FairRun.h"
14 #include "FairRuntimeDb.h"
15 #include "FairRunAna.h"
16 
17 // PndMvd includes
18 #include "PndTrackCand.h"
20 
21 #include "PndSttMapCreator.h"
22 
23 
25  FairTask("MVD Riemann Track Finder"),
26  fHitBranch(),
27  fTrackBranch(""),
28  fEventNr(0),
29  fMaxSZChi2(1),
30  fMaxSZDist(10),
31  fMinPointDist(1),
32  fMaxDist(1),
33  fB(2.0),
34  fHitArray(),
35  fTrackCandArray(NULL),
36  fRiemannTrackArray(NULL),
37  fTrackArray(NULL),
38  fCutDistH(NULL),
39  fCutChi2H(NULL),
40  fInitDone(kFALSE),
41  fPersistence(kTRUE),
42  fStopFunctor(NULL),
43  fTimeGapFunctor(NULL),
44  fSttParameters(NULL),
45  fTubeArray(NULL)
46 {
48 }
49 
51 {
52 }
53 
55 {
56  FairRuntimeDb* rtdb = FairRunAna::Instance()->GetRuntimeDb();
57  fSttParameters = (PndGeoSttPar*) rtdb->getContainer("PndGeoSttPar");
58 }
59 
61 {
62  InitStatus stat=kSUCCESS;
63  return stat;
64 }
65 
66 // ----- Public method Init --------------------------------------------
68 {
69  FairRootManager* ioman = FairRootManager::Instance();
70 
71  if ( ! ioman )
72  {
73  std::cout << "-E- PndMvdRiemannTrackFinderTask::Init: "
74  << "RootManager not instantiated!" << std::endl;
75  return kFATAL;
76  }
77 
78  // Get input array
79 // if (FairRunAna::Instance()->IsTimeStamp()){
80 // if (fTimeBasedHitBranch.size() == 0){
81 // std::cout << "-W- PndMvdRiemannTrackFinderTask::Init: " << "No Branch Names given with AddHitBranch(TString branchName)! Standard BranchNames taken!" << std::endl;
82 // fTimeBasedHitBranch.push_back(FairTSBufferParameters("MVDHitsPixel", new TimeGap(), 10));
83 // }
84 // }
85  if (fHitBranch.size() == 0){
86  std::cout << "-W- PndMvdRiemannTrackFinderTask::Init: " << "No Branch Names given with AddHitBranch(TString branchName)! Standard BranchNames taken!" << std::endl;
87  fHitBranch.push_back("MVDHitsPixel");
88  fHitBranch.push_back("MVDHitsStrip");
89  fHitBranch.push_back("STTHit");
90  fHitBranch.push_back("GEMHit");
91  }
92 
93  for (int i = 0; i < (int)fHitBranch.size(); i++){
95  }
96 
97 
98 
99  fTrackCandArray = new TClonesArray("PndTrackCand");
100  ioman->Register("MVDRiemannTrackCand", "MVD", fTrackCandArray, fPersistence);
101 
102  fTrackArray = new TClonesArray("PndTrack");
103  ioman->Register("MVDTrack", "MVD", fTrackArray, fPersistence);
104 
105  fRiemannTrackArray = new TClonesArray("PndRiemannTrack");
106 // ioman->Register("MVDRiemannTrack", "MVD", fRiemannTrackArray, kTRUE);
107 
108 
109  fStopFunctor= new StopTime();
110  fTimeGapFunctor = new TimeGap();
111 
113  fTubeArray = mapper->FillTubeArray();
114 
115  std::cout << "-I- PndMvdRiemannTrackFinderTask: Initialisation successfull" << std::endl;
116  fInitDone = kTRUE;
117  return kSUCCESS;
118 }
119 
121 {
122  if (fInitDone == kFALSE)
123  fHitBranch.push_back(branchName);
124  else
125  std::cout << "-W- AddHitBranch has to be called before the Init() of the task!" << std::endl;
126 }
127 
128 //void PndMvdRiemannTrackFinderTask::AddHitBranch(FairTSBufferParameters param)
129 //{
130 // if (fInitDone == kFALSE)
131 // fTimeBasedHitBranch.push_back(param);
132 // else
133 // std::cout << "-W- AddHitBranch has to be called before the Init() of the task!" << std::endl;
134 //}
135 
136 // ----- Public method Exec --------------------------------------------
138 {
139 
140  if (fVerbose > 0) std::cout << std::endl;
141  if (fVerbose > 0) std::cout << "------------- event " << fEventNr << "----------------" << std::endl;
142 
143  // Reset output array
144  if ( ! fTrackCandArray )
145  Fatal("Exec", "No trackCandArray");
146 
147  fTrackCandArray->Delete();
148  fTrackArray->Delete();
149  // fRiemannTrackArray->Delete();
150 
152  trackFinder.SetVerbose(fVerbose);
153  trackFinder.SetSttTubeArray(fTubeArray);
154 
155  FillHitArray();
156 
157  FairRootManager *ioman = FairRootManager::Instance();
158 
159 
160  for (int i = 0; i < (int)fHitBranch.size(); i++){
161  trackFinder.AddHits(fHitArray[i], ioman->GetBranchId(fHitBranch[i]));
162  if (fVerbose > 0) std::cout << "TrackFinder.AddHits: " << fHitBranch[i] << " Number: " << ioman->GetBranchId(fHitBranch[i]) << std::endl;
163  }
164  trackFinder.SetMaxSZChi2(fMaxSZChi2);
165  trackFinder.SetMinPointDist(fMinPointDist);
166  trackFinder.SetMaxPlaneDistance(fMaxDist);
167  trackFinder.SetMaxSZDist(fMaxSZDist);
168  trackFinder.SetMinNumberOfHits(4);
169  //trackFinder.SetGeoH(fGeoH);
170 
171  trackFinder.SetCutDistH(fCutDistH);
172  trackFinder.SetCutChi2H(fCutChi2H);
173 
174  trackFinder.FindTracks();
175 
176 
177  if (fVerbose > 0) std::cout << " -I- PndMvdRiemannTrackFinderTask::Exec : Found Tracks: " << trackFinder.NTracks() << " in event no. " << fEventNr++ << std::endl;
178  if (fVerbose > 0) std::cout << " -I- PndMvdRiemannTrackFinderTask::Exec : ----------------" << std::endl;
179 
180 
181  for (int i = 0; i < trackFinder.NTracks(); i++){
182  PndTrackCand* myCand = new ((*fTrackCandArray)[i])PndTrackCand(trackFinder.GetTrackCand(i));
183 // if (fVerbose > 1)
184 // {
185 // std::cout << "Track " << i << std::endl;
186 // std::cout << "Links: ";
187 // ((FairMultiLinkedData*) myCand)->Print();
188 // std::cout << std::endl;
189 // }
190 
191  myCand->CalcTimeStamp();
192 // if (fVerbose > 1)
193 // trackFinder.GetTrack(i).Print();
194  //PndRiemannTrack myTrack = trackFinder.GetTrack(i);
195 
196  PndTrack* myTrack = new ((*fTrackArray)[i])PndTrack(trackFinder.GetPndTrack(i, fB));
197  if (myCand->GetTimeStamp() == 0){
198  myTrack->SetTimeStamp(0.0001 * (i+1));
199  myCand->SetTimeStamp(0.0001 * (i+1));
200 
201  } else {
202  myTrack->SetTimeStamp(myCand->GetTimeStamp());
203  myTrack->SetTimeStampError(myCand->GetTimeStampError());
204  }
205  myTrack->SetLink(FairLink("MVDRiemannTrackCand", i));
206  myTrack->SetTrackCand(*myCand);
207 
208  if (fVerbose > 1) {
209  std::cout << i << ": ";
210  myTrack->Print();
211  }
212 // PndRiemannTrack* newTrack = new ((*fRiemannTrackArray)[i])PndRiemannTrack();
213 // TVectorD origin = myTrack.orig();
214 // newTrack->init(origin[0], origin[1], myTrack.r(), myTrack.dip(), 0);
215 // for (int j = 0; j < myTrack.getNumHits(); j++){
216 // newTrack->addHit(*myTrack.getHit(j));
217 // }
218  }
219  fTrackCandArray->Sort();
220  fTrackArray->Sort();
221 
222  for (int i = 0; i < fTrackCandArray->GetEntriesFast(); i++){
223  PndTrackCand* myCand =(PndTrackCand*)fTrackCandArray->At(i);
224  if (fVerbose > 1)
225  {
226  std::cout << "Track " << i << std::endl;
227  std::cout << "Links: ";
228  ((FairMultiLinkedData*) myCand)->Print();
229  std::cout << std::endl;
230  }
231  }
232 }
233 
235 {
236  fTrackCandArray->Delete();
237  fTrackArray->Delete();
238 // fRiemannTrackArray->Delete();
239 }
240 
242 {
243  TClonesArray* tempArray = (TClonesArray*) FairRootManager::Instance()->GetObject(branchName);
244  if (tempArray == 0){
245  std::cout << "-W- PndMvdRiemannTrackFinderTask::Init: " << "No hitArray for BranchName " << branchName.Data() << std::endl;
246  }
247  fHitArray.push_back(tempArray);
248 }
249 
251 {
252  Double_t eventTime = -1;
253  if (FairRunAna::Instance()->IsTimeStamp()){
254  for (size_t i = 0; i < fHitArray.size(); i++){
255  fHitArray[i]->Delete();
256  }
257 
258  fHitArray[0] = FairRootManager::Instance()->GetData("MVDHitsPixel", fTimeGapFunctor, 10); //FairRootManager::Instance()->GetEventTime() +
259  std::cout << "PixelHits: " << fHitArray[0]->GetEntriesFast() << std::endl;
260  if (fHitArray[0]->GetEntriesFast() > 1){
261  FairTimeStamp* data = (FairTimeStamp*)fHitArray[0]->At(1);
262  eventTime = data->GetTimeStamp();
263  std::cout << "EventTime: " << eventTime << std::endl;
264  fHitArray[1] = FairRootManager::Instance()->GetData("MVDHitsStrip", fStopFunctor, eventTime - 10, fStopFunctor, eventTime + 10);
265  std::cout << "StripHits: " << fHitArray[1]->GetEntriesFast() << std::endl;
266  }
267  }
268 }
269 
271 
int fVerbose
Definition: poormantracks.C:24
void SetVerbose(int val)
Adds one new hit to the array of hits.
Int_t i
Definition: run_full.C:25
cout<< "POINTs for new FwEndCap == "<< tsim-> GetEntriesFast()
void AddHits(TClonesArray *hits, Int_t branchId)
cout<< "blue = Monte Carlo "<< endl;cout<< "red = Helix Hit "<< endl;cout<< "green = Center Of Tubes "<< endl;for(Int_t k=0;k< track->GetEntriesFast();k++){PndSttTrack *stttrack=(PndSttTrack *) track-> At(k)
Definition: checkhelixhit.C:56
std::vector< PndTrackCand > GetTrackCand()
Returns the hits belonging to track i.
ClassImp(PndMvdRiemannTrackFinderTask)
Double_t
std::vector< TClonesArray * > fHitArray
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
TClonesArray * FillTubeArray()
void SetMaxSZDist(double val)
static PndGeoHandling * Instance()
void SetMinPointDist(double val)
void CalcTimeStamp()
PndLheTrackFinder * trackFinder
void SetMaxPlaneDistance(double val)
void SetSttTubeArray(TClonesArray *SttTubeArray)
void Print()
Definition: PndTrack.cxx:39
void FindTracks()
Main function to start the riemann track finding.
void SetTrackCand(const PndTrackCand &cand)
Definition: PndTrack.h:43
void SetMaxSZChi2(double val)
PndTrack GetPndTrack(int i, double B)
Returns the track with the index i.