1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.19.1 2008/09/19 preghenella
19 Decode method updated:
20 it reads the CDH from the rawReader and sends it to the decoder;
21 LoadRawDataBuffers modified:
22 it corrects tof hit infos per ddlBC and deltaBC offsets
23 (in case of the static member fgApplyBCCorrections
24 has been setted to kTRUE);
25 Added static member fgApplyBCCorrections (kTRUE by default)
26 and the related static method ApplyBCCorrections;
28 Revision 1.19 2007/05/18 13:07:53 decaro
29 Error messages stored in the global raw-reader error log (Cvetan, Chiara)
31 Revision 1.18 2007/05/08 11:53:29 arcelli
32 Improved class flexibility for further use (R.Preghenella)
34 Revision 1.17 2007/05/03 08:53:50 decaro
35 Coding convention: RS3 violation -> suppression
37 Revision 1.16 2007/05/03 08:22:22 decaro
38 Coding convention: RN17 violation -> suppression
40 Revision 1.15 2007/04/30 15:22:06 arcelli
41 Change TOF digit Time, Tot etc to int type
43 Revision 1.14 2007/04/27 11:11:53 arcelli
44 updates for the new decoder
46 Revision 1.13 2007/03/16 11:46:35 decaro
47 Coding convention: RN17 rule violation -> suppression
49 Revision 1.12 2007/02/22 09:43:45 decaro
50 Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
52 Revision 1.11 2007/02/20 15:57:00 decaro
53 Raw data update: to read the TOF raw data defined in UNPACKED mode
55 Revision 1.10 2006/12/15 14:01:38 cvetan
58 Revision 1.9 2006/10/13 11:22:27 arcelli
59 remove warnings due to uninitialized AliTOFtdcDigit data members
61 Revision 1.8 2006/08/22 13:30:17 arcelli
62 removal of effective c++ warnings (C.Zampolli)
64 Revision 1.7 2006/08/10 14:46:54 decaro
65 TOF raw data format: updated version
67 Revision 1.6.1 2006/06/28 A. De Caro, R. Preghenella:
68 Update TOF raw data format
69 according to the final version
70 (see the ALICE internal note in preparation
71 'ALICE TOF raw data format')
72 Added the methods for the correspoonding numbering
73 between the equipment IDs and the volume IDs:
78 Revision 0.02 2005/07/28 A. De Caro:
79 Update format TOF raw data
81 Correction of few wrong corrispondences
82 between 'software' and 'hardware' numberings
84 Revision 0.01 2005/07/22 A. De Caro
85 Implement methods Next()
93 ////////////////////////////////////////////////////////////////////////
95 // This class provides access to TOF raw data in DDL files. //
97 // It loops over all TOF raw data given by the AliRawReader. //
99 ////////////////////////////////////////////////////////////////////////
102 #include "Riostream.h"
104 #include "TClonesArray.h"
108 #include "AliRawReader.h"
110 #include "AliTOFGeometry.h"
111 #include "AliTOFrawData.h"
112 #include "AliTOFRawMap.h"
113 #include "AliTOFRawStream.h"
114 //#include "AliTOFCableLengthMap.h"
116 #include "AliTOFHitData.h"
118 #include "AliRawEventHeaderBase.h"
119 #include "AliRawDataHeader.h"
121 ClassImp(AliTOFRawStream)
123 const Int_t AliTOFRawStream::fgkddlBCshift[72] =
145 Bool_t AliTOFRawStream::fgApplyBCCorrections = kTRUE;
146 //_____________________________________________________________________________
147 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
148 fRawReader(rawReader),
150 fDecoder(new AliTOFDecoder()),
175 fInsideTRMchain0(kFALSE),
176 fInsideTRMchain1(kFALSE),
177 fLocalEventCounterDRM(-1),
178 fLocalEventCounterLTM(-1),
179 fLocalEventCounterTRM(0x0),
180 fLocalEventCounterChain(0x0),
182 fCableLengthMap(0x0),
186 // create an object to read TOF raw digits
189 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
190 fDataBuffer[i]=new AliTOFHitDataBuffer();
191 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
194 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
195 fTOFrawData->SetOwner();
198 fRawReader->Select("TOF");
200 fLocalEventCounterTRM = new Int_t[13];
201 fLocalEventCounterChain = new Int_t*[13];
202 fChainBunchID = new Int_t*[13];
203 for (Int_t j=0;j<13;j++){
204 fLocalEventCounterTRM[j] = -1;
205 fLocalEventCounterChain[j] = new Int_t[2];
206 fChainBunchID[j] = new Int_t[2];
207 for (Int_t k=0;k<2;k++){
208 fLocalEventCounterChain[j][k] = -1;
209 fChainBunchID[j][k] = -1;
213 fCableLengthMap = new AliTOFCableLengthMap();
215 fEventID = (Int_t)fRawReader->GetBCID(); //bunch crossing
219 //_____________________________________________________________________________
220 AliTOFRawStream::AliTOFRawStream():
223 fDecoder(new AliTOFDecoder()),
248 fInsideTRMchain0(kFALSE),
249 fInsideTRMchain1(kFALSE),
250 fLocalEventCounterDRM(-1),
251 fLocalEventCounterLTM(-1),
252 fLocalEventCounterTRM(0x0),
253 fLocalEventCounterChain(0x0),
255 fCableLengthMap(0x0),
261 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
262 fDataBuffer[i]=new AliTOFHitDataBuffer();
263 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
266 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
267 fTOFrawData->SetOwner();
269 fLocalEventCounterTRM = new Int_t[13];
270 fLocalEventCounterChain = new Int_t*[13];
271 fChainBunchID = new Int_t*[13];
272 for (Int_t j=0;j<13;j++){
273 fLocalEventCounterTRM[j] = -1;
274 fLocalEventCounterChain[j] = new Int_t[2];
275 fChainBunchID[j] = new Int_t[2];
276 for (Int_t k=0;k<2;k++){
277 fLocalEventCounterChain[j][k] = -1;
278 fChainBunchID[j][k] = -1;
282 fCableLengthMap = new AliTOFCableLengthMap();
286 //_____________________________________________________________________________
287 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
291 fDecoder(new AliTOFDecoder()),
316 fInsideTRMchain0(kFALSE),
317 fInsideTRMchain1(kFALSE),
318 fLocalEventCounterDRM(-1),
319 fLocalEventCounterLTM(-1),
320 fLocalEventCounterTRM(0x0),
321 fLocalEventCounterChain(0x0),
323 fCableLengthMap(0x0),
330 fRawReader = stream.fRawReader;
332 fTOFrawData = stream.fTOFrawData;
336 fTRMchain = stream.fTRMchain;
338 fTDCchannel = stream.fTDCchannel;
339 fTime = stream.fTime;
341 fLeadingEdge = stream.fLeadingEdge;
342 fTrailingEdge = stream.fTrailingEdge;
344 fErrorFlag = stream.fErrorFlag;
346 fSector = stream.fSector;
347 fPlate = stream.fPlate;
348 fStrip = stream.fStrip;
349 fPadX = stream.fPadX;
350 fPadZ = stream.fPadZ;
352 fPackedDigits = stream.fPackedDigits;
354 fWordType = stream.fWordType;
355 fSlotID = stream.fSlotID;
357 fPSbit = stream.fPSbit;
358 fTDCerrorFlag = stream.fTDCerrorFlag;
359 fInsideDRM = stream.fInsideDRM;
360 fInsideTRM = stream.fInsideTRM;
361 fInsideLTM = stream.fInsideLTM;
362 fInsideTRMchain0 = stream.fInsideTRMchain0;
363 fInsideTRMchain1 = stream.fInsideTRMchain1;
365 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
366 fDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fDataBuffer[i]);
367 fPackedDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fPackedDataBuffer[i]);
370 fTOFrawData = new TClonesArray(*stream.fTOFrawData);
372 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;
373 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;
374 for (Int_t j=0;j<13;j++){
375 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
376 for (Int_t k=0;k<2;k++){
377 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
378 fChainBunchID[j][k] = stream.fChainBunchID[j][k];
382 fCableLengthMap = stream.fCableLengthMap;
384 fEventID = stream.fEventID;
388 //_____________________________________________________________________________
389 AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
392 // assignment operator
395 fRawReader = stream.fRawReader;
397 fTOFrawData = stream.fTOFrawData;
401 fTRMchain = stream.fTRMchain;
403 fTDCchannel = stream.fTDCchannel;
404 fTime = stream.fTime;
406 fLeadingEdge = stream.fLeadingEdge;
407 fTrailingEdge = stream.fTrailingEdge;
408 fErrorFlag = stream.fErrorFlag;
410 fSector = stream.fSector;
411 fPlate = stream.fPlate;
412 fStrip = stream.fStrip;
413 fPadX = stream.fPadX;
414 fPadZ = stream.fPadZ;
416 fPackedDigits = stream.fPackedDigits;
418 fWordType = stream.fWordType;
419 fSlotID = stream.fSlotID;
421 fPSbit = stream.fPSbit;
422 fTDCerrorFlag = stream.fTDCerrorFlag;
423 fInsideDRM = stream.fInsideDRM;
424 fInsideTRM = stream.fInsideTRM;
425 fInsideLTM = stream.fInsideLTM;
426 fInsideTRMchain0 = stream.fInsideTRMchain0;
427 fInsideTRMchain1 = stream.fInsideTRMchain1;
429 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
430 fDataBuffer[i] = stream.fDataBuffer[i];
431 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
434 fTOFrawData = stream.fTOFrawData;
436 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;
437 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;
438 for (Int_t j=0;j<13;j++){
439 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
440 for (Int_t k=0;k<2;k++){
441 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
442 fChainBunchID[j][k] = stream.fChainBunchID[j][k];
446 fCableLengthMap = stream.fCableLengthMap;
448 fEventID = stream.fEventID;
454 //_____________________________________________________________________________
455 AliTOFRawStream::~AliTOFRawStream()
461 for (Int_t i=0;i<72;i++){
462 delete fDataBuffer[i];
463 delete fPackedDataBuffer[i];
468 fTOFrawData->Clear();
471 delete [] fLocalEventCounterTRM;
472 for (Int_t ii=0; ii<2; ii++) {
473 delete [] fLocalEventCounterChain[ii];
474 delete [] fChainBunchID[ii];
476 delete fCableLengthMap;
481 //_____________________________________________________________________________
483 void AliTOFRawStream::LoadRawData(Int_t indexDDL)
489 fTOFrawData->Clear();
491 TClonesArray &arrayTofRawData = *fTOFrawData;
495 // create raw data map
496 AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
499 Int_t slot[4] = {-1, -1, -1, -1};
501 fLocalEventCounterDRM = -1;
502 fLocalEventCounterLTM = -1;
503 for (Int_t ii=0; ii<13; ii++)
504 fLocalEventCounterTRM[ii] = -1;
505 for (Int_t ii=0; ii<13; ii++)
506 for (Int_t jj=0; jj<2; jj++)
507 fLocalEventCounterChain[ii][jj] = -1;
510 fRawReader->Select("TOF", indexDDL, indexDDL);
512 Bool_t signal = kFALSE;
514 AliTOFrawData *rawDigit = NULL;
518 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
520 AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
525 slot[3] = fTDCchannel;
527 if (rawMap->TestHit(slot) != kEmpty) {
529 rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
531 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
532 fLeadingEdge==-1 && fTrailingEdge!=-1) {
534 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
536 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
537 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
542 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
544 rawMap->SetHit(slot);
552 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
554 rawMap->SetHit(slot);
556 } // else if (rawMap->TestHit(slot) == kEmpty)
560 } // closed -> while (Next())
566 //_____________________________________________________________________________
567 Bool_t AliTOFRawStream::Next()
570 // Read next 32-bit word in TOF raw data files
571 // returns kFALSE if there is no word left
578 if (!fRawReader->ReadNextInt(data)) return kFALSE;
580 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
592 fDDL = fRawReader->GetDDLID();
594 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
596 switch (fWordType) { // switch word type
598 case GLOBAL_HEADER_TYPE: // global header
599 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
603 switch (fSlotID) { // switch global header slot ID
605 case DRM_ID_NUMBER: //DRM global header
606 if (fInsideDRM) { // unexpected DRM global headers -> exit
609 fInsideDRM = kTRUE; // DRM global header accepted
612 case LTM_ID_NUMBER: // LTM global header
613 if (fInsideLTM) { // unexpected LTM global headers -> exit
616 fInsideLTM = kTRUE; // LTM global header accepted
626 case 10: //TRM header
627 case 11: //TRM header
628 case 12: //TRM header
629 if (fInsideTRM) { // unexpected TRM global headers -> exit
632 fInsideTRM = kTRUE; // TRM global header accepted
633 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
636 default: // unexpected global header slot ID
639 } //end switch global header slot id
644 case GLOBAL_TRAILER_TYPE: // global trailer
645 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
647 switch (fSlotID) { // switch global trailer slot ID
649 case DRM_ID_NUMBER: // DRM global trailer
650 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
654 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
655 fLocalEventCounterDRM = GetField(data,dummy,4);
656 fInsideDRM = kFALSE; // DRM global trailer accepted
659 fInsideTRMchain0 = kFALSE;
660 fInsideTRMchain1 = kFALSE;
680 case LTM_ID_NUMBER: // LTM global trailer
681 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
685 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
686 fLocalEventCounterLTM = GetField(data,dummy,16);
687 fInsideLTM = kFALSE; // LTM global trailer accepted
689 case 15: //TRM global trailer
690 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
694 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
695 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);
696 fInsideTRM = kFALSE; // TRM global trailer accepted
698 default: // unexpected global trailer slot ID
700 } //end switch global trailer slot id
706 case ERROR_TYPE: // TDC error
707 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
708 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
712 case FILLER_TYPE: // filler
716 default: // other word types
718 if (fInsideTRM) { // inside TRM
720 switch (fWordType) { // switch word type inside TRM
721 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
722 if (fInsideTRMchain0) { // unexpected TRM chain0 header
725 fInsideTRMchain0 = kTRUE;
728 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
729 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
731 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
732 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
736 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
737 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
738 fInsideTRMchain0 = kFALSE;
741 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
742 if (fInsideTRMchain1) { // unexpected TRM chain1 header
745 fInsideTRMchain1 = kTRUE;
748 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
749 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
751 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
752 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
756 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
757 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
758 fInsideTRMchain1 = kFALSE;
761 } // end switch word type inside TRM
763 } // end if (fInsideTRM)
767 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
768 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
769 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
770 ){ // inside TRM chains
772 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
773 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
774 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
775 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
784 switch (fPSbit) { // switch fPSbit bits inside TRM chains
786 case 0: // packing ok, digit time and TOT
787 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
788 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
790 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
792 if (fgApplyBCCorrections) {
793 AliDebug(2,"Apply nominal DDL BC time-shift correction");
794 AliDebug(2,"Apply deltaBC time-shift correction");
795 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
797 (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
799 (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
803 case 1: // leading edge digit, long digit time, no TOT
806 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
808 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
810 if (fgApplyBCCorrections) {
811 AliDebug(2,"Apply nominal DDL BC time-shift correction");
812 AliDebug(2,"Apply deltaBC time-shift correction");
813 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
815 (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
817 (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
821 case 2: // trailing edge digit, long digit time, no TOT
824 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
826 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
828 if (fgApplyBCCorrections) {
829 AliDebug(2,"Apply nominal DDL BC time-shift correction");
830 AliDebug(2,"Apply deltaBC time-shift correction");
831 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
833 (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
835 (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
839 case 3: // TOT overflow
840 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
841 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
843 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
845 if (fgApplyBCCorrections) {
846 AliDebug(2,"Apply nominal DDL BC time-shift correction");
847 AliDebug(2,"Apply deltaBC time-shift correction");
848 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
850 (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
852 (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
856 } // end switch PS bits inside TRM chains
858 } // end if is inside TRM chains
860 } // end switch on fWordType
866 //_____________________________________________________________________________
868 void AliTOFRawStream::SetSector()
871 // Evaluate the TOF sector number -> [ 0;17]
872 // corresponding to the TOF equipment IDs:
875 // fTRMchain -> [ 0; 1]
877 // fTDCchannel -> [ 0; 7]
882 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
887 //_____________________________________________________________________________
890 void AliTOFRawStream::SetPlate()
893 // Evaluate the TOF plate number ->[ 0; 4]
894 // corresponding to the TOF equipment IDs:
897 // fTRMchain -> [ 0; 1]
899 // fTDCchannel -> [ 0; 7]
903 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
905 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
910 //_____________________________________________________________________________
912 void AliTOFRawStream::SetStrip()
915 // Evaluate the TOF strip number per module -> [ 0; 14/18]
916 // corresponding to the TOF equipment IDs:
919 // fTRMchain -> [ 0; 1]
921 // fTDCchannel -> [ 0; 7]
926 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
927 || fSector==-1 || fPlate==-1))
928 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
933 //_____________________________________________________________________________
935 void AliTOFRawStream::SetPadZ()
938 // Evaluate the TOF padRow number per strip -> [ 0; 1]
939 // corresponding to the TOF equipment IDs:
942 // fTRMchain -> [ 0; 1]
944 // fTDCchannel -> [ 0; 7]
949 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
950 || fSector==-1 || fPlate==-1 || fStrip==-1))
952 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
953 if (iPadAlongTheStrip!=-1)
954 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
957 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
958 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
963 //_____________________________________________________________________________
965 void AliTOFRawStream::SetPadX()
968 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
969 // corresponding to the TOF equipment IDs:
972 // fTRMchain -> [ 0; 1]
974 // fTDCchannel -> [ 0; 7]
979 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
980 || fSector==-1 || fPlate==-1 || fStrip==-1))
982 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
983 if (iPadAlongTheStrip!=-1)
984 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
987 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
988 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
994 //----------------------------------------------------------------------------
995 Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
1001 return ((word & fieldMask) >> fieldPosition);
1004 //----------------------------------------------------------------------------
1005 Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
1008 // Returns the TOF plate number [0;4]
1009 // corresponding to the TOF equipment ID numbers:
1010 // iDDL -> DDL number per sector [0;3]
1011 // nTRM -> TRM number [3;12]
1012 // nTDC -> TDC number [0;14]
1019 if (nTRM>=4 && nTRM<7) {
1021 } else if (nTRM==7) {
1022 if (nTDC<12) iPlate = 0;
1024 } else if (nTRM>=8 && nTRM<11) {
1026 } else if (nTRM==11) {
1027 if (nTDC<9) iPlate = 1;
1029 }else if (nTRM==12) {
1033 } else if (iDDL==1) {
1036 if (nTDC<3) iPlate = 0;
1037 } else if (nTRM>=4 && nTRM<7) {
1039 } else if (nTRM==7) {
1040 if (nTDC<6) iPlate = 1;
1042 } else if (nTRM>=8 && nTRM<11) {
1044 } else if (nTRM==11) {
1045 if (nTDC<9) iPlate = 2;
1047 } else if (nTRM==12) {
1051 } else if (iDDL==2) {
1053 if (nTRM>=4 && nTRM<7) {
1055 } else if (nTRM==7) {
1056 if (nTDC<12) iPlate = 4;
1058 } else if (nTRM>=8 && nTRM<11) {
1060 } else if (nTRM==11) {
1061 if (nTDC<9) iPlate = 3;
1063 }else if (nTRM==12) {
1067 } else if (iDDL==3) {
1070 if (nTDC<3) iPlate = 4;
1071 } else if (nTRM>=4 && nTRM<7) {
1073 } else if (nTRM==7) {
1074 if (nTDC<6) iPlate = 3;
1076 } else if (nTRM>=8 && nTRM<11) {
1078 } else if (nTRM==11) {
1079 if (nTDC<9) iPlate = 2;
1081 } else if (nTRM==12) {
1091 //----------------------------------------------------------------------------
1092 Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
1095 // Returns the TOF strip number per module:
1096 // [0;14], in the central plates,
1097 // [0;18], in the intermediate and external plates
1098 // corresponding to the TOF equipment ID numbers:
1099 // iDDL -> DDL number per sector [0;3]
1100 // nTRM -> TRM number [3;12]
1101 // nTDC -> TDC number [0;14]
1108 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
1109 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
1110 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
1111 else if (nTRM== 7) {
1112 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
1113 else iStrip = (Int_t)(nTDC/3.) - 4;
1115 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
1116 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
1117 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
1118 else if (nTRM==11) {
1119 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
1120 else iStrip = (Int_t)(nTDC/3.) - 3;
1122 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
1124 } else if (iDDL==1) {
1126 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1127 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
1128 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1129 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1130 else if (nTRM== 7) {
1131 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
1132 else iStrip = 20 - (Int_t)(nTDC/3.);
1134 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
1135 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1136 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1137 else if (nTRM==11) {
1138 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
1139 else iStrip = 21 - (Int_t)(nTDC/3.);
1141 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
1143 } else if (iDDL==2) {
1145 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
1146 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1147 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1148 else if (nTRM== 7) {
1149 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
1150 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
1152 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1153 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1154 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1155 else if (nTRM==11) {
1156 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1157 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
1159 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1161 } else if (iDDL==3) {
1163 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1164 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1165 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1166 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1167 else if (nTRM== 7) {
1168 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
1169 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1171 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1172 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1173 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1174 else if (nTRM==11) {
1175 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1176 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1178 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1186 //----------------------------------------------------------------------------
1187 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
1191 // Returns the TOF pad number per strip [0;95]
1192 // corresponding to the TOF equipment ID numbers:
1193 // iDDL -> DDL number per sector [0;3]
1194 // iChain -> TRM chain number [0;1]
1195 // nTDC -> TDC number [0;14]
1196 // iCH -> TDC channel number [0;7]
1199 Int_t iPadAlongTheStrip = -1;
1202 //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1203 //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1204 //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
1207 Int_t iTDClocal = -1;
1208 Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1209 Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1210 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1211 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
1213 Int_t iCHlocal = iCH;
1214 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1216 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1218 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1219 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1220 std::cerr << "Problems with the padX number!" << endl;
1221 //AliWarning("Problems with the padX number!");
1223 return iPadAlongTheStrip;
1227 //----------------------------------------------------------------------------
1228 Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1232 // Returns the TOF padX number [0;47]
1233 // corresponding to the TOF equipment ID numbers:
1234 // iDDL -> DDL number per sector [0;3]
1235 // iChain -> TRM chain number [0;1]
1236 // nTDC -> TDC number [0;14]
1237 // iCH -> TDC channel number [0;7]
1240 Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1241 (Float_t(AliTOFGeometry::NpadZ())));
1247 //----------------------------------------------------------------------------
1248 Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1252 // Returns the TOF padZ number [0;1]
1253 // corresponding to the TOF equipment ID numbers:
1254 // iDDL -> DDL number per sector [0;3]
1255 // iChain -> TRM chain number [0;1]
1256 // nTDC -> TDC number [0;14]
1257 // iCH -> TDC channel number [0;7]
1260 Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1266 //----------------------------------------------------------------------------
1267 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL)
1270 // Returns the sector number [0;17]
1271 // corresponing to the assigned DRM/DDL number [0;71]
1274 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1279 //----------------------------------------------------------------------------
1280 Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL)
1283 // Return the DRM/DDL number per sector [0;3]
1284 // corresponing to the assigned DRM/DDL number [0;71]
1287 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1293 //----------------------------------------------------------------------------
1294 void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1296 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1298 //----------------------------------------------------------------------------
1299 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1300 Int_t nTDC, Int_t iCH,
1301 Int_t *volume) const
1305 // nDDL (variable in [0;71]) -> number of the DDL file
1306 // nTRM (variable in [3;12]) -> number of the TRM slot
1307 // iChain (variable in [0; 1]) -> number of the TRM chain
1308 // nTDC (variable in [0;14]) -> number of the TDC
1309 // iCH (variable in [0; 7]) -> number of the TDC channel
1312 // sector number, i.e. volume[0] (variable in [0,17])
1313 // plate number, i.e. volume[1] (variable in [0, 5])
1314 // strip number, i.e. volume[2] (variable in [0,14/18])
1315 // padX number, i.e. volume[3] (variable in [0,47])
1316 // padZ number, i.e. volume[4] (variable in [0, 1])
1319 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1321 Int_t iSector = GetSectorNumber(nDDL);
1323 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1326 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
1327 AliWarning("Problems with the plate number!");
1330 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1333 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
1334 AliWarning("Problems with the strip number!");
1337 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1338 if (iPadAlongTheStrip==-1){
1340 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
1341 AliWarning("Problems with the pad number along the strip!");
1344 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1345 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1347 //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1348 //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1350 //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1351 //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1353 volume[0] = iSector;
1360 //-----------------------------------------------------------------------------
1361 Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1363 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1366 //check and fix valid DDL range
1369 fRawReader->AddMinorErrorLog(kDDLMinError);
1370 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1374 fRawReader->AddMinorErrorLog(kDDLMaxError);
1375 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1378 //select required DDLs
1379 fRawReader->Select("TOF", nDDLMin, nDDLMax);
1382 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1384 return(Decode(verbose));
1386 //-----------------------------------------------------------------------------
1387 Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1389 // New decoder method
1392 Int_t currentEquipment;
1394 const AliRawDataHeader *currentCDH;
1397 UChar_t *data = 0x0;
1399 //loop and read DDL headers
1400 while(fRawReader->ReadHeader()){
1402 //memory leak prevention (actually data should be always 0x0 here)
1406 //get equipment infos
1407 currentEquipment = fRawReader->GetEquipmentId();
1408 currentDDL = fRawReader->GetDDLID();
1409 currentCDH = fRawReader->GetDataHeader();
1410 const Int_t kDataSize = fRawReader->GetDataSize();
1411 const Int_t kDataWords = kDataSize / 4;
1412 data = new UChar_t[kDataSize];
1415 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1418 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1420 //read equipment payload
1421 if (!fRawReader->ReadNext(data, kDataSize))
1423 fRawReader->AddMajorErrorLog(kDDLdataReading);
1425 AliWarning("Error while reading DDL data. Go to next equipment");
1432 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1435 //set up the decoder
1436 fDecoder->SetVerbose(verbose);
1437 fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
1438 fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
1441 if (fDecoder->Decode((UInt_t *)data, kDataWords, currentCDH) == kTRUE) {
1442 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1443 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1451 fRawReader->Reset();
1454 AliInfo("All done");
1459 //---------------------------------------------------------------------------
1461 AliTOFRawStream::ResetBuffers()
1464 // To reset the buffers
1467 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1468 ResetDataBuffer(iDDL);
1469 ResetPackedDataBuffer(iDDL);
1473 //---------------------------------------------------------------------------
1475 AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1478 // To load the buffers
1481 fTOFrawData->Clear();
1485 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1487 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1488 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1489 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1494 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
1496 AliTOFHitData *hitData; //hit data pointer
1499 AliInfo("Filling TClonesArray ...");
1502 if (fgApplyBCCorrections) {
1503 AliInfo("Apply nominal DDL BC time-shift correction");
1504 AliInfo("Apply deltaBC time-shift correction");
1507 //loop over DDL packed hits
1508 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
1509 hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
1510 Int_t hitACQ = hitData->GetACQ();
1511 Int_t hitPS = hitData->GetPS();
1512 Int_t hitSlotID = hitData->GetSlotID();
1513 Int_t hitChain = hitData->GetChain();
1514 Int_t hitTDC = hitData->GetTDC();
1515 Int_t hitChan = hitData->GetChan();
1516 Int_t hitTimeBin = hitData->GetTimeBin();
1517 Int_t hitTOTBin = hitData->GetTOTBin();
1519 if (fgApplyBCCorrections) {
1520 /* DDL BC shift time correction */
1521 hitTimeBin += fgkddlBCshift[indexDDL];
1522 /* deltaBC shift time correction */
1523 hitTimeBin += hitData->GetDeltaBunchID();
1526 Int_t hitLeading = hitData->GetTimeBin();
1527 Int_t hitTrailing = -1;
1528 Int_t hitError = -1;
1530 TClonesArray &arrayTofRawData = *fTOFrawData;
1531 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
1538 AliInfo("Resetting buffers ...");
1540 fDataBuffer[indexDDL]->Reset();
1541 fPackedDataBuffer[indexDDL]->Reset();
1549 //---------------------------------------------------------------------------
1550 void AliTOFRawStream::Geant2EquipmentId(Int_t vol[], Int_t eqId[])
1554 // nSector number -vol[0]- (variable in [0,17])
1555 // nPlate number -vol[1]- (variable in [0, 5])
1556 // nStrip number -vol[2]- (variable in [0,14/18])
1557 // nPadZ number -vol[3]- (variable in [0, 1])
1558 // nPadX number -vol[4]- (variable in [0,47])
1560 // nDDL -eqId[0]- (variable in [0;71]) -> number of the DDL file
1561 // nTRM -eqId[1]- (variable in [3;12]) -> number of the TRM file
1562 // nTDC -eqId[2]- (variable in [0;14]) -> number of the TDC file
1563 // nChain -eqId[3]- (variable in [0; 1]) -> number of the chain file
1564 // nChannel -eqId[4]- (variable in [0; 8]) -> number of the channel file
1567 eqId[0] = Geant2DDL(vol);
1568 eqId[1] = Geant2TRM(vol);
1569 eqId[2] = Geant2TDC(vol);
1570 eqId[3] = Geant2Chain(vol);
1571 eqId[4] = Geant2Channel(vol);
1575 //---------------------------------------------------------------------------
1576 Int_t AliTOFRawStream::Geant2DDL(Int_t vol[])
1580 // nSector number -vol[0]- (variable in [0,17])
1581 // nPlate number -vol[1]- (variable in [0, 5])
1582 // nStrip number -vol[2]- (variable in [0,14/18])
1583 // nPadZ number -vol[3]- (variable in [0, 1])
1584 // nPadX number -vol[4]- (variable in [0,47])
1586 // nDDL (variable in [0;71]) -> number of the DDL file
1592 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1593 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1596 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1597 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1600 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1601 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1604 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1605 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1606 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1607 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1608 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1609 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1613 Int_t nSector = vol[0];
1614 Int_t nPlate = vol[1];
1615 Int_t nStrip = vol[2];
1616 Int_t nPadX = vol[4];
1618 if ( nPadX<24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<7) ) )
1620 else if ( nPadX>=24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<8) ) )
1622 else if ( nPadX>=24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>7) ) )
1624 else if ( nPadX<24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>6) ) )
1627 return 4*nSector+iDDL;
1631 //---------------------------------------------------------------------------
1632 Int_t AliTOFRawStream::Geant2TRM(Int_t vol[])
1636 // nSector number -vol[0]- (variable in [0,17])
1637 // nPlate number -vol[1]- (variable in [0, 5])
1638 // nStrip number -vol[2]- (variable in [0,14/18])
1639 // nPadZ number -vol[3]- (variable in [0, 1])
1640 // nPadX number -vol[4]- (variable in [0,47])
1642 // nTRM (variable in [3;12]) -> number of the TRM slot
1647 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1648 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1651 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1652 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1655 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1656 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1659 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) {
1660 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1663 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) {
1664 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1668 if ( vol[3]>=AliTOFGeometry::NpadZ() )
1670 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1674 Int_t nPlate = vol[1];
1675 Int_t nStrip = vol[2];
1677 Int_t iDDL = Geant2DDL(vol)%4;
1684 if (nStrip<= 4) nTRM = 4;
1685 else if (nStrip> 4 && nStrip<= 9) nTRM = 5;
1686 else if (nStrip> 9 && nStrip<=14) nTRM = 6;
1687 else if (nStrip>14) nTRM = 7;
1689 else if (nPlate==1) {
1690 if (nStrip== 0) nTRM = 7;
1691 else if (nStrip> 0 && nStrip<= 5) nTRM = 8;
1692 else if (nStrip> 5 && nStrip<=10) nTRM = 9;
1693 else if (nStrip>10 && nStrip<=15) nTRM = 10;
1694 else if (nStrip>15) nTRM = 11;
1696 else if (nPlate==2) {
1697 if (nStrip<= 1) nTRM = 11;
1698 else if (nStrip> 1 && nStrip< 7) nTRM = 12;
1705 if (nStrip== 0) nTRM = 3;
1706 else if (nStrip> 0 && nStrip<= 5) nTRM = 4;
1707 else if (nStrip> 5 && nStrip<=10) nTRM = 5;
1708 else if (nStrip>10 && nStrip<=15) nTRM = 6;
1709 else if (nStrip>15) nTRM = 7;
1711 else if (nPlate==1) {
1712 if (nStrip<=1) nTRM = 7;
1713 else if (nStrip> 1 && nStrip<= 6) nTRM = 8;
1714 else if (nStrip> 6 && nStrip<=11) nTRM = 9;
1715 else if (nStrip>11 && nStrip<=16) nTRM = 10;
1716 else if (nStrip>16) nTRM = 11;
1718 else if (nPlate==2) {
1719 if (nStrip<= 2) nTRM = 11;
1720 else if (nStrip> 2 && nStrip<= 7) nTRM = 12;
1727 if (nStrip>=14) nTRM = 4;
1728 else if (nStrip<14 && nStrip>= 9) nTRM = 5;
1729 else if (nStrip< 9 && nStrip>= 4) nTRM = 6;
1730 else if (nStrip< 4) nTRM = 7;
1732 else if (nPlate==3) {
1733 if (nStrip==18) nTRM = 7;
1734 else if (nStrip<18 && nStrip>=13) nTRM = 8;
1735 else if (nStrip<13 && nStrip>= 8) nTRM = 9;
1736 else if (nStrip< 8 && nStrip>= 3) nTRM = 10;
1737 else if (nStrip< 3) nTRM = 11;
1739 else if (nPlate==2) {
1740 if (nStrip>=13) nTRM = 11;
1741 else if (nStrip<13 && nStrip>= 8) nTRM = 12;
1748 if (nStrip==18) nTRM = 3;
1749 else if (nStrip<18 && nStrip>=13) nTRM = 4;
1750 else if (nStrip<13 && nStrip>= 8) nTRM = 5;
1751 else if (nStrip< 8 && nStrip>= 3) nTRM = 6;
1752 else if (nStrip< 3) nTRM = 7;
1754 else if (nPlate==3) {
1755 if (nStrip>=17) nTRM = 7;
1756 else if (nStrip<17 && nStrip>=12) nTRM = 8;
1757 else if (nStrip<12 && nStrip>= 7) nTRM = 9;
1758 else if (nStrip< 7 && nStrip>= 2) nTRM = 10;
1759 else if (nStrip< 2) nTRM = 11;
1761 else if (nPlate==2) {
1762 if (nStrip>=12) nTRM = 11;
1763 else if (nStrip <12 && nStrip>= 7) nTRM = 12;
1774 //---------------------------------------------------------------------------
1775 Int_t AliTOFRawStream::Geant2TDC(Int_t vol[])
1779 // nSector number -vol[0]- (variable in [0,17])
1780 // nPlate number -vol[1]- (variable in [0, 5])
1781 // nStrip number -vol[2]- (variable in [0,14/18])
1782 // nPadZ number -vol[3]- (variable in [0, 1])
1783 // nPadX number -vol[4]- (variable in [0,47])
1785 // nTDC (variable in [0;14]) -> number of the TDC
1790 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1791 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1794 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1795 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1798 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1799 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1802 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1803 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1804 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1805 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1806 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1807 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1811 Int_t nPlate = vol[1];
1812 Int_t nStrip = vol[2];
1813 Int_t iPadX = vol[4];
1815 Int_t iDDL = Geant2DDL(vol)%4;
1822 if (nStrip<= 4) nTDC = (3*(nStrip)+2-(iPadX/4)%3);
1823 else if (nStrip> 4 && nStrip<= 9) nTDC = (3*(nStrip- 5)+2-(iPadX/4)%3);
1824 else if (nStrip> 9 && nStrip<=14) nTDC = (3*(nStrip-10)+2-(iPadX/4)%3);
1825 else if (nStrip>14) nTDC = (3*(nStrip-15)+2-(iPadX/4)%3);
1827 else if (nPlate==1) {
1828 if (nStrip== 0) nTDC = (3*(nStrip+ 4)+2-(iPadX/4)%3);
1829 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*(nStrip- 1)+2-(iPadX/4)%3);
1830 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(nStrip- 6)+2-(iPadX/4)%3);
1831 else if (nStrip>10 && nStrip<=15) nTDC = (3*(nStrip-11)+2-(iPadX/4)%3);
1832 else if (nStrip>15) nTDC = (3*(nStrip-16)+2-(iPadX/4)%3);
1834 else if (nPlate==2) {
1835 if (nStrip<= 1) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
1836 else if (nStrip> 1 && nStrip< 7) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
1843 if (nStrip== 0) nTDC = (3*(nStrip)+(iPadX/4)%3);
1844 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*( 5-nStrip)+(iPadX/4)%3);
1845 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(10-nStrip)+(iPadX/4)%3);
1846 else if (nStrip>10 && nStrip<=15) nTDC = (3*(15-nStrip)+(iPadX/4)%3);
1847 else if (nStrip>15) nTDC = (3*(20-nStrip)+(iPadX/4)%3);
1849 else if (nPlate==1) {
1850 if (nStrip<= 1) nTDC = (3*( 1-nStrip)+(iPadX/4)%3);
1851 else if (nStrip> 1 && nStrip<= 6) nTDC = (3*( 6-nStrip)+(iPadX/4)%3);
1852 else if (nStrip> 6 && nStrip<=11) nTDC = (3*(11-nStrip)+(iPadX/4)%3);
1853 else if (nStrip>11 && nStrip<=16) nTDC = (3*(16-nStrip)+(iPadX/4)%3);
1854 else if (nStrip>16) nTDC = (3*(21-nStrip)+(iPadX/4)%3);
1856 else if (nPlate==2) {
1857 if (nStrip<= 2) nTDC = (3*( 2-nStrip)+(iPadX/4)%3);
1858 else if (nStrip> 2 && nStrip<= 7) nTDC = (3*( 7-nStrip)+(iPadX/4)%3);
1865 if (nStrip>=14) nTDC = (3*(18-nStrip)+((iPadX/4)%3));
1866 else if (nStrip<14 && nStrip>= 9) nTDC = (3*(13-nStrip)+((iPadX/4)%3));
1867 else if (nStrip< 9 && nStrip>= 4) nTDC = (3*( 8-nStrip)+((iPadX/4)%3));
1868 else if (nStrip< 4) nTDC = (3*( 3-nStrip)+((iPadX/4)%3));
1870 else if (nPlate==3) {
1871 if (nStrip==18) nTDC = (3*(22-nStrip)+((iPadX/4)%3));
1872 else if (nStrip<18 && nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
1873 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
1874 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*( 7-nStrip)+((iPadX/4)%3));
1875 else if (nStrip< 3) nTDC = (3*( 2-nStrip)+((iPadX/4)%3));
1877 else if (nPlate==2) {
1878 if (nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
1879 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
1886 if (nStrip==18) nTDC = (3*(nStrip-18)+2-(iPadX/4)%3);
1887 else if (nStrip<18 && nStrip>=13) nTDC = (3*(nStrip-13)+2-(iPadX/4)%3);
1888 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(nStrip- 8)+2-(iPadX/4)%3);
1889 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*(nStrip- 3)+2-(iPadX/4)%3);
1890 else if (nStrip< 3) nTDC = (3*(nStrip+ 2)+2-(iPadX/4)%3);
1892 else if (nPlate==3) {
1893 if (nStrip>=17) nTDC = (3*(nStrip-17)+2-(iPadX/4)%3);
1894 else if (nStrip<17 && nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
1895 else if (nStrip<12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
1896 else if (nStrip< 7 && nStrip>= 2) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
1897 else if (nStrip< 2) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
1899 else if (nPlate==2) {
1900 if (nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
1901 else if (nStrip <12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
1912 //---------------------------------------------------------------------------
1913 Int_t AliTOFRawStream::Geant2Chain(Int_t vol[])
1917 // nSector number -vol[0]- (variable in [0,17])
1918 // nPlate number -vol[1]- (variable in [0, 5])
1919 // nStrip number -vol[2]- (variable in [0,14/18])
1920 // nPadZ number -vol[3]- (variable in [0, 1])
1921 // nPadX number -vol[4]- variable in [0,47])
1923 // nChain (variable in [0; 1]) -> number of the TRM chain
1928 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1929 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1932 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1933 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1936 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1937 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1940 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1941 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1942 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1943 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1944 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1945 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1949 Int_t iPadX = vol[4];
1951 if (iPadX<12 || iPadX>=36) nChain = 0;
1958 //---------------------------------------------------------------------------
1959 Int_t AliTOFRawStream::Geant2Channel(Int_t vol[])
1963 // nSector number -vol[0]- (variable in [0,17])
1964 // nPlate number -vol[1]- (variable in [0, 5])
1965 // nStrip number -vol[2]- (variable in [0,14/18])
1966 // nPadZ number -vol[3]- (variable in [0, 1])
1967 // nPadX number -vol[4]- (variable in [0,47])
1969 // nChannel (variable in [0; 7]) -> number of the TDC channel
1972 Int_t nChannel = -1;
1974 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1975 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1978 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1979 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1982 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1983 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1986 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1987 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1988 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1989 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1990 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1991 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1995 Int_t iPadZ = vol[3];
1996 Int_t iPadX = vol[4];
1998 Int_t iDDL = Geant2DDL(vol)%4;
2003 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2006 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2009 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2012 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;