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 2007/05/18 13:07:53 decaro
19 Error messages stored in the global raw-reader error log (Cvetan, Chiara)
21 Revision 1.18 2007/05/08 11:53:29 arcelli
22 Improved class flexibility for further use (R.Preghenella)
24 Revision 1.17 2007/05/03 08:53:50 decaro
25 Coding convention: RS3 violation -> suppression
27 Revision 1.16 2007/05/03 08:22:22 decaro
28 Coding convention: RN17 violation -> suppression
30 Revision 1.15 2007/04/30 15:22:06 arcelli
31 Change TOF digit Time, Tot etc to int type
33 Revision 1.14 2007/04/27 11:11:53 arcelli
34 updates for the new decoder
36 Revision 1.13 2007/03/16 11:46:35 decaro
37 Coding convention: RN17 rule violation -> suppression
39 Revision 1.12 2007/02/22 09:43:45 decaro
40 Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
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
45 Revision 1.10 2006/12/15 14:01:38 cvetan
48 Revision 1.9 2006/10/13 11:22:27 arcelli
49 remove warnings due to uninitialized AliTOFtdcDigit data members
51 Revision 1.8 2006/08/22 13:30:17 arcelli
52 removal of effective c++ warnings (C.Zampolli)
54 Revision 1.7 2006/08/10 14:46:54 decaro
55 TOF raw data format: updated version
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:
68 Revision 0.02 2005/07/28 A. De Caro:
69 Update format TOF raw data
71 Correction of few wrong corrispondences
72 between 'software' and 'hardware' numberings
74 Revision 0.01 2005/07/22 A. De Caro
75 Implement methods Next()
83 ////////////////////////////////////////////////////////////////////////
85 // This class provides access to TOF raw data in DDL files. //
87 // It loops over all TOF raw data given by the AliRawReader. //
89 ////////////////////////////////////////////////////////////////////////
92 #include "Riostream.h"
94 #include "TClonesArray.h"
98 #include "AliRawReader.h"
100 #include "AliTOFGeometry.h"
101 #include "AliTOFrawData.h"
102 #include "AliTOFRawMap.h"
103 #include "AliTOFRawStream.h"
104 //#include "AliTOFCableLengthMap.h"
106 #include "AliTOFHitData.h"
108 #include "AliRawEventHeaderBase.h"
110 ClassImp(AliTOFRawStream)
112 const Int_t AliTOFRawStream::fgkddlBCshift[72] =
135 //_____________________________________________________________________________
136 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
137 fRawReader(rawReader),
139 fDecoder(new AliTOFDecoder()),
164 fInsideTRMchain0(kFALSE),
165 fInsideTRMchain1(kFALSE),
166 fLocalEventCounterDRM(-1),
167 fLocalEventCounterLTM(-1),
168 fLocalEventCounterTRM(0x0),
169 fLocalEventCounterChain(0x0),
170 fCableLengthMap(0x0),
174 // create an object to read TOF raw digits
177 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
178 fDataBuffer[i]=new AliTOFHitDataBuffer();
179 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
182 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
183 fTOFrawData->SetOwner();
186 fRawReader->Select("TOF");
188 fLocalEventCounterTRM = new Int_t[13];//adc
189 fLocalEventCounterChain = new Int_t*[13];//adc
190 for (Int_t j=0;j<13;j++){//adc
191 fLocalEventCounterTRM[j] = -1;//adc
192 fLocalEventCounterChain[j] = new Int_t[2];//adc
193 for (Int_t k=0;k<2;k++){//adc
194 fLocalEventCounterChain[j][k] = -1;//adc
198 fCableLengthMap = new AliTOFCableLengthMap();
200 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
201 //UInt_t run = rawReader->GetRunNumber();
202 const UInt_t *id = eventHeader->GetP("Id");
203 fEventID = ((id)[1]&0x00000fff); //bunch crossing
204 //UInt_t orbit=((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff)); //orbit number
205 //UInt_t period=(((id)[0]>>4)&0x0fffffff); //period number
206 //UInt_t type=eventHeader->Get("Type"); //this is 7 in physics events
210 //_____________________________________________________________________________
211 AliTOFRawStream::AliTOFRawStream():
214 fDecoder(new AliTOFDecoder()),
239 fInsideTRMchain0(kFALSE),
240 fInsideTRMchain1(kFALSE),
241 fLocalEventCounterDRM(-1),
242 fLocalEventCounterLTM(-1),
243 fLocalEventCounterTRM(0x0),
244 fLocalEventCounterChain(0x0),
245 fCableLengthMap(0x0),
251 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
252 fDataBuffer[i]=new AliTOFHitDataBuffer();
253 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
256 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
257 fTOFrawData->SetOwner();
259 fLocalEventCounterTRM = new Int_t[13];//adc
260 fLocalEventCounterChain = new Int_t*[13];//adc
261 for (Int_t j=0;j<13;j++){//adc
262 fLocalEventCounterTRM[j] = -1;//adc
263 fLocalEventCounterChain[j] = new Int_t[2];//adc
264 for (Int_t k=0;k<2;k++){//adc
265 fLocalEventCounterChain[j][k] = -1;//adc
269 fCableLengthMap = new AliTOFCableLengthMap();
273 //_____________________________________________________________________________
274 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
278 fDecoder(new AliTOFDecoder()),
303 fInsideTRMchain0(kFALSE),
304 fInsideTRMchain1(kFALSE),
305 fLocalEventCounterDRM(-1),
306 fLocalEventCounterLTM(-1),
307 fLocalEventCounterTRM(0x0),
308 fLocalEventCounterChain(0x0),
309 fCableLengthMap(0x0),
316 fRawReader = stream.fRawReader;
318 fTOFrawData = stream.fTOFrawData;
322 fTRMchain = stream.fTRMchain;
324 fTDCchannel = stream.fTDCchannel;
325 fTime = stream.fTime;
327 fLeadingEdge = stream.fLeadingEdge;
328 fTrailingEdge = stream.fTrailingEdge;
330 fErrorFlag = stream.fErrorFlag;
332 fSector = stream.fSector;
333 fPlate = stream.fPlate;
334 fStrip = stream.fStrip;
335 fPadX = stream.fPadX;
336 fPadZ = stream.fPadZ;
338 fPackedDigits = stream.fPackedDigits;
340 fWordType = stream.fWordType;
341 fSlotID = stream.fSlotID;
343 fPSbit = stream.fPSbit;
344 fTDCerrorFlag = stream.fTDCerrorFlag;
345 fInsideDRM = stream.fInsideDRM;
346 fInsideTRM = stream.fInsideTRM;
347 fInsideLTM = stream.fInsideLTM;
348 fInsideTRMchain0 = stream.fInsideTRMchain0;
349 fInsideTRMchain1 = stream.fInsideTRMchain1;
351 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
352 fDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fDataBuffer[i]);
353 fPackedDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fPackedDataBuffer[i]);
356 fTOFrawData = new TClonesArray(*stream.fTOFrawData);
358 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
359 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
360 for (Int_t j=0;j<13;j++){//adc
361 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
362 for (Int_t k=0;k<2;k++){//adc
363 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
367 fCableLengthMap = stream.fCableLengthMap;
369 fEventID = stream.fEventID;
373 //_____________________________________________________________________________
374 AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
377 // assignment operator
380 fRawReader = stream.fRawReader;
382 fTOFrawData = stream.fTOFrawData;
386 fTRMchain = stream.fTRMchain;
388 fTDCchannel = stream.fTDCchannel;
389 fTime = stream.fTime;
391 fLeadingEdge = stream.fLeadingEdge;
392 fTrailingEdge = stream.fTrailingEdge;
393 fErrorFlag = stream.fErrorFlag;
395 fSector = stream.fSector;
396 fPlate = stream.fPlate;
397 fStrip = stream.fStrip;
398 fPadX = stream.fPadX;
399 fPadZ = stream.fPadZ;
401 fPackedDigits = stream.fPackedDigits;
403 fWordType = stream.fWordType;
404 fSlotID = stream.fSlotID;
406 fPSbit = stream.fPSbit;
407 fTDCerrorFlag = stream.fTDCerrorFlag;
408 fInsideDRM = stream.fInsideDRM;
409 fInsideTRM = stream.fInsideTRM;
410 fInsideLTM = stream.fInsideLTM;
411 fInsideTRMchain0 = stream.fInsideTRMchain0;
412 fInsideTRMchain1 = stream.fInsideTRMchain1;
414 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
415 fDataBuffer[i] = stream.fDataBuffer[i];
416 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
419 fTOFrawData = stream.fTOFrawData;
421 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
422 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
423 for (Int_t j=0;j<13;j++){//adc
424 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
425 for (Int_t k=0;k<2;k++){//adc
426 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
430 fCableLengthMap = stream.fCableLengthMap;
432 fEventID = stream.fEventID;
438 //_____________________________________________________________________________
439 AliTOFRawStream::~AliTOFRawStream()
445 for (Int_t i=0;i<72;i++){
446 delete fDataBuffer[i];
447 delete fPackedDataBuffer[i];
452 fTOFrawData->Clear();
455 delete [] fLocalEventCounterTRM;
456 for (Int_t ii=0; ii<2; ii++)
457 delete [] fLocalEventCounterChain[ii];
459 delete fCableLengthMap;
464 //_____________________________________________________________________________
466 void AliTOFRawStream::LoadRawData(Int_t indexDDL)
472 fTOFrawData->Clear();
474 TClonesArray &arrayTofRawData = *fTOFrawData;
478 // create raw data map
479 AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
482 Int_t slot[4] = {-1, -1, -1, -1};
484 fLocalEventCounterDRM = -1;
485 fLocalEventCounterLTM = -1;
486 for (Int_t ii=0; ii<13; ii++)
487 fLocalEventCounterTRM[ii] = -1;
488 for (Int_t ii=0; ii<13; ii++)
489 for (Int_t jj=0; jj<2; jj++)
490 fLocalEventCounterChain[ii][jj] = -1;
493 fRawReader->Select("TOF", indexDDL, indexDDL);
495 Bool_t signal = kFALSE;
497 AliTOFrawData *rawDigit = NULL;
501 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
503 AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
508 slot[3] = fTDCchannel;
510 if (rawMap->TestHit(slot) != kEmpty) {
512 rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
514 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
515 fLeadingEdge==-1 && fTrailingEdge!=-1) {
517 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
519 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
520 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
525 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
527 rawMap->SetHit(slot);
535 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
537 rawMap->SetHit(slot);
539 } // else if (rawMap->TestHit(slot) == kEmpty)
543 } // closed -> while (Next())
549 //_____________________________________________________________________________
550 Bool_t AliTOFRawStream::Next()
553 // Read next 32-bit word in TOF raw data files
554 // returns kFALSE if there is no word left
561 if (!fRawReader->ReadNextInt(data)) return kFALSE;
563 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
575 fDDL = fRawReader->GetDDLID();
577 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
579 switch (fWordType) { // switch word type
581 case GLOBAL_HEADER_TYPE: // global header
582 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
586 switch (fSlotID) { // switch global header slot ID
588 case DRM_ID_NUMBER: //DRM global header
589 if (fInsideDRM) { // unexpected DRM global headers -> exit
592 fInsideDRM = kTRUE; // DRM global header accepted
595 case LTM_ID_NUMBER: // LTM global header
596 if (fInsideLTM) { // unexpected LTM global headers -> exit
599 fInsideLTM = kTRUE; // LTM global header accepted
609 case 10: //TRM header
610 case 11: //TRM header
611 case 12: //TRM header
612 if (fInsideTRM) { // unexpected TRM global headers -> exit
615 fInsideTRM = kTRUE; // TRM global header accepted
616 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
619 default: // unexpected global header slot ID
622 } //end switch global header slot id
627 case GLOBAL_TRAILER_TYPE: // global trailer
628 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
630 switch (fSlotID) { // switch global trailer slot ID
632 case DRM_ID_NUMBER: // DRM global trailer
633 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
637 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
638 fLocalEventCounterDRM = GetField(data,dummy,4);//adc
639 fInsideDRM = kFALSE; // DRM global trailer accepted
642 fInsideTRMchain0 = kFALSE;
643 fInsideTRMchain1 = kFALSE;
663 case LTM_ID_NUMBER: // LTM global trailer
664 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
668 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
669 fLocalEventCounterLTM = GetField(data,dummy,16);//adc
670 fInsideLTM = kFALSE; // LTM global trailer accepted
672 case 15: //TRM global trailer
673 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
677 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
678 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);//adc
679 fInsideTRM = kFALSE; // TRM global trailer accepted
681 default: // unexpected global trailer slot ID
683 } //end switch global trailer slot id
689 case ERROR_TYPE: // TDC error
690 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
691 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
695 case FILLER_TYPE: // filler
699 default: // other word types
701 if (fInsideTRM) { // inside TRM
703 switch (fWordType) { // switch word type inside TRM
704 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
705 if (fInsideTRMchain0) { // unexpected TRM chain0 header
708 fInsideTRMchain0 = kTRUE;
711 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
712 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
716 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
717 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
718 fInsideTRMchain0 = kFALSE;
721 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
722 if (fInsideTRMchain1) { // unexpected TRM chain1 header
725 fInsideTRMchain1 = kTRUE;
728 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
729 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
733 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
734 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
735 fInsideTRMchain1 = kFALSE;
738 } // end switch word type inside TRM
740 } // end if (fInsideTRM)
744 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
745 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
746 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
747 ){ // inside TRM chains
749 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
750 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
751 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
752 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
761 switch (fPSbit) { // switch fPSbit bits inside TRM chains
763 case 0: // packing ok, digit time and TOT
764 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
765 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
767 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)
769 (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
771 (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
775 case 1: // leading edge digit, long digit time, no TOT
778 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
780 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)
782 (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
784 (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
788 case 2: // trailing edge digit, long digit time, no TOT
791 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
793 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)
795 (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
797 (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
801 case 3: // TOT overflow
802 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
803 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
805 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)
807 (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
809 (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
813 } // end switch PS bits inside TRM chains
815 } // end if is inside TRM chains
817 } // end switch on fWordType
823 //_____________________________________________________________________________
825 void AliTOFRawStream::SetSector()
828 // Evaluate the TOF sector number -> [ 0;17]
829 // corresponding to the TOF equipment IDs:
832 // fTRMchain -> [ 0; 1]
834 // fTDCchannel -> [ 0; 7]
839 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
844 //_____________________________________________________________________________
847 void AliTOFRawStream::SetPlate()
850 // Evaluate the TOF plate number ->[ 0; 4]
851 // corresponding to the TOF equipment IDs:
854 // fTRMchain -> [ 0; 1]
856 // fTDCchannel -> [ 0; 7]
860 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
862 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
867 //_____________________________________________________________________________
869 void AliTOFRawStream::SetStrip()
872 // Evaluate the TOF strip number per module -> [ 0; 14/18]
873 // corresponding to the TOF equipment IDs:
876 // fTRMchain -> [ 0; 1]
878 // fTDCchannel -> [ 0; 7]
883 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
884 || fSector==-1 || fPlate==-1))
885 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
890 //_____________________________________________________________________________
892 void AliTOFRawStream::SetPadZ()
895 // Evaluate the TOF padRow number per strip -> [ 0; 1]
896 // corresponding to the TOF equipment IDs:
899 // fTRMchain -> [ 0; 1]
901 // fTDCchannel -> [ 0; 7]
906 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
907 || fSector==-1 || fPlate==-1 || fStrip==-1))
909 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
910 if (iPadAlongTheStrip!=-1)
911 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
914 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
915 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
920 //_____________________________________________________________________________
922 void AliTOFRawStream::SetPadX()
925 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
926 // corresponding to the TOF equipment IDs:
929 // fTRMchain -> [ 0; 1]
931 // fTDCchannel -> [ 0; 7]
936 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
937 || fSector==-1 || fPlate==-1 || fStrip==-1))
939 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
940 if (iPadAlongTheStrip!=-1)
941 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
944 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
945 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
951 //----------------------------------------------------------------------------
952 Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
958 return ((word & fieldMask) >> fieldPosition);
961 //----------------------------------------------------------------------------
962 Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
965 // Returns the TOF plate number [0;4]
966 // corresponding to the TOF equipment ID numbers:
967 // iDDL -> DDL number per sector [0;3]
968 // nTRM -> TRM number [3;12]
969 // nTDC -> TDC number [0;14]
975 if (nTRM>=4 && nTRM<7) {
977 } else if (nTRM==7) {
978 if (nTDC<12) iPlate = 0;
980 } else if (nTRM>=8 && nTRM<11) {
982 } else if (nTRM==11) {
983 if (nTDC<9) iPlate = 1;
985 }else if (nTRM==12) {
989 } else if (iDDL==1) {
992 if (nTDC<3) iPlate = 0;
993 } else if (nTRM>=4 && nTRM<7) {
995 } else if (nTRM==7) {
996 if (nTDC<6) iPlate = 1;
998 } else if (nTRM>=8 && nTRM<11) {
1000 } else if (nTRM==11) {
1001 if (nTDC<9) iPlate = 2;
1003 } else if (nTRM==12) {
1007 } else if (iDDL==2) {
1009 if (nTRM>=4 && nTRM<7) {
1011 } else if (nTRM==7) {
1012 if (nTDC<12) iPlate = 4;
1014 } else if (nTRM>=8 && nTRM<11) {
1016 } else if (nTRM==11) {
1017 if (nTDC<9) iPlate = 3;
1019 }else if (nTRM==12) {
1023 } else if (iDDL==3) {
1026 if (nTDC<3) iPlate = 4;
1027 } else if (nTRM>=4 && nTRM<7) {
1029 } else if (nTRM==7) {
1030 if (nTDC<6) iPlate = 3;
1032 } else if (nTRM>=8 && nTRM<11) {
1034 } else if (nTRM==11) {
1035 if (nTDC<9) iPlate = 2;
1037 } else if (nTRM==12) {
1047 //----------------------------------------------------------------------------
1048 Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
1051 // Returns the TOF strip number per module:
1052 // [0;14], in the central plates,
1053 // [0;18], in the intermediate and external plates
1054 // corresponding to the TOF equipment ID numbers:
1055 // iDDL -> DDL number per sector [0;3]
1056 // nTRM -> TRM number [3;12]
1057 // nTDC -> TDC number [0;14]
1064 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
1065 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
1066 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
1067 else if (nTRM== 7) {
1068 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
1069 else iStrip = (Int_t)(nTDC/3.) - 4;
1071 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
1072 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
1073 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
1074 else if (nTRM==11) {
1075 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
1076 else iStrip = (Int_t)(nTDC/3.) - 3;
1078 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
1080 } else if (iDDL==1) {
1082 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1083 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
1084 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1085 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1086 else if (nTRM== 7) {
1087 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
1088 else iStrip = 20 - (Int_t)(nTDC/3.);
1090 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
1091 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1092 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1093 else if (nTRM==11) {
1094 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
1095 else iStrip = 21 - (Int_t)(nTDC/3.);
1097 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
1099 } else if (iDDL==2) {
1101 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
1102 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1103 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1104 else if (nTRM== 7) {
1105 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
1106 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
1108 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1109 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1110 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1111 else if (nTRM==11) {
1112 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1113 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
1115 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1117 } else if (iDDL==3) {
1119 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1120 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1121 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1122 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1123 else if (nTRM== 7) {
1124 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
1125 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1127 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1128 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1129 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1130 else if (nTRM==11) {
1131 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1132 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1134 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1142 //----------------------------------------------------------------------------
1143 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
1147 // Returns the TOF pad number per strip [0;95]
1148 // corresponding to the TOF equipment ID numbers:
1149 // iDDL -> DDL number per sector [0;3]
1150 // iChain -> TRM chain number [0;1]
1151 // nTDC -> TDC number [0;14]
1152 // iCH -> TDC channel number [0;7]
1155 Int_t iPadAlongTheStrip = -1;
1158 //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1159 //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1160 //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
1163 Int_t iTDClocal = -1;
1164 Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1165 Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1166 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1167 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
1169 Int_t iCHlocal = iCH;
1170 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1172 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1174 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1175 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1176 std::cerr << "Problems with the padX number!" << endl;
1177 //AliWarning("Problems with the padX number!");
1179 return iPadAlongTheStrip;
1183 //----------------------------------------------------------------------------
1184 Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1188 // Returns the TOF padX number [0;47]
1189 // corresponding to the TOF equipment ID numbers:
1190 // iDDL -> DDL number per sector [0;3]
1191 // iChain -> TRM chain number [0;1]
1192 // nTDC -> TDC number [0;14]
1193 // iCH -> TDC channel number [0;7]
1196 Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1197 (Float_t(AliTOFGeometry::NpadZ())));
1203 //----------------------------------------------------------------------------
1204 Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1208 // Returns the TOF padZ number [0;1]
1209 // corresponding to the TOF equipment ID numbers:
1210 // iDDL -> DDL number per sector [0;3]
1211 // iChain -> TRM chain number [0;1]
1212 // nTDC -> TDC number [0;14]
1213 // iCH -> TDC channel number [0;7]
1216 Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1222 //----------------------------------------------------------------------------
1223 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const
1226 // Returns the sector number [0;17]
1227 // corresponing to the assigned DRM/DDL number [0;71]
1230 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1235 //----------------------------------------------------------------------------
1236 Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const
1239 // Return the DRM/DDL number per sector [0;3]
1240 // corresponing to the assigned DRM/DDL number [0;71]
1243 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1249 //----------------------------------------------------------------------------
1250 void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1252 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1254 //----------------------------------------------------------------------------
1255 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1256 Int_t nTDC, Int_t iCH,
1257 Int_t *volume) const
1261 // nDDL (variable in [0;71]) -> number of the DDL file
1262 // nTRM (variable in [3;12]) -> number of the TRM slot
1263 // iChain (variable in [0; 1]) -> number of the TRM chain
1264 // nTDC (variable in [0;14]) -> number of the TDC
1265 // iCH (variable in [0; 7]) -> number of the TDC channel
1268 // sector number, i.e. volume[0] (variable in [0,17])
1269 // plate number, i.e. volume[1] (variable in [0, 5])
1270 // strip number, i.e. volume[2] (variable in [0,14/18])
1271 // padX number, i.e. volume[3] (variable in [0,47])
1272 // padZ number, i.e. volume[4] (variable in [0, 1])
1275 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1277 Int_t iSector = GetSectorNumber(nDDL);
1279 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1282 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
1283 AliWarning("Problems with the plate number!");
1286 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1289 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
1290 AliWarning("Problems with the strip number!");
1293 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1294 if (iPadAlongTheStrip==-1){
1296 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
1297 AliWarning("Problems with the pad number along the strip!");
1300 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1301 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1303 //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1304 //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1306 //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1307 //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1309 volume[0] = iSector;
1316 //-----------------------------------------------------------------------------
1317 Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1319 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1322 //check and fix valid DDL range
1325 fRawReader->AddMinorErrorLog(kDDLMinError);
1326 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1330 fRawReader->AddMinorErrorLog(kDDLMaxError);
1331 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1334 //select required DDLs
1335 fRawReader->Select("TOF", nDDLMin, nDDLMax);
1338 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1340 return(Decode(verbose));
1342 //-----------------------------------------------------------------------------
1343 Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1345 // New decoder method
1348 Int_t currentEquipment;
1352 UChar_t *data = 0x0;
1354 //loop and read DDL headers
1355 while(fRawReader->ReadHeader()){
1357 //memory leak prevention (actually data should be always 0x0 here)
1361 //get equipment infos
1362 currentEquipment = fRawReader->GetEquipmentId();
1363 currentDDL = fRawReader->GetDDLID();
1364 const Int_t kDataSize = fRawReader->GetDataSize();
1365 const Int_t kDataWords = kDataSize / 4;
1366 data = new UChar_t[kDataSize];
1369 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1372 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1374 //read equipment payload
1375 if (!fRawReader->ReadNext(data, kDataSize))
1377 fRawReader->AddMajorErrorLog(kDDLdataReading);
1379 AliWarning("Error while reading DDL data. Go to next equipment");
1386 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1389 //set up the decoder
1390 fDecoder->SetVerbose(verbose);
1391 fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
1392 fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
1395 if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1396 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1397 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1405 fRawReader->Reset();
1408 AliInfo("All done");
1413 //---------------------------------------------------------------------------
1415 AliTOFRawStream::ResetBuffers()
1418 // To reset the buffers
1421 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1422 ResetDataBuffer(iDDL);
1423 ResetPackedDataBuffer(iDDL);
1427 //---------------------------------------------------------------------------
1429 AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1432 // To load the buffers
1435 fTOFrawData->Clear();
1439 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1441 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1442 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1443 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1448 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
1450 AliTOFHitData *hitData; //hit data pointer
1453 AliInfo("Filling TClonesArray ...");
1455 //loop over DDL packed hits
1456 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
1457 hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
1458 Int_t hitACQ = hitData->GetACQ();
1459 Int_t hitPS = hitData->GetPS();
1460 Int_t hitSlotID = hitData->GetSlotID();
1461 Int_t hitChain = hitData->GetChain();
1462 Int_t hitTDC = hitData->GetTDC();
1463 Int_t hitChan = hitData->GetChan();
1464 Int_t hitTimeBin = hitData->GetTimeBin();
1465 Int_t hitTOTBin = hitData->GetTOTBin();
1467 Int_t hitLeading = hitData->GetTimeBin()
1469 fCableLengthMap->GetCableTimeShiftBin(indexDDL, hitSlotID, hitChain, hitTDC);//-1; // adc
1470 Int_t hitTrailing = -1;
1471 Int_t hitError = -1;
1473 TClonesArray &arrayTofRawData = *fTOFrawData;
1474 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
1481 AliInfo("Resetting buffers ...");
1483 fDataBuffer[indexDDL]->Reset();
1484 fPackedDataBuffer[indexDDL]->Reset();