2 // Author: Matevz Tadel 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 #include "AliEveTrackCounter.h"
12 #include "TEveManager.h"
13 #include "AliEveEventManager.h"
14 #include "AliEveTrack.h"
15 #include "AliEveTracklet.h"
17 #include "AliESDEvent.h"
18 #include "AliESDtrack.h"
19 #include "AliMultiplicity.h"
21 #include <TEveGedEditor.h>
25 //==============================================================================
27 //==============================================================================
29 //______________________________________________________________________________
31 // Provides event-based method for tagging of good / bad (or primary /
32 // secondary) tracks. A report can be written into a text file.
34 // AliEveTrack status is toggled by using secondary-selection / ctrl-click
35 // functionality of the GL viewer.
37 // Some of the functionality is implemented in AliEveTrackCounterEditor
40 ClassImp(AliEveTrackCounter)
42 //______________________________________________________________________________
43 AliEveTrackCounter* AliEveTrackCounter::fgInstance = 0;
45 Bool_t AliEveTrackCounter::IsActive()
47 // Check if instance exists and is active.
49 return fgInstance && fgInstance->fActive;
52 //______________________________________________________________________________
53 AliEveTrackCounter::AliEveTrackCounter(const Text_t* name, const Text_t* title) :
58 fClickAction (kCA_ToggleTrack),
60 fAllTracks (0), fGoodTracks (0),
61 fAllTracklets (0), fGoodTracklets(0),
62 fTrackLists (), fTrackletLists(),
66 // Connects to global signal "AliEveTrack", "SecSelected(AliEveTrack*)".
68 if (fgInstance == 0) fgInstance = this;
70 TQObject::Connect("AliEveTrack", "SecSelectedTrack(AliEveTrack*)",
71 "AliEveTrackCounter", this, "DoTrackAction(AliEveTrack*)");
72 TQObject::Connect("AliEveTracklet", "SecSelectedTracklet(AliEveTracklet*)",
73 "AliEveTrackCounter", this, "DoTrackletAction(AliEveTracklet*)");
75 AliEveEventManager::GetMaster()->Connect("NewEventDataLoaded()", "AliEveTrackCounter", this, "Reset()");
78 //______________________________________________________________________________
79 AliEveTrackCounter::~AliEveTrackCounter()
82 // Disconnect from the global track signals.
84 AliEveEventManager::GetMaster()->Disconnect("NewEventDataLoaded()", this);
86 TQObject::Disconnect("AliEveTrack", "DoTrackAction(AliEveTrack*)");
87 TQObject::Disconnect("AliEveTracklet", "DoTrackletAction(AliEveTracklet*)");
88 if (fgInstance == this) fgInstance = 0;
91 /******************************************************************************/
93 //______________________________________________________________________________
94 void AliEveTrackCounter::Reset()
96 // Reset internal track-counters and track-list.
98 fAllTracks = fGoodTracks = 0;
99 fAllTracklets = fGoodTracklets = 0;
101 TIter next(&fTrackLists);
102 TEveTrackList* tlist;
103 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
104 tlist->DecDenyDestroy();
105 fTrackLists.Clear("nodelete");
108 TIter next(&fTrackletLists);
109 TEveTrackList* tlist;
110 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
111 tlist->DecDenyDestroy();
112 fTrackletLists.Clear("nodelete");
115 fEventId = AliEveEventManager::GetMaster()->GetEventId();
118 //______________________________________________________________________________
119 void AliEveTrackCounter::RegisterTracks(TEveTrackList* tlist, Bool_t goodTracks)
121 // Register tracks from tlist and tlist itself.
122 // If goodTracks is true, they are considered as primary/good
125 tlist->IncDenyDestroy();
126 fTrackLists.Add(tlist);
128 List_i i = tlist->BeginChildren();
129 while (i != tlist->EndChildren())
131 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
137 t->GetESDTrack()->SetLabel(3);
139 t->SetLineStyle(fBadLineStyle);
140 t->GetESDTrack()->SetLabel(0);
148 //______________________________________________________________________________
149 void AliEveTrackCounter::RegisterTracklets(TEveTrackList* tlist, Bool_t goodTracks)
151 // Register tracklets from tlist and tlist itself.
152 // If goodTracks is true, they are considered as primary/good
155 AliESDEvent *esd = AliEveEventManager::AssertESD();
156 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
158 tlist->IncDenyDestroy();
159 fTrackletLists.Add(tlist);
161 List_i i = tlist->BeginChildren();
162 while (i != tlist->EndChildren())
164 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
169 mul->SetLabel(t->GetIndex(), 0, 3);
172 mul->SetLabel(t->GetIndex(), 0, 0);
173 t->SetLineStyle(fBadLineStyle);
181 //______________________________________________________________________________
182 void AliEveTrackCounter::DoTrackAction(AliEveTrack* track)
184 // Slot called when track is secondary selected.
186 // No check is done if track actually belongs to one of the
187 // registered track-lists.
189 // Probably it would be safer to copy good/bad tracks into special
191 // In this case one should also override RemoveElementLocal.
193 static const TEveException eh("AliEveTrackCounter::DoTrackAction ");
198 switch (fClickAction)
201 case kCA_PrintTrackInfo:
203 printf("AliEveTrack '%s'\n", track->GetObject(eh)->GetName());
204 const TEveVector &v = track->GetVertex();
205 const TEveVector &p = track->GetMomentum();;
206 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
207 v.fX, v.fY, v.fZ, p.Perp(), p.fZ, TMath::RadToDeg()*p.Phi());
211 case kCA_ToggleTrack:
213 AliESDtrack *esdt = track->GetESDTrack();
214 if (track->GetLineStyle() == 1)
216 track->SetLineStyle(fBadLineStyle);
217 esdt->SetLabel(esdt->GetLabel() & ~1);
220 track->SetLineStyle(1);
221 esdt->SetLabel(esdt->GetLabel() | 1);
224 track->ElementChanged();
227 //printf("AliEveTrackCounter::DoTrackAction All=%d, Good=%d, Bad=%d\n",
228 // fAllTracks, fGoodTracks, fAllTracks-fGoodTracks);
230 if (gEve->GetEditor()->GetModel() == GetObject(eh))
231 gEve->EditElement(this);
236 } // end switch fClickAction
239 //______________________________________________________________________________
240 void AliEveTrackCounter::DoTrackletAction(AliEveTracklet* track)
242 // Slot called when tracklet is secondary selected.
244 // No check is done if track actually belongs to one of the
245 // registered track-lists.
247 // Probably it would be safer to copy good/bad tracks into special
249 // In this case one should also override RemoveElementLocal.
251 static const TEveException eh("AliEveTrackCounter::DoTrackletAction ");
256 switch (fClickAction)
259 case kCA_PrintTrackInfo:
261 printf("AliEveTracklet '%s'\n", track->GetObject(eh)->GetName());
262 const TEveVector &v = track->GetVertex();
263 const TEveVector &p = track->GetMomentum();;
264 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
265 v.fX, v.fY, v.fZ, p.Perp(), p.fZ, TMath::RadToDeg()*p.Phi());
269 case kCA_ToggleTrack:
271 AliESDEvent *esd = AliEveEventManager::AssertESD();
272 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
274 if (track->GetLineStyle() == 1)
276 track->SetLineStyle(fBadLineStyle);
277 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) & ~1);
280 track->SetLineStyle(1);
281 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) | 1);
284 track->ElementChanged();
287 // printf("AliEveTrackCounter::DoTrackletAction All=%d, Good=%d, Bad=%d\n",
288 // fAllTracklets, fGoodTracklets, fAllTracklets-fGoodTracklets);
290 if (gEve->GetEditor()->GetModel() == GetObject(eh))
291 gEve->EditElement(this);
296 } // end switch fClickAction
299 /******************************************************************************/
301 //______________________________________________________________________________
302 void AliEveTrackCounter::OutputEventTracks()
304 // Print good-track summary into a plain-text file by iteration
305 // through all registered track-lists.
306 // State of each track is determined by its line-style, it is
307 // considered a good track if it's line style is solid.
310 TFile *f = TFile::Open("scan_results.root", "UPDATE");
312 AliESDEvent *esd = AliEveEventManager::AssertESD();
313 TClonesArray *trk = static_cast<TClonesArray*> (esd->GetList()->FindObject("Tracks"));
314 AliMultiplicity *mul = const_cast <AliMultiplicity*>(esd->GetMultiplicity());
316 trk->Write(TString::Format("Tracks_%04d", fEventId), kWriteDelete | kSingleKey);
317 mul->Write(TString::Format("Tracklets_%04d", fEventId), kWriteDelete);
319 esd->GetPrimaryVertexTracks()->Write(TString::Format("PrimVertTracks_%04d", fEventId), kWriteDelete);
320 esd->GetPrimaryVertexTPC() ->Write(TString::Format("PrimVertTPC_%04d", fEventId), kWriteDelete);
321 esd->GetPrimaryVertexSPD() ->Write(TString::Format("PrimVertSPD_%04d", fEventId), kWriteDelete);
327 //______________________________________________________________________________
328 void AliEveTrackCounter::PrintEventTracks()
330 // Print good-track summary to stdout by iteration
331 // through all registered track-lists.
332 // State of each track is determined by its line-style, it is
333 // considered a good track if it's line style is solid.
337 fprintf(out, "AliEveTrackCounter::PrintEventTracks()\n");
339 fprintf(out, "Event=%d\n", fEventId);
340 fprintf(out, "GoodTracks=%d AllTracks=%d\n", fGoodTracks, fAllTracks);
343 TIter tlists(&fTrackLists);
344 TEveTrackList* tlist;
346 while ((tlist = (TEveTrackList*) tlists()) != 0)
348 List_i i = tlist->BeginChildren();
349 while (i != tlist->EndChildren())
351 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
352 if (t != 0 && t->GetLineStyle() == 1)
355 fprintf(out, " %2d: chg=%+2d pt=%8.5f eta=%+8.5f phi=%+8.5f\n",
356 cnt, t->GetCharge(), t->GetMomentum().Perp(),
357 t->GetMomentum().Eta(), t->GetMomentum().Phi());
364 fprintf(out, "GoodTracklets=%d AllTracklets=%d\n", fGoodTracklets, fAllTracklets);
366 TIter tlists(&fTrackletLists);
367 TEveTrackList* tlist;
369 while ((tlist = (TEveTrackList*) tlists()) != 0)
371 List_i i = tlist->BeginChildren();
372 while (i != tlist->EndChildren())
374 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
375 if (t != 0 && t->GetLineStyle() == 1)
378 fprintf(out, " %2d: theta=%+8.5f eta=%+8.5f phi=%+8.5f\n",
379 cnt, t->GetMomentum().Theta(), t->GetMomentum().Eta(), t->GetMomentum().Phi());