X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TOF%2FAliTOFRawStream.cxx;h=7fc828efaa76979541ca862557c16b8d6bb4caf7;hb=0eeb3a7a2a7ab3f1f7075707c22a52d4ad41bb8f;hp=3efeb6e5b4497e068f11ef903cc40497965b4f1f;hpb=36f66fad1aba90954a8bf93a836a5fb972dfdefe;p=u%2Fmrichter%2FAliRoot.git diff --git a/TOF/AliTOFRawStream.cxx b/TOF/AliTOFRawStream.cxx index 3efeb6e5b44..7fc828efaa7 100644 --- a/TOF/AliTOFRawStream.cxx +++ b/TOF/AliTOFRawStream.cxx @@ -15,6 +15,18 @@ /* $Log$ +Revision 1.12 2007/02/22 09:43:45 decaro +Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli) + +Revision 1.11 2007/02/20 15:57:00 decaro +Raw data update: to read the TOF raw data defined in UNPACKED mode + +Revision 1.10 2006/12/15 14:01:38 cvetan +Memory leak fixed + +Revision 1.9 2006/10/13 11:22:27 arcelli +remove warnings due to uninitialized AliTOFtdcDigit data members + Revision 1.8 2006/08/22 13:30:17 arcelli removal of effective c++ warnings (C.Zampolli) @@ -55,11 +67,17 @@ Revision 0.01 2005/07/22 A. De Caro // // //////////////////////////////////////////////////////////////////////// + +#include "TClonesArray.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" @@ -248,6 +266,13 @@ TRM DATA FORMAT #define TRM_PS_BITS_MASK 0x60000000 #define TRM_PS_BITS_POSITION 29 +#define TRM_FIRST_SLOT_ID 3 + +//define hptdc time bin width +#define TIME_BIN_WIDTH 24.4e-3 //ns + +//define hptdc tot bin width +#define TOT_BIN_WIDTH 48.4e-3 //ns //TRM errors @@ -362,184 +387,134 @@ ClassImp(AliTOFRawStream) //_____________________________________________________________________________ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader): - fRawReader(0x0), + fRawReader(rawReader), + fTOFrawData(new TClonesArray("AliTOFrawData",1000)), fDDL(-1), fTRM(-1), - fTDC(-1), fTRMchain(-1), + fTDC(-1), fTDCchannel(-1), - fTof(-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), - fTime(-1), fTDCerrorFlag(-1), fInsideDRM(kFALSE), fInsideTRM(kFALSE), fInsideLTM(kFALSE), fInsideTRMchain0(kFALSE), - fInsideTRMchain1(kFALSE), - fLeadingOrphane(kFALSE) + fInsideTRMchain1(kFALSE) { // // create an object to read TOF raw digits // - fRawReader = rawReader; - /* - fDDL = -1; - fTRM = -1; - fTDC = -1; - fTRMchain = -1; - fTDCchannel = -1; - fTof = -1; - fToT = -1; - fErrorFlag = -1; - - fSector = -1; - fPlate = -1; - fStrip = -1; - fPadX = -1; - fPadZ = -1; - fTOFGeometry = new AliTOFGeometryV5(); - */ + fRawReader->Reset(); fRawReader->Select("TOF"); - /* - fWordType = -1; - fSlotID = -1; - fACQ = -1; - fPSbit = -1; - fTime = -1; - fTDCerrorFlag = -1; - fInsideDRM = kFALSE; - fInsideTRM = kFALSE; - fInsideLTM = kFALSE; - fInsideTRMchain0 = kFALSE; - fInsideTRMchain1 = kFALSE; - fLeadingOrphane = kFALSE; - */ + } //_____________________________________________________________________________ AliTOFRawStream::AliTOFRawStream(): fRawReader(0x0), + fTOFrawData(new TClonesArray("AliTOFrawData",1000)), fDDL(-1), fTRM(-1), - fTDC(-1), fTRMchain(-1), + fTDC(-1), fTDCchannel(-1), - fTof(-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), - fTime(-1), fTDCerrorFlag(-1), fInsideDRM(kFALSE), fInsideTRM(kFALSE), fInsideLTM(kFALSE), fInsideTRMchain0(kFALSE), - fInsideTRMchain1(kFALSE), - fLeadingOrphane(kFALSE) + fInsideTRMchain1(kFALSE) { // // default ctr // - /* - fRawReader = 0x0; - fDDL = -1; - fTRM = -1; - fTDC = -1; - fTRMchain = -1; - fTDCchannel = -1; - fTof = -1; - fToT = -1; - fErrorFlag = -1; - - fSector = -1; - fPlate = -1; - fStrip = -1; - fPadX = -1; - fPadZ = -1; - fTOFGeometry = new AliTOFGeometryV5(); - fWordType = -1; - fSlotID = -1; - fACQ = -1; - fPSbit = -1; - fTime = -1; - fTDCerrorFlag = -1; - fInsideDRM = kFALSE; - fInsideTRM = kFALSE; - fInsideLTM = kFALSE; - fInsideTRMchain0 = kFALSE; - fInsideTRMchain1 = kFALSE; - fLeadingOrphane = kFALSE; - */ + } //_____________________________________________________________________________ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) : TObject(stream), fRawReader(0x0), + fTOFrawData(new TClonesArray("AliTOFrawData",1000)), fDDL(-1), fTRM(-1), - fTDC(-1), fTRMchain(-1), + fTDC(-1), fTDCchannel(-1), - fTof(-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), - fTime(-1), fTDCerrorFlag(-1), fInsideDRM(kFALSE), fInsideTRM(kFALSE), fInsideLTM(kFALSE), fInsideTRMchain0(kFALSE), - fInsideTRMchain1(kFALSE), - fLeadingOrphane(kFALSE) + fInsideTRMchain1(kFALSE) { // // copy constructor // fRawReader = stream.fRawReader; + + fTOFrawData = stream.fTOFrawData; + fDDL = stream.fDDL; fTRM = stream.fTRM; - fTDC = stream.fTDC; fTRMchain = stream.fTRMchain; + fTDC = stream.fTDC; fTDCchannel = stream.fTDCchannel; - fTof = stream.fTof; + fTime = stream.fTime; fToT = stream.fToT; + fLeadingEdge = stream.fLeadingEdge; + fTrailingEdge = stream.fTrailingEdge; + fErrorFlag = stream.fErrorFlag; fSector = stream.fSector; @@ -550,18 +525,18 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) : fTOFGeometry = stream.fTOFGeometry; + fPackedDigits = stream.fPackedDigits; + fWordType = stream.fWordType; fSlotID = stream.fSlotID; fACQ = stream.fACQ; fPSbit = stream.fPSbit; - fTime = stream.fTime; fTDCerrorFlag = stream.fTDCerrorFlag; fInsideDRM = stream.fInsideDRM; fInsideTRM = stream.fInsideTRM; fInsideLTM = stream.fInsideLTM; fInsideTRMchain0 = stream.fInsideTRMchain0; fInsideTRMchain1 = stream.fInsideTRMchain1; - fLeadingOrphane = stream.fLeadingOrphane; } @@ -573,13 +548,18 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream) // fRawReader = stream.fRawReader; + + fTOFrawData = stream.fTOFrawData; + fDDL = stream.fDDL; fTRM = stream.fTRM; - fTDC = stream.fTDC; fTRMchain = stream.fTRMchain; + fTDC = stream.fTDC; fTDCchannel = stream.fTDCchannel; - fTof = stream.fTof; + fTime = stream.fTime; fToT = stream.fToT; + fLeadingEdge = stream.fLeadingEdge; + fTrailingEdge = stream.fTrailingEdge; fErrorFlag = stream.fErrorFlag; fSector = stream.fSector; @@ -590,18 +570,18 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream) fTOFGeometry = stream.fTOFGeometry; + fPackedDigits = stream.fPackedDigits; + fWordType = stream.fWordType; fSlotID = stream.fSlotID; fACQ = stream.fACQ; fPSbit = stream.fPSbit; - fTime = stream.fTime; fTDCerrorFlag = stream.fTDCerrorFlag; fInsideDRM = stream.fInsideDRM; fInsideTRM = stream.fInsideTRM; fInsideLTM = stream.fInsideLTM; fInsideTRMchain0 = stream.fInsideTRMchain0; fInsideTRMchain1 = stream.fInsideTRMchain1; - fLeadingOrphane = stream.fLeadingOrphane; return *this; @@ -612,11 +592,120 @@ AliTOFRawStream::~AliTOFRawStream() { // destructor - fTOFGeometry = 0; + fPackedDigits = 0; + + delete fTOFGeometry; + + //delete fTOFrawData; } +//_____________________________________________________________________________ + +void AliTOFRawStream::LoadRawData(Int_t indexDDL) +{ + + /* + for (Int_t indexDDL = 0; + indexDDL < AliDAQ::NumberOfDdls("TOF"); + indexDDL++) { + */ + + fTOFrawData->Clear(); + fPackedDigits = 0; + + // create raw data map + AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData); + rawMap->Clear(); + + Int_t slot[4] = {-1, -1, -1, -1}; + + fRawReader->Reset(); + fRawReader->Select("TOF", indexDDL, indexDDL); + + Bool_t signal = kFALSE; + + 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); + + slot[0] = fTRM; + slot[1] = fTRMchain; + slot[2] = fTDC; + slot[3] = fTDCchannel; + + if (rawMap->TestHit(slot) != kEmpty) { + + AliTOFrawData *rawDigit = static_cast(rawMap->GetHit(slot)); + + if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 && + fLeadingEdge==-1 && fTrailingEdge!=-1) { + + rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag); + } + 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); + + 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); + + } // 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 + +} + //_____________________________________________________________________________ Bool_t AliTOFRawStream::Next() { @@ -631,18 +720,18 @@ Bool_t AliTOFRawStream::Next() if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) { fSector = -1; - fPlate = -1; - fStrip = -1; - fPadZ = -1; - fPadX = -1; + fPlate = -1; + fStrip = -1; + fPadZ = -1; + fPadX = -1; + fTime = -1; + fToT = -1; + fLeadingEdge = -1; + fTrailingEdge = -1; } - fDDL = fRawReader->GetDDLID(); - // orphane digits - AliTOFtdcDigit orphaneLeadingDigit={0,0,0,0,0,0,0}; - fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION); switch (fWordType) { // switch word type @@ -708,23 +797,23 @@ Bool_t AliTOFRawStream::Next() fInsideLTM = kFALSE; fInsideTRMchain0 = kFALSE; fInsideTRMchain1 = kFALSE; - fLeadingOrphane = kFALSE; fSector = -1; - fPlate = -1; - fStrip = -1; - fPadZ = -1; - fPadX = -1; - fDDL = -1; - fTRM = -1; - fTDC = -1; - fTRMchain = -1; + fPlate = -1; + fStrip = -1; + fPadZ = -1; + fPadX = -1; + fDDL = -1; + fTRM = -1; + fTDC = -1; + fTRMchain = -1; fTDCchannel = -1; - fTof = -1; - fToT = -1; + fTime = -1; + fToT = -1; + fLeadingEdge = -1; + fTrailingEdge = -1; fErrorFlag = -1; - fACQ = -1; + fACQ = -1; fPSbit = -1; - fTime = -1; fTDCerrorFlag = -1; break; case LTM_ID_NUMBER: // LTM global trailer @@ -748,7 +837,7 @@ Bool_t AliTOFRawStream::Next() case ERROR_TYPE: // TDC error - fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION); + fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION); fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION); break; @@ -800,84 +889,50 @@ Bool_t AliTOFRawStream::Next() && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE ){ // inside TRM chains - fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION); - fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION); + + fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION); + fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION); fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION); + fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION); + + SetSector(); + SetPlate(); + SetStrip(); + SetPadZ(); + SetPadX(); + switch (fPSbit) { // switch fPSbit bits inside TRM chains - case 0: // packing ok, digit time and tot - fToT = GetField(data,TRM_TOT_WIDTH_MASK,TRM_TOT_WIDTH_POSITION); + + 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); - fTof = fTime; - SetSector(); - SetPlate(); - SetStrip(); - SetPadZ(); - SetPadX(); break; case 1: // leading edge digit, long digit time, no TOT - fToT = -1; - fTime = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION); - fTof = fTime; - SetSector(); - SetPlate(); - SetStrip(); - SetPadZ(); - SetPadX(); - // always set it as orphane leading - fLeadingOrphane=1; - orphaneLeadingDigit.fSlotID = fSlotID; - orphaneLeadingDigit.fChain = fTRMchain; - orphaneLeadingDigit.fPS = fPSbit; - orphaneLeadingDigit.fTDC = fTDC; - orphaneLeadingDigit.fChannel = fTDCchannel; - orphaneLeadingDigit.fTOT = fToT; - orphaneLeadingDigit.fTime = fTime; + //fToT = -1; + //fTime = -1; + fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION); break; case 2: // trailing edge digit, long digit time, no TOT - fToT = -1; - fTime = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION); - fTof = fTime; - SetSector(); - SetPlate(); - SetStrip(); - SetPadZ(); - SetPadX(); - if (fACQ!=3) // check if packing is disabled - break; - if (!fLeadingOrphane) // check for a orphane leading edge - break; - if (orphaneLeadingDigit.fSlotID != fSlotID || - orphaneLeadingDigit.fChain != fTRMchain || - orphaneLeadingDigit.fTDC != fTDC || - orphaneLeadingDigit.fChannel != fTDCchannel) // check leading edge compatibility (fSlotID, fTRMchain, fTDC, fTDCchannel) - break; - fLeadingOrphane = 0; // orphane leading is no longer orphane - SetSector(); - SetPlate(); - SetStrip(); - SetPadZ(); - SetPadX(); + //fToT = -1; + //fTime = -1; + fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION); break; + case 3: // TOT overflow - fToT = GetField(data,TRM_TOT_WIDTH_MASK,TRM_TOT_WIDTH_POSITION); + fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION); fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION); - fTof = fTime; - SetSector(); - SetPlate(); - SetStrip(); - SetPadZ(); - SetPadX(); break; - } // end switch fPSbit bits inside TRM chains + } // end switch PS bits inside TRM chains } // end if is inside TRM chains } // end switch on fWordType + return kTRUE; } @@ -890,7 +945,7 @@ void AliTOFRawStream::SetSector() // corresponding to the TOF equipment IDs: // fDDL -> [ 0;71] // fTRM -> [ 3;12] - // fTRMchain -> [0; 1] + // fTRMchain -> [ 0; 1] // fTDC -> [ 0;14] // fTDCchannel -> [ 0; 7] // @@ -912,7 +967,7 @@ void AliTOFRawStream::SetPlate() // corresponding to the TOF equipment IDs: // fDDL -> [ 0;71] // fTRM -> [ 3;12] - // fTRMchain -> [0; 1] + // fTRMchain -> [ 0; 1] // fTDC -> [ 0;14] // fTDCchannel -> [ 0; 7] // @@ -934,7 +989,7 @@ void AliTOFRawStream::SetStrip() // corresponding to the TOF equipment IDs: // fDDL -> [ 0;71] // fTRM -> [ 3;12] - // fTRMchain -> [0; 1] + // fTRMchain -> [ 0; 1] // fTDC -> [ 0;14] // fTDCchannel -> [ 0; 7] // @@ -957,7 +1012,7 @@ void AliTOFRawStream::SetPadZ() // corresponding to the TOF equipment IDs: // fDDL -> [ 0;71] // fTRM -> [ 3;12] - // fTRMchain -> [0; 1] + // fTRMchain -> [ 0; 1] // fTDC -> [ 0;14] // fTDCchannel -> [ 0; 7] // @@ -984,7 +1039,7 @@ void AliTOFRawStream::SetPadX() // corresponding to the TOF equipment IDs: // fDDL -> [ 0;71] // fTRM -> [ 3;12] - // fTRMchain -> [0; 1] + // fTRMchain -> [ 0; 1] // fTDC -> [ 0;14] // fTDCchannel -> [ 0; 7] // @@ -1299,3 +1354,55 @@ 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 kSectors = fTOFGeometry->NSectors(); + const Int_t kPlates = fTOFGeometry->NPlates(); + const Int_t kStripA = fTOFGeometry->NStripA(); + const Int_t kStripB = fTOFGeometry->NStripB(); + const Int_t kStripC = fTOFGeometry->NStripC(); + const Int_t kPadX = fTOFGeometry->NpadX(); + const Int_t kPadZ = fTOFGeometry->NpadZ(); + + + Int_t isector = detId[0]; + if (isector >= kSectors) + AliError(Form("Wrong sector number in TOF (%d) !",isector)); + Int_t iplate = detId[1]; + if (iplate >= kPlates) + 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 = kStripC; + break; + case 2: + stripOffset = kStripC+kStripB; + break; + case 3: + stripOffset = kStripC+kStripB+kStripA; + break; + case 4: + stripOffset = kStripC+kStripB+kStripA+kStripB; + break; + default: + AliError(Form("Wrong plate number in TOF (%d) !",iplate)); + break; + }; + + Int_t idet = ((2*(kStripC+kStripB)+kStripA)*kPadZ*kPadX)*isector + + (stripOffset*kPadZ*kPadX)+ + (kPadZ*kPadX)*istrip+ + (kPadX)*ipadz+ + ipadx; + return idet; +}