fData(NULL),
fBunchSize(-1),
fEndTimeBin(0),
- fStartTimeBin(999)
+ fStartTimeBin(999),
+ fPrewBunchSize(0),
+ fPrevEndTimeBin(0)
+// fIsFirstBunch(true)
{
// Default constructor
}
#include <TObject.h>
+#define DECODERERROR -3
+
class AliAltroBunch: public TObject {
public:
AliAltroBunch();
~ AliAltroBunch();
-
- const UInt_t* GetData() const { return fData; }
- void SetData(UInt_t *data) { fData = data; }
- Int_t GetBunchSize() const { return fBunchSize; }
- void SetBunchSize(Int_t size) { fBunchSize = size; }
- UInt_t GetEndTimeBin() const { return fEndTimeBin; }
- void SetEndTimeBin(UInt_t bin) { fEndTimeBin = bin; }
- UInt_t GetStartTimeBin() const
- {
- return (fEndTimeBin - (fBunchSize -1));
- }
-
- void SetStartTimeBin(UInt_t bin) { fStartTimeBin = bin; }
+ inline const UInt_t* GetData() const { return fData; }
+
+ inline void SetData(UInt_t *data)
+ {
+ fData = data;
+ }
+
+ inline Int_t GetBunchSize() const { return fBunchSize; }
+ inline void SetBunchSize(Int_t size)
+ {
+ fPrewBunchSize = fBunchSize; fBunchSize = size;
+ }
+
+ inline int CheckConsistency()
+ {
+ if( (fPrevEndTimeBin - fPrewBunchSize ) <= fEndTimeBin )
+ {
+ // printf("%s:%d, ERROR conistency check failed\n", __FILE__ , __LINE__ );
+ return DECODERERROR;
+ }
+ else
+ {
+ return kTRUE;
+ }
+ }
+
+ inline UInt_t GetEndTimeBin() const { return fEndTimeBin; }
+ inline void SetEndTimeBin(UInt_t bin) {fPrevEndTimeBin = fEndTimeBin; fEndTimeBin = bin; }
+ inline UInt_t GetStartTimeBin() const { return (fEndTimeBin - (fBunchSize -1)); }
+ inline void SetStartTimeBin(UInt_t bin) { fStartTimeBin = bin; }
private:
-
AliAltroBunch& operator = (const AliAltroBunch& bunch);
AliAltroBunch(const AliAltroBunch& bunch);
-
UInt_t *fData; // pointer to data of current bunch
Int_t fBunchSize; // total size of current bunch including timestamp and the size indicator (i.e a bunch with just one sample will have size 3)
UInt_t fEndTimeBin; // Time stamp of the last sample in the bunch in entities of sample indexes
UInt_t fStartTimeBin; // Time index of the first bin in the bunch
+ Int_t fPrewBunchSize;
+ Int_t fPrevEndTimeBin;
+ // bool fIsFirstBunch;
ClassDef(AliAltroBunch,0) // container class for Altro bunches
};
ClassImp(AliAltroData)
AliAltroData::AliAltroData(): fData(0),
- fBunchData(0),
- fDataSize(0),
- fWc(0),
- fHadd(-1),
- fPrevHadd(-1),
- fBunchCounter(0),
- fIsComplete(0)
+ fBunchData(0),
+ fDataSize(0),
+ fWc(0),
+ fHadd(-1),
+ fPrevHadd(-1),
+ fBunchCounter(0),
+ fIsComplete(0),
+ fBufferLeft(0)
{
-Bool_t AliAltroData::NextBunch(AliAltroBunch *altroBunch)
+ //Bool_t AliAltroData::NextBunch(AliAltroBunch *altroBunch)
+int AliAltroData::NextBunch(AliAltroBunch *altroBunch)
{
if(fIsComplete == kTRUE)
{
-
if(fBunchCounter == 0)
{
fBunchData = &fData[fDataSize - 1];
if(*fBunchData == 0){ fWc += 1;};
fWc += *fBunchData;
altroBunch->SetData(fData + fDataSize - fWc);
- altroBunch->SetBunchSize(*fBunchData -2);
+
+ int tmpsize = *fBunchData -2;
+
+ // altroBunch->SetBunchSize( *fBunchData -2 );
+ altroBunch->SetBunchSize( tmpsize );
+
+
+ fBufferLeft -= *fBunchData;
+ // printf("%s:%d, bufferleft = %d \n", __FILE__, __LINE__ , fBufferLeft);
fBunchData --;
altroBunch->SetEndTimeBin( *fBunchData );
+
+ // if( (fBufferLeft <= 7 ) || ( fBufferLeft - tmpsize) <= 7)
+ if( fBufferLeft - tmpsize <= 7)
+ {
+ // printf("%s:%d, ERROR, attempt too access buffer outside allowed range\n", __FILE__ , __LINE__ );
+ return kFALSE;
+ }
+
+
+ if(fBunchCounter >0)
+ {
+ int tmpret = altroBunch->CheckConsistency();
+
+ if(tmpret != kTRUE)
+ {
+ return tmpret;
+ }
+
+ /*
+ if( altroBunch->CheckConsistency() == kFALSE)
+ {
+ return kFALSE;
+ }
+ */
+ }
+
// altroBunch->SetStartTimeBin(*fBunchData - fBunchSize);
fBunchData -= (altroBunch->GetBunchSize() +1);
return kFALSE;
}
-
fBunchCounter ++;
return kTRUE;
}
else
{
// printf("\nAliAltroData::NextBunch: WARNING, dataset is not complet. 2AAA endmarker is missing ");
- // printf("\nfor branch %d, card %d, chip %d, channel %d\n", GetBranch(), GetCard(), GetChip(), GetChannel());
+ // printf("\nfor branch %d, card %d, chip %d, channel %d\n", GetBranch(), GetCard(), GetChip(), GetChannel());
return kFALSE;
}
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice */
+#define DECODERERROR -3
+
#include <TObject.h>
class AliAltroBunch;
AliAltroData();
~ AliAltroData();
- Bool_t NextBunch(AliAltroBunch *altrobunch);
+
+ // Bool_t NextBunch(AliAltroBunch *altrobunch);
+ int NextBunch(AliAltroBunch *altrobunch);
Int_t GetChannel() const;
Int_t GetChip() const;
Int_t GetHadd() const { return fHadd; }
Int_t GetPrevHadd() const { return fPrevHadd; }
Bool_t IsNewHadd() const { return (fHadd != fPrevHadd); }
- void SetHadd(Int_t add) { fPrevHadd = fHadd; fHadd = add; }
+ // void SetHadd(Int_t add) { fPrevHadd = fHadd; fHadd = add; }
+ void SetHadd(Int_t add, Int_t bufferleft) { fPrevHadd = fHadd; fHadd = add; fBufferLeft = bufferleft ; }
+
const UInt_t* GetData() const { return fData; }
void SetData(UInt_t *data) { fData = data; }
// UInt_t* GetData() const { return fData; }
Int_t fBunchCounter;
Bool_t fIsComplete;
+ // Int_t fMaxBunchSize;
+ Int_t fBufferLeft;
ClassDef(AliAltroData, 0) // container class for Altro payload
fInComplete(0),
fDecodeIfCorruptedTrailer(kTRUE),
fIsDecoded(kFALSE),
- fIsFatalCorruptedTrailer(kTRUE)
+ fIsFatalCorruptedTrailer(kTRUE)
+ // fIsFirstChannelOfPayload(kTRUE)
{
// Default constructor
}
Bool_t AliAltroDecoder::Decode()
{
- // Decodes the RCU payload (all altro channels in one go) from the DDL/Altro
- // format to PC readable format.
- // The 10 bit words of the 40/10 bit Altro format are transformed to separated
- // integers.
-
if( fIsFatalCorruptedTrailer == kTRUE)
{
// printf("\n AliAltroDecoder::Decode(), WARNING, attempt to decode badly corrupted data\n");
if( ((CheckPayloadTrailer() == kTRUE) || fDecodeIfCorruptedTrailer == kTRUE ) && (fSize > 32) )
{
- // fDDLBlockCnt = 0;
fOutBufferIndex = 0;
for(Int_t i = 0; i < fNDDLBlocks; i++)
DecodeLastDDLBlock();
fOutBufferIndex = fN40AltroWords*4 - 1;
-
- // DumpData(fOutBuffer, 400,4);
-
fIsDecoded = kTRUE;
return kTRUE;
}
}
+
+
Bool_t AliAltroDecoder::NextChannel(AliAltroData *altroDataPtr)
{
- // Reads the next altro channel in the RCU payload after the RCU payload
- // has been decoded. The channels are read starting from the end (backlinked list)
- // Returns kTRUE as long as ther are unread channels in the payload
- // Returns kFALSE when all the channels have been read.
-
if(fIsFatalCorruptedTrailer == kTRUE)
{
- // printf("\n AliAltroDecoder::NextChannel(), WARNING, attempt to decode badly corrupted data\n");
- // printf("\n AliAltroDecoder::NextChannel(), Please check on the return value (-1 if fataly corrupted) of the SetMemory() function\n");
return kFALSE;
}
if(fIsDecoded != kTRUE)
{
- // cout <<"AliAltroDecoder::NextChanne, WARNING, buffer was not decoded, decoding now.. "<< endl;
Decode();
}
- // an altro block must constist of at least 2 40bit words:
- // - 40bit Altro trailer
- // - at least 3 10bit words (bunch length, time bin, signal) padded to 40 bit
- // we are reading backwards, so the index is already 1 inside the block
if(fOutBufferIndex >= 7)
{
if((fOutBuffer[fOutBufferIndex] << 4 ) | ((fOutBuffer[fOutBufferIndex-1] & 0x3c0) >> 6) == 0x2aaa)
fOutBufferIndex --;
fNAltro10bitWords = ( (fOutBuffer[fOutBufferIndex] & 0x3f) << 4 ) | ((fOutBuffer[fOutBufferIndex -1] & (0xF << 6)) >> 6) ;
fOutBufferIndex --;
- altroDataPtr->SetHadd( ((fOutBuffer[fOutBufferIndex] & 0x3)) << 10 | ( fOutBuffer[fOutBufferIndex-1] ) );
+ altroDataPtr->SetHadd( ((fOutBuffer[fOutBufferIndex] & 0x3)) << 10 | ( fOutBuffer[fOutBufferIndex-1] ), fOutBufferIndex);
fOutBufferIndex --;
{
fOutBufferIndex = fOutBufferIndex - fNAltro10bitWords -(4 - fNAltro10bitWords%4);
}
-
if(fOutBufferIndex >= 0)
{
-
- //cout << " AliAltroDecoder::NextChannel fOutBufferIndex =" << fOutBufferIndex << endl;
- // printf( "AliAltroDecoder::NextChannel fOutBufferIndex = %d", fOutBufferIndex);
altroDataPtr->SetData( &fOutBuffer[fOutBufferIndex] );
if(fOutBufferIndex > 0) fOutBufferIndex --;
altroDataPtr->SetDataSize( fNAltro10bitWords );
return kFALSE;
}
-
}
else
{
}
+
void AliAltroDecoder::PrintInfo(AliAltroData &altrodata, Int_t n, Int_t nPerLine)
{
// prints data and address information contained in altrodata
// Sets the pointer to the memory block that should be decoded
// Returns a negative value if an inconsistency in the data is detected
+ // fIsFirstChannelOfPayload = kTRUE;
+
if(dtaPtr == 0)
{
- printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, dtaPtr = ZERO !!!!!!!!!!!!\n");
- printf("Please check your code that you don't give a zero pointer to the decoder \n");
+ // printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, dtaPtr = ZERO !!!!!!!!!!!!\n");
+ // printf("Please check your code that you don't give a zero pointer to the decoder \n");
return -99;
}
if (size<fkN32HeaderWords+4)
{
- printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, too little data (%d)\n", size);
- printf("Data buffer must contain the CDH and at least one 32bit RCU trailer word\n");
+ // printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, too little data (%d)\n", size);
+ // printf("Data buffer must contain the CDH and at least one 32bit RCU trailer word\n");
return -99;
}
}
+
+
+
+
+
+
void AliAltroDecoder::DecodeLastDDLBlock()
{
// Decode one 160 bit DDL block into 16 integers.
// In order to use the same decoding function (DecodeDDLBlock())
// a copy of the the last DDL block is made and
- // if the las block does not align with 160 bits then it is padded with zeroes
+ // if the last block does not align with 160 bits then it is padded with zeroes
for(Int_t i=0; i < f32LastDDLBlockSize; i++)
{
f32DtaPtr=(UInt_t*)(f8DtaPtr-fSize+f8PayloadSize+fkN32HeaderWords*4);
}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Int_t AliAltroDecoder::CopyBackward(Byte_t* pBuffer, Int_t bufferSize)
{
// Copy the original 10/40 bit encecoded data of the current channel.
///////////////////////////////////////////////////////////////////////////////
+#define DECODERERROR -3
+
#include <TObject.h>
#include <iostream>
* @return kTRUE if trailer available;
*/
Bool_t GetRCUTrailerData(UChar_t*& data) const;
-
- /**
- * Provide size of RCU trailer.
- */
Int_t GetRCUTrailerSize() const;
private:
Int_t fInComplete; // Number of altro channels that is read out properly
Bool_t fDecodeIfCorruptedTrailer; // Wether or not to try to decode the data if the RCU trailer is incorrect (will succseed in most cases)
Bool_t fIsDecoded; // Wether or not the buffer set last by the "SetMemory()" function has been decoded
- Bool_t fIsFatalCorruptedTrailer; // If trailer is fataly corrupted, not possible in any way to recover, then it is not allowed to decode the DDL payload.
+ Bool_t fIsFatalCorruptedTrailer; // If trailer is fataly corrupted, not possible in any way to recover, then it is not allowed to decode the DDL payload.
+
+ // Bool_t fIsFirstChannelOfPayload;
+
ClassDef(AliAltroDecoder, 0) // class for decoding Altro payload
};