Fixes for #86059: Install data when ALICE_ROOT does not point to source (Christian)
[u/mrichter/AliRoot.git] / MUON / AliMUONRawWriter.cxx
index eff2320..d783d44 100644 (file)
@@ -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"
 #include "AliMUONLocalTriggerBoard.h"
 #include "AliMUONRegionalTrigger.h"
 #include "AliMUONRegHeader.h"
-#include "AliMUONTriggerCrate.h"
-#include "AliMUONTriggerCrateStore.h"
+
 #include "AliMUONVTriggerStore.h"
-#include "AliMUONStopwatchGroup.h"
-#include "AliMUONStopwatchGroupElement.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"
 #include "AliMpDEManager.h"
 #include "AliMpExMap.h"
@@ -75,6 +79,7 @@
 #include "AliMpVSegmentation.h"
 
 #include "AliRawReader.h"
+#include "AliRawDataHeaderSim.h"
 #include "AliBitPacking.h" 
 #include "AliDAQ.h"
 #include "AliLog.h"
@@ -96,10 +101,8 @@ AliMUONRawWriter::AliMUONRawWriter()
     fRegHeader(new AliMUONRegHeader()),
     fLocalStruct(new AliMUONLocalStruct()),
     fDDLStore(AliMpDDLStore::Instance()),
-    fCrateManager(new AliMUONTriggerCrateStore()),
     fScalerEvent(kFALSE),
-    fHeader(),
-    fTimers(new AliMUONStopwatchGroup),
+    fHeader(0x0),
     fBufferSize((((43*AliMpConstants::ManuNofChannels() + 4)*5 + 10)*5 + 8)*2),
     fBuffer(new Int_t [fBufferSize])
 {
@@ -111,9 +114,13 @@ AliMUONRawWriter::AliMUONRawWriter()
   fBlockHeader->SetDataKey(fBlockHeader->GetDefaultDataKey());
   fDspHeader->SetDataKey(fDspHeader->GetDefaultDataKey());
 
-  // Crate manager
-  fCrateManager->ReadFromFile();
-
+  // Load mapping
+  if ( ! fDDLStore ) {
+    if ( ! AliMpCDB::LoadDDLStore() ) {
+      AliFatal("Could not access mapping from OCDB !");
+    }
+    fDDLStore = AliMpDDLStore::Instance();
+  }  
 }
 
 //__________________________________________________________________________
@@ -128,31 +135,43 @@ AliMUONRawWriter::~AliMUONRawWriter(void)
   delete fDarcHeader;
   delete fRegHeader;
   delete fLocalStruct;
-  delete fCrateManager;
-  AliInfo("Timers:");
-  fTimers->Print();
-  delete fTimers;
   delete[] fBuffer;
 }
 
 //____________________________________________________________________
-Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore,
-                                   AliMUONVTriggerStore* triggerStore)
+void  AliMUONRawWriter::LocalWordPacking(UInt_t& word, UInt_t locId, UInt_t locDec, 
+                                        UInt_t trigY, UInt_t posY, UInt_t posX, 
+                                        UInt_t sdevX, UInt_t devX)
+{
+/// pack local trigger word
+
+    AliBitPacking::PackWord(locId,word,19,22); //card id number in crate
+    AliBitPacking::PackWord(locDec,word,15,18);
+    AliBitPacking::PackWord(trigY,word,14,14);
+    AliBitPacking::PackWord(posY,word,10,13);
+    AliBitPacking::PackWord(sdevX,word,9,9);
+    AliBitPacking::PackWord(devX,word,5,8);
+    AliBitPacking::PackWord(posX,word,0,4);
+
+}
+
+//____________________________________________________________________
+Int_t AliMUONRawWriter::Digits2Raw(const AliMUONVDigitStore* digitStore,
+                                   const AliMUONVTriggerStore* triggerStore)
 {
   /// convert digits of the current event to raw data
 
-  AliMUONStopwatchGroupElement timer(fTimers,"MUON","AliMUONRawWriter::Digits2Raw");
+  AliCodeTimerAuto("",0)
   
   Int_t idDDL;
-  Char_t name[255];
 
   // tracking chambers
   
   if ( digitStore ) 
   {
-    AliMUONStopwatchGroupElement timer(fTimers,"MUON","AliMUONRawWriter::Digits2Raw for Tracker");
+    AliCodeTimerAuto("for Tracker",1)
 
-    AliMpExMap busPatchMap(true);
+    AliMpExMap busPatchMap;
 
     Int_t nDDLs = AliDAQ::NumberOfDdls("MUONTRK");
     
@@ -177,26 +196,24 @@ Int_t AliMUONRawWriter::Digits2Raw(AliMUONVDigitStore* digitStore,
  
   if ( triggerStore )
   {
-    AliMUONStopwatchGroupElement timer(fTimers,"MUON","AliMUONRawWriter::Digits2Raw for Trigger");
+    AliCodeTimerAuto("for Trigger",1)
 
     // trigger chambers
     
-    FILE* file[2];
+    AliFstream* file[2];
     
     // open files
     idDDL = 0;// MUTR
-    strcpy(name,AliDAQ::DdlFileName("MUONTRG",idDDL));
-    file[0] = fopen(name,"w");
+    file[0] = new AliFstream(AliDAQ::DdlFileName("MUONTRG",idDDL));
     
     idDDL = 1;// MUTR
-    strcpy(name,AliDAQ::DdlFileName("MUONTRG",idDDL));
-    file[1] = fopen(name,"w");
+    file[1] = new AliFstream(AliDAQ::DdlFileName("MUONTRG",idDDL));
       
     WriteTriggerDDL(*triggerStore,file);
       
     // reset and close
-    fclose(file[0]);
-    fclose(file[1]);
+    delete file[0];
+    delete file[1];
       
     AliDebug(1,"Trigger written");
   }
@@ -211,7 +228,7 @@ AliMUONRawWriter::Digits2BusPatchMap(const AliMUONVDigitStore& digitStore,
 {
   /// Create bus patch structures corresponding to digits in the store
   
-  AliMUONStopwatchGroupElement timer(fTimers,"MUON","AliMUONRawWriter::Digits2BusPatchMap");
+  AliCodeTimerAuto("",0)
   
   static const Int_t kMAXADC = (1<<12)-1; // We code the charge on a 12 bits ADC.
     
@@ -223,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;
   
@@ -235,8 +255,8 @@ AliMUONRawWriter::Digits2BusPatchMap(const AliMUONVDigitStore& digitStore,
     {
       // This is most probably an error in the digitizer (which should insure
       // the adc is below kMAXADC), so make it a (non-fatal) error indeed.
-      AliError(Form("adc value %d above %x for DE %d . Setting to %x. Digit is:",
-                    digit->DetElemId(),charge,kMAXADC,kMAXADC));
+      AliError(Form("adc value %d above 0x%x for DE %d . Setting to 0x%x. Digit is:",
+                    charge,kMAXADC,digit->DetElemId(),kMAXADC));
       StdoutToAliError(digit->Print());
       charge = kMAXADC;
     }
@@ -269,9 +289,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)
     {
@@ -297,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 
  
-  AliMUONStopwatchGroupElement timer(fTimers,"MUON","AliMUONRawWriter::WriteTrackerDDL");
+  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);
@@ -324,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) 
@@ -347,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 
         {
@@ -377,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  
@@ -386,25 +414,32 @@ 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;
   
-  FILE* file = fopen(AliDAQ::DdlFileName("MUONTRK",iDDL),"w");
+  AliFstream* file = new AliFstream(AliDAQ::DdlFileName("MUONTRK",iDDL));
   
-  fwrite((char*)(&fHeader),headerSize*4,1,file);
-  fwrite(fBuffer,sizeof(int),index,file);
-  fclose(file);
+  file->WriteBuffer((char*)fHeader,headerSize*4);
+  file->WriteBuffer((char*)fBuffer,sizeof(int)*index);
+  delete file;
 }
 
 //______________________________________________________________________________
@@ -416,11 +451,16 @@ Int_t AliMUONRawWriter::GetBusPatch(const AliMUONVDigit& digit) const
 }
 
 //______________________________________________________________________________
-Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore, FILE* file[2])
+Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore, AliFstream* file[2])
 {
   /// Write trigger DDL
   
-  AliMUONStopwatchGroupElement timer(fTimers,"MUON","AliMUONRawWriter::WriteTriggerDDL");
+  AliCodeTimerAuto("",0)
+
+  if (fHeader == 0x0) {
+    AliError("Raw data header must be set");
+    return 0;
+  }
 
  // DDL event one per half chamber
 
@@ -435,11 +475,12 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore
   }
   
   Int_t gloTrigResp = gloTrg->GetGlobalResponse();
+  UInt_t *gloTrigInput = gloTrg->GetGlobalInput();
 
   UInt_t word;
   Int_t* buffer = 0;
   Int_t index;
-  Int_t iLocCard, locCard;
+  Int_t locCard;
   UChar_t locDec, trigY, posY, posX, regOut;
   UInt_t regInpLpt;
   UInt_t regInpHpt;
@@ -470,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
@@ -503,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
@@ -522,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
-      AliMUONTriggerCrate* crate = fCrateManager->Crate(iDDL, 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));
+        continue;
+      }  
 
       // 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()));
