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