X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONRawWriter.cxx;h=6b68fc4a195fcd06aeefa1d4d31b49a04fc8f202;hb=46df197d13c70711d59cb354c0f12f1838a28c33;hp=c922b033ebfd21c78367ca8445ffd32c1bd8fba9;hpb=1c66abf31993149caf4f5cd01521f004b29a3518;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONRawWriter.cxx b/MUON/AliMUONRawWriter.cxx index c922b033ebf..6b68fc4a195 100644 --- a/MUON/AliMUONRawWriter.cxx +++ b/MUON/AliMUONRawWriter.cxx @@ -65,6 +65,7 @@ #include "AliMpDDLStore.h" #include "AliMpDDL.h" +#include "AliMpRegionalTrigger.h" #include "AliMpTriggerCrate.h" #include "AliMpLocalBoard.h" #include "AliMpDetElement.h" @@ -163,7 +164,7 @@ Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore, { AliCodeTimerAuto("for Tracker") - AliMpExMap busPatchMap(true); + AliMpExMap busPatchMap; Int_t nDDLs = AliDAQ::NumberOfDdls("MUONTRK"); @@ -234,8 +235,11 @@ AliMUONRawWriter::Digits2BusPatchMap(const AliMUONVDigitStore& digitStore, UChar_t channelId = 0; UShort_t charge = 0; Int_t busPatchId = 0; + Int_t currentBusPatchId = -1; UInt_t word; + AliMUONBusStruct* busStruct(0x0); + TIter next(digitStore.CreateTrackerIterator()); AliMUONVDigit* digit; @@ -280,9 +284,13 @@ AliMUONRawWriter::Digits2BusPatchMap(const AliMUONVDigitStore& digitStore, parity ^= ((word >> i) & 0x1); } AliBitPacking::PackWord((UInt_t)parity,word,31,31); - - AliMUONBusStruct* busStruct = - static_cast(busPatchMap.GetValue(busPatchId)); + + if ( currentBusPatchId != busPatchId ) + { + busStruct = + static_cast(busPatchMap.GetValue(busPatchId)); + currentBusPatchId = busPatchId; + } if (!busStruct) { @@ -339,10 +347,10 @@ AliMUONRawWriter::WriteTrackerDDL(AliMpExMap& busPatchMap, Int_t iDDL) for (Int_t iDsp = 0; iDsp < iDspMax; ++iDsp) { // DSP header - Int_t length = fDspHeader->GetHeaderLength(); - memcpy(&fBuffer[index],fDspHeader->GetHeader(),length*4); + Int_t dspHeaderLength = fDspHeader->GetHeaderLength(); + memcpy(&fBuffer[index],fDspHeader->GetHeader(),dspHeaderLength*4); Int_t indexDsp = index; - index += length; + index += dspHeaderLength; // 5 buspatches max per DSP for (Int_t i = 0; i < iBusPerDSP[iDsp]; ++i) @@ -362,14 +370,14 @@ AliMUONRawWriter::WriteTrackerDDL(AliMpExMap& busPatchMap, Int_t iDDL) if (busStructPtr) { // add bus patch structure header - Int_t length = busStructPtr->GetHeaderLength(); - memcpy(&fBuffer[index],busStructPtr->GetHeader(),length*4); - index += length; + Int_t busHeaderLength = busStructPtr->GetHeaderLength(); + memcpy(&fBuffer[index],busStructPtr->GetHeader(),busHeaderLength*4); + index += busHeaderLength; // add bus patch data - length = busStructPtr->GetLength(); - memcpy(&fBuffer[index],busStructPtr->GetData(),length*4); - index += length; + Int_t busLength = busStructPtr->GetLength(); + memcpy(&fBuffer[index],busStructPtr->GetData(),busLength*4); + index += busLength; } else { @@ -499,7 +507,7 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore kGlobalHeaderLength + kGlobalScalerLength + 2); if(fScalerEvent) { eventPhys = 0; //set to generate scaler events - fHeader->fWord2 |= 0x1; // set L1SwC bit on + fHeader->fWord2 |= (0x1 << 14); // set L1SwC bit on } if(fScalerEvent) buffer = new Int_t [kScalerBufferSize]; @@ -556,9 +564,11 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore // end of global word buffer[index++] = fDarcHeader->GetEndOfGlobal(); + const AliMpRegionalTrigger* reg = AliMpDDLStore::Instance()->GetRegionalTrigger(); + Int_t nCrate = reg->GetNofTriggerCrates()/2; // 8 regional cards per DDL - for (Int_t iReg = 0; iReg < 8; ++iReg) { + for (Int_t iReg = 0; iReg < nCrate; ++iReg) { // crate info AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->GetTriggerCrate(iDDL, iReg); @@ -567,8 +577,10 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, iDDL)); // regional info tree, make sure that no reg card missing - AliMUONRegionalTrigger* regTrg = triggerStore.FindRegional(iReg+iDDL*8); - + AliMUONRegionalTrigger* regTrg = triggerStore.FindRegional(crate->GetId()); + if (!regTrg) + AliError(Form("Missing regional board %d in trigger Store\n", crate->GetId())); + // Regional card header word = 0; @@ -582,9 +594,9 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore // fill darc word, not darc status for the moment (empty) //see AliMUONRegHeader.h for details AliBitPacking::PackWord((UInt_t)eventPhys,word,31,31); - AliBitPacking::PackWord((UInt_t)serialNb,word,19,24); - AliBitPacking::PackWord((UInt_t)version,word,7,14); - AliBitPacking::PackWord((UInt_t)iReg,word,15,18); + AliBitPacking::PackWord((UInt_t)serialNb,word,20,25); + AliBitPacking::PackWord((UInt_t)version,word,8,15); + AliBitPacking::PackWord((UInt_t)crate->GetId(),word,16,19); AliBitPacking::PackWord((UInt_t)regOut,word,0,7); fRegHeader->SetWord(word); @@ -605,7 +617,9 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore // 16 local card per regional board // UShort_t localMask = 0x0; - for (Int_t iLoc = 0; iLoc < 16; iLoc++) { + Int_t nLocalBoard = AliMpConstants::LocalBoardNofChannels(); + + for (Int_t iLoc = 0; iLoc < nLocalBoard; iLoc++) { // slot zero for Regional card Int_t localBoardId = crate->GetLocalBoardId(iLoc);