FairRoot/PandaRoot
PndMvdSttGemRiemannTrackFinderTask.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 #include "PndSttHit.h"
21 
22 #include "PndSttMapCreator.h"
23 
24 
26  FairTask("MVD Riemann Track Finder"),
27  fHitBranch(),
28  fTrackBranch(""),
29  fEventNr(0),
30  fMaxSZChi2(1),
31  fMaxSZDist(10),
32  fMinPointDist(1),
33  fMaxDist(1),
34  fB(2.),
35  fHitArray(),
36  fTrackCandArray(NULL),
37  fRiemannTrackArray(NULL),
38  fTrackArray(NULL),
39  fCorrectedSttHitArray(NULL),
40  fCutDistH(NULL),
41  fCutChi2H(NULL),
42  fInitDone(kFALSE),
43  fPersistence(kTRUE),
44  fStopFunctor(NULL),
45  fTimeGapFunctor(NULL),
46  fSttParameters(NULL),
47  fTubeArray(NULL)
48 {
50 }
51 
53 {
54 }
55 
57 {
58  FairRuntimeDb* rtdb = FairRunAna::Instance()->GetRuntimeDb();
59  fSttParameters = (PndGeoSttPar*) rtdb->getContainer("PndGeoSttPar");
60 }
61 
63 {
64  InitStatus stat=kSUCCESS;
65  return stat;
66 }
67 
68 // ----- Public method Init --------------------------------------------
70 {
71  FairRootManager* ioman = FairRootManager::Instance();
72 
73  if ( ! ioman )
74  {
75  std::cout << "-E- PndMvdSttGemRiemannTrackFinderTask::Init: "
76  << "RootManager not instantiated!" << std::endl;
77  return kFATAL;
78  }
79 
80  // Get input array
81 // if (FairRunAna::Instance()->IsTimeStamp()){
82 // if (fTimeBasedHitBranch.size() == 0){
83 // std::cout << "-W- PndMvdSttGemRiemannTrackFinderTask::Init: " << "No Branch Names given with AddHitBranch(TString branchName)! Standard BranchNames taken!" << std::endl;
84 // fTimeBasedHitBranch.push_back(FairTSBufferParameters("MVDHitsPixel", new TimeGap(), 10));
85 // }
86 // }
87  if (fHitBranch.size() == 0){
88  std::cout << "-W- PndMvdSttGemRiemannTrackFinderTask::Init: " << "No Branch Names given with AddHitBranch(TString branchName)! Standard BranchNames taken!" << std::endl;
89  fHitBranch.push_back("MVDHitsPixel");
90  fHitBranch.push_back("MVDHitsStrip");
91  fHitBranch.push_back("STTHit");
92  fHitBranch.push_back("GEMHit");
93  fHitBranch.push_back("STTCombinedSkewedHits");
94  }
95 
96  for (int i = 0; i < (int)fHitBranch.size(); i++){
98  }
99 
100 
101 
102  fTrackCandArray = new TClonesArray("PndTrackCand");
103  ioman->Register("MVDRiemannTrackCand", "MVD", fTrackCandArray, fPersistence);
104 
105  fTrackArray = new TClonesArray("PndTrack");
106  ioman->Register("MVDTrack", "MVD", fTrackArray, fPersistence);
107 
108  fCorrectedSttHitArray = new TClonesArray("FairHit");
109  ioman->Register("CorrectedSttHit", "Stt", fCorrectedSttHitArray, kTRUE);
110 
111 // fRiemannTrackArray = new TClonesArray("PndRiemannTrack");
112 // ioman->Register("MVDRiemannTrack", "MVD", fRiemannTrackArray, kTRUE);
113 
114 
115  fStopFunctor= new StopTime();
116  fTimeGapFunctor = new TimeGap();
117 
119  fTubeArray = mapper->FillTubeArray();
120 
121  std::cout << "-I- PndMvdSttGemRiemannTrackFinderTask: Initialisation successfull" << std::endl;
122  fInitDone = kTRUE;
123  return kSUCCESS;
124 }
125 
127 {
128  if (fInitDone == kFALSE)
129  fHitBranch.push_back(branchName);
130  else
131  std::cout << "-W- AddHitBranch has to be called before the Init() of the task!" << std::endl;
132 }
133 
134 //void PndMvdSttGemRiemannTrackFinderTask::AddHitBranch(FairTSBufferParameters param)
135 //{
136 // if (fInitDone == kFALSE)
137 // fTimeBasedHitBranch.push_back(param);
138 // else
139 // std::cout << "-W- AddHitBranch has to be called before the Init() of the task!" << std::endl;
140 //}
141 
142 // ----- Public method Exec --------------------------------------------
144 {
145 
146 // SetVerbose(0);
147  // Reset output array
148  if ( ! fTrackCandArray )
149  Fatal("Exec", "No trackCandArray");
150 
151  fTrackCandArray->Delete();
152  fTrackArray->Delete();
153  // fRiemannTrackArray->Delete();
154 
156  trackFinder.SetVerbose(fVerbose);
157  trackFinder.SetSttTubeArray(fTubeArray);
158 
159  FillHitArray();
160 
161  FairRootManager *ioman = FairRootManager::Instance();
162 
163  if (fVerbose > 0) {
164  std::cout << std::endl;
165  std::cout << "------------- event " << fEventNr++ << "----------------" << std::endl;
166  }
167 
168  for (int i = 0; i < (int)fHitBranch.size(); i++){
169  trackFinder.AddHits(fHitArray[i], ioman->GetBranchId(fHitBranch[i]));
170  if (fVerbose > 1) std::cout << "TrackFinder.AddHits: " << ioman->GetBranchId(fHitBranch[i]) << std::endl;
171  }
172  trackFinder.SetMaxSZChi2(fMaxSZChi2);
173  trackFinder.SetMinPointDist(fMinPointDist);
174  trackFinder.SetMaxPlaneDistance(fMaxDist);
175  trackFinder.SetMaxSZDist(fMaxSZDist);
176  trackFinder.SetVerbose(fVerbose);
177  trackFinder.SetMinNumberOfHits(4);
178  //trackFinder.SetGeoH(fGeoH);
179 
180  trackFinder.SetCutDistH(fCutDistH);
181  trackFinder.SetCutChi2H(fCutChi2H);
182 
183  trackFinder.FindTracks();
184 
185 
186  if (fVerbose > 0) std::cout << " -I- PndMvdSttGemRiemannTrackFinderTask::Exec : Found Tracks: " << trackFinder.NTracks() << " in event no. " << fEventNr << std::endl;
187  if (fVerbose > 0) std::cout << " -I- PndMvdSttGemRiemannTrackFinderTask::Exec : ----------------" << std::endl;
188 
189 
190  for (int i = 0; i < trackFinder.NTracks(); i++){
191  PndTrackCand* myCand = new ((*fTrackCandArray)[i])PndTrackCand(trackFinder.GetTrackCand(i));
192 // if (fVerbose > 1)
193 // {
194 // std::cout << "Track " << i << std::endl;
195 // std::cout << "Links: ";
196 // ((FairMultiLinkedData*) myCand)->Print();
197 // std::cout << std::endl;
198 // }
199 
200  myCand->CalcTimeStamp();
201 // if (fVerbose > 1)
202 // trackFinder.GetTrack(i).Print();
203  //PndRiemannTrack myTrack = trackFinder.GetTrack(i);
204 
205  PndTrack* myTrack = new ((*fTrackArray)[i])PndTrack(trackFinder.GetPndTrack(i, fB));
206  if (myCand->GetTimeStamp() == 0){
207  myTrack->SetTimeStamp(0.0001 * (i+1));
208  myCand->SetTimeStamp(0.0001 * (i+1));
209 
210  } else {
211  myTrack->SetTimeStamp(myCand->GetTimeStamp());
212  myTrack->SetTimeStampError(myCand->GetTimeStampError());
213  }
214  myTrack->SetLink(FairLink("MVDRiemannTrackCand", i));
215  myTrack->SetTrackCandRef(myCand);
216  myTrack->SetTrackCand(*myCand);
217 
218  if (fVerbose > 1) {
219  std::cout << i << ": ";
220  myTrack->Print();
221  }
222 
223  for (size_t j = 0; j < myCand->GetNHits(); j++){
224  if (myCand->GetLink(j).GetType() == FairRootManager::Instance()->GetBranchId("STTHit")){
225  PndSttHit* mySttHit = (PndSttHit*)FairRootManager::Instance()->GetCloneOfLinkData(myCand->GetLink(j));
226  PndRiemannTrack myRiemannTrack = trackFinder.GetTrack(i);
227  PndRiemannHit correctedSttHit = myRiemannTrack.correctSttHit(mySttHit);
228  FairHit correctedFairHit;
229  correctedFairHit.SetXYZ(correctedSttHit.x().X(), correctedSttHit.x().Y(), correctedSttHit.z());
230 // std::cout << "PndMvdSttGemRiemannTrackFinderTask::Exec Correction: " << mySttHit->GetX() << "/" << mySttHit->GetY() << "/" << mySttHit->GetZ()
231 // << " CorrectedHit: " << correctedFairHit.GetX() << "/"<< correctedFairHit.GetY() << "/" << correctedFairHit.GetZ()<< std::endl;
232 
233 // Fair1Hit* copyHit = new((*fCorrectedSttHitArray)[fCorrectedSttHitArray->GetEntriesFast()])FairHit(correctedFairHit);
234 
235  }
236  }
237 // PndRiemannTrack* newTrack = new ((*fRiemannTrackArray)[i])PndRiemannTrack();
238 // TVectorD origin = myTrack.orig();
239 // newTrack->init(origin[0], origin[1], myTrack.r(), myTrack.dip(), 0);
240 // for (int j = 0; j < myTrack.getNumHits(); j++){
241 // newTrack->addHit(*myTrack.getHit(j));
242 // }
243  }
244  fTrackCandArray->Sort();
245  fTrackArray->Sort();
246 
247  for (int i = 0; i < fTrackCandArray->GetEntriesFast(); i++){
248  PndTrackCand* myCand =(PndTrackCand*)fTrackCandArray->At(i);
249  if (fVerbose > 1)
250  {
251  std::cout << "Track " << i << std::endl;
252  std::cout << "Links: ";
253  ((FairMultiLinkedData*) myCand)->Print();
254  std::cout << std::endl;
255  }
256  }
257 }
258 
260 {
261  fTrackCandArray->Delete();
262  fTrackArray->Delete();
263  fCorrectedSttHitArray->Delete();
264 // fRiemannTrackArray->Delete();
265 }
266 
268 {
269  TClonesArray* tempArray = (TClonesArray*) FairRootManager::Instance()->GetObject(branchName);
270  if (tempArray == 0){
271  std::cout << "-W- PndMvdSttGemRiemannTrackFinderTask::Init: " << "No hitArray for BranchName " << branchName.Data() << std::endl;
272  }
273  fHitArray.push_back(tempArray);
274 }
275 
277 {
278  Double_t eventTime = -1;
279  if (FairRunAna::Instance()->IsTimeStamp()){
280  fHitArray[0]->Delete();
281  fHitArray[1]->Delete();
282 
283  fHitArray[0] = FairRootManager::Instance()->GetData("MVDHitsPixel", fTimeGapFunctor, 10); //FairRootManager::Instance()->GetEventTime() +
284  std::cout << "PixelHits: " << fHitArray[0]->GetEntriesFast() << std::endl;
285  if (fHitArray[0]->GetEntriesFast() > 1){
286  FairTimeStamp* data = (FairTimeStamp*)fHitArray[0]->At(1);
287  eventTime = data->GetTimeStamp();
288  std::cout << "EventTime: " << eventTime << std::endl;
289  fHitArray[1] = FairRootManager::Instance()->GetData("MVDHitsStrip", fStopFunctor, eventTime - 10, fStopFunctor, eventTime + 10);
290  std::cout << "StripHits: " << fHitArray[1]->GetEntriesFast() << std::endl;
291  }
292  }
293 }
294 
296 
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
PndRiemannHit correctSttHit(PndSttHit *mySttHit)
cout<< "POINTs for new FwEndCap == "<< tsim-> GetEntriesFast()
void SetTrackCandRef(PndTrackCand *candPointer)
Definition: PndTrack.h:44
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.
Double_t
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
TClonesArray * FillTubeArray()
void SetMaxSZDist(double val)
static PndGeoHandling * Instance()
void SetMinPointDist(double val)
void CalcTimeStamp()
PndLheTrackFinder * trackFinder
double z() const
PndRiemannTrack GetTrack(int i)
Returns the number of found tracks.
void SetMaxPlaneDistance(double val)
UInt_t GetNHits() const
Definition: PndTrackCand.h:59
void SetSttTubeArray(TClonesArray *SttTubeArray)
const TVector3 & x() const
Definition: PndRiemannHit.h:71
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)
ClassImp(PndMvdSttGemRiemannTrackFinderTask)
PndTrack GetPndTrack(int i, double B)
Returns the track with the index i.