2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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 **************************************************************************/
10 // Use inner-tpc track params when its refit failed.
11 Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
13 TString esd_track_title(AliESDtrack* t)
17 Int_t label = t->GetLabel(), index = t->GetID();
18 TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
19 TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
25 s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
26 "pT=%.3f, pZ=%.3f\nV=(%.3f, %.3f, %.3f)\n",
27 idx.Data(), lbl.Data(), t->Charge(), 0,
28 TMath::Sqrt(p[0]*p[0] + p[1]*p[1]), p[2], v[0], v[1], v[2]);
31 s += "Det(in,out,refit,pid):\n";
32 o = AliESDtrack::kITSin;
33 s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
34 o = AliESDtrack::kTPCin;
35 s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
36 o = AliESDtrack::kTRDin;
37 s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
38 o = AliESDtrack::kTOFin;
39 s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
40 o = AliESDtrack::kHMPIDout;
41 s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
42 s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
44 if (t->IsOn(AliESDtrack::kESDpid))
48 s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);
54 void esd_track_add_param(AliEveTrack* track, AliExternalTrackParam* tp)
56 // Add additional track parameters as a path-mark to track.
61 Double_t pbuf[3], vbuf[3];
65 TEvePathMark pm(TEvePathMark::kReference);
68 track->AddPathMark(pm);
71 TEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
73 // Make a standard track representation and put it into given container.
75 // Choose which parameters to use a track's starting point.
76 // If gkFixFailedITSExtr is TRUE (FALSE by default) and
77 // if ITS refit failed, take track parameters at inner TPC radius.
78 AliExternalTrackParam* tp = at;
80 Bool_t innerTaken = kFALSE;
81 if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit)
83 tp = at->GetInnerParam();
87 Double_t pbuf[3], vbuf[3];
92 rt.fLabel = at->GetLabel();
93 rt.fIndex = at->GetID();
94 rt.fStatus = (Int_t) at->GetStatus();
95 rt.fSign = at->GetSign();
98 Double_t ep = at->GetP(), mc = at->GetMass();
99 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
101 AliEveTrack* track = new AliEveTrack(&rt, cont->GetPropagator());
102 track->SetAttLineAttMarker(cont);
103 track->SetName(Form("AliEveTrack %d", at->GetID()));
104 track->SetElementTitle(esd_track_title(at));
105 track->SetSourceObject(at);
107 // Add inner/outer track parameters as path-marks.
108 if (at->IsOn(AliESDtrack::kTPCrefit))
112 esd_track_add_param(track, at->GetInnerParam());
114 esd_track_add_param(track, at->GetOuterParam());
120 TEveTrackList* esd_tracks()
122 AliESDEvent* esd = AliEveEventManager::AssertESD();
124 TEveTrackList* cont = new TEveTrackList("ESD Tracks");
125 cont->SetMainColor(6);
126 TEveTrackPropagator* trkProp = cont->GetPropagator();
127 trkProp->SetMagField(0.1*esd->GetMagneticField());
128 trkProp->SetMaxR (520);
130 gEve->AddElement(cont);
133 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
136 AliEveTrack* track = esd_make_track(esd->GetTrack(n), cont);
138 cont->AddElement(track);
140 cont->SetTitle(Form("N=%d", count));
148 TEveElementList* esd_tracks_MI()
150 AliESDEvent* esd = AliEveEventManager::AssertESD();
152 TEveElementList* cont = new TEveElementList("ESD Tracks MI");
153 gEve->AddElement(cont);
156 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
159 AliESDtrack* at = esd->GetTrack(n);
160 TEveLine* l = new TEveLine;
162 at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5);
163 l->SetName(Form("ESDTrackMI %d", at->GetID()));
164 l->SetElementTitle(esd_track_title(at));
165 l->SetSourceObject(at);
169 cont->SetTitle(Form("N=%d", count));
176 /******************************************************************************/
177 // esd_tracks_from_array()
178 /******************************************************************************/
180 TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
182 // Retrieves AliESDTrack's from collection.
183 // See example usage with AliAnalysisTrackCuts in the next function.
185 if (esd == 0) esd = AliEveEventManager::AssertESD();
187 TEveTrackList* cont = new TEveTrackList("ESD Tracks");
188 cont->SetMainColor(6);
189 TEveTrackPropagator* trkProp = cont->GetPropagator();
190 trkProp->SetMagField(0.1*esd->GetMagneticField());
191 trkProp->SetMaxR (520);
193 gEve->AddElement(cont);
198 while ((obj = next()) != 0)
200 if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE)
202 Warning("esd_tracks_from_array", "Object '%s', '%s' is not an AliESDtrack.",
203 obj->GetName(), obj->GetTitle());
208 AliESDtrack* at = (AliESDtrack*) obj;
210 AliEveTrack* track = esd_make_track(at, cont);
211 cont->AddElement(track);
213 cont->SetTitle(Form("N=%d", count));
221 void esd_tracks_alianalcuts_demo()
223 AliESDEvent* esd = AliEveEventManager::AssertESD();
224 gSystem->Load("libANALYSIS");
226 AliAnalysisTrackCuts atc;
227 atc.SetPtRange(0.1, 5);
228 atc.SetRapRange(-1, 1);
230 esd_tracks_from_array(atc.GetAcceptedParticles(esd), esd);
233 /******************************************************************************/
234 // esd_tracks_by_category
235 /******************************************************************************/
237 Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
239 // Taken from: PWG0/esdTrackCuts/AliESDtrackCuts.cxx
240 // Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
245 esdTrack->GetImpactParameters(b,bCov);
246 if (bCov[0] <= 0 || bCov[2] <= 0)
248 printf("Estimated b resolution lower or equal zero!\n");
249 bCov[0] = bCov[2] = 0;
251 bRes[0] = TMath::Sqrt(bCov[0]);
252 bRes[1] = TMath::Sqrt(bCov[2]);
254 // -----------------------------------
255 // How to get to a n-sigma cut?
257 // The accumulated statistics from 0 to d is
259 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
260 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
262 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
263 // Can this be expressed in a different way?
265 if (bRes[0] == 0 || bRes[1] == 0)
268 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
270 // stupid rounding problem screws up everything:
271 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
272 if (TMath::Exp(-d * d / 2) < 1e-10)
275 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
279 TEveElementList* g_esd_tracks_by_category_container = 0;
281 TEveElementList* esd_tracks_by_category()
283 // Import ESD tracks, separate them into several containers
284 // according to primary-vertex cut and ITS&TPC refit status.
286 AliESDEvent* esd = AliEveEventManager::AssertESD();
288 TEveElementList* cont = new TEveElementList("ESD Tracks by category");
289 gEve->AddElement(cont);
291 g_esd_tracks_by_category_container = cont;
293 const Int_t nCont = 7;
294 const Float_t maxR = 520;
295 const Float_t magF = 0.1*esd->GetMagneticField();
297 TEveTrackList *tl[nCont];
301 tl[0] = new TEveTrackList("Sigma < 3");
303 tl[0]->GetPropagator()->SetMagField(magF);
304 tl[0]->GetPropagator()->SetMaxR (maxR);
305 tl[0]->SetMainColor(3);
306 cont->AddElement(tl[0]);
308 tl[1] = new TEveTrackList("3 < Sigma < 5");
310 tl[1]->GetPropagator()->SetMagField(magF);
311 tl[1]->GetPropagator()->SetMaxR (maxR);
312 tl[1]->SetMainColor(7);
313 cont->AddElement(tl[1]);
315 tl[2] = new TEveTrackList("5 < Sigma");
317 tl[2]->GetPropagator()->SetMagField(magF);
318 tl[2]->GetPropagator()->SetMaxR (maxR);
319 tl[2]->SetMainColor(46);
320 cont->AddElement(tl[2]);
322 tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
324 tl[3]->GetPropagator()->SetMagField(magF);
325 tl[3]->GetPropagator()->SetMaxR (maxR);
326 tl[3]->SetMainColor(41);
327 cont->AddElement(tl[3]);
329 tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
331 tl[4]->GetPropagator()->SetMagField(magF);
332 tl[4]->GetPropagator()->SetMaxR (maxR);
333 tl[4]->SetMainColor(48);
334 cont->AddElement(tl[4]);
336 tl[5] = new TEveTrackList("no TPC refit");
338 tl[5]->GetPropagator()->SetMagField(magF);
339 tl[5]->GetPropagator()->SetMaxR (maxR);
340 tl[5]->SetMainColor(kRed);
341 cont->AddElement(tl[5]);
343 tl[6] = new TEveTrackList("ITS stand-alone");
345 tl[6]->GetPropagator()->SetMagField(magF);
346 tl[6]->GetPropagator()->SetMaxR (maxR);
347 tl[6]->SetMainColor(kMagenta - 9);
348 cont->AddElement(tl[6]);
350 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
352 AliESDtrack* at = esd->GetTrack(n);
354 Float_t s = get_sigma_to_vertex(at);
357 else if (s <= 5) ti = 1;
360 if (at->IsOn(AliESDtrack::kITSin) && ! at->IsOn(AliESDtrack::kTPCin))
364 else if (at->IsOn(AliESDtrack::kTPCin) && ! at->IsOn(AliESDtrack::kTPCrefit))
368 else if ( ! at->IsOn(AliESDtrack::kITSrefit))
370 ti = (ti == 2) ? 4 : 3;
373 TEveTrackList* tlist = tl[ti];
377 AliEveTrack* track = esd_make_track(at, tlist);
378 track->SetName(Form("AliEveTrack idx=%d, sigma=%5.3f", at->GetID(), s));
379 tlist->AddElement(track);
382 for (Int_t ti = 0; ti < nCont; ++ti)
384 TEveTrackList* tlist = tl[ti];
385 tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
386 tlist->SetTitle(Form("N tracks=%d", tc[ti]));
390 cont->SetTitle(Form("N all tracks = %d", count));
391 // ??? The following does not always work:
392 cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);