]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveBase/AliEveTrackCounter.cxx
PHOS - Fixing circular dependecies + initial DA files
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveTrackCounter.cxx
CommitLineData
f76c9e9b 1// @(#)root/eve:$Id$
2// Author: Matevz Tadel 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#include "AliEveTrackCounter.h"
11
12#include "TEveManager.h"
bccc8088 13#include "AliEveEventManager.h"
0e33c639 14#include "AliEveTrack.h"
3a20f984 15#include "AliEveTracklet.h"
16
bccc8088 17#include "AliESDEvent.h"
18#include "AliESDtrack.h"
19#include "AliMultiplicity.h"
20
3a20f984 21#include <TEveGedEditor.h>
f76c9e9b 22
786d9102 23#include <TFile.h>
24
f76c9e9b 25//==============================================================================
26// AliEveTrackCounter
27//==============================================================================
28
29//______________________________________________________________________________
30//
31// Provides event-based method for tagging of good / bad (or primary /
32// secondary) tracks. A report can be written into a text file.
33//
0e33c639 34// AliEveTrack status is toggled by using secondary-selection / ctrl-click
f76c9e9b 35// functionality of the GL viewer.
36//
37// Some of the functionality is implemented in AliEveTrackCounterEditor
38// class.
39
40ClassImp(AliEveTrackCounter)
41
42//______________________________________________________________________________
43AliEveTrackCounter* AliEveTrackCounter::fgInstance = 0;
44
c12be4d4 45Bool_t AliEveTrackCounter::IsActive()
46{
47 // Check if instance exists and is active.
48
49 return fgInstance && fgInstance->fActive;
50}
51
f76c9e9b 52//______________________________________________________________________________
53AliEveTrackCounter::AliEveTrackCounter(const Text_t* name, const Text_t* title) :
3a20f984 54 TEveElement(),
55 TNamed(name, title),
56
57 fBadLineStyle (6),
58 fClickAction (kCA_ToggleTrack),
59 fEventId (-1),
60 fAllTracks (0), fGoodTracks (0),
61 fAllTracklets (0), fGoodTracklets(0),
c12be4d4 62 fTrackLists (), fTrackletLists(),
63 fActive (kFALSE)
f76c9e9b 64{
3a20f984 65 // Constructor.
66 // Connects to global signal "AliEveTrack", "SecSelected(AliEveTrack*)".
67
68 if (fgInstance == 0) fgInstance = this;
f76c9e9b 69
3a20f984 70 TQObject::Connect("AliEveTrack", "SecSelectedTrack(AliEveTrack*)",
71 "AliEveTrackCounter", this, "DoTrackAction(AliEveTrack*)");
72 TQObject::Connect("AliEveTracklet", "SecSelectedTracklet(AliEveTracklet*)",
73 "AliEveTrackCounter", this, "DoTrackletAction(AliEveTracklet*)");
c12be4d4 74
75 AliEveEventManager::GetMaster()->Connect("NewEventDataLoaded()", "AliEveTrackCounter", this, "Reset()");
f76c9e9b 76}
77
78//______________________________________________________________________________
79AliEveTrackCounter::~AliEveTrackCounter()
80{
3a20f984 81 // Destructor.
82 // Disconnect from the global track signals.
f76c9e9b 83
c12be4d4 84 AliEveEventManager::GetMaster()->Disconnect("NewEventDataLoaded()", this);
85
3a20f984 86 TQObject::Disconnect("AliEveTrack", "DoTrackAction(AliEveTrack*)");
87 TQObject::Disconnect("AliEveTracklet", "DoTrackletAction(AliEveTracklet*)");
88 if (fgInstance == this) fgInstance = 0;
f76c9e9b 89}
90
91/******************************************************************************/
92
93//______________________________________________________________________________
94void AliEveTrackCounter::Reset()
95{
3a20f984 96 // Reset internal track-counters and track-list.
97
98 fAllTracks = fGoodTracks = 0;
99 fAllTracklets = fGoodTracklets = 0;
100 {
101 TIter next(&fTrackLists);
102 TEveTrackList* tlist;
103 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
f76c9e9b 104 tlist->DecDenyDestroy();
164d3d29 105 //fTrackLists.Clear("nodelete");
106 fTrackLists.Clear();
3a20f984 107 }
108 {
109 TIter next(&fTrackletLists);
110 TEveTrackList* tlist;
111 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
112 tlist->DecDenyDestroy();
164d3d29 113 //fTrackletLists.Clear("nodelete");
114 fTrackletLists.Clear();
3a20f984 115 }
c12be4d4 116
117 fEventId = AliEveEventManager::GetMaster()->GetEventId();
f76c9e9b 118}
119
120//______________________________________________________________________________
121void AliEveTrackCounter::RegisterTracks(TEveTrackList* tlist, Bool_t goodTracks)
122{
3a20f984 123 // Register tracks from tlist and tlist itself.
124 // If goodTracks is true, they are considered as primary/good
125 // tracks.
126
127 tlist->IncDenyDestroy();
128 fTrackLists.Add(tlist);
129
130 List_i i = tlist->BeginChildren();
131 while (i != tlist->EndChildren())
132 {
133 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
134 if (t != 0)
135 {
136 if (goodTracks)
137 {
138 ++fGoodTracks;
bccc8088 139 t->GetESDTrack()->SetLabel(3);
3a20f984 140 } else {
141 t->SetLineStyle(fBadLineStyle);
bccc8088 142 t->GetESDTrack()->SetLabel(0);
3a20f984 143 }
144 ++fAllTracks;
145 }
146 ++i;
147 }
148}
f76c9e9b 149
3a20f984 150//______________________________________________________________________________
151void AliEveTrackCounter::RegisterTracklets(TEveTrackList* tlist, Bool_t goodTracks)
152{
153 // Register tracklets from tlist and tlist itself.
154 // If goodTracks is true, they are considered as primary/good
155 // tracks.
156
bccc8088 157 AliESDEvent *esd = AliEveEventManager::AssertESD();
158 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
159
3a20f984 160 tlist->IncDenyDestroy();
161 fTrackletLists.Add(tlist);
162
163 List_i i = tlist->BeginChildren();
164 while (i != tlist->EndChildren())
165 {
166 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
167 if (t != 0)
168 {
c12be4d4 169 if (goodTracks)
f76c9e9b 170 {
c12be4d4 171 mul->SetLabel(t->GetIndex(), 0, 3);
3a20f984 172 ++fGoodTracklets;
173 } else {
c12be4d4 174 mul->SetLabel(t->GetIndex(), 0, 0);
3a20f984 175 t->SetLineStyle(fBadLineStyle);
f76c9e9b 176 }
3a20f984 177 ++fAllTracklets;
178 }
179 ++i;
180 }
f76c9e9b 181}
182
183//______________________________________________________________________________
0e33c639 184void AliEveTrackCounter::DoTrackAction(AliEveTrack* track)
f76c9e9b 185{
3a20f984 186 // Slot called when track is secondary selected.
f76c9e9b 187 //
188 // No check is done if track actually belongs to one of the
189 // registered track-lists.
190 //
191 // Probably it would be safer to copy good/bad tracks into special
192 // sub-containers.
193 // In this case one should also override RemoveElementLocal.
194
195 static const TEveException eh("AliEveTrackCounter::DoTrackAction ");
196
c12be4d4 197 if (!fActive)
198 return;
199
f76c9e9b 200 switch (fClickAction)
201 {
202
203 case kCA_PrintTrackInfo:
204 {
0e33c639 205 printf("AliEveTrack '%s'\n", track->GetObject(eh)->GetName());
f76c9e9b 206 const TEveVector &v = track->GetVertex();
207 const TEveVector &p = track->GetMomentum();;
208 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
209 v.fX, v.fY, v.fZ, p.Perp(), p.fZ, TMath::RadToDeg()*p.Phi());
f76c9e9b 210 break;
211 }
212
213 case kCA_ToggleTrack:
214 {
bccc8088 215 AliESDtrack *esdt = track->GetESDTrack();
f76c9e9b 216 if (track->GetLineStyle() == 1)
217 {
218 track->SetLineStyle(fBadLineStyle);
bccc8088 219 esdt->SetLabel(esdt->GetLabel() & ~1);
f76c9e9b 220 --fGoodTracks;
221 } else {
222 track->SetLineStyle(1);
bccc8088 223 esdt->SetLabel(esdt->GetLabel() | 1);
f76c9e9b 224 ++fGoodTracks;
225 }
226 track->ElementChanged();
227 gEve->Redraw3D();
228
c12be4d4 229 //printf("AliEveTrackCounter::DoTrackAction All=%d, Good=%d, Bad=%d\n",
230 // fAllTracks, fGoodTracks, fAllTracks-fGoodTracks);
f76c9e9b 231
232 if (gEve->GetEditor()->GetModel() == GetObject(eh))
233 gEve->EditElement(this);
234
235 break;
236 }
237
238 } // end switch fClickAction
239}
240
f76c9e9b 241//______________________________________________________________________________
3a20f984 242void AliEveTrackCounter::DoTrackletAction(AliEveTracklet* track)
f76c9e9b 243{
3a20f984 244 // Slot called when tracklet is secondary selected.
245 //
246 // No check is done if track actually belongs to one of the
247 // registered track-lists.
248 //
249 // Probably it would be safer to copy good/bad tracks into special
250 // sub-containers.
251 // In this case one should also override RemoveElementLocal.
f76c9e9b 252
3a20f984 253 static const TEveException eh("AliEveTrackCounter::DoTrackletAction ");
254
c12be4d4 255 if (!fActive)
256 return;
257
3a20f984 258 switch (fClickAction)
f76c9e9b 259 {
f76c9e9b 260
3a20f984 261 case kCA_PrintTrackInfo:
262 {
263 printf("AliEveTracklet '%s'\n", track->GetObject(eh)->GetName());
264 const TEveVector &v = track->GetVertex();
265 const TEveVector &p = track->GetMomentum();;
266 printf(" Vx=%f, Vy=%f, Vz=%f; Pt=%f, Pz=%f, phi=%f)\n",
267 v.fX, v.fY, v.fZ, p.Perp(), p.fZ, TMath::RadToDeg()*p.Phi());
3a20f984 268 break;
269 }
f76c9e9b 270
3a20f984 271 case kCA_ToggleTrack:
f76c9e9b 272 {
bccc8088 273 AliESDEvent *esd = AliEveEventManager::AssertESD();
274 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
275
3a20f984 276 if (track->GetLineStyle() == 1)
f76c9e9b 277 {
3a20f984 278 track->SetLineStyle(fBadLineStyle);
bccc8088 279 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) & ~1);
3a20f984 280 --fGoodTracklets;
281 } else {
282 track->SetLineStyle(1);
bccc8088 283 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) | 1);
3a20f984 284 ++fGoodTracklets;
f76c9e9b 285 }
3a20f984 286 track->ElementChanged();
287 gEve->Redraw3D();
288
c12be4d4 289 // printf("AliEveTrackCounter::DoTrackletAction All=%d, Good=%d, Bad=%d\n",
290 // fAllTracklets, fGoodTracklets, fAllTracklets-fGoodTracklets);
3a20f984 291
292 if (gEve->GetEditor()->GetModel() == GetObject(eh))
293 gEve->EditElement(this);
294
295 break;
296 }
297
298 } // end switch fClickAction
299}
300
301/******************************************************************************/
302
303//______________________________________________________________________________
786d9102 304void AliEveTrackCounter::OutputEventTracks()
3a20f984 305{
306 // Print good-track summary into a plain-text file 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.
310
3a20f984 311 {
786d9102 312 TFile *f = TFile::Open("scan_results.root", "UPDATE");
313
314 AliESDEvent *esd = AliEveEventManager::AssertESD();
315 TClonesArray *trk = static_cast<TClonesArray*> (esd->GetList()->FindObject("Tracks"));
316 AliMultiplicity *mul = const_cast <AliMultiplicity*>(esd->GetMultiplicity());
317
318 trk->Write(TString::Format("Tracks_%04d", fEventId), kWriteDelete | kSingleKey);
319 mul->Write(TString::Format("Tracklets_%04d", fEventId), kWriteDelete);
320
4267948f 321 esd->GetPrimaryVertexTracks()->Write(TString::Format("PrimVertTracks_%04d", fEventId), kWriteDelete);
322 esd->GetPrimaryVertexTPC() ->Write(TString::Format("PrimVertTPC_%04d", fEventId), kWriteDelete);
323 esd->GetPrimaryVertexSPD() ->Write(TString::Format("PrimVertSPD_%04d", fEventId), kWriteDelete);
324
786d9102 325 f->Close();
3a20f984 326 }
786d9102 327}
328
329//______________________________________________________________________________
330void AliEveTrackCounter::PrintEventTracks()
331{
332 // Print good-track summary to stdout by iteration
333 // through all registered track-lists.
334 // State of each track is determined by its line-style, it is
335 // considered a good track if it's line style is solid.
336
337 FILE* out = stdout;
338
339 fprintf(out, "AliEveTrackCounter::PrintEventTracks()\n");
3a20f984 340
341 fprintf(out, "Event=%d\n", fEventId);
342 fprintf(out, "GoodTracks=%d AllTracks=%d\n", fGoodTracks, fAllTracks);
343
344 {
345 TIter tlists(&fTrackLists);
346 TEveTrackList* tlist;
347 Int_t cnt = 0;
348 while ((tlist = (TEveTrackList*) tlists()) != 0)
349 {
350 List_i i = tlist->BeginChildren();
351 while (i != tlist->EndChildren())
352 {
353 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
354 if (t != 0 && t->GetLineStyle() == 1)
355 {
356 ++cnt;
357 fprintf(out, " %2d: chg=%+2d pt=%8.5f eta=%+8.5f phi=%+8.5f\n",
358 cnt, t->GetCharge(), t->GetMomentum().Perp(),
359 t->GetMomentum().Eta(), t->GetMomentum().Phi());
360 }
361 ++i;
362 }
363 }
364 }
365
366 fprintf(out, "GoodTracklets=%d AllTracklets=%d\n", fGoodTracklets, fAllTracklets);
367 {
368 TIter tlists(&fTrackletLists);
369 TEveTrackList* tlist;
370 Int_t cnt = 0;
371 while ((tlist = (TEveTrackList*) tlists()) != 0)
372 {
373 List_i i = tlist->BeginChildren();
374 while (i != tlist->EndChildren())
375 {
376 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
377 if (t != 0 && t->GetLineStyle() == 1)
378 {
379 ++cnt;
380 fprintf(out, " %2d: theta=%+8.5f eta=%+8.5f phi=%+8.5f\n",
381 cnt, t->GetMomentum().Theta(), t->GetMomentum().Eta(), t->GetMomentum().Phi());
382 }
383 ++i;
f76c9e9b 384 }
3a20f984 385 }
386 }
f76c9e9b 387}