7bd7235fe5c92499804ee977d4f3b65899be85a0
[u/mrichter/AliRoot.git] / EVE / Reve / Track.cxx
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
16 using namespace Reve;
17
18 //______________________________________________________________________
19 // Track
20 //
21
22 ClassImp(Reve::Track)
23
24 Track::Track() :
25   RenderElement(),
26   TPolyLine3D(),
27
28   fV(),
29   fP(),
30   fBeta(0),
31   fCharge(0),
32   fLabel(0),
33   fPathMarks(),
34
35   fRnrStyle(0),
36
37   fName(),
38   fTitle()
39 {}
40
41 Track::Track(TParticle* t, Int_t label, TrackRnrStyle* rs):
42   RenderElement(),
43   TPolyLine3D(),
44
45   fV(t->Vx(), t->Vy(), t->Vz()),
46   fP(t->Px(), t->Py(), t->Pz()),
47   fBeta(t->P()/t->Energy()),
48   fCharge(0),
49   fLabel(label),
50   fPathMarks(),
51
52   fRnrStyle(rs),
53
54   fName(t->GetName()),
55   fTitle()
56 {
57   fLineColor = fRnrStyle->GetColor();
58   fMainColorPtr = &fLineColor;
59
60   TParticlePDG* pdgp = t->GetPDG();
61   if (pdgp)
62     fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
63 }
64
65 Track::Track(Reve::MCTrack* t, TrackRnrStyle* rs):
66   RenderElement(),
67   TPolyLine3D(),
68
69   fV(t->Vx(), t->Vy(), t->Vz()),
70   fP(t->Px(), t->Py(), t->Pz()),
71   fBeta(t->P()/t->Energy()),
72   fCharge(0),
73   fLabel(t->label),
74   fPathMarks(),
75
76   fRnrStyle(rs),
77
78   fName(t->GetName()),
79   fTitle()
80 {
81   fLineColor = fRnrStyle->GetColor();
82   fMainColorPtr = &fLineColor;
83
84   TParticlePDG* pdgp = t->GetPDG();
85   if(pdgp == 0) {
86     t->ResetPdgCode(); pdgp = t->GetPDG();
87   }
88   fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
89 }
90
91 Track::Track(Reve::RecTrack* t, TrackRnrStyle* rs) :
92   RenderElement(),
93   TPolyLine3D(),
94
95   fV(t->V),
96   fP(t->P),
97   fBeta(t->beta),
98   fCharge(t->sign),
99   fLabel(t->label),
100   fPathMarks(),
101
102   fRnrStyle(rs),
103
104   fName(t->GetName()),
105   fTitle()
106 {
107   fLineColor = fRnrStyle->GetColor();
108   fMainColorPtr = &fLineColor;
109 }
110
111 Track::~Track()
112 {
113   for (vpPathMark_i i=fPathMarks.begin(); i!=fPathMarks.end(); ++i)
114     delete *i;
115 }
116
117 void Track::Reset(Int_t n_points)
118 {
119   delete [] TPolyLine3D::fP; TPolyLine3D::fP = 0;
120   fN = n_points;
121   if(fN) TPolyLine3D::fP = new Float_t [3*fN];
122   memset(TPolyLine3D::fP, 0, 3*fN*sizeof(Float_t));
123   fLastPoint = -1;
124 }
125
126 /**************************************************************************/
127
128 void Track::MakeTrack()
129 {
130   
131   TrackRnrStyle& RS((fRnrStyle != 0) ? *fRnrStyle : TrackRnrStyle::fgDefStyle);
132
133   Float_t px = fP.x, py = fP.y, pz = fP.z;  
134
135   MCVertex  mc_v0;
136   mc_v0.x = fV.x;
137   mc_v0.y = fV.y; 
138   mc_v0.z = fV.z; 
139   mc_v0.t = 0;
140
141   std::vector<MCVertex> track_points;
142   Bool_t decay = kFALSE;
143
144   if ((TMath::Abs(fV.z) > RS.fMaxZ) || (fV.x*fV.x + fV.y*fV.y > RS.fMaxR*RS.fMaxR)) 
145     goto make_polyline;
146   
147   if (fCharge != 0 && TMath::Abs(RS.fMagField) > 1e-5) {
148
149     // Charged particle in magnetic field
150
151     Float_t a = RS.fgkB2C * RS.fMagField * fCharge;
152    
153     MCHelix helix(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points, a); //m->cm
154     helix.Init(TMath::Sqrt(px*px+py*py), pz);
155    
156     if(!fPathMarks.empty()){
157       for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) {
158         Reve::PathMark* pm = *i;
159         
160         if(RS.fFitDaughters &&  pm->type == Reve::PathMark::Daughter){
161           if(TMath::Abs(pm->V.z) > RS.fMaxZ 
162              || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
163             goto helix_bounds;
164
165           //printf("%s fit daughter  \n", fName.Data()); 
166           helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z);
167           fP.x -=  pm->P.x;
168           fP.y -=  pm->P.y;
169           fP.z -=  pm->P.z;
170         }
171         if(RS.fFitDecay &&  pm->type == Reve::PathMark::Decay){
172           
173           if(TMath::Abs(pm->V.z) > RS.fMaxZ 
174              || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
175             goto helix_bounds;
176           helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z);
177           decay = true;
178           break;
179         }
180       }
181     }
182   helix_bounds:
183     //go to bounds
184     if(!decay || RS.fFitDecay == kFALSE){
185       helix.LoopToBounds(px,py,pz);
186       // printf("%s loop to bounds  \n",fName.Data() );
187     }
188
189   } else {
190
191     // Neutral particle or no field
192
193     MCLine line(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points);
194    
195     if(!fPathMarks.empty()){
196       for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) {
197         Reve::PathMark* pm = *i;
198
199         if(RS.fFitDaughters &&  pm->type == Reve::PathMark::Daughter){
200           if(TMath::Abs(pm->V.z) > RS.fMaxZ 
201              || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
202             goto line_bounds;
203           line.GotoVertex(pm->V.x, pm->V.y, pm->V.z);
204           fP.x -=  pm->P.x;
205           fP.y -=  pm->P.y;
206           fP.z -=  pm->P.z;
207         }
208
209         if(RS.fFitDecay &&  pm->type == Reve::PathMark::Decay){
210           if(TMath::Abs(pm->V.z) > RS.fMaxZ 
211              || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
212             goto line_bounds;
213           line.GotoVertex(pm->V.x, pm->V.y, pm->V.z);
214           decay = true;
215           break;
216         }
217       }
218     }
219
220   line_bounds:
221     if(!decay || RS.fFitDecay == kFALSE)
222       line.GotoBounds(px,py,pz);
223
224   }
225 make_polyline:
226   Reset(track_points.size());
227   for(std::vector<MCVertex>::iterator i=track_points.begin(); i!=track_points.end(); ++i)
228     SetNextPoint(i->x, i->y, i->z);
229 }
230
231 /**************************************************************************/
232
233 void Track::ImportHits()
234 {
235   Reve::LoadMacro("hits_from_label.C");
236   gROOT->ProcessLine(Form("hits_from_label(%d);", fLabel));
237 }
238
239 void Track::ImportClusters()
240 {
241   Reve::LoadMacro("clusters_from_label.C");
242   gROOT->ProcessLine(Form("clusters_from_label(%d);", fLabel));
243 }
244
245
246 /**************************************************************************/
247 /**************************************************************************/
248
249 //______________________________________________________________________
250 // TrackRnrStyle
251 //
252
253 ClassImp(Reve::TrackRnrStyle)
254
255 Float_t       TrackRnrStyle::fgDefMagField = 5;
256 const Float_t TrackRnrStyle::fgkB2C        = 0.299792458e-3;
257 TrackRnrStyle TrackRnrStyle::fgDefStyle;
258
259 TrackRnrStyle::TrackRnrStyle() :
260   TObject(),
261
262   fColor(1),
263   fMagField(fgDefMagField),
264
265   fMaxR  (350),
266   fMaxZ  (450),
267
268   fMaxOrbs (0.5),
269   fMinAng  (45),
270   fDelta   (0.1),
271
272   fFitDaughters(kTRUE),
273   fFitDecay    (kTRUE)
274 {}
275
276 /**************************************************************************/
277 /**************************************************************************/
278
279 //______________________________________________________________________
280 // TrackList
281 //
282
283 ClassImp(Reve::TrackList)
284
285 void TrackList::Init()
286 {
287   fMarkerStyle = 6;
288   fMarkerColor = 5;
289   // fMarker->SetMarkerSize(0.05);
290
291   if (fRnrStyle== 0) fRnrStyle = new TrackRnrStyle;
292   SetMainColorPtr(&fRnrStyle->fColor);
293 }
294
295 TrackList::TrackList(Int_t n_tracks, TrackRnrStyle* rs) :
296   RenderElementListBase(),
297   TPolyMarker3D(n_tracks),
298
299   fTitle(),
300
301   fRnrStyle   (rs),
302   fRnrMarkers (kTRUE),
303   fRnrTracks  (kTRUE)
304 {
305   Init();
306 }
307
308 TrackList::TrackList(const Text_t* name, Int_t n_tracks, TrackRnrStyle* rs) :
309   RenderElementListBase(),
310   TPolyMarker3D(n_tracks),
311   
312   fTitle(),
313
314   fRnrStyle   (rs),
315   fRnrMarkers (kTRUE),
316   fRnrTracks  (kTRUE)
317 {
318   Init();
319   SetName(name);
320 }
321
322 void 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
333 void TrackList::Paint(Option_t* option)
334 {
335   if(fRnrElement) {
336     if(fRnrMarkers) {
337       TPolyMarker3D::Paint(option);
338     }
339     if(fRnrTracks) {
340       for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
341         if((*i)->GetRnrElement())
342           (*i)->GetObject()->Paint(option);
343       }
344     }
345   }
346 }
347
348 /**************************************************************************/
349
350 void 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
360 void TrackList::SetRnrMarkers(Bool_t rnr)
361 {
362   fRnrMarkers = rnr;
363   gReve->Redraw3D();
364 }
365
366 void TrackList::SetRnrTracks(Bool_t rnr)
367 {
368
369   fRnrTracks = rnr;
370   gReve->Redraw3D();
371 }
372
373 /**************************************************************************/
374
375 void TrackList::MakeTracks()
376 {
377   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
378     ((Track*)(*i))->MakeTrack();
379   }
380   gReve->Redraw3D();
381 }
382
383
384 void TrackList::MakeMarkers()
385 {
386   Reset(fChildren.size());
387   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
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
398 void TrackList::SetMaxR(Float_t x)
399 {
400   fRnrStyle->fMaxR = x;
401   MakeTracks();
402   MakeMarkers();
403 }
404
405 void TrackList::SetMaxZ(Float_t x)
406 {
407   fRnrStyle->fMaxZ = x;
408   MakeTracks();
409   MakeMarkers();
410 }
411
412 void TrackList::SetMaxOrbs(Float_t x)
413 {
414   fRnrStyle->fMaxOrbs = x;
415   MakeTracks();
416 }
417
418 void TrackList::SetMinAng(Float_t x)
419 {
420   fRnrStyle->fMinAng = x;
421   MakeTracks();
422 }
423
424 void TrackList::SetDelta(Float_t x)
425 {
426   fRnrStyle->fDelta = x;
427   MakeTracks();
428 }
429
430 void TrackList::SetFitDaughters(Bool_t x)
431 {
432   fRnrStyle->fFitDaughters = x;
433   MakeTracks();
434 }
435
436 void TrackList::SetFitDecay(Bool_t x)
437 {
438   fRnrStyle->fFitDecay = x;
439   MakeTracks();
440 }
441
442 /**************************************************************************/
443 /**************************************************************************/
444
445 void TrackList::SelectByPt(Float_t min_pt, Float_t max_pt)
446 {
447   Float_t minptsq = min_pt*min_pt;
448   Float_t maxptsq = max_pt*max_pt;
449   Float_t ptsq;
450
451   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
452     ptsq = ((Track*)(*i))->fP.Perp2();
453     (*i)->SetRnrElement(ptsq >= minptsq && ptsq <= maxptsq);
454   }
455 }
456
457 /**************************************************************************/
458
459 void TrackList::ImportHits()
460 {
461   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
462     ((Track*)(*i))->ImportHits();
463   }
464 }
465
466 void TrackList::ImportClusters()
467 {
468   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
469     ((Track*)(*i))->ImportClusters();
470   }
471 }