BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
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
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
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 =
167 // static_cast<BmnSiliconTrack*>(fSiliconTrackList->UncheckedAt(tr->GetSilTrackIndex())); for (Int_t k = 0;
168 // k < silicon_track->GetNHits(); k++)
169 // track_points.insert(static_cast<FairHit*>(fSiliconHitList->UncheckedAt(silicon_track->GetHitIndex(k))));
170 // }
171
172 // get GEM track for global track
173 if (fGemTrackList != 0 && tr->GetGemTrackIndex() > -1) {
174 auto* gem_track = static_cast<BmnGemTrack*>(fGemTrackList->UncheckedAt(tr->GetGemTrackIndex()));
175 for (Int_t k = 0; k < gem_track->GetNHits(); k++)
176 track_points.insert(static_cast<FairHit*>(fGemHitList->UncheckedAt(gem_track->GetHitIndex(k))));
177 }
178
179 // get Sts track for global track
180 if (fStsTrackList != 0 && tr->GetGemTrackIndex() > -1) {
181 auto* sts_track = static_cast<CbmStsTrack*>(fStsTrackList->UncheckedAt(tr->GetGemTrackIndex()));
182 for (Int_t k = 0; k < sts_track->GetNStsHits(); k++)
183 track_points.insert(static_cast<FairHit*>(fStsHitList->UncheckedAt(sts_track->GetStsHitIndex(k))));
184 }
185
186 // get StsVector track for global track
187 if (fStsVectorTrackList != 0 && tr->GetGemTrackIndex() > -1) {
188 auto* sts_track = static_cast<CbmStsTrack*>(fStsVectorTrackList->UncheckedAt(tr->GetGemTrackIndex()));
189 for (Int_t k = 0; k < sts_track->GetNStsHits(); k++)
190 track_points.insert(static_cast<FairHit*>(fStsHitList->UncheckedAt(sts_track->GetStsHitIndex(k))));
191 }
192
193 // add CSC hit
194 // if (fCscHitList != 0 && tr->GetCscHitIndex(0) > -1) {
195 // track_points.insert(static_cast<FairHit*>(fCscHitList->UncheckedAt(tr->GetCscHitIndex(0))));
196 // }
197
198 // add TOF1 hit
199 if (fTof1HitList != 0 && tr->GetTof1HitIndex() > -1) {
200 track_points.insert(static_cast<FairHit*>(fTof1HitList->UncheckedAt(tr->GetTof1HitIndex())));
201 }
202
203 // add TOF2 hit
204 if (fTof2HitList != 0 && tr->GetTof2HitIndex() > -1) {
205 track_points.insert(static_cast<FairHit*>(fTof2HitList->UncheckedAt(tr->GetTof2HitIndex())));
206 }
207
208 // add DCH hit
209 // if (fDchTrackList != 0 && tr->GetDchTrackIndex() > -1) {
210 // BmnDchTrack* dch_track = static_cast<BmnDchTrack*>(fDchTrackList->UncheckedAt(tr->GetDchTrackIndex()));
211 // for (Int_t k = 0; k < dch_track->GetNHits(); k++)
212 // track_points.insert((FairHit*)fDchTrackList->UncheckedAt(dch_track->GetHitIndex(k)));
213 // }
214
215 Int_t n = 0;
216 for (auto& hit : track_points) {
217 track->SetPoint(n, hit->GetX(), hit->GetY(), hit->GetZ());
218
219 auto* path = new TEvePathMark();
220 TEveVector pos(hit->GetX(), hit->GetY(), hit->GetZ());
221 path->fV = pos;
222 path->fTime = hit->GetTimeStamp();
223 if (n == 0) {
224 TEveVector Mom(px, py, pz);
225 path->fP = Mom;
226 }
227
228 // add path marker for current EVE track
229 track->AddPathMark(*path);
230
231 if (fVerbose > 3)
232 cout << "Path marker added " << path << endl;
233 n++;
234 }
235
236 // add track to EVE track list
237 fTrList->AddElement(track);
238
239 if (fVerbose > 3)
240 cout << "Track added " << track->GetName() << endl;
241 }
242
243 // redraw EVE scenes
244 gEve->Redraw3D(kFALSE);
245}
246
247// destructor
249
251
253
255{
256 // clear EVE track lists (fEveTrList)
257 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
258 auto* ele = static_cast<TEveTrackList*>(fEveTrList->At(i));
259 gEve->RemoveElement(ele, MpdEventManager::Instance()->EveRecoTracks);
260 }
261
262 fEveTrList->Clear();
263}
264
265// return pointer to EVE track list for given group_name and/or particle name. if list don't exist then create it
267{
268 fTrList = 0;
269 TString track_group = "";
270 if ((group_name != nullptr) && (strcmp(group_name, "")))
271 track_group += group_name;
272 if (P != nullptr) {
273 if (track_group != "")
274 track_group += "_";
275 track_group += P->GetName();
276 }
277 if (track_group == "") {
278 LOG(error) << "BmnTrackDrawH::GetTrGroup() function parameteres are empty (null)";
279 return nullptr;
280 }
281
282 // search if there us existing track list for this particle (with given name)
283 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
284 TEveTrackList* TrListIn = (TEveTrackList*)fEveTrList->At(i);
285 if (strcmp(TrListIn->GetName(), track_group.Data()) == 0) {
286 fTrList = TrListIn;
287 break;
288 }
289 }
290
291 // create new track list for new name
292 if (fTrList == 0) {
294 fTrList = new TEveTrackList(track_group, fTrPr);
295 // set track color by particle PDG from MpdEventManager if group_name is not set
296 Int_t new_color = 0;
297 if (group_name == nullptr)
298 new_color = fEventManager->Color(P->GetPdgCode());
299 else
300 new_color =
301 track_group.Hash() % 9
302 + 2; // fEventManager->EveRecoTracks == nullptr ? 2 : fEventManager->EveRecoTracks->NumChildren() + 2;
303 fTrList->SetMainColor(new_color);
304 fEveTrList->Add(fTrList);
305 fTrList->SetRnrLine(kTRUE);
306
308 }
309
310 return fTrList;
311}
@ RecoTrackList
int i
Definition P4_F32vec4.h:22
int Int_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
R__EXTERN TEveManager * gEve
TEvePathMarkT< Float_t > TEvePathMark
TEveVectorT< Float_t > TEveVector
TRObject operator()(const T1 &t1) const
unique_ptr< TClonesArray > fGemHitList
MpdEventManager * fEventManager
unique_ptr< TClonesArray > fSiliconTrackList
unique_ptr< TClonesArray > fUpstreamTrackList
unique_ptr< TClonesArray > fTrackList
unique_ptr< TClonesArray > fSiliconHitList
unique_ptr< TClonesArray > fCscHitList
unique_ptr< TClonesArray > fStsHitList
TEveTrackList * GetTrGroup(const char *group_name, TParticle *P=nullptr)
TEveTrackList * fTrList
unique_ptr< TClonesArray > fStsVectorTrackList
unique_ptr< TClonesArray > fStsTrackList
virtual void SetParContainers()
unique_ptr< TClonesArray > fTof2HitList
unique_ptr< TClonesArray > fGemTrackList
unique_ptr< TClonesArray > fUpstreamHitList
TEveTrackPropagator * fTrPr
virtual InitStatus Init()
virtual void Exec(Option_t *option)
unique_ptr< TClonesArray > fDchTrackList
unique_ptr< TClonesArray > fTof1HitList
unique_ptr< TClonesArray > fDchHitList
BmnGlobalTrack.h.
static MpdEventManager * Instance()
void AddEventElement(TEveElement *element, ElementList element_list)
const char * GetName() const override
Int_t GetPdgCode() const
const char * GetName() const override
const char * Data() const
UInt_t Hash(ECaseCompare cmp=kExact) const
Double_t Z() const
Double_t Y() const
Double_t X() const
Double_t Abs(Double_t d)