AliMUONBlockHeader, AliMUONRawWriter:
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 28 Mar 2008 16:21:15 +0000 (16:21 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 28 Mar 2008 16:21:15 +0000 (16:21 +0000)
   - Added DDL data key at the end of the payload

AliMUONRawStreamTracker.h
   - Added getter for current DDL index

AliMUONQADataMakerRec
   - Added local buspatch hit distribution per DDL for raw QA

(Christian)

MUON/AliMUONBlockHeader.cxx
MUON/AliMUONBlockHeader.h
MUON/AliMUONPayloadTracker.cxx
MUON/AliMUONQADataMakerRec.cxx
MUON/AliMUONQADataMakerRec.h
MUON/AliMUONRawStreamTracker.h
MUON/AliMUONRawWriter.cxx

index 7f7639f..5fd1ad4 100644 (file)
@@ -35,8 +35,9 @@
 ClassImp(AliMUONBlockHeader)
 /// \endcond
 
-const Int_t  AliMUONBlockHeader::fgkHeaderLength = 8;
+const Int_t  AliMUONBlockHeader::fgkHeaderLength   = 8;
 const UInt_t AliMUONBlockHeader::fgkDefaultDataKey = 0xFC0000FC;
+const UInt_t AliMUONBlockHeader::fgkDdlDataKey     = 0xD000000D;
 //___________________________________________
 AliMUONBlockHeader::AliMUONBlockHeader()
   :  TObject(),
index 66db24f..509b9b1 100644 (file)
@@ -49,7 +49,8 @@ public:
    Int_t   GetHeaderLength()   const {return fgkHeaderLength;}
            /// Return default data key word for CRT header
    UInt_t  GetDefaultDataKey() const {return fgkDefaultDataKey;}
-
+         /// Return  data key end word for CRT header
+   UInt_t  GetDdlDataKey() const {return fgkDdlDataKey;}
 
            /// Set data key word for CRT header
    void    SetDataKey(Int_t d)     {fDataKey = d;}
@@ -103,11 +104,12 @@ public:
    Int_t     fEventId2;       ///< Event Id in orbit number
 
 
-   static const Int_t fgkHeaderLength;   ///< header length in word
-   static const UInt_t fgkDefaultDataKey; ///< default data key word for CRT header 
+   static const Int_t  fgkHeaderLength;    ///< header length in word
+   static const UInt_t fgkDefaultDataKey;  ///< default data key word for CRT header 
+   static const UInt_t fgkDdlDataKey;      ///< data key end word for CRT header 
 
    TClonesArray*  fDspHeaderArray;  ///< array of block header
 
-   ClassDef(AliMUONBlockHeader,2)  // MUON block header for Tracker event
+   ClassDef(AliMUONBlockHeader,3)  // MUON block header for Tracker event
 };
 #endif
