e0c6f9edc1858882d024ce602e04f531e37a9e23
[u/mrichter/AliRoot.git] / EVE / Alieve / MUONData.cxx
1 //
2 // Sources:
3 //
4 // GetTrackerMapping = AliMUONDigitMaker::GetMapping
5 // GetTriggerMapping = AliMUONDigitMaker::TriggerDigits
6 // GetTriggerChamber = AliMUONDigitMaker::GetTriggerChamber
7 // LoadRawTracker    = MUONRawStreamTracker.C
8 // LoadRawTrigger    = MUONRawStreamTrigger.C
9 //
10
11 #include "MUONData.h"
12
13 #include <Alieve/MUONChamberData.h>
14 #include <Alieve/EventAlieve.h>
15
16 #include <AliRawReader.h>
17 #include <AliRawReaderFile.h>
18 #include <AliRawReaderDate.h>
19 #include <AliRawReaderRoot.h>
20
21 #include <AliLog.h>
22
23 #include <AliMUONDigitMaker.h>
24 #include <AliMUONHit.h>
25 #include <AliMUONVCluster.h>
26 #include "AliMUONVClusterStore.h"
27 #include <AliMUONVDigit.h>
28 #include "AliMUONDigitStoreV1.h"
29 #include "AliMUONVDigitStore.h"
30 #include "TTree.h"
31 #include "TString.h"
32 #include "TClonesArray.h"
33 #include "TList.h"
34 using namespace Alieve;
35
36 //______________________________________________________________________
37 // MUONData
38 //
39
40 ClassImp(MUONData)
41
42 AliRawReader*            MUONData::fgRawReader        = 0;
43
44 //______________________________________________________________________
45 MUONData::MUONData() :
46   fChambers(14),
47   fNTrackList(0)
48 {
49   //
50   // Constructor
51   //
52   
53   for (Int_t i = 0; i < 256; i++) {
54     fTrackList[i] = -1;
55   }
56
57   CreateAllChambers();
58
59 }
60
61 //______________________________________________________________________
62 MUONData::~MUONData()
63 {
64   //
65   // Destructor
66   //
67
68   DeleteAllChambers();
69
70 }
71
72 //______________________________________________________________________
73 void MUONData::Reset()
74 {
75   //
76   // Reset data
77   //
78
79   //DropAllChambers();
80
81   fNTrackList = 0;
82   for (Int_t i = 0; i < 256; i++) {
83     fTrackList[i] = -1;
84   }
85
86 }
87
88 //______________________________________________________________________
89 MUONData::MUONData(const MUONData &mdata) :
90   TObject(mdata),
91   TEveRefCnt(),
92   fChambers(14),
93   fNTrackList(0)
94 {
95   //
96   // Copy constructor
97   //
98
99 }
100
101 //______________________________________________________________________
102 MUONData& MUONData::operator=(const MUONData &mdata)
103 {
104   //
105   // Assignment operator
106   //
107
108   if (this != &mdata) {
109
110   }
111
112   return *this;
113
114 }
115
116 //______________________________________________________________________
117 void MUONData::CreateChamber(Int_t chamber)
118 {
119   // 
120   // create data for the chamber with id=chamber (0 to 13)
121   //
122
123   if (fChambers[chamber] == 0)
124     fChambers[chamber] = new MUONChamberData(chamber);
125
126 }
127
128 //______________________________________________________________________
129 void MUONData::CreateAllChambers()
130 {
131   //
132   // create all 14 chambers data
133   //
134
135   for (Int_t c = 0; c < 14; ++c)
136     CreateChamber(c);
137
138 }
139
140 //______________________________________________________________________
141 void MUONData::DropAllChambers()
142 {
143   // 
144   // release data from all chambers 
145   //
146
147   for (Int_t c = 0; c < 14; ++c) {
148
149     if (fChambers[c] != 0)
150       fChambers[c]->DropData();
151
152   }
153
154 }
155
156 //______________________________________________________________________
157 void MUONData::DeleteAllChambers()
158 {
159   //
160   // delete all chambers data
161   //
162
163   for (Int_t c = 0; c < 14; ++c) {
164
165     delete fChambers[c];
166     fChambers[c] = 0;
167
168   }
169
170 }
171
172 //______________________________________________________________________
173 void MUONData::RegisterTrack(Int_t track)
174 {
175   //
176   // register (in a list) a track with hits in the chambers
177   //
178
179   if (fNTrackList == (256-1)) {
180     cout << "Maximum of registered tracks reached..." << endl;
181     return;
182   }
183
184   Bool_t inList = kFALSE;
185   for (Int_t i = 0; i < fNTrackList; i++) {
186     if (track == fTrackList[i]) {
187       inList = kTRUE;
188       break;
189     }
190   }
191   if (!inList) {
192     fTrackList[fNTrackList] = track;
193     fNTrackList++;
194   }
195
196 }
197
198 //______________________________________________________________________
199 void MUONData::LoadRecPoints(TTree* tree)
200 {
201   //
202   // load reconstructed points from the TreeR
203   // load local trigger information
204   //
205
206   AliMUONVClusterStore *clusterStore = AliMUONVClusterStore::Create(*tree);
207   clusterStore->Clear();
208   clusterStore->Connect(*tree,kFALSE);
209   
210   tree->GetEvent(0);
211   
212   AliMUONVCluster *cluster;
213   Int_t detElemId;
214   Double_t clsX, clsY, clsZ, charge;
215
216   for (Int_t ch = 0; ch < 10; ++ch) {
217
218     if (fChambers[ch] == 0) continue;
219     
220     TIter next(clusterStore->CreateChamberIterator(ch,ch));
221     
222     while ( ( cluster = static_cast<AliMUONVCluster*>(next()) ) ) {
223
224       detElemId = cluster->GetDetElemId();
225       
226       clsX   = cluster->GetX();
227       clsY   = cluster->GetY();
228       clsZ   = cluster->GetZ();
229       charge = cluster->GetCharge();
230
231       fChambers[ch]->RegisterCluster(detElemId,0,clsX,clsY,clsZ,charge);
232       fChambers[ch]->RegisterCluster(detElemId,1,clsX,clsY,clsZ,charge);
233
234     }
235
236   }
237
238   delete clusterStore;
239   
240 }
241
242 //______________________________________________________________________
243 void MUONData::LoadHits(TTree* tree)
244 {
245   //
246   // load simulation hits from the TreeH
247   //
248
249   TClonesArray *hits = 0;
250   AliMUONHit  *mhit;
251   Int_t cha, detElemId, nhits, ntracks;
252   Float_t hitX, hitY, hitZ;
253
254   ntracks = tree->GetEntries();
255   tree->SetBranchAddress("MUONHits",&hits);
256
257   for (Int_t it = 0; it < ntracks; it++) {
258
259     tree->GetEvent(it);
260     nhits = hits->GetEntriesFast();
261
262     for (Int_t ih = 0; ih < nhits; ih++) {
263
264       mhit = (AliMUONHit*)hits->UncheckedAt(ih);
265       hitX = mhit->X();
266       hitY = mhit->Y();
267       hitZ = mhit->Z();
268       detElemId = mhit->DetElemId();
269       cha = mhit->Chamber();
270
271       RegisterTrack(mhit->GetTrack());
272
273       fChambers[cha-1]->RegisterHit(detElemId,hitX,hitY,hitZ);
274
275     }
276   }
277
278 }
279
280 //______________________________________________________________________
281 void MUONData::LoadDigits(TTree* tree)
282 {
283   // 
284   // load digits from the TreeD
285   //
286
287   AliMUONVDigitStore *digitStore = AliMUONVDigitStore::Create(*tree);
288   digitStore->Clear();
289   digitStore->Connect(*tree,0);
290
291   tree->GetEvent(0);
292
293   AliMUONVDigit* digit;
294   TIter next(digitStore->CreateIterator());
295   
296   Int_t cathode, detElemId, ix, iy, charge, chamber, adc;
297   
298   while ( ( digit = static_cast<AliMUONVDigit*>(next() ) ) )
299     {
300       cathode   = digit->Cathode();
301       ix        = digit->PadX();
302       iy        = digit->PadY();
303       detElemId = digit->DetElemId();      
304       charge    = (Int_t)digit->Charge();
305       adc       = digit->ADC();
306       chamber   = detElemId/100 - 1;
307       if (chamber > 9) {
308         fChambers[chamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
309       } else {
310         fChambers[chamber]->RegisterDigit(detElemId,cathode,ix,iy,adc);
311       }
312     }
313     
314   delete digitStore;
315
316 }
317
318 //______________________________________________________________________
319 void MUONData::LoadRaw(TString fileName)
320 {
321   //
322   // load raw data from fileName; tracker and trigger data
323   //
324
325   if (fgRawReader == 0) {
326     // check extention to choose the rawdata file format
327     if (fileName.EndsWith("/")) {
328       fgRawReader = new AliRawReaderFile(fileName); // DDL files
329     } else if (fileName.EndsWith(".root")) {
330       fgRawReader = new AliRawReaderRoot(fileName); // ROOT file
331     } else if (!fileName.IsNull()) {
332       fgRawReader = new AliRawReaderDate(fileName); // DATE file
333     }
334   }
335   
336   fgRawReader->RewindEvents();
337   fgRawReader->Reset();
338
339   Int_t iEvent = 0;
340   while (fgRawReader->NextEvent()) 
341   {
342     if (iEvent != Alieve::gEvent->GetEventId()) 
343     {
344       iEvent++;
345       continue;
346     }
347     break;
348   }
349
350   AliMUONDigitMaker digitMaker;
351
352   digitMaker.SetMakeTriggerDigits(kTRUE);
353
354   AliMUONDigitStoreV1 digitStore;
355   
356   digitMaker.Raw2Digits(fgRawReader,&digitStore);
357
358   AliMUONVDigit* digit;
359   TIter next(digitStore.CreateIterator());
360   
361   Int_t cathode, detElemId, ix, iy, charge, chamber, adc;
362   
363   while ( ( digit = static_cast<AliMUONVDigit*>(next() ) ) )
364   {
365       cathode   = digit->Cathode();
366       ix        = digit->PadX();
367       iy        = digit->PadY();
368       detElemId = digit->DetElemId();      
369       charge    = (Int_t)digit->Charge();
370       adc       = digit->ADC();
371       chamber   = detElemId/100 - 1;
372       if (chamber > 9) {
373         fChambers[chamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
374       } else {
375         fChambers[chamber]->RegisterDigit(detElemId,cathode,ix,iy,adc);
376       }
377   }
378
379 }
380
381 //______________________________________________________________________
382 Int_t MUONData::GetTrack(Int_t index)
383 {
384   //
385   // return track stack number for "index"-th track with hits in the chambers
386   //
387
388   if (index < 256) {
389     return fTrackList[index];
390   } else {
391     return -1;
392   }
393
394 }
395
396 //______________________________________________________________________
397 MUONChamberData* MUONData::GetChamberData(Int_t chamber)
398 {
399   //
400   // return chamber data
401   //
402
403   if (chamber < 0 || chamber > 13) return 0;
404
405   //if (fChambers[chamber] == 0) CreateChamber(chamber);
406
407   return fChambers[chamber];
408
409 }