FairRoot/PandaRoot
PndTrackDraw.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndTrackDraw source file -----
3 // ----- Created 10/12/07 by M. Al-Turany -----
4 // -------------------------------------------------------------------------
5 
6 #include "PndTrackDraw.h"
7 #include "TEveTrack.h"
8 #include <iostream>
9 #include "TEveTrackPropagator.h"
10 #include "TGeoTrack.h"
11 #include "TClonesArray.h"
12 #include "TObjArray.h"
13 #include "TEveManager.h"
14 #include "FairEventManager.h"
15 #include "PndTrack.h"
16 #include "TLorentzVector.h"
17 #include "TParticle.h"
18 #include "TEveBoxSet.h"
19 #include "PndHelixPropagator.h"
20 #include <string>
21 #include <sstream>
22 #include <FairField.h>
23 using std::cout;
24 using std::endl;
25 
26 // ----- Default constructor -------------------------------------------
28  :fTimeWindowPlus(0.),
29  fTimeWindowMinus(0.),
30  fUseEventTime(kTRUE),
31  fDoPropagation(propagate),
32  fListOfTracks(0)
33 {
34  fPndTrackList = 0;
35 }
36 // -------------------------------------------------------------------------
37 
38 
39 // ----- Standard constructor ------------------------------------------
41  : FairTask(name, iVerbose),
42  fTimeWindowPlus(0.),
43  fTimeWindowMinus(0.),
44  fUseEventTime(kTRUE), fEveTrList( new TObjArray(16)),
45  fDoPropagation(propagate), fListOfTracks(0)
46 {
47  // fPro = new FairGeanePro();
48  fPndTrackList = 0;
49  TString trackCandName(name);
50 // trackCandName.Append("_TrackCand");
51  fTrackCandDraw = new PndTrackCandDraw(trackCandName.Data(), iVerbose);
52 }
53 // -------------------------------------------------------------------------
54 InitStatus PndTrackDraw::Init()
55 {
56  //fPro = new FairGeanePro();
57  if (fVerbose > 1)
58  cout << "PndTrackDraw::Init()" << endl;
59  if (fPndTrackList == 0){
60  FairRootManager* fManager = FairRootManager::Instance();
61  fPndTrackList = (TClonesArray *) fManager->GetObject(GetName());
62  if (fPndTrackList == 0) {
63  cout << "PndTrackDraw::Init() branch " << GetName()
64  << " Not found! Task will be deactivated " << endl;
65  SetActive(kFALSE);
66  }
67  if (fVerbose > 2)
68  cout << "PndTrackDraw::Init() get track list" << fPndTrackList << endl;
69  //if(fVerbose>2) cout<< "PndTrackDraw::Init() create propagator" << endl;
70  fEventManager = FairEventManager::Instance();
71  if (fVerbose > 2)
72  cout << "PndTrackDraw::Init() get instance of FairEventManager "
73  << endl;
74  fEvent = "Current Event";
75  MinEnergyLimit = fEventManager->GetEvtMinEnergy();
76  MaxEnergyLimit = fEventManager->GetEvtMaxEnergy();
77  PEnergy = 0;
78 
80  }
81  fStartFunctor = new StopTime();
82  fStopFunctor = new StopTime();
83 
84  if (IsActive())
85  return kSUCCESS;
86  else
87  return kERROR;
88 }
89 // ----- Destructor ----------------------------------------------------
91 {
92  delete fTrackCandDraw;
93 }
94 
95 // -------------------------------------------------------------------------
96 void PndTrackDraw::Exec(Option_t*)
97 {
98 
99  if (IsActive()){
100 
101  if(fVerbose>1) cout << " PndTrackDraw::Exec "<< endl;
102  PndTrack *tr;
103  //const Double_t *point; //[R.K. 01/2017] unused variable
104 
105  Reset();
106  fTrackCandDraw->Reset();
107 
108  FairBoxSet* myBoxSet = fTrackCandDraw->CreateBoxSet();
109 
110  //fListOfTracks->DestroyElements();
111 
112  TString trackName(GetName());
113  trackName.Append("_Track");
114  fListOfTracks = new TEveElementList(trackName.Data(),"List of PndTracks");
115 
116  gEve->AddElement(fListOfTracks,fEventManager);
117 
118  if (FairRunAna::Instance()->IsTimeStamp()) {
119  std::cout << "Inside TimeStamp" << std::endl;
120  fPndTrackList->Clear();
121  Double_t eventTime = FairRootManager::Instance()->GetEventTime();
122  if (fUseEventTime) {
123  fStartTime = eventTime - fTimeWindowMinus;
124  }
125  cout << "EventTime: " << eventTime << " TimeWindow: " << fStartTime
126  << " - " << eventTime + fTimeWindowPlus << std::endl;
127 
128  fPndTrackList = FairRootManager::Instance()->GetData(GetName(),
130  eventTime + fTimeWindowPlus); //FairRootManager::Instance()->GetEventTime() +
131  std::cout << fStartTime << " " << eventTime + fTimeWindowPlus << " FoundTracks: " << fPndTrackList->GetEntriesFast() << std::endl;
132  }
133 
134  for (Int_t i=0; i<fPndTrackList->GetEntriesFast(); i++) {
135  if(fVerbose>2) cout << "PndTrackDraw::Exec "<< i << endl;
136  tr=(PndTrack *)fPndTrackList->At(i);
137  Int_t pidHypo = tr->GetPidHypo();
138 
139  // Int_t q= tr->GetParamFirst().GetQ();
140  // Int_t pidHypo = 0;
141  // if (q > 0)
142  // pidHypo = 211;
143  // else
144  // pidHypo = -211;
145  FairTrackParP parFirst = tr->GetParamFirst();
146  FairTrackParP parLast = tr->GetParamLast();
147  PndTrackCand trackCand = tr->GetTrackCand();
148 
149  if (fVerbose> 1){
150  cout << "PndTrack " << i << ":" << std::endl;
151  tr->Print();
152  }
153 
154  fTrackCandDraw->AddBoxesPndTrackCand(myBoxSet,&trackCand, i);
155 
156  TVector3 posFirst = parFirst.GetPosition();
157  TVector3 momFirst;
158  if (parFirst.GetMomentum().Mag() < 0.1) {
159  momFirst = parFirst.GetMomentum() * 100;
160  } else {
161  momFirst = parFirst.GetMomentum() * 10;
162  }
163  //TVector3 resFirst = posFirst + momFirst;
164  TString groupName("Track_");
165  groupName += i;
166  TEveElementList* arrowList = new TEveElementList(groupName.Data(), "PndMCTrack");
167 
168 
169  TEveArrow* myArrowFirst = new TEveArrow(momFirst.X(), momFirst.Y(), momFirst.Z(),
170  posFirst.X(), posFirst.Y(), posFirst.Z());
171  myArrowFirst->SetMainColor(kRed);
172  myArrowFirst->SetTubeR(0.01);
173  fArrows.push_back(myArrowFirst);
174  //gEve->AddElement(myArrowFirst, fEventManager);
175  arrowList->AddElement(myArrowFirst);
176 
177  std::cout << "ParamFirst: " << posFirst.X() << " " << posFirst.Y() << " " << posFirst.Z() << std::endl;
178  std::cout << "ParamFirst Momentum: " << momFirst.X() << " " << momFirst.Y() << " " << momFirst.Z() << std::endl;
179  std::cout << "Charge: " << parFirst.GetQ() << std::endl;
180 
181  if (fDoPropagation)
182  PropagateTrackHelix(parFirst, pidHypo, kRed, arrowList);
183 
184  TVector3 posLast = parLast.GetPosition();
185  TVector3 momLast;
186  if (parLast.GetMomentum().Mag() < 0.1) {
187  momLast = parLast.GetMomentum() * 100;
188  } else {
189  momLast = parLast.GetMomentum() * 10;
190  }
191  //TVector3 resLast = posLast + momLast;
192 
193  TEveArrow* myArrowLast = new TEveArrow(momLast.X(), momLast.Y(), momLast.Z(),
194  posLast.X(), posLast.Y(), posLast.Z());
195  myArrowLast->SetMainColor(kBlue);
196  myArrowLast->SetTubeR(0.01);
197  fArrows.push_back(myArrowLast);
198  //gEve->AddElement(myArrowLast, fEventManager);
199  arrowList->AddElement(myArrowLast);
200 
201  std::cout << "ParamLast: " << posLast.X() << " " << posLast.Y() << " " << posLast.Z() << std::endl;
202  std::cout << "ParamLast Momentum: " << momLast.X() << " " << momLast.Y() << " " << momLast.Z() << std::endl;
203  std::cout << "Charge: " << parLast.GetQ() << std::endl;
204 
205  if (fDoPropagation)
206  PropagateTrackHelix(parLast, pidHypo, kBlue, arrowList);
207 
208 // PropagateTrack(parLast, pidHypo, kBlue, arrowList);
209  fListOfTracks->AddElement(arrowList);
210 
211  }
212  gEve->AddElement((TEveBoxSet*)myBoxSet, fEventManager);
213 
214  //for (Int_t i=0; i<fEveTrList->GetEntriesFast(); i++){ //[R.K. 01/2017] unused variable
215  //TEveTrackList *TrListIn=( TEveTrackList *) fEveTrList->At(i); //[R.K. 01/2017] unused variable
216  //TrListIn->FindMomentumLimits(TrListIn, kFALSE);
217  //} //[R.K. 01/2017] unused variable
218  // fEventManager->SetEvtMaxEnergy(MaxEnergyLimit);
219  // fEventManager->SetEvtMinEnergy(MinEnergyLimit);
220  gEve->Redraw3D(kFALSE);
221  }
222 }
223 
224 void PndTrackDraw::PropagateTrackHelix(FairTrackParP& trackPar, Int_t pidHypo, Int_t color, TEveElement* group)
225 {
226  Int_t Np = 100;
227 
228  TVector3 posTrack = trackPar.GetPosition();
229  TVector3 momTrack = trackPar.GetMomentum();
230  Double_t charge = trackPar.GetQ();
231 
232  FairField* Field = FairRunAna::Instance()->GetField();
233  Double_t po[3], BB[3];
234  po[0]=0.;
235  po[1]=0.;
236  po[2]=0.;
237  Field->GetFieldValue(po,BB);
238  cout<<"Field Strength: "<<BB[2]/10.<<endl;
239 
240  PndHelixPropagator prop(BB[2]/10., posTrack, momTrack, charge); //Field is given in Gauss from GetField()
241  prop.PropagateToXYPos(TVector2(0,0));
242 
243  if (pidHypo == 0){
244  pidHypo = 211;
245  if (charge < 0)
246  pidHypo *= -1;
247  }
248 
249  TParticle *P = new TParticle(pidHypo, 0, -1, -1, -1, -1, TLorentzVector(momTrack, 10), TLorentzVector(posTrack, 0));
250 
251  fTrList = GetTrGroup(pidHypo);
252  TEveTrack *track = new TEveTrack(P, pidHypo, fTrPr);
253  track->SetLineColor(color);
254 
255  Int_t index = 0;
256  for (Int_t n = -Np; n < Np; n++){
257  FairTrackPar result = prop.PropagateByAngle(n);
258 
259  track->SetPoint(index++, result.GetX(), result.GetY(), result.GetZ());
260  TEveVector pos = TEveVector(result.GetX(), result.GetY(), result.GetZ());
261  TEvePathMark *path = new TEvePathMark();
262  path->fV = pos;
263  path->fTime = n;
264  if (n == 0) {
265  TEveVector mom = TEveVector(result.GetPx(), result.GetPy(),result.GetPz());
266  path->fP = mom;
267  track->SetPoint(index++, posTrack.X(), posTrack.Y(), posTrack.Z());
268  }
269  if (fVerbose > 3)
270  cout << "Path marker added " << path << endl;
271  #if ROOT_VERSION_CODE <= ROOT_VERSION(5,18,0)
272  track->AddPathMark(path);
273  #else
274  track->AddPathMark(*path);
275  #endif
276  if (fVerbose > 3)
277  cout << "Path marker added " << path << endl;
278  }
279  if (group != 0)
280  group->AddElement(track);
281  else
282  fTrList->AddElement(track);
283  if (fVerbose > 3)
284  cout << "track added " << track->GetName() << endl;
285 }
286 
287 void PndTrackDraw::PropagateTrack(FairTrackParP& trackPar, Int_t pidHypo, Int_t color, TEveElement* group)
288 {
289  // FIXME Defuncted the function. Not ready, yet??
290  return;
291  TVector3 posTrack = trackPar.GetPosition();
292  TVector3 momTrack = trackPar.GetMomentum();
293  Double_t charge = trackPar.GetQ();
294 
295  if (pidHypo == 0){
296  pidHypo = 211;
297  if (charge < 0)
298  pidHypo *= -1;
299  }
300 
301  if (color < 0) color = fEventManager->Color(pidHypo);
302 
303  Int_t Np = 100;
304 
305  TVector3 startU(1., 0., 0.);
306  TVector3 startV(0., 1., 0.);
307  fPro->PropagateFromPlane(startU, startV);
308 
309  TVector3 stopTrack(0., 0., posTrack.z() - Np);
310  fPro->PropagateToPlane(stopTrack, startU, startV);
311  FairTrackParP parResult;
312  fPro->setBackProp();
313  fPro->Propagate(&trackPar, &parResult, pidHypo);
314 
315  TVector3 posStart = parResult.GetPosition();
316  TVector3 momStart = parResult.GetMomentum();
317 
318  if (fVerbose > 1)
319  std::cout << "PosStart: " << posStart.X() << " " << posStart.Y() << " "
320  << posStart.Z() << std::endl;
321 
322  TParticle *P = new TParticle(pidHypo, 0, -1, -1, -1, -1, TLorentzVector(
323  momStart, 10), TLorentzVector(posStart, 0));
324 
325  fTrList = GetTrGroup(pidHypo);
326  TEveTrack *track = new TEveTrack(P, pidHypo, fTrPr);
327  track->SetLineColor(color);
328 
329  fPro->PropagateFromPlane(startU, startV);
330 
331 
332  Int_t index = 0;
333  for (Int_t n = -Np; n < Np; n++) {
334  if (n == 0)
335  continue;
336  TVector3 stopO(0., 0., posTrack.z() + (0.1) * n);
337  fPro->PropagateToPlane(stopO, startU, startV);
338  //FairTrackParP parResult;
339  if (n * momTrack.Z() < 0)
340  fPro->setBackProp();
341  fPro->Propagate(&trackPar, &parResult, pidHypo);
342 
343  if (fVerbose > 2)
344  std::cout << "ParResult " << n << ": " << parResult.GetX() << " "
345  << parResult.GetY() << " " << parResult.GetZ() << std::endl;
346 
347  track->SetPoint(index++, parResult.GetX(), parResult.GetY(),
348  parResult.GetZ());
349  TEveVector pos = TEveVector(parResult.GetX(), parResult.GetY(),
350  parResult.GetZ());
351  TEvePathMark *path = new TEvePathMark();
352  path->fV = pos;
353  path->fTime = n;
354  if (n == 0) {
355  TEveVector mom = TEveVector(parResult.GetPx(), parResult.GetPy(),
356  parResult.GetPz());
357  path->fP = mom;
358  track->SetPoint(index++, posTrack.X(), posTrack.Y(), posTrack.Z());
359  }
360  if (fVerbose > 3)
361  cout << "Path marker added " << path << endl;
362 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,18,0)
363  track->AddPathMark(path);
364 #else
365  track->AddPathMark(*path);
366 #endif
367  if (fVerbose > 3)
368  cout << "Path marker added " << path << endl;
369  }
370  if (group != 0)
371  group->AddElement(track);
372  else
373  fTrList->AddElement(track);
374  if (fVerbose > 3)
375  cout << "track added " << track->GetName() << endl;
376 }
377 
378 
379 
380 // -------------------------------------------------------------------------
382 {
383 
384 }
385 
386 // -------------------------------------------------------------------------
388 {
389 
390 }
391 // -------------------------------------------------------------------------
393 {
394  for (Int_t i=0; i<fEveTrList->GetEntriesFast(); i++){
395  TEveTrackList *ele=( TEveTrackList *) fEveTrList->At(i);
396  gEve->RemoveElement(ele,fEventManager);
397  }
398  fEveTrList->Clear();
399  for (size_t j = 0; j < fArrows.size(); j++){
400  gEve->RemoveElement(fArrows[j], fEventManager);
401  //delete(fArrows[j]);
402  }
403  if (fListOfTracks != 0){
404  gEve->RemoveElement(fListOfTracks, fEventManager);
405  //delete(fListOfTracks);
406  }
407  fArrows.clear();
408 }
409 
410 TEveTrackList *PndTrackDraw::GetTrGroup(Int_t pid)
411 {
412  std::ostringstream myStream;
413  myStream << pid;
414  std::string pidString(myStream.str());
415  fTrList=0;
416  for (Int_t i=0; i<fEveTrList->GetEntriesFast(); i++){
417  TEveTrackList *TrListIn=( TEveTrackList *) fEveTrList->At(i);
418  std::string name(TrListIn->GetName());
419  if ( name == pidString ) {
420  fTrList= TrListIn;
421  break;
422  }
423  }
424  if(fTrList ==0){
425  fTrPr=new TEveTrackPropagator();
426  fTrList= new TEveTrackList(pidString.c_str(),fTrPr );
427  fTrList->SetMainColor(fEventManager->Color(pid));
428  fEveTrList->Add(fTrList);
429  // gEve->AddElement( fTrList ,fEventManager );
430  fTrList->SetRnrLine(kTRUE);
431  }
432  return fTrList;
433 }
434 
436 {
438 }
439 
441 {
443 }
444 
445 
447 
448 
TVector3 pos
TEveElementList * fListOfTracks
Definition: PndTrackDraw.h:89
FairGeanePro * fPro
Definition: PndTrackDraw.h:83
int fVerbose
Definition: poormantracks.C:24
virtual InitStatus Init()
virtual void Finish()
void propagate(TLorentzVector &l, TVector3 &p, float charge, TH2F *hpro=0)
Double_t MinEnergyLimit
Definition: PndTrackDraw.h:91
TObjArray * fEveTrList
Definition: PndTrackDraw.h:79
Int_t i
Definition: run_full.C:25
virtual void SetTimeWindowPlus(Double_t val)
virtual void SetTimeWindowMinus(Double_t val)
PndRiemannTrack track
Definition: RiemannTest.C:33
FairEventManager * fEventManager
Definition: PndTrackDraw.h:78
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
Double_t fTimeWindowMinus
Definition: PndTrackDraw.h:68
int n
TEveTrackPropagator * fTrPr
Definition: PndTrackDraw.h:77
int pid()
FairTrackPar PropagateByAngle(Double_t step)
Double_t mom
Definition: plot_dirc.C:14
void PropagateTrackHelix(FairTrackParP &trackPar, Int_t pidHypo, Int_t color=-1, TEveElement *group=0)
Double_t MaxEnergyLimit
Definition: PndTrackDraw.h:92
Bool_t fDoPropagation
Definition: PndTrackDraw.h:87
std::vector< TEveArrow * > fArrows
Definition: PndTrackDraw.h:86
Double_t fTimeWindowPlus
Definition: PndTrackDraw.h:67
TString fEvent
Definition: PndTrackDraw.h:80
PndTrackCand GetTrackCand()
Definition: PndTrack.h:47
Double_t
Double_t fStartTime
Definition: PndTrackDraw.h:69
TClonesArray * fPndTrackList
Definition: PndTrackDraw.h:76
BinaryFunctor * fStopFunctor
Definition: PndTrackDraw.h:96
virtual void SetParContainers()
FairTrackParP GetParamLast()
Definition: PndTrack.h:50
TEveTrackList * GetTrGroup(Int_t pid)
TString name
void PropagateTrack(FairTrackParP &trackPar, Int_t pidHypo, Int_t color=-1, TEveElement *group=0)
BinaryFunctor * fStartFunctor
Definition: PndTrackDraw.h:95
TEveTrackList * fTrList
Definition: PndTrackDraw.h:81
virtual ~PndTrackDraw()
GeV c P
FairTrackPar PropagateToXYPos(TVector2 xyPos)
virtual void AddBoxesPndTrackCand(FairBoxSet *set, TObject *obj, Int_t i=0)
Int_t GetPidHypo() const
Definition: PndTrack.h:32
ClassImp(PndAnaContFact)
Int_t iVerbose
virtual void Exec(Option_t *option)
Bool_t fUseEventTime
Definition: PndTrackDraw.h:70
virtual InitStatus Init()
void Print()
Definition: PndTrack.cxx:39
PndTrackDraw(Bool_t propagation=kFALSE)
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49
PndTrackCandDraw * fTrackCandDraw
Definition: PndTrackDraw.h:85
Double_t PEnergy
Definition: PndTrackDraw.h:93