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 **************************************************************************/
19 Added lookup tables for
20 TRM number 3 in the left crates (TOF OR signals)
21 and detector elements (A.Silenzi)
23 Revision 1.19.1 2008/09/19 preghenella
24 Decode method updated:
25 it reads the CDH from the rawReader and sends it to the decoder;
26 LoadRawDataBuffers modified:
27 it corrects tof hit infos per ddlBC and deltaBC offsets
28 (in case of the static member fgApplyBCCorrections
29 has been setted to kTRUE);
30 Added static member fgApplyBCCorrections (kTRUE by default)
31 and the related static method ApplyBCCorrections;
33 Revision 1.19 2007/05/18 13:07:53 decaro
34 Error messages stored in the global raw-reader error log (Cvetan, Chiara)
36 Revision 1.18 2007/05/08 11:53:29 arcelli
37 Improved class flexibility for further use (R.Preghenella)
39 Revision 1.17 2007/05/03 08:53:50 decaro
40 Coding convention: RS3 violation -> suppression
42 Revision 1.16 2007/05/03 08:22:22 decaro
43 Coding convention: RN17 violation -> suppression
45 Revision 1.15 2007/04/30 15:22:06 arcelli
46 Change TOF digit Time, Tot etc to int type
48 Revision 1.14 2007/04/27 11:11:53 arcelli
49 updates for the new decoder
51 Revision 1.13 2007/03/16 11:46:35 decaro
52 Coding convention: RN17 rule violation -> suppression
54 Revision 1.12 2007/02/22 09:43:45 decaro
55 Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
57 Revision 1.11 2007/02/20 15:57:00 decaro
58 Raw data update: to read the TOF raw data defined in UNPACKED mode
60 Revision 1.10 2006/12/15 14:01:38 cvetan
63 Revision 1.9 2006/10/13 11:22:27 arcelli
64 remove warnings due to uninitialized AliTOFtdcDigit data members
66 Revision 1.8 2006/08/22 13:30:17 arcelli
67 removal of effective c++ warnings (C.Zampolli)
69 Revision 1.7 2006/08/10 14:46:54 decaro
70 TOF raw data format: updated version
72 Revision 1.6.1 2006/06/28 A. De Caro, R. Preghenella:
73 Update TOF raw data format
74 according to the final version
75 (see the ALICE internal note in preparation
76 'ALICE TOF raw data format')
77 Added the methods for the correspoonding numbering
78 between the equipment IDs and the volume IDs:
83 Revision 0.02 2005/07/28 A. De Caro:
84 Update format TOF raw data
86 Correction of few wrong corrispondences
87 between 'software' and 'hardware' numberings
89 Revision 0.01 2005/07/22 A. De Caro
90 Implement methods Next()
98 ////////////////////////////////////////////////////////////////////////
100 // This class provides access to TOF raw data in DDL files. //
102 // It loops over all TOF raw data given by the AliRawReader. //
104 ////////////////////////////////////////////////////////////////////////
107 #include "Riostream.h"
109 #include "TClonesArray.h"
110 #include "TStopwatch.h"
114 #include "AliRawReader.h"
116 #include "AliTOFGeometry.h"
117 #include "AliTOFrawData.h"
118 #include "AliTOFRawMap.h"
119 #include "AliTOFRawStream.h"
120 #include "AliTOFdigit.h"
121 #include "AliTOFSDigit.h"
122 //#include "AliTOFCableLengthMap.h"
124 #include "AliTOFHitData.h"
126 #include "AliRawEventHeaderBase.h"
127 #include "AliRawDataHeader.h"
129 #include "AliTOFDecoderV2.h"
130 #include "AliTOFTDCHit.h"
131 #include "AliTOFDecoderSummaryData.h"
132 #include "AliTOFDRMSummaryData.h"
133 #include "AliTOFLTMSummaryData.h"
134 #include "AliTOFTRMSummaryData.h"
135 #include "AliTOFChainSummaryData.h"
136 #include "AliTOFTDCHitBuffer.h"
137 #include "AliTOFTDCErrorBuffer.h"
139 ClassImp(AliTOFRawStream)
141 const Int_t AliTOFRawStream::fgkddlBCshift[72] =
163 const Int_t AliTOFRawStream::fgkStrip0MapCrate0[]=
164 {1,3,5,7,9,11,13,15,17,0,2,4,6,8,10,12,14,16,18,1,3,5,7,-1};
165 const Int_t AliTOFRawStream::fgkStrip1MapCrate0[]=
166 {0,2,4,6,8,10,12,14,16,18,1,3,5,7,9,11,13,15,17,0,2,4,6,-1};
167 const Int_t AliTOFRawStream::fgkStrip0MapCrate1[]=
168 {1,3,5,7,9,11,13,15,17,0,2,4,6,8,10,12,14,16,18,1,3,5,7,-1};
169 const Int_t AliTOFRawStream::fgkStrip1MapCrate1[]=
170 {0,2,4,6,8,10,12,14,16,18,1,3,5,7,9,11,13,15,17,0,2,4,6,-1};
171 const Int_t AliTOFRawStream::fgkStrip0MapCrate2[]=
172 {17,15,13,11, 9,7,5,3,1,18,16,14,12,10,8,6,4,2, 0,13,11, 9,7,-1};
173 const Int_t AliTOFRawStream::fgkStrip1MapCrate2[]=
174 {18,16,14,12,10,8,6,4,2, 0,17,15,13,11,9,7,5,3, 1,14,12,10,8,-1};
175 const Int_t AliTOFRawStream::fgkStrip0MapCrate3[]=
176 {17,15,13,11, 9,7,5,3,1,18,16,14,12,10,8,6,4,2, 0,13,11, 9,7,-1};
177 const Int_t AliTOFRawStream::fgkStrip1MapCrate3[]=
178 {18,16,14,12,10,8,6,4,2, 0,17,15,13,11,9,7,5,3, 1,14,12,10,8,-1};
181 const Int_t AliTOFRawStream::fgkModule0MapCrate0[]=
182 {0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
183 const Int_t AliTOFRawStream::fgkModule1MapCrate0[]=
184 {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
185 const Int_t AliTOFRawStream::fgkModule0MapCrate1[]=
186 {0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
187 const Int_t AliTOFRawStream::fgkModule1MapCrate1[]=
188 {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
190 const Int_t AliTOFRawStream::fgkModule0MapCrate2[]=
191 {4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
192 const Int_t AliTOFRawStream::fgkModule1MapCrate2[]=
193 {4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
194 const Int_t AliTOFRawStream::fgkModule0MapCrate3[]=
195 {4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
196 const Int_t AliTOFRawStream::fgkModule1MapCrate3[]=
197 {4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
199 const Int_t AliTOFRawStream::fgkChannelMap0[5][19]=
200 {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9},
201 {9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18},
202 {19,19,20,20,21,21,22,22,22,21,21,20,20,19,19,-1,-1,-1,-1},
203 {18,18,17,17,16,16,15,15,14,14,13,13,12,12,11,11,10,10,9},
204 {9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0}
207 const Int_t AliTOFRawStream::fgkChainMap0[5][19]=
208 {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
209 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
210 {0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,-1,-1,-1},
211 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
212 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
215 const Int_t AliTOFRawStream::fgkChannelMap24[5][19]=
216 {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9},
217 {9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18},
218 {19,19,20,20,21,21,22,22,22,21,21,20,20,19,19,-1,-1,-1,-1},
219 {18,18,17,17,16,16,15,15,14,14,13,13,12,12,11,11,10,10,9},
220 {9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0}
223 const Int_t AliTOFRawStream::fgkChainMap24[5][19]=
224 {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
225 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
226 {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,-1,-1,-1,-1},
227 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
228 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
231 Bool_t AliTOFRawStream::fgApplyBCCorrections = kTRUE;
232 //_____________________________________________________________________________
233 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
234 fRawReader(rawReader),
235 fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
236 fDecoder(new AliTOFDecoder()),
237 fDecoderV2(new AliTOFDecoderV2()),
262 fInsideTRMchain0(kFALSE),
263 fInsideTRMchain1(kFALSE),
265 //fPackedDataBuffer(),
266 fLocalEventCounterDRM(-1),
267 fLocalEventCounterLTM(-1),
268 //fLocalEventCounterTRM(),
269 //fLocalEventCounterChain(),
271 //fCableLengthMap(new AliTOFCableLengthMap()),
273 fNewDecoderVersion(0)
276 // create an object to read TOF raw digits
279 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
281 ResetPackedDataBuffer(i);
284 //fTOFrawData = new TClonesArray("AliTOFrawData",1000);
285 fTOFrawData->SetOwner();
288 fRawReader->Select("TOF");
290 for (Int_t jj=0;jj<13;jj++) {
291 fLocalEventCounterTRM[jj] = -1;
292 for (Int_t ii=0;ii<2;ii++) {
293 fLocalEventCounterChain[jj][ii] = -1;
294 fChainBunchID[jj][ii] = -1;
300 //_____________________________________________________________________________
301 AliTOFRawStream::AliTOFRawStream():
303 fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
304 fDecoder(new AliTOFDecoder()),
305 fDecoderV2(new AliTOFDecoderV2()),
330 fInsideTRMchain0(kFALSE),
331 fInsideTRMchain1(kFALSE),
333 //fPackedDataBuffer(),
334 fLocalEventCounterDRM(-1),
335 fLocalEventCounterLTM(-1),
336 //fLocalEventCounterTRM(),
337 //fLocalEventCounterChain(),
339 //fCableLengthMap(new AliTOFCableLengthMap()),
341 fNewDecoderVersion(0)
346 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
348 ResetPackedDataBuffer(i);
351 //fTOFrawData = new TClonesArray("AliTOFrawData",1000);
352 fTOFrawData->SetOwner();
354 for (Int_t j=0;j<13;j++){
355 fLocalEventCounterTRM[j] = -1;
356 for (Int_t k=0;k<2;k++){
357 fLocalEventCounterChain[j][k] = -1;
358 fChainBunchID[j][k] = -1;
364 //_____________________________________________________________________________
365 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
367 fRawReader(stream.fRawReader),
368 fTOFrawData(stream.fTOFrawData),
369 fDecoder(new AliTOFDecoder()),
370 fDecoderV2(new AliTOFDecoderV2()),
373 fTRMchain(stream.fTRMchain),
375 fTDCchannel(stream.fTDCchannel),
378 fLeadingEdge(stream.fLeadingEdge),
379 fTrailingEdge(stream.fTrailingEdge),
380 fErrorFlag(stream.fErrorFlag),
381 fSector(stream.fSector),
382 fPlate(stream.fPlate),
383 fStrip(stream.fStrip),
386 fPackedDigits(stream.fPackedDigits),
387 fWordType(stream.fWordType),
388 fSlotID(stream.fSlotID),
390 fPSbit(stream.fPSbit),
391 fTDCerrorFlag(stream.fTDCerrorFlag),
392 fInsideDRM(stream.fInsideDRM),
393 fInsideTRM(stream.fInsideTRM),
394 fInsideLTM(stream.fInsideLTM),
395 fInsideTRMchain0(stream.fInsideTRMchain0),
396 fInsideTRMchain1(stream.fInsideTRMchain1),
398 //fPackedDataBuffer(),
399 fLocalEventCounterDRM(stream.fLocalEventCounterDRM),
400 fLocalEventCounterLTM(stream.fLocalEventCounterLTM),
401 //fLocalEventCounterTRM(),
402 //fLocalEventCounterChain(),
404 //fCableLengthMap(stream.fCableLengthMap),
405 fEventID(stream.fEventID),
406 fNewDecoderVersion(stream.fNewDecoderVersion)
412 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
413 fDataBuffer[i] = stream.fDataBuffer[i];
414 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
417 fTOFrawData = new TClonesArray(*stream.fTOFrawData);
419 for (Int_t j=0;j<13;j++){
420 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
421 for (Int_t k=0;k<2;k++){
422 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
423 fChainBunchID[j][k] = stream.fChainBunchID[j][k];
429 //_____________________________________________________________________________
430 AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
433 // assignment operator
439 TObject::operator=(stream);
441 fRawReader = stream.fRawReader;
443 fTOFrawData = stream.fTOFrawData;
447 fTRMchain = stream.fTRMchain;
449 fTDCchannel = stream.fTDCchannel;
450 fTime = stream.fTime;
452 fLeadingEdge = stream.fLeadingEdge;
453 fTrailingEdge = stream.fTrailingEdge;
454 fErrorFlag = stream.fErrorFlag;
456 fSector = stream.fSector;
457 fPlate = stream.fPlate;
458 fStrip = stream.fStrip;
459 fPadX = stream.fPadX;
460 fPadZ = stream.fPadZ;
462 fPackedDigits = stream.fPackedDigits;
464 fWordType = stream.fWordType;
465 fSlotID = stream.fSlotID;
467 fPSbit = stream.fPSbit;
468 fTDCerrorFlag = stream.fTDCerrorFlag;
469 fInsideDRM = stream.fInsideDRM;
470 fInsideTRM = stream.fInsideTRM;
471 fInsideLTM = stream.fInsideLTM;
472 fInsideTRMchain0 = stream.fInsideTRMchain0;
473 fInsideTRMchain1 = stream.fInsideTRMchain1;
475 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
476 fDataBuffer[i] = stream.fDataBuffer[i];
477 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
480 fTOFrawData = stream.fTOFrawData;
482 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;
483 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;
484 for (Int_t j=0;j<13;j++){
485 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
486 for (Int_t k=0;k<2;k++){
487 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
488 fChainBunchID[j][k] = stream.fChainBunchID[j][k];
492 //fCableLengthMap = stream.fCableLengthMap;
494 fEventID = stream.fEventID;
495 fNewDecoderVersion = stream.fNewDecoderVersion;
501 //_____________________________________________________________________________
502 AliTOFRawStream::~AliTOFRawStream()
512 fTOFrawData->Clear("C");
516 //delete fCableLengthMap;
521 //_____________________________________________________________________________
523 void AliTOFRawStream::LoadRawData(Int_t indexDDL)
529 fEventID = (Int_t)fRawReader->GetBCID(); //bunch crossing
531 fTOFrawData->Clear();
533 TClonesArray &arrayTofRawData = *fTOFrawData;
537 // create raw data map
538 AliTOFRawMap rawMap(fTOFrawData);
541 Int_t slot[4] = {-1, -1, -1, -1};
543 fLocalEventCounterDRM = -1;
544 fLocalEventCounterLTM = -1;
545 for (Int_t ii=0; ii<13; ii++)
546 fLocalEventCounterTRM[ii] = -1;
547 for (Int_t ii=0; ii<13; ii++)
548 for (Int_t jj=0; jj<2; jj++) {
549 fLocalEventCounterChain[ii][jj] = -1;
550 fChainBunchID[ii][jj] = -1;
554 fRawReader->Select("TOF", indexDDL, indexDDL);
556 Bool_t signal = kFALSE;
558 AliTOFrawData *rawDigit = NULL;
562 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
564 AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
569 slot[3] = fTDCchannel;
571 if (rawMap.TestHit(slot) != kEmpty) {
573 rawDigit = static_cast<AliTOFrawData*>(rawMap.GetHit(slot));
575 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
576 fLeadingEdge==-1 && fTrailingEdge!=-1) {
578 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
580 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
581 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
586 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
596 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
600 } // else if (rawMap.TestHit(slot) == kEmpty)
604 } // closed -> while (Next())
608 //_____________________________________________________________________________
609 Bool_t AliTOFRawStream::Next()
612 // Read next 32-bit word in TOF raw data files
613 // returns kFALSE if there is no word left
620 if (!fRawReader->ReadNextInt(data)) return kFALSE;
622 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
634 fDDL = fRawReader->GetDDLID();
636 fRawReader->AddMajorErrorLog(kDDLdataReading);
637 AliWarning("Error when load DDL. Go to next DDL");
641 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
643 switch (fWordType) { // switch word type
645 case GLOBAL_HEADER_TYPE: // global header
646 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
650 switch (fSlotID) { // switch global header slot ID
652 case DRM_ID_NUMBER: //DRM global header
653 if (fInsideDRM) { // unexpected DRM global headers -> exit
656 fInsideDRM = kTRUE; // DRM global header accepted
659 case LTM_ID_NUMBER: // LTM global header
660 if (fInsideLTM) { // unexpected LTM global headers -> exit
663 fInsideLTM = kTRUE; // LTM global header accepted
673 case 10: //TRM header
674 case 11: //TRM header
675 case 12: //TRM header
676 if (fInsideTRM) { // unexpected TRM global headers -> exit
679 fInsideTRM = kTRUE; // TRM global header accepted
680 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
683 default: // unexpected global header slot ID
686 } //end switch global header slot id
691 case GLOBAL_TRAILER_TYPE: // global trailer
692 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
694 switch (fSlotID) { // switch global trailer slot ID
696 case DRM_ID_NUMBER: // DRM global trailer
697 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
701 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
702 fLocalEventCounterDRM = GetField(data,dummy,4);
703 fInsideDRM = kFALSE; // DRM global trailer accepted
706 fInsideTRMchain0 = kFALSE;
707 fInsideTRMchain1 = kFALSE;
727 case LTM_ID_NUMBER: // LTM global trailer
728 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
732 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
733 fLocalEventCounterLTM = GetField(data,dummy,16);
734 fInsideLTM = kFALSE; // LTM global trailer accepted
736 case 15: //TRM global trailer
737 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
741 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
742 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);
743 fInsideTRM = kFALSE; // TRM global trailer accepted
745 default: // unexpected global trailer slot ID
747 } //end switch global trailer slot id
753 case ERROR_TYPE: // TDC error
754 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
755 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
759 case FILLER_TYPE: // filler
763 default: // other word types
765 if (fInsideTRM) { // inside TRM
767 switch (fWordType) { // switch word type inside TRM
768 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
769 if (fInsideTRMchain0) { // unexpected TRM chain0 header
772 fInsideTRMchain0 = kTRUE;
775 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
776 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
778 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
779 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
783 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
784 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
785 fInsideTRMchain0 = kFALSE;
788 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
789 if (fInsideTRMchain1) { // unexpected TRM chain1 header
792 fInsideTRMchain1 = kTRUE;
795 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
796 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
798 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
799 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
803 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
804 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
805 fInsideTRMchain1 = kFALSE;
808 } // end switch word type inside TRM
810 } // end if (fInsideTRM)
814 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
815 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
816 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
817 ){ // inside TRM chains
819 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
820 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
821 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
822 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
831 switch (fPSbit) { // switch fPSbit bits inside TRM chains
833 case 0: // packing ok, digit time and TOT
834 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
835 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
837 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
839 if (fgApplyBCCorrections) {
840 AliDebug(2,"Apply nominal DDL BC time-shift correction");
841 AliDebug(2,"Apply deltaBC time-shift correction");
842 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
843 fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
847 case 1: // leading edge digit, long digit time, no TOT
850 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
852 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
854 if (fgApplyBCCorrections) {
855 AliDebug(2,"Apply nominal DDL BC time-shift correction");
856 AliDebug(2,"Apply deltaBC time-shift correction");
857 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
858 fLeadingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
862 case 2: // trailing edge digit, long digit time, no TOT
865 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
867 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
869 if (fgApplyBCCorrections) {
870 AliDebug(2,"Apply nominal DDL BC time-shift correction");
871 AliDebug(2,"Apply deltaBC time-shift correction");
872 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
873 fTrailingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
877 case 3: // TOT overflow
878 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
879 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
881 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
883 if (fgApplyBCCorrections) {
884 AliDebug(2,"Apply nominal DDL BC time-shift correction");
885 AliDebug(2,"Apply deltaBC time-shift correction");
886 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
887 fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
891 } // end switch PS bits inside TRM chains
893 } // end if is inside TRM chains
895 } // end switch on fWordType
901 //_____________________________________________________________________________
903 void AliTOFRawStream::SetSector()
906 // Evaluate the TOF sector number -> [ 0;17]
907 // corresponding to the TOF equipment IDs:
910 // fTRMchain -> [ 0; 1]
912 // fTDCchannel -> [ 0; 7]
917 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
922 //_____________________________________________________________________________
925 void AliTOFRawStream::SetPlate()
928 // Evaluate the TOF plate number ->[ 0; 4]
929 // corresponding to the TOF equipment IDs:
932 // fTRMchain -> [ 0; 1]
934 // fTDCchannel -> [ 0; 7]
938 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
940 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
945 //_____________________________________________________________________________
947 void AliTOFRawStream::SetStrip()
950 // Evaluate the TOF strip number per module -> [ 0; 14/18]
951 // corresponding to the TOF equipment IDs:
954 // fTRMchain -> [ 0; 1]
956 // fTDCchannel -> [ 0; 7]
961 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
962 || fSector==-1 || fPlate==-1))
963 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
968 //_____________________________________________________________________________
970 void AliTOFRawStream::SetPadZ()
973 // Evaluate the TOF padRow number per strip -> [ 0; 1]
974 // corresponding to the TOF equipment IDs:
977 // fTRMchain -> [ 0; 1]
979 // fTDCchannel -> [ 0; 7]
984 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
985 || fSector==-1 || fPlate==-1 || fStrip==-1))
987 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
988 if (iPadAlongTheStrip!=-1)
989 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
992 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
993 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
998 //_____________________________________________________________________________
1000 void AliTOFRawStream::SetPadX()
1003 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
1004 // corresponding to the TOF equipment IDs:
1007 // fTRMchain -> [ 0; 1]
1009 // fTDCchannel -> [ 0; 7]
1014 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
1015 || fSector==-1 || fPlate==-1 || fStrip==-1))
1017 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
1018 if (iPadAlongTheStrip!=-1)
1019 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1022 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
1023 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
1029 //----------------------------------------------------------------------------
1030 Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
1033 // Returns 'word' masked by 'fieldMask' and shifted by 'fieldPosition'
1036 return ((word & fieldMask) >> fieldPosition);
1039 //----------------------------------------------------------------------------
1040 Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
1043 // Returns the TOF plate number [0;4]
1044 // corresponding to the TOF equipment ID numbers:
1045 // iDDL -> DDL number per sector [0;3]
1046 // nTRM -> TRM number [3;12]
1047 // nTDC -> TDC number [0;14]
1054 if (nTRM>=4 && nTRM<7) {
1056 } else if (nTRM==7) {
1057 if (nTDC<12) iPlate = 0;
1059 } else if (nTRM>=8 && nTRM<11) {
1061 } else if (nTRM==11) {
1062 if (nTDC<9) iPlate = 1;
1064 }else if (nTRM==12) {
1068 } else if (iDDL==1) {
1071 if (nTDC<3) iPlate = 0;
1072 } else if (nTRM>=4 && nTRM<7) {
1074 } else if (nTRM==7) {
1075 if (nTDC<6) iPlate = 1;
1077 } else if (nTRM>=8 && nTRM<11) {
1079 } else if (nTRM==11) {
1080 if (nTDC<9) iPlate = 2;
1082 } else if (nTRM==12) {
1086 } else if (iDDL==2) {
1088 if (nTRM>=4 && nTRM<7) {
1090 } else if (nTRM==7) {
1091 if (nTDC<12) iPlate = 4;
1093 } else if (nTRM>=8 && nTRM<11) {
1095 } else if (nTRM==11) {
1096 if (nTDC<9) iPlate = 3;
1098 }else if (nTRM==12) {
1102 } else if (iDDL==3) {
1105 if (nTDC<3) iPlate = 4;
1106 } else if (nTRM>=4 && nTRM<7) {
1108 } else if (nTRM==7) {
1109 if (nTDC<6) iPlate = 3;
1111 } else if (nTRM>=8 && nTRM<11) {
1113 } else if (nTRM==11) {
1114 if (nTDC<9) iPlate = 2;
1116 } else if (nTRM==12) {
1126 //----------------------------------------------------------------------------
1127 Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
1130 // Returns the TOF strip number per module:
1131 // [0;14], in the central plates,
1132 // [0;18], in the intermediate and external plates
1133 // corresponding to the TOF equipment ID numbers:
1134 // iDDL -> DDL number per sector [0;3]
1135 // nTRM -> TRM number [3;12]
1136 // nTDC -> TDC number [0;14]
1143 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
1144 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
1145 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
1146 else if (nTRM== 7) {
1147 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
1148 else iStrip = (Int_t)(nTDC/3.) - 4;
1150 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
1151 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
1152 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
1153 else if (nTRM==11) {
1154 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
1155 else iStrip = (Int_t)(nTDC/3.) - 3;
1157 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
1159 } else if (iDDL==1) {
1161 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1162 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
1163 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1164 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1165 else if (nTRM== 7) {
1166 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
1167 else iStrip = 20 - (Int_t)(nTDC/3.);
1169 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
1170 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1171 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1172 else if (nTRM==11) {
1173 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
1174 else iStrip = 21 - (Int_t)(nTDC/3.);
1176 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
1178 } else if (iDDL==2) {
1180 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
1181 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1182 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1183 else if (nTRM== 7) {
1184 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
1185 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
1187 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1188 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1189 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1190 else if (nTRM==11) {
1191 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1192 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
1194 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1196 } else if (iDDL==3) {
1198 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1199 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1200 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1201 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1202 else if (nTRM== 7) {
1203 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
1204 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1206 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1207 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1208 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1209 else if (nTRM==11) {
1210 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1211 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1213 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1221 //----------------------------------------------------------------------------
1222 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
1226 // Returns the TOF pad number per strip [0;95]
1227 // corresponding to the TOF equipment ID numbers:
1228 // iDDL -> DDL number per sector [0;3]
1229 // iChain -> TRM chain number [0;1]
1230 // nTDC -> TDC number [0;14]
1231 // iCH -> TDC channel number [0;7]
1234 Int_t iPadAlongTheStrip = -1;
1237 //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1238 //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1239 //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
1242 Int_t iTDClocal = -1;
1243 Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1244 Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1245 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1246 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
1248 Int_t iCHlocal = iCH;
1249 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1251 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1253 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1254 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1255 std::cerr << "Warning -> AliTOFRawStream::Equip2VolNpad: Problems with the padX number!\n";
1256 //AliWarning("Problems with the padX number!");
1258 return iPadAlongTheStrip;
1262 //----------------------------------------------------------------------------
1263 Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1267 // Returns the TOF padX number [0;47]
1268 // corresponding to the TOF equipment ID numbers:
1269 // iDDL -> DDL number per sector [0;3]
1270 // iChain -> TRM chain number [0;1]
1271 // nTDC -> TDC number [0;14]
1272 // iCH -> TDC channel number [0;7]
1275 Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1276 (Float_t(AliTOFGeometry::NpadZ())));
1282 //----------------------------------------------------------------------------
1283 Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1287 // Returns the TOF padZ number [0;1]
1288 // corresponding to the TOF equipment ID numbers:
1289 // iDDL -> DDL number per sector [0;3]
1290 // iChain -> TRM chain number [0;1]
1291 // nTDC -> TDC number [0;14]
1292 // iCH -> TDC channel number [0;7]
1295 Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1301 //----------------------------------------------------------------------------
1302 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL)
1305 // Returns the sector number [0;17]
1306 // corresponing to the assigned DRM/DDL number [0;71]
1309 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1314 //----------------------------------------------------------------------------
1315 Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL)
1318 // Return the DRM/DDL number per sector [0;3]
1319 // corresponing to the assigned DRM/DDL number [0;71]
1322 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1328 //----------------------------------------------------------------------------
1329 void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1331 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1333 //----------------------------------------------------------------------------
1334 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1335 Int_t nTDC, Int_t iCH,
1340 // nDDL (variable in [0;71]) -> number of the DDL file
1341 // nTRM (variable in [3;12]) -> number of the TRM slot
1342 // iChain (variable in [0; 1]) -> number of the TRM chain
1343 // nTDC (variable in [0;14]) -> number of the TDC
1344 // iCH (variable in [0; 7]) -> number of the TDC channel
1347 // sector number, i.e. volume[0] (variable in [0,17])
1348 // plate number, i.e. volume[1] (variable in [0, 5])
1349 // strip number, i.e. volume[2] (variable in [0,14/18])
1350 // padX number, i.e. volume[3] (variable in [0,47])
1351 // padZ number, i.e. volume[4] (variable in [0, 1])
1354 for (Int_t ii=0; ii<5; ii++) volume[ii] = -1;
1356 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1358 if (iDDL%2==1 && nTRM==3 && nTDC/3>0) { // Signal not coming from a TOF pad but -probably- from a TOF OR signal
1359 //printf("Info -> AliTOFRawStream::EquipmentId2VolumeId: Signal not coming from a TOF pad but -probably- from a TOF OR signal (%2d %2d %2d)\n", nDDL, nTRM, nTDC);
1363 Int_t iSector = GetSectorNumber(nDDL);
1365 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1368 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");*/
1369 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the plate number (%2d %2d %2d)!\n",
1373 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1376 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");*/
1377 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the strip number (%2d %2d %2d)!\n",
1381 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1382 if (iPadAlongTheStrip==-1) {
1384 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");*/
1385 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the pad number along the strip (%2d %1d %2d %1d)!\n",
1386 nDDL, iChain, nTDC, iCH));
1389 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1390 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1392 //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1393 //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1395 //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1396 //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1398 volume[0] = iSector;
1405 //-----------------------------------------------------------------------------
1406 Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1408 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1411 //check and fix valid DDL range
1414 fRawReader->AddMinorErrorLog(kDDLMinError);
1415 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1419 fRawReader->AddMinorErrorLog(kDDLMaxError);
1420 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1423 //select required DDLs
1424 fRawReader->Reset();
1425 fRawReader->Select("TOF", nDDLMin, nDDLMax);
1428 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1430 return(Decode(verbose));
1432 //-----------------------------------------------------------------------------
1433 Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1435 // New decoder method
1438 Int_t currentEquipment;
1440 const AliRawDataHeader *currentCDH;
1443 UChar_t *data = 0x0;
1445 //loop and read DDL headers
1446 while(fRawReader->ReadHeader()){
1448 //memory leak prevention (actually data should be always 0x0 here)
1452 //get equipment infos
1453 currentEquipment = fRawReader->GetEquipmentId();
1455 currentDDL = fRawReader->GetDDLID();
1456 if (currentDDL==-1) {
1457 fRawReader->AddMajorErrorLog(kDDLdataReading);
1459 AliWarning("Error when load DDL. Go to next DDL");
1463 currentCDH = fRawReader->GetDataHeader();
1464 const Int_t kDataSize = fRawReader->GetDataSize();
1465 const Int_t kDataWords = kDataSize / 4;
1466 data = new UChar_t[kDataSize];
1469 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1472 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1474 //read equipment payload
1475 if (!fRawReader->ReadNext(data, kDataSize))
1477 fRawReader->AddMajorErrorLog(kDDLdataReading);
1479 AliWarning("Error while reading DDL data. Go to next equipment");
1486 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1489 //set up the decoder
1490 fDecoder->SetVerbose(verbose);
1491 fDecoder->SetDataBuffer(&fDataBuffer[currentDDL]);
1492 fDecoder->SetPackedDataBuffer(&fPackedDataBuffer[currentDDL]);
1495 if (fDecoder->Decode((UInt_t *)data, kDataWords, currentCDH) == kTRUE) {
1496 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1497 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1498 ResetDataBuffer(currentDDL);
1499 ResetPackedDataBuffer(currentDDL);
1507 fRawReader->Reset();
1510 AliInfo("All done");
1515 //-----------------------------------------------------------------------------
1516 Bool_t AliTOFRawStream::DecodeV2(Int_t verbose = 0) {
1518 // Enhanced decoder method
1521 Int_t currentEquipment;
1523 //const AliRawDataHeader *currentCDH;
1526 UChar_t *data = 0x0;
1529 if (!fRawReader->ReadHeader()) return kTRUE;
1531 //get equipment infos
1532 currentEquipment = fRawReader->GetEquipmentId();
1533 currentDDL = fRawReader->GetDDLID();
1534 //currentCDH = fRawReader->GetDataHeader();
1535 const Int_t kDataSize = fRawReader->GetDataSize();
1536 const Int_t kDataWords = kDataSize / 4;
1537 data = new UChar_t[kDataSize];
1540 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1543 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1545 //read equipment payload
1546 if (!fRawReader->ReadNext(data, kDataSize))
1548 fRawReader->AddMajorErrorLog(kDDLdataReading);
1550 AliWarning("Error while reading DDL data. Go to next equipment");
1557 AliInfo(Form("Equipment # %d (DDL # %d) data has been read", currentEquipment, currentDDL));
1560 //set up the decoder
1561 fDecoderV2->SetVerbose(verbose);
1564 if (fDecoderV2->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1565 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1566 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1572 AliInfo("All done");
1577 //---------------------------------------------------------------------------
1579 AliTOFRawStream::ResetBuffers()
1582 // To reset the buffers
1585 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1586 ResetDataBuffer(iDDL);
1587 ResetPackedDataBuffer(iDDL);
1591 //---------------------------------------------------------------------------
1593 AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1596 // To load the buffers
1599 fTOFrawData->Clear();
1603 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1605 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1606 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1607 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1612 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL].GetEntries(), fPackedDataBuffer[indexDDL].GetEntries() > 1 ? "hits have" : "hit has"));
1614 AliTOFHitData *hitData; //hit data pointer
1617 AliInfo("Filling TClonesArray ...");
1620 if (fgApplyBCCorrections) {
1621 AliInfo("Apply nominal DDL BC time-shift correction");
1622 AliInfo("Apply deltaBC time-shift correction");
1625 //loop over DDL packed hits
1626 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL].GetEntries(); iHit++){
1627 hitData = fPackedDataBuffer[indexDDL].GetHit(iHit); //get hit data
1628 Int_t hitACQ = hitData->GetACQ();
1629 Int_t hitPS = hitData->GetPS();
1630 Int_t hitSlotID = hitData->GetSlotID();
1631 Int_t hitChain = hitData->GetChain();
1632 Int_t hitTDC = hitData->GetTDC();
1633 Int_t hitChan = hitData->GetChan();
1634 Int_t hitTimeBin = hitData->GetTimeBin();
1635 Int_t hitTOTBin = hitData->GetTOTBin();
1636 Int_t hitDeltaBC = hitData->GetDeltaBunchID();
1637 Int_t hitL0L1Latency = hitData->GetL0L1Latency();
1639 Int_t hitLeading = hitData->GetTimeBin();
1640 Int_t hitTrailing = -1;
1641 Int_t hitError = -1;
1643 TClonesArray &arrayTofRawData = *fTOFrawData;
1644 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency);
1651 AliInfo("Resetting buffers ...");
1653 fDataBuffer[indexDDL].Reset();
1654 fPackedDataBuffer[indexDDL].Reset();
1662 //---------------------------------------------------------------------------
1664 AliTOFRawStream::LoadRawDataBuffersV2(Int_t indexDDL, Int_t verbose)
1667 // To load the buffers
1671 * decode raw data and fill output array with TOF hits.
1672 * decode algorithm may return with errors due to inconsistent
1673 * raw data format detected during decoding process.
1674 * decoder algorithm has internal recover procedure to deal with
1675 * errors in a safe condition.
1677 * the following conditions will cause total hit rejection from
1678 * specific boards where the condition is detected:
1680 * --- within DRM payload (full DRM skipped) ---
1681 * - no header/trailer detected
1683 * --- within TRM payload (full TRM skippped) ---
1684 * - no header/trailer detected
1685 * - empty event inserted
1686 * - bad event counter
1690 * --- within chain payload (full chain skipped) ---
1691 * - no header/trailer detected
1693 * - bad event counter
1695 * --- HPTDC (ful TDC skipped) ---
1700 fTOFrawData->Clear();
1704 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1706 //check and fix valid DDL range
1709 fRawReader->AddMinorErrorLog(kDDLMinError);
1710 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1714 fRawReader->AddMinorErrorLog(kDDLMaxError);
1715 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1718 //select required DDLs
1719 fRawReader->Reset();
1720 fRawReader->Select("TOF", indexDDL, indexDDL);
1723 if (DecodeV2(verbose)) return kTRUE;
1725 /* read and check CDH info */
1726 const AliRawDataHeader *currentCDH = fRawReader->GetDataHeader();
1727 Int_t currentMiniEventID = currentCDH->GetMiniEventID();
1728 Int_t currentEventID1 = currentCDH->GetEventID1();
1730 /* read decoder summary data */
1731 AliTOFDecoderSummaryData *decodersd;
1732 AliTOFDRMSummaryData *drmsd;
1733 // AliTOFLTMSummaryData *ltmsd;
1734 AliTOFTRMSummaryData *trmsd;
1735 AliTOFChainSummaryData *chainsd;
1736 AliTOFTDCHitBuffer *hitBuffer;
1738 AliTOFTDCErrorBuffer *errorBuffer;
1739 AliTOFTDCError *error;
1740 Bool_t tdcErrorFlag[15];
1741 decodersd = fDecoderV2->GetDecoderSummaryData();
1743 /* check error detected/recovered */
1744 if (decodersd->GetErrorDetected()) {
1745 AliWarning(Form("Error detected while decoding DDL %d (errorSlotID mask = %04x)", indexDDL, decodersd->GetErrorSlotID()));
1746 if (decodersd->GetRecoveringError()) {
1747 AliWarning("Couldn't recover from error");
1750 AliWarning("Error recovered, anyway something is probably lost");
1753 /* check DRM header/trailer */
1754 drmsd = decodersd->GetDRMSummaryData();
1755 if (!drmsd->GetHeader() || !drmsd->GetTrailer()) {
1756 AliWarning("DRM header/trailer missing, skip DDL");
1759 /* check partecipating mask */
1760 if (drmsd->GetPartecipatingSlotID() != drmsd->GetDecoderSlotEnableMask()) {
1761 AliWarning(Form("DRM slot enable mask differs from decoder slot enable mask (%08x != %08x) in DDL %d", drmsd->GetSlotEnableMask(), drmsd->GetDecoderSlotEnableMask(), indexDDL));
1762 for (Int_t ibit = 0; ibit < 11; ibit++)
1763 if ((drmsd->GetPartecipatingSlotID() & (0x1 << ibit)) && !(drmsd->GetDecoderSlotEnableMask() & (0x1 << ibit)))
1764 AliWarning(Form("readout slot %d data is missing in decoder", ibit + 2));
1768 Int_t currentL0BCID = drmsd->GetL0BCID();
1770 /* loop over TRM to get hits */
1771 Int_t hitACQ, hitPS, hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitDeltaBC, hitL0L1Latency, hitLeading, hitTrailing, hitError;
1772 Int_t currentBunchID;
1774 /* loop over TRMs */
1775 for (Int_t itrm = 0; itrm < 10; itrm++) {
1776 trmsd = drmsd->GetTRMSummaryData(itrm);
1777 /* check header/trailer */
1778 if (!trmsd->GetHeader() || !trmsd->GetTrailer()) continue;
1779 /* skip if TRM empty event detected */
1780 if (trmsd->GetEBit() != 0) continue;
1781 /* skip if bad TRM event counter detected */
1782 if (trmsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue;
1783 /* skip if bad TRM CRC detected */
1784 AliDebug(2,Form("~~~~~~ %02d %02d --- TRM CRC: as written in raw data =%d and as computed =%d ~~~~~~",indexDDL,itrm,trmsd->GetEventCRC(), trmsd->GetDecoderCRC()));
1785 if (trmsd->GetEventCRC() != trmsd->GetDecoderCRC()) continue;
1787 /* loop over chains */
1788 for (Int_t ichain = 0; ichain < 2; ichain++) {
1789 chainsd = trmsd->GetChainSummaryData(ichain);
1790 /* check header/trailer */
1791 if (!chainsd->GetHeader() || !chainsd->GetTrailer()) continue;
1792 /* skip if chain bad status detected */
1793 if (chainsd->GetStatus() != 0) continue;
1794 /* skip if bad chain event counter detected */
1795 if (chainsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue;
1797 currentBunchID = chainsd->GetBunchID();
1798 hitBuffer = chainsd->GetTDCPackedHitBuffer();
1799 errorBuffer = chainsd->GetTDCErrorBuffer();
1801 /* check TDC errors and set TDC error flag */
1802 for (Int_t itdc = 0; itdc < 15; itdc++) tdcErrorFlag[itdc] = kFALSE;
1803 for (Int_t ierr = 0; ierr < errorBuffer->GetEntries(); ierr++) {
1804 error = errorBuffer->GetError(ierr);
1805 tdcErrorFlag[error->GetTDCID()] = kTRUE;
1808 /* loop over hits */
1809 for (Int_t ihit = 0; ihit < hitBuffer->GetEntries(); ihit++) {
1812 hit = hitBuffer->GetHit(ihit);
1813 /* skip hit if coming from a TDC with error detected */
1814 if (tdcErrorFlag[hit->GetTDCID()]) continue;
1817 hitACQ = trmsd->GetACQBits();
1818 hitPS = hit->GetPSBits();
1819 hitSlotID = trmsd->GetSlotID();
1820 hitChain = chainsd->GetChain();
1821 hitTDC = hit->GetTDCID();
1822 hitChan = hit->GetChan();
1823 hitTimeBin = hit->GetHitTime();
1824 hitTOTBin = hit->GetTOTWidth();
1825 hitDeltaBC = currentBunchID - currentEventID1;
1826 hitL0L1Latency = currentMiniEventID - currentL0BCID;
1828 hitLeading = hitTimeBin;
1833 TClonesArray &arrayTofRawData = *fTOFrawData;
1834 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency);
1842 //---------------------------------------------------------------------------
1843 void AliTOFRawStream::Geant2EquipmentId(Int_t vol[], Int_t eqId[])
1847 // nSector number -vol[0]- (variable in [0,17])
1848 // nPlate number -vol[1]- (variable in [0, 5])
1849 // nStrip number -vol[2]- (variable in [0,14/18])
1850 // nPadZ number -vol[3]- (variable in [0, 1])
1851 // nPadX number -vol[4]- (variable in [0,47])
1853 // nDDL -eqId[0]- (variable in [0;71]) -> number of the DDL
1854 // nTRM -eqId[1]- (variable in [3;12]) -> number of the TRM
1855 // nTDC -eqId[2]- (variable in [0;14]) -> number of the TDC
1856 // nChain -eqId[3]- (variable in [0; 1]) -> number of the chain
1857 // nChannel -eqId[4]- (variable in [0; 8]) -> number of the channel
1860 eqId[0] = Geant2DDL(vol);
1861 eqId[1] = Geant2TRM(vol);
1862 eqId[2] = Geant2TDC(vol);
1863 eqId[3] = Geant2Chain(vol);
1864 eqId[4] = Geant2Channel(vol);
1868 //---------------------------------------------------------------------------
1869 Int_t AliTOFRawStream::Geant2DDL(Int_t vol[])
1873 // nSector number -vol[0]- (variable in [0,17])
1874 // nPlate number -vol[1]- (variable in [0, 5])
1875 // nStrip number -vol[2]- (variable in [0,14/18])
1876 // nPadZ number -vol[3]- (variable in [0, 1])
1877 // nPadX number -vol[4]- (variable in [0,47])
1879 // nDDL (variable in [0;71]) -> number of the DDL
1885 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1886 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1889 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1890 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1893 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1894 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1897 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1898 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1899 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1900 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1901 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1902 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1906 Int_t nSector = vol[0];
1907 Int_t nPlate = vol[1];
1908 Int_t nStrip = vol[2];
1909 Int_t nPadX = vol[4];
1911 if ( nPadX<24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<7) ) )
1913 else if ( nPadX>=24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<8) ) )
1915 else if ( nPadX>=24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>7) ) )
1917 else if ( nPadX<24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>6) ) )
1920 return 4*nSector+iDDL;
1924 //---------------------------------------------------------------------------
1925 Int_t AliTOFRawStream::Geant2TRM(Int_t vol[])
1929 // nSector number -vol[0]- (variable in [0,17])
1930 // nPlate number -vol[1]- (variable in [0, 5])
1931 // nStrip number -vol[2]- (variable in [0,14/18])
1932 // nPadZ number -vol[3]- (variable in [0, 1])
1933 // nPadX number -vol[4]- (variable in [0,47])
1935 // nTRM (variable in [3;12]) -> number of the TRM slot
1940 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1941 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1944 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1945 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1948 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1949 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1952 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) {
1953 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1956 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) {
1957 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1961 if ( vol[3]>=AliTOFGeometry::NpadZ() )
1963 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1967 Int_t nPlate = vol[1];
1968 Int_t nStrip = vol[2];
1970 Int_t iDDL = Geant2DDL(vol)%4;
1977 if (nStrip<= 4) nTRM = 4;
1978 else if (nStrip> 4 && nStrip<= 9) nTRM = 5;
1979 else if (nStrip> 9 && nStrip<=14) nTRM = 6;
1980 else if (nStrip>14) nTRM = 7;
1982 else if (nPlate==1) {
1983 if (nStrip== 0) nTRM = 7;
1984 else if (nStrip> 0 && nStrip<= 5) nTRM = 8;
1985 else if (nStrip> 5 && nStrip<=10) nTRM = 9;
1986 else if (nStrip>10 && nStrip<=15) nTRM = 10;
1987 else if (nStrip>15) nTRM = 11;
1989 else if (nPlate==2) {
1990 if (nStrip<= 1) nTRM = 11;
1991 else if (nStrip> 1 && nStrip< 7) nTRM = 12;
1998 if (nStrip== 0) nTRM = 3;
1999 else if (nStrip> 0 && nStrip<= 5) nTRM = 4;
2000 else if (nStrip> 5 && nStrip<=10) nTRM = 5;
2001 else if (nStrip>10 && nStrip<=15) nTRM = 6;
2002 else if (nStrip>15) nTRM = 7;
2004 else if (nPlate==1) {
2005 if (nStrip<=1) nTRM = 7;
2006 else if (nStrip> 1 && nStrip<= 6) nTRM = 8;
2007 else if (nStrip> 6 && nStrip<=11) nTRM = 9;
2008 else if (nStrip>11 && nStrip<=16) nTRM = 10;
2009 else if (nStrip>16) nTRM = 11;
2011 else if (nPlate==2) {
2012 if (nStrip<= 2) nTRM = 11;
2013 else if (nStrip> 2 && nStrip<= 7) nTRM = 12;
2020 if (nStrip>=14) nTRM = 4;
2021 else if (nStrip<14 && nStrip>= 9) nTRM = 5;
2022 else if (nStrip< 9 && nStrip>= 4) nTRM = 6;
2023 else if (nStrip< 4) nTRM = 7;
2025 else if (nPlate==3) {
2026 if (nStrip==18) nTRM = 7;
2027 else if (nStrip<18 && nStrip>=13) nTRM = 8;
2028 else if (nStrip<13 && nStrip>= 8) nTRM = 9;
2029 else if (nStrip< 8 && nStrip>= 3) nTRM = 10;
2030 else if (nStrip< 3) nTRM = 11;
2032 else if (nPlate==2) {
2033 if (nStrip>=13) nTRM = 11;
2034 else if (nStrip<13 && nStrip>= 8) nTRM = 12;
2041 if (nStrip==18) nTRM = 3;
2042 else if (nStrip<18 && nStrip>=13) nTRM = 4;
2043 else if (nStrip<13 && nStrip>= 8) nTRM = 5;
2044 else if (nStrip< 8 && nStrip>= 3) nTRM = 6;
2045 else if (nStrip< 3) nTRM = 7;
2047 else if (nPlate==3) {
2048 if (nStrip>=17) nTRM = 7;
2049 else if (nStrip<17 && nStrip>=12) nTRM = 8;
2050 else if (nStrip<12 && nStrip>= 7) nTRM = 9;
2051 else if (nStrip< 7 && nStrip>= 2) nTRM = 10;
2052 else if (nStrip< 2) nTRM = 11;
2054 else if (nPlate==2) {
2055 if (nStrip>=12) nTRM = 11;
2056 else if (nStrip <12 && nStrip>= 7) nTRM = 12;
2067 //---------------------------------------------------------------------------
2068 Int_t AliTOFRawStream::Geant2TDC(Int_t vol[])
2072 // nSector number -vol[0]- (variable in [0,17])
2073 // nPlate number -vol[1]- (variable in [0, 5])
2074 // nStrip number -vol[2]- (variable in [0,14/18])
2075 // nPadZ number -vol[3]- (variable in [0, 1])
2076 // nPadX number -vol[4]- (variable in [0,47])
2078 // nTDC (variable in [0;14]) -> number of the TDC
2083 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2084 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2087 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2088 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2091 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2092 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2095 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2096 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2097 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2098 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2099 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2100 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2104 Int_t nPlate = vol[1];
2105 Int_t nStrip = vol[2];
2106 Int_t iPadX = vol[4];
2108 Int_t iDDL = Geant2DDL(vol)%4;
2115 if (nStrip<= 4) nTDC = (3*(nStrip)+2-(iPadX/4)%3);
2116 else if (nStrip> 4 && nStrip<= 9) nTDC = (3*(nStrip- 5)+2-(iPadX/4)%3);
2117 else if (nStrip> 9 && nStrip<=14) nTDC = (3*(nStrip-10)+2-(iPadX/4)%3);
2118 else if (nStrip>14) nTDC = (3*(nStrip-15)+2-(iPadX/4)%3);
2120 else if (nPlate==1) {
2121 if (nStrip== 0) nTDC = (3*(nStrip+ 4)+2-(iPadX/4)%3);
2122 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*(nStrip- 1)+2-(iPadX/4)%3);
2123 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(nStrip- 6)+2-(iPadX/4)%3);
2124 else if (nStrip>10 && nStrip<=15) nTDC = (3*(nStrip-11)+2-(iPadX/4)%3);
2125 else if (nStrip>15) nTDC = (3*(nStrip-16)+2-(iPadX/4)%3);
2127 else if (nPlate==2) {
2128 if (nStrip<= 1) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
2129 else if (nStrip> 1 && nStrip< 7) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
2136 if (nStrip== 0) nTDC = (3*(nStrip)+(iPadX/4)%3);
2137 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*( 5-nStrip)+(iPadX/4)%3);
2138 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(10-nStrip)+(iPadX/4)%3);
2139 else if (nStrip>10 && nStrip<=15) nTDC = (3*(15-nStrip)+(iPadX/4)%3);
2140 else if (nStrip>15) nTDC = (3*(20-nStrip)+(iPadX/4)%3);
2142 else if (nPlate==1) {
2143 if (nStrip<= 1) nTDC = (3*( 1-nStrip)+(iPadX/4)%3);
2144 else if (nStrip> 1 && nStrip<= 6) nTDC = (3*( 6-nStrip)+(iPadX/4)%3);
2145 else if (nStrip> 6 && nStrip<=11) nTDC = (3*(11-nStrip)+(iPadX/4)%3);
2146 else if (nStrip>11 && nStrip<=16) nTDC = (3*(16-nStrip)+(iPadX/4)%3);
2147 else if (nStrip>16) nTDC = (3*(21-nStrip)+(iPadX/4)%3);
2149 else if (nPlate==2) {
2150 if (nStrip<= 2) nTDC = (3*( 2-nStrip)+(iPadX/4)%3);
2151 else if (nStrip> 2 && nStrip<= 7) nTDC = (3*( 7-nStrip)+(iPadX/4)%3);
2158 if (nStrip>=14) nTDC = (3*(18-nStrip)+((iPadX/4)%3));
2159 else if (nStrip<14 && nStrip>= 9) nTDC = (3*(13-nStrip)+((iPadX/4)%3));
2160 else if (nStrip< 9 && nStrip>= 4) nTDC = (3*( 8-nStrip)+((iPadX/4)%3));
2161 else if (nStrip< 4) nTDC = (3*( 3-nStrip)+((iPadX/4)%3));
2163 else if (nPlate==3) {
2164 if (nStrip==18) nTDC = (3*(22-nStrip)+((iPadX/4)%3));
2165 else if (nStrip<18 && nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
2166 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
2167 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*( 7-nStrip)+((iPadX/4)%3));
2168 else if (nStrip< 3) nTDC = (3*( 2-nStrip)+((iPadX/4)%3));
2170 else if (nPlate==2) {
2171 if (nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
2172 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
2179 if (nStrip==18) nTDC = (3*(nStrip-18)+2-(iPadX/4)%3);
2180 else if (nStrip<18 && nStrip>=13) nTDC = (3*(nStrip-13)+2-(iPadX/4)%3);
2181 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(nStrip- 8)+2-(iPadX/4)%3);
2182 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*(nStrip- 3)+2-(iPadX/4)%3);
2183 else if (nStrip< 3) nTDC = (3*(nStrip+ 2)+2-(iPadX/4)%3);
2185 else if (nPlate==3) {
2186 if (nStrip>=17) nTDC = (3*(nStrip-17)+2-(iPadX/4)%3);
2187 else if (nStrip<17 && nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
2188 else if (nStrip<12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
2189 else if (nStrip< 7 && nStrip>= 2) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
2190 else if (nStrip< 2) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
2192 else if (nPlate==2) {
2193 if (nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
2194 else if (nStrip <12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
2205 //---------------------------------------------------------------------------
2206 Int_t AliTOFRawStream::Geant2Chain(Int_t vol[])
2210 // nSector number -vol[0]- (variable in [0,17])
2211 // nPlate number -vol[1]- (variable in [0, 5])
2212 // nStrip number -vol[2]- (variable in [0,14/18])
2213 // nPadZ number -vol[3]- (variable in [0, 1])
2214 // nPadX number -vol[4]- variable in [0,47])
2216 // nChain (variable in [0; 1]) -> number of the TRM chain
2221 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2222 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2225 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2226 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2229 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2230 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2233 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2234 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2235 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2236 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2237 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2238 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2242 Int_t iPadX = vol[4];
2244 if (iPadX<12 || iPadX>=36) nChain = 0;
2251 //---------------------------------------------------------------------------
2252 Int_t AliTOFRawStream::Geant2Channel(Int_t vol[])
2256 // nSector number -vol[0]- (variable in [0,17])
2257 // nPlate number -vol[1]- (variable in [0, 5])
2258 // nStrip number -vol[2]- (variable in [0,14/18])
2259 // nPadZ number -vol[3]- (variable in [0, 1])
2260 // nPadX number -vol[4]- (variable in [0,47])
2262 // nChannel (variable in [0; 7]) -> number of the TDC channel
2265 Int_t nChannel = -1;
2267 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2268 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2271 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2272 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2275 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2276 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2279 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2280 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2281 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2282 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2283 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2284 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2288 Int_t iPadZ = vol[3];
2289 Int_t iPadX = vol[4];
2291 Int_t iDDL = Geant2DDL(vol)%4;
2296 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2299 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2302 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2305 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2313 //____________________________________________________________________________
2314 void AliTOFRawStream::Raw2Digits(AliRawReader* rawReader, TClonesArray * const digitsArray)
2317 // Converts raw data to digits for TOF
2320 TStopwatch stopwatch;
2323 //TClonesArray *fDigits = new TClonesArray("AliTOFdigit", 4000);
2324 //digitsTree->Branch("TOF", &fDigits);
2325 TClonesArray &aDigits = *digitsArray;
2330 SetRawReader(rawReader);
2333 //if (fVerbose==2) ftxt.open("TOFdigitsRead.txt",ios::app);
2335 TClonesArray staticRawData("AliTOFrawData",10000);
2336 staticRawData.Clear();
2337 TClonesArray * clonesRawData = &staticRawData;
2340 Int_t detectorIndex[5] = {-1, -1, -1, -1, -1};
2343 const Int_t kMaxNumberOfTracksPerDigit = 3;
2344 Int_t tracks[kMaxNumberOfTracksPerDigit];
2345 for (Int_t ii=0; ii<kMaxNumberOfTracksPerDigit; ii++)
2351 AliTOFrawData *tofRawDatum = 0;
2352 for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
2355 if (fNewDecoderVersion) {
2356 AliInfo("Using New Decoder \n");
2357 LoadRawDataBuffers(indexDDL, 0);
2360 LoadRawData(indexDDL);
2362 clonesRawData = GetRawData();
2363 if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
2364 for (iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {
2366 tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);
2368 //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue;
2369 if (tofRawDatum->GetTOF()==-1) continue;
2371 EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
2372 tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
2374 dummy = detectorIndex[3];
2375 detectorIndex[3] = detectorIndex[4];//padz
2376 detectorIndex[4] = dummy;//padx
2378 digit[0] = tofRawDatum->GetTOF();
2379 digit[1] = tofRawDatum->GetTOT();
2380 digit[2] = tofRawDatum->GetTOT();
2381 digit[3] = -1;//tofRawDatum->GetTOF(); //tofND
2383 dummy = detectorIndex[3];
2384 detectorIndex[3] = detectorIndex[4];//padx
2385 detectorIndex[4] = dummy;//padz
2387 // Do not reconstruct anything in the holes
2388 if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
2389 if (detectorIndex[1]==2) { // plate with holes
2395 last = digitsArray->GetEntriesFast();
2396 new (aDigits[last]) AliTOFdigit(tracks, detectorIndex, digit);
2399 if (indexDDL<10) ftxt << " " << indexDDL;
2400 else ftxt << " " << indexDDL;
2401 if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM();
2402 else ftxt << " " << tofRawDatum->GetTRM();
2403 ftxt << " " << tofRawDatum->GetTRMchain();
2404 if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC();
2405 else ftxt << " " << tofRawDatum->GetTDC();
2406 ftxt << " " << tofRawDatum->GetTDCchannel();
2408 if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0];
2409 else ftxt << " -> " << detectorIndex[0];
2410 ftxt << " " << detectorIndex[1];
2411 if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2];
2412 else ftxt << " " << detectorIndex[2];
2413 ftxt << " " << detectorIndex[4];
2414 if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3];
2415 else ftxt << " " << detectorIndex[3];
2417 if (digit[1]<10)ftxt << " " << digit[1];
2418 else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1];
2419 else ftxt << " " << digit[1];
2420 if (digit[0]<10) ftxt << " " << digit[0] << endl;
2421 else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl;
2422 else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl;
2423 else ftxt << " " << digit[3] << endl;
2426 AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d, %d)",
2428 detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3],
2429 digit[0], digit[1], digit[3]));
2432 } // loop on tofRawData array
2434 clonesRawData->Clear();
2438 //if (fVerbose==2) ftxt.close();
2441 if (inholes) AliWarning(Form("Raw data in the TOF holes: %d",inholes));
2443 Int_t nDigits = digitsArray->GetEntries();
2444 AliDebug(1, Form("Got %d TOF digits", nDigits));
2445 AliDebug(1, Form("Execution time to read TOF raw data and fill TOF digit tree : R:%.2fs C:%.2fs",
2446 stopwatch.RealTime(),stopwatch.CpuTime()));
2450 //____________________________________________________________________________
2451 void AliTOFRawStream::Raw2SDigits(AliRawReader* rawReader, TClonesArray * const sdigitsArray)
2454 // Converts raw data to sdigits for TOF
2457 TStopwatch stopwatch;
2462 //if(!GetLoader()->TreeS()) {MakeTree("S"); MakeBranch("S");}
2463 TClonesArray &aSDigits = *sdigitsArray;
2466 SetRawReader(rawReader);
2469 //if (fVerbose==2) ftxt.open("TOFsdigitsRead.txt",ios::app);
2471 TClonesArray staticRawData("AliTOFrawData",10000);
2472 staticRawData.Clear();
2473 TClonesArray * clonesRawData = &staticRawData;
2476 Int_t detectorIndex[5] = {-1, -1, -1, -1, -1};
2483 AliTOFrawData *tofRawDatum = 0;
2484 for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
2487 if (fNewDecoderVersion) {
2488 AliInfo("Using New Decoder \n");
2489 LoadRawDataBuffers(indexDDL, 0);
2492 LoadRawData(indexDDL);
2494 clonesRawData = GetRawData();
2495 if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
2496 for (iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {
2498 tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);
2500 //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue;
2501 if (tofRawDatum->GetTOF()==-1) continue;
2503 EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
2504 tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
2506 dummy = detectorIndex[3];
2507 detectorIndex[3] = detectorIndex[4];//padz
2508 detectorIndex[4] = dummy;//padx
2510 digit[0] = tofRawDatum->GetTOF();
2511 digit[1] = tofRawDatum->GetTOT();
2513 dummy = detectorIndex[3];
2514 detectorIndex[3] = detectorIndex[4];//padx
2515 detectorIndex[4] = dummy;//padz
2517 // Do not reconstruct anything in the holes
2518 if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
2519 if (detectorIndex[1]==2) { // plate with holes
2525 last = sdigitsArray->GetEntriesFast();
2526 new (aSDigits[last]) AliTOFSDigit(track, detectorIndex, digit);
2529 if (indexDDL<10) ftxt << " " << indexDDL;
2530 else ftxt << " " << indexDDL;
2531 if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM();
2532 else ftxt << " " << tofRawDatum->GetTRM();
2533 ftxt << " " << tofRawDatum->GetTRMchain();
2534 if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC();
2535 else ftxt << " " << tofRawDatum->GetTDC();
2536 ftxt << " " << tofRawDatum->GetTDCchannel();
2538 if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0];
2539 else ftxt << " -> " << detectorIndex[0];
2540 ftxt << " " << detectorIndex[1];
2541 if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2];
2542 else ftxt << " " << detectorIndex[2];
2543 ftxt << " " << detectorIndex[4];
2544 if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3];
2545 else ftxt << " " << detectorIndex[3];
2547 if (digit[1]<10)ftxt << " " << digit[1];
2548 else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1];
2549 else ftxt << " " << digit[1];
2550 if (digit[0]<10) ftxt << " " << digit[0] << endl;
2551 else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl;
2552 else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl;
2553 else ftxt << " " << digit[3] << endl;
2556 AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d)",
2558 detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3],
2559 digit[0], digit[1]));
2564 clonesRawData->Clear();
2568 //if (fVerbose==2) ftxt.close();
2570 if (inholes) AliWarning(Form("Clusters in the TOF holes: %d",inholes));
2572 Int_t nSDigits = sdigitsArray->GetEntries();
2573 AliDebug(1, Form("Got %d TOF sdigits", nSDigits));
2574 AliDebug(1, Form("Execution time to read TOF raw data and fill TOF sdigit tree : R:%.2fs C:%.2fs",
2575 stopwatch.RealTime(),stopwatch.CpuTime()));
2579 void AliTOFRawStream::VolumeID2LTM(Int_t detind[],
2584 Int_t &iChannel) const {
2586 // To convert the TOF trigger macropad ID (i.e. detind)
2587 // into TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel)
2590 const Int_t kFirstTDCnumber = 12;
2592 iDDL=-1, iTRM = 3 , iChain=-1, iTDC=-1, iChannel=-1;
2593 if (detind[1]==0 || detind[1]==1 || (detind[1]==2 && detind[2]<=7)) {
2601 iDDL = detind[0]*4+2;
2603 iDDL = detind[0]*4+2;
2606 iChain=fgkChainMap24[detind[1]][detind[2]];
2607 iTDC=(Int_t)(fgkChannelMap24[detind[1]][detind[2]]/8)+kFirstTDCnumber;
2608 iChannel=fgkChannelMap24[detind[1]][detind[2]]%8;
2612 void AliTOFRawStream::LTM2VolumeID(Int_t iDDL,
2617 Int_t detind0[], Int_t detind1[]) const {
2619 // To convert the TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel)
2620 // into TOF trigger macropad IDs (i.e. detind0 and detind1).
2621 // In general, a couple of neighbouring TOF semi-strip represents a TOF trigger macropad.
2624 const Int_t kFirstTDCnumber = 12;
2626 Int_t iSector0=-1, iModule0=-1, iStrip0=-1, iPadX0=-1; // Le variabili del Volume ID
2627 Int_t iSector1=-1, iModule1=-1, iStrip1=-1, iPadX1=-1; // Le variabili del Volume ID
2629 if( iDDL%2==1 && iTRM==3 && iTDC-kFirstTDCnumber>=0 && iTDC-kFirstTDCnumber<3 ) {
2630 iSector0 = (Int_t)(iDDL/4);
2631 iSector1 = (Int_t)(iDDL/4);
2632 Int_t iChan= iChannel+(iTDC-kFirstTDCnumber)*8;
2634 if(iChain==0){ //CRATE 0
2637 iStrip0=fgkStrip0MapCrate0[iChan];
2638 iStrip1=fgkStrip1MapCrate0[iChan];
2639 iModule0=fgkModule0MapCrate0[iChan];
2640 iModule1=fgkModule1MapCrate0[iChan];
2642 if(iChain==1){// CRATE 1
2645 iStrip0=fgkStrip0MapCrate1[iChan];
2646 iStrip1=fgkStrip1MapCrate1[iChan];
2647 iModule0=fgkModule0MapCrate1[iChan];
2648 iModule1=fgkModule1MapCrate1[iChan];
2653 if(iChain==1){// CRATE 3
2656 iStrip0=fgkStrip0MapCrate3[iChan];
2657 iStrip1=fgkStrip1MapCrate3[iChan];
2658 iModule0=fgkModule0MapCrate3[iChan];
2659 iModule1=fgkModule1MapCrate3[iChan];
2661 if(iChain==0){// CRATE 2
2664 iStrip0=fgkStrip0MapCrate2[iChan];
2665 iStrip1=fgkStrip1MapCrate2[iChan];
2666 iModule0=fgkModule0MapCrate2[iChan];
2667 iModule1=fgkModule1MapCrate2[iChan];
2672 if(iStrip1==-1 || iModule1==-1){
2680 detind1[0]=iSector1;
2681 detind1[1]=iModule1;
2687 if(iStrip0==-1 || iModule0==-1){
2695 detind0[0]=iSector0;
2696 detind0[1]=iModule0;