X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONPayloadTracker.cxx;h=6fdf9285e42ce9cac91e15ae6af4137d51401f88;hb=e29a165da3598f5021996a6968b79fdff2f51975;hp=34b871db37663ca3f6d565c18afc67f8f57ca887;hpb=607fb67b58a46802e64db37e4bc2ad4927712810;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONPayloadTracker.cxx b/MUON/AliMUONPayloadTracker.cxx index 34b871db376..6fdf9285e42 100644 --- a/MUON/AliMUONPayloadTracker.cxx +++ b/MUON/AliMUONPayloadTracker.cxx @@ -13,74 +13,58 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +// $Id$ -/////////////////////////////////////////////////////////////////////////////// -/// -/// Class Payload -/// +//----------------------------------------------------------------------------- +/// \class AliMUONPayloadTracker /// Decodes rawdata from buffer and stores in TClonesArray. -/// /// First version implement for Tracker /// -/////////////////////////////////////////////////////////////////////////////// +/// \author Christian Finck +//----------------------------------------------------------------------------- #include "AliMUONPayloadTracker.h" -#include "AliRawReader.h" -#include "AliRawDataHeader.h" -#include "AliLog.h" - #include "AliMUONDspHeader.h" #include "AliMUONBlockHeader.h" #include "AliMUONBusStruct.h" #include "AliMUONDDLTracker.h" +#include "AliLog.h" + +/// \cond CLASSIMP ClassImp(AliMUONPayloadTracker) +/// \endcond AliMUONPayloadTracker::AliMUONPayloadTracker() : TObject(), + fBusPatchId(0), + fDspId(0), + fBlkId(0), + fMaxDDL(20), fMaxBlock(2), fMaxDsp(5), - fMaxBus(5) + fMaxBus(5), + fDDLTracker(new AliMUONDDLTracker()), + fBusStruct(new AliMUONBusStruct()), + fBlockHeader(new AliMUONBlockHeader()), + fDspHeader(new AliMUONDspHeader()), + fParityErrBus(), + fGlitchErrors(0), + fPaddingErrors(0) { - // - // create an object to decode MUON payload - // - - fDDLTracker = new AliMUONDDLTracker(); - fBusStruct = new AliMUONBusStruct(); - fBlockHeader = new AliMUONBlockHeader(); - fDspHeader = new AliMUONDspHeader(); -} + /// + /// create an object to decode MUON payload + /// -//_________________________________________________________________ -AliMUONPayloadTracker::AliMUONPayloadTracker(const AliMUONPayloadTracker& stream) : - TObject(stream) -{ - // - // copy ctor - // - AliFatal("copy constructor not implemented"); } -//______________________________________________________________________ -AliMUONPayloadTracker& AliMUONPayloadTracker::operator = (const AliMUONPayloadTracker& - /* stream */) -{ - // - // assignment operator - // - AliFatal("assignment operator not implemented"); - return *this; -} - - //___________________________________ AliMUONPayloadTracker::~AliMUONPayloadTracker() { - // - // clean up - // + /// + /// clean up + /// delete fDDLTracker; delete fBusStruct; delete fBlockHeader; @@ -91,11 +75,11 @@ AliMUONPayloadTracker::~AliMUONPayloadTracker() Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize) { - // Each DDL is made with 2 Blocks each of which consists of 5 DSP's at most - // and each of DSP has at most 5 buspatches. - // The different structures, Block (CRT), DSP (FRT) and Buspatch, - // are identified by a key word 0xFC0000FC, 0xF000000F and 0xB000000B respectively. - // (fBusPatchManager no more needed !) + /// Each DDL is made with 2 Blocks each of which consists of 5 DSP's at most + /// and each of DSP has at most 5 buspatches. + /// The different structures, Block (CRT), DSP (FRT) and Buspatch, + /// are identified by a key word 0xFC0000FC, 0xF000000F and 0xB000000B respectively. + /// (fBusPatchManager no more needed !) //Read Header Size of DDL,Block,DSP and BusPatch @@ -142,15 +126,25 @@ Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize) memcpy(fDspHeader->GetHeader(),&buffer[index], kDspHeaderSize*4); totalDspSize = fDspHeader->GetTotalLength(); + + if (fDspHeader->GetErrorWord()) { + fDspHeader->Print(""); + if ( fDspHeader->GetErrorWord() == (0x000000B1 | fBlockHeader->GetDspId()) + || fDspHeader->GetErrorWord() == (0x00000091 | fBlockHeader->GetDspId()) ){ + // an event with a glitch in the readout has been detected + // it means that somewhere a 1 byte word has been randomly inserted + // all the readout sequence is shifted untill the next event + + AliWarning(Form("Glitch in data detected, skipping event ")); + + fGlitchErrors++; + return kFALSE ; + } + } + indexDsp = index; index += kDspHeaderSize; -// if (fDspHeader->GetPaddingWord() != fDspHeader->GetDefaultPaddingWord()) { -// // copy the field of Padding word into ErrorWord field -// fDspHeader->SetErrorWord(fDspHeader->GetPaddingWord()); -// index--; -// } - // copy in TClonesArray fDDLTracker->AddDspHeader(*fDspHeader, iBlock); @@ -182,6 +176,10 @@ Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize) fBusStruct->SetBlockId(iBlock); // could be usefull in future applications ? fBusStruct->SetDspId(iDsp); + // check parity + if(!CheckDataParity()) + AddParityErrBus(fBusStruct->GetBusPatchId()); + // copy in TClonesArray fDDLTracker->AddBusPatch(*fBusStruct, iBlock, iDsp); @@ -200,8 +198,11 @@ Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize) // skipping additionnal word if padding if (fDspHeader->GetPaddingWord() == 1) { if (buffer[index++] != fDspHeader->GetDefaultPaddingWord()) - AliWarning(Form("Error in padding word for iBlock %d, iDsp %d, iBus %d\n", + + AliWarning(Form("Error in padding word for iBlock %d, iDsp %d, iBus %d\n", iBlock, iDsp, iBusPatch)); + + fPaddingErrors++; } index = indexDsp + totalDspSize; @@ -226,48 +227,61 @@ Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize) //______________________________________________________ void AliMUONPayloadTracker::ResetDDL() { - // reseting TClonesArray - // after each DDL - // + /// reseting TClonesArray + /// after each DDL + /// fDDLTracker->GetBlkHeaderArray()->Delete(); + fGlitchErrors = 0; + fPaddingErrors = 0; + fParityErrBus.Reset(); + } //______________________________________________________ void AliMUONPayloadTracker::SetMaxBlock(Int_t blk) { - // set regional card number + /// set regional card number if (blk > 2) blk = 2; fMaxBlock = blk; } +//______________________________________________________ Bool_t AliMUONPayloadTracker::CheckDataParity() { - // parity check - // taken from MuTrkBusPatch.cxx (sotfware test for CROCUS) - // A. Baldisseri + /// parity check + /// taken from MuTrkBusPatch.cxx (sotfware test for CROCUS) + /// A. Baldisseri - Int_t parity, bit; + Int_t parity; UInt_t data; Int_t dataSize = fBusStruct->GetLength(); for (int idata = 0; idata < dataSize; idata++) { data = fBusStruct->GetData(idata); - // Compute the parity for each data word - parity = data & 0x1; - for (Int_t i = 1; i <= 30; i++) { - bit = ((data >> i) & 0x1); - parity = (parity || bit) && (!(parity && bit)); - } + // Compute the parity for each data word + parity = data & 0x1; + for (Int_t i = 1; i <= 30; i++) + parity ^= ((data >> i) & 0x1); // Check if (parity != fBusStruct->GetParity(idata)) { + AliWarning(Form("Parity error in word %d for manuId %d and channel %d\n", idata, fBusStruct->GetManuId(idata), fBusStruct->GetChannelId(idata))); + return kFALSE; } } return kTRUE; } + +//______________________________________________________ +void AliMUONPayloadTracker::AddParityErrBus(Int_t buspatch) +{ +/// adding bus with at least on parity error + fParityErrBus.Set(fParityErrBus.GetSize() + 1); + fParityErrBus.AddAt(buspatch, fParityErrBus.GetSize() - 1); +}