]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFRawStream.cxx
Deleting Objects in a proper way. Minor improvements added.
[u/mrichter/AliRoot.git] / TOF / AliTOFRawStream.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.19  2007/05/18 13:07:53  decaro
19 Error messages stored in the global raw-reader error log (Cvetan, Chiara)
20
21 Revision 1.18  2007/05/08 11:53:29  arcelli
22 Improved class flexibility for further use (R.Preghenella)
23
24 Revision 1.17  2007/05/03 08:53:50  decaro
25 Coding convention: RS3 violation -> suppression
26
27 Revision 1.16  2007/05/03 08:22:22  decaro
28 Coding convention: RN17 violation -> suppression
29
30 Revision 1.15  2007/04/30 15:22:06  arcelli
31 Change TOF digit Time, Tot etc to int type
32
33 Revision 1.14  2007/04/27 11:11:53  arcelli
34 updates for the new decoder
35
36 Revision 1.13  2007/03/16 11:46:35  decaro
37 Coding convention: RN17 rule violation -> suppression
38
39 Revision 1.12  2007/02/22 09:43:45  decaro
40 Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
41
42 Revision 1.11  2007/02/20 15:57:00  decaro
43 Raw data update: to read the TOF raw data defined in UNPACKED mode
44
45 Revision 1.10  2006/12/15 14:01:38  cvetan
46 Memory leak fixed
47
48 Revision 1.9  2006/10/13 11:22:27  arcelli
49 remove warnings due to uninitialized AliTOFtdcDigit data members
50
51 Revision 1.8  2006/08/22 13:30:17  arcelli
52 removal of effective c++ warnings (C.Zampolli)
53
54 Revision 1.7  2006/08/10 14:46:54  decaro
55 TOF raw data format: updated version
56
57 Revision 1.6.1  2006/06/28 A. De Caro, R. Preghenella:
58         Update TOF raw data format
59         according to the final version
60         (see the ALICE internal note in preparation
61          'ALICE TOF raw data format')
62         Added the methods for the correspoonding numbering
63          between the equipment IDs and the volume IDs:
64            Equip2VolNPlate(...)
65            Equip2VolNStrip(...)
66            Equip2VolNPad(...)
67
68 Revision 0.02  2005/07/28 A. De Caro:
69         Update format TOF raw data
70                (temporary solution) 
71         Correction of few wrong corrispondences
72                between 'software' and 'hardware' numberings
73
74 Revision 0.01  2005/07/22 A. De Caro
75         Implement methods Next()
76                           GetSector(),
77                           GetPlate(),
78                           GetStrip(),
79                           GetPadZ(),
80                           GetPadX()
81 */
82
83 ////////////////////////////////////////////////////////////////////////
84 //                                                                    //
85 //     This class provides access to TOF raw data in DDL files.       //
86 //                                                                    //
87 //      It loops over all TOF raw data given by the AliRawReader.     //
88 //                                                                    //
89 ////////////////////////////////////////////////////////////////////////
90
91
92 #include "Riostream.h"
93
94 #include "TClonesArray.h"
95
96 #include "AliDAQ.h"
97 #include "AliLog.h"
98 #include "AliRawReader.h"
99
100 #include "AliTOFGeometry.h"
101 #include "AliTOFrawData.h"
102 #include "AliTOFRawMap.h"
103 #include "AliTOFRawStream.h"
104
105 #include "AliTOFHitData.h"
106
107 ClassImp(AliTOFRawStream)
108
109
110 //_____________________________________________________________________________
111 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
112   fRawReader(rawReader),
113   fTOFrawData(0x0),
114   fDecoder(new AliTOFDecoder()),
115   fDDL(-1),
116   fTRM(-1),
117   fTRMchain(-1),
118   fTDC(-1),
119   fTDCchannel(-1),
120   fTime(-1),
121   fToT(-1),
122   fLeadingEdge(-1),
123   fTrailingEdge(-1),
124   fErrorFlag(-1),
125   fSector(-1),
126   fPlate(-1),
127   fStrip(-1),
128   fPadX(-1),
129   fPadZ(-1),
130   fPackedDigits(0),
131   fWordType(-1),
132   fSlotID(-1),
133   fACQ(-1),
134   fPSbit(-1),
135   fTDCerrorFlag(-1),
136   fInsideDRM(kFALSE),
137   fInsideTRM(kFALSE),
138   fInsideLTM(kFALSE),
139   fInsideTRMchain0(kFALSE),
140   fInsideTRMchain1(kFALSE),
141   fLocalEventCounterDRM(-1),
142   fLocalEventCounterLTM(-1),
143   fLocalEventCounterTRM(0x0),
144   fLocalEventCounterChain(0x0)
145 {
146   //
147   // create an object to read TOF raw digits
148   //
149
150   for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
151     fDataBuffer[i]=new AliTOFHitDataBuffer();
152     fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
153   }
154
155   fTOFrawData = new TClonesArray("AliTOFrawData",1000);
156   fTOFrawData->SetOwner();
157
158   fRawReader->Reset();
159   fRawReader->Select("TOF");
160
161   fLocalEventCounterTRM = new Int_t[13];//adc
162   fLocalEventCounterChain = new Int_t*[13];//adc
163   for (Int_t j=0;j<13;j++){//adc
164     fLocalEventCounterTRM[j] = -1;//adc
165     fLocalEventCounterChain[j] = new Int_t[2];//adc
166     for (Int_t k=0;k<2;k++){//adc
167       fLocalEventCounterChain[j][k] = -1;//adc
168     }//adc
169   }//adc
170
171 }
172
173 //_____________________________________________________________________________
174 AliTOFRawStream::AliTOFRawStream():
175   fRawReader(0x0), 
176   fTOFrawData(0x0),
177   fDecoder(new AliTOFDecoder()),
178   fDDL(-1),
179   fTRM(-1),
180   fTRMchain(-1),
181   fTDC(-1),
182   fTDCchannel(-1),
183   fTime(-1),
184   fToT(-1),
185   fLeadingEdge(-1),
186   fTrailingEdge(-1),
187   fErrorFlag(-1),
188   fSector(-1),
189   fPlate(-1),
190   fStrip(-1),
191   fPadX(-1),
192   fPadZ(-1),
193   fPackedDigits(0),
194   fWordType(-1),
195   fSlotID(-1),
196   fACQ(-1),
197   fPSbit(-1),
198   fTDCerrorFlag(-1),
199   fInsideDRM(kFALSE),
200   fInsideTRM(kFALSE),
201   fInsideLTM(kFALSE),
202   fInsideTRMchain0(kFALSE),
203   fInsideTRMchain1(kFALSE),
204   fLocalEventCounterDRM(-1),
205   fLocalEventCounterLTM(-1),
206   fLocalEventCounterTRM(0x0),
207   fLocalEventCounterChain(0x0)
208 {
209   //
210   // default ctr
211   //
212   for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
213     fDataBuffer[i]=new AliTOFHitDataBuffer();
214     fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
215   }
216
217   fTOFrawData = new TClonesArray("AliTOFrawData",1000);
218   fTOFrawData->SetOwner();
219
220   fLocalEventCounterTRM = new Int_t[13];//adc
221   fLocalEventCounterChain = new Int_t*[13];//adc
222   for (Int_t j=0;j<13;j++){//adc
223     fLocalEventCounterTRM[j] = -1;//adc
224     fLocalEventCounterChain[j] = new Int_t[2];//adc
225     for (Int_t k=0;k<2;k++){//adc
226       fLocalEventCounterChain[j][k] = -1;//adc
227     }//adc
228   }//adc
229
230 }
231
232 //_____________________________________________________________________________
233 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
234   TObject(stream),
235   fRawReader(0x0),
236   fTOFrawData(0x0),
237   fDecoder(new AliTOFDecoder()),
238   fDDL(-1),
239   fTRM(-1),
240   fTRMchain(-1),
241   fTDC(-1),
242   fTDCchannel(-1),
243   fTime(-1),
244   fToT(-1),
245   fLeadingEdge(-1),
246   fTrailingEdge(-1),
247   fErrorFlag(-1),
248   fSector(-1),
249   fPlate(-1),
250   fStrip(-1),
251   fPadX(-1),
252   fPadZ(-1),
253   fPackedDigits(0),
254   fWordType(-1),
255   fSlotID(-1),
256   fACQ(-1),
257   fPSbit(-1),
258   fTDCerrorFlag(-1),
259   fInsideDRM(kFALSE),
260   fInsideTRM(kFALSE),
261   fInsideLTM(kFALSE),
262   fInsideTRMchain0(kFALSE),
263   fInsideTRMchain1(kFALSE),
264   fLocalEventCounterDRM(-1),
265   fLocalEventCounterLTM(-1),
266   fLocalEventCounterTRM(0x0),
267   fLocalEventCounterChain(0x0)
268 {
269   //
270   // copy constructor
271   //
272
273   fRawReader = stream.fRawReader;
274
275   fTOFrawData = stream.fTOFrawData;
276
277   fDDL = stream.fDDL;
278   fTRM = stream.fTRM;
279   fTRMchain = stream.fTRMchain;
280   fTDC = stream.fTDC;
281   fTDCchannel = stream.fTDCchannel;
282   fTime = stream.fTime;
283   fToT = stream.fToT;
284   fLeadingEdge = stream.fLeadingEdge;
285   fTrailingEdge = stream.fTrailingEdge;
286
287   fErrorFlag = stream.fErrorFlag;
288
289   fSector = stream.fSector;
290   fPlate = stream.fPlate;
291   fStrip = stream.fStrip;
292   fPadX = stream.fPadX;
293   fPadZ = stream.fPadZ;
294
295   fPackedDigits = stream.fPackedDigits;
296
297   fWordType = stream.fWordType;
298   fSlotID = stream.fSlotID;
299   fACQ = stream.fACQ;
300   fPSbit = stream.fPSbit;
301   fTDCerrorFlag = stream.fTDCerrorFlag;
302   fInsideDRM = stream.fInsideDRM;
303   fInsideTRM = stream.fInsideTRM;
304   fInsideLTM = stream.fInsideLTM;
305   fInsideTRMchain0 = stream.fInsideTRMchain0;
306   fInsideTRMchain1 = stream.fInsideTRMchain1;
307
308   for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
309     fDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fDataBuffer[i]);
310     fPackedDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fPackedDataBuffer[i]);
311   }
312
313   fTOFrawData = new TClonesArray(*stream.fTOFrawData);
314
315   fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
316   fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
317   for (Int_t j=0;j<13;j++){//adc
318     fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
319     for (Int_t k=0;k<2;k++){//adc
320       fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
321     }//adc
322   }//adc
323
324 }
325
326 //_____________________________________________________________________________
327 AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
328 {
329   //
330   // assignment operator
331   //
332
333   fRawReader = stream.fRawReader;
334
335   fTOFrawData = stream.fTOFrawData;
336
337   fDDL = stream.fDDL;
338   fTRM = stream.fTRM;
339   fTRMchain = stream.fTRMchain;
340   fTDC = stream.fTDC;
341   fTDCchannel = stream.fTDCchannel;
342   fTime = stream.fTime;
343   fToT = stream.fToT;
344   fLeadingEdge = stream.fLeadingEdge;
345   fTrailingEdge = stream.fTrailingEdge;
346   fErrorFlag = stream.fErrorFlag;
347
348   fSector = stream.fSector;
349   fPlate = stream.fPlate;
350   fStrip = stream.fStrip;
351   fPadX = stream.fPadX;
352   fPadZ = stream.fPadZ;
353
354   fPackedDigits = stream.fPackedDigits;
355
356   fWordType = stream.fWordType;
357   fSlotID = stream.fSlotID;
358   fACQ = stream.fACQ;
359   fPSbit = stream.fPSbit;
360   fTDCerrorFlag = stream.fTDCerrorFlag;
361   fInsideDRM = stream.fInsideDRM;
362   fInsideTRM = stream.fInsideTRM;
363   fInsideLTM = stream.fInsideLTM;
364   fInsideTRMchain0 = stream.fInsideTRMchain0;
365   fInsideTRMchain1 = stream.fInsideTRMchain1;
366   
367   for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){ 
368     fDataBuffer[i] = stream.fDataBuffer[i];
369     fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
370   }
371   
372   fTOFrawData = stream.fTOFrawData;
373
374   fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
375   fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
376   for (Int_t j=0;j<13;j++){//adc
377     fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
378     for (Int_t k=0;k<2;k++){//adc
379       fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
380     }//adc
381   }//adc
382
383   return *this;
384
385 }
386
387 //_____________________________________________________________________________
388 AliTOFRawStream::~AliTOFRawStream()
389 {
390 // destructor
391
392   fPackedDigits = 0;
393
394   for (Int_t i=0;i<72;i++){ 
395     delete fDataBuffer[i];
396     delete fPackedDataBuffer[i];
397   }
398
399   delete fDecoder;
400
401   fTOFrawData->Clear();
402   delete fTOFrawData;
403
404   delete [] fLocalEventCounterTRM;
405   for (Int_t ii=0; ii<13; ii++) 
406           delete [] fLocalEventCounterChain[ii];
407   delete [] fLocalEventCounterChain;
408
409 }
410
411
412 //_____________________________________________________________________________
413
414 void AliTOFRawStream::LoadRawData(Int_t indexDDL)
415 {
416   //
417   // To load raw data
418   //
419
420   fTOFrawData->Clear();
421
422   TClonesArray &arrayTofRawData =  *fTOFrawData;
423
424   fPackedDigits = 0;
425
426   // create raw data map
427   AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
428   rawMap->Clear();
429
430   Int_t slot[4] = {-1, -1, -1, -1};
431
432   fLocalEventCounterDRM = -1;
433   fLocalEventCounterLTM = -1;
434   for (Int_t ii=0; ii<13; ii++)
435     fLocalEventCounterTRM[ii] = -1;
436   for (Int_t ii=0; ii<13; ii++)
437     for (Int_t jj=0; jj<2; jj++)
438       fLocalEventCounterChain[ii][jj] = -1;
439
440   fRawReader->Reset();
441   fRawReader->Select("TOF", indexDDL, indexDDL);
442     
443   Bool_t signal = kFALSE;
444
445   AliTOFrawData *rawDigit = NULL;
446
447   while(Next()) {
448
449     signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
450     if (signal) {
451       AliDebug(2,Form("  %2i  %1i  %2i  %1i  %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
452
453       slot[0] = fTRM;
454       slot[1] = fTRMchain;
455       slot[2] = fTDC;
456       slot[3] = fTDCchannel;
457
458       if (rawMap->TestHit(slot) != kEmpty) {
459
460         rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
461
462         if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
463             fLeadingEdge==-1 && fTrailingEdge!=-1) {
464
465           rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
466         }
467         else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
468                    (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
469
470                   )
471           {
472
473             new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
474
475             rawMap->SetHit(slot);
476
477           }
478
479
480       }
481       else {
482
483         new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
484
485         rawMap->SetHit(slot);
486
487       } // else if (rawMap->TestHit(slot) == kEmpty)
488
489     } // if (signal)
490
491   } // closed -> while (Next())
492
493   rawMap->Delete();
494
495 }
496
497 //_____________________________________________________________________________
498 Bool_t AliTOFRawStream::Next()
499 {
500   //
501   // Read next 32-bit word in TOF raw data files
502   // returns kFALSE if there is no word left
503   //
504
505   UInt_t data;
506
507   Int_t dummy = 0;
508
509   if (!fRawReader->ReadNextInt(data)) return kFALSE;
510
511   if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
512     fSector = -1;
513     fPlate  = -1;
514     fStrip  = -1;
515     fPadZ   = -1;
516     fPadX   = -1;
517     fTime   = -1;
518     fToT    = -1;
519     fLeadingEdge  = -1;
520     fTrailingEdge = -1;
521   }
522
523   fDDL  = fRawReader->GetDDLID();
524
525   fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
526
527   switch (fWordType) { // switch word type
528
529   case GLOBAL_HEADER_TYPE: // global header
530     fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
531     fTRM = fSlotID;
532
533
534     switch (fSlotID) { // switch global header slot ID
535
536     case DRM_ID_NUMBER: //DRM global header
537       if (fInsideDRM) { // unexpected DRM global headers -> exit
538         break;
539       }
540       fInsideDRM = kTRUE; // DRM global header accepted
541       break;
542
543     case LTM_ID_NUMBER: // LTM global header
544       if (fInsideLTM) { // unexpected LTM global headers -> exit
545         break;
546       }
547       fInsideLTM = kTRUE; // LTM global header accepted
548       break;
549
550     case  3: //TRM header
551     case  4: //TRM header
552     case  5: //TRM header
553     case  6: //TRM header
554     case  7: //TRM header
555     case  8: //TRM header
556     case  9: //TRM header
557     case 10: //TRM header
558     case 11: //TRM header
559     case 12: //TRM header
560       if (fInsideTRM) { // unexpected TRM global headers -> exit
561         break;
562       }
563       fInsideTRM = kTRUE; // TRM global header accepted
564       fACQ =  GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
565       break;
566
567     default: // unexpected global header slot ID
568       break;
569
570     } //end switch global header slot id
571
572     break;
573
574
575   case GLOBAL_TRAILER_TYPE: // global trailer
576     fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
577
578     switch (fSlotID) { // switch global trailer slot ID
579
580     case DRM_ID_NUMBER: // DRM global trailer
581       if (!fInsideDRM) { // unexpected DRM global trailers -> exit
582         break;
583       }
584       dummy = 0x0000fff0;
585       //AliInfo(Form("  DRM local event counter = %i", GetField(data,dummy,4)));
586       fLocalEventCounterDRM = GetField(data,dummy,4);//adc
587       fInsideDRM = kFALSE; // DRM global trailer accepted
588       fInsideTRM = kFALSE;
589       fInsideLTM = kFALSE;
590       fInsideTRMchain0 = kFALSE;
591       fInsideTRMchain1 = kFALSE;
592       fSector = -1;
593       fPlate  = -1;
594       fStrip  = -1;
595       fPadZ   = -1;
596       fPadX   = -1;
597       fDDL        = -1;
598       fTRM        = -1;
599       fTDC        = -1;
600       fTRMchain   = -1;
601       fTDCchannel = -1;
602       fTime = -1;
603       fToT  = -1;
604       fLeadingEdge  = -1;
605       fTrailingEdge = -1;
606       fErrorFlag = -1;
607       fACQ   = -1;
608       fPSbit = -1;
609       fTDCerrorFlag = -1;
610       break;
611     case LTM_ID_NUMBER: // LTM global trailer
612       if (!fInsideLTM) { // unexpected LTM global trailer -> exit
613         break;
614       }
615       dummy = 0x0fff0000;
616       //AliInfo(Form("  LTM local event counter = %i", GetField(data,dummy,16)));
617       fLocalEventCounterLTM = GetField(data,dummy,16);//adc
618       fInsideLTM = kFALSE; // LTM global trailer accepted
619       break;
620     case 15: //TRM global trailer
621       if (!fInsideTRM) { // unexpected TRM global trailers -> exit
622         break;
623       }
624       dummy = 0x0fff0000;
625       //AliInfo(Form("  TRM local event counter = %i", GetField(data,dummy,16)));
626       fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);//adc
627       fInsideTRM = kFALSE; // TRM global trailer accepted
628       break;
629     default: // unexpected global trailer slot ID
630       break;
631     } //end switch global trailer slot id
632
633
634     break;
635
636
637   case ERROR_TYPE: // TDC error
638     fTDC          = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
639     fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
640     break;
641
642
643   case FILLER_TYPE: // filler
644     break;
645
646
647   default: // other word types
648
649     if (fInsideTRM) { // inside TRM
650
651       switch (fWordType) { // switch word type inside TRM
652       case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
653         if (fInsideTRMchain0) { // unexpected TRM chain0 header
654           break;
655         }
656         fInsideTRMchain0 = kTRUE;
657         fTRMchain = 0;
658         break;
659       case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
660         if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
661           break;
662         }
663         dummy = 0x0fff0000;
664         //AliInfo(Form("  chain local event counter = %i", GetField(data,dummy,16)));
665         fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
666         fInsideTRMchain0 = kFALSE;
667         fTRMchain = -1;
668         break;
669       case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
670         if (fInsideTRMchain1) { // unexpected TRM chain1 header
671           break;
672         }
673         fInsideTRMchain1 = kTRUE;
674         fTRMchain = 1;
675         break;
676       case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
677         if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
678           break;
679         }
680         dummy = 0x0fff0000;
681         //AliInfo(Form("  chain local event counter = %i", GetField(data,dummy,16)));
682         fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
683         fInsideTRMchain1 = kFALSE;
684         fTRMchain = -1;
685         break;
686       } // end switch word type inside TRM
687
688     } // end if (fInsideTRM)
689
690       
691     if (
692         ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1)) 
693         && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
694         && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
695         ){ // inside TRM chains
696
697       fPSbit      = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
698       fTDC        = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
699       fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
700       fErrorFlag  = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
701
702       SetSector();
703       SetPlate();
704       SetStrip();
705       SetPadZ();
706       SetPadX();
707
708
709       switch (fPSbit) { // switch fPSbit bits inside TRM chains
710
711       case 0: // packing ok, digit time and TOT
712         fToT  = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
713         fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
714         break;
715
716       case 1: // leading edge digit, long digit time, no TOT
717         //fToT  = -1;
718         //fTime  = -1;
719         fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
720         break;
721
722       case 2: // trailing edge digit, long digit time, no TOT
723         //fToT  = -1;
724         //fTime  = -1;
725         fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
726         break;
727
728       case 3: // TOT overflow
729         fToT  = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
730         fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
731         break;
732
733       } // end switch PS bits inside TRM chains
734
735     } // end if is inside TRM chains
736
737   } // end switch on fWordType
738
739
740   return kTRUE;
741   
742 }
743 //_____________________________________________________________________________
744
745 void AliTOFRawStream::SetSector()
746 {
747   //
748   // Evaluate the TOF sector number -> [ 0;17]
749   // corresponding to the TOF equipment IDs:
750   //                                  fDDL        -> [ 0;71]
751   //                                  fTRM        -> [ 3;12]
752   //                                  fTRMchain   -> [ 0; 1]
753   //                                  fTDC        -> [ 0;14]
754   //                                  fTDCchannel -> [ 0; 7]
755   //
756
757   Int_t iSector = -1;
758
759   if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
760
761   fSector = iSector;
762
763 }
764 //_____________________________________________________________________________
765
766
767 void AliTOFRawStream::SetPlate()
768 {
769   //
770   // Evaluate the TOF plate number ->[ 0; 4]
771   // corresponding to the TOF equipment IDs:
772   //                                  fDDL        -> [ 0;71]
773   //                                  fTRM        -> [ 3;12]
774   //                                  fTRMchain   -> [ 0; 1]
775   //                                  fTDC        -> [ 0;14]
776   //                                  fTDCchannel -> [ 0; 7]
777   //
778
779   Int_t iPlate = -1;
780   if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
781         || fSector==-1))
782     iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
783
784   fPlate = iPlate;
785
786 }
787 //_____________________________________________________________________________
788
789 void AliTOFRawStream::SetStrip()
790 {
791   //
792   // Evaluate the TOF strip number per module -> [ 0; 14/18]
793   // corresponding to the TOF equipment IDs:
794   //                                  fDDL        -> [ 0;71]
795   //                                  fTRM        -> [ 3;12]
796   //                                  fTRMchain   -> [ 0; 1]
797   //                                  fTDC        -> [ 0;14]
798   //                                  fTDCchannel -> [ 0; 7]
799   //
800
801   Int_t iStrip = -1;
802
803   if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
804         || fSector==-1 || fPlate==-1))
805     iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
806
807   fStrip = iStrip;
808
809 }
810 //_____________________________________________________________________________
811
812 void AliTOFRawStream::SetPadZ()
813 {
814   //
815   // Evaluate the TOF padRow number per strip -> [ 0; 1]
816   // corresponding to the TOF equipment IDs:
817   //                                  fDDL        -> [ 0;71]
818   //                                  fTRM        -> [ 3;12]
819   //                                  fTRMchain   -> [ 0; 1]
820   //                                  fTDC        -> [ 0;14]
821   //                                  fTDCchannel -> [ 0; 7]
822   //
823
824   Int_t iPadZ = -1;
825
826   if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
827         || fSector==-1 || fPlate==-1 || fStrip==-1))
828     {
829       Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
830       if (iPadAlongTheStrip!=-1)
831         iPadZ  = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
832     }
833
834   //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
835   //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
836
837   fPadZ = iPadZ;
838
839 }
840 //_____________________________________________________________________________
841
842 void AliTOFRawStream::SetPadX()
843 {
844   //
845   // Evaluate the TOF pad number per strip padRow -> [ 0;47]
846   // corresponding to the TOF equipment IDs:
847   //                                  fDDL        -> [ 0;71]
848   //                                  fTRM        -> [ 3;12]
849   //                                  fTRMchain   -> [ 0; 1]
850   //                                  fTDC        -> [ 0;14]
851   //                                  fTDCchannel -> [ 0; 7]
852   //
853
854   Int_t iPadX = -1;
855
856   if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
857         || fSector==-1 || fPlate==-1 || fStrip==-1))
858     {
859       Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
860       if (iPadAlongTheStrip!=-1)
861         iPadX  = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
862     }
863
864   //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
865   //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
866
867   fPadX = iPadX;
868
869 }
870
871 //----------------------------------------------------------------------------
872 Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
873 {
874   // 
875   // 
876   // 
877
878   return ((word & fieldMask) >> fieldPosition);
879 }
880
881 //----------------------------------------------------------------------------
882 Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
883 {
884   //
885   // Returns the TOF plate number [0;4]
886   // corresponding to the TOF equipment ID numbers:
887   //                          iDDL -> DDL number per sector [0;3]
888   //                          nTRM -> TRM number [3;12]
889   //                          nTDC -> TDC number [0;14]
890   //
891
892   Int_t iPlate = -1;
893   if (iDDL==0) {
894
895     if (nTRM>=4 && nTRM<7) {
896       iPlate = 0;
897     } else if (nTRM==7) {
898       if (nTDC<12) iPlate = 0;
899       else iPlate = 1;
900     } else if (nTRM>=8 && nTRM<11) {
901       iPlate = 1;
902     } else if (nTRM==11) {
903       if (nTDC<9) iPlate = 1;
904       else iPlate = 2;
905     }else if (nTRM==12) {
906       iPlate = 2;
907     } 
908
909   } else if (iDDL==1) {
910
911     if (nTRM==3) {
912       if (nTDC<3) iPlate = 0;
913     } else if (nTRM>=4 && nTRM<7) {
914       iPlate = 0;
915     } else if (nTRM==7) {
916       if (nTDC<6) iPlate = 1;
917       else iPlate = 0;
918     } else if (nTRM>=8 && nTRM<11) {
919       iPlate = 1;
920     } else if (nTRM==11) {
921       if (nTDC<9) iPlate = 2;
922       else iPlate = 1;
923     } else if (nTRM==12) {
924       iPlate = 2;
925     } 
926
927   } else if (iDDL==2) {
928
929     if (nTRM>=4 && nTRM<7) {
930       iPlate = 4;
931     } else if (nTRM==7) {
932       if (nTDC<12) iPlate = 4;
933       else iPlate = 3;
934     } else if (nTRM>=8 && nTRM<11) {
935       iPlate = 3;
936     } else if (nTRM==11) {
937       if (nTDC<9) iPlate = 3;
938       else iPlate = 2;
939     }else if (nTRM==12) {
940       iPlate = 2;
941     } 
942
943   }  else if (iDDL==3) {
944
945     if (nTRM==3) {
946       if (nTDC<3) iPlate = 4;
947     } else if (nTRM>=4 && nTRM<7) {
948       iPlate = 4;
949     } else if (nTRM==7) {
950       if (nTDC<6) iPlate = 3;
951       else iPlate = 4;
952     } else if (nTRM>=8 && nTRM<11) {
953       iPlate = 3;
954     } else if (nTRM==11) {
955       if (nTDC<9) iPlate = 2;
956       else iPlate = 3;
957     } else if (nTRM==12) {
958       iPlate = 2;
959     } 
960
961   }
962
963   return iPlate;
964
965 }
966
967 //----------------------------------------------------------------------------
968 Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
969 {
970   //
971   // Returns the TOF strip number per module:
972   //                                [0;14], in the central plates,
973   //                                [0;18], in the intermediate and external plates
974   // corresponding to the TOF equipment ID numbers:
975   //                                iDDL -> DDL number per sector [0;3]
976   //                                nTRM -> TRM number [3;12]
977   //                                nTDC -> TDC number [0;14]
978   //
979
980   Int_t iStrip = -1;
981
982   if (iDDL==0) {
983
984     if (nTRM== 4) iStrip =  (Int_t)(nTDC/3.);
985     else if (nTRM== 5) iStrip =  5 + (Int_t)(nTDC/3.);
986     else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
987     else if (nTRM== 7) {
988       if (nTDC<12) iStrip =  15 + (Int_t)(nTDC/3.);
989       else iStrip = (Int_t)(nTDC/3.) -  4;
990     }
991     else if (nTRM== 8) iStrip =  1 + (Int_t)(nTDC/3.);
992     else if (nTRM== 9) iStrip =  6 + (Int_t)(nTDC/3.);
993     else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
994     else if (nTRM==11) {
995       if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
996       else iStrip = (Int_t)(nTDC/3.) -  3;
997     }
998     else if (nTRM==12) iStrip =  2 + (Int_t)(nTDC/3.);
999
1000   } else if (iDDL==1) {
1001
1002     if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1003     else if (nTRM== 4) iStrip =  5 - (Int_t)(nTDC/3.);
1004     else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1005     else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1006     else if (nTRM== 7) {
1007       if (nTDC<6) iStrip =  1 - (Int_t)(nTDC/3.);
1008       else iStrip = 20 - (Int_t)(nTDC/3.);
1009     }
1010     else if (nTRM== 8) iStrip =  6 - (Int_t)(nTDC/3.);
1011     else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1012     else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1013     else if (nTRM==11) {
1014       if (nTDC<9) iStrip =  2 - (Int_t)(nTDC/3.);
1015       else iStrip = 21 - (Int_t)(nTDC/3.);
1016     }
1017     else if (nTRM==12) iStrip =  7 - (Int_t)(nTDC/3.);
1018
1019   } else if (iDDL==2) {
1020
1021     if (nTRM== 4) iStrip =  18 - (Int_t)(nTDC/3.);
1022     else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1023     else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1024     else if (nTRM== 7) {
1025       if (nTDC<12) iStrip =  18 - (15 + (Int_t)(nTDC/3.));
1026       else iStrip = 18 - ((Int_t)(nTDC/3.) -  4);
1027     }
1028     else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1029     else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1030     else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1031     else if (nTRM==11) {
1032       if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1033       else iStrip = 14 - ((Int_t)(nTDC/3.) -  3);
1034     }
1035     else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1036
1037   } else if (iDDL==3) {
1038
1039     if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1040     else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1041     else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1042     else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1043     else if (nTRM== 7) {
1044       if (nTDC<6) iStrip =  18 - (1 - (Int_t)(nTDC/3.));
1045       else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1046     }
1047     else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1048     else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1049     else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1050     else if (nTRM==11) {
1051       if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1052       else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1053     }
1054     else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1055
1056   } 
1057
1058   return iStrip;
1059
1060 }
1061
1062 //----------------------------------------------------------------------------
1063 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
1064                                      Int_t iCH)
1065 {
1066   //
1067   // Returns the TOF pad number per strip [0;95]
1068   // corresponding to the TOF equipment ID numbers:
1069   //                          iDDL -> DDL number per sector [0;3]
1070   //                        iChain -> TRM chain number [0;1]
1071   //                          nTDC -> TDC number [0;14]
1072   //                           iCH -> TDC channel number [0;7]
1073   //
1074
1075   Int_t iPadAlongTheStrip = -1;
1076
1077   // wrong
1078   //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1079   //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1080   //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
1081
1082   // right
1083   Int_t iTDClocal = -1;
1084   Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1085   Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1086   if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1087   else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
1088
1089   Int_t iCHlocal = iCH;
1090   if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1091
1092   iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1093
1094   if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1095       ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1096     std::cerr << "Problems with the padX number!" << endl;
1097     //AliWarning("Problems with the padX number!");
1098   }
1099   return iPadAlongTheStrip;
1100
1101 }
1102
1103 //----------------------------------------------------------------------------
1104 Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1105                                       Int_t iCH)
1106 {
1107   //
1108   // Returns the TOF padX number [0;47]
1109   // corresponding to the TOF equipment ID numbers:
1110   //                          iDDL -> DDL number per sector [0;3]
1111   //                        iChain -> TRM chain number [0;1]
1112   //                          nTDC -> TDC number [0;14]
1113   //                           iCH -> TDC channel number [0;7]
1114   //
1115
1116   Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1117                         (Float_t(AliTOFGeometry::NpadZ())));
1118
1119   return iPadX;
1120
1121 }
1122
1123 //----------------------------------------------------------------------------
1124 Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1125                                       Int_t iCH)
1126 {
1127   //
1128   // Returns the TOF padZ number [0;1]
1129   // corresponding to the TOF equipment ID numbers:
1130   //                          iDDL -> DDL number per sector [0;3]
1131   //                        iChain -> TRM chain number [0;1]
1132   //                          nTDC -> TDC number [0;14]
1133   //                           iCH -> TDC channel number [0;7]
1134   //
1135
1136   Int_t iPadZ  = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1137
1138   return iPadZ;
1139
1140 }
1141
1142 //----------------------------------------------------------------------------
1143 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const
1144 {
1145   //
1146   // Returns the sector number [0;17]
1147   // corresponing to the assigned DRM/DDL number [0;71]
1148   //
1149
1150   Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1151
1152   return iSector;
1153
1154 }
1155 //----------------------------------------------------------------------------
1156 Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const
1157 {
1158   //
1159   // Return the DRM/DDL number per sector [0;3]
1160   // corresponing to the assigned DRM/DDL number [0;71]
1161   //
1162
1163   Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1164
1165   return iDDL;
1166
1167 }
1168
1169 //----------------------------------------------------------------------------
1170 void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1171 {
1172   EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1173 }
1174 //----------------------------------------------------------------------------
1175 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1176                                         Int_t nTDC, Int_t iCH,
1177                                         Int_t *volume) const
1178 {
1179   //
1180   // To convert:
1181   //            nDDL   (variable in [0;71]) -> number of the DDL file 
1182   //            nTRM   (variable in [3;12]) -> number of the TRM slot
1183   //            iChain (variable in [0; 1]) -> number of the TRM chain
1184   //            nTDC   (variable in [0;14]) -> number of the TDC
1185   //            iCH    (variable in [0; 7]) -> number of the TDC channel
1186   //
1187   // in:
1188   //      sector number, i.e. volume[0] (variable in [0,17])
1189   //      plate  number, i.e. volume[1] (variable in [0, 5])
1190   //      strip  number, i.e. volume[2] (variable in [0,14/18])
1191   //      padX   number, i.e. volume[3] (variable in [0,47])
1192   //      padZ   number, i.e. volume[4] (variable in [0, 1])
1193   //
1194
1195   Int_t iDDL = GetDDLnumberPerSector(nDDL);
1196
1197   Int_t iSector = GetSectorNumber(nDDL);
1198
1199   Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1200   if (iPlate==-1) {
1201     if (fRawReader)
1202       fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
1203     AliWarning("Problems with the plate number!");
1204   }
1205
1206   Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1207   if (iStrip==-1) {
1208     if (fRawReader)
1209       fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
1210     AliWarning("Problems with the strip number!");
1211   }
1212
1213   Int_t iPadAlongTheStrip  = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1214   if (iPadAlongTheStrip==-1){
1215     if (fRawReader)
1216       fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
1217     AliWarning("Problems with the pad number along the strip!");
1218   }
1219   
1220   Int_t iPadX  = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1221   Int_t iPadZ  = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1222
1223   //Int_t iPadX  = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1224   //Int_t iPadZ  = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1225
1226   //Int_t iPadX  = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1227   //Int_t iPadZ  = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1228
1229   volume[0] = iSector;
1230   volume[1] = iPlate;
1231   volume[2] = iStrip;
1232   volume[3] = iPadX;
1233   volume[4] = iPadZ;
1234
1235 }
1236 //-----------------------------------------------------------------------------
1237 Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1238   //
1239   // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1240   //
1241
1242   //check and fix valid DDL range
1243   if (nDDLMin < 0){
1244     nDDLMin = 0;
1245     fRawReader->AddMinorErrorLog(kDDLMinError);
1246     AliWarning("Wrong DDL range: setting first DDL ID to 0");
1247   }
1248   if (nDDLMax > 71){
1249     nDDLMax = 71;
1250     fRawReader->AddMinorErrorLog(kDDLMaxError);
1251     AliWarning("Wrong DDL range: setting last DDL ID to 71");
1252   }  
1253
1254   //select required DDLs
1255   fRawReader->Select("TOF", nDDLMin, nDDLMax);
1256
1257   if (verbose)
1258     AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1259
1260   return(Decode(verbose));
1261 }
1262 //-----------------------------------------------------------------------------
1263 Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1264   //
1265   // New decoder method
1266   //
1267
1268   Int_t currentEquipment;
1269   Int_t currentDDL;
1270
1271   //pointers
1272   UChar_t *data = 0x0;
1273   
1274   //loop and read DDL headers 
1275   while(fRawReader->ReadHeader()){
1276
1277     //memory leak prevention (actually data should be always 0x0 here)
1278     if (data != 0x0)
1279       delete [] data;
1280
1281     //get equipment infos
1282     currentEquipment = fRawReader->GetEquipmentId();
1283     currentDDL = fRawReader->GetDDLID();
1284     const Int_t kDataSize = fRawReader->GetDataSize();
1285     const Int_t kDataWords = kDataSize / 4;
1286     data = new UChar_t[kDataSize];
1287     
1288     if (verbose)
1289       AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1290     
1291     if (verbose)
1292       AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1293     
1294     //read equipment payload
1295     if (!fRawReader->ReadNext(data, kDataSize))
1296       {
1297         fRawReader->AddMajorErrorLog(kDDLdataReading);
1298         if (verbose)
1299           AliWarning("Error while reading DDL data. Go to next equipment");
1300         delete [] data;
1301         data = 0x0;
1302         continue;
1303       }
1304     
1305     if (verbose)
1306       AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1307     
1308     
1309     //set up the decoder
1310     fDecoder->SetVerbose(verbose);
1311     fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
1312     fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
1313     
1314     //start decoding
1315     if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1316       fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1317       AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1318     }
1319     
1320     delete [] data;
1321     data = 0x0;
1322   }
1323   
1324   //reset reader
1325   fRawReader->Reset();
1326
1327   if (verbose)
1328     AliInfo("All done");
1329     
1330   return kFALSE;
1331   
1332 }
1333 //---------------------------------------------------------------------------
1334 void
1335 AliTOFRawStream::ResetBuffers()
1336 {
1337   //
1338   // To reset the buffers
1339   //
1340
1341   for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1342     ResetDataBuffer(iDDL);
1343     ResetPackedDataBuffer(iDDL);
1344   }
1345 }
1346   
1347 //---------------------------------------------------------------------------
1348 Bool_t
1349 AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1350 {
1351   //
1352   // To load the buffers
1353   //
1354
1355   fTOFrawData->Clear();
1356   fPackedDigits = 0;
1357   
1358   if (verbose > 0)
1359     AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1360
1361   if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1362     fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1363     AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1364     return kTRUE;
1365   }
1366   
1367   if (verbose > 0)
1368     AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
1369   
1370   AliTOFHitData *hitData; //hit data pointer
1371   
1372   if (verbose > 0)
1373     AliInfo("Filling TClonesArray ...");
1374
1375   //loop over DDL packed hits
1376   for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
1377     hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
1378     Int_t   hitACQ = hitData->GetACQ();
1379     Int_t   hitPS = hitData->GetPS();
1380     Int_t   hitSlotID = hitData->GetSlotID();
1381     Int_t   hitChain = hitData->GetChain();
1382     Int_t   hitTDC = hitData->GetTDC();
1383     Int_t   hitChan = hitData->GetChan();
1384     Int_t   hitTimeBin = hitData->GetTimeBin();
1385     Int_t   hitTOTBin = hitData->GetTOTBin();
1386     
1387     Int_t hitLeading = hitData->GetTimeBin();//-1; // adc
1388     Int_t hitTrailing = -1;
1389     Int_t hitError = -1;
1390     
1391     TClonesArray &arrayTofRawData =  *fTOFrawData;
1392     new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
1393   }
1394
1395   if (verbose > 0)
1396     AliInfo("Done.");
1397
1398   if (verbose > 0)
1399     AliInfo("Resetting buffers ...");
1400
1401   fDataBuffer[indexDDL]->Reset();
1402   fPackedDataBuffer[indexDDL]->Reset();
1403
1404   if (verbose > 0)
1405     AliInfo("Done.");
1406
1407   return kFALSE;
1408 }
1409