BmnRoot
Loading...
Searching...
No Matches
BmnTrackDrawP.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// ----- BmnTrackDrawP source file -----
3// ----- Created 02/12/15 by K. Gertsenberger -----
4// -------------------------------------------------------------------------
5
6#include "BmnTrackDrawP.h"
7#include "BmnTrack.h"
8#include "CbmStack.h"
9
10#include "TROOT.h"
11#include "TGeant3.h"
12#include "TGeant3TGeo.h"
13#include "TEveTrackPropagator.h"
14#include "TEveManager.h"
15#include "TDatabasePDG.h"
16
17#include <iostream>
18using namespace std;
19
20// ----- Default constructor -------------------------------------------
22: FairTask("BmnTrackDrawP", 0),
23 fEventManager(nullptr),
24 fTrackList(nullptr),
25 fTrList(nullptr),
26 fPro(nullptr),
27 fTrPr(nullptr),
28 fEveTrList(nullptr),
29 fTrajFilter(nullptr)
30{}
31
32// ----- Standard constructor ------------------------------------------
33BmnTrackDrawP::BmnTrackDrawP(const char* name, Int_t iVerbose)
34: FairTask(name, iVerbose),
35 fEventManager(nullptr),
36 fTrackList(nullptr),
37 fTrList(nullptr),
38 fPro(nullptr),
39 fTrPr(nullptr),
40 fEveTrList(new TObjArray(16)),
41 fTrajFilter(nullptr)
42{}
43
44
46{
47 if (fVerbose > 1)
48 cout<<"BmnTrackDrawP::Init()"<<endl;
49
51 if (fVerbose > 2)
52 cout<<"BmnTrackDrawP::Init() get instance of EventManager"<<endl;
53
54 FairRootManager* fManager = FairRootManager::Instance();
55 if (fVerbose > 2)
56 cout<<"BmnExpTrackDraw::Init() get instance of FairRootManager: "<<fManager<<endl;
57
58 fTrackList = (TClonesArray*)fManager->GetObject(GetName());
59 if (fVerbose > 2)
60 cout<<"BmnTrackDrawP::Init() get track list " <<fTrackList<<" from branch '"<<GetName()<<"'"<<endl;
61
62 if (gMC == NULL)
63 InitGeant3();
64
65 fPro = new FairGeanePro();
66
67 fTrajFilter = FairTrajFilter::Instance();
68
69 return kSUCCESS;
70}
71
73{
75 TString work = getenv("VMCWORKDIR");
76 TString work_config = work + "/gconfig/";
77 TString LibMacro = work_config + "g3libs.C";
78 TString ConfigMacro = work_config + "g3Config.C";
79 TString cuts = work_config + "SetCuts.C";
80
81 // Now load the Config and Cuts
82 gROOT->LoadMacro(LibMacro.Data());
83 gROOT->ProcessLine("g3libs()");
84
85 //gROOT->LoadMacro(ConfigMacro.Data());
86 //gROOT->ProcessLine("Config()");
87
88 TGeant3* geant3 = new TGeant3TGeo("C++ Interface to Geant3");
89 //TGeant3* geant3 = new TGeant3("C++ Interface to Geant3");
90 // create Cbm Specific Stack
91 CbmStack *st = new CbmStack();
92 // Set minimum number of points to store the track
93 // The default value is one, which means each track
94 // needs at least 1 point in any detector
95 st->SetMinPoints(1);
96 geant3->SetStack(st);
97 // ******* GEANT3 specific configuration for simulated Runs *******
98 geant3->SetTRIG(1); //Number of events to be processed
99 geant3->SetSWIT(4, 100);
100 geant3->SetDEBU(0, 0, 1);
101 geant3->SetRAYL(1);
102 geant3->SetSTRA(0); //1);
103 geant3->SetAUTO(0); //Select automatic STMIN etc... calc. (AUTO 1) or manual (AUTO 0)
104 geant3->SetABAN(0); //Restore 3.16 behaviour for abandoned tracks
105 geant3->SetOPTI(2); //Select optimisation level for GEANT geometry searches (0,1,2)
106 geant3->SetERAN(5.e-7);
107 geant3->SetCKOV(1); // cerenkov photons
108
109 gROOT->LoadMacro(cuts);
110 gROOT->ProcessLine("SetCuts()");
111
112 //gMC->SetMagField(fxField);
113 //gMC->Init();
114 gMC->BuildPhysics();
115}
116
117// -------------------------------------------------------------------------
118void BmnTrackDrawP::Exec(Option_t* option)
119{
120 if (!IsActive())
121 return;
122
123 if (fVerbose > 1)
124 cout<<"BmnTrackDrawP::Exec"<< endl;
125
126 Reset();
127
128 BmnTrack* current_track;
129 cout<<"Tracks: "<<fTrackList->GetEntriesFast()<<endl;
130 for (Int_t i = 0; i < fTrackList->GetEntriesFast(); i++)
131 {
132 if (fVerbose > 2)
133 cout<<"BmnTrackDrawP::Exec "<<i<<endl;
134
135 current_track = (BmnTrack*) fTrackList->At(i);
136 FairTrackParam* pParamFirst = (FairTrackParam*) current_track->GetParamFirst();
137
138 // define whether track AL-TURAis primary
139 bool isPrimary = ( (TMath::Abs(pParamFirst->GetX())<10) && (TMath::Abs(pParamFirst->GetY())<10) && (TMath::Abs(pParamFirst->GetZ())<10) );
140
141 // skip secondary tracks if primary flag is set
142 if (fEventManager->IsPriOnly() && (!isPrimary))
143 continue;
144
145 // set PDG particle code
146 int particlePDG = 2212; // 0; // without identification - Rootino
147
148 // get momentum
149 TVector3 mom;
150 pParamFirst->SetQp(1);
151 pParamFirst->Momentum(mom);
152 Double_t px = mom.X(), py = mom.Y(), pz = mom.Z();
153
154 // create particle
155 //TParticlePDG* fParticlePDG = TDatabasePDG::Instance()->GetParticle(particlePDG);
156 //TParticle(Int_t pdg, Int_t status, Int_t mother1, Int_t mother2, Int_t daughter1, Int_t daughter2, Double_t px, Double_t py, Double_t pz, Double_t etot, Double_t vx, Double_t vy, Double_t vz, Double_t time)
157 TParticle* P = new TParticle(particlePDG, i, -1, -1, -1, -1, px, py, pz, 0, pParamFirst->GetX(), pParamFirst->GetY(), pParamFirst->GetZ(), 0);
158
159 // get EVE track list for this particle
160 fTrList = GetTrGroup(P);
161 // create EVE track corresponding global track
162 TEveTrack* track = new TEveTrack(P, particlePDG, fTrPr);
163 // set line color corresponding PDG particle code
164 track->SetLineColor(fEventManager->Color(particlePDG));
165
166 // propagate the tracks by Geane
167 x1[0] = pParamFirst->GetX();
168 x1[1] = pParamFirst->GetY();
169 x1[2] = pParamFirst->GetZ();
170 p1[0] = px;
171 p1[1] = py;
172 p1[2] = pz;
173
174 x2[0] = 0;
175 x2[1] = 0;
176 x2[2] = 0;
177 p2[0] = 0;
178 p2[1] = 0;
179 p2[2] = 0;
180
181 cout<<"Propagate track from ("<<pParamFirst->GetX()<<","<<pParamFirst->GetY()<<","<<pParamFirst->GetZ()<<") with momentum: ("
182 <<px<<","<<py<<","<<pz<<")"<<endl;
183
184 Bool_t isSuccess = fPro->Propagate(x1, p1, x2, p2, particlePDG);
185
186 cout<<"isSuccess: "<<isSuccess<<". Track end point: ("<<x2[0]<<","<<x2[1]<<","<<x2[2]<<") with momentum: ("<<p2[0]<<","<<p2[1]<<","<<p2[2]<<")"<<endl;
187
188 /*FairTrackParH* fTrackParH = new FairTrackParH(tr1.GetPos()*TMath::Cos(tr1.Theta())*TMath::Cos(tr1.Phi()),
189 tr1.GetPos()*TMath::Cos(tr1.Theta())*TMath::Sin(tr1.Phi()), tr1.GetPos()*TMath::Cos(tr1.Theta()),
190 tr1.Theta(), tr1.Phi(), 1/tr1.Momentum(), tr1.GetCovariance());
191 fGeanePro->Init(fTrackParH);
192 fGeanePro->PropagateToVolume("tof1", 1, 0);
193 fGeanePro->Propagate(211);*/
194
195 TGeoTrack* geo_track = fTrajFilter->GetCurrentTrk();
196 Int_t Np = geo_track->GetNpoints();
197 // cycle: add hits (points) to EVE path for this track
198 cout<<"Points: "<<Np<<endl;
199 for (Int_t n = 0; n < Np; n++)
200 {
201 const Double_t* point = geo_track->GetPoint(n);
202
203 track->SetPoint(n, point[0], point[1], point[2]);
204
205 TEvePathMark* path = new TEvePathMark();
206 TEveVector pos = TEveVector(point[0], point[1],point[2]);
207 //cout<<"Point: X="<<point[0]<<" Y="<<point[1]<<" Z="<<point[2]<<endl;
208 path->fV = pos;
209 path->fTime = point[3];
210 if (n == 0)
211 {
212 TEveVector Mom = TEveVector(px, py, pz);
213 path->fP = Mom;
214 }
215
216 if (fVerbose > 3)
217 cout<<"Path marker added "<<path<<endl;
218
219 // add path marker for current EVETChain* bmn_data_tree; //! track
220 track->AddPathMark(*path);
221
222 if (fVerbose > 3)
223 cout<<"Path marker added "<<path<<endl;
224 }
225
226 // add track to EVE track list
227 fTrList->AddElement(track);
228
229 if (fVerbose > 3)
230 cout<<"track added "<<track->GetName()<<endl;
231 }
232
234
235 // redraw EVE scenes
236 gEve->Redraw3D(kFALSE);
237}
238
239// ----- Destructor ----------------------------------------------------
243
244// -------------------------------------------------------------------------
248
249// -------------------------------------------------------------------------
251{
252}
253
254// -------------------------------------------------------------------------
256{
257 // clear EVE track lists (fEveTrList)
258 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++)
259 {
260 TEveTrackList* ele = (TEveTrackList*) fEveTrList->At(i);
261 gEve->RemoveElement(ele, fEventManager->EveRecoTracks);
262 }
263
264 fEveTrList->Clear();
265}
266
267TEveTrackList* BmnTrackDrawP::GetTrGroup(TParticle* P)
268{
269 fTrList = 0;
270
271 // serch if there us existing track list for this particle (with given name)
272 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++)
273 {
274 TEveTrackList* TrListIn = (TEveTrackList*) fEveTrList->At(i);
275 if (strcmp(TrListIn->GetName(), P->GetName()) == 0)
276 {
277 fTrList = TrListIn;
278 break;
279 }
280 }
281
282 // create new track list for new particle's name
283 if (fTrList == 0)
284 {
285 fTrPr = new TEveTrackPropagator();
286 fTrList = new TEveTrackList(P->GetName(), fTrPr);
287 fTrList->SetMainColor(fEventManager->Color(P->GetPdgCode()));
288 fEveTrList->Add(fTrList);
289
290 gEve->AddElement(fTrList, fEventManager->EveRecoTracks);
291 fTrList->SetRnrLine(kTRUE);
292 }
293
294 return fTrList;
295}
int i
Definition P4_F32vec4.h:22
TEveTrackList * GetTrGroup(TParticle *P)
Float_t x2[3]
Float_t x1[3]
TObjArray * fEveTrList
Float_t p1[3]
virtual void Exec(Option_t *option)
MpdEventManager * fEventManager
FairGeanePro * fPro
virtual ~BmnTrackDrawP()
virtual void Finish()
virtual InitStatus Init()
TEveTrackList * fTrList
Float_t p2[3]
virtual void SetParContainers()
FairTrajFilter * fTrajFilter
TClonesArray * fTrackList
TEveTrackPropagator * fTrPr
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:72
void SetMinPoints(Int_t min)
Definition CbmStack.h:175
virtual Bool_t IsPriOnly()
static MpdEventManager * Instance()
TEveElementList * EveRecoTracks
void AddEventElement(TEveElement *element, ElementList element_list)
virtual Int_t Color(Int_t pdg)
@ RecoTrackList
STL namespace.