d810d0de |
1 | // $Id$ |
2 | // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 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 * |
51346b82 |
7 | * full copyright notice. * |
d810d0de |
8 | **************************************************************************/ |
9 | |
10 | #include "AliEveTPCLoader.h" |
11 | #include "AliEveTPCData.h" |
cb4245bb |
12 | #include <EveDet/AliEveTPCSector2D.h> |
13 | #include <EveDet/AliEveTPCSector3D.h> |
84aff7a4 |
14 | #include <TEveManager.h> |
15 | #include <TEveGedEditor.h> |
e9a38ea3 |
16 | |
17 | #include <AliRawReaderRoot.h> |
18 | #include <AliTPCRawStream.h> |
19 | |
20 | #include <TSystem.h> |
d810d0de |
21 | |
e9a38ea3 |
22 | |
57ffa5fb |
23 | //______________________________________________________________________________ |
e9a38ea3 |
24 | // |
a97abca8 |
25 | // Front-end for stand-alone inspection of TPC raw-data. |
26 | // GUI is implemented in AliEveTPCLoaderEditor class. |
e9a38ea3 |
27 | |
d810d0de |
28 | ClassImp(AliEveTPCLoader) |
e9a38ea3 |
29 | |
d810d0de |
30 | AliEveTPCLoader::AliEveTPCLoader(const Text_t* n, const Text_t* t) : |
84aff7a4 |
31 | TEveElementList(n, t), |
e9a38ea3 |
32 | |
265ecb21 |
33 | fFile(), |
e9a38ea3 |
34 | fEvent(-1), |
8f50aad8 |
35 | fDoubleSR(kFALSE), |
e9a38ea3 |
36 | |
61eeeb0e |
37 | fTPCEquipementMap(), |
e9a38ea3 |
38 | fReader(0), |
39 | fData(0), |
40 | |
41 | fSec2Ds(36), |
e7c8d6ca |
42 | fSec3Ds(36), |
43 | |
265ecb21 |
44 | fSetInitSectorParams(kFALSE), |
b1e0b894 |
45 | fInitMinTime(0), fInitMaxTime(460), fInitThreshold(5), fInitMaxVal(128) |
46 | { |
a97abca8 |
47 | // Constructor. |
48 | |
d810d0de |
49 | fData = new AliEveTPCData; |
b1e0b894 |
50 | } |
e9a38ea3 |
51 | |
d810d0de |
52 | AliEveTPCLoader::~AliEveTPCLoader() |
e9a38ea3 |
53 | { |
a97abca8 |
54 | // Destructor. |
55 | |
e9a38ea3 |
56 | delete fReader; |
57 | delete fData; |
58 | } |
59 | |
57ffa5fb |
60 | /******************************************************************************/ |
e9a38ea3 |
61 | |
d810d0de |
62 | void AliEveTPCLoader::RemoveElementLocal(TEveElement* el) |
4a378d74 |
63 | { |
a97abca8 |
64 | // Local removal an element, virtual from TEveElement. |
65 | // Need to search for it in visual sector representations and remove |
66 | // it there as well. |
67 | |
68 | for (Int_t i=0; i<36; ++i) { |
69 | if (fSec2Ds[i] == el) fSec2Ds[i] = 0; |
70 | if (fSec3Ds[i] == el) fSec3Ds[i] = 0; |
4a378d74 |
71 | } |
4a378d74 |
72 | } |
73 | |
d810d0de |
74 | void AliEveTPCLoader::RemoveElementsLocal() |
4a378d74 |
75 | { |
a97abca8 |
76 | // Local removal of all elements, virtual from TEveElement. |
77 | // Must remove all visual sector representations. |
78 | |
79 | for (Int_t i=0; i<36; ++i) { |
4a378d74 |
80 | fSec2Ds[i] = 0; |
81 | fSec3Ds[i] = 0; |
82 | } |
4a378d74 |
83 | } |
84 | |
57ffa5fb |
85 | /******************************************************************************/ |
e9a38ea3 |
86 | |
d810d0de |
87 | void AliEveTPCLoader::SetData(AliEveTPCData* d) |
e9a38ea3 |
88 | { |
a97abca8 |
89 | // Set external TPC-data container. The old one is deleted. |
90 | |
e9a38ea3 |
91 | delete fData; |
92 | fData = d; |
93 | } |
94 | |
57ffa5fb |
95 | /******************************************************************************/ |
e9a38ea3 |
96 | |
d810d0de |
97 | void AliEveTPCLoader::OpenFile() |
e9a38ea3 |
98 | { |
a97abca8 |
99 | // Open the raw-data file, as set in fFile data-member. |
100 | // Raw-reader is also created and attached to the file. |
101 | // First event is loaded and all sectors for which the data-exists |
102 | // are created. |
103 | |
d810d0de |
104 | static const TEveException eH("AliEveTPCLoader::OpenFile "); |
e9a38ea3 |
105 | |
a97abca8 |
106 | if (gSystem->AccessPathName(fFile, kReadPermission)) |
e9a38ea3 |
107 | throw(eH + "can not read '" + fFile + "'."); |
108 | |
b1e0b894 |
109 | fData->DeleteAllSectors(); |
e9a38ea3 |
110 | |
111 | delete fReader; |
112 | fReader = 0; |
113 | fEvent = -1; |
114 | |
115 | fReader = new AliRawReaderRoot(fFile); |
a97abca8 |
116 | if (fTPCEquipementMap != "") |
61eeeb0e |
117 | fReader->LoadEquipmentIdsMap |
118 | (gSystem->ExpandPathName(fTPCEquipementMap.Data())); |
e9a38ea3 |
119 | |
120 | NextEvent(); |
121 | LoadEvent(); |
42c8253f |
122 | UpdateSectors(kTRUE); |
e9a38ea3 |
123 | } |
124 | |
d810d0de |
125 | void AliEveTPCLoader::LoadEvent() |
e9a38ea3 |
126 | { |
a97abca8 |
127 | // Load an event. |
128 | |
d810d0de |
129 | static const TEveException eH("AliEveTPCLoader::LoadEvent "); |
e9a38ea3 |
130 | |
a97abca8 |
131 | if (fReader == 0) |
e9a38ea3 |
132 | throw(eH + "data file not opened."); |
133 | |
134 | printf("Now loading event %d\n", fEvent); |
135 | fReader->Reset(); |
136 | AliTPCRawStream input(fReader); |
137 | input.SetOldRCUFormat(kTRUE); |
61eeeb0e |
138 | fReader->Select("TPC"); |
e9a38ea3 |
139 | |
140 | fData->DropAllSectors(); |
51346b82 |
141 | fData->LoadRaw(input, kTRUE, kTRUE); |
e9a38ea3 |
142 | } |
143 | |
d810d0de |
144 | void AliEveTPCLoader::NextEvent(Bool_t rewindOnEnd) |
e9a38ea3 |
145 | { |
a97abca8 |
146 | // Go o the next event. |
147 | // When the last event is reached and rewindOnEnd is true, the file |
148 | // is rewound back to the first event. Otherwise an exception is thrown. |
149 | |
d810d0de |
150 | static const TEveException eH("AliEveTPCLoader::NextEvent "); |
e9a38ea3 |
151 | |
a97abca8 |
152 | if (fReader == 0) |
e9a38ea3 |
153 | throw(eH + "data file not opened."); |
154 | |
a97abca8 |
155 | if (fReader->NextEvent() == kTRUE) { |
e9a38ea3 |
156 | ++fEvent; |
157 | } else { |
a97abca8 |
158 | if (fEvent == -1) |
e9a38ea3 |
159 | throw(eH + "no events available."); |
a97abca8 |
160 | if (rewindOnEnd) { |
e9a38ea3 |
161 | printf("Reached end of stream (event=%d), rewinding to first event.\n", fEvent); |
162 | fReader->RewindEvents(); |
163 | fReader->NextEvent(); |
164 | fEvent = 0; |
165 | } else { |
166 | throw(eH + "last event reached."); |
167 | } |
168 | } |
169 | } |
170 | |
d810d0de |
171 | void AliEveTPCLoader::GotoEvent(Int_t event) |
e9a38ea3 |
172 | { |
a97abca8 |
173 | // Go to specified event. |
174 | |
d810d0de |
175 | static const TEveException eH("AliEveTPCLoader::GotoEvent "); |
e9a38ea3 |
176 | |
a97abca8 |
177 | if (fReader == 0) |
e9a38ea3 |
178 | throw(eH + "data file not opened."); |
179 | |
a97abca8 |
180 | if (event == fEvent) |
e9a38ea3 |
181 | return; |
182 | Bool_t checkEnd; |
a97abca8 |
183 | if (event < fEvent) { |
e9a38ea3 |
184 | fReader->RewindEvents(); |
185 | fEvent = -1; |
186 | checkEnd = kFALSE; |
187 | } else { |
188 | checkEnd = kTRUE; |
189 | } |
190 | do { |
191 | NextEvent(); |
a97abca8 |
192 | } while (fEvent != event && !(checkEnd == kTRUE && fEvent == 0)); |
e9a38ea3 |
193 | LoadEvent(); |
194 | UpdateSectors(); |
195 | } |
196 | |
d810d0de |
197 | void* AliEveTPCLoader::LoopEvent(AliEveTPCLoader* loader) |
42c8253f |
198 | { |
a97abca8 |
199 | // Loop to next event on given loader. Static member to be used for |
200 | // external control during animations. |
201 | // Calls NextEvent(), LoadEvent() and UpdateSectors(). |
202 | |
42c8253f |
203 | loader->NextEvent(); |
204 | loader->LoadEvent(); |
205 | loader->UpdateSectors(); |
84aff7a4 |
206 | if (gEve->GetEditor()->GetModel() == loader) |
207 | gEve->EditElement(loader); |
42c8253f |
208 | return 0; |
209 | } |
210 | |
57ffa5fb |
211 | /******************************************************************************/ |
e9a38ea3 |
212 | |
d810d0de |
213 | void AliEveTPCLoader::UpdateSectors(Bool_t dropNonPresent) |
e9a38ea3 |
214 | { |
a97abca8 |
215 | // Update visual representations of sectors. |
216 | // If dropNonPresent is true, the sectors for which there is no data in |
217 | // the current event are removed. |
218 | |
84aff7a4 |
219 | gEve->DisableRedraw(); |
a97abca8 |
220 | for (Int_t i=0; i<=35; ++i) |
42c8253f |
221 | { |
d810d0de |
222 | AliEveTPCSectorData* sd = fData->GetSectorData(i); |
42c8253f |
223 | |
224 | // 2D sectors |
a97abca8 |
225 | if (fSec2Ds[i] != 0) |
42c8253f |
226 | { |
227 | if (dropNonPresent && sd == 0) { |
84aff7a4 |
228 | gEve->RemoveElement(fSec2Ds[i], this); |
42c8253f |
229 | fSec2Ds[i] = 0; |
230 | } else { |
231 | fSec2Ds[i]->IncRTS(); |
32e219c2 |
232 | fSec2Ds[i]->ElementChanged(); |
42c8253f |
233 | } |
234 | } |
235 | else |
236 | { |
a97abca8 |
237 | if (sd != 0) { |
d810d0de |
238 | AliEveTPCSector2D* s = new AliEveTPCSector2D(Form("Sector2D %d", i)); |
e9a38ea3 |
239 | fSec2Ds[i] = s; |
240 | s->SetSectorID(i); |
241 | s->SetDataSource(fData); |
8f50aad8 |
242 | |
a97abca8 |
243 | if (fDoubleSR) |
8f50aad8 |
244 | s->SetMaxTime(1023); |
e9a38ea3 |
245 | |
a97abca8 |
246 | if (fSetInitSectorParams) { |
e7c8d6ca |
247 | s->SetMinTime(fInitMinTime); |
248 | s->SetMaxTime(fInitMaxTime); |
249 | s->SetThreshold(fInitThreshold); |
b1e0b894 |
250 | s->SetMaxVal(fInitMaxVal); |
e7c8d6ca |
251 | } |
75a20dc1 |
252 | |
601bca51 |
253 | s->SetAutoTrans(kTRUE); |
e9a38ea3 |
254 | s->SetFrameColor(36); |
255 | |
84aff7a4 |
256 | gEve->AddElement(s, this); |
e9a38ea3 |
257 | } |
258 | } |
259 | |
42c8253f |
260 | // 3D sectors |
a97abca8 |
261 | if (fSec3Ds[i] != 0) |
42c8253f |
262 | { |
263 | if (dropNonPresent && sd == 0) { |
84aff7a4 |
264 | gEve->RemoveElement(fSec3Ds[i], this); |
42c8253f |
265 | fSec3Ds[i] = 0; |
266 | } else { |
267 | fSec3Ds[i]->IncRTS(); |
32e219c2 |
268 | fSec3Ds[i]->ElementChanged(); |
42c8253f |
269 | } |
e9a38ea3 |
270 | } |
271 | } |
84aff7a4 |
272 | gEve->Redraw3D(kTRUE, kFALSE); |
273 | gEve->EnableRedraw(); |
e9a38ea3 |
274 | } |
275 | |
d810d0de |
276 | void AliEveTPCLoader::ReloadSectors() |
c59e16e8 |
277 | { |
a97abca8 |
278 | // Reload current event and update sectors. |
279 | |
c59e16e8 |
280 | LoadEvent(); |
281 | UpdateSectors(); |
282 | } |
283 | |
d810d0de |
284 | void AliEveTPCLoader::CreateSectors3D() |
e9a38ea3 |
285 | { |
a97abca8 |
286 | // Create 3D representations of sectors. |
287 | |
84aff7a4 |
288 | gEve->DisableRedraw(); |
a97abca8 |
289 | for (Int_t i=0; i<=35; ++i) { |
d810d0de |
290 | AliEveTPCSectorData* sd = fData->GetSectorData(i); |
a97abca8 |
291 | if (sd != 0 && fSec3Ds[i] == 0) { |
d810d0de |
292 | AliEveTPCSector3D* s = new AliEveTPCSector3D(Form("Sector3D %d", i)); |
e9a38ea3 |
293 | fSec3Ds[i] = s; |
294 | s->SetSectorID(i); |
295 | s->SetDataSource(fData); |
8f50aad8 |
296 | |
a97abca8 |
297 | if (fDoubleSR) |
8f50aad8 |
298 | s->SetDriftVel(2.273); |
a97abca8 |
299 | if (fSec2Ds[i] != 0) |
8f50aad8 |
300 | s->CopyVizParams(*fSec2Ds[i]); |
e9a38ea3 |
301 | |
601bca51 |
302 | s->SetAutoTrans(kTRUE); |
e9a38ea3 |
303 | s->SetFrameColor(36); |
304 | |
84aff7a4 |
305 | gEve->AddElement(s, this); |
e9a38ea3 |
306 | } |
307 | } |
84aff7a4 |
308 | gEve->EnableRedraw(); |
e9a38ea3 |
309 | } |
310 | |
d810d0de |
311 | void AliEveTPCLoader::DeleteSectors3D() |
e9a38ea3 |
312 | { |
a97abca8 |
313 | // Delete 3D representations of sectors. |
314 | |
84aff7a4 |
315 | gEve->DisableRedraw(); |
a97abca8 |
316 | for (Int_t i=0; i<=35; ++i) { |
84aff7a4 |
317 | TEveElement* re = fSec3Ds[i]; |
a97abca8 |
318 | if (re != 0) { |
84aff7a4 |
319 | gEve->RemoveElement(re, this); |
4a378d74 |
320 | // delete re; // Done automatically. |
e9a38ea3 |
321 | fSec3Ds[i] = 0; |
322 | } |
323 | } |
84aff7a4 |
324 | gEve->EnableRedraw(); |
e9a38ea3 |
325 | } |
e7c8d6ca |
326 | |
57ffa5fb |
327 | /******************************************************************************/ |
e7c8d6ca |
328 | |
d810d0de |
329 | void AliEveTPCLoader::SetInitParams(Int_t mint, Int_t maxt, Int_t thr, Int_t maxval) |
e7c8d6ca |
330 | { |
a97abca8 |
331 | // Set initial viualization parameters for 2D and 3D sector representations. |
332 | |
e7c8d6ca |
333 | fSetInitSectorParams = kTRUE; |
334 | fInitMinTime = mint; |
335 | fInitMaxTime = maxt; |
336 | fInitThreshold = thr; |
b1e0b894 |
337 | fInitMaxVal = maxval; |
e7c8d6ca |
338 | } |