]>
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 | ||
45 | //______________________________________________________________________________ | |
46 | AliEveTrackCounter::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 | //______________________________________________________________________________ | |
69 | AliEveTrackCounter::~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 | //______________________________________________________________________________ | |
82 | void 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 | //______________________________________________________________________________ | |
105 | void 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 | //______________________________________________________________________________ |
135 | void 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 | 166 | void 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 | 222 | void 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 | 282 | void 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 | //______________________________________________________________________________ | |
304 | void 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 | } |