]>
Commit | Line | Data |
---|---|---|
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 | ||
40 | ClassImp(AliEveTrackCounter) | |
41 | ||
42 | //______________________________________________________________________________ | |
43 | AliEveTrackCounter* AliEveTrackCounter::fgInstance = 0; | |
44 | ||
c12be4d4 | 45 | Bool_t AliEveTrackCounter::IsActive() |
46 | { | |
47 | // Check if instance exists and is active. | |
48 | ||
49 | return fgInstance && fgInstance->fActive; | |
50 | } | |
51 | ||
f76c9e9b | 52 | //______________________________________________________________________________ |
53 | AliEveTrackCounter::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 | //______________________________________________________________________________ | |
79 | AliEveTrackCounter::~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 | //______________________________________________________________________________ | |
94 | void 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 | //______________________________________________________________________________ | |
121 | void 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 | //______________________________________________________________________________ |
151 | void 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 | 184 | void 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 | 242 | void 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 | 304 | void 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 | //______________________________________________________________________________ | |
330 | void 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 | } |