]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Alieve/TPCLoader.cxx
From Annalisa: changes for the new TOF geometry classes.
[u/mrichter/AliRoot.git] / EVE / Alieve / TPCLoader.cxx
1 // $Header$
2
3 #include "TPCLoader.h"
4 #include "TPCData.h"
5 #include <Alieve/TPCSector2D.h>
6 #include <Alieve/TPCSector3D.h>
7 #include <Reve/RGTopFrame.h>
8 #include <Reve/RGEditor.h>
9
10 #include <AliRawReaderRoot.h>
11 #include <AliTPCRawStream.h>
12
13 #include <TSystem.h>
14
15 using namespace Reve;
16 using namespace Alieve;
17
18 //______________________________________________________________________
19 // TPCLoader
20 //
21
22 ClassImp(TPCLoader)
23
24 TPCLoader::TPCLoader(const Text_t* n, const Text_t* t) :
25   RenderElementList(n, t),
26
27   fFile(),
28   fEvent(-1),
29   fDoubleSR(kFALSE),
30
31   fTPCEquipementMap(),
32   fReader(0),
33   fData(0),
34
35   fSec2Ds(36),
36   fSec3Ds(36),
37
38   fSetInitSectorParams(kFALSE),
39   fInitMinTime(0), fInitMaxTime(460), fInitThreshold(5)
40 {}
41
42 TPCLoader::~TPCLoader()
43 {
44   delete fReader;
45   delete fData;
46 }
47
48 /**************************************************************************/
49
50 void TPCLoader::RemoveElementLocal(RenderElement* el)
51 {
52   for(Int_t i=0; i<36; ++i) {
53     if(fSec2Ds[i] == el) fSec2Ds[i] = 0;
54     if(fSec3Ds[i] == el) fSec3Ds[i] = 0;
55   }
56
57   RenderElement::RemoveElementLocal(el);
58 }
59
60 void TPCLoader::RemoveElements()
61 {
62   for(Int_t i=0; i<36; ++i) {
63     fSec2Ds[i] = 0;
64     fSec3Ds[i] = 0;
65   }
66
67   RenderElement::RemoveElements();
68 }
69
70 /**************************************************************************/
71
72 void TPCLoader::SetData(TPCData* d)
73 {
74   delete fData;
75   fData = d;
76 }
77
78 /**************************************************************************/
79
80 void TPCLoader::OpenFile()
81 {
82   static const Exc_t eH("TPCLoader::OpenFile ");
83
84   if(gSystem->AccessPathName(fFile, kReadPermission))
85       throw(eH + "can not read '" + fFile + "'.");
86
87   if(fData == 0)
88     fData = new TPCData;
89   else
90     fData->DeleteAllSectors();
91
92   delete fReader;
93   fReader =  0;
94   fEvent  = -1;
95
96   fReader = new AliRawReaderRoot(fFile);
97   if(fTPCEquipementMap != "")
98     fReader->LoadEquipmentIdsMap
99       (gSystem->ExpandPathName(fTPCEquipementMap.Data()));
100
101   NextEvent();
102   LoadEvent();
103   UpdateSectors(kTRUE);
104 }
105
106 void TPCLoader::LoadEvent()
107 {
108   static const Exc_t eH("TPCLoader::LoadEvent ");
109
110   if(fReader == 0)
111     throw(eH + "data file not opened.");
112
113   printf("Now loading event %d\n", fEvent);
114   fReader->Reset();
115   AliTPCRawStream input(fReader);
116   input.SetOldRCUFormat(kTRUE);
117   fReader->Select("TPC");
118
119   fData->DropAllSectors();
120   fData->LoadRaw(input, kTRUE, kTRUE);  
121 }
122
123 void TPCLoader::NextEvent(Bool_t rewindOnEnd)
124 {
125   static const Exc_t eH("TPCLoader::NextEvent ");
126
127   if(fReader == 0)
128     throw(eH + "data file not opened.");
129
130   if(fReader->NextEvent() == kTRUE) {
131     ++fEvent;
132   } else {
133     if(fEvent == -1)
134       throw(eH + "no events available.");
135     if(rewindOnEnd) {
136       printf("Reached end of stream (event=%d), rewinding to first event.\n", fEvent);
137       fReader->RewindEvents();
138       fReader->NextEvent();
139       fEvent = 0;
140     } else {
141       throw(eH + "last event reached.");
142     }
143   }
144 }
145
146 void TPCLoader::GotoEvent(Int_t event)
147 {
148   static const Exc_t eH("TPCLoader::GotoEvent ");
149
150   if(fReader == 0)
151     throw(eH + "data file not opened.");
152
153   if(event == fEvent)
154     return;
155   Bool_t checkEnd;
156   if(event < fEvent) {
157     fReader->RewindEvents();
158     fEvent = -1;
159     checkEnd = kFALSE;
160   } else {
161     checkEnd = kTRUE;
162   }
163   do {
164     NextEvent();
165   } while(fEvent != event && !(checkEnd == kTRUE && fEvent == 0));
166   LoadEvent();
167   UpdateSectors();
168 }
169
170 void* TPCLoader::LoopEvent(TPCLoader* loader)
171 {
172   loader->NextEvent();
173   loader->LoadEvent();
174   loader->UpdateSectors();
175   if (gReve->GetEditor()->GetModel() == loader)
176     gReve->EditRenderElement(loader);
177   return 0;
178 }
179
180 /**************************************************************************/
181
182 void TPCLoader::UpdateSectors(Bool_t dropNonPresent)
183 {
184   gReve->DisableRedraw();
185   for(Int_t i=0; i<=35; ++i)
186   {
187     TPCSectorData* sd = fData->GetSectorData(i);
188
189     // 2D sectors
190     if(fSec2Ds[i] != 0)
191     {
192       if (dropNonPresent && sd == 0) {
193         gReve->RemoveRenderElement(this, fSec2Ds[i]);
194         fSec2Ds[i] = 0;
195       } else {
196         fSec2Ds[i]->IncRTS();
197       }
198     }
199     else
200     {
201       if(sd != 0) {
202         TPCSector2D* s = new TPCSector2D(Form("Sector2D %d", i));
203         fSec2Ds[i] = s;
204         s->SetSectorID(i);
205         s->SetDataSource(fData);
206
207         if(fDoubleSR)
208           s->SetMaxTime(1023);
209
210         if(fSetInitSectorParams) {
211           s->SetMinTime(fInitMinTime);
212           s->SetMaxTime(fInitMaxTime);
213           s->SetThreshold(fInitThreshold);
214         }
215
216         s->SetAutoTrans(kTRUE);
217         s->SetFrameColor(36);
218
219         gReve->AddRenderElement(this, s);
220       }
221     }
222
223     // 3D sectors
224     if(fSec3Ds[i] != 0)
225     {
226       if (dropNonPresent && sd == 0) {
227         gReve->RemoveRenderElement(this, fSec3Ds[i]);
228         fSec3Ds[i] = 0;
229       } else {
230         fSec3Ds[i]->IncRTS();
231       }
232     }
233   }
234   gReve->Redraw3D(kFALSE, kTRUE);
235   gReve->EnableRedraw();
236 }
237
238 void TPCLoader::ReloadSectors()
239 {
240   LoadEvent();
241   UpdateSectors();
242 }
243
244 void TPCLoader::CreateSectors3D()
245 {
246   gReve->DisableRedraw();
247   for(Int_t i=0; i<=35; ++i) {
248     TPCSectorData* sd = fData->GetSectorData(i);
249     if(sd != 0 && fSec3Ds[i] == 0) {
250       TPCSector3D* s = new TPCSector3D(Form("Sector3D %d", i));
251       fSec3Ds[i] = s;
252       s->SetSectorID(i);
253       s->SetDataSource(fData);
254
255       if(fDoubleSR)
256         s->SetDriftVel(2.273);
257       if(fSec2Ds[i] != 0)
258         s->CopyVizParams(*fSec2Ds[i]);
259
260       s->SetAutoTrans(kTRUE);
261       s->SetFrameColor(36);
262
263       gReve->AddRenderElement(this, s);
264     }
265   }
266   gReve->EnableRedraw();
267 }
268
269 void TPCLoader::DeleteSectors3D()
270 {
271   gReve->DisableRedraw();
272   for(Int_t i=0; i<=35; ++i) {
273     RenderElement* re = fSec3Ds[i];
274     if(re != 0) {
275       gReve->RemoveRenderElement(this, re);
276       // delete re; // Done automatically.
277       fSec3Ds[i] = 0;
278     }
279   }
280   gReve->EnableRedraw();
281 }
282
283 /**************************************************************************/
284
285 void TPCLoader::SetInitParams(Int_t mint, Int_t maxt, Int_t thr)
286 {
287   fSetInitSectorParams = kTRUE;
288   fInitMinTime   = mint;
289   fInitMaxTime   = maxt;
290   fInitThreshold = thr;
291 }