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 "TClonesArray.h"
96 #include "AliRawReader.h"
98 #include "AliTOFGeometry.h"
99 #include "AliTOFrawData.h"
100 #include "AliTOFRawMap.h"
101 #include "AliTOFRawStream.h"
104 ClassImp(AliTOFRawStream)
107 //_____________________________________________________________________________
108 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
109 fRawReader(rawReader),
110 // fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
112 fDecoder(new AliTOFDecoder()),
137 fInsideTRMchain0(kFALSE),
138 fInsideTRMchain1(kFALSE)
141 // create an object to read TOF raw digits
144 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
145 fDataBuffer[i]=new AliTOFHitDataBuffer();
146 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
149 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
150 fTOFrawData->SetOwner();
153 fRawReader->Select("TOF");
156 //_____________________________________________________________________________
157 AliTOFRawStream::AliTOFRawStream():
159 // fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
161 fDecoder(new AliTOFDecoder()),
186 fInsideTRMchain0(kFALSE),
187 fInsideTRMchain1(kFALSE)
192 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
193 fDataBuffer[i]=new AliTOFHitDataBuffer();
194 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
197 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
198 fTOFrawData->SetOwner();
201 //_____________________________________________________________________________
202 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
205 // fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
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)
360 for (Int_t indexDDL = 0;
361 indexDDL < AliDAQ::NumberOfDdls("TOF");
365 fTOFrawData->Clear();
366 //fTOFrawData = new TClonesArray("AliTOFrawData",1000); //potential memory leak
367 //fTOFrawData->Clear();
368 TClonesArray &arrayTofRawData = *fTOFrawData;
372 // create raw data map
373 AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
376 Int_t slot[4] = {-1, -1, -1, -1};
379 fRawReader->Select("TOF", indexDDL, indexDDL);
381 Bool_t signal = kFALSE;
383 AliTOFrawData *rawDigit = NULL;
387 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
389 //printf(" %2i %1i %2i %1i %2i \n", fSector, fPlate, fStrip, fPadZ, fPadX);
394 slot[3] = fTDCchannel;
396 if (rawMap->TestHit(slot) != kEmpty) {
398 rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
400 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
401 fLeadingEdge==-1 && fTrailingEdge!=-1) {
403 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
405 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
406 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
408 /* else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
409 (fTime!=-1 || fLeadingEdge!=-1 || fTrailingEdge!=-1))*/ /*||
410 (rawDigit->GetLeading()==-1 && rawDigit->GetTrailing()!=-1 &&
411 fLeadingEdge!=-1 && fTrailingEdge==-1) */)
414 //TClonesArray &arrayTofRawData = *fTOFrawData;
415 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
417 rawMap->SetHit(slot);
425 //TClonesArray &arrayTofRawData = *fTOFrawData;
426 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
428 rawMap->SetHit(slot);
430 } // else if (rawMap->TestHit(slot) == kEmpty)
434 } // closed -> while (Next())
437 fDDL = fRawReader->GetDDLID();
439 for (Int_t ii=0; ii<fTOFrawData->GetEntriesFast(); ii++) {
441 AliTOFrawData *dummy = (AliTOFrawData*)fTOFrawData->UncheckedAt(ii);
443 fTRM = dummy->GetTRM();
444 fTRMchain = dummy->GetTRMchain();
445 fTDC = dummy->GetTDC();
446 fTDCchannel = dummy->GetTDCchannel();
454 printf(" %2i, %2i %1i, %2i, %1i --> %2i, %1i, %2i, %1i, %2i \n",
455 fDDL, fTRM, fTRMchain, fTDC, fTDCchannel,
456 fSector, fPlate, fStrip, fPadZ, fPadX);
458 } // closed loop on TOF raw data TClonesArray
461 //} // closed loop on indexDDL
467 //_____________________________________________________________________________
468 Bool_t AliTOFRawStream::Next()
471 // Read next 32-bit word in TOF raw data files
472 // returns kFALSE if there is no word left
477 if (!fRawReader->ReadNextInt(data)) return kFALSE;
479 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
491 fDDL = fRawReader->GetDDLID();
493 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
495 switch (fWordType) { // switch word type
497 case GLOBAL_HEADER_TYPE: // global header
498 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
502 switch (fSlotID) { // switch global header slot ID
504 case DRM_ID_NUMBER: //DRM global header
505 if (fInsideDRM) { // unexpected DRM global headers -> exit
508 fInsideDRM = kTRUE; // DRM global header accepted
511 case LTM_ID_NUMBER: // LTM global header
512 if (fInsideLTM) { // unexpected LTM global headers -> exit
515 fInsideLTM = kTRUE; // LTM global header accepted
525 case 10: //TRM header
526 case 11: //TRM header
527 case 12: //TRM header
528 if (fInsideTRM) { // unexpected TRM global headers -> exit
531 fInsideTRM = kTRUE; // TRM global header accepted
532 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
535 default: // unexpected global header slot ID
538 } //end switch global header slot id
543 case GLOBAL_TRAILER_TYPE: // global trailer
544 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
547 switch (fSlotID) { // switch global trailer slot ID
549 case DRM_ID_NUMBER: // DRM global trailer
550 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
553 fInsideDRM = kFALSE; // DRM global trailer accepted
556 fInsideTRMchain0 = kFALSE;
557 fInsideTRMchain1 = kFALSE;
577 case LTM_ID_NUMBER: // LTM global trailer
578 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
581 fInsideLTM = kFALSE; // LTM global trailer accepted
583 case 15: //TRM global trailer
584 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
587 fInsideTRM = kFALSE; // TRM global trailer accepted
589 default: // unexpected global trailer slot ID
591 } //end switch global trailer slot id
597 case ERROR_TYPE: // TDC error
598 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
599 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
603 case FILLER_TYPE: // filler
607 default: // other word types
609 if (fInsideTRM) { // inside TRM
611 switch (fWordType) { // switch word type inside TRM
612 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
613 if (fInsideTRMchain0) { // unexpected TRM chain0 header
616 fInsideTRMchain0 = kTRUE;
619 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
620 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
623 fInsideTRMchain0 = kFALSE;
626 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
627 if (fInsideTRMchain1) { // unexpected TRM chain1 header
630 fInsideTRMchain1 = kTRUE;
633 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
634 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
637 fInsideTRMchain1 = kFALSE;
640 } // end switch word type inside TRM
642 } // end if (fInsideTRM)
646 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
647 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
648 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
649 ){ // inside TRM chains
651 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
652 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
653 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
654 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
663 switch (fPSbit) { // switch fPSbit bits inside TRM chains
665 case 0: // packing ok, digit time and TOT
666 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
667 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
670 case 1: // leading edge digit, long digit time, no TOT
673 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
676 case 2: // trailing edge digit, long digit time, no TOT
679 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
682 case 3: // TOT overflow
683 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
684 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
687 } // end switch PS bits inside TRM chains
689 } // end if is inside TRM chains
691 } // end switch on fWordType
697 //_____________________________________________________________________________
699 void AliTOFRawStream::SetSector()
702 // Evaluate the TOF sector number -> [ 0;17]
703 // corresponding to the TOF equipment IDs:
706 // fTRMchain -> [ 0; 1]
708 // fTDCchannel -> [ 0; 7]
713 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
718 //_____________________________________________________________________________
721 void AliTOFRawStream::SetPlate()
724 // Evaluate the TOF plate number ->[ 0; 4]
725 // corresponding to the TOF equipment IDs:
728 // fTRMchain -> [ 0; 1]
730 // fTDCchannel -> [ 0; 7]
734 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
736 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
741 //_____________________________________________________________________________
743 void AliTOFRawStream::SetStrip()
746 // Evaluate the TOF strip number per module -> [ 0; 14/18]
747 // corresponding to the TOF equipment IDs:
750 // fTRMchain -> [ 0; 1]
752 // fTDCchannel -> [ 0; 7]
757 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
758 || fSector==-1 || fPlate==-1))
759 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
764 //_____________________________________________________________________________
766 void AliTOFRawStream::SetPadZ()
769 // Evaluate the TOF padRow number per strip -> [ 0; 1]
770 // corresponding to the TOF equipment IDs:
773 // fTRMchain -> [ 0; 1]
775 // fTDCchannel -> [ 0; 7]
780 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
781 || fSector==-1 || fPlate==-1 || fStrip==-1))
783 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
784 if (iPadAlongTheStrip!=-1)
785 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
791 //_____________________________________________________________________________
793 void AliTOFRawStream::SetPadX()
796 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
797 // corresponding to the TOF equipment IDs:
800 // fTRMchain -> [ 0; 1]
802 // fTDCchannel -> [ 0; 7]
807 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
808 || fSector==-1 || fPlate==-1 || fStrip==-1))
810 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
811 if (iPadAlongTheStrip!=-1)
812 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
819 //----------------------------------------------------------------------------
820 Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
826 return ((word & fieldMask) >> fieldPosition);
829 //----------------------------------------------------------------------------
830 Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) const
833 // Returns the TOF plate number [0;4]
834 // corresponding to the TOF equipment ID numbers:
835 // iDDL -> DDL number per sector [0;3]
836 // nTRM -> TRM number [3;12]
837 // nTDC -> TDC number [0;14]
843 if (nTRM>=4 && nTRM<7) {
845 } else if (nTRM==7) {
846 if (nTDC<12) iPlate = 0;
848 } else if (nTRM>=8 && nTRM<11) {
850 } else if (nTRM==11) {
851 if (nTDC<9) iPlate = 1;
853 }else if (nTRM==12) {
857 } else if (iDDL==1) {
860 if (nTDC<3) iPlate = 0;
861 } else if (nTRM>=4 && nTRM<7) {
863 } else if (nTRM==7) {
864 if (nTDC<6) iPlate = 1;
866 } else if (nTRM>=8 && nTRM<11) {
868 } else if (nTRM==11) {
869 if (nTDC<9) iPlate = 2;
871 } else if (nTRM==12) {
875 } else if (iDDL==2) {
877 if (nTRM>=4 && nTRM<7) {
879 } else if (nTRM==7) {
880 if (nTDC<12) iPlate = 4;
882 } else if (nTRM>=8 && nTRM<11) {
884 } else if (nTRM==11) {
885 if (nTDC<9) iPlate = 3;
887 }else if (nTRM==12) {
891 } else if (iDDL==3) {
894 if (nTDC<3) iPlate = 4;
895 } else if (nTRM>=4 && nTRM<7) {
897 } else if (nTRM==7) {
898 if (nTDC<6) iPlate = 3;
900 } else if (nTRM>=8 && nTRM<11) {
902 } else if (nTRM==11) {
903 if (nTDC<9) iPlate = 2;
905 } else if (nTRM==12) {
915 //----------------------------------------------------------------------------
916 Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC) const
919 // Returns the TOF strip number per module:
920 // [0;14], in the central plates,
921 // [0;18], in the intermediate and external plates
922 // corresponding to the TOF equipment ID numbers:
923 // iDDL -> DDL number per sector [0;3]
924 // nTRM -> TRM number [3;12]
925 // nTDC -> TDC number [0;14]
932 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
933 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
934 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
936 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
937 else iStrip = (Int_t)(nTDC/3.) - 4;
939 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
940 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
941 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
943 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
944 else iStrip = (Int_t)(nTDC/3.) - 3;
946 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
948 } else if (iDDL==1) {
950 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
951 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
952 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
953 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
955 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
956 else iStrip = 20 - (Int_t)(nTDC/3.);
958 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
959 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
960 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
962 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
963 else iStrip = 21 - (Int_t)(nTDC/3.);
965 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
967 } else if (iDDL==2) {
969 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
970 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
971 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
973 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
974 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
976 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
977 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
978 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
980 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
981 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
983 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
985 } else if (iDDL==3) {
987 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
988 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
989 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
990 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
992 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
993 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
995 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
996 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
997 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
999 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1000 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1002 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1010 //----------------------------------------------------------------------------
1011 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
1015 // Returns the TOF pad number per strip [0;95]
1016 // corresponding to the TOF equipment ID numbers:
1017 // iDDL -> DDL number per sector [0;3]
1018 // iChain -> TRM chain number [0;1]
1019 // nTDC -> TDC number [0;14]
1020 // iCH -> TDC channel number [0;7]
1023 Int_t iPadAlongTheStrip = -1;
1025 Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1027 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1028 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
1030 Int_t iCHlocal = iCH;
1031 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1033 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1035 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1036 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1037 fRawReader->AddMajorErrorLog(kPadXError);
1038 AliWarning("Problems with the padX number!");
1040 return iPadAlongTheStrip;
1044 //----------------------------------------------------------------------------
1045 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const
1048 // Returns the sector number [0;17]
1049 // corresponing to the assigned DRM/DDL number [0;71]
1052 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1057 //----------------------------------------------------------------------------
1058 Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const
1061 // Return the DRM/DDL number per sector [0;3]
1062 // corresponing to the assigned DRM/DDL number [0;71]
1065 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1071 //----------------------------------------------------------------------------
1072 void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1074 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1076 //----------------------------------------------------------------------------
1077 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1078 Int_t nTDC, Int_t iCH,
1079 Int_t *volume) const
1083 // nDDL (variable in [0;71]) -> number of the DDL file
1084 // nTRM (variable in [3;12]) -> number of the TRM slot
1085 // iChain (variable in [0; 1]) -> number of the TRM chain
1086 // nTDC (variable in [0;14]) -> number of the TDC
1087 // iCH (variable in [0; 7]) -> number of the TDC channel
1090 // sector number, i.e. volume[0] (variable in [0,17])
1091 // plate number, i.e. volume[1] (variable in [0, 5])
1092 // strip number, i.e. volume[2] (variable in [0,14/18])
1093 // padX number, i.e. volume[3] (variable in [0,47])
1094 // padZ number, i.e. volume[4] (variable in [0, 1])
1097 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1099 Int_t iSector = GetSectorNumber(nDDL);
1101 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1103 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
1104 AliWarning("Problems with the plate number!");
1107 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1109 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
1110 AliWarning("Problems with the strip number!");
1113 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1114 if (iPadAlongTheStrip==-1){
1115 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
1116 AliWarning("Problems with the pad number along the strip!");
1119 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1120 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1122 volume[0] = iSector;
1129 //-----------------------------------------------------------------------------
1130 Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1132 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1135 //check and fix valid DDL range
1138 fRawReader->AddMinorErrorLog(kDDLMinError);
1139 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1143 fRawReader->AddMinorErrorLog(kDDLMaxError);
1144 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1147 //select required DDLs
1148 fRawReader->Select("TOF", nDDLMin, nDDLMax);
1151 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1153 return(Decode(verbose));
1155 //-----------------------------------------------------------------------------
1156 Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1158 // New decoder method
1161 Int_t currentEquipment;
1165 UChar_t *data = 0x0;
1167 //loop and read DDL headers
1168 while(fRawReader->ReadHeader()){
1170 //memory leak prevention (actually data should be always 0x0 here)
1174 //get equipment infos
1175 currentEquipment = fRawReader->GetEquipmentId();
1176 currentDDL = fRawReader->GetDDLID();
1177 const Int_t kDataSize = fRawReader->GetDataSize();
1178 const Int_t kDataWords = kDataSize / 4;
1179 data = new UChar_t[kDataSize];
1182 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1185 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1187 //read equipment payload
1188 if (!fRawReader->ReadNext(data, kDataSize))
1190 fRawReader->AddMajorErrorLog(kDDLdataReading);
1192 AliWarning("Error while reading DDL data. Go to next equipment");
1199 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1202 //set up the decoder
1203 fDecoder->SetVerbose(verbose);
1204 fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
1205 fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
1208 if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1209 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1210 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1218 fRawReader->Reset();
1221 AliInfo("All done");
1226 //---------------------------------------------------------------------------
1228 AliTOFRawStream::ResetBuffers()
1231 // To reset the buffers
1234 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1235 ResetDataBuffer(iDDL);
1236 ResetPackedDataBuffer(iDDL);
1240 //---------------------------------------------------------------------------
1242 AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1245 // To load the buffers
1248 fTOFrawData->Clear();
1252 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1254 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1255 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1256 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1261 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
1263 AliTOFHitData *hitData; //hit data pointer
1266 AliInfo("Filling TClonesArray ...");
1268 //loop over DDL packed hits
1269 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
1270 hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
1271 Int_t hitACQ = hitData->GetACQ();
1272 Int_t hitPS = hitData->GetPS();
1273 Int_t hitSlotID = hitData->GetSlotID();
1274 Int_t hitChain = hitData->GetChain();
1275 Int_t hitTDC = hitData->GetTDC();
1276 Int_t hitChan = hitData->GetChan();
1277 Int_t hitTimeBin = hitData->GetTimeBin();
1278 Int_t hitTOTBin = hitData->GetTOTBin();
1280 Int_t hitLeading = -1;
1281 Int_t hitTrailing = -1;
1282 Int_t hitError = -1;
1284 TClonesArray &arrayTofRawData = *fTOFrawData;
1285 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
1292 AliInfo("Resetting buffers ...");
1294 fDataBuffer[indexDDL]->Reset();
1295 fPackedDataBuffer[indexDDL]->Reset();