]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONRawWriter.cxx
ESD file is added to the list of proof output files. It is then automatically merged...
[u/mrichter/AliRoot.git] / MUON / AliMUONRawWriter.cxx
index 7e9ca052c3084a274865df85b3c3426d7d039ce7..6b68fc4a195fcd06aeefa1d4d31b49a04fc8f202 100644 (file)
@@ -65,6 +65,7 @@
 
 #include "AliMpDDLStore.h"
 #include "AliMpDDL.h"
+#include "AliMpRegionalTrigger.h"
 #include "AliMpTriggerCrate.h"
 #include "AliMpLocalBoard.h"
 #include "AliMpDetElement.h"
@@ -77,6 +78,7 @@
 #include "AliMpVSegmentation.h"
 
 #include "AliRawReader.h"
+#include "AliRawDataHeaderSim.h"
 #include "AliBitPacking.h" 
 #include "AliDAQ.h"
 #include "AliLog.h"
@@ -99,7 +101,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])
 {
@@ -162,7 +164,7 @@ Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore,
   {
     AliCodeTimerAuto("for Tracker")
 
-    AliMpExMap busPatchMap(true);
+    AliMpExMap busPatchMap;
 
     Int_t nDDLs = AliDAQ::NumberOfDdls("MUONTRK");
     
@@ -233,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;
   
@@ -279,9 +284,13 @@ AliMUONRawWriter::Digits2BusPatchMap(const AliMUONVDigitStore& digitStore,
       parity ^=  ((word >> i) & 0x1);
     }
     AliBitPacking::PackWord((UInt_t)parity,word,31,31);
-    
-    AliMUONBusStruct* busStruct = 
-      static_cast<AliMUONBusStruct*>(busPatchMap.GetValue(busPatchId));
+
+    if ( currentBusPatchId != busPatchId ) 
+    {
+      busStruct = 
+        static_cast<AliMUONBusStruct*>(busPatchMap.GetValue(busPatchId));
+      currentBusPatchId = busPatchId;
+    }
     
     if (!busStruct)
     {
@@ -309,6 +318,10 @@ AliMUONRawWriter::WriteTrackerDDL(AliMpExMap& busPatchMap, Int_t iDDL)
  
   AliCodeTimerAuto("")
 
+  if (fHeader == 0x0) {
+    AliError("Raw data header must be set");
+    return;
+  }
   memset(fBuffer,0,fBufferSize*sizeof(Int_t));
   
   AliMpDDL* ddl = fDDLStore->GetDDL(iDDL);
@@ -334,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) 
@@ -357,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 
         {
@@ -387,7 +400,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  
@@ -396,23 +409,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;
 }
@@ -432,6 +452,11 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore
   
   AliCodeTimerAuto("")
 
+  if (fHeader == 0x0) {
+    AliError("Raw data header must be set");
+    return 0;
+  }
+
  // DDL event one per half chamber
 
  // DDL header size
@@ -480,9 +505,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
@@ -538,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);
@@ -549,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;
 
@@ -564,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);
 
@@ -587,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);
@@ -666,8 +698,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);
   
   }