BmnRoot
Loading...
Searching...
No Matches
BmnGlobalTrackDraw.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// ----- BmnGlobalTrackDraw source file -----
3// ----- created 10/12/13 by K. Gertsenberger -----
4// ----- class to visualize reconstructed GlobalTracks in EventDisplay -----
5// -------------------------------------------------------------------------
6
8
9#include "BmnDchTrack.h"
10#include "BmnGemTrack.h"
11#include "BmnGlobalTrack.h"
12#include "BmnSiliconTrack.h"
13#include "BmnTrack.h"
14#include "CbmStsTrack.h"
15#include "FairLogger.h"
16#include "TDatabasePDG.h"
17#include "TEveManager.h"
18#include "TEvePathMark.h"
19#include "TEveVector.h"
20
21#include <iostream>
22using namespace std;
23
36
37// default constructor
39 : FairTask("BmnGlobalTrackDraw", 0)
40 , fTrackList(nullptr)
41 , fTrPr(nullptr)
42 , fEveTrList(nullptr)
43 , fTrList(nullptr)
44{}
45
46// standard constructor
47BmnGlobalTrackDraw::BmnGlobalTrackDraw(const char* name, Int_t iVerbose)
48 : FairTask(name, iVerbose)
49 , fTrackList(nullptr)
50 , fTrPr(nullptr)
51 , fEveTrList(new TObjArray(16))
52 , fTrList(nullptr)
53{}
54
55// initialization of the track drawing task
57{
58 if (fVerbose > 0)
59 cout << "BmnGlobalTrackDraw::Init()" << endl;
60
61 fTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject(GetName())));
62 if (!fTrackList) {
63 LOG(error) << "BmnGlobalTrackDraw::Init() branch GlobalTrack not "
64 "found! Task will be deactivated";
65 SetActive(kFALSE);
66 return kERROR;
67 }
68
70
71 fUpstreamHitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnUpstreamHit")));
72 fUpstreamTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnUpstreamTrack")));
73
74 fSiliconHitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnSiliconHit")));
75 fSiliconTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnSiliconTrack")));
76
77 fGemHitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnGemStripHit")));
78 fGemTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnGemTrack")));
79
80 fStsHitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("StsHit")));
81 fStsTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("StsTrack")));
82
83 fStsVectorTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("StsVector")));
84
85 fCscHitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnCSCHit")));
86
87 fTof1HitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnTof400Hit")));
88 fTof2HitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnTof700Hit")));
89
90 fDchHitList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnDchHit")));
91 fDchTrackList.reset(static_cast<TClonesArray*>(FairRootManager::Instance()->GetObject("BmnDchTrack")));
92
93 if (fVerbose > -10)
94 cout << "BmnGlobalTrackDraw::Init() get instance of MpdEventManager " << endl;
95
96 return kSUCCESS;
97}
98
99void BmnGlobalTrackDraw::Exec(Option_t* option)
100{
101 if (!IsActive())
102 return;
103
104 if (fVerbose > 1)
105 cout << " BmnGlobalTrackDraw::Exec " << endl;
106
107 Reset();
108
109 struct PointCompare
110 {
111 bool operator()(const FairHit* a, const FairHit* b) const { return a->GetZ() < b->GetZ(); }
112 };
113
114 for (Int_t i = 0; i < fTrackList->GetEntriesFast(); i++) {
115 if (fVerbose > 1)
116 cout << "BmnGlobalTrackDraw::Exec " << i << endl;
117
118 auto* tr = (BmnGlobalTrack*)fTrackList->At(i);
119 const auto* pParamFirst = tr->GetParamFirst();
120
121 // define whether track is primary
122 bool isPrimary = ((TMath::Abs(pParamFirst->GetX()) < 10) && (TMath::Abs(pParamFirst->GetY()) < 10)
123 && (TMath::Abs(pParamFirst->GetZ()) < 10));
124
125 // skip secondary tracks if primary flag is set
126 if (MpdEventManager::Instance()->IsPriOnly() && (!isPrimary))
127 continue;
128
129 // get PDG particle code, without identification - Rootino
130 int particlePDG = 0;
131
132 // get momentum
133 TVector3 mom;
134 pParamFirst->Momentum(mom);
135 Double_t px = mom.X(), py = mom.Y(), pz = mom.Z();
136
137 // create particle
138 // TParticlePDG *fParticlePDG = TDatabasePDG::Instance()->GetParticle(particlePDG);
139 TParticle* P = new TParticle(particlePDG, i, -1, -1, -1, -1, px, py, pz, 0, pParamFirst->GetX(),
140 pParamFirst->GetY(), pParamFirst->GetZ(), 0);
141
142 // get EVE track list for this particle
143 fTrList = GetTrGroup(TString(GetName()), P);
144 // create EVE track corresponding global track
145 auto* track = new TEveTrack(P, particlePDG, fTrPr);
146 // set line color corresponding PDG particle code
147 track->SetLineColor(fTrList->GetMainColor());
148 track->SetLineWidth(2);
149
150 multiset<FairHit*, PointCompare> track_points;
151
152 // get upstream track for global track
153 // if (tr->GetUpstreamTrackIndex() > -1) // KG почему закомментировано (это только для src, да и то не
154 // работает)
155 // {
156 // auto *upstream_track = static_cast<BmnTrack *>(
157 // fUpstreamTrackList->UncheckedAt(tr->GetUpstreamTrackIndex()));
158 // for (Int_t k = 0; k < upstream_track->GetNHits(); k++)
159 // track_points.insert(
160 // static_cast<FairHit *>(fUpstreamTrackList->UncheckedAt(
161 // upstream_track->GetHitIndex(k))));
162 // }
163
164 // get Silicon track for global track
165 if (fSiliconTrackList != 0 && tr->GetSilTrackIndex() > -1) {
166 auto* silicon_track = static_cast<BmnSiliconTrack*>(fSiliconTrackList->UncheckedAt(tr->GetSilTrackIndex()));
167 for (Int_t k = 0; k < silicon_track->GetNHits(); k++)
168 track_points.insert(static_cast<FairHit*>(fSiliconHitList->UncheckedAt(silicon_track->GetHitIndex(k))));
169 }
170
171 // get GEM track for global track
172 if (fGemTrackList != 0 && tr->GetGemTrackIndex() > -1) {
173 auto* gem_track = static_cast<BmnGemTrack*>(fGemTrackList->UncheckedAt(tr->GetGemTrackIndex()));
174 for (Int_t k = 0; k < gem_track->GetNHits(); k++)
175 track_points.insert(static_cast<FairHit*>(fGemHitList->UncheckedAt(gem_track->GetHitIndex(k))));
176 }
177
178 // get Sts track for global track
179 if (fStsTrackList != 0 && tr->GetGemTrackIndex() > -1) {
180 auto* sts_track = static_cast<CbmStsTrack*>(fStsTrackList->UncheckedAt(tr->GetGemTrackIndex()));
181 for (Int_t k = 0; k < sts_track->GetNStsHits(); k++)
182 track_points.insert(static_cast<FairHit*>(fStsHitList->UncheckedAt(sts_track->GetStsHitIndex(k))));
183 }
184
185 // get StsVector track for global track
186 if (fStsVectorTrackList != 0 && tr->GetGemTrackIndex() > -1) {
187 auto* sts_track = static_cast<CbmStsTrack*>(fStsVectorTrackList->UncheckedAt(tr->GetGemTrackIndex()));
188 for (Int_t k = 0; k < sts_track->GetNStsHits(); k++)
189 track_points.insert(static_cast<FairHit*>(fStsHitList->UncheckedAt(sts_track->GetStsHitIndex(k))));
190 }
191
192 // add CSC hit
193 if (fCscHitList != 0 && tr->GetCscHitIndex(0) > -1) {
194 track_points.insert(static_cast<FairHit*>(fCscHitList->UncheckedAt(tr->GetCscHitIndex(0))));
195 }
196
197 // add TOF1 hit
198 if (fTof1HitList != 0 && tr->GetTof1HitIndex() > -1) {
199 track_points.insert(static_cast<FairHit*>(fTof1HitList->UncheckedAt(tr->GetTof1HitIndex())));
200 }
201
202 // add TOF2 hit
203 if (fTof2HitList != 0 && tr->GetTof2HitIndex() > -1) {
204 track_points.insert(static_cast<FairHit*>(fTof2HitList->UncheckedAt(tr->GetTof2HitIndex())));
205 }
206
207 // add DCH hit
208 if (fDchTrackList != 0 && tr->GetDchTrackIndex() > -1) {
209 BmnDchTrack* dch_track = static_cast<BmnDchTrack*>(fDchTrackList->UncheckedAt(tr->GetDchTrackIndex()));
210 for (Int_t k = 0; k < dch_track->GetNHits(); k++)
211 track_points.insert((FairHit*)fDchTrackList->UncheckedAt(dch_track->GetHitIndex(k)));
212 }
213
214 Int_t n = 0;
215 for (auto& hit : track_points) {
216 track->SetPoint(n, hit->GetX(), hit->GetY(), hit->GetZ());
217
218 auto* path = new TEvePathMark();
219 TEveVector pos(hit->GetX(), hit->GetY(), hit->GetZ());
220 path->fV = pos;
221 path->fTime = hit->GetTimeStamp();
222 if (n == 0) {
223 TEveVector Mom(px, py, pz);
224 path->fP = Mom;
225 }
226
227 // add path marker for current EVE track
228 track->AddPathMark(*path);
229
230 if (fVerbose > 3)
231 cout << "Path marker added " << path << endl;
232 n++;
233 }
234
235 // add track to EVE track list
236 fTrList->AddElement(track);
237
238 if (fVerbose > 3)
239 cout << "Track added " << track->GetName() << endl;
240 }
241
242 // redraw EVE scenes
243 gEve->Redraw3D(kFALSE);
244}
245
246// destructor
248
250
252
254{
255 // clear EVE track lists (fEveTrList)
256 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
257 auto* ele = static_cast<TEveTrackList*>(fEveTrList->At(i));
258 gEve->RemoveElement(ele, MpdEventManager::Instance()->EveRecoTracks);
259 }
260
261 fEveTrList->Clear();
262}
263
264// return pointer to EVE track list for given group_name and/or particle name. if list don't exist then create it
265TEveTrackList* BmnGlobalTrackDraw::GetTrGroup(const char* group_name, TParticle* P)
266{
267 fTrList = 0;
268 TString track_group = "";
269 if ((group_name != nullptr) && (strcmp(group_name, "")))
270 track_group += group_name;
271 if (P != nullptr) {
272 if (track_group != "")
273 track_group += "_";
274 track_group += P->GetName();
275 }
276 if (track_group == "") {
277 LOG(error) << "BmnTrackDrawH::GetTrGroup() function parameteres are empty (null)";
278 return nullptr;
279 }
280
281 // search if there us existing track list for this particle (with given name)
282 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
283 TEveTrackList* TrListIn = (TEveTrackList*)fEveTrList->At(i);
284 if (strcmp(TrListIn->GetName(), track_group.Data()) == 0) {
285 fTrList = TrListIn;
286 break;
287 }
288 }
289
290 // create new track list for new name
291 if (fTrList == 0) {
292 fTrPr = new TEveTrackPropagator();
293 fTrList = new TEveTrackList(track_group, fTrPr);
294 // set track color by particle PDG from MpdEventManager if group_name is not set
295 Int_t new_color = 0;
296 if (group_name == nullptr)
297 new_color = fEventManager->Color(P->GetPdgCode());
298 else
299 new_color =
300 track_group.Hash() % 9
301 + 2; // fEventManager->EveRecoTracks == nullptr ? 2 : fEventManager->EveRecoTracks->NumChildren() + 2;
302 fTrList->SetMainColor(new_color);
303 fEveTrList->Add(fTrList);
304 fTrList->SetRnrLine(kTRUE);
305
307 }
308
309 return fTrList;
310}
int i
Definition P4_F32vec4.h:22
unique_ptr< TClonesArray > fGemTrackList
unique_ptr< TClonesArray > fStsHitList
unique_ptr< TClonesArray > fUpstreamTrackList
unique_ptr< TClonesArray > fSiliconTrackList
unique_ptr< TClonesArray > fTrackList
unique_ptr< TClonesArray > fDchTrackList
unique_ptr< TClonesArray > fStsTrackList
MpdEventManager * fEventManager
TEveTrackList * GetTrGroup(const char *group_name, TParticle *P=nullptr)
unique_ptr< TClonesArray > fStsVectorTrackList
unique_ptr< TClonesArray > fCscHitList
virtual void SetParContainers()
unique_ptr< TClonesArray > fUpstreamHitList
unique_ptr< TClonesArray > fGemHitList
TEveTrackPropagator * fTrPr
unique_ptr< TClonesArray > fSiliconHitList
unique_ptr< TClonesArray > fTof2HitList
TEveTrackList * fTrList
unique_ptr< TClonesArray > fTof1HitList
virtual InitStatus Init()
virtual void Exec(Option_t *option)
unique_ptr< TClonesArray > fDchHitList
Int_t GetNHits() const
Definition BmnTrack.h:44
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:48
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.