BmnRoot
Loading...
Searching...
No Matches
BmnTrackDrawH.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// ----- BmnTrackDrawH source file -----
3// ----- created 05/10/15 by K. Gertsenberger -----
4// ----- class to visualize GlobalTracks from *.root in EventDisplay -----
5// -------------------------------------------------------------------------
6
7#include "BmnTrackDrawH.h"
8
9#include "BmnTrack.h"
10#include "CbmStsTrack.h"
11#include "FairHit.h"
12#include "FairLogger.h"
13#include "TDatabasePDG.h"
14#include "TEveManager.h"
15#include "TEvePathMark.h"
16#include "TEveVector.h"
17
18#include <iostream>
19using namespace std;
20
21// default constructor
23 : FairTask("BmnTrackDrawH", 0)
24 , fTrackList(nullptr)
25 , fHitList(nullptr)
26 , fTrPr(nullptr)
27 , fEventManager(nullptr)
28 , fEveTrList(nullptr)
29 , fTrList(nullptr)
30 , fHitsBranchName("")
31 , fIsCbmStsTrack(kFALSE)
32{}
33
34// standard constructor
35BmnTrackDrawH::BmnTrackDrawH(const char* name, TString hitsBranchName, Int_t iVerbose)
36 : FairTask(name, iVerbose)
37 , fTrackList(nullptr)
38 , fHitList(nullptr)
39 , fTrPr(nullptr)
40 , fEventManager(nullptr)
41 , fEveTrList(new TObjArray(16))
42 , fTrList(nullptr)
43 , fHitsBranchName(hitsBranchName)
44 , fIsCbmStsTrack(kFALSE)
45{}
46
47// initialization of the track drawing task
49{
50 if (fVerbose > 0)
51 LOG(info) << "BmnTrackDrawH::Init()";
52
54 if (fVerbose > 1)
55 LOG(debug) << "BmnTrackDrawH::Init() get instance of EventManager: " << fEventManager;
56
57 FairRootManager* fManager = FairRootManager::Instance();
58 if (fVerbose > 1)
59 LOG(debug) << "BmnTrackDrawH::Init() get instance of FairRootManager: " << fManager;
60
61 fTrackList = (TClonesArray*)fManager->GetObject(GetName());
62 if (fTrackList == 0) {
63 LOG(error) << "BmnTrackDrawH::Init() branch " << GetName() << " not found! Task will be deactivated";
64 SetActive(kFALSE);
65 return kERROR;
66 }
67 if (fVerbose > 1)
68 LOG(debug) << "BmnTrackDrawH::Init() get track list " << fTrackList << " from branch '" << GetName() << "'";
69
70 fHitList = (TClonesArray*)fManager->GetObject(fHitsBranchName);
71 if (fHitList == 0) {
72 LOG(error) << "BmnTrackDrawH::Init() branch " << fHitsBranchName << " not found! Task will be deactivated";
73 SetActive(kFALSE);
74 return kERROR;
75 }
76 if (fVerbose > 1)
77 LOG(debug) << "BmnTrackDrawH::Init() get list of hits " << fHitList << " from branch '" << fHitsBranchName
78 << "'";
79
80 fIsCbmStsTrack = fTrackList->GetClass()->InheritsFrom("CbmStsTrack");
81
82 return kSUCCESS;
83}
84
85// -------------------------------------------------------------------------
86void BmnTrackDrawH::Exec(Option_t* option)
87{
88 if (fVerbose > 0)
89 LOG(info) << "BmnTrackDrawH::Exec() ";
90
91 if (!IsActive())
92 return;
93
94 Reset();
95
96 if (fVerbose > 0)
97 LOG(info) << "BmnTrackDrawH::Exec(): the number of tracks is " << fTrackList->GetEntriesFast();
98
99 TObject* current_track;
100 for (Int_t i = 0; i < fTrackList->GetEntriesFast(); i++) {
101 if (fVerbose > 2)
102 LOG(debug) << "BmnTrackDrawH::Exec() " << i;
103
104 current_track = fTrackList->At(i);
105
106 const FairTrackParam* pParamFirst;
107 if (fIsCbmStsTrack) {
108 pParamFirst = ((CbmStsTrack*)current_track)->GetParamFirst();
109 } else {
110 pParamFirst = ((BmnTrack*)current_track)->GetParamFirst();
111 }
112
113 // define whether track is primary
114 bool isPrimary = ((TMath::Abs(pParamFirst->GetX()) < 10) && (TMath::Abs(pParamFirst->GetY()) < 10)
115 && (TMath::Abs(pParamFirst->GetZ()) < 10));
116
117 // skip secondary tracks if primary flag is set
118 if (fEventManager->IsPriOnly() && (!isPrimary))
119 continue;
120
121 // get PDG particle code, without identification - Rootino
122 int particlePDG = 0;
123
124 // get momentum
125 TVector3 mom;
126 pParamFirst->Momentum(mom);
127 Double_t px = mom.X(), py = mom.Y(), pz = mom.Z();
128
129 // create particle
130 // TParticlePDG *fParticlePDG = TDatabasePDG::Instance()->GetParticle(particlePDG);
131 TParticle* P = new TParticle(particlePDG, i, -1, -1, -1, -1, px, py, pz, 0, pParamFirst->GetX(),
132 pParamFirst->GetY(), pParamFirst->GetZ(), 0);
133
134 // get EVE track list for this particle
135 fTrList = GetTrGroup(TString(GetName()), P);
136 // create EVE track corresponding global track
137 TEveTrack* track = new TEveTrack(P, particlePDG, fTrPr);
138 // set line color corresponding PDG particle code
139 track->SetLineColor(fTrList->GetMainColor());
140 track->SetLineWidth(2);
141
142 Int_t Np;
143 if (fIsCbmStsTrack) {
144 Np = ((CbmStsTrack*)current_track)->GetNStsHits();
145 } else {
146 Np = ((BmnTrack*)current_track)->GetNHits();
147 }
148
149 // cycle: add hits (points) to EVE path for this track
150 if (fVerbose > 2)
151 LOG(debug) << "BmnTrackDrawH::Exec(): number of track hits = " << Np;
152 for (Int_t n = 0; n < Np; n++) {
153 FairHit* pHit = nullptr;
154 if (fIsCbmStsTrack) {
155 pHit = (FairHit*)fHitList->UncheckedAt(((CbmStsTrack*)current_track)->GetStsHitIndex(n));
156 } else {
157 pHit = (FairHit*)fHitList->UncheckedAt(((BmnTrack*)current_track)->GetHitIndex(n));
158 }
159
160 track->SetPoint(n, pHit->GetX(), pHit->GetY(), pHit->GetZ());
161
162 TEvePathMark* path = new TEvePathMark();
163 TEveVector pos = TEveVector(pHit->GetX(), pHit->GetY(), pHit->GetZ());
164 if (fVerbose > 3)
165 LOG(debug) << "BmnTrackDrawH::Exec(): point " << n << ": X=" << pHit->GetX() << " Y=" << pHit->GetY()
166 << " Z=" << pHit->GetZ();
167 path->fV = pos;
168 path->fTime = pHit->GetTimeStamp();
169 if (n == 0) {
170 TEveVector Mom = TEveVector(px, py, pz);
171 path->fP = Mom;
172 }
173
174 // add path marker for current EVE track
175 track->AddPathMark(*path);
176
177 if (fVerbose > 3)
178 LOG(debug) << "BmnTrackDrawH::Exec: path marker added " << path;
179 }
180
181 // add track to EVE track list
182 fTrList->AddElement(track);
183
184 if (fVerbose > 2)
185 LOG(debug) << "BmnTrackDrawH::Exec: track was added " << track->GetName();
186 }
187
188 // redraw EVE scenes
189 // gEve->Redraw3D(kFALSE);
190}
191
192// destructor
194
196
198
200{
201 // clear EVE track lists (fEveTrList)
202 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
203 TEveTrackList* ele = (TEveTrackList*)fEveTrList->At(i);
204 gEve->RemoveElement(ele, fEventManager->EveRecoTracks);
205 }
206 fEveTrList->Clear();
207}
208
209// return pointer to EVE track list for given group_name and/or particle name. if list don't exist then create it
210TEveTrackList* BmnTrackDrawH::GetTrGroup(const char* group_name, TParticle* P)
211{
212 fTrList = 0;
213 TString track_group = "";
214 if ((group_name != nullptr) && (strcmp(group_name, "")))
215 track_group += group_name;
216 if (P != nullptr) {
217 if (track_group != "")
218 track_group += "_";
219 track_group += P->GetName();
220 }
221 if (track_group == "") {
222 LOG(error) << "BmnTrackDrawH::GetTrGroup() function parameteres are empty (null)";
223 return nullptr;
224 }
225
226 // search if there us existing track list for this particle (with given name)
227 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
228 TEveTrackList* TrListIn = (TEveTrackList*)fEveTrList->At(i);
229 if (strcmp(TrListIn->GetName(), track_group.Data()) == 0) {
230 fTrList = TrListIn;
231 break;
232 }
233 }
234
235 // create new track list for new name
236 if (fTrList == 0) {
237 fTrPr = new TEveTrackPropagator();
238 fTrList = new TEveTrackList(track_group, fTrPr);
239 // set track color by particle PDG from MpdEventManager if group_name is not set
240 Int_t new_color = 0;
241 if (group_name == nullptr)
242 new_color = fEventManager->Color(P->GetPdgCode());
243 else
244 new_color =
245 track_group.Hash() % 9
246 + 2; // fEventManager->EveRecoTracks == nullptr ? 2 : fEventManager->EveRecoTracks->NumChildren() + 2;
247 fTrList->SetMainColor(new_color);
248 fEveTrList->Add(fTrList);
249 fTrList->SetRnrLine(kTRUE);
250
252 }
253
254 return fTrList;
255}
int i
Definition P4_F32vec4.h:22
virtual ~BmnTrackDrawH()
Bool_t fIsCbmStsTrack
TEveTrackPropagator * fTrPr
TEveTrackList * fTrList
TClonesArray * fTrackList
TEveTrackList * GetTrGroup(const char *group_name, TParticle *P=nullptr)
virtual void SetParContainers()
TString fHitsBranchName
MpdEventManager * fEventManager
TObjArray * fEveTrList
virtual InitStatus Init()
virtual void Exec(Option_t *option)
virtual void Finish()
TClonesArray * fHitList
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.