X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TOF%2FAliTOFRawStream.cxx;h=9109fce54aaa64fd56b64fa135d4287abfadf8d4;hb=f680c1de1dcbfa9a1942c20beb3c59807d613f0e;hp=00f2bc4f8180fd130b200be0434951d38a486b5e;hpb=bf33f8f0420274cbd5cab3fcc3a223dd191317a8;p=u%2Fmrichter%2FAliRoot.git diff --git a/TOF/AliTOFRawStream.cxx b/TOF/AliTOFRawStream.cxx index 00f2bc4f818..9109fce54aa 100644 --- a/TOF/AliTOFRawStream.cxx +++ b/TOF/AliTOFRawStream.cxx @@ -15,9 +15,42 @@ /* $Log$ + +Added lookup tables for + TRM number 3 in the left crates (TOF OR signals) + and detector elements (A.Silenzi) + +Revision 1.19.1 2008/09/19 preghenella + Decode method updated: + it reads the CDH from the rawReader and sends it to the decoder; + LoadRawDataBuffers modified: + it corrects tof hit infos per ddlBC and deltaBC offsets + (in case of the static member fgApplyBCCorrections + has been setted to kTRUE); + Added static member fgApplyBCCorrections (kTRUE by default) + and the related static method ApplyBCCorrections; + +Revision 1.19 2007/05/18 13:07:53 decaro +Error messages stored in the global raw-reader error log (Cvetan, Chiara) + +Revision 1.18 2007/05/08 11:53:29 arcelli +Improved class flexibility for further use (R.Preghenella) + +Revision 1.17 2007/05/03 08:53:50 decaro +Coding convention: RS3 violation -> suppression + +Revision 1.16 2007/05/03 08:22:22 decaro +Coding convention: RN17 violation -> suppression + +Revision 1.15 2007/04/30 15:22:06 arcelli +Change TOF digit Time, Tot etc to int type + Revision 1.14 2007/04/27 11:11:53 arcelli updates for the new decoder +Revision 1.13 2007/03/16 11:46:35 decaro +Coding convention: RN17 rule violation -> suppression + Revision 1.12 2007/02/22 09:43:45 decaro Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli) @@ -71,28 +104,138 @@ Revision 0.01 2005/07/22 A. De Caro //////////////////////////////////////////////////////////////////////// +#include "Riostream.h" + #include "TClonesArray.h" +#include "TStopwatch.h" #include "AliDAQ.h" #include "AliLog.h" #include "AliRawReader.h" #include "AliTOFGeometry.h" -#include "AliTOFGeometryV5.h" #include "AliTOFrawData.h" #include "AliTOFRawMap.h" #include "AliTOFRawStream.h" - +#include "AliTOFdigit.h" +#include "AliTOFSDigit.h" +//#include "AliTOFCableLengthMap.h" + +#include "AliTOFHitData.h" + +#include "AliRawEventHeaderBase.h" +#include "AliRawDataHeader.h" +#include "AliRawDataHeaderV3.h" + +#include "AliTOFDecoderV2.h" +#include "AliTOFTDCHit.h" +#include "AliTOFDecoderSummaryData.h" +#include "AliTOFDRMSummaryData.h" +#include "AliTOFLTMSummaryData.h" +#include "AliTOFTRMSummaryData.h" +#include "AliTOFChainSummaryData.h" +#include "AliTOFTDCHitBuffer.h" +#include "AliTOFTDCErrorBuffer.h" ClassImp(AliTOFRawStream) +const Int_t AliTOFRawStream::fgkddlBCshift[72] = +{ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0 +}; + +const Int_t AliTOFRawStream::fgkStrip0MapCrate0[]= + {1,3,5,7,9,11,13,15,17,0,2,4,6,8,10,12,14,16,18,1,3,5,7,-1}; +const Int_t AliTOFRawStream::fgkStrip1MapCrate0[]= + {0,2,4,6,8,10,12,14,16,18,1,3,5,7,9,11,13,15,17,0,2,4,6,-1}; +const Int_t AliTOFRawStream::fgkStrip0MapCrate1[]= + {1,3,5,7,9,11,13,15,17,0,2,4,6,8,10,12,14,16,18,1,3,5,7,-1}; +const Int_t AliTOFRawStream::fgkStrip1MapCrate1[]= + {0,2,4,6,8,10,12,14,16,18,1,3,5,7,9,11,13,15,17,0,2,4,6,-1}; +const Int_t AliTOFRawStream::fgkStrip0MapCrate2[]= + {17,15,13,11, 9,7,5,3,1,18,16,14,12,10,8,6,4,2, 0,13,11, 9,7,-1}; +const Int_t AliTOFRawStream::fgkStrip1MapCrate2[]= + {18,16,14,12,10,8,6,4,2, 0,17,15,13,11,9,7,5,3, 1,14,12,10,8,-1}; +const Int_t AliTOFRawStream::fgkStrip0MapCrate3[]= + {17,15,13,11, 9,7,5,3,1,18,16,14,12,10,8,6,4,2, 0,13,11, 9,7,-1}; +const Int_t AliTOFRawStream::fgkStrip1MapCrate3[]= + {18,16,14,12,10,8,6,4,2, 0,17,15,13,11,9,7,5,3, 1,14,12,10,8,-1}; + + +const Int_t AliTOFRawStream::fgkModule0MapCrate0[]= + {0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,-1}; +const Int_t AliTOFRawStream::fgkModule1MapCrate0[]= + {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,-1}; +const Int_t AliTOFRawStream::fgkModule0MapCrate1[]= + {0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,-1}; +const Int_t AliTOFRawStream::fgkModule1MapCrate1[]= + {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,-1}; + +const Int_t AliTOFRawStream::fgkModule0MapCrate2[]= + {4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,-1}; +const Int_t AliTOFRawStream::fgkModule1MapCrate2[]= + {4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,-1}; +const Int_t AliTOFRawStream::fgkModule0MapCrate3[]= + {4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,-1}; +const Int_t AliTOFRawStream::fgkModule1MapCrate3[]= + {4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,-1}; + +const Int_t AliTOFRawStream::fgkChannelMap0[5][19]= + {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9}, + {9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18}, + {19,19,20,20,21,21,22,22,22,21,21,20,20,19,19,-1,-1,-1,-1}, + {18,18,17,17,16,16,15,15,14,14,13,13,12,12,11,11,10,10,9}, + {9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0} + }; + +const Int_t AliTOFRawStream::fgkChainMap0[5][19]= + {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,-1,-1,-1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} + }; + +const Int_t AliTOFRawStream::fgkChannelMap24[5][19]= + {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9}, + {9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18}, + {19,19,20,20,21,21,22,22,22,21,21,20,20,19,19,-1,-1,-1,-1}, + {18,18,17,17,16,16,15,15,14,14,13,13,12,12,11,11,10,10,9}, + {9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0} + }; + +const Int_t AliTOFRawStream::fgkChainMap24[5][19]= + {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,-1,-1,-1,-1}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} + }; +Bool_t AliTOFRawStream::fgApplyBCCorrections = kTRUE; //_____________________________________________________________________________ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader): fRawReader(rawReader), - // fTOFrawData(new TClonesArray("AliTOFrawData",1000)), - fTOFrawData(0x0), + fTOFrawData(new TClonesArray("AliTOFrawData",1000)), fDecoder(new AliTOFDecoder()), + fDecoderV2(new AliTOFDecoderV2()), fDDL(-1), fTRM(-1), fTRMchain(-1), @@ -108,7 +251,6 @@ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader): fStrip(-1), fPadX(-1), fPadZ(-1), - fTOFGeometry(new AliTOFGeometryV5()), fPackedDigits(0), fWordType(-1), fSlotID(-1), @@ -119,30 +261,49 @@ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader): fInsideTRM(kFALSE), fInsideLTM(kFALSE), fInsideTRMchain0(kFALSE), - fInsideTRMchain1(kFALSE) + fInsideTRMchain1(kFALSE), + //fDataBuffer(), + //fPackedDataBuffer(), + fLocalEventCounterDRM(-1), + fLocalEventCounterLTM(-1), + //fLocalEventCounterTRM(), + //fLocalEventCounterChain(), + //fChainBunchID(), + //fCableLengthMap(new AliTOFCableLengthMap()), + fEventID(0), + fNewDecoderVersion(0) { // // create an object to read TOF raw digits // for (Int_t i=0;iSetOwner(); fRawReader->Reset(); fRawReader->Select("TOF"); + + for (Int_t jj=0;jj<13;jj++) { + fLocalEventCounterTRM[jj] = -1; + for (Int_t ii=0;ii<2;ii++) { + fLocalEventCounterChain[jj][ii] = -1; + fChainBunchID[jj][ii] = -1; + } + } + } //_____________________________________________________________________________ AliTOFRawStream::AliTOFRawStream(): - fRawReader(0x0), - // fTOFrawData(new TClonesArray("AliTOFrawData",1000)), - fTOFrawData(0x0), + fRawReader(0x0), + fTOFrawData(new TClonesArray("AliTOFrawData",1000)), fDecoder(new AliTOFDecoder()), + fDecoderV2(new AliTOFDecoderV2()), fDDL(-1), fTRM(-1), fTRMchain(-1), @@ -158,7 +319,6 @@ AliTOFRawStream::AliTOFRawStream(): fStrip(-1), fPadX(-1), fPadZ(-1), - fTOFGeometry(new AliTOFGeometryV5()), fPackedDigits(0), fWordType(-1), fSlotID(-1), @@ -169,103 +329,102 @@ AliTOFRawStream::AliTOFRawStream(): fInsideTRM(kFALSE), fInsideLTM(kFALSE), fInsideTRMchain0(kFALSE), - fInsideTRMchain1(kFALSE) + fInsideTRMchain1(kFALSE), + //fDataBuffer(), + //fPackedDataBuffer(), + fLocalEventCounterDRM(-1), + fLocalEventCounterLTM(-1), + //fLocalEventCounterTRM(), + //fLocalEventCounterChain(), + //fChainBunchID(), + //fCableLengthMap(new AliTOFCableLengthMap()), + fEventID(0), + fNewDecoderVersion(0) { // // default ctr // for (Int_t i=0;iSetOwner(); + + for (Int_t j=0;j<13;j++){ + fLocalEventCounterTRM[j] = -1; + for (Int_t k=0;k<2;k++){ + fLocalEventCounterChain[j][k] = -1; + fChainBunchID[j][k] = -1; + } + } + } //_____________________________________________________________________________ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) : TObject(stream), - fRawReader(0x0), - // fTOFrawData(new TClonesArray("AliTOFrawData",1000)), - fTOFrawData(0x0), + fRawReader(stream.fRawReader), + fTOFrawData(stream.fTOFrawData), fDecoder(new AliTOFDecoder()), - fDDL(-1), - fTRM(-1), - fTRMchain(-1), - fTDC(-1), - fTDCchannel(-1), - fTime(-1), - fToT(-1), - fLeadingEdge(-1), - fTrailingEdge(-1), - fErrorFlag(-1), - fSector(-1), - fPlate(-1), - fStrip(-1), - fPadX(-1), - fPadZ(-1), - fTOFGeometry(new AliTOFGeometryV5()), - fPackedDigits(0), - fWordType(-1), - fSlotID(-1), - fACQ(-1), - fPSbit(-1), - fTDCerrorFlag(-1), - fInsideDRM(kFALSE), - fInsideTRM(kFALSE), - fInsideLTM(kFALSE), - fInsideTRMchain0(kFALSE), - fInsideTRMchain1(kFALSE) + fDecoderV2(new AliTOFDecoderV2()), + fDDL(stream.fDDL), + fTRM(stream.fTRM), + fTRMchain(stream.fTRMchain), + fTDC(stream.fTDC), + fTDCchannel(stream.fTDCchannel), + fTime(stream.fTime), + fToT(-stream.fToT), + fLeadingEdge(stream.fLeadingEdge), + fTrailingEdge(stream.fTrailingEdge), + fErrorFlag(stream.fErrorFlag), + fSector(stream.fSector), + fPlate(stream.fPlate), + fStrip(stream.fStrip), + fPadX(stream.fPadX), + fPadZ(stream.fPadZ), + fPackedDigits(stream.fPackedDigits), + fWordType(stream.fWordType), + fSlotID(stream.fSlotID), + fACQ(stream.fACQ), + fPSbit(stream.fPSbit), + fTDCerrorFlag(stream.fTDCerrorFlag), + fInsideDRM(stream.fInsideDRM), + fInsideTRM(stream.fInsideTRM), + fInsideLTM(stream.fInsideLTM), + fInsideTRMchain0(stream.fInsideTRMchain0), + fInsideTRMchain1(stream.fInsideTRMchain1), + //fDataBuffer(), + //fPackedDataBuffer(), + fLocalEventCounterDRM(stream.fLocalEventCounterDRM), + fLocalEventCounterLTM(stream.fLocalEventCounterLTM), + //fLocalEventCounterTRM(), + //fLocalEventCounterChain(), + //fChainBunchID(), + //fCableLengthMap(stream.fCableLengthMap), + fEventID(stream.fEventID), + fNewDecoderVersion(stream.fNewDecoderVersion) { // // copy constructor // - fRawReader = stream.fRawReader; - - fTOFrawData = stream.fTOFrawData; - - fDDL = stream.fDDL; - fTRM = stream.fTRM; - fTRMchain = stream.fTRMchain; - fTDC = stream.fTDC; - fTDCchannel = stream.fTDCchannel; - fTime = stream.fTime; - fToT = stream.fToT; - fLeadingEdge = stream.fLeadingEdge; - fTrailingEdge = stream.fTrailingEdge; - - fErrorFlag = stream.fErrorFlag; - - fSector = stream.fSector; - fPlate = stream.fPlate; - fStrip = stream.fStrip; - fPadX = stream.fPadX; - fPadZ = stream.fPadZ; - - fTOFGeometry = stream.fTOFGeometry; - - fPackedDigits = stream.fPackedDigits; - - fWordType = stream.fWordType; - fSlotID = stream.fSlotID; - fACQ = stream.fACQ; - fPSbit = stream.fPSbit; - fTDCerrorFlag = stream.fTDCerrorFlag; - fInsideDRM = stream.fInsideDRM; - fInsideTRM = stream.fInsideTRM; - fInsideLTM = stream.fInsideLTM; - fInsideTRMchain0 = stream.fInsideTRMchain0; - fInsideTRMchain1 = stream.fInsideTRMchain1; - for (Int_t i=0;iClear("C"); + delete fTOFrawData; } - delete fDecoder; + //delete fCableLengthMap; - fTOFrawData->Clear(); - delete fTOFrawData; } @@ -347,44 +522,55 @@ AliTOFRawStream::~AliTOFRawStream() void AliTOFRawStream::LoadRawData(Int_t indexDDL) { + // + // To load raw data + // - /* - for (Int_t indexDDL = 0; - indexDDL < AliDAQ::NumberOfDdls("TOF"); - indexDDL++) { - */ + fEventID = (Int_t)fRawReader->GetBCID(); //bunch crossing + + fTOFrawData->Clear(); + + TClonesArray &arrayTofRawData = *fTOFrawData; - fTOFrawData = new TClonesArray("AliTOFrawData",1000); //potential memory leak - //fTOFrawData->Clear(); fPackedDigits = 0; // create raw data map - AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData); - rawMap->Clear(); + AliTOFRawMap rawMap(fTOFrawData); + rawMap.Clear(); Int_t slot[4] = {-1, -1, -1, -1}; + fLocalEventCounterDRM = -1; + fLocalEventCounterLTM = -1; + for (Int_t ii=0; ii<13; ii++) + fLocalEventCounterTRM[ii] = -1; + for (Int_t ii=0; ii<13; ii++) + for (Int_t jj=0; jj<2; jj++) { + fLocalEventCounterChain[ii][jj] = -1; + fChainBunchID[ii][jj] = -1; + } + fRawReader->Reset(); fRawReader->Select("TOF", indexDDL, indexDDL); Bool_t signal = kFALSE; - + AliTOFrawData *rawDigit = NULL; while(Next()) { signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1); if (signal) { - //printf(" %2i %1i %2i %1i %2i \n", fSector, fPlate, fStrip, fPadZ, fPadX); + AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX)); slot[0] = fTRM; slot[1] = fTRMchain; slot[2] = fTDC; slot[3] = fTDCchannel; - if (rawMap->TestHit(slot) != kEmpty) { + if (rawMap.TestHit(slot) != kEmpty) { - AliTOFrawData *rawDigit = static_cast(rawMap->GetHit(slot)); + rawDigit = static_cast(rawMap.GetHit(slot)); if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 && fLeadingEdge==-1 && fTrailingEdge!=-1) { @@ -394,63 +580,29 @@ void AliTOFRawStream::LoadRawData(Int_t indexDDL) else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) && (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) ) -/* else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) && - (fTime!=-1 || fLeadingEdge!=-1 || fTrailingEdge!=-1))*/ /*|| - (rawDigit->GetLeading()==-1 && rawDigit->GetTrailing()!=-1 && - fLeadingEdge!=-1 && fTrailingEdge==-1) */) + ) { - TClonesArray &arrayTofRawData = *fTOFrawData; - new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag); + new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag); - rawMap->SetHit(slot); + rawMap.SetHit(slot); - } + } } else { - TClonesArray &arrayTofRawData = *fTOFrawData; new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag); - rawMap->SetHit(slot); + rawMap.SetHit(slot); - } // else if (rawMap->TestHit(slot) == kEmpty) + } // else if (rawMap.TestHit(slot) == kEmpty) } // if (signal) } // closed -> while (Next()) - /* - fDDL = fRawReader->GetDDLID(); - - for (Int_t ii=0; iiGetEntriesFast(); ii++) { - - AliTOFrawData *dummy = (AliTOFrawData*)fTOFrawData->UncheckedAt(ii); - - fTRM = dummy->GetTRM(); - fTRMchain = dummy->GetTRMchain(); - fTDC = dummy->GetTDC(); - fTDCchannel = dummy->GetTDCchannel(); - - SetSector(); - SetPlate(); - SetStrip(); - SetPadZ(); - SetPadX(); - - printf(" %2i, %2i %1i, %2i, %1i --> %2i, %1i, %2i, %1i, %2i \n", - fDDL, fTRM, fTRMchain, fTDC, fTDCchannel, - fSector, fPlate, fStrip, fPadZ, fPadX); - - } // closed loop on TOF raw data TClonesArray - */ - - //} // closed loop on indexDDL - - - } //_____________________________________________________________________________ @@ -463,6 +615,8 @@ Bool_t AliTOFRawStream::Next() UInt_t data; + Int_t dummy = 0; + if (!fRawReader->ReadNextInt(data)) return kFALSE; if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) { @@ -478,6 +632,11 @@ Bool_t AliTOFRawStream::Next() } fDDL = fRawReader->GetDDLID(); + if (fDDL==-1) { + fRawReader->AddMajorErrorLog(kDDLdataReading); + AliWarning("Error when load DDL. Go to next DDL"); + return kFALSE; + } fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION); @@ -531,7 +690,6 @@ Bool_t AliTOFRawStream::Next() case GLOBAL_TRAILER_TYPE: // global trailer fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION); - switch (fSlotID) { // switch global trailer slot ID @@ -539,6 +697,9 @@ Bool_t AliTOFRawStream::Next() if (!fInsideDRM) { // unexpected DRM global trailers -> exit break; } + dummy = 0x0000fff0; + //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4))); + fLocalEventCounterDRM = GetField(data,dummy,4); fInsideDRM = kFALSE; // DRM global trailer accepted fInsideTRM = kFALSE; fInsideLTM = kFALSE; @@ -567,12 +728,18 @@ Bool_t AliTOFRawStream::Next() if (!fInsideLTM) { // unexpected LTM global trailer -> exit break; } + dummy = 0x0fff0000; + //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16))); + fLocalEventCounterLTM = GetField(data,dummy,16); fInsideLTM = kFALSE; // LTM global trailer accepted break; case 15: //TRM global trailer if (!fInsideTRM) { // unexpected TRM global trailers -> exit break; } + dummy = 0x0fff0000; + //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16))); + fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16); fInsideTRM = kFALSE; // TRM global trailer accepted break; default: // unexpected global trailer slot ID @@ -604,11 +771,17 @@ Bool_t AliTOFRawStream::Next() } fInsideTRMchain0 = kTRUE; fTRMchain = 0; + dummy = 0x0000fff0; + //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4))); + fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4); break; case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer break; } + dummy = 0x0fff0000; + //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16))); + fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16); fInsideTRMchain0 = kFALSE; fTRMchain = -1; break; @@ -618,11 +791,17 @@ Bool_t AliTOFRawStream::Next() } fInsideTRMchain1 = kTRUE; fTRMchain = 1; + dummy = 0x0000fff0; + //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4))); + fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4); break; case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer break; } + dummy = 0x0fff0000; + //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16))); + fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16); fInsideTRMchain1 = kFALSE; fTRMchain = -1; break; @@ -653,24 +832,60 @@ Bool_t AliTOFRawStream::Next() case 0: // packing ok, digit time and TOT fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION); - fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION); + fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION) + /*- + fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/ + ; + if (fgApplyBCCorrections) { + AliDebug(2,"Apply nominal DDL BC time-shift correction"); + AliDebug(2,"Apply deltaBC time-shift correction"); + AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID)); + fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024; + } break; case 1: // leading edge digit, long digit time, no TOT //fToT = -1; //fTime = -1; - fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION); + fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION) + /*- + fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/ + ; + if (fgApplyBCCorrections) { + AliDebug(2,"Apply nominal DDL BC time-shift correction"); + AliDebug(2,"Apply deltaBC time-shift correction"); + AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID)); + fLeadingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024; + } break; case 2: // trailing edge digit, long digit time, no TOT //fToT = -1; //fTime = -1; - fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION); + fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION) + /*- + fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/ + ; + if (fgApplyBCCorrections) { + AliDebug(2,"Apply nominal DDL BC time-shift correction"); + AliDebug(2,"Apply deltaBC time-shift correction"); + AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID)); + fTrailingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024; + } break; case 3: // TOT overflow fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION); - fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION); + fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION) + /*- + fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/ + ; + if (fgApplyBCCorrections) { + AliDebug(2,"Apply nominal DDL BC time-shift correction"); + AliDebug(2,"Apply deltaBC time-shift correction"); + AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID)); + fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024; + } break; } // end switch PS bits inside TRM chains @@ -774,6 +989,9 @@ void AliTOFRawStream::SetPadZ() iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ(); } + //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ(); + //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel); + fPadZ = iPadZ; } @@ -801,6 +1019,9 @@ void AliTOFRawStream::SetPadX() iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ()))); } + //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ()))); + //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel); + fPadX = iPadX; } @@ -809,14 +1030,14 @@ void AliTOFRawStream::SetPadX() Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const { // - // + // Returns 'word' masked by 'fieldMask' and shifted by 'fieldPosition' // return ((word & fieldMask) >> fieldPosition); } //---------------------------------------------------------------------------- -Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) const +Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) { // // Returns the TOF plate number [0;4] @@ -827,6 +1048,7 @@ Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) const // Int_t iPlate = -1; + if (iDDL==0) { if (nTRM>=4 && nTRM<7) { @@ -902,7 +1124,7 @@ Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) const } //---------------------------------------------------------------------------- -Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC) const +Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC) { // // Returns the TOF strip number per module: @@ -998,7 +1220,7 @@ Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC) const //---------------------------------------------------------------------------- Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC, - Int_t iCH) const + Int_t iCH) { // // Returns the TOF pad number per strip [0;95] @@ -1011,10 +1233,17 @@ Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC, Int_t iPadAlongTheStrip = -1; - Int_t iTDClocal = nTDC%3 + (1-iChain)*3; + // wrong + //Int_t iTDClocal = nTDC%3 + (1-iChain)*3; + //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal; + //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal); - if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal; - else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal); + // right + Int_t iTDClocal = -1; + Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3; + Int_t iTDClocal12 = 2-nTDC%3 + iChain*3; + if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03; + else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12); Int_t iCHlocal = iCH; if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH; @@ -1022,15 +1251,55 @@ Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC, iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal; if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) || - ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) - AliError("Problems with the padX number!"); - + ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) { + std::cerr << "Warning -> AliTOFRawStream::Equip2VolNpad: Problems with the padX number!\n"; + //AliWarning("Problems with the padX number!"); + } return iPadAlongTheStrip; } //---------------------------------------------------------------------------- -Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const +Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC, + Int_t iCH) +{ + // + // Returns the TOF padX number [0;47] + // corresponding to the TOF equipment ID numbers: + // iDDL -> DDL number per sector [0;3] + // iChain -> TRM chain number [0;1] + // nTDC -> TDC number [0;14] + // iCH -> TDC channel number [0;7] + // + + Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/ + (Float_t(AliTOFGeometry::NpadZ()))); + + return iPadX; + +} + +//---------------------------------------------------------------------------- +Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC, + Int_t iCH) +{ + // + // Returns the TOF padZ number [0;1] + // corresponding to the TOF equipment ID numbers: + // iDDL -> DDL number per sector [0;3] + // iChain -> TRM chain number [0;1] + // nTDC -> TDC number [0;14] + // iCH -> TDC channel number [0;7] + // + + Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ(); + + return iPadZ; + +} + +//---------------------------------------------------------------------------- +Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) { // // Returns the sector number [0;17] @@ -1043,7 +1312,7 @@ Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const } //---------------------------------------------------------------------------- -Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const +Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) { // // Return the DRM/DDL number per sector [0;3] @@ -1063,8 +1332,8 @@ void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume } //---------------------------------------------------------------------------- void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain, - Int_t nTDC, Int_t iCH, - Int_t *volume) const + Int_t nTDC, Int_t iCH, + Int_t *volume) { // // To convert: @@ -1082,23 +1351,50 @@ void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain, // padZ number, i.e. volume[4] (variable in [0, 1]) // + for (Int_t ii=0; ii<5; ii++) volume[ii] = -1; + Int_t iDDL = GetDDLnumberPerSector(nDDL); + if (iDDL%2==1 && nTRM==3 && nTDC/3>0) { // Signal not coming from a TOF pad but -probably- from a TOF OR signal + //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); + return; + } + Int_t iSector = GetSectorNumber(nDDL); Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC); - if (iPlate==-1) AliError("Problems with the plate number!"); + if (iPlate==-1) { + /*if (fRawReader) + fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");*/ + AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the plate number (%2d %2d %2d)!\n", + nDDL, nTRM, nTDC)); + } Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC); - if (iStrip==-1) AliError("Problems with the strip number!"); + if (iStrip==-1) { + /*if (fRawReader) + fRawReader->AddMajorErrorLog(kStripError,"strip = -1");*/ + AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the strip number (%2d %2d %2d)!\n", + nDDL, nTRM, nTDC)); + } Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH); - if (iPadAlongTheStrip==-1) - AliError("Problems with the pad number along the strip!"); - + if (iPadAlongTheStrip==-1) { + /*if (fRawReader) + fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");*/ + AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the pad number along the strip (%2d %1d %2d %1d)!\n", + nDDL, iChain, nTDC, iCH)); + } + Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ()))); Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ(); + //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ()))); + //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ(); + + //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH); + //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH); + volume[0] = iSector; volume[1] = iPlate; volume[2] = iStrip; @@ -1106,92 +1402,63 @@ void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain, volume[4] = iPadZ; } -//_____________________________________________________________________________ - -Int_t AliTOFRawStream::GetIndex(Int_t *detId) -{ - //Retrieve calibration channel index - const Int_t nSectors = fTOFGeometry->NSectors(); - const Int_t nPlates = fTOFGeometry->NPlates(); - const Int_t nStripA = fTOFGeometry->NStripA(); - const Int_t nStripB = fTOFGeometry->NStripB(); - const Int_t nStripC = fTOFGeometry->NStripC(); - const Int_t nPadX = fTOFGeometry->NpadX(); - const Int_t nPadZ = fTOFGeometry->NpadZ(); - - - Int_t isector = detId[0]; - if (isector >= nSectors) - AliError(Form("Wrong sector number in TOF (%d) !",isector)); - Int_t iplate = detId[1]; - if (iplate >= nPlates) - AliError(Form("Wrong plate number in TOF (%d) !",iplate)); - Int_t istrip = detId[2]; - Int_t ipadz = detId[3]; - Int_t ipadx = detId[4]; - Int_t stripOffset = 0; - switch (iplate) { - case 0: - stripOffset = 0; - break; - case 1: - stripOffset = nStripC; - break; - case 2: - stripOffset = nStripC+nStripB; - break; - case 3: - stripOffset = nStripC+nStripB+nStripA; - break; - case 4: - stripOffset = nStripC+nStripB+nStripA+nStripB; - break; - default: - AliError(Form("Wrong plate number in TOF (%d) !",iplate)); - break; - }; - - Int_t idet = ((2*(nStripC+nStripB)+nStripA)*nPadZ*nPadX)*isector + - (stripOffset*nPadZ*nPadX)+ - (nPadZ*nPadX)*istrip+ - (nPadX)*ipadz+ - ipadx; - return idet; -} //----------------------------------------------------------------------------- -Bool_t AliTOFRawStream::DecodeDDL(Int_t DDLMin, Int_t DDLMax, Int_t verbose = 0){ - Int_t currentEquipment; - Int_t currentDDL; +Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) { + // + // To decode raw data for DDL number in [nDDLmin; nDDLmax] + // - //pointers - UChar_t *data = 0x0; - //check and fix valid DDL range - if (DDLMin < 0){ - DDLMin = 0; - AliError("Wrong DDL range: setting first DDL ID to 0"); + if (nDDLMin < 0){ + nDDLMin = 0; + fRawReader->AddMinorErrorLog(kDDLMinError); + AliWarning("Wrong DDL range: setting first DDL ID to 0"); } - if (DDLMax > 71){ - DDLMax = 71; - AliError("Wrong DDL range: setting last DDL ID to 71"); + if (nDDLMax > 71){ + nDDLMax = 71; + fRawReader->AddMinorErrorLog(kDDLMaxError); + AliWarning("Wrong DDL range: setting last DDL ID to 71"); } //select required DDLs - fRawReader->Select("TOF", DDLMin, DDLMax); + fRawReader->Reset(); + fRawReader->Select("TOF", nDDLMin, nDDLMax); if (verbose) - AliInfo(Form("Selected TOF DDL range: %d-%d", DDLMin, DDLMax)); + AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax)); + + return(Decode(verbose)); +} +//----------------------------------------------------------------------------- +Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) { + // + // New decoder method + // + Int_t currentEquipment; + Int_t currentDDL; + const AliRawDataHeader *currentCDH = 0x0; + const AliRawDataHeaderV3 *currentCDHV3 = 0x0; + + //pointers + UChar_t *data = 0x0; + //loop and read DDL headers while(fRawReader->ReadHeader()){ - //memory leak prevention (actually data should be always 0x0 here) - if (data != 0x0) - delete [] data; - //get equipment infos currentEquipment = fRawReader->GetEquipmentId(); + currentDDL = fRawReader->GetDDLID(); + if (currentDDL==-1) { + fRawReader->AddMajorErrorLog(kDDLdataReading); + if (verbose) + AliWarning("Error when load DDL. Go to next DDL"); + continue; + } + + currentCDH = fRawReader->GetDataHeader(); + if (!currentCDH) currentCDHV3 = fRawReader->GetDataHeaderV3(); const Int_t kDataSize = fRawReader->GetDataSize(); const Int_t kDataWords = kDataSize / 4; data = new UChar_t[kDataSize]; @@ -1205,8 +1472,9 @@ Bool_t AliTOFRawStream::DecodeDDL(Int_t DDLMin, Int_t DDLMax, Int_t verbose = 0) //read equipment payload if (!fRawReader->ReadNext(data, kDataSize)) { + fRawReader->AddMajorErrorLog(kDDLdataReading); if (verbose) - AliError("Error while reading DDL data. Go to next equipment"); + AliWarning("Error while reading DDL data. Go to next equipment"); delete [] data; data = 0x0; continue; @@ -1218,12 +1486,16 @@ Bool_t AliTOFRawStream::DecodeDDL(Int_t DDLMin, Int_t DDLMax, Int_t verbose = 0) //set up the decoder fDecoder->SetVerbose(verbose); - fDecoder->SetDataBuffer(fDataBuffer[currentDDL]); - fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]); + fDecoder->SetDataBuffer(&fDataBuffer[currentDDL]); + fDecoder->SetPackedDataBuffer(&fPackedDataBuffer[currentDDL]); //start decoding - if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) - AliError(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL)); + if (fDecoder->Decode((UInt_t *)data, kDataWords, currentCDH, currentCDHV3) == kTRUE) { + fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL)); + if (verbose) AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL)); + ResetDataBuffer(currentDDL); + ResetPackedDataBuffer(currentDDL); + } delete [] data; data = 0x0; @@ -1238,42 +1510,119 @@ Bool_t AliTOFRawStream::DecodeDDL(Int_t DDLMin, Int_t DDLMax, Int_t verbose = 0) return kFALSE; } -//--------------------------------------------------------------------------- -void -AliTOFRawStream::ResetBuffers() -{ - for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){ - ResetDataBuffer(iDDL); - ResetPackedDataBuffer(iDDL); - } -} +//----------------------------------------------------------------------------- +Bool_t AliTOFRawStream::DecodeV2(Int_t verbose = 0) { + // + // Enhanced decoder method + // + + Int_t currentEquipment; + Int_t currentDDL; + //const AliRawDataHeader *currentCDH; + + //pointers + UChar_t *data = 0x0; -//--------------------------------------------------------------------------- -Bool_t -AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose) -{ - fTOFrawData->Clear(); - fPackedDigits = 0; + // read header + if (!fRawReader->ReadHeader()) return kTRUE; + + //get equipment infos + currentEquipment = fRawReader->GetEquipmentId(); + currentDDL = fRawReader->GetDDLID(); + //currentCDH = fRawReader->GetDataHeader(); + const Int_t kDataSize = fRawReader->GetDataSize(); + const Int_t kDataWords = kDataSize / 4; + data = new UChar_t[kDataSize]; + + if (verbose) + AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords)); + + if (verbose) + AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL)); + + //read equipment payload + if (!fRawReader->ReadNext(data, kDataSize)) + { + fRawReader->AddMajorErrorLog(kDDLdataReading); + if (verbose) + AliWarning("Error while reading DDL data. Go to next equipment"); + delete [] data; + data = 0x0; + return kTRUE; + } + + if (verbose) + AliInfo(Form("Equipment # %d (DDL # %d) data has been read", currentEquipment, currentDDL)); + + + //set up the decoder + fDecoderV2->SetVerbose(verbose); + + //start decoding + if (fDecoderV2->Decode((UInt_t *)data, kDataWords) == kTRUE) { + fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL)); + if (verbose) AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL)); + } + + delete [] data; + + if (verbose) + AliInfo("All done"); + + return kFALSE; + +} +//--------------------------------------------------------------------------- +void +AliTOFRawStream::ResetBuffers() +{ + // + // To reset the buffers + // + + for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){ + ResetDataBuffer(iDDL); + ResetPackedDataBuffer(iDDL); + } +} + +//--------------------------------------------------------------------------- +Bool_t +AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose) +{ + // + // To load the buffers + // + + fTOFrawData->Clear(); + fPackedDigits = 0; if (verbose > 0) AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL)); if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL - AliError(Form("Error while decoding DDL # %d", indexDDL)); + fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL)); + AliWarning(Form("Error while decoding DDL # %d", indexDDL)); return kTRUE; } if (verbose > 0) - AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has")); + AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL].GetEntries(), fPackedDataBuffer[indexDDL].GetEntries() > 1 ? "hits have" : "hit has")); AliTOFHitData *hitData; //hit data pointer if (verbose > 0) AliInfo("Filling TClonesArray ..."); + if (verbose > 0) + if (fgApplyBCCorrections) { + AliInfo("Apply nominal DDL BC time-shift correction"); + AliInfo("Apply deltaBC time-shift correction"); + } + //loop over DDL packed hits - for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){ - hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data + for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL].GetEntries(); iHit++){ + hitData = fPackedDataBuffer[indexDDL].GetHit(iHit); //get hit data Int_t hitACQ = hitData->GetACQ(); Int_t hitPS = hitData->GetPS(); Int_t hitSlotID = hitData->GetSlotID(); @@ -1282,13 +1631,15 @@ AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose) Int_t hitChan = hitData->GetChan(); Int_t hitTimeBin = hitData->GetTimeBin(); Int_t hitTOTBin = hitData->GetTOTBin(); - - Int_t hitLeading = -1; + Int_t hitDeltaBC = hitData->GetDeltaBunchID(); + Int_t hitL0L1Latency = hitData->GetL0L1Latency(); + + Int_t hitLeading = hitData->GetTimeBin(); Int_t hitTrailing = -1; Int_t hitError = -1; TClonesArray &arrayTofRawData = *fTOFrawData; - new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError); + new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency); } if (verbose > 0) @@ -1297,8 +1648,8 @@ AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose) if (verbose > 0) AliInfo("Resetting buffers ..."); - fDataBuffer[indexDDL]->Reset(); - fPackedDataBuffer[indexDDL]->Reset(); + fDataBuffer[indexDDL].Reset(); + fPackedDataBuffer[indexDDL].Reset(); if (verbose > 0) AliInfo("Done."); @@ -1306,3 +1657,1046 @@ AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose) return kFALSE; } +//--------------------------------------------------------------------------- +Bool_t +AliTOFRawStream::LoadRawDataBuffersV2(Int_t indexDDL, Int_t verbose) +{ + // + // To load the buffers + // + + /* + * decode raw data and fill output array with TOF hits. + * decode algorithm may return with errors due to inconsistent + * raw data format detected during decoding process. + * decoder algorithm has internal recover procedure to deal with + * errors in a safe condition. + * + * the following conditions will cause total hit rejection from + * specific boards where the condition is detected: + * + * --- within DRM payload (full DRM skipped) --- + * - no header/trailer detected + * + * --- within TRM payload (full TRM skippped) --- + * - no header/trailer detected + * - empty event inserted + * - bad event counter + * - bad CRC + * - ACQ mode off + * + * --- within chain payload (full chain skipped) --- + * - no header/trailer detected + * - bad status + * - bad event counter + * + * --- HPTDC (ful TDC skipped) --- + * - error detected + * + */ + + fTOFrawData->Clear(); + fPackedDigits = 0; + + if (verbose > 0) + AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL)); + + //check and fix valid DDL range + if (indexDDL < 0){ + indexDDL = 0; + fRawReader->AddMinorErrorLog(kDDLMinError); + AliWarning("Wrong DDL range: setting first DDL ID to 0"); + } + if (indexDDL > 71){ + indexDDL = 71; + fRawReader->AddMinorErrorLog(kDDLMaxError); + AliWarning("Wrong DDL range: setting last DDL ID to 71"); + } + + //select required DDLs + fRawReader->Reset(); + fRawReader->Select("TOF", indexDDL, indexDDL); + + /* decode */ + if (DecodeV2(verbose)) return kTRUE; + + /* read and check CDH info */ + const AliRawDataHeader *currentCDH = fRawReader->GetDataHeader(); + const AliRawDataHeaderV3 *currentCDHV3 = fRawReader->GetDataHeaderV3(); + Int_t currentMiniEventID = currentCDH ? currentCDH->GetMiniEventID(): -1; + currentMiniEventID = currentCDHV3 ? currentCDHV3->GetMiniEventID(): currentMiniEventID; + Int_t currentEventID1 = currentCDH? currentCDH->GetEventID1() : -1; + currentEventID1 = currentCDHV3? currentCDHV3->GetEventID1() : currentEventID1; + + /* read decoder summary data */ + AliTOFDecoderSummaryData *decodersd; + AliTOFDRMSummaryData *drmsd; + // AliTOFLTMSummaryData *ltmsd; + AliTOFTRMSummaryData *trmsd; + AliTOFChainSummaryData *chainsd; + AliTOFTDCHitBuffer *hitBuffer; + AliTOFTDCHit *hit; + AliTOFTDCErrorBuffer *errorBuffer; + AliTOFTDCError *error; + Bool_t tdcErrorFlag[15]; + decodersd = fDecoderV2->GetDecoderSummaryData(); + + /* check error detected/recovered */ + if (decodersd->GetErrorDetected()) { + AliDebug(2, Form("Error detected while decoding DDL %d (errorSlotID mask = %04x)", indexDDL, decodersd->GetErrorSlotID())); + if (decodersd->GetRecoveringError()) { + AliDebug(2, "Couldn't recover from error"); + } + else { + AliDebug(2, "Error recovered, anyway something is probably lost"); + } + } + /* check DRM header/trailer */ + drmsd = decodersd->GetDRMSummaryData(); + if (!drmsd->GetHeader() || !drmsd->GetTrailer()) { + AliWarning("DRM header/trailer missing, skip DDL"); + return kTRUE; + } + /* check partecipating mask */ + if (drmsd->GetPartecipatingSlotID() != drmsd->GetDecoderSlotEnableMask()) { + AliDebug(2, Form("DRM slot enable mask differs from decoder slot enable mask (%08x != %08x) in DDL %d", drmsd->GetSlotEnableMask(), drmsd->GetDecoderSlotEnableMask(), indexDDL)); + for (Int_t ibit = 0; ibit < 11; ibit++) + if ((drmsd->GetPartecipatingSlotID() & (0x1 << ibit)) && !(drmsd->GetDecoderSlotEnableMask() & (0x1 << ibit))) + AliDebug(2, Form("readout slot %d data is missing in decoder", ibit + 2)); + } + + /* get DRM data */ + Int_t currentL0BCID = drmsd->GetL0BCID(); + + /* loop over TRM to get hits */ + Int_t hitACQ, hitPS, hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitDeltaBC, hitL0L1Latency, hitLeading, hitTrailing, hitError; + Int_t currentBunchID; + + /* loop over TRMs */ + for (Int_t itrm = 0; itrm < 10; itrm++) { + trmsd = drmsd->GetTRMSummaryData(itrm); + /* check header/trailer */ + if (!trmsd->GetHeader() || !trmsd->GetTrailer()) continue; + /* skip if TRM empty event detected */ + if (trmsd->GetEBit() != 0) continue; + /* skip if bad TRM event counter detected */ + if (trmsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue; + /* skip if bad TRM CRC detected */ + AliDebug(2,Form("~~~~~~ %02d %02d --- TRM CRC: as written in raw data =%d and as computed =%d ~~~~~~",indexDDL,itrm,trmsd->GetEventCRC(), trmsd->GetDecoderCRC())); + if (trmsd->GetEventCRC() != trmsd->GetDecoderCRC()) continue; + + /* loop over chains */ + for (Int_t ichain = 0; ichain < 2; ichain++) { + chainsd = trmsd->GetChainSummaryData(ichain); + /* check header/trailer */ + if (!chainsd->GetHeader() || !chainsd->GetTrailer()) continue; + /* skip if chain bad status detected */ + if (chainsd->GetStatus() != 0) continue; + /* skip if bad chain event counter detected */ + if (chainsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue; + + currentBunchID = chainsd->GetBunchID(); + hitBuffer = chainsd->GetTDCPackedHitBuffer(); + errorBuffer = chainsd->GetTDCErrorBuffer(); + + /* check TDC errors and set TDC error flag */ + for (Int_t itdc = 0; itdc < 15; itdc++) tdcErrorFlag[itdc] = kFALSE; + for (Int_t ierr = 0; ierr < errorBuffer->GetEntries(); ierr++) { + error = errorBuffer->GetError(ierr); + tdcErrorFlag[error->GetTDCID()] = kTRUE; + } + + /* loop over hits */ + for (Int_t ihit = 0; ihit < hitBuffer->GetEntries(); ihit++) { + + /* get hit */ + hit = hitBuffer->GetHit(ihit); + /* skip hit if coming from a TDC with error detected */ + if (tdcErrorFlag[hit->GetTDCID()]) continue; + + /* set info */ + hitACQ = trmsd->GetACQBits(); + hitPS = hit->GetPSBits(); + hitSlotID = trmsd->GetSlotID(); + hitChain = chainsd->GetChain(); + hitTDC = hit->GetTDCID(); + hitChan = hit->GetChan(); + hitTimeBin = hit->GetHitTime(); + hitTOTBin = hit->GetTOTWidth(); + hitDeltaBC = currentBunchID - currentEventID1; + hitL0L1Latency = currentMiniEventID - currentL0BCID; + + hitLeading = hitTimeBin; + hitTrailing = -1; + hitError = -1; + + /* add hit */ + TClonesArray &arrayTofRawData = *fTOFrawData; + new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency); + } + } + } + + return kFALSE; +} + +//--------------------------------------------------------------------------- +void AliTOFRawStream::Geant2EquipmentId(Int_t vol[], Int_t eqId[]) +{ + // + // To convert: + // nSector number -vol[0]- (variable in [0,17]) + // nPlate number -vol[1]- (variable in [0, 5]) + // nStrip number -vol[2]- (variable in [0,14/18]) + // nPadZ number -vol[3]- (variable in [0, 1]) + // nPadX number -vol[4]- (variable in [0,47]) + // in: + // nDDL -eqId[0]- (variable in [0;71]) -> number of the DDL + // nTRM -eqId[1]- (variable in [3;12]) -> number of the TRM + // nTDC -eqId[2]- (variable in [0;14]) -> number of the TDC + // nChain -eqId[3]- (variable in [0; 1]) -> number of the chain + // nChannel -eqId[4]- (variable in [0; 8]) -> number of the channel + // + + eqId[0] = Geant2DDL(vol); + eqId[1] = Geant2TRM(vol); + eqId[2] = Geant2TDC(vol); + eqId[3] = Geant2Chain(vol); + eqId[4] = Geant2Channel(vol); + +} + +//--------------------------------------------------------------------------- +Int_t AliTOFRawStream::Geant2DDL(Int_t vol[]) +{ + // + // To convert: + // nSector number -vol[0]- (variable in [0,17]) + // nPlate number -vol[1]- (variable in [0, 5]) + // nStrip number -vol[2]- (variable in [0,14/18]) + // nPadZ number -vol[3]- (variable in [0, 1]) + // nPadX number -vol[4]- (variable in [0,47]) + // in: + // nDDL (variable in [0;71]) -> number of the DDL + // + + + Int_t iDDL = -1; + + if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) { + printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]); + return iDDL; + } + if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) { + printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]); + return iDDL; + } + if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) { + printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1])); + return iDDL; + } + if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) + printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]); + if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) + printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]); + if ( vol[3]>=AliTOFGeometry::NpadZ() ) { + printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]); + return iDDL; + } + + Int_t nSector = vol[0]; + Int_t nPlate = vol[1]; + Int_t nStrip = vol[2]; + Int_t nPadX = vol[4]; + + if ( nPadX<24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<7) ) ) + iDDL = 0; + else if ( nPadX>=24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<8) ) ) + iDDL = 1; + else if ( nPadX>=24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>7) ) ) + iDDL = 2; + else if ( nPadX<24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>6) ) ) + iDDL = 3; + + return 4*nSector+iDDL; + +} + +//--------------------------------------------------------------------------- +Int_t AliTOFRawStream::Geant2TRM(Int_t vol[]) +{ + // + // To convert: + // nSector number -vol[0]- (variable in [0,17]) + // nPlate number -vol[1]- (variable in [0, 5]) + // nStrip number -vol[2]- (variable in [0,14/18]) + // nPadZ number -vol[3]- (variable in [0, 1]) + // nPadX number -vol[4]- (variable in [0,47]) + // in: + // nTRM (variable in [3;12]) -> number of the TRM slot + // + + Int_t nTRM = -1; + + if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) { + printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]); + return nTRM; + } + if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) { + printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]); + return nTRM; + } + if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) { + printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1])); + return nTRM; + } + if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) { + printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]); + return nTRM; + } + if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) { + printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]); + return nTRM; + } + + if ( vol[3]>=AliTOFGeometry::NpadZ() ) + { + printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]); + return nTRM; + } + + Int_t nPlate = vol[1]; + Int_t nStrip = vol[2]; + + Int_t iDDL = Geant2DDL(vol)%4; + + switch (iDDL) { + + case 0: + + if (nPlate==0) { + if (nStrip<= 4) nTRM = 4; + else if (nStrip> 4 && nStrip<= 9) nTRM = 5; + else if (nStrip> 9 && nStrip<=14) nTRM = 6; + else if (nStrip>14) nTRM = 7; + } + else if (nPlate==1) { + if (nStrip== 0) nTRM = 7; + else if (nStrip> 0 && nStrip<= 5) nTRM = 8; + else if (nStrip> 5 && nStrip<=10) nTRM = 9; + else if (nStrip>10 && nStrip<=15) nTRM = 10; + else if (nStrip>15) nTRM = 11; + } + else if (nPlate==2) { + if (nStrip<= 1) nTRM = 11; + else if (nStrip> 1 && nStrip< 7) nTRM = 12; + } + + break; + case 1: + + if (nPlate==0) { + if (nStrip== 0) nTRM = 3; + else if (nStrip> 0 && nStrip<= 5) nTRM = 4; + else if (nStrip> 5 && nStrip<=10) nTRM = 5; + else if (nStrip>10 && nStrip<=15) nTRM = 6; + else if (nStrip>15) nTRM = 7; + } + else if (nPlate==1) { + if (nStrip<=1) nTRM = 7; + else if (nStrip> 1 && nStrip<= 6) nTRM = 8; + else if (nStrip> 6 && nStrip<=11) nTRM = 9; + else if (nStrip>11 && nStrip<=16) nTRM = 10; + else if (nStrip>16) nTRM = 11; + } + else if (nPlate==2) { + if (nStrip<= 2) nTRM = 11; + else if (nStrip> 2 && nStrip<= 7) nTRM = 12; + } + + break; + case 2: + + if (nPlate==4) { + if (nStrip>=14) nTRM = 4; + else if (nStrip<14 && nStrip>= 9) nTRM = 5; + else if (nStrip< 9 && nStrip>= 4) nTRM = 6; + else if (nStrip< 4) nTRM = 7; + } + else if (nPlate==3) { + if (nStrip==18) nTRM = 7; + else if (nStrip<18 && nStrip>=13) nTRM = 8; + else if (nStrip<13 && nStrip>= 8) nTRM = 9; + else if (nStrip< 8 && nStrip>= 3) nTRM = 10; + else if (nStrip< 3) nTRM = 11; + } + else if (nPlate==2) { + if (nStrip>=13) nTRM = 11; + else if (nStrip<13 && nStrip>= 8) nTRM = 12; + } + + break; + case 3: + + if (nPlate==4) { + if (nStrip==18) nTRM = 3; + else if (nStrip<18 && nStrip>=13) nTRM = 4; + else if (nStrip<13 && nStrip>= 8) nTRM = 5; + else if (nStrip< 8 && nStrip>= 3) nTRM = 6; + else if (nStrip< 3) nTRM = 7; + } + else if (nPlate==3) { + if (nStrip>=17) nTRM = 7; + else if (nStrip<17 && nStrip>=12) nTRM = 8; + else if (nStrip<12 && nStrip>= 7) nTRM = 9; + else if (nStrip< 7 && nStrip>= 2) nTRM = 10; + else if (nStrip< 2) nTRM = 11; + } + else if (nPlate==2) { + if (nStrip>=12) nTRM = 11; + else if (nStrip <12 && nStrip>= 7) nTRM = 12; + } + + break; + + } + + return nTRM; + +} + +//--------------------------------------------------------------------------- +Int_t AliTOFRawStream::Geant2TDC(Int_t vol[]) +{ + // + // To convert: + // nSector number -vol[0]- (variable in [0,17]) + // nPlate number -vol[1]- (variable in [0, 5]) + // nStrip number -vol[2]- (variable in [0,14/18]) + // nPadZ number -vol[3]- (variable in [0, 1]) + // nPadX number -vol[4]- (variable in [0,47]) + // in: + // nTDC (variable in [0;14]) -> number of the TDC + // + + Int_t nTDC = -1; + + if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) { + printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]); + return nTDC; + } + if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) { + printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]); + return nTDC; + } + if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) { + printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1])); + return nTDC; + } + if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) + printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]); + if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) + printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]); + if ( vol[3]>=AliTOFGeometry::NpadZ() ) { + printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]); + return nTDC; + } + + Int_t nPlate = vol[1]; + Int_t nStrip = vol[2]; + Int_t iPadX = vol[4]; + + Int_t iDDL = Geant2DDL(vol)%4; + + switch (iDDL) { + + case 0: + + if (nPlate==0) { + if (nStrip<= 4) nTDC = (3*(nStrip)+2-(iPadX/4)%3); + else if (nStrip> 4 && nStrip<= 9) nTDC = (3*(nStrip- 5)+2-(iPadX/4)%3); + else if (nStrip> 9 && nStrip<=14) nTDC = (3*(nStrip-10)+2-(iPadX/4)%3); + else if (nStrip>14) nTDC = (3*(nStrip-15)+2-(iPadX/4)%3); + } + else if (nPlate==1) { + if (nStrip== 0) nTDC = (3*(nStrip+ 4)+2-(iPadX/4)%3); + else if (nStrip> 0 && nStrip<= 5) nTDC = (3*(nStrip- 1)+2-(iPadX/4)%3); + else if (nStrip> 5 && nStrip<=10) nTDC = (3*(nStrip- 6)+2-(iPadX/4)%3); + else if (nStrip>10 && nStrip<=15) nTDC = (3*(nStrip-11)+2-(iPadX/4)%3); + else if (nStrip>15) nTDC = (3*(nStrip-16)+2-(iPadX/4)%3); + } + else if (nPlate==2) { + if (nStrip<= 1) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3); + else if (nStrip> 1 && nStrip< 7) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3); + } + + break; + case 1: + + if (nPlate==0) { + if (nStrip== 0) nTDC = (3*(nStrip)+(iPadX/4)%3); + else if (nStrip> 0 && nStrip<= 5) nTDC = (3*( 5-nStrip)+(iPadX/4)%3); + else if (nStrip> 5 && nStrip<=10) nTDC = (3*(10-nStrip)+(iPadX/4)%3); + else if (nStrip>10 && nStrip<=15) nTDC = (3*(15-nStrip)+(iPadX/4)%3); + else if (nStrip>15) nTDC = (3*(20-nStrip)+(iPadX/4)%3); + } + else if (nPlate==1) { + if (nStrip<= 1) nTDC = (3*( 1-nStrip)+(iPadX/4)%3); + else if (nStrip> 1 && nStrip<= 6) nTDC = (3*( 6-nStrip)+(iPadX/4)%3); + else if (nStrip> 6 && nStrip<=11) nTDC = (3*(11-nStrip)+(iPadX/4)%3); + else if (nStrip>11 && nStrip<=16) nTDC = (3*(16-nStrip)+(iPadX/4)%3); + else if (nStrip>16) nTDC = (3*(21-nStrip)+(iPadX/4)%3); + } + else if (nPlate==2) { + if (nStrip<= 2) nTDC = (3*( 2-nStrip)+(iPadX/4)%3); + else if (nStrip> 2 && nStrip<= 7) nTDC = (3*( 7-nStrip)+(iPadX/4)%3); + } + + break; + case 2: + + if (nPlate==4) { + if (nStrip>=14) nTDC = (3*(18-nStrip)+((iPadX/4)%3)); + else if (nStrip<14 && nStrip>= 9) nTDC = (3*(13-nStrip)+((iPadX/4)%3)); + else if (nStrip< 9 && nStrip>= 4) nTDC = (3*( 8-nStrip)+((iPadX/4)%3)); + else if (nStrip< 4) nTDC = (3*( 3-nStrip)+((iPadX/4)%3)); + } + else if (nPlate==3) { + if (nStrip==18) nTDC = (3*(22-nStrip)+((iPadX/4)%3)); + else if (nStrip<18 && nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3)); + else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3)); + else if (nStrip< 8 && nStrip>= 3) nTDC = (3*( 7-nStrip)+((iPadX/4)%3)); + else if (nStrip< 3) nTDC = (3*( 2-nStrip)+((iPadX/4)%3)); + } + else if (nPlate==2) { + if (nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3)); + else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3)); + } + + break; + case 3: + + if (nPlate==4) { + if (nStrip==18) nTDC = (3*(nStrip-18)+2-(iPadX/4)%3); + else if (nStrip<18 && nStrip>=13) nTDC = (3*(nStrip-13)+2-(iPadX/4)%3); + else if (nStrip<13 && nStrip>= 8) nTDC = (3*(nStrip- 8)+2-(iPadX/4)%3); + else if (nStrip< 8 && nStrip>= 3) nTDC = (3*(nStrip- 3)+2-(iPadX/4)%3); + else if (nStrip< 3) nTDC = (3*(nStrip+ 2)+2-(iPadX/4)%3); + } + else if (nPlate==3) { + if (nStrip>=17) nTDC = (3*(nStrip-17)+2-(iPadX/4)%3); + else if (nStrip<17 && nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3); + else if (nStrip<12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3); + else if (nStrip< 7 && nStrip>= 2) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3); + else if (nStrip< 2) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3); + } + else if (nPlate==2) { + if (nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3); + else if (nStrip <12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3); + } + + break; + + } + + return nTDC; + +} + +//--------------------------------------------------------------------------- +Int_t AliTOFRawStream::Geant2Chain(Int_t vol[]) +{ + // + // To convert: + // nSector number -vol[0]- (variable in [0,17]) + // nPlate number -vol[1]- (variable in [0, 5]) + // nStrip number -vol[2]- (variable in [0,14/18]) + // nPadZ number -vol[3]- (variable in [0, 1]) + // nPadX number -vol[4]- variable in [0,47]) + // in: + // nChain (variable in [0; 1]) -> number of the TRM chain + // + + Int_t nChain = -1; + + if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) { + printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]); + return nChain; + } + if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) { + printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]); + return nChain; + } + if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) { + printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1])); + return nChain; + } + if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) + printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]); + if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) + printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]); + if ( vol[3]>=AliTOFGeometry::NpadZ() ) { + printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]); + return nChain; + } + + Int_t iPadX = vol[4]; + + if (iPadX<12 || iPadX>=36) nChain = 0; + else nChain = 1; + + return nChain; + +} + +//--------------------------------------------------------------------------- +Int_t AliTOFRawStream::Geant2Channel(Int_t vol[]) +{ + // + // To convert: + // nSector number -vol[0]- (variable in [0,17]) + // nPlate number -vol[1]- (variable in [0, 5]) + // nStrip number -vol[2]- (variable in [0,14/18]) + // nPadZ number -vol[3]- (variable in [0, 1]) + // nPadX number -vol[4]- (variable in [0,47]) + // in: + // nChannel (variable in [0; 7]) -> number of the TDC channel + // + + Int_t nChannel = -1; + + if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) { + printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]); + return nChannel; + } + if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) { + printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]); + return nChannel; + } + if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) { + printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1])); + return nChannel; + } + if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) + printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]); + if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) + printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]); + if ( vol[3]>=AliTOFGeometry::NpadZ() ) { + printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]); + return nChannel; + } + + Int_t iPadZ = vol[3]; + Int_t iPadX = vol[4]; + + Int_t iDDL = Geant2DDL(vol)%4; + + switch (iDDL) { + + case 0: + nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8; + break; + case 1: + nChannel = ((2*(iPadX-24) + (iPadZ)))%8; + break; + case 2: + nChannel = ((2*(iPadX-24) + (iPadZ)))%8; + break; + case 3: + nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8; + break; + } + + return nChannel; + +} + +//____________________________________________________________________________ +void AliTOFRawStream::Raw2Digits(AliRawReader* rawReader, TClonesArray * const digitsArray) +{ + // + // Converts raw data to digits for TOF + // + + TStopwatch stopwatch; + stopwatch.Start(); + + //TClonesArray *fDigits = new TClonesArray("AliTOFdigit", 4000); + //digitsTree->Branch("TOF", &fDigits); + TClonesArray &aDigits = *digitsArray; + + Int_t inholes = 0; + + Clear(); + SetRawReader(rawReader); + + //ofstream ftxt; + //if (fVerbose==2) ftxt.open("TOFdigitsRead.txt",ios::app); + + TClonesArray staticRawData("AliTOFrawData",10000); + staticRawData.Clear(); + TClonesArray * clonesRawData = &staticRawData; + + Int_t dummy = -1; + Int_t detectorIndex[5] = {-1, -1, -1, -1, -1}; + Int_t digit[4]; + + const Int_t kMaxNumberOfTracksPerDigit = 3; + Int_t tracks[kMaxNumberOfTracksPerDigit]; + for (Int_t ii=0; iiReset(); + if (fNewDecoderVersion) { + AliInfo("Using New Decoder \n"); + LoadRawDataBuffers(indexDDL, 0); + } + else + LoadRawData(indexDDL); + + clonesRawData = GetRawData(); + if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast())); + for (iRawData = 0; iRawDataGetEntriesFast(); iRawData++) { + + tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData); + + //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue; + if (tofRawDatum->GetTOF()==-1) continue; + + EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(), + tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex); + + dummy = detectorIndex[3]; + detectorIndex[3] = detectorIndex[4];//padz + detectorIndex[4] = dummy;//padx + + digit[0] = tofRawDatum->GetTOF(); + digit[1] = tofRawDatum->GetTOT(); + digit[2] = tofRawDatum->GetTOT(); + digit[3] = -1;//tofRawDatum->GetTOF(); //tofND + + dummy = detectorIndex[3]; + detectorIndex[3] = detectorIndex[4];//padx + detectorIndex[4] = dummy;//padz + + // Do not reconstruct anything in the holes + if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes + if (detectorIndex[1]==2) { // plate with holes + inholes++; + continue; + } + } + + last = digitsArray->GetEntriesFast(); + new (aDigits[last]) AliTOFdigit(tracks, detectorIndex, digit); + /* + if (fVerbose==2) { + if (indexDDL<10) ftxt << " " << indexDDL; + else ftxt << " " << indexDDL; + if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM(); + else ftxt << " " << tofRawDatum->GetTRM(); + ftxt << " " << tofRawDatum->GetTRMchain(); + if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC(); + else ftxt << " " << tofRawDatum->GetTDC(); + ftxt << " " << tofRawDatum->GetTDCchannel(); + + if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0]; + else ftxt << " -> " << detectorIndex[0]; + ftxt << " " << detectorIndex[1]; + if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2]; + else ftxt << " " << detectorIndex[2]; + ftxt << " " << detectorIndex[4]; + if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3]; + else ftxt << " " << detectorIndex[3]; + + if (digit[1]<10)ftxt << " " << digit[1]; + else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1]; + else ftxt << " " << digit[1]; + if (digit[0]<10) ftxt << " " << digit[0] << endl; + else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl; + else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl; + else ftxt << " " << digit[3] << endl; + } + */ + AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d, %d)", + last, + detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3], + digit[0], digit[1], digit[3])); + + tofRawDatum = 0; + } // loop on tofRawData array + + clonesRawData->Clear(); + + } // DDL Loop + + //if (fVerbose==2) ftxt.close(); + + + if (inholes) AliWarning(Form("Raw data in the TOF holes: %d",inholes)); + + Int_t nDigits = digitsArray->GetEntries(); + AliDebug(1, Form("Got %d TOF digits", nDigits)); + AliDebug(1, Form("Execution time to read TOF raw data and fill TOF digit tree : R:%.2fs C:%.2fs", + stopwatch.RealTime(),stopwatch.CpuTime())); + +} + +//____________________________________________________________________________ +void AliTOFRawStream::Raw2SDigits(AliRawReader* rawReader, TClonesArray * const sdigitsArray) +{ + // + // Converts raw data to sdigits for TOF + // + + TStopwatch stopwatch; + stopwatch.Start(); + + Int_t inholes = 0; + + //if(!GetLoader()->TreeS()) {MakeTree("S"); MakeBranch("S");} + TClonesArray &aSDigits = *sdigitsArray; + + Clear(); + SetRawReader(rawReader); + + //ofstream ftxt; + //if (fVerbose==2) ftxt.open("TOFsdigitsRead.txt",ios::app); + + TClonesArray staticRawData("AliTOFrawData",10000); + staticRawData.Clear(); + TClonesArray * clonesRawData = &staticRawData; + + Int_t dummy = -1; + Int_t detectorIndex[5] = {-1, -1, -1, -1, -1}; + Int_t digit[2]; + Int_t track = -1; + Int_t last = -1; + + Int_t indexDDL = 0; + Int_t iRawData = 0; + AliTOFrawData *tofRawDatum = 0; + for (indexDDL=0; indexDDLReset(); + if (fNewDecoderVersion) { + AliInfo("Using New Decoder \n"); + LoadRawDataBuffers(indexDDL, 0); + } + else + LoadRawData(indexDDL); + + clonesRawData = GetRawData(); + if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast())); + for (iRawData = 0; iRawDataGetEntriesFast(); iRawData++) { + + tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData); + + //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue; + if (tofRawDatum->GetTOF()==-1) continue; + + EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(), + tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex); + + dummy = detectorIndex[3]; + detectorIndex[3] = detectorIndex[4];//padz + detectorIndex[4] = dummy;//padx + + digit[0] = tofRawDatum->GetTOF(); + digit[1] = tofRawDatum->GetTOT(); + + dummy = detectorIndex[3]; + detectorIndex[3] = detectorIndex[4];//padx + detectorIndex[4] = dummy;//padz + + // Do not reconstruct anything in the holes + if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes + if (detectorIndex[1]==2) { // plate with holes + inholes++; + continue; + } + } + + last = sdigitsArray->GetEntriesFast(); + new (aSDigits[last]) AliTOFSDigit(track, detectorIndex, digit); + /* + if (fVerbose==2) { + if (indexDDL<10) ftxt << " " << indexDDL; + else ftxt << " " << indexDDL; + if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM(); + else ftxt << " " << tofRawDatum->GetTRM(); + ftxt << " " << tofRawDatum->GetTRMchain(); + if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC(); + else ftxt << " " << tofRawDatum->GetTDC(); + ftxt << " " << tofRawDatum->GetTDCchannel(); + + if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0]; + else ftxt << " -> " << detectorIndex[0]; + ftxt << " " << detectorIndex[1]; + if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2]; + else ftxt << " " << detectorIndex[2]; + ftxt << " " << detectorIndex[4]; + if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3]; + else ftxt << " " << detectorIndex[3]; + + if (digit[1]<10)ftxt << " " << digit[1]; + else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1]; + else ftxt << " " << digit[1]; + if (digit[0]<10) ftxt << " " << digit[0] << endl; + else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl; + else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl; + else ftxt << " " << digit[3] << endl; + } + */ + AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d)", + last, + detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3], + digit[0], digit[1])); + + tofRawDatum = 0; + } // while loop + + clonesRawData->Clear(); + + } // DDL Loop + + //if (fVerbose==2) ftxt.close(); + + if (inholes) AliWarning(Form("Clusters in the TOF holes: %d",inholes)); + + Int_t nSDigits = sdigitsArray->GetEntries(); + AliDebug(1, Form("Got %d TOF sdigits", nSDigits)); + AliDebug(1, Form("Execution time to read TOF raw data and fill TOF sdigit tree : R:%.2fs C:%.2fs", + stopwatch.RealTime(),stopwatch.CpuTime())); + +} + +void AliTOFRawStream::VolumeID2LTM(Int_t detind[], + Int_t &iDDL, + Int_t &iTRM, + Int_t &iChain, + Int_t &iTDC, + Int_t &iChannel) const { + // + // To convert the TOF trigger macropad ID (i.e. detind) + // into TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel) + // + + const Int_t kFirstTDCnumber = 12; + + iDDL=-1, iTRM = 3 , iChain=-1, iTDC=-1, iChannel=-1; + if (detind[1]==0 || detind[1]==1 || (detind[1]==2 && detind[2]<=7)) { + if (detind[4]<24) + iDDL = detind[0]*4; + else + iDDL = detind[0]*4; + } + else { + if (detind[4]<24) + iDDL = detind[0]*4+2; + else + iDDL = detind[0]*4+2; + } + + iChain=fgkChainMap24[detind[1]][detind[2]]; + iTDC=(Int_t)(fgkChannelMap24[detind[1]][detind[2]]/8)+kFirstTDCnumber; + iChannel=fgkChannelMap24[detind[1]][detind[2]]%8; + +} + +void AliTOFRawStream::LTM2VolumeID(Int_t iDDL, + Int_t iTRM, + Int_t iChain, + Int_t iTDC, + Int_t iChannel, + Int_t detind0[], Int_t detind1[]) const { + // + // To convert the TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel) + // into TOF trigger macropad IDs (i.e. detind0 and detind1). + // In general, a couple of neighbouring TOF semi-strip represents a TOF trigger macropad. + // + + const Int_t kFirstTDCnumber = 12; + + Int_t iSector0=-1, iModule0=-1, iStrip0=-1, iPadX0=-1; // Le variabili del Volume ID + Int_t iSector1=-1, iModule1=-1, iStrip1=-1, iPadX1=-1; // Le variabili del Volume ID + + if( iDDL%2==1 && iTRM==3 && iTDC-kFirstTDCnumber>=0 && iTDC-kFirstTDCnumber<3 ) { + iSector0 = (Int_t)(iDDL/4); + iSector1 = (Int_t)(iDDL/4); + Int_t iChan= iChannel+(iTDC-kFirstTDCnumber)*8; + if( iDDL%4 == 1 ){ + if(iChain==0){ //CRATE 0 + iPadX0=0; + iPadX1=0; + iStrip0=fgkStrip0MapCrate0[iChan]; + iStrip1=fgkStrip1MapCrate0[iChan]; + iModule0=fgkModule0MapCrate0[iChan]; + iModule1=fgkModule1MapCrate0[iChan]; + } + if(iChain==1){// CRATE 1 + iPadX0=24; + iPadX1=24; + iStrip0=fgkStrip0MapCrate1[iChan]; + iStrip1=fgkStrip1MapCrate1[iChan]; + iModule0=fgkModule0MapCrate1[iChan]; + iModule1=fgkModule1MapCrate1[iChan]; + } + + } + if( iDDL%4 == 3 ){ + if(iChain==1){// CRATE 3 + iPadX0=0; + iPadX1=0; + iStrip0=fgkStrip0MapCrate3[iChan]; + iStrip1=fgkStrip1MapCrate3[iChan]; + iModule0=fgkModule0MapCrate3[iChan]; + iModule1=fgkModule1MapCrate3[iChan]; + } + if(iChain==0){// CRATE 2 + iPadX0=24; + iPadX1=24; + iStrip0=fgkStrip0MapCrate2[iChan]; + iStrip1=fgkStrip1MapCrate2[iChan]; + iModule0=fgkModule0MapCrate2[iChan]; + iModule1=fgkModule1MapCrate2[iChan]; + } + } + } + + if(iStrip1==-1 || iModule1==-1){ + detind1[0]=-1; + detind1[1]=-1; + detind1[2]=-1; + detind1[3]=-1; + detind1[4]=-1; + } + else{ + detind1[0]=iSector1; + detind1[1]=iModule1; + detind1[2]=iStrip1; + detind1[3]=iPadX1; + detind1[4]=0; + } + + if(iStrip0==-1 || iModule0==-1){ + detind0[0]=-1; + detind0[1]=-1; + detind0[2]=-1; + detind0[3]=-1; + detind0[4]=-1; + } + else{ + detind0[0]=iSector0; + detind0[1]=iModule0; + detind0[2]=iStrip0; + detind0[3]=iPadX0; + detind0[4]=0; + } +}