CbmRoot
Loading...
Searching...
No Matches
CbmEvDisTracks.cxx
Go to the documentation of this file.
1/* Copyright (C) 2007-2021 PI-UHd, GSI
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Mohammad Al-Turany, Norbert Herrmann [committer], Florian Uhlig */
4
5#// -------------------------------------------------------------------------
6// ----- following FairMCTracks source file -----
7// ----- Created 10/12/07 by M. Al-Turany -----
8// -------------------------------------------------------------------------
9#define TOFDisplay 1 // =1 means active, other: without Label and not relying on TEvePointSet
10#define TOFTtErr 1 // =1 means active, other: not relying on VelocityError of CbmTofTracklet
11
12#include "CbmEvDisTracks.h"
13
14#include "CbmTofHit.h" // for CbmTofHit
15#include "CbmTofTracklet.h" // for CbmTofTracklet
16
17#include <FairEventManager.h> // for FairEventManager
18#include <FairRootManager.h> // for FairRootManager
19#include <FairTask.h> // for FairTask, InitStatus, kERROR, kSUCCESS
20#include <Logger.h> // for LOG, Logger
21
22#include <Rtypes.h> // for ClassImp
23#include <TClonesArray.h> // for TClonesArray
24#include <TEveElement.h> // for TEveElementList
25#include <TEveManager.h> // for TEveManager, gEve
26#include <TEvePathMark.h> // for TEvePathMark
27#include <TEvePointSet.h> // for TEvePointSetArray, TEvePointSet
28#include <TEveTrack.h> // for TEveTrack, TEveTrackList
29#include <TEveTrackPropagator.h> // for TEveTrackPropagator
30#include <TEveVSDStructs.h> // for TEveRecTrack
31#include <TEveVector.h> // for TEveVector, TEveVectorT
32#include <TGLAnnotation.h>
33#include <TGLViewer.h>
34#include <TGenericClassInfo.h> // for TGenericClassInfo
35#include <TObjArray.h> // for TObjArray
36#include <TParticle.h> // for TParticle
37#include <TString.h> // for Form, TString
38
39#include <string.h> // for strcmp
40
43
44static TGLAnnotation* anne;
45static TGLAnnotation* annt;
46
47// ----- Default constructor -------------------------------------------
49 : FairTask("CbmEvDisTracks", 0)
50 , fTrackList(nullptr)
51 , fTrPr(nullptr)
52 , fEventManager(nullptr)
53 , fEveTrList(nullptr)
54 , fEvent("")
55 , fTrList(nullptr)
56 , fEvePSList(nullptr)
57 , fPSList(nullptr)
58 , fRenderP(kFALSE)
59 , fRenderT(kTRUE)
60 , MinEnergyLimit(-1.)
61 , MaxEnergyLimit(-1.)
62 , PEnergy(-1.)
63{
64 if (!fInstance) fInstance = this;
65}
66// -------------------------------------------------------------------------
67
68
69// ----- Standard constructor ------------------------------------------
70CbmEvDisTracks::CbmEvDisTracks(const char* name, Int_t iVerbose, Bool_t renderP, Bool_t renderT)
71 : FairTask(name, iVerbose)
72 , fTrackList(nullptr)
73 , fTrPr(nullptr)
74 , fEventManager(nullptr)
75 , fEveTrList(new TObjArray(16))
76 , fEvent("")
77 , fTrList(nullptr)
78 , fEvePSList(new TObjArray(8))
79 , fPSList(nullptr)
80 , fRenderP(renderP)
81 , fRenderT(renderT)
82 , MinEnergyLimit(-1.)
83 , MaxEnergyLimit(-1.)
84 , PEnergy(-1.)
85{
86 if (!fInstance) fInstance = this;
87}
88// -------------------------------------------------------------------------
90{
91 LOG(debug) << "CbmEvDisTracks::Init()";
92 FairRootManager* fManager = FairRootManager::Instance();
93 fTrackList = (TClonesArray*) fManager->GetObject("TofTracks");
94 if (fTrackList == 0) {
95 LOG(warn) << "CbmEvDisTracks::Init() branch " << GetName() << " Not found! Task will be deactivated ";
96 SetActive(kFALSE);
97 }
98 LOG(debug1) << "CbmEvDisTracks::Init() get track list" << fTrackList;
99 LOG(debug1) << "CbmEvDisTracks::Init() create propagator";
100 fEventManager = FairEventManager::Instance();
101 LOG(debug1) << "CbmEvDisTracks::Init() get instance of FairEventManager ";
102 fEvent = "Current Event";
103 MinEnergyLimit = fEventManager->GetEvtMinEnergy();
104 MaxEnergyLimit = fEventManager->GetEvtMaxEnergy();
105 PEnergy = 0;
106 if (IsActive()) { return kSUCCESS; }
107 else {
108 return kERROR;
109 }
110}
111// -------------------------------------------------------------------------
112void CbmEvDisTracks::Exec(Option_t* option)
113{
114
115 if (IsActive()) {
116
117 LOG(debug2) << " CbmEvDisTracks::Exec starting with verbosity " << fVerbose << " and option " << option;
118 CbmTofTracklet* tr;
119 const Double_t* point;
120 CbmTofHit* hit;
121
122 Reset();
123
124 LOG(debug4) << " CbmEvDisTracks:: NTrks " << fTrackList->GetEntriesFast();
125 Int_t TMul[10] = {10 * 0}; //FIXME - don't use constants in code
126
127 for (Int_t iOpt = 0; iOpt < 2; iOpt++)
128 for (Int_t i = 0; i < fTrackList->GetEntriesFast(); i++) {
129 LOG(debug4) << "CbmEvDisTracks::Exec " << i;
130 tr = (CbmTofTracklet*) fTrackList->At(i);
131 if (nullptr == tr) continue;
132 Int_t Np = tr->GetNofHits();
133
134#if TOFDisplay == 1 //List for TEvePointSets
135 if (iOpt == 0) TMul[Np]++;
136 fPSList = GetPSGroup(Np, iOpt);
137#endif
138
139 fTrList = GetTrGroup(tr->GetNofHits(), iOpt);
140 TParticle* P = new TParticle();
141 TEveTrack* track = new TEveTrack(P, tr->GetPidHypo(), fTrPr);
142 Int_t iCol = Np;
143 if (iCol > 4) iCol++;
144 track->SetAttLineAttMarker(fTrList); //set defaults
145 track->SetLineColor(iCol);
146 track->SetMarkerColor(iCol);
147 track->SetMarkerSize(2.);
148 //track->SetMarkerDraw(kTRUE);
149
150 track->SetPoint(0, tr->GetFitX(0.), tr->GetFitY(0.), 0.); //insert starting point
151 TEveVector pos0 = TEveVector(tr->GetFitX(0.), tr->GetFitY(0.), 0.);
152 TEvePathMark* path0 = new TEvePathMark();
153 path0->fV = pos0;
154 track->AddPathMark(*path0);
155
156 Double_t pbuf[3], vbuf[3];
157 TEveRecTrack rt;
158 rt.fIndex = i;
159 pbuf[0] = 0.;
160 pbuf[1] = 0.;
161 pbuf[2] = 1. / tr->GetTt(); // velocity
162 rt.fP.Set(pbuf);
163 vbuf[0] = tr->GetFitX(0.);
164 vbuf[1] = tr->GetFitY(0.);
165 vbuf[2] = 0.;
166 rt.fV.Set(vbuf);
167 track->SetName(Form("TEveTrack %d", rt.fIndex));
168
169 //track->SetStdTitle();
170 // Double_t beta, beta_err, res_x, res_y, res_z, res_t;
171 Double_t beta, beta_err, res_x, res_y, res_t;
172 switch (iOpt) {
173 case 0: track->SetStdTitle(); break;
174 case 1:
175#if TOFDisplay == 1 //setting content of label depending on available information
176 beta = (1 / tr->GetTt()) / 29.98;
177#if TOFTtErr == 1
178 beta_err = beta * (tr->GetTtErr() / tr->GetTt());
179 track->SetTitle(
180 Form("%s\nChiSqDoF = %2.2f\nbeta = %1.3f +/- %1.3f", track->GetName(), tr->GetChiSq(), beta, beta_err));
181#else
182 track->SetTitle(Form("%s\nChiSqDoF = %2.2f\nbeta = %1.3f", track->GetName(), tr->GetChiSq(), beta));
183#endif
184#else
185 track->SetStdTitle();
186#endif
187 break;
188 }
189
190#if TOFDisplay == 1
191 // initialize TEvePointSet to show Datapoints belonging to track
192 TEvePointSetArray* psa = new TEvePointSetArray(Form("TEveTrack Points %d", i), "");
193 psa->SetMarkerColor(iCol);
194 psa->SetMarkerSize(2.0);
195 psa->SetMarkerStyle(4);
196 psa->InitBins("Hits", Np, 0.5, Np + 0.5);
197#endif
198
199 for (Int_t n = 0; n < Np; n++) {
200 switch (iOpt) {
201 case 0: point = tr->GetPoint(n); //pointer to member variable so GetFitPoint() would also change GetPoint()
202#if TOFDisplay == 1
203 // following belongs to filling and labeling of PointSetArray
204 psa->Fill(point[0], point[1], point[2], n + 1);
205 hit = tr->GetTofHitPointer(n);
206 res_x = (point[0] - tr->GetFitX(point[2])) / hit->GetDx();
207 res_y = (point[1] - tr->GetFitY(point[2])) / hit->GetDy();
208 res_t = (point[3] - tr->GetFitT(point[2])) / hit->GetTimeError();
209 // res_z=0;
210 psa->GetBin(n + 1)->SetTitle(Form("%s\nPointId = %d\nResiduals:\nX = %1.3f\nY = %1.3f\nT = %1.3f",
211 track->GetName(), tr->GetHitIndex(n), res_x, res_y, res_t));
212#endif
213 break;
214 case 1: point = tr->GetFitPoint(n); break;
215 }
216 track->SetPoint(n + 1, point[0], point[1], point[2]);
217 LOG(debug4) << Form(" CbmEvDisTracks::Exec SetPoint %d, %6.2f, %6.2f, %6.2f, %6.2f ", n, point[0], point[1],
218 point[2], point[3]);
219
220 TEveVector pos = TEveVector(point[0], point[1], point[2]);
221 TEvePathMark* path = new TEvePathMark();
222 path->fV = pos;
223 path->fTime = point[3];
224 if (n == 0) {
225 TEveVector Mom = TEveVector(P->Px(), P->Py(), P->Pz());
226 path->fP = Mom;
227 }
228 LOG(debug4) << "Path marker added " << path;
229
230 track->AddPathMark(*path);
231
232 LOG(debug4) << "Path marker added " << path;
233 }
234#if TOFDisplay == 1
235 if (iOpt == 0) { fPSList->AddElement(psa); }
236#endif
237 track->SortPathMarksByTime();
238 fTrList->AddElement(track);
239 LOG(debug3) << i << ". track added: " << track->GetName();
240 }
241 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
242 // TEveTrackList *TrListIn=( TEveTrackList *) fEveTrList->At(i);
243 //TrListIn->FindMomentumLimits(TrListIn, kFALSE);
244 }
245 fEventManager->SetEvtMaxEnergy(MaxEnergyLimit);
246 fEventManager->SetEvtMinEnergy(MinEnergyLimit);
247
248 TString cEventInfo = Form("ev# %d ", fEventManager->GetCurrentEvent());
249 TString cTrackInfo = "trkl mul: "; // to be completed while building the display
250 for (Int_t i = 9; i > 0; i--)
251 if (TMul[i] > 0) cTrackInfo += Form("M%d %d/", i, TMul[i]);
252
253 TGLViewer* v = gEve->GetDefaultGLViewer();
254
255 if (NULL != anne) anne->SetText(cEventInfo);
256 else
257 anne = new TGLAnnotation(v, cEventInfo, 0.01, 0.95);
258 if (NULL != annt) annt->SetText(cTrackInfo);
259 else
260 annt = new TGLAnnotation(v, cTrackInfo, 0.01, 0.92);
261 anne->SetTextSize(0.03); // % of window diagonal
262 annt->SetTextSize(0.03); // % of window diagonal
263 anne->SetTextColor(4);
264 annt->SetTextColor(4);
265
266 gEve->Redraw3D(kFALSE);
267 //gEve->DoRedraw3D();
268 //gEve->Redraw3D(kTRUE);
269 }
270}
271// ----- Destructor ----------------------------------------------------
273// -------------------------------------------------------------------------
275
276// -------------------------------------------------------------------------
278// -------------------------------------------------------------------------
280{
281 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
282 TEveTrackList* ele = (TEveTrackList*) fEveTrList->At(i);
283 gEve->RemoveElement(ele, fEventManager);
284 }
285 fEveTrList->Clear();
286#if TOFDisplay == 1
287 for (Int_t i = 0; i < fEvePSList->GetEntriesFast(); i++) {
288 TEveElementList* ele = (TEveElementList*) fEvePSList->At(i);
289 gEve->RemoveElement(ele, fEventManager);
290 }
291 fEvePSList->Clear();
292#endif
293}
294
295Char_t* gr;
296TEveTrackList* CbmEvDisTracks::GetTrGroup(Int_t ihmul, Int_t iOpt)
297{
298 switch (iOpt) {
299 case 0: gr = Form("Trkl_hmul%d", ihmul); break;
300 case 1: gr = Form("FTrkl_hmul%d", ihmul); break;
301 }
302 fTrList = 0;
303 for (Int_t i = 0; i < fEveTrList->GetEntriesFast(); i++) {
304 TEveTrackList* TrListIn = (TEveTrackList*) fEveTrList->At(i);
305 if (strcmp(TrListIn->GetName(), gr) == 0) {
306 fTrList = TrListIn;
307 break;
308 }
309 }
310 if (fTrList == 0) {
311 fTrPr = new TEveTrackPropagator();
312 fTrList = new TEveTrackList(gr, fTrPr);
313 Int_t iCol = ihmul;
314 if (iCol > 4) iCol++;
315 fTrList->SetMainColor(iCol);
316 fEveTrList->Add(fTrList);
317#if TOFDisplay == 1
318 if (iOpt == 1) { // delete if-condition to return to old code
319 gEve->AddElement(fTrList, fEventManager);
320 }
321#else
322 gEve->AddElement(fTrList, fEventManager);
323#endif
324 fTrList->SetRecurse(kTRUE);
325 switch (iOpt) {
326 case 0: // display points
327 fTrList->SetRnrPoints(kTRUE);
328 fTrList->SetRnrLine(kFALSE);
329 fTrList->SetMarkerSize(2.);
330 fTrList->SetRnrChildren(fRenderP); // default not shown
331 break;
332 case 1: //display fit line
333 fTrList->SetRnrLine(kTRUE);
334 fTrList->SetLineWidth(2.);
335 fTrList->SetRnrChildren(fRenderT); // default not shown
336 break;
337 default:;
338 }
339 }
340 return fTrList;
341}
342#if TOFDisplay == 1
343TEveElementList* CbmEvDisTracks::GetPSGroup(Int_t ihmul, Int_t /*iOpt*/)
344{
345 gr = Form("PTrkl_hmul%d", ihmul);
346 fPSList = 0;
347 for (Int_t i = 0; i < fEvePSList->GetEntriesFast(); i++) {
348 TEveElementList* l = (TEveElementList*) fEvePSList->At(i);
349 if (strcmp(l->GetName(), gr) == 0) {
350 fPSList = l;
351 break;
352 }
353 }
354 if (fPSList == 0) {
355 fPSList = new TEveElementList(gr);
356 Int_t iCol = ihmul;
357 if (iCol > 4) iCol++;
358 fPSList->SetMainColor(iCol);
359 fEvePSList->Add(fPSList);
360 gEve->AddElement(fPSList, fEventManager);
361 fPSList->SetRnrChildren(fRenderP);
362 }
363 return fPSList;
364}
365#endif
366
static TGLAnnotation * anne
ClassImp(CbmEvDisTracks)
Char_t * gr
static TGLAnnotation * annt
static FairEventManager * fEventManager
fscal v[fmask::Size]
Definition KfSimdPseudo.h:4
TObjArray * fEvePSList
virtual ~CbmEvDisTracks()
TEveTrackList * GetTrGroup(Int_t ihmul, Int_t iOpt)
virtual InitStatus Init()
static CbmEvDisTracks * fInstance
virtual void SetParContainers()
FairEventManager * fEventManager
Double_t MinEnergyLimit
virtual void Exec(Option_t *option)
TClonesArray * fTrackList
Double_t MaxEnergyLimit
TEveTrackList * fTrList
TEveElementList * GetPSGroup(Int_t ihuml, Int_t iOpt)
virtual void Finish()
TEveElementList * fPSList
TEveTrackPropagator * fTrPr
TObjArray * fEveTrList
double GetTimeError() const
Definition CbmHit.h:77
double GetDy() const
Definition CbmPixelHit.h:76
double GetDx() const
Definition CbmPixelHit.h:75
Provides information on attaching a TofHit to a TofTrack.
double GetFitY(double Z)
int32_t GetHitIndex(int32_t ind) const
double GetTt() const
int32_t GetNofHits() const
CbmTofHit * GetTofHitPointer(int32_t ind)
const double * GetPoint(int32_t n)
double GetFitT(double R)
const double * GetFitPoint(int32_t n)
double GetTtErr() const
int32_t GetPidHypo() const
double GetChiSq() const
double GetFitX(double Z)