X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONRawStreamTriggerHP.cxx;h=45cfbade9437500be963f3d0ac4496a3de219a77;hb=bbe2dd8d1bae34c875e1030362da5c30b7be3f6f;hp=ec3f0d6866a1dffe68745963da458f379660349a;hpb=a53aa6cf4cfa2cafca0ffda05fd308dc427c2444;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONRawStreamTriggerHP.cxx b/MUON/AliMUONRawStreamTriggerHP.cxx index ec3f0d6866a..45cfbade943 100644 --- a/MUON/AliMUONRawStreamTriggerHP.cxx +++ b/MUON/AliMUONRawStreamTriggerHP.cxx @@ -47,7 +47,6 @@ #include "AliLog.h" #include #include -#include using std::cout; using std::endl; using std::hex; @@ -58,6 +57,15 @@ ClassImp(AliMUONRawStreamTriggerHP) /// \endcond const Int_t AliMUONRawStreamTriggerHP::fgkMaxDDL = 2; +bool AliMUONRawStreamTriggerHP::AliLocalStruct::fgOverrideId = true; + +const AliMUONRegionalHeaderStruct +AliMUONRawStreamTriggerHP::AliDecoderEventHandler::fgkEmptyHeader = { + AliMUONTriggerDDLDecoder::RegionalErrorWord(), + 0, + {0, 0}, + 0 +}; AliMUONRawStreamTriggerHP::AliMUONRawStreamTriggerHP() : @@ -66,10 +74,14 @@ AliMUONRawStreamTriggerHP::AliMUONRawStreamTriggerHP() : fDDL(0), fBufferSize(8192), fBuffer(new UChar_t[8192]), - fCurrentLocalStruct(NULL), + fkCurrentLocalStruct(NULL), fHadError(kFALSE), fDone(kFALSE), - fDDLObject(NULL) + fDDLObject(NULL), + fTotalNumberOfDarcEoWErrors(0), + fTotalNumberOfGlobalEoWErrors(0), + fTotalNumberOfRegEoWErrors(0), + fTotalNumberOfLocalEoWErrors(0) { /// /// Default constructor. @@ -92,10 +104,14 @@ AliMUONRawStreamTriggerHP::AliMUONRawStreamTriggerHP(AliRawReader* rawReader) : fDDL(0), fBufferSize(8192), fBuffer(new UChar_t[8192]), - fCurrentLocalStruct(NULL), + fkCurrentLocalStruct(NULL), fHadError(kFALSE), fDone(kFALSE), - fDDLObject(NULL) + fDDLObject(NULL), + fTotalNumberOfDarcEoWErrors(0), + fTotalNumberOfGlobalEoWErrors(0), + fTotalNumberOfRegEoWErrors(0), + fTotalNumberOfLocalEoWErrors(0) { /// /// Constructor with AliRawReader as argument. @@ -139,6 +155,10 @@ void AliMUONRawStreamTriggerHP::First() fDDL = 0; fDone = kFALSE; NextDDL(); + fTotalNumberOfDarcEoWErrors = 0; + fTotalNumberOfGlobalEoWErrors = 0; + fTotalNumberOfRegEoWErrors = 0; + fTotalNumberOfLocalEoWErrors = 0; } @@ -159,7 +179,7 @@ Bool_t AliMUONRawStreamTriggerHP::NextDDL() fDDLObject = NULL; } - fCurrentLocalStruct = NULL; + fkCurrentLocalStruct = NULL; while (fDDL < GetMaxDDL()) { @@ -217,8 +237,12 @@ Bool_t AliMUONRawStreamTriggerHP::NextDDL() Swap(reinterpret_cast(fBuffer), dataSize / sizeof(UInt_t)); // Swap needed for mac power pc. #endif + fDDL++; // Remember to increment index to next DDL before the calls to + // fDecoder.Decode since the callback methods of the decoder might + // use AliMUONRawStreamTriggerHP::GetDDL() + // Check if this is a scalar event. - bool scalerEvent = GetReader()->GetDataHeader()->GetL1TriggerMessage() == 0x1; + bool scalerEvent = (GetReader()->GetDataHeader()->GetL1TriggerMessage() & 0x1) == 0x1; bool result = false; try @@ -227,6 +251,10 @@ Bool_t AliMUONRawStreamTriggerHP::NextDDL() // handler we need to trap any memory allocation exception to be robust. result = fDecoder.Decode(fBuffer, dataSize, scalerEvent); fHadError = (result == true ? kFALSE : kTRUE); + fTotalNumberOfDarcEoWErrors += fDecoder.GetHandler().GetDarcEoWErrors(); + fTotalNumberOfGlobalEoWErrors += fDecoder.GetHandler().GetGlobalEoWErrors(); + fTotalNumberOfRegEoWErrors += fDecoder.GetHandler().GetRegEoWErrors(); + fTotalNumberOfLocalEoWErrors += fDecoder.GetHandler().GetLocalEoWErrors(); } catch (const std::bad_alloc&) { @@ -235,9 +263,8 @@ Bool_t AliMUONRawStreamTriggerHP::NextDDL() } // Update the current local structure pointer. - fCurrentLocalStruct = fDecoder.GetHandler().FirstLocalStruct(); + fkCurrentLocalStruct = fDecoder.GetHandler().FirstLocalStruct(); - fDDL++; // Remember to increment index to next DDL. return kTRUE; } @@ -258,6 +285,10 @@ Bool_t AliMUONRawStreamTriggerHP::Next( TArrayS& xPattern, TArrayS& yPattern ) { + /// Advance one step in the iteration. Returns kFALSE if finished. + /// If kTRUE is returned then the output parameters are filled with + /// the values found in the next local trigger circuit structure. + const AliLocalStruct* localStruct = Next(); if (localStruct == NULL) return kFALSE; @@ -337,6 +368,15 @@ AliMUONDDLTrigger* AliMUONRawStreamTriggerHP::GetDDLTrigger() const { memcpy(localStruct.GetScalers(), lstruct->GetScalars(), sizeof(AliMUONLocalScalarsStruct)); } + if (AliMUONRawStreamTriggerHP::AliLocalStruct::GetOverrideIdFlag() == true) + { + // Since the override ID flag is set, we need to replace the + // ID in the structure with the calculated one returned by GetId(). + AliMUONLocalInfoStruct* strptr = reinterpret_cast( localStruct.GetData() ); + UInt_t triggerBits = strptr->fTriggerBits; + triggerBits &= ~(0xF << 19); + strptr->fTriggerBits = triggerBits | ((lstruct->GetId() & 0xF) << 19); + } fDDLObject->AddLocStruct(localStruct, iReg); lstruct = lstruct->Next(); } @@ -346,7 +386,7 @@ AliMUONDDLTrigger* AliMUONRawStreamTriggerHP::GetDDLTrigger() const } -void AliMUONRawStreamTriggerHP::SetMaxRegAllowed(Int_t reg) +void AliMUONRawStreamTriggerHP::SetMaxReg(Int_t reg) { /// Set the maximum allowed number of regional cards in the DDL. @@ -579,6 +619,8 @@ void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::SetMaxStructs( fRegionals = new AliRegionalHeader[maxRegionals]; fLocals = new AliLocalStruct[maxRegionals*maxLocals]; fEndOfLocals = fLocals; + + fRegionalsCount = maxRegionals; } @@ -600,13 +642,21 @@ void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::OnNewBuffer( fRegEoWErrors = 0; fLocalEoWErrors = 0; - // Reset the current pointers which will be used to track where we need to - // fill fRegionals and fLocals. We have to subtract one space because we - // will increment the pointer the first time in the OnNewRegionalStruct - // and OnLocalStruct methods. - fCurrentRegional = fRegionals-1; + // Reset the current local structure pointer which will be used to track + // where we need to fill fLocals. We have to subtract one space because we + // will increment the pointer the first time in the OnLocalStruct method. fCurrentLocal = fLocals-1; - fRegionalsCount = 0; + + fCurrentRegional = NULL; + + // Reset and link up all the regional structures together. + for (UInt_t i = 0; i+1 < fRegionalsCount; i++) + { + fRegionals[i] = AliRegionalHeader(fLocals, &fgkEmptyHeader, NULL); + fRegionals[i].SetNext(&fRegionals[i+1]); + } + // Reset the last structure. + fRegionals[fRegionalsCount-1] = AliRegionalHeader(fLocals, &fgkEmptyHeader, NULL); }