]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/alice-macros/esd_tracks.C
coverity fix for 18249
[u/mrichter/AliRoot.git] / EVE / alice-macros / esd_tracks.C
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #if !defined(__CINT__) || defined(__MAKECINT__)
11
12 #include <TString.h>
13 #include <TSystem.h>
14 #include <TROOT.h>
15 #include <TMath.h>
16 #include <TGListTree.h>
17
18 #include <TEveVSDStructs.h>
19 #include <TEveManager.h>
20 #include <TEveTrackPropagator.h>
21
22 #include <EveBase/AliEveTrack.h>
23 #include <EveBase/AliEveTrackCounter.h>
24 #include <EveBase/AliEveMagField.h>
25 #include <EveBase/AliEveEventManager.h>
26
27 #include <AliESDEvent.h>
28 #include <AliESDfriend.h>
29 #include <AliESDtrackCuts.h>
30 #include <AliESDtrack.h>
31 #include <AliESDfriendTrack.h>
32 #include <AliExternalTrackParam.h>
33
34 #include <AliPWG0Helper.h>
35
36 #endif
37
38
39 // Use inner-tpc track params when its refit failed.
40 Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
41
42 // Use magnetic-field as retrieved from GRP.
43 Bool_t g_esd_tracks_true_field = kTRUE;
44
45 // Use Runge-Kutta track stepper.
46 Bool_t g_esd_tracks_rk_stepper = kFALSE;
47
48
49 //==============================================================================
50
51 void esd_track_propagator_setup(TEveTrackPropagator* trkProp,
52                                 Float_t magF, Float_t maxR)
53 {
54   if (g_esd_tracks_true_field)
55   {
56     trkProp->SetMagFieldObj(new AliEveMagField);
57   }
58   else
59   {
60     trkProp->SetMagField(magF);
61   }
62   if (g_esd_tracks_rk_stepper)
63   {
64     trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
65   }
66   trkProp->SetMaxR(maxR);
67 }
68
69 //==============================================================================
70
71 TString esd_track_title(AliESDtrack* t)
72 {
73   TString s;
74
75   Int_t label = t->GetLabel(), index = t->GetID();
76   TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
77   TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
78
79   Double_t p[3], v[3];
80   t->GetXYZ(v);
81   t->GetPxPyPz(p);
82   Double_t pt    = t->Pt();
83   Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2());
84   Double_t ptsq  = pt*pt;
85   Double_t ptm   = pt / (1.0 + pt*ptsig);
86   Double_t ptM   = pt / (1.0 - pt*ptsig);
87
88   s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
89            "pT = %.3f + %.3f - %.3f [%.3f]\n"
90            "P  = (%.3f, %.3f, %.3f)\n"
91            "V  = (%.3f, %.3f, %.3f)\n",
92            idx.Data(), lbl.Data(), t->Charge(), 0,
93            pt, ptM - pt, pt - ptm, ptsig*ptsq,
94            p[0], p[1], p[2],
95            v[0], v[1], v[2]);
96
97   Int_t   o;
98   s += "Det (in,out,refit,pid):\n";
99   o  = AliESDtrack::kITSin;
100   s += Form("ITS (%d,%d,%d,%d)  ",  t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
101   o  = AliESDtrack::kTPCin;
102   s += Form("TPC(%d,%d,%d,%d)\n",   t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
103   o  = AliESDtrack::kTRDin;
104   s += Form("TRD(%d,%d,%d,%d) ",    t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
105   o  = AliESDtrack::kTOFin;
106   s += Form("TOF(%d,%d,%d,%d)\n",   t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
107   o  = AliESDtrack::kHMPIDout;
108   s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
109   s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
110
111   if (t->IsOn(AliESDtrack::kESDpid))
112   {
113     Double_t pid[5];
114     t->GetESDpid(pid);
115     s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);
116   }
117
118   return s;
119 }
120
121 //==============================================================================
122
123 void esd_track_add_param(AliEveTrack* track, const AliExternalTrackParam* tp)
124 {
125   // Add additional track parameters as a path-mark to track.
126
127   if (tp == 0)
128     return;
129
130   Double_t pbuf[3], vbuf[3];
131   tp->GetXYZ(vbuf);
132   tp->GetPxPyPz(pbuf);
133
134   TEvePathMark pm(TEvePathMark::kReference);
135   pm.fV.Set(vbuf);
136   pm.fP.Set(pbuf);
137   track->AddPathMark(pm);
138 }
139
140 //==============================================================================
141
142 AliEveTrack* esd_make_track_TPC(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
143 {
144   // Make a TPC track representation and put it into given container.
145
146   AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
147   track->SetAttLineAttMarker(cont);
148   track->SetName(Form("AliEveTrack %d", at->GetID()));
149   track->SetElementTitle(esd_track_title(at));
150   track->SetSourceObject(at);
151
152   // Add inner/outer track parameters as start point and pathmark.
153   if (at->GetInnerParam()) track->SetStartParams(at->GetInnerParam());
154   else return NULL;
155   if (aft->GetTPCOut()) esd_track_add_param(track, aft->GetTPCOut());
156   else return NULL;
157
158   return track;
159 }
160
161 AliEveTrack* esd_make_track_ITS_standalone(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
162 {
163   // Make a ITS standalone track representation and put it into given container.
164
165   if ( !(!at->IsOn(AliESDtrack::kTPCin) &&
166           at->IsOn(AliESDtrack::kITSout)) ) return NULL; //only ITS standalone
167   AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
168   track->SetAttLineAttMarker(cont);
169   track->SetName(Form("AliEveTrack %d", at->GetID()));
170   track->SetElementTitle(esd_track_title(at));
171   track->SetSourceObject(at);
172
173   // Add inner/outer track parameters as path-marks.
174   if (aft->GetITSOut())
175   {
176     esd_track_add_param(track, aft->GetITSOut());
177   }
178   else return NULL;
179
180   return track;
181 }
182
183 AliEveTrack* esd_make_track_ITS(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
184 {
185   // Make a ITS track representation and put it into given container.
186
187   if ( (!at->IsOn(AliESDtrack::kTPCin) &&
188          at->IsOn(AliESDtrack::kITSout)) ) return NULL; //ignore ITS standalone
189   AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
190   track->SetAttLineAttMarker(cont);
191   track->SetName(Form("AliEveTrack %d", at->GetID()));
192   track->SetElementTitle(esd_track_title(at));
193   track->SetSourceObject(at);
194
195   // Add inner/outer track parameters as path-marks.
196   if (aft->GetITSOut())
197   {
198     esd_track_add_param(track, aft->GetITSOut());
199   }
200   else return NULL;
201
202   return track;
203 }
204
205 AliEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
206 {
207   // Make a standard track representation and put it into given container.
208
209   // Choose which parameters to use a track's starting point.
210   // If gkFixFailedITSExtr is TRUE (FALSE by default) and
211   // if ITS refit failed, take track parameters at inner TPC radius.
212
213   const AliExternalTrackParam* tp = at;
214
215   Bool_t innerTaken = kFALSE;
216   if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit)
217   {
218     tp = at->GetInnerParam();
219     innerTaken = kTRUE;
220   }
221
222   AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
223   track->SetAttLineAttMarker(cont);
224   track->SetName(Form("AliEveTrack %d", at->GetID()));
225   track->SetElementTitle(esd_track_title(at));
226   track->SetSourceObject(at);
227
228   // Add inner/outer track parameters as path-marks.
229   if (at->IsOn(AliESDtrack::kTPCrefit))
230   {
231     if ( ! innerTaken)
232     {
233       esd_track_add_param(track, at->GetInnerParam());
234     }
235     esd_track_add_param(track, at->GetOuterParam());
236   }
237
238   return track;
239 }
240
241
242 //==============================================================================
243 // esd_tracks()
244 //==============================================================================
245
246 TEveTrackList* esd_tracks_TPC()
247 {
248   AliESDEvent* esd = AliEveEventManager::AssertESD();
249   AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
250
251   TEveTrackList* cont = new TEveTrackList("TPC Tracks");
252   cont->SetMainColor(kMagenta);
253
254   esd_track_propagator_setup(cont->GetPropagator(),
255                              0.1*esd->GetMagneticField(), 520);
256
257   gEve->AddElement(cont);
258
259   Int_t count = 0;
260   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
261   {
262     ++count;
263     if (!esd->GetTrack(n)) continue;
264     if (!esd_friend->GetTrack(n)) continue;
265     AliEveTrack* track = esd_make_track_TPC(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
266     if (!track) continue;
267
268     cont->AddElement(track);
269   }
270   cont->SetTitle(Form("N=%d", count));
271   cont->MakeTracks();
272
273   gEve->Redraw3D();
274
275   return cont;
276 }
277
278 TEveTrackList* esd_tracks_ITS()
279 {
280   AliESDEvent* esd = AliEveEventManager::AssertESD();
281   AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
282
283   TEveTrackList* cont = new TEveTrackList("ITS Tracks");
284   cont->SetMainColor(kMagenta+3);
285
286   esd_track_propagator_setup(cont->GetPropagator(),
287                              0.1*esd->GetMagneticField(), 520);
288   cont->GetPropagator()->SetMaxR(85.0);
289   cont->SetLineWidth(1);
290
291   gEve->AddElement(cont);
292
293   Int_t count = 0;
294   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
295   {
296     ++count;
297     if (!esd->GetTrack(n)) continue;
298     if (!esd_friend->GetTrack(n)) continue;
299     AliEveTrack* track = esd_make_track_ITS(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
300     if (!track) continue;
301
302     cont->AddElement(track);
303   }
304   cont->SetTitle(Form("N=%d", count));
305   cont->MakeTracks();
306
307   gEve->Redraw3D();
308
309   return cont;
310 }
311
312 TEveTrackList* esd_tracks_ITS_standalone()
313 {
314   AliESDEvent* esd = AliEveEventManager::AssertESD();
315   AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
316
317   TEveTrackList* cont = new TEveTrackList("ITS Standalone Tracks");
318   cont->SetMainColor(kBlue);
319
320   esd_track_propagator_setup(cont->GetPropagator(),
321                              0.1*esd->GetMagneticField(), 520);
322   cont->GetPropagator()->SetMaxR(85.0);
323   cont->SetLineWidth(1);
324
325   gEve->AddElement(cont);
326
327   Int_t count = 0;
328   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
329   {
330     ++count;
331     if (!esd->GetTrack(n)) continue;
332     if (!esd_friend->GetTrack(n)) continue;
333     AliEveTrack* track = esd_make_track_ITS_standalone(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
334     if (!track) continue;
335
336     cont->AddElement(track);
337   }
338   cont->SetTitle(Form("N=%d", count));
339   cont->MakeTracks();
340
341   gEve->Redraw3D();
342
343   return cont;
344 }
345
346 TEveTrackList* esd_tracks()
347 {
348   AliESDEvent* esd = AliEveEventManager::AssertESD();
349
350   TEveTrackList* cont = new TEveTrackList("ESD Tracks");
351   cont->SetMainColor(6);
352
353   esd_track_propagator_setup(cont->GetPropagator(),
354                              0.1*esd->GetMagneticField(), 520);
355
356   gEve->AddElement(cont);
357
358   Int_t count = 0;
359   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
360   {
361     ++count;
362     AliEveTrack* track = esd_make_track(esd->GetTrack(n), cont);
363
364     cont->AddElement(track);
365   }
366   cont->SetTitle(Form("N=%d", count));
367   cont->MakeTracks();
368
369   gEve->Redraw3D();
370
371   return cont;
372 }
373
374 TEveTrackList* esd_tracks_MI()
375 {
376   AliESDEvent* esd = AliEveEventManager::AssertESD();
377
378   TEveTrackList* cont = new TEveTrackList("ESD Tracks MI");
379   cont->SetLineColor(5);
380   gEve->AddElement(cont);
381
382   Int_t count = 0;
383   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
384   {
385     ++count;
386     AliESDtrack* at = esd->GetTrack(n);
387     AliEveTrack* l = new AliEveTrack(at, cont->GetPropagator());
388     l->SetName(Form("ESDTrackMI %d", at->GetID()));
389     l->SetElementTitle(esd_track_title(at));
390     l->SetAttLineAttMarker(cont);
391     l->SetSourceObject(at);
392
393     at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5);
394
395     l->SetLockPoints(kTRUE);
396     cont->AddElement(l);
397   }
398   cont->SetTitle(Form("N=%d", count));
399
400   gEve->Redraw3D();
401
402   return cont;
403 }
404
405
406 //==============================================================================
407 // esd_tracks_from_array()
408 //==============================================================================
409
410 TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
411 {
412   // Retrieves AliESDTrack's from collection.
413   // See example usage with AliAnalysisTrackCuts in the next function.
414
415   if (esd == 0) esd = AliEveEventManager::AssertESD();
416
417   TEveTrackList* cont = new TEveTrackList("ESD Tracks");
418   cont->SetMainColor(6);
419
420   esd_track_propagator_setup(cont->GetPropagator(),
421                              0.1*esd->GetMagneticField(), 520);
422
423   gEve->AddElement(cont);
424
425   Int_t    count = 0;
426   TIter    next(col);
427   TObject *obj;
428   while ((obj = next()) != 0)
429   {
430     if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE)
431     {
432       Warning("esd_tracks_from_array", "Object '%s', '%s' is not an AliESDtrack.",
433               obj->GetName(), obj->GetTitle());
434       continue;
435     }
436
437     ++count;
438     AliESDtrack* at = reinterpret_cast<AliESDtrack*>(obj);
439
440     AliEveTrack* track = esd_make_track(at, cont);
441     cont->AddElement(track);
442   }
443   cont->SetTitle(Form("N=%d", count));
444   cont->MakeTracks();
445
446   gEve->Redraw3D();
447
448   return cont;
449 }
450
451 void esd_tracks_alianalcuts_demo()
452 {
453   AliESDEvent* esd = AliEveEventManager::AssertESD();
454
455   AliESDtrackCuts atc;
456   atc.SetPtRange(0.1, 5);
457   atc.SetRapRange(-1, 1);
458
459   esd_tracks_from_array(atc.GetAcceptedTracks(esd), esd);
460 }
461
462
463 //==============================================================================
464 // esd_tracks_by_category
465 //==============================================================================
466
467 Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
468 {
469   // Taken from: PWG0/esdTrackCuts/AliESDtrackCuts.cxx
470   // Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
471
472   Float_t b[2];
473   Float_t bRes[2];
474   Float_t bCov[3];
475   esdTrack->GetImpactParameters(b,bCov);
476   if (bCov[0] <= 0 || bCov[2] <= 0)
477   {
478     printf("Estimated b resolution lower or equal zero!\n");
479     bCov[0] = bCov[2] = 0;
480   }
481   bRes[0] = TMath::Sqrt(bCov[0]);
482   bRes[1] = TMath::Sqrt(bCov[2]);
483
484   // -----------------------------------
485   // How to get to a n-sigma cut?
486   //
487   // The accumulated statistics from 0 to d is
488   //
489   // ->  Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
490   // ->  1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
491   //
492   // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
493   // Can this be expressed in a different way?
494
495   if (bRes[0] == 0 || bRes[1] == 0)
496     return -1;
497
498   Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
499
500   // stupid rounding problem screws up everything:
501   // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
502   if (TMath::Exp(-d * d / 2) < 1e-10)
503     return 1000;
504
505   d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
506   return d;
507 }
508
509 TEveElementList* esd_tracks_by_category()
510 {
511    // Import ESD tracks, separate them into several containers
512    // according to primary-vertex cut and ITS&TPC refit status.
513
514    AliESDEvent* esd = AliEveEventManager::AssertESD();
515
516    TEveElementList* cont = new TEveElementList("ESD Tracks by category");
517    gEve->AddElement(cont);
518
519    const Int_t   nCont = 9;
520    const Float_t maxR  = 520;
521    const Float_t magF  = 0.1*esd->GetMagneticField();
522
523    TEveTrackList *tl[nCont];
524    Int_t          tc[nCont];
525    Int_t          count = 0;
526
527    tl[0] = new TEveTrackList("Sigma < 3");
528    tc[0] = 0;
529    esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
530    tl[0]->SetMainColor(3);
531    cont->AddElement(tl[0]);
532
533    tl[1] = new TEveTrackList("3 < Sigma < 5");
534    tc[1] = 0;
535    esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
536    tl[1]->SetMainColor(7);
537    cont->AddElement(tl[1]);
538
539    tl[2] = new TEveTrackList("5 < Sigma");
540    tc[2] = 0;
541    esd_track_propagator_setup(tl[2]->GetPropagator(), magF, maxR);
542    tl[2]->SetMainColor(46);
543    cont->AddElement(tl[2]);
544
545    tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
546    tc[3] = 0;
547    esd_track_propagator_setup(tl[3]->GetPropagator(), magF, maxR);
548    tl[3]->SetMainColor(41);
549    cont->AddElement(tl[3]);
550
551    tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
552    tc[4] = 0;
553    esd_track_propagator_setup(tl[4]->GetPropagator(), magF, maxR);
554    tl[4]->SetMainColor(48);
555    cont->AddElement(tl[4]);
556
557    tl[5] = new TEveTrackList("no TPC refit");
558    tc[5] = 0;
559    esd_track_propagator_setup(tl[5]->GetPropagator(), magF, maxR);
560    tl[5]->SetMainColor(kRed);
561    cont->AddElement(tl[5]);
562
563    tl[6] = new TEveTrackList("ITS ncl>=3 & SPD Inner");
564    tc[6] = 0;
565    esd_track_propagator_setup(tl[6]->GetPropagator(), magF, maxR);
566    tl[6]->SetMainColor(kGreen);
567    cont->AddElement(tl[6]);
568
569    tl[7] = new TEveTrackList("ITS ncl>=3 & b<3 cm");
570    tc[7] = 0;
571    esd_track_propagator_setup(tl[7]->GetPropagator(), magF, maxR);
572    tl[7]->SetMainColor(kMagenta - 9);
573    cont->AddElement(tl[7]);
574
575    tl[8] = new TEveTrackList("ITS others");
576    tc[8] = 0;
577    esd_track_propagator_setup(tl[8]->GetPropagator(), magF, maxR);
578    tl[8]->SetMainColor(kRed + 2);
579    cont->AddElement(tl[8]);
580
581    for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
582    {
583       AliESDtrack* at = esd->GetTrack(n);
584
585       Float_t s  = get_sigma_to_vertex(at);
586       Int_t   ti;
587       if      (s <  3) ti = 0;
588       else if (s <= 5) ti = 1;
589       else             ti = 2;
590
591       Int_t    nclits;
592       Double_t dtobeam;
593
594       if (at->IsOn(AliESDtrack::kITSin) && ! at->IsOn(AliESDtrack::kTPCin))
595       {
596          UChar_t itsclmap = at->GetITSClusterMap();
597          Bool_t  spdinner = (itsclmap & 3) != 0;
598
599          nclits = 0;
600          for (Int_t iter = 0; iter < 6; ++iter)
601             if (itsclmap & (1 << iter)) nclits ++;
602
603          Double_t xyz[3];
604          at->GetXYZ(xyz);
605          dtobeam = TMath::Hypot(xyz[0], xyz[1]);
606
607          if ((nclits >= 3) && (spdinner))
608             ti = 6;
609          else if ((nclits >= 3) && (dtobeam < 3.0))
610             ti = 7;
611          else
612             ti = 8;
613       }
614       else if (at->IsOn(AliESDtrack::kTPCin) && ! at->IsOn(AliESDtrack::kTPCrefit))
615       {
616          ti = 5;
617       }
618       else if ( ! at->IsOn(AliESDtrack::kITSrefit))
619       {
620          ti = (ti == 2) ? 4 : 3;
621       }
622
623       TEveTrackList* tlist = tl[ti];
624       ++tc[ti];
625       ++count;
626
627       AliEveTrack* track = esd_make_track(at, tlist);
628       if (ti<6)
629          track->SetName(Form("ESD Track idx=%d, sigma=%5.3f", at->GetID(), s));
630       else
631          track->SetName(Form("ESD Track idx=%d, dxy=%5.3f cl=%i", at->GetID(), dtobeam, nclits));
632       tlist->AddElement(track);
633    }
634
635    for (Int_t ti = 0; ti < nCont; ++ti)
636    {
637       TEveTrackList* tlist = tl[ti];
638       tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
639       tlist->SetTitle(Form("N tracks=%d", tc[ti]));
640
641       tlist->MakeTracks();
642
643       //    Bool_t good_cont = ti <= 1;
644       Bool_t good_cont = ((ti == 6) || (ti == 7));
645       if (AliEveTrackCounter::IsActive())
646       {
647          AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont);
648       }
649       else
650       {
651          if ( ! good_cont)
652             tlist->SetLineStyle(6);
653       }
654    }
655    cont->SetTitle(Form("N all tracks = %d", count));
656    // ??? The following does not always work:
657    cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);
658
659    gEve->Redraw3D();
660
661    return cont;
662 }
663
664
665 //==============================================================================
666 // esd_tracks_by_anal_cuts
667 //==============================================================================
668
669 AliESDtrackCuts* g_esd_tracks_anal_cuts = 0;
670
671 TEveElementList* esd_tracks_by_anal_cuts()
672 {
673   AliESDEvent* esd = AliEveEventManager::AssertESD();
674
675   if (g_esd_tracks_anal_cuts == 0)
676   {
677     gSystem->Load("libPWG0base");
678     gROOT->ProcessLine(".L $ALICE_ROOT/PWG0/CreateStandardCuts.C");
679     Int_t mode = AliPWG0Helper::kTPC;
680     if (TMath::Abs(esd->GetMagneticField()) > 0.01)
681       mode |= AliPWG0Helper::kFieldOn;
682     gROOT->ProcessLine(Form("g_esd_tracks_anal_cuts = CreateTrackCuts(%d, kFALSE)", mode));
683   }
684
685   TEveElementList* cont = new TEveElementList("ESD Tracks by Analysis Cuts");
686   gEve->AddElement(cont);
687
688   const Int_t   nCont = 2;
689   const Float_t maxR  = 520;
690   const Float_t magF  = 0.1*esd->GetMagneticField();
691
692   TEveTrackList *tl[nCont];
693   Int_t          tc[nCont];
694   Int_t          count = 0;
695
696   tl[0] = new TEveTrackList("Passed");
697   tc[0] = 0;
698   esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
699   tl[0]->SetMainColor(3);
700   cont->AddElement(tl[0]);
701
702   tl[1] = new TEveTrackList("Rejected");
703   tc[1] = 0;
704   esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
705   tl[1]->SetMainColor(kRed);
706   cont->AddElement(tl[1]);
707
708   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
709   {
710     AliESDtrack* at = esd->GetTrack(n);
711
712     Float_t s  = get_sigma_to_vertex(at);
713     Int_t   ti = (g_esd_tracks_anal_cuts->AcceptTrack(at)) ? 0 : 1;
714
715     TEveTrackList* tlist = tl[ti];
716     ++tc[ti];
717     ++count;
718
719     AliEveTrack* track = esd_make_track(at, tlist);
720     track->SetName(Form("ESD Track idx=%d, sigma=%5.3f", at->GetID(), s));
721     tlist->AddElement(track);
722   }
723
724   for (Int_t ti = 0; ti < nCont; ++ti)
725   {
726     TEveTrackList* tlist = tl[ti];
727     tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
728     tlist->SetTitle(Form("N tracks=%d", tc[ti]));
729
730     tlist->MakeTracks();
731
732     Bool_t good_cont = ti < 1;
733     if (AliEveTrackCounter::IsActive())
734     {
735       AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont);
736     }
737     else
738     {
739       if ( ! good_cont)
740         tlist->SetLineStyle(6);
741     }
742   }
743   cont->SetTitle(Form("N all tracks = %d", count));
744   // ??? The following does not always work:
745   cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);
746
747   gEve->Redraw3D();
748
749   return cont;
750 }