]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveBase/AliEveTrackCounter.cxx
added the option to save or not the QA data objects
[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
45//______________________________________________________________________________
46AliEveTrackCounter::AliEveTrackCounter(const Text_t* name, const Text_t* title) :
3a20f984 47 TEveElement(),
48 TNamed(name, title),
49
50 fBadLineStyle (6),
51 fClickAction (kCA_ToggleTrack),
52 fEventId (-1),
53 fAllTracks (0), fGoodTracks (0),
54 fAllTracklets (0), fGoodTracklets(0),
55 fTrackLists (), fTrackletLists()
f76c9e9b 56{
3a20f984 57 // Constructor.
58 // Connects to global signal "AliEveTrack", "SecSelected(AliEveTrack*)".
59
60 if (fgInstance == 0) fgInstance = this;
f76c9e9b 61
3a20f984 62 TQObject::Connect("AliEveTrack", "SecSelectedTrack(AliEveTrack*)",
63 "AliEveTrackCounter", this, "DoTrackAction(AliEveTrack*)");
64 TQObject::Connect("AliEveTracklet", "SecSelectedTracklet(AliEveTracklet*)",
65 "AliEveTrackCounter", this, "DoTrackletAction(AliEveTracklet*)");
f76c9e9b 66}
67
68//______________________________________________________________________________
69AliEveTrackCounter::~AliEveTrackCounter()
70{
3a20f984 71 // Destructor.
72 // Disconnect from the global track signals.
f76c9e9b 73
3a20f984 74 TQObject::Disconnect("AliEveTrack", "DoTrackAction(AliEveTrack*)");
75 TQObject::Disconnect("AliEveTracklet", "DoTrackletAction(AliEveTracklet*)");
76 if (fgInstance == this) fgInstance = 0;
f76c9e9b 77}
78
79/******************************************************************************/
80
81//______________________________________________________________________________
82void AliEveTrackCounter::Reset()
83{
3a20f984 84 // Reset internal track-counters and track-list.
85
86 fAllTracks = fGoodTracks = 0;
87 fAllTracklets = fGoodTracklets = 0;
88 {
89 TIter next(&fTrackLists);
90 TEveTrackList* tlist;
91 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
f76c9e9b 92 tlist->DecDenyDestroy();
3a20f984 93 fTrackLists.Clear("nodelete");
94 }
95 {
96 TIter next(&fTrackletLists);
97 TEveTrackList* tlist;
98 while ((tlist = dynamic_cast<TEveTrackList*>(next())))
99 tlist->DecDenyDestroy();
100 fTrackletLists.Clear("nodelete");
101 }
f76c9e9b 102}
103
104//______________________________________________________________________________
105void AliEveTrackCounter::RegisterTracks(TEveTrackList* tlist, Bool_t goodTracks)
106{
3a20f984 107 // Register tracks from tlist and tlist itself.
108 // If goodTracks is true, they are considered as primary/good
109 // tracks.
110
111 tlist->IncDenyDestroy();
112 fTrackLists.Add(tlist);
113
114 List_i i = tlist->BeginChildren();
115 while (i != tlist->EndChildren())
116 {
117 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
118 if (t != 0)
119 {
120 if (goodTracks)
121 {
122 ++fGoodTracks;
bccc8088 123 t->GetESDTrack()->SetLabel(3);
3a20f984 124 } else {
125 t->SetLineStyle(fBadLineStyle);
bccc8088 126 t->GetESDTrack()->SetLabel(0);
3a20f984 127 }
128 ++fAllTracks;
129 }
130 ++i;
131 }
132}
f76c9e9b 133
3a20f984 134//______________________________________________________________________________
135void AliEveTrackCounter::RegisterTracklets(TEveTrackList* tlist, Bool_t goodTracks)
136{
137 // Register tracklets from tlist and tlist itself.
138 // If goodTracks is true, they are considered as primary/good
139 // tracks.
140
bccc8088 141 AliESDEvent *esd = AliEveEventManager::AssertESD();
142 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
143
3a20f984 144 tlist->IncDenyDestroy();
145 fTrackletLists.Add(tlist);
146
147 List_i i = tlist->BeginChildren();
148 while (i != tlist->EndChildren())
149 {
150 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
151 if (t != 0)
152 {
bccc8088 153 if (goodTracks && mul->GetLabel(t->GetIndex(), 0) == 3)
f76c9e9b 154 {
3a20f984 155 ++fGoodTracklets;
156 } else {
157 t->SetLineStyle(fBadLineStyle);
f76c9e9b 158 }
3a20f984 159 ++fAllTracklets;
160 }
161 ++i;
162 }
f76c9e9b 163}
164
165//______________________________________________________________________________
0e33c639 166void AliEveTrackCounter::DoTrackAction(AliEveTrack* track)
f76c9e9b 167{
3a20f984 168 // Slot called when track is secondary selected.
f76c9e9b 169 //
170 // No check is done if track actually belongs to one of the
171 // registered track-lists.
172 //
173 // Probably it would be safer to copy good/bad tracks into special
174 // sub-containers.
175 // In this case one should also override RemoveElementLocal.
176
177 static const TEveException eh("AliEveTrackCounter::DoTrackAction ");
178
179 switch (fClickAction)
180 {
181
182 case kCA_PrintTrackInfo:
183 {
0e33c639 184 printf("AliEveTrack '%s'\n", track->GetObject(eh)->GetName());
f76c9e9b 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");
190 break;
191 }
192
193 case kCA_ToggleTrack:
194 {
bccc8088 195 AliESDtrack *esdt = track->GetESDTrack();
f76c9e9b 196 if (track->GetLineStyle() == 1)
197 {
198 track->SetLineStyle(fBadLineStyle);
bccc8088 199 esdt->SetLabel(esdt->GetLabel() & ~1);
f76c9e9b 200 --fGoodTracks;
201 } else {
202 track->SetLineStyle(1);
bccc8088 203 esdt->SetLabel(esdt->GetLabel() | 1);
f76c9e9b 204 ++fGoodTracks;
205 }
206 track->ElementChanged();
207 gEve->Redraw3D();
208
3a20f984 209 printf("AliEveTrackCounter::DoTrackAction All=%d, Good=%d, Bad=%d\n",
f76c9e9b 210 fAllTracks, fGoodTracks, fAllTracks-fGoodTracks);
211
212 if (gEve->GetEditor()->GetModel() == GetObject(eh))
213 gEve->EditElement(this);
214
215 break;
216 }
217
218 } // end switch fClickAction
219}
220
f76c9e9b 221//______________________________________________________________________________
3a20f984 222void AliEveTrackCounter::DoTrackletAction(AliEveTracklet* track)
f76c9e9b 223{
3a20f984 224 // Slot called when tracklet is secondary selected.
225 //
226 // No check is done if track actually belongs to one of the
227 // registered track-lists.
228 //
229 // Probably it would be safer to copy good/bad tracks into special
230 // sub-containers.
231 // In this case one should also override RemoveElementLocal.
f76c9e9b 232
3a20f984 233 static const TEveException eh("AliEveTrackCounter::DoTrackletAction ");
234
235 switch (fClickAction)
f76c9e9b 236 {
f76c9e9b 237
3a20f984 238 case kCA_PrintTrackInfo:
239 {
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");
246 break;
247 }
f76c9e9b 248
3a20f984 249 case kCA_ToggleTrack:
f76c9e9b 250 {
bccc8088 251 AliESDEvent *esd = AliEveEventManager::AssertESD();
252 AliMultiplicity *mul = const_cast<AliMultiplicity*>(esd->GetMultiplicity());
253
3a20f984 254 if (track->GetLineStyle() == 1)
f76c9e9b 255 {
3a20f984 256 track->SetLineStyle(fBadLineStyle);
bccc8088 257 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) & ~1);
3a20f984 258 --fGoodTracklets;
259 } else {
260 track->SetLineStyle(1);
bccc8088 261 mul->SetLabel(track->GetIndex(), 0, mul->GetLabel(track->GetIndex(), 0) | 1);
3a20f984 262 ++fGoodTracklets;
f76c9e9b 263 }
3a20f984 264 track->ElementChanged();
265 gEve->Redraw3D();
266
267 printf("AliEveTrackCounter::DoTrackletAction All=%d, Good=%d, Bad=%d\n",
268 fAllTracklets, fGoodTracklets, fAllTracklets-fGoodTracklets);
269
270 if (gEve->GetEditor()->GetModel() == GetObject(eh))
271 gEve->EditElement(this);
272
273 break;
274 }
275
276 } // end switch fClickAction
277}
278
279/******************************************************************************/
280
281//______________________________________________________________________________
786d9102 282void AliEveTrackCounter::OutputEventTracks()
3a20f984 283{
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.
288
3a20f984 289 {
786d9102 290 TFile *f = TFile::Open("scan_results.root", "UPDATE");
291
292 AliESDEvent *esd = AliEveEventManager::AssertESD();
293 TClonesArray *trk = static_cast<TClonesArray*> (esd->GetList()->FindObject("Tracks"));
294 AliMultiplicity *mul = const_cast <AliMultiplicity*>(esd->GetMultiplicity());
295
296 trk->Write(TString::Format("Tracks_%04d", fEventId), kWriteDelete | kSingleKey);
297 mul->Write(TString::Format("Tracklets_%04d", fEventId), kWriteDelete);
298
299 f->Close();
3a20f984 300 }
786d9102 301}
302
303//______________________________________________________________________________
304void AliEveTrackCounter::PrintEventTracks()
305{
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.
310
311 FILE* out = stdout;
312
313 fprintf(out, "AliEveTrackCounter::PrintEventTracks()\n");
3a20f984 314
315 fprintf(out, "Event=%d\n", fEventId);
316 fprintf(out, "GoodTracks=%d AllTracks=%d\n", fGoodTracks, fAllTracks);
317
318 {
319 TIter tlists(&fTrackLists);
320 TEveTrackList* tlist;
321 Int_t cnt = 0;
322 while ((tlist = (TEveTrackList*) tlists()) != 0)
323 {
324 List_i i = tlist->BeginChildren();
325 while (i != tlist->EndChildren())
326 {
327 AliEveTrack* t = dynamic_cast<AliEveTrack*>(*i);
328 if (t != 0 && t->GetLineStyle() == 1)
329 {
330 ++cnt;
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());
334 }
335 ++i;
336 }
337 }
338 }
339
340 fprintf(out, "GoodTracklets=%d AllTracklets=%d\n", fGoodTracklets, fAllTracklets);
341 {
342 TIter tlists(&fTrackletLists);
343 TEveTrackList* tlist;
344 Int_t cnt = 0;
345 while ((tlist = (TEveTrackList*) tlists()) != 0)
346 {
347 List_i i = tlist->BeginChildren();
348 while (i != tlist->EndChildren())
349 {
350 AliEveTracklet* t = dynamic_cast<AliEveTracklet*>(*i);
351 if (t != 0 && t->GetLineStyle() == 1)
352 {
353 ++cnt;
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());
356 }
357 ++i;
f76c9e9b 358 }
3a20f984 359 }
360 }
f76c9e9b 361}