////////////////////////////////////////////////////////////////////////
+#include "Riostream.h"
+
#include "TClonesArray.h"
#include "AliDAQ.h"
#include "AliTOFrawData.h"
#include "AliTOFRawMap.h"
#include "AliTOFRawStream.h"
+//#include "AliTOFCableLengthMap.h"
#include "AliTOFHitData.h"
+#include "AliRawEventHeaderBase.h"
+
ClassImp(AliTOFRawStream)
+const Int_t AliTOFRawStream::fgkddlBCshift[72] =
+{
+ 2, 2, -1, -1,
+ 2, 3, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, 0, 0,
+ 2, 2, -1, -1,
+ 2, 2, -1, -1,
+ 2, 2, -2, -2,
+ 2, 2, -2, -2,
+ 2, 2, -2, -2,
+ 2, 2, -1, -1,
+ 2, 2, -1, -1,
+ 2, 2, -1, -1
+};
+
//_____________________________________________________________________________
AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
fInsideTRM(kFALSE),
fInsideLTM(kFALSE),
fInsideTRMchain0(kFALSE),
- fInsideTRMchain1(kFALSE)
+ fInsideTRMchain1(kFALSE),
+ fLocalEventCounterDRM(-1),
+ fLocalEventCounterLTM(-1),
+ fLocalEventCounterTRM(0x0),
+ fLocalEventCounterChain(0x0),
+ fCableLengthMap(0x0),
+ fEventID(0)
{
//
// create an object to read TOF raw digits
fRawReader->Reset();
fRawReader->Select("TOF");
+
+ fLocalEventCounterTRM = new Int_t[13];//adc
+ fLocalEventCounterChain = new Int_t*[13];//adc
+ for (Int_t j=0;j<13;j++){//adc
+ fLocalEventCounterTRM[j] = -1;//adc
+ fLocalEventCounterChain[j] = new Int_t[2];//adc
+ for (Int_t k=0;k<2;k++){//adc
+ fLocalEventCounterChain[j][k] = -1;//adc
+ }//adc
+ }//adc
+
+ fCableLengthMap = new AliTOFCableLengthMap();
+
+ fEventID = fRawReader->GetBCID(); //bunch crossing
}
//_____________________________________________________________________________
fInsideTRM(kFALSE),
fInsideLTM(kFALSE),
fInsideTRMchain0(kFALSE),
- fInsideTRMchain1(kFALSE)
+ fInsideTRMchain1(kFALSE),
+ fLocalEventCounterDRM(-1),
+ fLocalEventCounterLTM(-1),
+ fLocalEventCounterTRM(0x0),
+ fLocalEventCounterChain(0x0),
+ fCableLengthMap(0x0),
+ fEventID(0)
{
//
// default ctr
fTOFrawData = new TClonesArray("AliTOFrawData",1000);
fTOFrawData->SetOwner();
+
+ fLocalEventCounterTRM = new Int_t[13];//adc
+ fLocalEventCounterChain = new Int_t*[13];//adc
+ for (Int_t j=0;j<13;j++){//adc
+ fLocalEventCounterTRM[j] = -1;//adc
+ fLocalEventCounterChain[j] = new Int_t[2];//adc
+ for (Int_t k=0;k<2;k++){//adc
+ fLocalEventCounterChain[j][k] = -1;//adc
+ }//adc
+ }//adc
+
+ fCableLengthMap = new AliTOFCableLengthMap();
+
}
//_____________________________________________________________________________
fInsideTRM(kFALSE),
fInsideLTM(kFALSE),
fInsideTRMchain0(kFALSE),
- fInsideTRMchain1(kFALSE)
+ fInsideTRMchain1(kFALSE),
+ fLocalEventCounterDRM(-1),
+ fLocalEventCounterLTM(-1),
+ fLocalEventCounterTRM(0x0),
+ fLocalEventCounterChain(0x0),
+ fCableLengthMap(0x0),
+ fEventID(0)
{
//
// copy constructor
}
fTOFrawData = new TClonesArray(*stream.fTOFrawData);
-
+
+ fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
+ fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
+ for (Int_t j=0;j<13;j++){//adc
+ fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
+ for (Int_t k=0;k<2;k++){//adc
+ fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
+ }//adc
+ }//adc
+
+ fCableLengthMap = stream.fCableLengthMap;
+
+ fEventID = stream.fEventID;
+
}
//_____________________________________________________________________________
}
fTOFrawData = stream.fTOFrawData;
-
+
+ fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
+ fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
+ for (Int_t j=0;j<13;j++){//adc
+ fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
+ for (Int_t k=0;k<2;k++){//adc
+ fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
+ }//adc
+ }//adc
+
+ fCableLengthMap = stream.fCableLengthMap;
+
+ fEventID = stream.fEventID;
+
return *this;
}
fTOFrawData->Clear();
delete fTOFrawData;
+
+ delete [] fLocalEventCounterTRM;
+ for (Int_t ii=0; ii<2; ii++)
+ delete [] fLocalEventCounterChain[ii];
+
+ delete fCableLengthMap;
+
}
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;
+
fRawReader->Reset();
fRawReader->Select("TOF", indexDDL, indexDDL);
signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
if (signal) {
- AliDebug(2,Form(" %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;
UInt_t data;
+ Int_t dummy = 0;
+
if (!fRawReader->ReadNextInt(data)) return kFALSE;
if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
case GLOBAL_TRAILER_TYPE: // global trailer
fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
-
switch (fSlotID) { // switch global trailer slot ID
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);//adc
fInsideDRM = kFALSE; // DRM global trailer accepted
fInsideTRM = kFALSE;
fInsideLTM = kFALSE;
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);//adc
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);//adc
fInsideTRM = kFALSE; // TRM global trailer accepted
break;
default: // unexpected global trailer slot ID
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);//adc
fInsideTRMchain0 = kFALSE;
fTRMchain = -1;
break;
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);//adc
fInsideTRMchain1 = kFALSE;
fTRMchain = -1;
break;
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)
+ /*+
+ (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
+ +
+ (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
+ ;
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)
+ /*+
+ (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
+ +
+ (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
+ ;
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)
+ /*+
+ (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
+ +
+ (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
+ ;
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)
+ /*+
+ (Int_t)(fgkddlBCshift[fDDL]*25.*1000./AliTOFGeometry::TdcBinWidth())
+ +
+ (Int_t)((fLocalEventCounterChain[fTRM][fTRMchain]-fEventID)*25.*1000./AliTOFGeometry::TdcBinWidth())*/
+ ;
break;
} // end switch PS bits inside TRM chains
iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
}
+ //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
+ //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
+
fPadZ = iPadZ;
}
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;
}
}
//----------------------------------------------------------------------------
-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]
}
//----------------------------------------------------------------------------
-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:
//----------------------------------------------------------------------------
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]
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;
if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
- fRawReader->AddMajorErrorLog(kPadXError);
- AliWarning("Problems with the padX number!");
+ std::cerr << "Problems with the padX number!" << endl;
+ //AliWarning("Problems with the padX number!");
}
return iPadAlongTheStrip;
}
+//----------------------------------------------------------------------------
+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) const
{
Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
if (iPlate==-1) {
- fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
+ if (fRawReader)
+ fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
AliWarning("Problems with the plate number!");
}
Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
if (iStrip==-1) {
- fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
+ if (fRawReader)
+ fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
AliWarning("Problems with the strip number!");
}
Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
if (iPadAlongTheStrip==-1){
- fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
+ if (fRawReader)
+ fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
AliWarning("Problems with the pad number along the strip!");
}
-
+
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;
Int_t hitTimeBin = hitData->GetTimeBin();
Int_t hitTOTBin = hitData->GetTOTBin();
- Int_t hitLeading = hitData->GetTimeBin();//-1; // adc
+ Int_t hitLeading = hitData->GetTimeBin()
+ -
+ fCableLengthMap->GetCableTimeShiftBin(indexDDL, hitSlotID, hitChain, hitTDC);//-1; // adc
Int_t hitTrailing = -1;
Int_t hitError = -1;