+        continue;
+      }  
+    
       // Regional card header
       word = 0;
 
@@ -548,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,16,23);
-      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);
 
@@ -574,72 +628,86 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore
       // end of regional word
       buffer[index++] = fRegHeader->GetEndOfReg();
       
-      TObjArray *boards = crate->Boards();
-
-
       // 16 local card per regional board
       //      UShort_t localMask = 0x0;
       
-      for (Int_t iLoc = 0; iLoc < 16; iLoc++) {
-         
-         // slot zero for Regional card
-         AliMUONLocalTriggerBoard* localBoard = (AliMUONLocalTriggerBoard*)boards->At(iLoc+1);
+      Int_t nLocalBoard = AliMpConstants::LocalBoardNofChannels();
+
+      for (Int_t iLoc = 0; iLoc < nLocalBoard; iLoc++) {
          
-         if (localBoard) { // if not empty slot
-             
-      if ((iLocCard = localBoard->GetNumber()) != 0) {// if notified board
-        
-        AliMUONLocalTrigger* locTrg = triggerStore.FindLocal(iLocCard);
-        
+       // slot zero for Regional card
+       Int_t localBoardId = crate->GetLocalBoardId(iLoc);
+
+       if (localBoardId) { // if not empty slot
+         AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(localBoardId);
+
+         if (localBoard->IsNotified()) {// if notified board 
+           AliMUONLocalTrigger* locTrg = triggerStore.FindLocal(localBoardId);
+
+      if (locTrg)
+      {
         locCard = locTrg->LoCircuit();
-        
         locDec  = locTrg->GetLoDecision();
-        trigY =  locTrg->LoTrigY();
-        posY  = locTrg->LoStripY();
-        posX  = locTrg->LoStripX();
-        devX  = locTrg->LoDev();
-        sdevX = locTrg->LoSdev();
+        trigY   = locTrg->LoTrigY();
+        posY    = locTrg->LoStripY();
+        posX    = locTrg->LoStripX();
+        devX    = locTrg->LoDev();
+        sdevX   = locTrg->LoSdev();
         
         AliDebug(4,Form("loctrg %d, posX %d, posY %d, devX %d\n", 
                         locTrg->LoCircuit(),locTrg->LoStripX(),locTrg->LoStripY(),locTrg->LoDev()));  
         //packing word
         word = 0;
-        AliBitPacking::PackWord((UInt_t)iLoc,word,19,22); //card id number in crate
-        AliBitPacking::PackWord((UInt_t)locDec,word,15,18);
-        AliBitPacking::PackWord((UInt_t)trigY,word,14,14);
-        AliBitPacking::PackWord((UInt_t)posY,word,10,13);
-        AliBitPacking::PackWord((UInt_t)sdevX,word,9,9);
-        AliBitPacking::PackWord((UInt_t)devX,word,5,8);
-        AliBitPacking::PackWord((UInt_t)posX,word,0,4);
+        LocalWordPacking(word, (UInt_t)iLoc, (UInt_t)locDec, (UInt_t)trigY, (UInt_t)posY, 
+                         (UInt_t)posX, (UInt_t)sdevX, (UInt_t)devX);
         
         buffer[index++] = (locTrg->GetX1Pattern() | (locTrg->GetX2Pattern() << 16));
         buffer[index++] = (locTrg->GetX3Pattern() | (locTrg->GetX4Pattern() << 16));
         buffer[index++] = (locTrg->GetY1Pattern() | (locTrg->GetY2Pattern() << 16));
         buffer[index++] = (locTrg->GetY3Pattern() | (locTrg->GetY4Pattern() << 16));
         buffer[index++] = (Int_t)word; // data word
-      } else {// number!=0
-              // fill with 10CDEAD word for 'non-notified' slots
-        for (Int_t i = 0; i < fLocalStruct->GetLength(); i++)
-                     buffer[index++] = fLocalStruct->GetDisableWord(); 
       }
-         } else { 
-             // fill with 10CDEAD word for empty slots
-             for (Int_t i = 0; i < fLocalStruct->GetLength(); i++)
-                 buffer[index++] = fLocalStruct->GetDisableWord(); 
-         }// condition localBoard
-         
-         // 45 regional scaler word
-         if (fScalerEvent) {
-             memcpy(&buffer[index], fLocalStruct->GetScalers(), kLocScalerLength*4);
-             index += kLocScalerLength;
          }
+         // fill copy card X-Y inputs from the notified cards 
+         if (localBoard->GetInputXfrom() && localBoard->GetInputYfrom()) 
+         {
+           // not triggered
+           locDec = 0; trigY = 1; posY = 15;    
+           posX   = 0; devX  = 0; sdevX = 1;
+           LocalWordPacking(word, (UInt_t)iLoc, (UInt_t)locDec, (UInt_t)trigY, (UInt_t)posY, 
+                            (UInt_t)posX, (UInt_t)sdevX, (UInt_t)devX);
+
+           Int_t localFromId = localBoard->GetInputXfrom();
+           AliMUONLocalTrigger* locTrgfrom  = triggerStore.FindLocal(localFromId);
+
+      if ( locTrgfrom ) 
+      {
+        buffer[index++] = 0; // copy only X3-4 & Y1-4
+        buffer[index++] = (locTrgfrom->GetX3Pattern() | (locTrgfrom->GetX4Pattern() << 16));
+        buffer[index++] = (locTrgfrom->GetY1Pattern() | (locTrgfrom->GetY2Pattern() << 16));
+        buffer[index++] = (locTrgfrom->GetY3Pattern() | (locTrgfrom->GetY4Pattern() << 16));
+        buffer[index++] = word;
+      }
+         }
+
+       } else { 
+         // fill with 10CDEAD word for empty slots
+         for (Int_t i = 0; i < fLocalStruct->GetLength(); i++)
+             buffer[index++] = fLocalStruct->GetDisableWord(); 
+       }// condition localBoard
+         
+       // 45 regional scaler word
+       if (fScalerEvent) {
+         memcpy(&buffer[index], fLocalStruct->GetScalers(), kLocScalerLength*4);
+         index += kLocScalerLength;
+       }
          
-         // end of local structure words
-         buffer[index++] = fLocalStruct->GetEndOfLocal();
+       // end of local structure words
+       buffer[index++] = fLocalStruct->GetEndOfLocal();
          
       } // 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);
       
@@ -648,9 +716,9 @@ Int_t AliMUONRawWriter::WriteTriggerDDL(const AliMUONVTriggerStore& triggerStore
 
     // writting onto disk
     // write DDL's
-    fHeader.fSize = (index + headerSize) * 4;// total length in bytes
-    fwrite((char*)(&fHeader),headerSize*4,1,file[iDDL]);
-    fwrite(buffer,sizeof(int),index,file[iDDL]);
+    fHeader->fSize = (index + headerSize) * 4;// total length in bytes
+    file[iDDL]->WriteBuffer((char*)fHeader,headerSize*4);
+    file[iDDL]->WriteBuffer((char*)buffer,sizeof(int)*index);
   
   }
   delete[] buffer;