index 60923dd..4733c66 100644 (file)
@@ -109,132 +109,142 @@ Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize)
 
   // CROCUS CRT
   while (buffer[index] == fBlockHeader->GetDefaultDataKey()) {
-
+    
     if (iBlock > fMaxBlock) break;
-     
+    
     // copy within padding words
     memcpy(fBlockHeader->GetHeader(),&buffer[index], (kBlockHeaderSize)*4);
-
+    
     totalBlockSize = fBlockHeader->GetTotalLength();
-
+    
     indexBlk = index;
     index += kBlockHeaderSize;
-
+    
     // copy in TClonesArray
     fDDLTracker->AddBlkHeader(*fBlockHeader);
-
+    
     // Crocus FRT
     Int_t iDsp = 0;
     while (buffer[index] == fDspHeader->GetDefaultDataKey()) {
-
+      
       if (iDsp > fMaxDsp) break; // if ever...
-               
+      
       memcpy(fDspHeader->GetHeader(),&buffer[index], kDspHeaderSize*4);
-
+      
       totalDspSize = fDspHeader->GetTotalLength();
-
+      
       if (fDspHeader->GetErrorWord()) {
-//     fDspHeader->Print("");
-       if ( fDspHeader->GetErrorWord() == (0x000000B1 |  fBlockHeader->GetDspId())
-            ||  fDspHeader->GetErrorWord() == (0x00000091 |  fBlockHeader->GetDspId()) ){
-         // an event with a glitch in the readout  has been detected
-         // it means that somewhere a 1 byte word has been randomly inserted
-         // all the readout sequence is shifted  untill the next event 
-   
+        //     fDspHeader->Print("");
+        if ( fDspHeader->GetErrorWord() == (0x000000B1 |  fBlockHeader->GetDspId())
+            ||  fDspHeader->GetErrorWord() == (0x00000091 |  fBlockHeader->GetDspId()) ){
+          // an event with a glitch in the readout  has been detected
+          // it means that somewhere a 1 byte word has been randomly inserted
+          // all the readout sequence is shifted  untill the next event 
+          
           Char_t* msg = Form("Glitch error detected in DSP %d, skipping event ", fBlockHeader->GetDspId());
           
           if (fWarnings) AliWarning(msg); 
           AddErrorMessage(msg);
-         fGlitchErrors++;
-         return kFALSE ; 
-       }       
+          fGlitchErrors++;
+          return kFALSE ; 
+        }      
       }
       
       indexDsp = index;
       index += kDspHeaderSize;
-
+      
       // copy in TClonesArray
       fDDLTracker->AddDspHeader(*fDspHeader, iBlock);
-
+      
       // buspatch structure
       Int_t iBusPatch = 0;
       while (buffer[index] == fBusStruct->GetDefaultDataKey()) {
-
-       if (iBusPatch > fMaxBus) break; // if ever
-       
-       //copy buffer into header structure
-       memcpy(fBusStruct->GetHeader(), &buffer[index], kBusPatchHeaderSize*4);
-
-       totalBusPatchSize = fBusStruct->GetTotalLength();
-       indexBusPatch     = index;
-               
-       //Check Buspatch header, not empty events
-       if(totalBusPatchSize > kBusPatchHeaderSize) {    
-
-         index   += kBusPatchHeaderSize;
-         dataSize = fBusStruct->GetLength();
-         bufSize  = fBusStruct->GetBufSize();
-
-         if(dataSize > 0) { // check data present
-           if (dataSize > bufSize) // check buffer size
-             fBusStruct->SetAlloc(dataSize);
-        
-           //copy buffer into data structure
-           memcpy(fBusStruct->GetData(), &buffer[index], dataSize*4);
-           fBusStruct->SetBlockId(iBlock); // could be usefull in future applications ?
-           fBusStruct->SetDspId(iDsp);
-
-           // check parity
+        
+        if (iBusPatch > fMaxBus) break; // if ever
+        
+        //copy buffer into header structure
+        memcpy(fBusStruct->GetHeader(), &buffer[index], kBusPatchHeaderSize*4);
+        
+        totalBusPatchSize = fBusStruct->GetTotalLength();
+        indexBusPatch     = index;
+        
+        //Check Buspatch header, not empty events
+        if(totalBusPatchSize > kBusPatchHeaderSize) {    
+          
+          index   += kBusPatchHeaderSize;
+          dataSize = fBusStruct->GetLength();
+          bufSize  = fBusStruct->GetBufSize();
+          
+          if(dataSize > 0) { // check data present
+            if (dataSize > bufSize) // check buffer size
+              fBusStruct->SetAlloc(dataSize);
+            
+            //copy buffer into data structure
+            memcpy(fBusStruct->GetData(), &buffer[index], dataSize*4);
+            fBusStruct->SetBlockId(iBlock); // could be usefull in future applications ?
+            fBusStruct->SetDspId(iDsp);
+            
+            // check parity
             if(!CheckDataParity()) {
-                fParityErrors++;
-                return kFALSE;
-             }
-
-
-           // copy in TClonesArray
-           fDDLTracker->AddBusPatch(*fBusStruct, iBlock, iDsp);
-
-         } // dataSize test
-
-       } // testing buspatch
-
-       index = indexBusPatch + totalBusPatchSize;
-       if (index >= totalDDLSize) {// check the end of DDL
-         index = totalDDLSize - 1; // point to the last element of buffer
-         break;
-       }
-       iBusPatch++;
+              fParityErrors++;
+              return kFALSE;
+            }
+            
+            // copy in TClonesArray
+            fDDLTracker->AddBusPatch(*fBusStruct, iBlock, iDsp);
+            
+          } // dataSize test
+          
+        } // testing buspatch
+        
+        index = indexBusPatch + totalBusPatchSize;
+        if (index >= totalDDLSize) {// check the end of DDL
+          index = totalDDLSize - 1; // point to the last element of buffer
+          break;
+        }
+        iBusPatch++;
       }  // buspatch loop
-
+      
       // skipping additionnal word if padding
       if (fDspHeader->GetPaddingWord() == 1) {
-       if (buffer[index++] != fDspHeader->GetDefaultPaddingWord()) {
-
+        if (buffer[index++] != fDspHeader->GetDefaultPaddingWord()) {
+          
           Char_t *msg = Form("Padding word error for iBlock %d, iDsp %d, iBus %d\n", 
-                      iBlock, iDsp, iBusPatch);
-        
+                             iBlock, iDsp, iBusPatch);
+          
           if (fWarnings) AliWarning(msg);
           AddErrorMessage(msg);
           fPaddingErrors++;
-       }
+        }
       }
