Added class TrackCounter; Track now inherits from TQObject and emits a Clicked()...
[u/mrichter/AliRoot.git] / EVE / Reve / Track.cxx
CommitLineData
5a5a1232 1// $Header$
2
3#include "Track.h"
4#include "MCHelixLine.hi"
5
6#include <TPolyLine3D.h>
7#include <TPolyMarker3D.h>
8#include <TColor.h>
9
10// Updates
11#include <Reve/RGTopFrame.h>
12#include <TCanvas.h>
13
14#include <vector>
15
16using namespace Reve;
17
18//______________________________________________________________________
19// Track
20//
21
22ClassImp(Reve::Track)
23
265ecb21 24Track::Track() :
eadaa89b 25 Line(),
5a5a1232 26
265ecb21 27 fV(),
28 fP(),
29 fBeta(0),
30 fCharge(0),
31 fLabel(0),
32 fPathMarks(),
33
eadaa89b 34 fRnrStyle(0)
265ecb21 35{}
36
3d75306d 37Track::Track(TParticle* t, Int_t label, TrackRnrStyle* rs):
eadaa89b 38 Line(),
3d75306d 39
40 fV(t->Vx(), t->Vy(), t->Vz()),
41 fP(t->Px(), t->Py(), t->Pz()),
42 fBeta(t->P()/t->Energy()),
43 fCharge(0),
44 fLabel(label),
45 fPathMarks(),
46
eadaa89b 47 fRnrStyle(rs)
3d75306d 48{
49 fLineColor = fRnrStyle->GetColor();
50 fMainColorPtr = &fLineColor;
51
52 TParticlePDG* pdgp = t->GetPDG();
53 if (pdgp)
54 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
eadaa89b 55
56 SetName(t->GetName());
3d75306d 57}
58
265ecb21 59Track::Track(Reve::MCTrack* t, TrackRnrStyle* rs):
eadaa89b 60 Line(),
5a5a1232 61
265ecb21 62 fV(t->Vx(), t->Vy(), t->Vz()),
63 fP(t->Px(), t->Py(), t->Pz()),
64 fBeta(t->P()/t->Energy()),
65 fCharge(0),
66 fLabel(t->label),
67 fPathMarks(),
68
eadaa89b 69 fRnrStyle(rs)
265ecb21 70{
5a5a1232 71 fLineColor = fRnrStyle->GetColor();
72 fMainColorPtr = &fLineColor;
73
5a5a1232 74 TParticlePDG* pdgp = t->GetPDG();
75 if(pdgp == 0) {
76 t->ResetPdgCode(); pdgp = t->GetPDG();
77 }
48dc973d 78 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
eadaa89b 79
80 SetName(t->GetName());
5a5a1232 81}
82
265ecb21 83Track::Track(Reve::RecTrack* t, TrackRnrStyle* rs) :
eadaa89b 84 Line(),
265ecb21 85
86 fV(t->V),
87 fP(t->P),
88 fBeta(t->beta),
89 fCharge(t->sign),
90 fLabel(t->label),
91 fPathMarks(),
92
eadaa89b 93 fRnrStyle(rs)
5a5a1232 94{
5a5a1232 95 fLineColor = fRnrStyle->GetColor();
96 fMainColorPtr = &fLineColor;
eadaa89b 97
98 SetName(t->GetName());
5a5a1232 99}
100
101Track::~Track()
265ecb21 102{
103 for (vpPathMark_i i=fPathMarks.begin(); i!=fPathMarks.end(); ++i)
104 delete *i;
105}
5a5a1232 106
eadaa89b 107/*
5a5a1232 108void Track::Reset(Int_t n_points)
109{
110 delete [] TPolyLine3D::fP; TPolyLine3D::fP = 0;
111 fN = n_points;
112 if(fN) TPolyLine3D::fP = new Float_t [3*fN];
113 memset(TPolyLine3D::fP, 0, 3*fN*sizeof(Float_t));
114 fLastPoint = -1;
115}
eadaa89b 116*/
5a5a1232 117
118/**************************************************************************/
119
120void Track::MakeTrack()
121{
122
123 TrackRnrStyle& RS((fRnrStyle != 0) ? *fRnrStyle : TrackRnrStyle::fgDefStyle);
124
125 Float_t px = fP.x, py = fP.y, pz = fP.z;
126
127 MCVertex mc_v0;
128 mc_v0.x = fV.x;
129 mc_v0.y = fV.y;
130 mc_v0.z = fV.z;
131 mc_v0.t = 0;
132
133 std::vector<MCVertex> track_points;
48dc973d 134 Bool_t decay = kFALSE;
5a5a1232 135
136 if ((TMath::Abs(fV.z) > RS.fMaxZ) || (fV.x*fV.x + fV.y*fV.y > RS.fMaxR*RS.fMaxR))
137 goto make_polyline;
138
01024c63 139 if (fCharge != 0 && TMath::Abs(RS.fMagField) > 1e-5) {
140
141 // Charged particle in magnetic field
5a5a1232 142
48dc973d 143 Float_t a = RS.fgkB2C * RS.fMagField * fCharge;
5a5a1232 144
145 MCHelix helix(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points, a); //m->cm
146 helix.Init(TMath::Sqrt(px*px+py*py), pz);
147
148 if(!fPathMarks.empty()){
149 for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) {
150 Reve::PathMark* pm = *i;
151
152 if(RS.fFitDaughters && pm->type == Reve::PathMark::Daughter){
153 if(TMath::Abs(pm->V.z) > RS.fMaxZ
154 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
155 goto helix_bounds;
156
157 //printf("%s fit daughter \n", fName.Data());
158 helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z);
159 fP.x -= pm->P.x;
160 fP.y -= pm->P.y;
161 fP.z -= pm->P.z;
162 }
163 if(RS.fFitDecay && pm->type == Reve::PathMark::Decay){
164
165 if(TMath::Abs(pm->V.z) > RS.fMaxZ
166 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
167 goto helix_bounds;
168 helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z);
169 decay = true;
170 break;
171 }
172 }
173 }
174 helix_bounds:
175 //go to bounds
48dc973d 176 if(!decay || RS.fFitDecay == kFALSE){
5a5a1232 177 helix.LoopToBounds(px,py,pz);
178 // printf("%s loop to bounds \n",fName.Data() );
179 }
180
01024c63 181 } else {
182
183 // Neutral particle or no field
5a5a1232 184
185 MCLine line(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points);
186
187 if(!fPathMarks.empty()){
188 for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) {
189 Reve::PathMark* pm = *i;
190
191 if(RS.fFitDaughters && pm->type == Reve::PathMark::Daughter){
192 if(TMath::Abs(pm->V.z) > RS.fMaxZ
193 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
194 goto line_bounds;
195 line.GotoVertex(pm->V.x, pm->V.y, pm->V.z);
196 fP.x -= pm->P.x;
197 fP.y -= pm->P.y;
198 fP.z -= pm->P.z;
199 }
200
201 if(RS.fFitDecay && pm->type == Reve::PathMark::Decay){
202 if(TMath::Abs(pm->V.z) > RS.fMaxZ
203 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
204 goto line_bounds;
205 line.GotoVertex(pm->V.x, pm->V.y, pm->V.z);
206 decay = true;
207 break;
208 }
209 }
210 }
211
212 line_bounds:
48dc973d 213 if(!decay || RS.fFitDecay == kFALSE)
5a5a1232 214 line.GotoBounds(px,py,pz);
215
216 }
217make_polyline:
218 Reset(track_points.size());
219 for(std::vector<MCVertex>::iterator i=track_points.begin(); i!=track_points.end(); ++i)
220 SetNextPoint(i->x, i->y, i->z);
221}
222
223/**************************************************************************/
224
48dc973d 225void Track::ImportHits()
226{
227 Reve::LoadMacro("hits_from_label.C");
228 gROOT->ProcessLine(Form("hits_from_label(%d);", fLabel));
229}
230
231void Track::ImportClusters()
232{
233 Reve::LoadMacro("clusters_from_label.C");
234 gROOT->ProcessLine(Form("clusters_from_label(%d);", fLabel));
235}
236
9c39ede9 237/**************************************************************************/
238
239void Track::CtrlClicked(Reve::Track* track)
240{
241 Emit("CtrlClicked(Reve::Track*)", (Long_t)track);
242}
243
48dc973d 244
245/**************************************************************************/
246/**************************************************************************/
247
5a5a1232 248//______________________________________________________________________
249// TrackRnrStyle
250//
251
252ClassImp(Reve::TrackRnrStyle)
253
48dc973d 254Float_t TrackRnrStyle::fgDefMagField = 5;
255const Float_t TrackRnrStyle::fgkB2C = 0.299792458e-3;
5a5a1232 256TrackRnrStyle TrackRnrStyle::fgDefStyle;
257
265ecb21 258TrackRnrStyle::TrackRnrStyle() :
259 TObject(),
5a5a1232 260
265ecb21 261 fColor(1),
2074deef 262 fWidth(1),
265ecb21 263 fMagField(fgDefMagField),
5a5a1232 264
265ecb21 265 fMaxR (350),
266 fMaxZ (450),
5a5a1232 267
265ecb21 268 fMaxOrbs (0.5),
269 fMinAng (45),
270 fDelta (0.1),
5a5a1232 271
265ecb21 272 fFitDaughters(kTRUE),
273 fFitDecay (kTRUE)
274{}
5a5a1232 275
276/**************************************************************************/
277/**************************************************************************/
278
279//______________________________________________________________________
280// TrackList
281//
282
283ClassImp(Reve::TrackList)
284
285void TrackList::Init()
286{
287 fMarkerStyle = 6;
288 fMarkerColor = 5;
289 // fMarker->SetMarkerSize(0.05);
290
a8600b56 291 if (fRnrStyle== 0) fRnrStyle = new TrackRnrStyle;
292 SetMainColorPtr(&fRnrStyle->fColor);
5a5a1232 293}
294
a8600b56 295TrackList::TrackList(Int_t n_tracks, TrackRnrStyle* rs) :
7d42b6c2 296 RenderElementListBase(),
265ecb21 297 TPolyMarker3D(n_tracks),
298
299 fTitle(),
300
a8600b56 301 fRnrStyle (rs),
265ecb21 302 fRnrMarkers (kTRUE),
303 fRnrTracks (kTRUE)
5a5a1232 304{
305 Init();
306}
307
a8600b56 308TrackList::TrackList(const Text_t* name, Int_t n_tracks, TrackRnrStyle* rs) :
7d42b6c2 309 RenderElementListBase(),
265ecb21 310 TPolyMarker3D(n_tracks),
a8600b56 311
265ecb21 312 fTitle(),
313
a8600b56 314 fRnrStyle (rs),
265ecb21 315 fRnrMarkers (kTRUE),
316 fRnrTracks (kTRUE)
5a5a1232 317{
318 Init();
319 SetName(name);
320}
321
322void TrackList::Reset(Int_t n_tracks)
323{
324 delete [] fP; fP = 0;
325 fN = n_tracks;
326 if(fN) fP = new Float_t [3*fN];
327 memset(fP, 0, 3*fN*sizeof(Float_t));
328 fLastPoint = -1;
329}
330
331/**************************************************************************/
332
333void TrackList::Paint(Option_t* option)
334{
335 if(fRnrElement) {
336 if(fRnrMarkers) {
337 TPolyMarker3D::Paint(option);
338 }
339 if(fRnrTracks) {
9c39ede9 340 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
5a5a1232 341 if((*i)->GetRnrElement())
342 (*i)->GetObject()->Paint(option);
343 }
344 }
345 }
346}
347
348/**************************************************************************/
349
350void TrackList::AddElement(RenderElement* el)
351{
352 static const Exc_t eH("TrackList::AddElement ");
353 if (dynamic_cast<Track*>(el) == 0)
354 throw(eH + "new element not a Track.");
355 RenderElementListBase::AddElement(el);
356}
357
358/**************************************************************************/
359
360void TrackList::SetRnrMarkers(Bool_t rnr)
361{
362 fRnrMarkers = rnr;
363 gReve->Redraw3D();
364}
365
366void TrackList::SetRnrTracks(Bool_t rnr)
367{
368
369 fRnrTracks = rnr;
370 gReve->Redraw3D();
371}
372
373/**************************************************************************/
374
375void TrackList::MakeTracks()
376{
9c39ede9 377 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
5a5a1232 378 ((Track*)(*i))->MakeTrack();
379 }
380 gReve->Redraw3D();
381}
382
383
384void TrackList::MakeMarkers()
385{
7d42b6c2 386 Reset(fChildren.size());
9c39ede9 387 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
5a5a1232 388 Track& t = *((Track*)(*i));
389 if(t.GetN() > 0)
390 SetNextPoint(t.fV.x, t.fV.y, t.fV.z);
391 }
392 gReve->Redraw3D();
393}
394
395/**************************************************************************/
396/*************************************************************************/
397
2074deef 398void TrackList::SetWidth(Width_t w)
399{
400 Width_t oldw = fRnrStyle->fWidth;
401 fRnrStyle->fWidth = w;
9c39ede9 402 for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
2074deef 403 Track& t = *((Track*)(*i));
404 if (t.GetLineWidth() == oldw)
405 t.SetLineWidth(w);
406 }
407}
408
5a5a1232 409void TrackList::SetMaxR(Float_t x)
410{
a8600b56 411 fRnrStyle->fMaxR = x;
5a5a1232 412 MakeTracks();
413 MakeMarkers();
414}
415
416void TrackList::SetMaxZ(Float_t x)
417{
a8600b56 418 fRnrStyle->fMaxZ = x;
5a5a1232 419 MakeTracks();
420 MakeMarkers();
421}
422
423void TrackList::SetMaxOrbs(Float_t x)
424{
a8600b56 425 fRnrStyle->fMaxOrbs = x;
5a5a1232 426 MakeTracks();
427}
428
429void TrackList::SetMinAng(Float_t x)
430{
a8600b56 431 fRnrStyle->fMinAng = x;
5a5a1232 432 MakeTracks();
433}
434
435void TrackList::SetDelta(Float_t x)
436{
a8600b56 437 fRnrStyle->fDelta = x;
5a5a1232 438 MakeTracks();
439}
440
441void TrackList::SetFitDaughters(Bool_t x)
442{
a8600b56 443 fRnrStyle->fFitDaughters = x;
5a5a1232 444 MakeTracks();
445}
446
447void TrackList::SetFitDecay(Bool_t x)
448{
a8600b56 449 fRnrStyle->fFitDecay = x;
5a5a1232 450 MakeTracks();
451}
452
453/**************************************************************************/
454/**************************************************************************/
455
456void TrackList::SelectByPt(Float_t min_pt, Float_t max_pt)
457{
458 Float_t minptsq = min_pt*min_pt;
459 Float_t maxptsq = max_pt*max_pt;
460 Float_t ptsq;
461
9c39ede9 462 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
5a5a1232 463 ptsq = ((Track*)(*i))->fP.Perp2();
464 (*i)->SetRnrElement(ptsq >= minptsq && ptsq <= maxptsq);
465 }
466}
467
468/**************************************************************************/
469
b99aed53 470void TrackList::ImportHits()
5a5a1232 471{
9c39ede9 472 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
b99aed53 473 ((Track*)(*i))->ImportHits();
474 }
5a5a1232 475}
476
b99aed53 477void TrackList::ImportClusters()
5a5a1232 478{
9c39ede9 479 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
b99aed53 480 ((Track*)(*i))->ImportClusters();
481 }
5a5a1232 482}
9c39ede9 483
484/**************************************************************************/
485/**************************************************************************/
486/**************************************************************************/
487
488#include "RGEditor.h"
489
490//______________________________________________________________________
491// TrackCounter
492//
493
494ClassImp(TrackCounter)
495
496TrackCounter::TrackCounter(const Text_t* name, const Text_t* title) :
497 RenderElement(),
498 TNamed(name, title),
499
500 fBadLineStyle (6),
501 fClickAction (CA_ToggleTrack),
502 fAllTracks (0),
503 fGoodTracks (0),
504 fTrackLists ()
505{
506 TQObject::Connect("Reve::Track", "CtrlClicked(Reve::Track*)",
507 "Reve::TrackCounter", this, "DoTrackAction(Reve::Track*)");
508}
509
510TrackCounter::~TrackCounter()
511{
512 TQObject::Disconnect("Reve::Track", "DoTrackAction(Reve::Track*)");
513}
514
515/**************************************************************************/
516
517void TrackCounter::Reset()
518{
519 printf("TrackCounter::Reset()\n");
520 fAllTracks = 0;
521 fGoodTracks = 0;
522 TIter next(&fTrackLists);
523 TrackList* tlist;
524 while ((tlist = dynamic_cast<TrackList*>(next())))
525 tlist->RemoveParent(this);
526 fTrackLists.Clear();
527}
528
529void TrackCounter::RegisterTracks(TrackList* tlist, Bool_t goodTracks)
530{
531 // printf("TrackCounter::RegisterTracks '%s', %s\n",
532 // tlist->GetObject()->GetName(), goodTracks ? "good" : "bad");
533
534 tlist->AddParent(this);
535 fTrackLists.Add(tlist);
536
537 List_i i = tlist->BeginChildren();
538 while (i != tlist->EndChildren())
539 {
540 Track* t = dynamic_cast<Track*>(*i);
541 if (t != 0)
542 {
543 if (goodTracks)
544 {
545 ++fGoodTracks;
546 } else {
547 t->SetLineStyle(fBadLineStyle);
548 }
549 ++fAllTracks;
550 }
551 ++i;
552 }
553}
554
555void TrackCounter::DoTrackAction(Track* track)
556{
557 // !!!! No check done if ok.
558 // !!!! Should also override RemoveElementLocal
559 // !!!! But then ... should also sore local information if track is ok.
560
561 switch (fClickAction)
562 {
563
564 case CA_PrintTrackInfo:
565 {
566 printf("Track '%s'\n", track->GetObject()->GetName());
567 Vector &v = track->fV, &p = track->fP;
568 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
569 v.x, v.y, v.z, p.Perp(), p.z, TMath::RadToDeg()*p.Phi());
570 printf(" <other information should be printed ... full AliESDtrack>\n");
571 break;
572 }
573
574 case CA_ToggleTrack:
575 {
576 if (track->GetLineStyle() == 1)
577 {
578 track->SetLineStyle(fBadLineStyle);
579 --fGoodTracks;
580 } else {
581 track->SetLineStyle(1);
582 ++fGoodTracks;
583 }
584 gReve->Redraw3D();
585
586 printf("TrackCounter::CountTrack All=%d, Good=%d, Bad=%d\n",
587 fAllTracks, fGoodTracks, fAllTracks-fGoodTracks);
588
589 if (gReve->GetEditor()->GetModel() == GetObject())
590 gReve->EditRenderElement(this);
591
592 break;
593 }
594
595 } // end switch fClickAction
596}