X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONPayloadTrigger.cxx;h=c3dab7a4aab9c156b5e76f2156ce5722bc26bdc4;hb=eb3886c8bd7460ab13c1c50efc91911ab023cc21;hp=e276ca16b1738d572f43a6ff4e299fbc5910e70e;hpb=1db7b71cb99bb382ab05af7efcebcb51752d9dde;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONPayloadTrigger.cxx b/MUON/AliMUONPayloadTrigger.cxx index e276ca16b17..c3dab7a4aab 100644 --- a/MUON/AliMUONPayloadTrigger.cxx +++ b/MUON/AliMUONPayloadTrigger.cxx @@ -13,7 +13,9 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +// $Id$ +//----------------------------------------------------------------------------- /// \class AliMUONPayloadTrigger /// Class Payload /// @@ -22,6 +24,7 @@ /// First version implement for Trigger /// /// \author Christian Finck +//----------------------------------------------------------------------------- #include "AliMUONPayloadTrigger.h" @@ -29,6 +32,7 @@ #include "AliMUONRegHeader.h" #include "AliMUONLocalStruct.h" #include "AliMUONDDLTrigger.h" +#include "AliMUONLogger.h" #include "AliLog.h" @@ -43,10 +47,13 @@ AliMUONPayloadTrigger::AliMUONPayloadTrigger() fDDLTrigger(new AliMUONDDLTrigger()), fRegHeader(new AliMUONRegHeader()), fLocalStruct(new AliMUONLocalStruct()), + fLog(new AliMUONLogger(1000)), fDarcEoWErrors(0), fGlobalEoWErrors(0), fRegEoWErrors(0), - fLocalEoWErrors(0) + fLocalEoWErrors(0), + fWarnings(kTRUE), + fNofRegSet(kFALSE) { /// /// create an object to read MUON raw digits @@ -64,11 +71,12 @@ AliMUONPayloadTrigger::~AliMUONPayloadTrigger() delete fDDLTrigger; delete fLocalStruct; delete fRegHeader; + delete fLog; } //______________________________________________________ -Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer) +Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer, Bool_t scalerEvent) { /// decode trigger DDL /// store only notified cards @@ -77,21 +85,30 @@ Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer) AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader(); - static Int_t kGlobalHeaderSize = darcHeader->GetGlobalHeaderLength(); - static Int_t kDarcHeaderSize = darcHeader->GetDarcHeaderLength(); - static Int_t kRegHeaderSize = fRegHeader->GetHeaderLength(); + static Int_t kGlobalHeaderSize = darcHeader->GetGlobalHeaderLength(); + static Int_t kDarcHeaderSize = darcHeader->GetDarcHeaderLength(); + static Int_t kRegHeaderSize = fRegHeader->GetHeaderLength(); + static Int_t kRegEmptySize = fRegHeader->GetHeaderLength()+1 + 16*(fLocalStruct->GetLength()+1); + static Int_t kRegEmptyScalerSize = fRegHeader->GetHeaderLength() + fRegHeader->GetScalerLength() + 1 + + 16*(fLocalStruct->GetLength() + fLocalStruct->GetScalerLength() + 1); - Bool_t scalerEvent = kFALSE; - Int_t index = 0; memcpy(darcHeader->GetHeader(), &buffer[index], (kDarcHeaderSize)*4); index += kDarcHeaderSize; - if(darcHeader->GetEventType() == 0) { - scalerEvent = kTRUE; - } else - scalerEvent = kFALSE; + + // darc type vadorh + if (darcHeader->GetDarcType() == darcHeader->GetDarcVadohrType()) + fMaxReg = 1; + + // darc type def. + if (darcHeader->GetDarcType() == darcHeader->GetDarcDefaultType()) + fMaxReg = 8; + + if(darcHeader->GetEventType() == scalerEvent) + if (fWarnings) AliWarning("Wrong event type obtained from the Darc header, take the one of CDH"); + if(scalerEvent) { // 6 DARC scaler words @@ -101,8 +118,10 @@ Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer) if (buffer[index++] != darcHeader->GetEndOfDarc()) { - AliWarning(Form("Wrong end of Darc word %x instead of %x\n", - buffer[index-1], darcHeader->GetEndOfDarc())); + const Char_t* msg = Form("Wrong end of Darc word %x instead of %x\n", + buffer[index-1], darcHeader->GetEndOfDarc()); + if (fWarnings) AliWarning(msg); + AddErrorMessage(msg); fDarcEoWErrors++; } // 4 words of global board input + Global board output @@ -117,13 +136,23 @@ Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer) if (buffer[index++] != darcHeader->GetEndOfGlobal()) { - AliWarning(Form("Wrong end of Global word %x instead of %x\n", - buffer[index-1], darcHeader->GetEndOfGlobal())); + const Char_t* msg = Form("Wrong end of Global word %x instead of %x\n", + buffer[index-1], darcHeader->GetEndOfGlobal()); + if (fWarnings) AliWarning(msg); + AddErrorMessage(msg); fGlobalEoWErrors++; } // 8 regional boards for (Int_t iReg = 0; iReg < fMaxReg; iReg++) { //loop over regeonal card + // skip empty regaional board (not connected or with error reading) + if (buffer[index] == fRegHeader->GetErrorWord()) { + if (scalerEvent) + index += kRegEmptyScalerSize; + else + index += kRegEmptySize; + continue; + } memcpy(fRegHeader->GetHeader(), &buffer[index], kRegHeaderSize*4); index += kRegHeaderSize; @@ -136,8 +165,10 @@ Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer) if (buffer[index++] != fRegHeader->GetEndOfReg()) { - AliWarning(Form("Wrong end of Reg word %x instead of %x\n", - buffer[index-1], fRegHeader->GetEndOfReg())); + const Char_t* msg = Form("Wrong end of Regional word %x instead of %x\n", + buffer[index-1], fRegHeader->GetEndOfReg()); + if (fWarnings) AliWarning(msg); + AddErrorMessage(msg); fRegEoWErrors++; } // 16 local cards per regional board @@ -157,8 +188,11 @@ Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer) if (buffer[index++] != fLocalStruct->GetEndOfLocal()) { - AliWarning(Form("Wrong end of local word %x instead of %x\n", - buffer[index-1], fLocalStruct->GetEndOfLocal())); + const Char_t* msg = Form("Wrong end of Local word %x instead of %x\n", + buffer[index-1], fLocalStruct->GetEndOfLocal()); + + if (fWarnings) AliWarning(msg); + AddErrorMessage(msg); fLocalEoWErrors++; } // fill only if card notified @@ -194,7 +228,9 @@ void AliMUONPayloadTrigger::SetMaxReg(Int_t reg) { /// set regional card number if (reg > 8) reg = 8; - fMaxReg = reg; + fMaxReg = reg; + + fNofRegSet = kTRUE; } //______________________________________________________ @@ -204,3 +240,17 @@ void AliMUONPayloadTrigger::SetMaxLoc(Int_t loc) if (loc > 16) loc = 16; fMaxLoc = loc; } + +//______________________________________________________ +void AliMUONPayloadTrigger::AddErrorMessage(const Char_t* msg) +{ +/// adding message to logger + + TString tmp(msg); + + Int_t pos = tmp.First("\n"); + tmp[pos] = 0; + + fLog->Log(tmp.Data()); +} +