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 //______________________________________________________________________________
46 AliEveTrackCounter::AliEveTrackCounter(const Text_t* name, const Text_t* title) :
51 fClickAction (kCA_ToggleTrack),
53 fAllTracks (0), fGoodTracks (0),
54 fAllTracklets (0), fGoodTracklets(0),
55 fTrackLists (), fTrackletLists()
58 // Connects to global signal "AliEveTrack", "SecSelected(AliEveTrack*)".
60 if (fgInstance == 0) fgInstance = this;
62 TQObject::Connect("AliEveTrack", "SecSelectedTrack(AliEveTrack*)",
63 "AliEveTrackCounter", this, "DoTrackAction(AliEveTrack*)");
64 TQObject::Connect("AliEveTracklet", "SecSelectedTracklet(AliEveTracklet*)",
65 "AliEveTrackCounter", this, "DoTrackletAction(AliEveTracklet*)");
68 //______________________________________________________________________________
69 AliEveTrackCounter::~AliEveTrackCounter()
72 // Disconnect from the global track signals.
74 TQObject::Disconnect("AliEveTrack", "DoTrackAction(AliEveTrack*)");
75 TQObject::Disconnect("AliEveTracklet", "DoTrackletAction(AliEveTracklet*)");
76 if (fgInstance == this) fgInstance = 0;
79 /******************************************************************************/
81 //______________________________________________________________________________
82 void AliEveTrackCounter::Reset()
84 // Reset internal track-counters and track-list.
86 fAllTracks = fGoodTracks = 0;
87 fAllTracklets = fGoodTracklets = 0;
89 TIter next(&fTrackLists);
91 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
92 tlist->DecDenyDestroy();
93 fTrackLists.Clear("nodelete");
96 TIter next(&fTrackletLists);
98 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
99 tlist->DecDenyDestroy();
100 fTrackletLists.Clear("nodelete");
104 //______________________________________________________________________________
105 void AliEveTrackCounter::RegisterTracks(TEveTrackList* tlist, Bool_t goodTracks)
107 // Register tracks from tlist and tlist itself.
108 // If goodTracks is true, they are considered as primary/good
111 tlist->IncDenyDestroy();
112 fTrackLists.Add(tlist);
114 List_i i = tlist->BeginChildren();
115 while (i != tlist->EndChildren())
117 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
123 t->GetESDTrack()->SetLabel(3);
125 t->SetLineStyle(fBadLineStyle);
126 t->GetESDTrack()->SetLabel(0);
134 //______________________________________________________________________________
135 void AliEveTrackCounter::RegisterTracklets(TEveTrackList* tlist, Bool_t goodTracks)
137 // Register tracklets from tlist and tlist itself.
138 // If goodTracks is true, they are considered as primary/good
141 AliESDEvent *esd = AliEveEventManager::AssertESD();
142 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
144 tlist->IncDenyDestroy();
145 fTrackletLists.Add(tlist);
147 List_i i = tlist->BeginChildren();
148 while (i != tlist->EndChildren())
150 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
153 if (goodTracks && mul->GetLabel(t->GetIndex(), 0) == 3)
157 t->SetLineStyle(fBadLineStyle);
165 //______________________________________________________________________________
166 void AliEveTrackCounter::DoTrackAction(AliEveTrack* track)
168 // Slot called when track is secondary selected.
170 // No check is done if track actually belongs to one of the
171 // registered track-lists.
173 // Probably it would be safer to copy good/bad tracks into special
175 // In this case one should also override RemoveElementLocal.
177 static const TEveException eh("AliEveTrackCounter::DoTrackAction ");
179 switch (fClickAction)
182 case kCA_PrintTrackInfo:
184 printf("AliEveTrack '%s'\n", track->GetObject(eh)->GetName());
185 const TEveVector &v = track->GetVertex();
186 const TEveVector &p = track->GetMomentum();;
187 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
188 v.fX, v.fY, v.fZ, p.Perp(), p.fZ, TMath::RadToDeg()*p.Phi());
189 printf(" <other information should be printed ... full AliESDtrack>\n");
193 case kCA_ToggleTrack:
195 AliESDtrack *esdt = track->GetESDTrack();
196 if (track->GetLineStyle() == 1)
198 track->SetLineStyle(fBadLineStyle);
199 esdt->SetLabel(esdt->GetLabel() & ~1);
202 track->SetLineStyle(1);
203 esdt->SetLabel(esdt->GetLabel() | 1);
206 track->ElementChanged();
209 printf("AliEveTrackCounter::DoTrackAction All=%d, Good=%d, Bad=%d\n",
210 fAllTracks, fGoodTracks, fAllTracks-fGoodTracks);
212 if (gEve->GetEditor()->GetModel() == GetObject(eh))
213 gEve->EditElement(this);
218 } // end switch fClickAction
221 //______________________________________________________________________________
222 void AliEveTrackCounter::DoTrackletAction(AliEveTracklet* track)
224 // Slot called when tracklet is secondary selected.
226 // No check is done if track actually belongs to one of the
227 // registered track-lists.
229 // Probably it would be safer to copy good/bad tracks into special
231 // In this case one should also override RemoveElementLocal.
233 static const TEveException eh("AliEveTrackCounter::DoTrackletAction ");
235 switch (fClickAction)
238 case kCA_PrintTrackInfo:
240 printf("AliEveTracklet '%s'\n", track->GetObject(eh)->GetName());
241 const TEveVector &v = track->GetVertex();
242 const TEveVector &p = track->GetMomentum();;
243 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
244 v.fX, v.fY, v.fZ, p.Perp(), p.fZ, TMath::RadToDeg()*p.Phi());
245 printf(" <other information should be printed ... full AliESDtrack>\n");
249 case kCA_ToggleTrack:
251 AliESDEvent *esd = AliEveEventManager::AssertESD();
252 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
254 if (track->GetLineStyle() == 1)
256 track->SetLineStyle(fBadLineStyle);
257 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) & ~1);
260 track->SetLineStyle(1);
261 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) | 1);
264 track->ElementChanged();
267 printf("AliEveTrackCounter::DoTrackletAction All=%d, Good=%d, Bad=%d\n",
268 fAllTracklets, fGoodTracklets, fAllTracklets-fGoodTracklets);
270 if (gEve->GetEditor()->GetModel() == GetObject(eh))
271 gEve->EditElement(this);
276 } // end switch fClickAction
279 /******************************************************************************/
281 //______________________________________________________________________________
282 void AliEveTrackCounter::OutputEventTracks()
284 // Print good-track summary into a plain-text file by iteration
285 // through all registered track-lists.
286 // State of each track is determined by its line-style, it is
287 // considered a good track if it's line style is solid.
290 TFile *f = TFile::Open("scan_results.root", "UPDATE");
292 AliESDEvent *esd = AliEveEventManager::AssertESD();
293 TClonesArray *trk = static_cast<TClonesArray*> (esd->GetList()->FindObject("Tracks"));
294 AliMultiplicity *mul = const_cast <AliMultiplicity*>(esd->GetMultiplicity());
296 trk->Write(TString::Format("Tracks_%04d", fEventId), kWriteDelete | kSingleKey);
297 mul->Write(TString::Format("Tracklets_%04d", fEventId), kWriteDelete);
303 //______________________________________________________________________________
304 void AliEveTrackCounter::PrintEventTracks()
306 // Print good-track summary to stdout by iteration
307 // through all registered track-lists.
308 // State of each track is determined by its line-style, it is
309 // considered a good track if it's line style is solid.
313 fprintf(out, "AliEveTrackCounter::PrintEventTracks()\n");
315 fprintf(out, "Event=%d\n", fEventId);
316 fprintf(out, "GoodTracks=%d AllTracks=%d\n", fGoodTracks, fAllTracks);
319 TIter tlists(&fTrackLists);
320 TEveTrackList* tlist;
322 while ((tlist = (TEveTrackList*) tlists()) != 0)
324 List_i i = tlist->BeginChildren();
325 while (i != tlist->EndChildren())
327 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
328 if (t != 0 && t->GetLineStyle() == 1)
331 fprintf(out, " %2d: chg=%+2d pt=%8.5f eta=%+8.5f phi=%+8.5f\n",
332 cnt, t->GetCharge(), t->GetMomentum().Perp(),
333 t->GetMomentum().Eta(), t->GetMomentum().Phi());
340 fprintf(out, "GoodTracklets=%d AllTracklets=%d\n", fGoodTracklets, fAllTracklets);
342 TIter tlists(&fTrackletLists);
343 TEveTrackList* tlist;
345 while ((tlist = (TEveTrackList*) tlists()) != 0)
347 List_i i = tlist->BeginChildren();
348 while (i != tlist->EndChildren())
350 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
351 if (t != 0 && t->GetLineStyle() == 1)
354 fprintf(out, " %2d: theta=%+8.5f eta=%+8.5f phi=%+8.5f\n",
355 cnt, t->GetMomentum().Theta(), t->GetMomentum().Eta(), t->GetMomentum().Phi());