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"
105 #include "AliTOFHitData.h"
107 ClassImp(AliTOFRawStream)
110 //_____________________________________________________________________________
111 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
112 fRawReader(rawReader),
114 fDecoder(new AliTOFDecoder()),
139 fInsideTRMchain0(kFALSE),
140 fInsideTRMchain1(kFALSE)
143 // create an object to read TOF raw digits
146 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
147 fDataBuffer[i]=new AliTOFHitDataBuffer();
148 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
151 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
152 fTOFrawData->SetOwner();
155 fRawReader->Select("TOF");
158 //_____________________________________________________________________________
159 AliTOFRawStream::AliTOFRawStream():
162 fDecoder(new AliTOFDecoder()),
187 fInsideTRMchain0(kFALSE),
188 fInsideTRMchain1(kFALSE)
193 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
194 fDataBuffer[i]=new AliTOFHitDataBuffer();
195 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
198 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
199 fTOFrawData->SetOwner();
202 //_____________________________________________________________________________
203 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
207 fDecoder(new AliTOFDecoder()),
232 fInsideTRMchain0(kFALSE),
233 fInsideTRMchain1(kFALSE)
239 fRawReader = stream.fRawReader;
241 fTOFrawData = stream.fTOFrawData;
245 fTRMchain = stream.fTRMchain;
247 fTDCchannel = stream.fTDCchannel;
248 fTime = stream.fTime;
250 fLeadingEdge = stream.fLeadingEdge;
251 fTrailingEdge = stream.fTrailingEdge;
253 fErrorFlag = stream.fErrorFlag;
255 fSector = stream.fSector;
256 fPlate = stream.fPlate;
257 fStrip = stream.fStrip;
258 fPadX = stream.fPadX;
259 fPadZ = stream.fPadZ;
261 fPackedDigits = stream.fPackedDigits;
263 fWordType = stream.fWordType;
264 fSlotID = stream.fSlotID;
266 fPSbit = stream.fPSbit;
267 fTDCerrorFlag = stream.fTDCerrorFlag;
268 fInsideDRM = stream.fInsideDRM;
269 fInsideTRM = stream.fInsideTRM;
270 fInsideLTM = stream.fInsideLTM;
271 fInsideTRMchain0 = stream.fInsideTRMchain0;
272 fInsideTRMchain1 = stream.fInsideTRMchain1;
274 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
275 fDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fDataBuffer[i]);
276 fPackedDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fPackedDataBuffer[i]);
279 fTOFrawData = new TClonesArray(*stream.fTOFrawData);
283 //_____________________________________________________________________________
284 AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
287 // assignment operator
290 fRawReader = stream.fRawReader;
292 fTOFrawData = stream.fTOFrawData;
296 fTRMchain = stream.fTRMchain;
298 fTDCchannel = stream.fTDCchannel;
299 fTime = stream.fTime;
301 fLeadingEdge = stream.fLeadingEdge;
302 fTrailingEdge = stream.fTrailingEdge;
303 fErrorFlag = stream.fErrorFlag;
305 fSector = stream.fSector;
306 fPlate = stream.fPlate;
307 fStrip = stream.fStrip;
308 fPadX = stream.fPadX;
309 fPadZ = stream.fPadZ;
311 fPackedDigits = stream.fPackedDigits;
313 fWordType = stream.fWordType;
314 fSlotID = stream.fSlotID;
316 fPSbit = stream.fPSbit;
317 fTDCerrorFlag = stream.fTDCerrorFlag;
318 fInsideDRM = stream.fInsideDRM;
319 fInsideTRM = stream.fInsideTRM;
320 fInsideLTM = stream.fInsideLTM;
321 fInsideTRMchain0 = stream.fInsideTRMchain0;
322 fInsideTRMchain1 = stream.fInsideTRMchain1;
324 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
325 fDataBuffer[i] = stream.fDataBuffer[i];
326 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
329 fTOFrawData = stream.fTOFrawData;
335 //_____________________________________________________________________________
336 AliTOFRawStream::~AliTOFRawStream()
342 for (Int_t i=0;i<72;i++){
343 delete fDataBuffer[i];
344 delete fPackedDataBuffer[i];
349 fTOFrawData->Clear();
354 //_____________________________________________________________________________
356 void AliTOFRawStream::LoadRawData(Int_t indexDDL)
362 fTOFrawData->Clear();
364 TClonesArray &arrayTofRawData = *fTOFrawData;
368 // create raw data map
369 AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
372 Int_t slot[4] = {-1, -1, -1, -1};
375 fRawReader->Select("TOF", indexDDL, indexDDL);
377 Bool_t signal = kFALSE;
379 AliTOFrawData *rawDigit = NULL;
383 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
385 AliDebug(2,Form(" %2i %1i %2i %1i %2i \n", fSector, fPlate, fStrip, fPadZ, fPadX));
390 slot[3] = fTDCchannel;
392 if (rawMap->TestHit(slot) != kEmpty) {
394 rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
396 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
397 fLeadingEdge==-1 && fTrailingEdge!=-1) {
399 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
401 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
402 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
407 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
409 rawMap->SetHit(slot);
417 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
419 rawMap->SetHit(slot);
421 } // else if (rawMap->TestHit(slot) == kEmpty)
425 } // closed -> while (Next())
431 //_____________________________________________________________________________
432 Bool_t AliTOFRawStream::Next()
435 // Read next 32-bit word in TOF raw data files
436 // returns kFALSE if there is no word left
441 if (!fRawReader->ReadNextInt(data)) return kFALSE;
443 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
455 fDDL = fRawReader->GetDDLID();
457 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
459 switch (fWordType) { // switch word type
461 case GLOBAL_HEADER_TYPE: // global header
462 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
466 switch (fSlotID) { // switch global header slot ID
468 case DRM_ID_NUMBER: //DRM global header
469 if (fInsideDRM) { // unexpected DRM global headers -> exit
472 fInsideDRM = kTRUE; // DRM global header accepted
475 case LTM_ID_NUMBER: // LTM global header
476 if (fInsideLTM) { // unexpected LTM global headers -> exit
479 fInsideLTM = kTRUE; // LTM global header accepted
489 case 10: //TRM header
490 case 11: //TRM header
491 case 12: //TRM header
492 if (fInsideTRM) { // unexpected TRM global headers -> exit
495 fInsideTRM = kTRUE; // TRM global header accepted
496 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
499 default: // unexpected global header slot ID
502 } //end switch global header slot id
507 case GLOBAL_TRAILER_TYPE: // global trailer
508 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
511 switch (fSlotID) { // switch global trailer slot ID
513 case DRM_ID_NUMBER: // DRM global trailer
514 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
517 fInsideDRM = kFALSE; // DRM global trailer accepted
520 fInsideTRMchain0 = kFALSE;
521 fInsideTRMchain1 = kFALSE;
541 case LTM_ID_NUMBER: // LTM global trailer
542 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
545 fInsideLTM = kFALSE; // LTM global trailer accepted
547 case 15: //TRM global trailer
548 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
551 fInsideTRM = kFALSE; // TRM global trailer accepted
553 default: // unexpected global trailer slot ID
555 } //end switch global trailer slot id
561 case ERROR_TYPE: // TDC error
562 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
563 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
567 case FILLER_TYPE: // filler
571 default: // other word types
573 if (fInsideTRM) { // inside TRM
575 switch (fWordType) { // switch word type inside TRM
576 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
577 if (fInsideTRMchain0) { // unexpected TRM chain0 header
580 fInsideTRMchain0 = kTRUE;
583 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
584 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
587 fInsideTRMchain0 = kFALSE;
590 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
591 if (fInsideTRMchain1) { // unexpected TRM chain1 header
594 fInsideTRMchain1 = kTRUE;
597 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
598 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
601 fInsideTRMchain1 = kFALSE;
604 } // end switch word type inside TRM
606 } // end if (fInsideTRM)
610 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
611 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
612 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
613 ){ // inside TRM chains
615 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
616 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
617 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
618 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
627 switch (fPSbit) { // switch fPSbit bits inside TRM chains
629 case 0: // packing ok, digit time and TOT
630 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
631 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
634 case 1: // leading edge digit, long digit time, no TOT
637 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
640 case 2: // trailing edge digit, long digit time, no TOT
643 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
646 case 3: // TOT overflow
647 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
648 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
651 } // end switch PS bits inside TRM chains
653 } // end if is inside TRM chains
655 } // end switch on fWordType
661 //_____________________________________________________________________________
663 void AliTOFRawStream::SetSector()
666 // Evaluate the TOF sector number -> [ 0;17]
667 // corresponding to the TOF equipment IDs:
670 // fTRMchain -> [ 0; 1]
672 // fTDCchannel -> [ 0; 7]
677 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
682 //_____________________________________________________________________________
685 void AliTOFRawStream::SetPlate()
688 // Evaluate the TOF plate number ->[ 0; 4]
689 // corresponding to the TOF equipment IDs:
692 // fTRMchain -> [ 0; 1]
694 // fTDCchannel -> [ 0; 7]
698 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
700 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
705 //_____________________________________________________________________________
707 void AliTOFRawStream::SetStrip()
710 // Evaluate the TOF strip number per module -> [ 0; 14/18]
711 // corresponding to the TOF equipment IDs:
714 // fTRMchain -> [ 0; 1]
716 // fTDCchannel -> [ 0; 7]
721 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
722 || fSector==-1 || fPlate==-1))
723 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
728 //_____________________________________________________________________________
730 void AliTOFRawStream::SetPadZ()
733 // Evaluate the TOF padRow number per strip -> [ 0; 1]
734 // corresponding to the TOF equipment IDs:
737 // fTRMchain -> [ 0; 1]
739 // fTDCchannel -> [ 0; 7]
744 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
745 || fSector==-1 || fPlate==-1 || fStrip==-1))
747 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
748 if (iPadAlongTheStrip!=-1)
749 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
755 //_____________________________________________________________________________
757 void AliTOFRawStream::SetPadX()
760 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
761 // corresponding to the TOF equipment IDs:
764 // fTRMchain -> [ 0; 1]
766 // fTDCchannel -> [ 0; 7]
771 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
772 || fSector==-1 || fPlate==-1 || fStrip==-1))
774 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
775 if (iPadAlongTheStrip!=-1)
776 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
783 //----------------------------------------------------------------------------
784 Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
790 return ((word & fieldMask) >> fieldPosition);
793 //----------------------------------------------------------------------------
794 Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
797 // Returns the TOF plate number [0;4]
798 // corresponding to the TOF equipment ID numbers:
799 // iDDL -> DDL number per sector [0;3]
800 // nTRM -> TRM number [3;12]
801 // nTDC -> TDC number [0;14]
807 if (nTRM>=4 && nTRM<7) {
809 } else if (nTRM==7) {
810 if (nTDC<12) iPlate = 0;
812 } else if (nTRM>=8 && nTRM<11) {
814 } else if (nTRM==11) {
815 if (nTDC<9) iPlate = 1;
817 }else if (nTRM==12) {
821 } else if (iDDL==1) {
824 if (nTDC<3) iPlate = 0;
825 } else if (nTRM>=4 && nTRM<7) {
827 } else if (nTRM==7) {
828 if (nTDC<6) iPlate = 1;
830 } else if (nTRM>=8 && nTRM<11) {
832 } else if (nTRM==11) {
833 if (nTDC<9) iPlate = 2;
835 } else if (nTRM==12) {
839 } else if (iDDL==2) {
841 if (nTRM>=4 && nTRM<7) {
843 } else if (nTRM==7) {
844 if (nTDC<12) iPlate = 4;
846 } else if (nTRM>=8 && nTRM<11) {
848 } else if (nTRM==11) {
849 if (nTDC<9) iPlate = 3;
851 }else if (nTRM==12) {
855 } else if (iDDL==3) {
858 if (nTDC<3) iPlate = 4;
859 } else if (nTRM>=4 && nTRM<7) {
861 } else if (nTRM==7) {
862 if (nTDC<6) iPlate = 3;
864 } else if (nTRM>=8 && nTRM<11) {
866 } else if (nTRM==11) {
867 if (nTDC<9) iPlate = 2;
869 } else if (nTRM==12) {
879 //----------------------------------------------------------------------------
880 Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
883 // Returns the TOF strip number per module:
884 // [0;14], in the central plates,
885 // [0;18], in the intermediate and external plates
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]
896 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
897 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
898 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
900 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
901 else iStrip = (Int_t)(nTDC/3.) - 4;
903 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
904 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
905 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
907 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
908 else iStrip = (Int_t)(nTDC/3.) - 3;
910 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
912 } else if (iDDL==1) {
914 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
915 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
916 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
917 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
919 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
920 else iStrip = 20 - (Int_t)(nTDC/3.);
922 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
923 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
924 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
926 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
927 else iStrip = 21 - (Int_t)(nTDC/3.);
929 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
931 } else if (iDDL==2) {
933 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
934 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
935 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
937 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
938 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
940 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
941 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
942 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
944 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
945 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
947 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
949 } else if (iDDL==3) {
951 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
952 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
953 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
954 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
956 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
957 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
959 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
960 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
961 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
963 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
964 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
966 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
974 //----------------------------------------------------------------------------
975 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
979 // Returns the TOF pad number per strip [0;95]
980 // corresponding to the TOF equipment ID numbers:
981 // iDDL -> DDL number per sector [0;3]
982 // iChain -> TRM chain number [0;1]
983 // nTDC -> TDC number [0;14]
984 // iCH -> TDC channel number [0;7]
987 Int_t iPadAlongTheStrip = -1;
989 Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
991 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
992 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
994 Int_t iCHlocal = iCH;
995 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
997 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
999 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1000 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1001 std::cerr << "Problems with the padX number!" << endl;
1002 //AliWarning("Problems with the padX number!");
1004 return iPadAlongTheStrip;
1008 //----------------------------------------------------------------------------
1009 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const
1012 // Returns the sector number [0;17]
1013 // corresponing to the assigned DRM/DDL number [0;71]
1016 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1021 //----------------------------------------------------------------------------
1022 Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const
1025 // Return the DRM/DDL number per sector [0;3]
1026 // corresponing to the assigned DRM/DDL number [0;71]
1029 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1035 //----------------------------------------------------------------------------
1036 void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1038 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1040 //----------------------------------------------------------------------------
1041 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1042 Int_t nTDC, Int_t iCH,
1043 Int_t *volume) const
1047 // nDDL (variable in [0;71]) -> number of the DDL file
1048 // nTRM (variable in [3;12]) -> number of the TRM slot
1049 // iChain (variable in [0; 1]) -> number of the TRM chain
1050 // nTDC (variable in [0;14]) -> number of the TDC
1051 // iCH (variable in [0; 7]) -> number of the TDC channel
1054 // sector number, i.e. volume[0] (variable in [0,17])
1055 // plate number, i.e. volume[1] (variable in [0, 5])
1056 // strip number, i.e. volume[2] (variable in [0,14/18])
1057 // padX number, i.e. volume[3] (variable in [0,47])
1058 // padZ number, i.e. volume[4] (variable in [0, 1])
1061 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1063 Int_t iSector = GetSectorNumber(nDDL);
1065 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1068 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
1069 AliWarning("Problems with the plate number!");
1072 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1075 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
1076 AliWarning("Problems with the strip number!");
1079 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1080 if (iPadAlongTheStrip==-1){
1082 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
1083 AliWarning("Problems with the pad number along the strip!");
1086 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1087 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1089 volume[0] = iSector;
1096 //-----------------------------------------------------------------------------
1097 Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1099 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1102 //check and fix valid DDL range
1105 fRawReader->AddMinorErrorLog(kDDLMinError);
1106 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1110 fRawReader->AddMinorErrorLog(kDDLMaxError);
1111 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1114 //select required DDLs
1115 fRawReader->Select("TOF", nDDLMin, nDDLMax);
1118 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1120 return(Decode(verbose));
1122 //-----------------------------------------------------------------------------
1123 Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1125 // New decoder method
1128 Int_t currentEquipment;
1132 UChar_t *data = 0x0;
1134 //loop and read DDL headers
1135 while(fRawReader->ReadHeader()){
1137 //memory leak prevention (actually data should be always 0x0 here)
1141 //get equipment infos
1142 currentEquipment = fRawReader->GetEquipmentId();
1143 currentDDL = fRawReader->GetDDLID();
1144 const Int_t kDataSize = fRawReader->GetDataSize();
1145 const Int_t kDataWords = kDataSize / 4;
1146 data = new UChar_t[kDataSize];
1149 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1152 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1154 //read equipment payload
1155 if (!fRawReader->ReadNext(data, kDataSize))
1157 fRawReader->AddMajorErrorLog(kDDLdataReading);
1159 AliWarning("Error while reading DDL data. Go to next equipment");
1166 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1169 //set up the decoder
1170 fDecoder->SetVerbose(verbose);
1171 fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
1172 fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
1175 if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1176 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1177 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1185 fRawReader->Reset();
1188 AliInfo("All done");
1193 //---------------------------------------------------------------------------
1195 AliTOFRawStream::ResetBuffers()
1198 // To reset the buffers
1201 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1202 ResetDataBuffer(iDDL);
1203 ResetPackedDataBuffer(iDDL);
1207 //---------------------------------------------------------------------------
1209 AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1212 // To load the buffers
1215 fTOFrawData->Clear();
1219 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1221 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1222 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1223 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1228 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
1230 AliTOFHitData *hitData; //hit data pointer
1233 AliInfo("Filling TClonesArray ...");
1235 //loop over DDL packed hits
1236 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
1237 hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
1238 Int_t hitACQ = hitData->GetACQ();
1239 Int_t hitPS = hitData->GetPS();
1240 Int_t hitSlotID = hitData->GetSlotID();
1241 Int_t hitChain = hitData->GetChain();
1242 Int_t hitTDC = hitData->GetTDC();
1243 Int_t hitChan = hitData->GetChan();
1244 Int_t hitTimeBin = hitData->GetTimeBin();
1245 Int_t hitTOTBin = hitData->GetTOTBin();
1247 Int_t hitLeading = hitData->GetTimeBin();//-1; // adc
1248 Int_t hitTrailing = -1;
1249 Int_t hitError = -1;
1251 TClonesArray &arrayTofRawData = *fTOFrawData;
1252 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
1259 AliInfo("Resetting buffers ...");
1261 fDataBuffer[indexDDL]->Reset();
1262 fPackedDataBuffer[indexDDL]->Reset();