FairRoot/PandaRoot
PndIdealTrackFinder.cxx
Go to the documentation of this file.
1 /*
2  * PndIdealTrackFinders.cpp
3  *
4  * Created on: Apr 12, 2010
5  * Author: stockman
6  */
7 
8 #include <PndIdealTrackFinder.h>
9 #include "FairRootManager.h"
10 #include "FairMCPoint.h"
11 #include "FairHit.h"
12 
13 #include "PndTrackCand.h"
14 #include "PndTrack.h"
15 #include "PndMCTrack.h"
16 #include "PndGemMCPoint.h"
17 #include "PndGemHit.h"
18 
19 #include "TRandom.h"
21 
23  fOutBranchName("IdealTrack"), fTrackCand(0), fTrack(0), fMCTrack(0), fTrackSelector(0), fPdg(0), fHitCount(0), fMomSigma(0,0,0), fDPoP(0.), fRelative (kFALSE), fVtxSigma(0,0,0), fEfficiency(1.)
24 {
25  fPointBranchMap["MVDHitsPixel"] = "MVDPoint";
26  fPointBranchMap["MVDHitsStrip"] = "MVDPoint";
27  fPointBranchMap["STTHit"] = "STTPoint";
28  fPointBranchMap["GEMHit"] = "GEMPoint";
29  fPointBranchMap["FTSHit"] = "FTSPoint";
30 
31  fPointBranchMap["SciTHit"] = "SciTPoint";
32  fPointBranchMap["MdtHit"] = "MdtPoint";
33 
34  fPointBranchMap["DircHit"] = ""; // no FairLinks Provided!
35  fPointBranchMap["FTofHit"] = ""; // no FairLinks Provided!
36  fPointBranchMap["RichHit"] = ""; // no FairLinks Provided!
37 
38  SetPersistency(kTRUE);
39 }
40 
42  if (fTrackSelector != 0)
43  delete fTrackSelector;
44 }
45 
46 // ----- Public method Init --------------------------------------------
48 {
49 
50  FairRootManager* ioman = FairRootManager::Instance();
51  if (!ioman) {
52  std::cout << "-E- PndMCTestHitCompare::Init: "
53  << "RootManager not instantiated!" << std::endl;
54  return kFATAL;
55  }
56 
57  if (fBranchNames.size() == 0){
58  // Use hits of all tracking subsystems if nothing is given
59  AddBranchName("MVDHitsPixel");
60  AddBranchName("MVDHitsStrip");
61  AddBranchName("STTHit");
62  AddBranchName("GEMHit");
63  AddBranchName("FTSHit");
64  }
65 
66  for (size_t i = 0; i < fBranchNames.size(); i++){
67  if (ioman->GetObject(fBranchNames[i]) != 0){
68  fBranchMap[fBranchNames[i]] = (TClonesArray*)ioman->GetObject(fBranchNames[i]);
69  ioman->GetObject(fPointBranchMap[fBranchNames[i]]); // initialise the used FairMcPoint Branches
70  }
71  }
72  fMCTrack = (TClonesArray*)ioman->GetObject("MCTrack");
73 
74 
75  fTrackCand = new TClonesArray("PndTrackCand");
76  ioman->Register(fOutBranchName + "Cand", "MC", fTrackCand, GetPersistency());
77  fTrack = new TClonesArray("PndTrack");
78  ioman->Register(fOutBranchName, "MC", fTrack, GetPersistency());
79 
80  if (fTrackSelector == 0){
81  std::cout << "-W- PndIdealTrackFinder::Init() no fTrackSelector set! All possible tracks will be taken!" << std::endl;
82  }
83 
84  fPdg = new TDatabasePDG();
85 
86  return kSUCCESS;
87 }
88 
90 {
91  fTrackCand->Delete();
92  fTrack->Delete();
93  fTrackCandMap.clear();
94 
95 // std::cout << "Event #" << FairRootManager::Instance()->GetEntryNr() << std::endl;
98 
99 // std::cout << "PndIdealTrackFinder:Found Tracks:" << std::endl;
100  CreateTracks();
101 }
102 
104 {
105  fHitCount = 0;
106  for (std::map<TString, TClonesArray*>::iterator iter = fBranchMap.begin(); iter != fBranchMap.end(); iter++){
107  //std::cout << "AddLinks from Branch: " << iter->first << std::endl;
108  for (int i = 0; i < iter->second->GetEntriesFast(); i++){
109 
110  FairMultiLinkedData array;
111  FairMultiLinkedData_Interface* links = (FairMultiLinkedData_Interface*)iter->second->At(i);
112  TString hitBranch = iter->first;
113 
114  FairMCPoint *point = GetFairMCPoint(hitBranch, links, array);
115  if (point == 0) {
116  continue;
117  }
118  FairMCPoint firstpoint = *point;
119  FairMCPoint lastpoint = *point;
120 
121  double tof = point->GetTime();
122  delete(point);
123 
124  for (int ipnt = 1; ipnt < array.GetNLinks(); ipnt++){
125  point = (FairMCPoint *) FairRootManager::Instance()->GetCloneOfLinkData(array.GetLink(ipnt));
126  tof += point->GetTime();
127  // std::cout << ipnt << " " << tof << std::endl;
128  if( point->GetTime() < firstpoint.GetTime()) firstpoint = *point;
129  if( point->GetTime() > lastpoint.GetTime()) lastpoint = *point;
130  delete(point);
131  }
132  tof /= array.GetNLinks();
133  // std::cout << i << " " << tof << std::endl;
134  // .............................................
135  FairMultiLinkedData mctracks = links->GetLinksWithType(FairRootManager::Instance()->GetBranchId("MCTrack"));
136  for (int trackIndex = 0; trackIndex < mctracks.GetNLinks(); trackIndex++){
137  if (!fTrackCandMap.count(mctracks.GetLink(trackIndex))){
138  fTrackCandMap[mctracks.GetLink(trackIndex)] = PndTrackCand();
139  fTrackCandMap[mctracks.GetLink(trackIndex)].SetInsertHistory(kTRUE);
140  fFirstPointMap[mctracks.GetLink(trackIndex)] = firstpoint;
141  // fFirstPointMap[mctracks.GetLink(trackIndex)].SetInsertHistory(kTRUE);
142  fLastPointMap[mctracks.GetLink(trackIndex)] = lastpoint;
143  // fLastPointMap[mctracks.GetLink(trackIndex)].SetInsertHistory(kTRUE);
144  }
145  else {
146  FairMCPoint tmpfirstpoint = fFirstPointMap[mctracks.GetLink(trackIndex)];
147  if(firstpoint.GetTime() < tmpfirstpoint.GetTime()) fFirstPointMap[mctracks.GetLink(trackIndex)] = firstpoint;
148  FairMCPoint tmplastpoint = fLastPointMap[mctracks.GetLink(trackIndex)];
149  if(lastpoint.GetTime() > tmplastpoint.GetTime()) fLastPointMap[mctracks.GetLink(trackIndex)] = lastpoint;
150  }
151  FairLink link(-1, FairRootManager::Instance()->GetEntryNr(),FairRootManager::Instance()->GetBranchId(iter->first),i);
152  //std::cout << "CreateTrackCands " << mctracks.GetLink(trackIndex) << " : " << link << std::endl;
153  fTrackCandMap[mctracks.GetLink(trackIndex)].SetInsertHistory(kTRUE);
154  // fTrackCandMap[mctracks.GetLink(trackIndex)].AddHit(link, fHitCount++); //todo Rho is not properly calculated!
155  fTrackCandMap[mctracks.GetLink(trackIndex)].AddHit(link, tof);
156  }
157  }
158  }
159 }
160 
162 {
163  if (fTrackSelector == 0){
164  return;
165  }
166  for (std::map<FairLink, PndTrackCand>::iterator iter = fTrackCandMap.begin(); iter != fTrackCandMap.end();){
167  if (!(*fTrackSelector)(iter->second.GetPointerToLinks(), true)){
168  fTrackCandMap.erase(iter++);
169  } else {
170  ++iter;
171  }
172  }
173 }
174 
176 {
177  for (std::map<FairLink, PndTrackCand>::iterator iter = fTrackCandMap.begin(); iter != fTrackCandMap.end(); iter++){
178  PndTrackCand* myTrackCand = new((*fTrackCand)[fTrackCand->GetEntriesFast()]) PndTrackCand(iter->second);
179  myTrackCand->setMcTrackId(iter->first.GetIndex());
180  myTrackCand->AddLink(iter->first);
181  myTrackCand->SetTimeStamp(FairRootManager::Instance()->GetEventTime());
182  //std::cout << myTrackCand->GetLinksWithType(FairRootManager::Instance()->GetBranchId("MCTrack")) << " : " << std::endl;
183  //myTrackCand->Print();
184  //std::cout << *myTrackCand << std::endl;
185 
186  // ....... track
187  PndMCTrack *mc = (PndMCTrack *) FairRootManager::Instance()->GetCloneOfLinkData(iter->first);
188  int charge = 0;
189  if (mc->GetPdgCode()<100000000) charge = (Int_t)TMath::Sign(1.0, ((TParticlePDG*) fPdg->GetParticle(mc->GetPdgCode()))->Charge());
190  else charge = 1;
191 
192 
193  if(0 < fEfficiency && fEfficiency < 1){
194  if(gRandom->Rndm() > fEfficiency) continue;
195  }
196 
197  // first
198  FairMCPoint firstpoint = fFirstPointMap[iter->first];
199  TVector3 firstpos(0, 0, 0), firstmom(0, 0, 0);
200  if(myTrackCand->GetSortedHit(0).GetDetId() == FairRootManager::Instance()->GetBranchId("GEMHit")) {
201  TClonesArray *gemhitarray = fBranchMap["GEMHit"];
202  Int_t hitid = myTrackCand->GetSortedHit(0).GetHitId();
203  PndGemHit *gemhit = (PndGemHit*) gemhitarray->At(hitid);
204  FairMultiLinkedData gemhitlink = gemhit->GetLinksWithType(FairRootManager::Instance()->GetBranchId("GEMPoint"));
205  PndGemMCPoint *gempoint = (PndGemMCPoint *) FairRootManager::Instance()->GetCloneOfLinkData(gemhitlink.GetLink(0));
206 
207  TVector3 posin(0, 0, 0), posout(0, 0, 0);
208  gempoint->Position(posin);
209  gempoint->PositionOut(posout);
210  firstpos = 0.5 * (posin + posout);
211  }
212  else firstpoint.Position(firstpos);
213 
214  SmearVector(firstpos, fVtxSigma);
215  firstpoint.Momentum(firstmom);
216 
217  if (fRelative) fMomSigma.SetXYZ(fDPoP*firstmom.Mag(),fDPoP*firstmom.Mag(),fDPoP*firstmom.Mag());
218  SmearVector(firstmom, fMomSigma);
219  FairTrackParP firstPar(firstpos, firstmom,
221  charge, firstpos,
222  TVector3(1.,0.,0.), TVector3(0.,1.,0.));
223  // last
224  FairMCPoint lastpoint = fLastPointMap[iter->first];
225  TVector3 lastpos(0, 0, 0), lastmom(0, 0, 0);
226 
227  if(myTrackCand->GetSortedHit(myTrackCand->GetNHits() - 1).GetDetId() == FairRootManager::Instance()->GetBranchId("GEMHit")) {
228  TClonesArray *gemhitarray = fBranchMap["GEMHit"];
229  Int_t hitid = myTrackCand->GetSortedHit(myTrackCand->GetNHits() - 1).GetHitId();
230  PndGemHit *gemhit = (PndGemHit*) gemhitarray->At(hitid);
231  FairMultiLinkedData gemhitlink = gemhit->GetLinksWithType(FairRootManager::Instance()->GetBranchId("GEMPoint"));
232  PndGemMCPoint *gempoint = (PndGemMCPoint *) FairRootManager::Instance()->GetCloneOfLinkData(gemhitlink.GetLink(0));
233 
234  TVector3 posin(0, 0, 0), posout(0, 0, 0);
235  gempoint->Position(posin);
236  gempoint->PositionOut(posout);
237  lastpos = 0.5 * (posin + posout);
238  }
239  else lastpoint.Position(lastpos);
240 
241  SmearVector(lastpos, fVtxSigma);
242  lastpoint.Momentum(lastmom);
243  SmearVector(lastmom, fMomSigma);
244  FairTrackParP lastPar(lastpos, lastmom,
246  charge, lastpos,
247  TVector3(1.,0.,0.), TVector3(0.,1.,0.));
248 
249 
250 
251  new((*fTrack)[fTrack->GetEntriesFast()]) PndTrack(firstPar, lastPar, *myTrackCand, 0,0,1,mc->GetPdgCode(), -1,-1);
252  }
253 }
254 
255 FairMCPoint* PndIdealTrackFinder::GetFairMCPoint(TString hitBranch, FairMultiLinkedData_Interface* links, FairMultiLinkedData& array)
256 {
257  // get the mc point(s) from each reco hit ......
258  FairMultiLinkedData mcpoints = links->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fPointBranchMap[hitBranch]));
259  // std::cout << "hit " << i << " connected to points " << mvdpoints.GetNLinks() << " " << sttpoints.GetNLinks() << " " << gempoints.GetNLinks() << std::endl;
260 
261  // There seems to be a bug with ghost hits from the GEM stations. If more than one
262  // MC point is associated to a hit, there is a good chance for false assignments
263  // leading to wrong tracks. For the moment, skip hits with more than 1 GEM point.
264 
265  if (hitBranch == "GEMHit" && mcpoints.GetNLinks() > 1) return 0;
266 // if ((*iter).first == "MVDHitsStrip" && mvdpoints.GetNLinks() > 1) return 0;
267 
268  array = mcpoints;
269 
270 
271  if (array.GetNLinks() == 0){
272 
273  return 0;
274  }
275  return (FairMCPoint *) FairRootManager::Instance()->GetCloneOfLinkData(array.GetLink(0));
276 }
277 
278 void PndIdealTrackFinder::SmearVector(TVector3 &vec, const TVector3 &sigma)
279 {
280  // gaussian smearing
281  Double_t rannn=0.;
282  rannn = gRandom->Gaus(vec.X(),sigma.X());
283  vec.SetX(rannn);
284 
285  rannn = gRandom->Gaus(vec.Y(),sigma.Y());
286  vec.SetY(rannn);
287 
288  rannn = gRandom->Gaus(vec.Z(),sigma.Z());
289  vec.SetZ(rannn);
290 
291  return;
292 }
TClonesArray * fTrackCand
virtual void SmearVector(TVector3 &vec, const TVector3 &sigma)
Int_t i
Definition: run_full.C:25
TDatabasePDG * fPdg
! Particle DB
std::map< FairLink, FairMCPoint > fFirstPointMap
virtual InitStatus Init()
Int_t GetPdgCode() const
Definition: PndMCTrack.h:73
PndTrackCandHit GetSortedHit(UInt_t i)
Definition: PndTrackCand.h:54
void setMcTrackId(int i)
Definition: PndTrackCand.h:72
Ideal track finder for all types of tracking detectors The PndIdealTrackFinder combines all hits in ...
void SetPersistency(Bool_t val=kTRUE)
virtual void Exec(Option_t *opt)
Double_t sigma[nsteps]
Definition: dedx_bands.C:65
std::map< TString, TString > fPointBranchMap
virtual void CreateTrackCands()
std::vector< TString > fBranchNames
Double_t
PndTrackFunctor * fTrackSelector
void PositionOut(TVector3 &pos) const
Definition: PndGemMCPoint.h:94
Double_t fDPoP
Relative momentum Smearing.
TVector3 fMomSigma
Momentum smearing sigma [GeV].
std::map< TString, TClonesArray * > fBranchMap
virtual FairMCPoint * GetFairMCPoint(TString hitBranch, FairMultiLinkedData_Interface *links, FairMultiLinkedData &array)
UInt_t GetNHits() const
Definition: PndTrackCand.h:59
std::map< FairLink, FairMCPoint > fLastPointMap
ClassImp(PndAnaContFact)
virtual void FilterTrackCands()
Double_t fEfficiency
Tracking efficiency - if (0 &lt;= e &lt; 1), some tracks will be discarded.
Int_t GetHitId() const
virtual void AddBranchName(TString name)
Search for tracks only in given branches. If no BranchName is given all tracking detectors are taken...
dble_vec_t vec[12]
Definition: ranlxd.cxx:380
Int_t GetDetId() const
TVector3 fVtxSigma
Vertex smearing sigma [cm].
std::map< FairLink, PndTrackCand > fTrackCandMap
PndSdsMCPoint * point
Definition: anaLmdCluster.C:72