X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=MUON%2FAliMUONRawWriter.cxx;h=1decdb112847b6032461fed259399a764f386ae2;hp=07f2eac877d74ce1a87f37be1a9c351bc8387b96;hb=fc2293be3210f0436f281ea4bd047546feed3c79;hpb=a3eb0a94f49703a7f130df27ae648e42a2641a28 diff --git a/MUON/AliMUONRawWriter.cxx b/MUON/AliMUONRawWriter.cxx index 07f2eac877d..1decdb11284 100644 --- a/MUON/AliMUONRawWriter.cxx +++ b/MUON/AliMUONRawWriter.cxx @@ -15,6 +15,7 @@ /* $Id$ */ +//----------------------------------------------------------------------------- /// \class AliMUONRawWriter /// MUON Raw Data generaton in ALICE-MUON /// Raw data structure could be found in Alice-note. @@ -40,6 +41,7 @@ /// Using AliMpDDLStore::GetBusPatchId. /// /// \author Ch. Finck, Feb. 07. +//----------------------------------------------------------------------------- #include "AliMUONRawWriter.h" @@ -61,8 +63,10 @@ #include "AliMUONVTriggerStore.h" #include "AliCodeTimer.h" +#include "AliMpCDB.h" #include "AliMpDDLStore.h" #include "AliMpDDL.h" +#include "AliMpRegionalTrigger.h" #include "AliMpTriggerCrate.h" #include "AliMpLocalBoard.h" #include "AliMpDetElement.h" @@ -75,6 +79,7 @@ #include "AliMpVSegmentation.h" #include "AliRawReader.h" +#include "AliRawDataHeaderSim.h" #include "AliBitPacking.h" #include "AliDAQ.h" #include "AliLog.h" @@ -97,7 +102,7 @@ AliMUONRawWriter::AliMUONRawWriter() fLocalStruct(new AliMUONLocalStruct()), fDDLStore(AliMpDDLStore::Instance()), fScalerEvent(kFALSE), - fHeader(), + fHeader(0x0), fBufferSize((((43*AliMpConstants::ManuNofChannels() + 4)*5 + 10)*5 + 8)*2), fBuffer(new Int_t [fBufferSize]) { @@ -109,6 +114,13 @@ AliMUONRawWriter::AliMUONRawWriter() fBlockHeader->SetDataKey(fBlockHeader->GetDefaultDataKey()); fDspHeader->SetDataKey(fDspHeader->GetDefaultDataKey()); + // Load mapping + if ( ! fDDLStore ) { + if ( ! AliMpCDB::LoadDDLStore() ) { + AliFatal("Could not access mapping from OCDB !"); + } + fDDLStore = AliMpDDLStore::Instance(); + } } //__________________________________________________________________________ @@ -144,23 +156,22 @@ void AliMUONRawWriter::LocalWordPacking(UInt_t& word, UInt_t locId, UInt_t locD } //____________________________________________________________________ -Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore, - AliMUONVTriggerStore* triggerStore) +Int_t AliMUONRawWriter::Digits2Raw(const AliMUONVDigitStore* digitStore, + const AliMUONVTriggerStore* triggerStore) { /// convert digits of the current event to raw data - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) Int_t idDDL; - Char_t name[255]; // tracking chambers if ( digitStore ) { - AliCodeTimerAuto("for Tracker") + AliCodeTimerAuto("for Tracker",1) - AliMpExMap busPatchMap(true); + AliMpExMap busPatchMap; Int_t nDDLs = AliDAQ::NumberOfDdls("MUONTRK"); @@ -185,7 +196,7 @@ Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore, if ( triggerStore ) { - AliCodeTimerAuto("for Trigger") + AliCodeTimerAuto("for Trigger",1) // trigger chambers @@ -193,12 +204,10 @@ Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore, // open files idDDL = 0;// MUTR - strcpy(name,AliDAQ::DdlFileName("MUONTRG",idDDL)); - file[0] = new AliFstream(name); + file[0] = new AliFstream(AliDAQ::DdlFileName("MUONTRG",idDDL)); idDDL = 1;// MUTR - strcpy(name,AliDAQ::DdlFileName("MUONTRG",idDDL)); - file[1] = new AliFstream(name); + file[1] = new AliFstream(AliDAQ::DdlFileName("MUONTRG",idDDL)); WriteTriggerDDL(*triggerStore,file); @@ -219,7 +228,7 @@ AliMUONRawWriter::Digits2BusPatchMap(const AliMUONVDigitStore& digitStore, { /// Create bus patch structures corresponding to digits in the store - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) static const Int_t kMAXADC = (1<<12)-1; // We code the charge on a 12 bits ADC. @@ -231,8 +240,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; @@ -277,9 +289,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) { @@ -305,8 +321,12 @@ AliMUONRawWriter::WriteTrackerDDL(AliMpExMap& busPatchMap, Int_t iDDL) // (((43 manus max per bus patch *64 channels + 4 bus patch words) * 5 bus patch // + 10 dsp words)*5 dsps + 8 block words)*2 blocks - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) + if (fHeader == 0x0) { + AliError("Raw data header must be set"); + return; + } memset(fBuffer,0,fBufferSize*sizeof(Int_t)); AliMpDDL* ddl = fDDLStore->GetDDL(iDDL); @@ -332,10 +352,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) @@ -355,14 +375,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 { @@ -385,7 +405,7 @@ AliMUONRawWriter::WriteTrackerDDL(AliMpExMap& busPatchMap, Int_t iDDL) totalDspLength++; } - Int_t dspLength = totalDspLength - fDspHeader->GetHeaderLength(); + Int_t dspLength = totalDspLength - fDspHeader->GetHeaderLength(); fBuffer[indexDsp+1] = totalDspLength; // dsp total length fBuffer[indexDsp+2] = dspLength; // data length @@ -394,23 +414,30 @@ AliMUONRawWriter::WriteTrackerDDL(AliMpExMap& busPatchMap, Int_t iDDL) Int_t totalBlkLength = index - indexBlk; Int_t blkLength = totalBlkLength - fBlockHeader->GetHeaderLength(); - totalDDLLength += totalBlkLength; + totalDDLLength += totalBlkLength; fBuffer[indexBlk+1] = totalBlkLength; // total block length fBuffer[indexBlk+2] = blkLength; - + } // block + // add twice the end of CRT structure data key + // hope it's good placed (ChF) + fBuffer[index++] = fBlockHeader->GetDdlDataKey(); + fBuffer[index++] = fBlockHeader->GetDdlDataKey(); + totalDDLLength += 2; + // writting onto disk // total length in bytes // DDL header - Int_t headerSize = sizeof(fHeader)/4; + + Int_t headerSize = sizeof(AliRawDataHeader)/4; - fHeader.fSize = (totalDDLLength + headerSize) * 4; + fHeader->fSize = (totalDDLLength + headerSize) * 4; AliFstream* file = new AliFstream(AliDAQ::DdlFileName("MUONTRK",iDDL)); - file->WriteBuffer((char*)(&fHeader),headerSize*4); + file->WriteBuffer((char*)fHeader,headerSize*4); file->WriteBuffer((char*)fBuffer,sizeof(int)*index); delete file; } @@ -428,7 +455,12 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore { /// Write trigger DDL - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) + + if (fHeader == 0x0) { + AliError("Raw data header must be set"); + return 0; + } // DDL event one per half chamber @@ -443,6 +475,7 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore } Int_t gloTrigResp = gloTrg->GetGlobalResponse(); + UInt_t *gloTrigInput = gloTrg->GetGlobalInput(); UInt_t word; Int_t* buffer = 0; @@ -478,9 +511,10 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore (kRegHeaderLength + kRegScalerLength +1))* 8 + (kDarcHeaderLength + kDarcScalerLength + kGlobalHeaderLength + kGlobalScalerLength + 2); - if(fScalerEvent) + if(fScalerEvent) { eventPhys = 0; //set to generate scaler events - + fHeader->fWord2 |= (0x1 << 14); // set L1SwC bit on + } if(fScalerEvent) buffer = new Int_t [kScalerBufferSize]; else @@ -511,10 +545,14 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore index += kDarcHeaderLength; // no global input for the moment.... - if (iDDL == 0) - fDarcHeader->SetGlobalOutput(gloTrigResp); - else - fDarcHeader->SetGlobalOutput(0); + if (iDDL == 0) { + fDarcHeader->SetGlobalOutput(gloTrigResp); + for (Int_t ii = 0; ii < 4; ii++) { + fDarcHeader->SetGlobalInput(gloTrigInput[ii],ii); + } + } else { + fDarcHeader->SetGlobalOutput(0); + } if (fScalerEvent) { // 6 DARC scaler words @@ -530,25 +568,33 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore if (fScalerEvent) { // 10 Global scaler words - memcpy(fDarcHeader->GetGlobalScalers(), &buffer[index], kGlobalScalerLength*4); + memcpy(&buffer[index], fDarcHeader->GetGlobalScalers(), kGlobalScalerLength*4); index += kGlobalScalerLength; } // 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); - if (!crate) - AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, iDDL)); + if (!crate) { + AliError(Form("Missing crate number %d in DDL %d\n", iReg, iDDL)); + return 0; + } // 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())); + return 0; + } + // Regional card header word = 0; @@ -556,15 +602,15 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore fRegHeader->SetDarcWord(word); regOut = regTrg->GetOutput(); - regInpHpt = regTrg->GetLocalOutput(0); - regInpLpt = regTrg->GetLocalOutput(1); + regInpLpt = regTrg->GetLocalOutput(0); + regInpHpt = regTrg->GetLocalOutput(1); // 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); @@ -585,7 +631,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); @@ -655,7 +703,7 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore } // local card // fill regional header with local output - fRegHeader->SetInput(regInpHpt, 0); + fRegHeader->SetInput(regInpLpt, 0); fRegHeader->SetInput(regInpHpt, 1); memcpy(&buffer[indexReg],fRegHeader->GetHeader(),kRegHeaderLength*4); @@ -664,8 +712,8 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore // writting onto disk // write DDL's - fHeader.fSize = (index + headerSize) * 4;// total length in bytes - file[iDDL]->WriteBuffer((char*)(&fHeader),headerSize*4); + fHeader->fSize = (index + headerSize) * 4;// total length in bytes + file[iDDL]->WriteBuffer((char*)fHeader,headerSize*4); file[iDDL]->WriteBuffer((char*)buffer,sizeof(int)*index); }