-
+      
       index = indexDsp + totalDspSize;
       if (index >= totalDDLSize) {
-       index = totalDDLSize - 1;
-       break;
+        index = totalDDLSize - 1;
+        break;
       }
       iDsp++;
     }  // dsp loop
-
+    
     index = indexBlk + totalBlockSize;
     if (index >= totalDDLSize) {
       index = totalDDLSize - 1;
       break;
     }
+    
     iBlock++;
   }  // block loop
-
+  
+  if (buffer[index++] != fBlockHeader->GetDdlDataKey() || 
+      buffer[index++] != fBlockHeader->GetDdlDataKey()) {
+    
+    Char_t *msg = Form("Bad end of DDL data key\n");
+    
+    if (fWarnings) AliWarning(msg);
+    AddErrorMessage(msg);
+  }
+  
+  
   return kTRUE;
 }
 
index 54b90b2..be6b9bb 100644 (file)
@@ -29,6 +29,7 @@
 #include "AliLog.h"
 #include "AliRawReader.h"
 #include "AliQAChecker.h"
+#include "AliMpBusPatch.h"
 #include "AliMUONCluster.h"  
 #include "AliMUONRawStreamTracker.h"
 #include "AliMUONRawStreamTrigger.h"
@@ -125,6 +126,12 @@ void AliMUONQADataMakerRec::InitRaws()
 
     TH1I* h1 = new TH1I("hRawCharge", "Charge distribution in rawdata", 4096, 0, 4095); 
     Add2RawsList(h1, kRawCharge);
+               
+               for (Int_t iDDL = 0; iDDL < 20; ++iDDL) 
+               {
+                       TH1F* h2 = new TH1F(Form("%s%d", "hRawBusPatchDDL", iDDL), Form("%s %d","RAW Buspatch distribution for DDL", iDDL), 50, 0, 49); 
+                       Add2RawsList(h2, kRawBuspatchDDL+iDDL);
+               }
 
 }
 
@@ -188,6 +195,9 @@ void AliMUONQADataMakerRec::MakeRaws(AliRawReader* rawReader)
   
       GetRawsData(kRawBusPatch)->Fill(busPatchId);
       GetRawsData(kRawCharge)->Fill(charge);
+                       Int_t iDDL = rawStream.GetCurentDDL();
+                       GetRawsData(kRawBuspatchDDL + iDDL)->Fill(AliMpBusPatch::GetLocalBusID(busPatchId, iDDL));
+               
                  
     } // Next digit
 }
index 48b028a..02f0f0e 100644 (file)
@@ -34,8 +34,9 @@ public:
 private:
   /// Raw histograms indices
   enum ERaw { 
-    kRawBusPatch = 0,  ///< Raw bus patch histogram index
-    kRawCharge   = 1   ///< Raw charge histogram index
+    kRawBusPatch    = 0,  ///< Raw bus patch histogram index
+    kRawCharge      = 1,  ///< Raw charge histogram index
+    kRawBuspatchDDL = 2   ///< Raw buspatch hit map histogram per DDL index
   };
          
   /// Rec points histograms indices
index 5091794..59c94c6 100644 (file)
@@ -73,6 +73,9 @@ class AliMUONRawStreamTracker: public AliMUONVRawStreamTracker {
 
     /// Return number of DDL
     Int_t GetDDL() const {return fDDL - 1;}
+               
+               /// Return current DDL index
+    Int_t GetCurentDDL() const {return fCurrentDDLIndex;}
 
     /// Return pointer for payload
     AliMUONPayloadTracker*  GetPayLoad()    const {return fPayload;}
index e249ef3..c922b03 100644 (file)
@@ -392,7 +392,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  
@@ -401,13 +401,19 @@ 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