fWord(0),
fZeroSup(kTRUE),
fPos(0x0),
- fiPos(0)
+ fiPos(0),
+ fTurbo(kFALSE),
+ fRawDataSize(0)
{
//
// Constructor
fWord(0),
fZeroSup(kTRUE),
fPos(0x0),
- fiPos(0)
+ fiPos(0),
+ fTurbo(kFALSE) ,
+ fRawDataSize(0)
{
//
// Constructor
for(Int_t iddl=0;iddl<kNDDL;iddl++)
for(Int_t ierr=0; ierr < kSumErr; ierr++) fNumOfErr[iddl][ierr]=0; //reset errors
+
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AliHMPIDRawStream::~AliHMPIDRawStream()
fPosition=0;
fWord=0;
fZeroSup=0;
-
- for(Int_t i=0;i<kSumErr;i++) delete [] fNumOfErr[i];
+ fTurbo=0;
+ fRawDataSize=0;
+ for(Int_t i=0;i<kNDDL;i++) delete [] fNumOfErr[i];
delete [] fNumOfErr;
- if(fnDDLInStream) { delete [] fnDDLInStream; fnDDLInStream = 0x0; }
+ delete [] fnDDLInStream;
+ delete [] fnDDLOutStream;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDRawStream::Reset()
if (fRawReader) fRawReader->Reset();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+Bool_t AliHMPIDRawStream::Turbo()
+{
+
+ Int_t row,dilogic;UInt_t pad;
+ Int_t cntGlob = fRawReader->GetDataSize()/4;
+ fPosition=0;
+ fNPads=0;
+// Int_t gw=0;
+ for(Int_t i=1;i<cntGlob;i++) {
+ if(!GetWord(1)) return kFALSE;
+ if (((fWord >> kbit27) & 1)) continue;
+ UInt_t statusControlRow = 0x32a8;
+ UInt_t rowControlWord = fWord >> kbit0 & 0xfbff;
+ if(rowControlWord == statusControlRow) continue;
+
+ row = (fWord >> kbit22) & 0x1f;
+ dilogic = (fWord >> kbit18) & 0xf; //dilogic info in raw word is between bits: 18...21
+
+ pad = (fWord >> kbit12) & 0x3f; //pad info in raw word is between bits: 12...17
+ if(!CheckPad(pad)) continue;
+ Int_t charge = fWord & 0xfff;
+ if(GetPad(fDDLNumber,row,dilogic,pad)<0) continue;
+ fPad[fNPads] = GetPad(fDDLNumber,row,dilogic,pad);
+ fCharge[fNPads] = charge;
+ fNPads++;
+ if(charge==0) fNumOfErr[fDDLNumber][kPedQZero]++;
+ }//word loop
+ //Printf("Size: %i DDL %i row %i dilogic %i pad %i fPos %i fNPads: %i Charge: %d Word %4.4x GoodW: %i",cntGlob,fDDLNumber,row,dilogic,pad,fPosition,fNPads,fCharge[fNPads-1],fWord,gw++);
+ return kTRUE;
+}//Turbo()
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Bool_t AliHMPIDRawStream::Next()
{
// read next DDL raw data from the HMPID raw data stream
*/
fPosition = 0;
- Bool_t status;
- Int_t rawDataSize=0;
+ Bool_t status=kFALSE;
+ fRawDataSize=0;
+ fDDLNumber = fRawReader->GetDDLID();
if(fRawReader->GetType() == 7 || fRawReader->GetType() == 8 ) { //New: Select Physics events, Old: Raw data size is not 0 and not 47148 (pedestal)
- fDDLNumber = fRawReader->GetDDLID();
fnDDLInStream[fDDLNumber]=1; fnDDLOutStream[fDDLNumber]=0;
fLDCNumber = fRawReader->GetLDCId();
fTimeStamp = fRawReader->GetTimestamp();
AliDebug(1,Form("DDL %i started to be decoded!",fDDLNumber));
- rawDataSize=fRawReader->GetDataSize()/4;
- DelVars(); //We have to delete the variables initialized in the InitVars before recall IntiVars!!!
- InitVars(rawDataSize); //To read the charge and pads we cannot delete before the status return
+ fRawDataSize=fRawReader->GetDataSize()/4;
+ DelVars(); //We have to delete the variables initialized in the InitVars before recall IntiVars!!!
+ InitVars(fRawDataSize); //To read the charge and pads we cannot delete before the status return
- status = ReadHMPIDRawData();
+ if(fTurbo==kTRUE) status=Turbo();
+ else status = ReadHMPIDRawData();
if(status) AliDebug(1,Form("Event DDL %i successfully decoded!.",fDDLNumber));
else AliDebug(1,Form("Event DDL %i ERROR in decoding!.",fDDLNumber));
-// DumpData(fRawReader->GetDataSize());
+ //DumpData(fRawReader->GetDataSize());
}
fPad = new Int_t[n];
//for debug purpose
fPos = new Int_t[4*n+4]; //reset debug
+ for(Int_t ie = 0 ; ie < 4*n+4; ie++) fPos[ie] = 0; //initialize for 0, otherwise the position is considered filled and will not be updated for the dump
fiPos = 0;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cnt--;
- while (cnt>0) {
-
+ while (cnt>20) { //counter limit is changed from 0 to 20 to take into account (skipp) the 5 extra words in the equipment header
nwSeg = (fWord >> kbit8) & 0xfff;
if(!CheckSegment()) return kFALSE;
if(!ReadSegment(cntSegment)) return kFALSE;
UInt_t pad = (fWord >> kbit12) & 0x3f; //pad info in raw word is between bits: 12...17
if(!CheckPad(pad)) continue;
Int_t charge = fWord & 0xfff;
+ if(GetPad(fDDLNumber,row,dilogic,pad)<0) continue;
fPad[fNPads] = GetPad(fDDLNumber,row,dilogic,pad);
fCharge[fNPads] = charge;
fNPads++;
if(charge==0)
{
- AliWarning(Form("If PEDESTAL run -> WARNING: ZERO charge is read from DDL: %d row: %d dil: %d pad: %d",fDDLNumber,row,dilogic,pad));
+ AliDebug(1,Form("If PEDESTAL run -> WARNING: ZERO charge is read from DDL: %d row: %d dil: %d pad: %d",fDDLNumber,row,dilogic,pad));
fNumOfErr[fDDLNumber][kPedQZero]++;
}
UInt_t segWord = GetWord();
if ((segWord >> 20) != statusSegWord) {
fRawReader->AddMajorErrorLog(kBadSegWordErr);
- AliWarning(Form("Wrong segment word signature: %x, expected 0xab0!",(segWord >> 20)));
+ AliDebug(1,Form("Wrong segment word signature: %x, expected 0xab0!",(segWord >> 20)));
fNumOfErr[kBadSegWordErr]++;
return kTRUE;
}
UInt_t segMarker = (fWord >> kbit20) & 0xfff;
if (segMarker != markSegment ) {
//fRawReader->AddMajorErrorLog(kWrongSegErr,Form("Segment marker %0X wrong (expected %0X) at %i in word %0X!",segMarker,markSegment,fPosition,fWord));
- AliWarning(Form("Segment marker %X wrong (expected %0X)! at %i in word %0X!",segMarker,markSegment,fPosition,fWord));
+ AliDebug(1,Form("Segment marker %X wrong (expected %0X)! at %i in word %0X!",segMarker,markSegment,fPosition,fWord));
fNumOfErr[fDDLNumber][kWrongSegErr]++;
return kFALSE;
}
UInt_t segAddress = fWord & 0xff;
if (segAddress<1 ||segAddress>3) {
//fRawReader->AddMajorErrorLog(kWrongSegErr,Form("Segment address %d not in the valid range [1-3] at %i in word %0X",segAddress,fPosition,fWord));
- AliWarning(Form("Segment address %d not in the valid range [1-3]",segAddress));
+ AliDebug(1,Form("Segment address %d not in the valid range [1-3]",segAddress));
fNumOfErr[fDDLNumber][kWrongSegErr]++;
return kFALSE;
}
if(row>=1 && row <=kNRows) return kTRUE;
//fRawReader->AddMajorErrorLog(kWrongRowErr,Form("row %d",row));
- AliWarning(Form("Wrong row index: %d, expected (1 -> %d) word %0X at %i...",row,kNRows,fWord,fPosition));
+ AliDebug(1,Form("Wrong row index: %d, expected (1 -> %d) word %0X at %i...",row,kNRows,fWord,fPosition));
fNumOfErr[fDDLNumber][kWrongRowErr]++;
return kFALSE;
}
if (dilogic>= 1 && dilogic <=kNDILOGICAdd) return kTRUE;
//fRawReader->AddMajorErrorLog(kWrongDilogicErr,Form("dil %d",dilogic));
- AliWarning(Form("Wrong DILOGIC index: %d, expected (1 -> %d)!",dilogic,kNDILOGICAdd));
+ AliDebug(1,Form("Wrong DILOGIC index: %d, expected (1 -> %d)!",dilogic,kNDILOGICAdd));
fNumOfErr[fDDLNumber][kWrongDilogicErr]++;
//dilogic = iDILOGIC;
return kFALSE;
if (pad < kNPadAdd) return kTRUE;
//fRawReader->AddMajorErrorLog(kWrongPadErr,Form("pad %d",pad));
- AliWarning(Form("Wrong pad index: %d, expected (0 -> %d)!",pad,kNPadAdd));
+ AliDebug(1,Form("Wrong pad index: %d, expected (0 -> %d)!",pad,kNPadAdd));
fNumOfErr[fDDLNumber][kWrongPadErr]++;
return kFALSE;
}
// kTRUE if all OK
if (!((fWord >> kbit27) & 0x1)) { //check 27th bit in EoE. It must be 1!
//fRawReader->AddMajorErrorLog(kEoEFlagErr);
- AliWarning(Form("Missing end-of-event flag! (%08X) at %i",fWord,fPosition));
+ AliDebug(1,Form("Missing end-of-event flag! (%08X) at %i",fWord,fPosition));
fNumOfErr[fDDLNumber][kEoEFlagErr]++;
return kFALSE;
}
if(nDil < 0 || nDil > 48 ) {
//fRawReader->AddMajorErrorLog(kEoESizeErr,Form("EoE size=%d",nDil));
- AliWarning(Form("Wrong end-of-event word-count: %08X",fWord));
+ AliDebug(1,Form("Wrong end-of-event word-count: %08X",fWord));
fNumOfErr[fDDLNumber][kEoESizeErr]++;
return kFALSE;
}
// UInt_t da = (eOfEvent >> 18) & 0xf;
// if (cntData!=0 && da != dilogic) {
// fRawReader->AddMajorErrorLog(kEoEDILOGICErr,Form("eoe dil %d != %d",da,dilogic));
-// AliWarning(Form("Wrong DILOGIC address found in end-of-event: %d, expected %d!",da,dilogic));
+// AliDebug(1,Form("Wrong DILOGIC address found in end-of-event: %d, expected %d!",da,dilogic));
// fNumOfErr[kEoEDILOGICErr]++;
-// return kFALSE; AliQAChecker::Instance()->Run(AliQA::kHMPID, task, obj) ;
+// return kFALSE; AliQAChecker::Instance()->Run(AliQAv1::kHMPID, task, obj) ;
// }
// UInt_t ca = (eOfEvent >> 22) & 0x1f;
// if (cntData!=0 && ca != row) {
// fRawReader->AddMajorErrorLog(kEoERowErr,Form("eoe row %d != %d",ca,row));
-// AliWarning(Form("Wrong row index found in end-of-event: %d, expected %d!",ca,row));
+// AliDebug(1,Form("Wrong row index found in end-of-event: %d, expected %d!",ca,row));
// fNumOfErr[kEoERowErr]++;
// return kFALSE;
// }
if(rowControlWord != statusControlRow) {
//fRawReader->AddMajorErrorLog(kRowMarkerErr);
- AliWarning(Form("Wrong row marker %x expected 0x32a8!",rowControlWord));
+ AliDebug(1,Form("Wrong row marker %x expected 0x32a8!",rowControlWord));
fNumOfErr[fDDLNumber][kRowMarkerErr]++;
return kFALSE;
}
if (wordsInRow > nMAXwordsInRow) {
//fRawReader->AddMajorErrorLog(kRowMarkerSizeErr);
- AliWarning(Form(" FATAL: Number of words %x in a row exceeds the expected value: 0x1EA !",wordsInRow));
+ AliDebug(1,Form(" FATAL: Number of words %x in a row exceeds the expected value: 0x1EA !",wordsInRow));
fNumOfErr[fDDLNumber][kRowMarkerSizeErr]++;
return kFALSE;
}
// independent.
fWord = 0;
- if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");
+ if (fPosition < 0) {
+ AliError("fPosition < 0 !!! Event skipped.");
+ fRawReader->AddMajorErrorLog(kRawDataSizeErr,"fPosition<0");
+ return kFALSE;
+ }
if(dir==kBwd) n = -n;
fPosition+=4*n-4;