In MTR QA:
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 27 Oct 2009 21:50:53 +0000 (21:50 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 27 Oct 2009 21:50:53 +0000 (21:50 +0000)
- Fixed normalization problems on shifter's histos when running with AMORE.
- Correctly filled the MTR "display" histos for experts.
- Improved code readability and re-usability.
(Aurelien, Diego)

MUON/AliMUONDigitMaker.cxx
MUON/AliMUONGlobalTriggerBoard.cxx
MUON/AliMUONGlobalTriggerBoard.h
MUON/AliMUONLocalTrigger.cxx
MUON/AliMUONLocalTrigger.h
MUON/AliMUONTriggerQAChecker.cxx
MUON/AliMUONTriggerQADataMakerRec.cxx
MUON/AliMUONTriggerQADataMakerRec.h

index 505da30..fc7023d 100644 (file)
@@ -364,22 +364,7 @@ AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
           {
             // fill local trigger
             AliMUONLocalTrigger localTrigger;
-            localTrigger.SetLoCircuit(loCircuit);
-            localTrigger.SetLoStripX((Int_t)localStruct->GetXPos());
-            localTrigger.SetLoStripY((Int_t)localStruct->GetYPos());
-            localTrigger.SetLoDev((Int_t)localStruct->GetXDev());
-            localTrigger.SetLoSdev((Int_t)localStruct->GetSXDev());
-            localTrigger.SetLoTrigY((Int_t)localStruct->GetTrigY());
-            localTrigger.SetLoLpt(localStruct->GetLpt());
-            localTrigger.SetLoHpt(localStruct->GetHpt());
-            localTrigger.SetX1Pattern(localStruct->GetX1());
-            localTrigger.SetX2Pattern(localStruct->GetX2());
-            localTrigger.SetX3Pattern(localStruct->GetX3());
-            localTrigger.SetX4Pattern(localStruct->GetX4());
-            localTrigger.SetY1Pattern(localStruct->GetY1());
-            localTrigger.SetY2Pattern(localStruct->GetY2());
-            localTrigger.SetY3Pattern(localStruct->GetY3());
-            localTrigger.SetY4Pattern(localStruct->GetY4());
+           localTrigger.SetLocalStruct(loCircuit, *localStruct);
             fTriggerStore->Add(localTrigger);
           }
           
index 64eebe6..ba23767 100644 (file)
@@ -201,23 +201,9 @@ void AliMUONGlobalTriggerBoard::BuildGlobalInput()
   for (Int_t i=0;i< 4;i++) fGlobalInput[i] = 0;
 
   UShort_t regRespInv;
-  TBits rs(8), rsi(8);
   for (Int_t iReg = 0; iReg < 16; iReg++) {
 
-    // invert "pair" bits in regional response
-    // [+, -, US, LS] becomes [+, -, LS, US]
-    rs.Set(8,&fRegionalResponse[iReg]);
-    for (Int_t i = 0; i < 4; i++) {
-      if (i%2 == 0) {
-       rsi[2*i]   = rs[2*i+1];
-       rsi[2*i+1] = rs[2*i];
-      } else {
-       rsi[2*i]   = rs[2*i];
-       rsi[2*i+1] = rs[2*i+1];
-      }
-    }
-    regRespInv = 0;
-    rsi.Get(&regRespInv);
+    regRespInv = InvertPairBits(iReg);
 
     if (iReg < 8) {    // right
       // Lpt word
@@ -241,15 +227,22 @@ void AliMUONGlobalTriggerBoard::MaskGlobalInput()
   /// Apply masks to global input and recalculate regional inputs before
   /// applying the global response
 
-  UShort_t regRespInv;
-  TBits rs(8), rsi(8);
-
   UInt_t gitmp[4];
   for (Int_t i = 0; i < 4; i++) {
     fGlobalInput[i] &= fMask[i];
     gitmp[i] = fGlobalInput[i];
   }
 
+  RecomputeRegional(gitmp);
+}
+
+
+//___________________________________________
+void AliMUONGlobalTriggerBoard::RecomputeRegional(UInt_t gitmp[4])
+{
+  //
+  /// Recomput regional response from global input
+  //
   for (Int_t iReg = 0; iReg < 16; iReg++) {
     fRegionalResponse[iReg] = 0;
     if (iReg < 8) {    // right
@@ -263,23 +256,9 @@ void AliMUONGlobalTriggerBoard::MaskGlobalInput()
       // Hpt
       fRegionalResponse[iReg] |= ((gitmp[3] >> (4*(iReg-8))) & 0xF) << 4;
     }
-    // invert "pair" bits in regional response
-    // [+, -, US, LS] becomes [+, -, LS, US]
-    rs.Set(8,&fRegionalResponse[iReg]);
-    for (Int_t i = 0; i < 4; i++) {
-      if (i%2 == 0) {
-       rsi[2*i]   = rs[2*i+1];
-       rsi[2*i+1] = rs[2*i];
-      } else {
-       rsi[2*i]   = rs[2*i];
-       rsi[2*i+1] = rs[2*i+1];
-      }
-    }
-    regRespInv = 0;
-    rsi.Get(&regRespInv);
-    fRegionalResponse[iReg] = regRespInv;
-  }
 
+    fRegionalResponse[iReg] = InvertPairBits(iReg);
+  }
 }
 
 //___________________________________________
@@ -317,3 +296,26 @@ void AliMUONGlobalTriggerBoard::Scan(Option_t*) const
    printf("\n");
 }
 
+
+//___________________________________________
+UShort_t AliMUONGlobalTriggerBoard::InvertPairBits(Int_t iReg)
+{
+  //
+  /// invert "pair" bits in regional response
+  /// [+, -, US, LS] becomes [+, -, LS, US]
+  //
+  TBits rs(8), rsi(8);
+  rs.Set(8,&fRegionalResponse[iReg]);
+    for (Int_t i = 0; i < 4; i++) {
+      if (i%2 == 0) {
+       rsi[2*i]   = rs[2*i+1];
+       rsi[2*i+1] = rs[2*i];
+      } else {
+       rsi[2*i]   = rs[2*i];
+       rsi[2*i+1] = rs[2*i+1];
+      }
+    }
+    UShort_t regRespInv = 0;
+    rsi.Get(&regRespInv);
+    return regRespInv;
+}
index 130fc55..a1b1430 100644 (file)
@@ -47,9 +47,13 @@ class AliMUONGlobalTriggerBoard : public AliMUONTriggerBoard
       void             MaskGlobalInput();
                        /// Global input 4 words (32bits) from regional responses
       UInt_t*          GetGlobalInput() { return fGlobalInput; }
+
+      void             RecomputeRegional(UInt_t globalInput[4]);
       
    private:
 
+      UShort_t InvertPairBits(Int_t iReg);
+
       UShort_t fRegionalResponse[16]; ///< Regional board responses
       UInt_t   fGlobalInput[4];       ///< Global input 
       UInt_t   fMask[4];              ///< Mask for the global input
index 6ac51c6..3be952f 100644 (file)
@@ -202,6 +202,39 @@ void AliMUONLocalTrigger::SetLocalStruct(Int_t loCircuit, AliMUONLocalStruct& lo
 
 }
 
+//----------------------------------------------------------------------
+void AliMUONLocalTrigger::SetLocalStruct(Int_t loCircuit, const AliMUONRawStreamTriggerHP::AliLocalStruct& localStruct)
+{
+/// Set local trigger info from rawdata localStruct (new raw reader)
+
+  // set id'
+  SetLoCircuit(loCircuit);
+
+  // set X, Y, dev, Sdev and TrigY
+  SetLoStripX((Int_t)localStruct.GetXPos());
+  SetLoStripY((Int_t)localStruct.GetYPos());
+  SetLoDev((Int_t)localStruct.GetXDev());
+  SetLoSdev((Int_t)localStruct.GetSXDev());
+  SetLoTrigY((Int_t)localStruct.GetTrigY());
+  // set L(H)pt
+  SetLoLpt(localStruct.GetLpt());
+  SetLoHpt(localStruct.GetHpt());
+
+  // set pattern X
+  SetX1Pattern(localStruct.GetX1());
+  SetX2Pattern(localStruct.GetX2());
+  SetX3Pattern(localStruct.GetX3());
+  SetX4Pattern(localStruct.GetX4());
+
+  // set pattern Y
+  SetY1Pattern(localStruct.GetY1());
+  SetY2Pattern(localStruct.GetY2());
+  SetY3Pattern(localStruct.GetY3());
+  SetY4Pattern(localStruct.GetY4());
+
+}
+
 namespace
 {
   const char* AsString(Int_t t)
index 5644e9d..28f45c9 100644 (file)
@@ -13,6 +13,7 @@
 //  Author Ph. Crochet
 
 #include <TObject.h>
+#include "AliMUONRawStreamTriggerHP.h"
 
 class AliMUONLocalStruct;
 class TArrayS;
@@ -114,6 +115,7 @@ class AliMUONLocalTrigger : public TObject {
   void SetY4Pattern(UShort_t pat) {fY4Pattern = pat;}
 
   void SetLocalStruct(Int_t loCircuit, AliMUONLocalStruct& localStruct);
+  void SetLocalStruct(Int_t loCircuit, const AliMUONRawStreamTriggerHP::AliLocalStruct& localStruct);
 
   Bool_t IsNull() const;
   
index d1f0fe4..8711ca4 100644 (file)
@@ -24,7 +24,7 @@
 /// For the moment we only implement the checking of raw data QA for the trigger
 /// by looking at the local structure and trigger response errors.
 ///
-/// \author Diego Stocc, Subatech
+/// \author Diego Stocco, Subatech
 
 
 #include "AliRecoParam.h"
@@ -79,9 +79,9 @@ AliMUONTriggerQAChecker::CheckRaws(TObjArray** list, AliMUONRecoParam* )
   }
 
   Int_t histoRawsPercentIndex[] = {
-    AliMUONTriggerQADataMakerRec::kTriggerError, 
-    AliMUONTriggerQADataMakerRec::kTriggerCalibSummary,
-    AliMUONTriggerQADataMakerRec::kTriggerReadOutErrors
+    AliMUONTriggerQADataMakerRec::kTriggerErrorSummaryNorm, 
+    AliMUONTriggerQADataMakerRec::kTriggerCalibSummaryNorm,
+    AliMUONTriggerQADataMakerRec::kTriggerReadOutErrorsNorm
   };
   const Int_t kNrawsHistos = sizeof(histoRawsPercentIndex)/sizeof(histoRawsPercentIndex[0]);
 
index a0ebefa..4e09b48 100644 (file)
@@ -23,7 +23,7 @@
 ///
 /// MUON class for quality assurance data (histo) maker
 ///
-/// \author C. Finck, D. Stocco, L. Aphecetche
+/// \author C. Finck, D. Stocco, L. Aphecetche, A. Blanc
 
 /// \cond CLASSIMP
 ClassImp(AliMUONTriggerQADataMakerRec)
@@ -57,6 +57,7 @@ ClassImp(AliMUONTriggerQADataMakerRec)
 #include "AliCDBManager.h"
 #include "TTree.h"
 #include "AliMUONGlobalTriggerBoard.h"
+#include "AliMUONGlobalTrigger.h"
 #include "AliMUONGlobalCrateConfig.h"
 
 //____________________________________________________________________________ 
@@ -100,22 +101,44 @@ void AliMUONTriggerQADataMakerRec::EndOfDetectorCycleRaws(Int_t /*specie*/, TObj
 {
   /// create Raws histograms in Raws subdir
 
+  DisplayTriggerInfo();
+
   // Normalize RawData histos
   Float_t nbevent = GetRawsData(kRawNAnalyzedEvents)->GetBinContent(1);
   Int_t histoRawsIndex[] = {
-    kTriggerError,
+    kTriggerErrorSummary,
     kTriggerCalibSummary,
     kTriggerReadOutErrors,
     kTriggerGlobalOutput
   };
+  Int_t histoRawsScaledIndex[] = {
+    kTriggerErrorSummaryNorm,
+    kTriggerCalibSummaryNorm,
+    kTriggerReadOutErrorsNorm,
+    kTriggerGlobalOutputNorm
+  };
   const Int_t kNrawsHistos = sizeof(histoRawsIndex)/sizeof(histoRawsIndex[0]);
   Float_t scaleFactor[kNrawsHistos] = {100., 100., 100., 1.};
   for(Int_t ihisto=0; ihisto<kNrawsHistos; ihisto++){
-    TH1* currHisto = GetRawsData(histoRawsIndex[ihisto]);
-    if ( currHisto && nbevent > 0 ){
-      currHisto->Scale(scaleFactor[ihisto]/nbevent);
+    TH1* inputHisto = GetRawsData(histoRawsIndex[ihisto]);
+    TH1* scaledHisto = GetRawsData(histoRawsScaledIndex[ihisto]);
+    if ( scaledHisto && inputHisto &&  nbevent > 0 ) {
+      scaledHisto->Reset();
+      scaledHisto->Add(inputHisto);
+      scaledHisto->Scale(scaleFactor[ihisto]/nbevent);
     }
-  }
+  } // loop on histos
+
+  TH1* hYCopy = GetRawsData(kTriggerErrorLocalYCopy); //number of YCopy error per board
+  TH1* hYCopyTests = GetRawsData(kTriggerErrorLocalYCopyTest); //contains the number of YCopy test per board
+  TH1* hYCopyNorm = GetRawsData(kTriggerErrorLocalYCopyNorm); 
+  hYCopyNorm->Reset();
+  hYCopyNorm->Divide(hYCopy, hYCopyTests, 100., 1.);
+     
+  Float_t mean = hYCopyNorm->Integral();
+      
+  TH1* hSummary = GetRawsData(kTriggerErrorSummary);
+  hSummary->SetBinContent(kAlgoLocalYCopy+1,mean/192.); //put the mean of the % of YCopy error in the kTriggerError's corresponding bin
 }
 
 //____________________________________________________________________________ 
@@ -140,6 +163,11 @@ void AliMUONTriggerQADataMakerRec::InitRaws()
 
   TString histoName, histoTitle;
   if ( GetRecoParam()->GetEventSpecie() == AliRecoParam::kCalib ) {
+    histo1D = new TH1F("hTriggerScalersTime", "Acquisition time from trigger scalers", 1, 0.5, 1.5);
+    histo1D->GetXaxis()->SetBinLabel(1, "One-bin histogram: bin is filled at each scaler event.");
+    histo1D->GetYaxis()->SetTitle("Cumulated scaler time (s)");
+    Add2RawsList(histo1D, kTriggerScalersTime, expert, !image, !saveCorr);
+
     for(Int_t iCath=0; iCath<AliMpConstants::NofCathodes(); iCath++){
       TString cathName = ( iCath==0 ) ? "BendPlane" : "NonBendPlane";
       for(Int_t iChamber=0; iChamber<AliMpConstants::NofTriggerChambers(); iChamber++){
@@ -165,33 +193,25 @@ void AliMUONTriggerQADataMakerRec::InitRaws()
        histo2D->SetOption("COLZ");
        Add2RawsList(histo2D, kTriggerScalersDisplay + AliMpConstants::NofTriggerChambers()*iCath + iChamber, expert, !image, !saveCorr);
       } // loop on chambers
-    } // loop on cathodes
-    
-    histo1D = new TH1F("hTriggerScalersTime", "Acquisition time from trigger scalers", 1, 0.5, 1.5);
-    histo1D->GetXaxis()->SetBinLabel(1, "One-bin histogram: bin is filled at each scaler event.");
-    histo1D->GetYaxis()->SetTitle("Cumulated scaler time (s)");
-    Add2RawsList(histo1D, kTriggerScalersTime, expert, !image, !saveCorr);
+    } // loop on cathodes    
 
     TString axisLabel[kNtrigCalibSummaryBins] = {"#splitline{Dead}{Channels}", "#splitline{Dead}{Local Boards}", "#splitline{Dead}{Regional Boards}", "#splitline{Dead}{Global Board}", "#splitline{Noisy}{Strips}"};
 
-    histo1D = new TH1F("hTriggerCalibSummary", "MTR calibration sumamry", kNtrigCalibSummaryBins, -0.5, (Float_t)kNtrigCalibSummaryBins - 0.5);
+    TH1F* histoCalib = new TH1F("hTriggerCalibSummaryAll", "MTR calibration summary counts", kNtrigCalibSummaryBins, -0.5, (Float_t)kNtrigCalibSummaryBins - 0.5);
     for (Int_t ibin=1; ibin<=kNtrigCalibSummaryBins; ibin++){
-      histo1D->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data());
+      histoCalib->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data());
     }
-    histo1D->GetYaxis()->SetTitle("Percentage per event (%)");
-    histo1D->SetOption("bar2");
-    histo1D->SetStats(kFALSE);
-    histo1D->SetFillColor(kRed);
-    Add2RawsList(histo1D, kTriggerCalibSummary, !expert, image, !saveCorr);
+    histoCalib->SetFillColor(kBlue);
+    histoCalib->GetYaxis()->SetTitle("Counts");
+    // Copy of previous histo for scaling purposes
+    TH1F* histoCalibNorm = (TH1F*)histoCalib->Clone("hTriggerCalibSummary");
+    histoCalibNorm->SetTitle("MTR calibration summary");
+    histoCalibNorm->SetOption("bar2");
+    histoCalibNorm->GetYaxis()->SetTitle("Percentage per event (%)");
+    // Adding both histos after cloning to avoid problems with the expert bit
+    Add2RawsList(histoCalib,     kTriggerCalibSummary,      expert, !image, !saveCorr);
+    Add2RawsList(histoCalibNorm, kTriggerCalibSummaryNorm, !expert,  image, !saveCorr);
   } // Calibration reco param
-
-  histo1D = new TH1F("hTriggeredBoards", "Triggered boards", nbLocalBoard, 0.5, (Float_t)nbLocalBoard + 0.5);
-  Add2RawsList(histo1D, kTriggeredBoards, expert, !image, !saveCorr);
-
-  histo2D = (TH2F*)triggerDisplay.GetEmptyDisplayHisto("hFiredBoardsDisplay", AliMUONTriggerDisplay::kDisplayBoards,
-                                                      0, 0, "Local board triggers / event");
-  histo2D->SetOption("COLZ");
-  Add2RawsList(histo2D, kTriggerBoardsDisplay, expert, !image, !saveCorr);
        
   Char_t *globalXaxisName[6] = {"US HPt", "US LPt", "LS HPt", "LS LPt", "SGL HPt", "SGL LPt"};
   Char_t *allLevelXaxisName[kNtrigAlgoErrorBins] = {"Local algo X", "Local algo Y", "Local LUT","Local Y Copy" , "Local2Regional", "Regional", "Regional2Global", "GlobalFromInGlobal", "GlobalFromInLocal", "GlobalFromOutLocal"};
@@ -199,116 +219,153 @@ void AliMUONTriggerQADataMakerRec::InitRaws()
 
   TString errorAxisTitle = "Number of errors";
 
-  TH1F* h11 = new TH1F("ErrorLocalXPos", "ErrorLocalXPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h11->GetXaxis()->SetTitle(boardName.Data());
-  h11->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h11, kTriggerErrorLocalXPos, expert, !image, !saveCorr);
-
-  TH1F* h12 = new TH1F("ErrorLocalYPos", "ErrorLocalYPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h12->GetXaxis()->SetTitle(boardName.Data());
-  h12->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h12, kTriggerErrorLocalYPos, expert, !image, !saveCorr);
-
-  TH1F* h13 = new TH1F("ErrorLocalDev", "ErrorLocalDev",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h13->GetXaxis()->SetTitle(boardName.Data());
-  h13->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h13, kTriggerErrorLocalDev, expert, !image, !saveCorr);
-
-  TH1F* h14 = new TH1F("ErrorLocalTriggerDec", "ErrorLocalTriggerDec",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h14->GetXaxis()->SetTitle(boardName.Data());
-  h14->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h14, kTriggerErrorLocalTriggerDec, expert, !image, !saveCorr);
-
-  TH1F* h15 = new TH1F("ErrorLocalLPtLSB", "ErrorLocalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h15->GetXaxis()->SetTitle(boardName.Data());
-  h15->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h15, kTriggerErrorLocalLPtLSB, expert, !image, !saveCorr);
-
-  TH1F* h16 = new TH1F("ErrorLocalLPtMSB", "ErrorLocalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h16->GetXaxis()->SetTitle(boardName.Data());
-  h16->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h16, kTriggerErrorLocalLPtMSB, expert, !image, !saveCorr);
-
-  TH1F* h17 = new TH1F("ErrorLocalHPtLSB", "ErrorLocalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h17->GetXaxis()->SetTitle(boardName.Data());
-  h17->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h17, kTriggerErrorLocalHPtLSB, expert, !image, !saveCorr);
-
-  TH1F* h18 = new TH1F("ErrorLocalHPtMSB", "ErrorLocalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h18->GetXaxis()->SetTitle(boardName.Data());
-  h18->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h18, kTriggerErrorLocalHPtMSB, expert, !image, !saveCorr);
-
-  TH1F* h19 = new TH1F("ErrorLocal2RegionalLPtLSB", "ErrorLocal2RegionalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h19->GetXaxis()->SetTitle(boardName.Data());
-  h19->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h19, kTriggerErrorLocal2RegionalLPtLSB, expert, !image, !saveCorr);
-
-  TH1F* h20 = new TH1F("ErrorLocal2RegionalLPtMSB", "ErrorLocal2RegionalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h20->GetXaxis()->SetTitle(boardName.Data());
-  h20->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h20, kTriggerErrorLocal2RegionalLPtMSB, expert, !image, !saveCorr);
-
-  TH1F* h21 = new TH1F("ErrorLocal2RegionalHPtLSB", "ErrorLocal2RegionalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h21->GetXaxis()->SetTitle(boardName.Data());
-  h21->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h21, kTriggerErrorLocal2RegionalHPtLSB, expert, !image, !saveCorr);
-
-  TH1F* h22 = new TH1F("ErrorLocal2RegionalHPtMSB", "ErrorLocal2RegionalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h22->GetXaxis()->SetTitle(boardName.Data());
-  h22->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h22, kTriggerErrorLocal2RegionalHPtMSB, expert, !image, !saveCorr);
-
-  TH1F* h23 = new TH1F("ErrorOutGlobalFromInGlobal", "ErrorOutGlobalFromInGlobal",6,-0.5,6-0.5);
-  h23->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  histo1D = new TH1F("ErrorLocalXPos", "ErrorLocalXPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalXPos, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalYPos", "ErrorLocalYPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalYPos, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalDev", "ErrorLocalDev",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalDev, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalTriggerDec", "ErrorLocalTriggerDec",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalTriggerDec, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalLPtLSB", "ErrorLocalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalLPtLSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalLPtMSB", "ErrorLocalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalLPtMSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalHPtLSB", "ErrorLocalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalHPtLSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalHPtMSB", "ErrorLocalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalHPtMSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocalTrigY", "ErrorLocalTrigY",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocalTrigY, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocal2RegionalLPtLSB", "ErrorLocal2RegionalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocal2RegionalLPtLSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocal2RegionalLPtMSB", "ErrorLocal2RegionalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocal2RegionalLPtMSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocal2RegionalHPtLSB", "ErrorLocal2RegionalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocal2RegionalHPtLSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorLocal2RegionalHPtMSB", "ErrorLocal2RegionalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histo1D->GetXaxis()->SetTitle(boardName.Data());
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  Add2RawsList(histo1D, kTriggerErrorLocal2RegionalHPtMSB, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("ErrorOutGlobalFromInGlobal", "ErrorOutGlobalFromInGlobal",6,-0.5,6-0.5);
+  histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data());
   for (int ibin=0;ibin<6;ibin++){
-    h23->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]);
+    histo1D->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]);
   }
-  Add2RawsList(h23, kTriggerErrorOutGlobalFromInGlobal, expert, !image, !saveCorr);
+  Add2RawsList(histo1D, kTriggerErrorOutGlobalFromInGlobal, expert, !image, !saveCorr);
 
-  TH1F* h24 = new TH1F("hTriggerAlgoErrors", "Trigger Algorithm errors",kNtrigAlgoErrorBins,-0.5,(Float_t)kNtrigAlgoErrorBins-0.5);
-  h24->GetYaxis()->SetTitle("% of error");
-  h24->SetOption("bar2");
+  TH1F* histoAlgoErr = new TH1F("hTriggerAlgoNumOfErrors", "Trigger Algorithm total errors",kNtrigAlgoErrorBins,-0.5,(Float_t)kNtrigAlgoErrorBins-0.5);
+  histoAlgoErr->GetYaxis()->SetTitle("Number of events with errors");
   for (int ibin=0;ibin<kNtrigAlgoErrorBins;ibin++){
-    h24->GetXaxis()->SetBinLabel(ibin+1,allLevelXaxisName[ibin]);
+    histoAlgoErr->GetXaxis()->SetBinLabel(ibin+1,allLevelXaxisName[ibin]);
   }
-  h24->SetFillColor(2);
-  Add2RawsList(h24, kTriggerError, !expert, image, !saveCorr);
-
-  TH1F* h25 = new TH1F("ErrorLocalTrigY", "ErrorLocalTrigY",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h25->GetXaxis()->SetTitle(boardName.Data());
-  h25->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h25, kTriggerErrorLocalTrigY, expert, !image, !saveCorr);
-
-  TH1F* h26 = new TH1F("ErrorLocalYCopy", "ErrorLocalYCopy",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
-  h26->GetXaxis()->SetTitle(boardName.Data());
-  h26->GetYaxis()->SetTitle(errorAxisTitle.Data());
-  Add2RawsList(h26, kTriggerErrorLocalYCopy, expert, !image, !saveCorr);
-       
-  TH1F* h27 = new TH1F("hRawNAnalyzedEvents", "Number of analyzed events per specie", 1, 0.5, 1.5);
-  Int_t esindex = AliRecoParam::AConvert(CurrentEventSpecie());
-  h27->GetXaxis()->SetBinLabel(1, AliRecoParam::GetEventSpecieName(esindex));
-  h27->GetYaxis()->SetTitle("Number of analyzed events");
-  Add2RawsList(h27, kRawNAnalyzedEvents, expert, !image, !saveCorr);
+  histoAlgoErr->SetFillColor(kBlue);
+  // Copy of previous histo for scaling purposes
+  TH1F* histoAlgoErrNorm = (TH1F*)histoAlgoErr->Clone("hTriggerAlgoErrors");
+  histoAlgoErrNorm->SetOption("bar2");
+  histoAlgoErrNorm->SetTitle("Trigger algorithm errors");
+  histoAlgoErrNorm->GetYaxis()->SetTitle("% of events with errors");
+  // Adding both histos after cloning to avoid problems with the expert bit
+  Add2RawsList(histoAlgoErr,     kTriggerErrorSummary,      expert, !image, !saveCorr);
+  Add2RawsList(histoAlgoErrNorm, kTriggerErrorSummaryNorm, !expert,  image, !saveCorr);  
 
-  TH1F* h28 = new TH1F("hTriggerReadoutErrors","Trigger Read-Out errors", kNtrigStructErrorBins, -0.5, (Float_t)kNtrigStructErrorBins-0.5);
-  h28->SetOption("bar2");
-  h28->GetYaxis()->SetTitle("% of errors");
+  histo1D = new TH1F("hTriggeredBoards", "Triggered boards", nbLocalBoard, 0.5, (Float_t)nbLocalBoard + 0.5);
+  Add2RawsList(histo1D, kTriggeredBoards, expert, !image, !saveCorr);
+
+  histo2D = (TH2F*)triggerDisplay.GetEmptyDisplayHisto("hFiredBoardsDisplay", AliMUONTriggerDisplay::kDisplayBoards,
+                                                      0, 0, "Local board triggers / event");
+  histo2D->SetOption("COLZ");
+  Add2RawsList(histo2D, kTriggerBoardsDisplay, expert, !image, !saveCorr);
+
+  TH1F* histoYCopyErr = new TH1F("ErrorLocalYCopy", "Number of YCopy errors",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5);
+  histoYCopyErr->GetXaxis()->SetTitle(boardName.Data());
+  histoYCopyErr->GetYaxis()->SetTitle(errorAxisTitle.Data());
+  // Copy of previous histo for scaling purposes
+  TH1F* histoYCopyErrTest = (TH1F*)histoYCopyErr->Clone("ErrorLocalYCopyTest");
+  histoYCopyErrTest->SetTitle("Number of YCopy tested");
+  // Copy of previous histo for scaling purposes
+  TH1F* histoYCopyErrNorm = (TH1F*)histoYCopyErr->Clone("ErrorLocalYCopyNorm");
+  histoYCopyErrNorm->SetTitle("% of YCopy errors");
+  // Adding both histos after cloning to avoid problems with the expert bit
+  Add2RawsList(histoYCopyErr,     kTriggerErrorLocalYCopy,     expert, !image, !saveCorr);
+  Add2RawsList(histoYCopyErrTest, kTriggerErrorLocalYCopyTest, expert, !image, !saveCorr);
+  Add2RawsList(histoYCopyErrNorm, kTriggerErrorLocalYCopyNorm, expert, !image, !saveCorr);
+
+  TH1F* histoROerr = new TH1F("hTriggerReadoutNumOfErrors","Trigger Read-Out total errors", kNtrigStructErrorBins, -0.5, (Float_t)kNtrigStructErrorBins-0.5);
+  histoROerr->GetYaxis()->SetTitle("Fraction of errors");
+  histoROerr->SetFillColor(kBlue);
   for (int ibin=0;ibin<kNtrigStructErrorBins;ibin++){
-    h28->GetXaxis()->SetBinLabel(ibin+1,readoutErrNames[ibin]);
+    histoROerr->GetXaxis()->SetBinLabel(ibin+1,readoutErrNames[ibin]);
   }
-  h28->SetFillColor(2);
-  Add2RawsList(h28, kTriggerReadOutErrors, !expert, image, !saveCorr);
-
-  TH1F* h29 = new TH1F("hTriggerGlobalOutMultiplicity","Trigger global outputs multiplicity", 6, -0.5, 6.-0.5);
-  h29->SetOption("bar2");
-  h29->GetYaxis()->SetTitle("Number of triggers per event"); 
-  h29->GetXaxis()->SetTitle("Global output");
+  // Copy of previous histo for scaling purposes
+  TH1F* histoROerrNorm = (TH1F*)histoROerr->Clone("hTriggerReadoutErrors");
+  histoROerrNorm->SetTitle("Trigger Read-Out errors");
+  histoROerrNorm->SetOption("bar2");
+  histoROerrNorm->GetYaxis()->SetTitle("% of errors per event");
+  // Adding both histos after cloning to avoid problems with the expert bit
+  Add2RawsList(histoROerr,     kTriggerReadOutErrors,      expert, !image, !saveCorr);
+  Add2RawsList(histoROerrNorm, kTriggerReadOutErrorsNorm, !expert,  image, !saveCorr);
+
+  TH1F* histoGlobalMult = new TH1F("hTriggerGlobalOutMultiplicity","Trigger global outputs multiplicity", 6, -0.5, 6.-0.5);
+  histoGlobalMult->GetYaxis()->SetTitle("Number of triggers"); 
+  histoGlobalMult->GetXaxis()->SetTitle("Global output");
   for (int ibin=0;ibin<6;ibin++){
-    h29->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]);
+    histoGlobalMult->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]);
   }        
-  h29->SetFillColor(3);
-  Add2RawsList(h29, kTriggerGlobalOutput, expert, !image, !saveCorr);
+  histoGlobalMult->SetFillColor(kBlue);
+  // Copy of previous histo for scaling purposes
+  TH1F* histoGlobalMultNorm = (TH1F*)histoGlobalMult->Clone("hTriggerGlobalOutMultiplicityPerEvt");
+  histoGlobalMultNorm->SetTitle("Trigger global outputs multiplicity per event");
+  histoGlobalMultNorm->SetOption("bar2");
+  histoGlobalMultNorm->SetBarWidth(0.5);
+  histoGlobalMultNorm->SetBarOffset(0.25);
+  histoGlobalMultNorm->GetYaxis()->SetTitle("Triggers per event");
+  // Adding both histos after cloning to avoid problems with the expert bit
+  Add2RawsList(histoGlobalMult,     kTriggerGlobalOutput,     expert, !image, !saveCorr);
+  Add2RawsList(histoGlobalMultNorm, kTriggerGlobalOutputNorm, expert, !image, !saveCorr);
+
+  histo1D = new TH1F("hRawNAnalyzedEvents", "Number of analyzed events per specie", 1, 0.5, 1.5);
+  Int_t esindex = AliRecoParam::AConvert(CurrentEventSpecie());
+  histo1D->GetXaxis()->SetBinLabel(1, AliRecoParam::GetEventSpecieName(esindex));
+  histo1D->GetYaxis()->SetTitle("Number of analyzed events");
+  Add2RawsList(histo1D, kRawNAnalyzedEvents, expert, !image, !saveCorr);
 }
 
 //__________________________________________________________________
@@ -359,72 +416,25 @@ void AliMUONTriggerQADataMakerRec::InitESDs()
 void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
 {
        /// make QA for rawdata trigger
+
+    AliCodeTimerAuto("",0);
        
     GetRawsData(kRawNAnalyzedEvents)->Fill(1.);
 
     // Init Local/Regional/Global decision with fake values
-    Int_t globaltemp[4];
-    for (Int_t bit=0; bit<4; bit++){
-       globaltemp[bit]=0;
-       fgitmp[bit]=0;
-    }
-
-    for (Int_t loc=0;loc<235;loc++){
-       fTriggerErrorLocalYCopy[loc]=kFALSE;
-
-       fTriggerOutputLocalRecTriggerDec[loc]=0;
-       fTriggerOutputLocalRecLPtDec[0][loc]=0;
-       fTriggerOutputLocalRecLPtDec[1][loc]=0;
-       fTriggerOutputLocalRecHPtDec[0][loc]=0;
-       fTriggerOutputLocalRecHPtDec[1][loc]=0;
-       fTriggerOutputLocalRecXPos[loc]=0;
-       fTriggerOutputLocalRecYPos[loc]=15;
-       fTriggerOutputLocalRecDev[loc]=0;
-       fTriggerOutputLocalRecTrigY[loc]=1;
-
-       fTriggerOutputLocalDataTriggerDec[loc]=0;
-       fTriggerOutputLocalDataLPtDec[0][loc]=0;
-       fTriggerOutputLocalDataLPtDec[1][loc]=0;
-       fTriggerOutputLocalDataHPtDec[0][loc]=0;
-       fTriggerOutputLocalDataHPtDec[1][loc]=0;
-       fTriggerOutputLocalDataXPos[loc]=0;
-       fTriggerOutputLocalDataYPos[loc]=15;
-       fTriggerOutputLocalDataDev[loc]=0;
-       fTriggerOutputLocalDataTrigY[loc]=1;
-       fTriggerInputRegionalDataLPt[0][loc]=0;
-       fTriggerInputRegionalDataLPt[1][loc]=0;
-       fTriggerInputRegionalDataHPt[0][loc]=0;
-       fTriggerInputRegionalDataHPt[1][loc]=0; 
-    }
 
-    for (Int_t reg=0;reg<16;reg++){
-       fTriggerOutputRegionalData[reg]=0;
-       for (Int_t bit=0;bit<4;bit++){
-           fTriggerInputGlobalDataLPt[reg][bit]=0;
-           fTriggerInputGlobalDataHPt[reg][bit]=0;
-       }
-    }
-
-    for (Int_t bit=0;bit<6;bit++){
-       fgotmp[bit]=0;
-       fTriggerOutputGlobalData[bit]=0;
-       fTriggerOutputGlobalRecFromGlobalInput[bit]=0;
+    UInt_t globalInput[4];
+    for (Int_t bit=0; bit<4; bit++){
+       globalInput[bit]=0;
     }
 
-    for (Int_t loc=0;loc<243;loc++){
-       for (Int_t bit=0;bit<16;bit++){
-           fTriggerPatternX1[loc][bit]=0;
-           fTriggerPatternX2[loc][bit]=0;
-           fTriggerPatternX3[loc][bit]=0;
-           fTriggerPatternX4[loc][bit]=0;
-
-           fTriggerPatternY1[loc][bit]=0;
-           fTriggerPatternY2[loc][bit]=0;
-           fTriggerPatternY3[loc][bit]=0;
-           fTriggerPatternY4[loc][bit]=0;
-       }
-    }
+    //for (Int_t reg=0;reg<16;reg++){
+    //fTriggerOutputRegionalData[reg]=0;
+    //for (Int_t bit=0;bit<4;bit++){
+    //fTriggerInputGlobalDataLPt[reg][bit]=0;
+    //fTriggerInputGlobalDataHPt[reg][bit]=0;
+    //}
+    //}
 
     AliMUONDigitStoreV2R digitStore;
     digitStore.Create();
@@ -439,10 +449,15 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
       xyPatternAll[icath].Reset(1);
     }
     
-    AliMUONTriggerStoreV1 triggerStore;
-    triggerStore.Create();
-    triggerStore.Clear();
+    AliMUONTriggerStoreV1 recoTriggerStore;
+    recoTriggerStore.Create();
+    recoTriggerStore.Clear();
 
+    AliMUONTriggerStoreV1 inputTriggerStore;
+    inputTriggerStore.Create();
+    inputTriggerStore.Clear();
+
+    AliMUONGlobalTrigger inputGlobalTrigger;
 
     UShort_t maxNcounts = 0xFFFF;
     
@@ -484,22 +499,29 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
        }
 
        //Get Global datas
-       for (Int_t bit=1; bit<7; bit++){
-         fTriggerOutputGlobalData[bit-1]=Int_t(((darcHeader->GetGlobalOutput())>>bit)&1);
-         if ( fillScalerHistos && !fTriggerOutputGlobalData[bit-1] )
-           nDeadGlobal++;
-       }
-       for (Int_t Bit=0; Bit<32; Bit++){
-         fTriggerInputGlobalDataLPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(0)>>Bit)&1);
-         fTriggerInputGlobalDataLPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(1)>>Bit)&1);
-         fTriggerInputGlobalDataHPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(2)>>Bit)&1);
-         fTriggerInputGlobalDataHPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(3)>>Bit)&1);
+       inputGlobalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput());
+       Bool_t resp[6] = {inputGlobalTrigger.PairUnlikeHpt(), inputGlobalTrigger.PairUnlikeLpt(),
+                         inputGlobalTrigger.PairLikeHpt(), inputGlobalTrigger.PairLikeLpt(),
+                         inputGlobalTrigger.SingleHpt(), inputGlobalTrigger.SingleHpt()}; 
+       for (Int_t bit=0; bit<6; bit++){
+         if ( ! resp[bit] ){
+           if ( fillScalerHistos )
+             nDeadGlobal++;
+         }
+         else
+           ((TH1F*)GetRawsData(kTriggerGlobalOutput))->Fill(bit);
        }
 
-       globaltemp[0]=darcHeader->GetGlobalInput(0);
-       globaltemp[1]=darcHeader->GetGlobalInput(1);
-       globaltemp[2]=darcHeader->GetGlobalInput(2);
-       globaltemp[3]=darcHeader->GetGlobalInput(3);
+       //for (Int_t Bit=0; Bit<32; Bit++){
+       //fTriggerInputGlobalDataLPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(0)>>Bit)&1);
+       //fTriggerInputGlobalDataLPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(1)>>Bit)&1);
+       //fTriggerInputGlobalDataHPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(2)>>Bit)&1);
+       //fTriggerInputGlobalDataHPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(3)>>Bit)&1);
+       //}
+
+       for (Int_t i=0; i<4; i++){
+         globalInput[i]=darcHeader->GetGlobalInput(i);
+       }
       }
 
       Int_t nReg = rawStreamTrig.GetRegionalHeaderCount();
@@ -507,17 +529,17 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
       for(Int_t iReg = 0; iReg < nReg ;iReg++)
       {   //reg loop
 
-         Int_t regId=rawStreamTrig.GetDDL()*8+iReg;
+       //Int_t regId=rawStreamTrig.GetDDL()*8+iReg;
 
        // crate info  
          AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->GetTriggerCrate(rawStreamTrig.GetDDL(), iReg);
 
          regHeader =  rawStreamTrig.GetRegionalHeader(iReg);
 
-       //Get regional outputs -> not checked, hardware read-out doesn't work
-       fTriggerOutputRegionalData[regId]=Int_t(regHeader->GetOutput());
-       // if ( ! fTriggerOutputRegionalData[regId] )
-       // nDeadRegional++;
+         //Get regional outputs -> not checked, hardware read-out doesn't work
+         //fTriggerOutputRegionalData[regId]=Int_t(regHeader->GetOutput());
+         // if ( ! fTriggerOutputRegionalData[regId] )
+         // nDeadRegional++;
        Int_t nBoardsInReg = 0; // Not necessary when regional output will work
 
        // loop over local structures
@@ -544,6 +566,10 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
          if( !localBoard->IsNotified()) 
            continue;
 
+         AliMUONLocalTrigger inputLocalTrigger;
+         inputLocalTrigger.SetLocalStruct(loCircuit, *localStruct);
+         inputTriggerStore.Add(inputLocalTrigger);
+
          countNotifiedBoards++;  
 
          TArrayS xyPattern[2];   
@@ -553,77 +579,45 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
          if ( fillScalerHistos ) // Compute total number of strips
            fDigitMaker->TriggerDigits(loCircuit, xyPatternAll, digitStoreAll);
 
-         Int_t cathode = localStruct->GetComptXY()%2;
-
          //Get electronic Decisions from data
 
          //Get regional inputs -> not checked, hardware read-out doesn't work
-         fTriggerInputRegionalDataLPt[0][loCircuit]=Int_t(((regHeader->GetInput(0))>>(2*iLocal))&1);
-         fTriggerInputRegionalDataLPt[1][loCircuit]=Int_t(((regHeader->GetInput(1))>>((2*iLocal)+1))&1);
+         //fTriggerInputRegionalDataLPt[0][loCircuit]=Int_t(((regHeader->GetInput(0))>>(2*iLocal))&1);
+         //fTriggerInputRegionalDataLPt[1][loCircuit]=Int_t(((regHeader->GetInput(1))>>((2*iLocal)+1))&1);
 
          //Get local in/outputs
          if (Int_t(localStruct->GetDec())!=0){
-             fTriggerOutputLocalDataTriggerDec[loCircuit]++;
              ((TH1F*)GetRawsData(kTriggeredBoards))->Fill(loCircuit);
          }
          else if ( fillScalerHistos ){
            nDeadLocal++;
          }
-         
-         fTriggerOutputLocalDataLPtDec[0][loCircuit]=((localStruct->GetLpt())&1);
-         fTriggerOutputLocalDataLPtDec[1][loCircuit]=((localStruct->GetLpt()>>1)&1);
-         fTriggerOutputLocalDataHPtDec[0][loCircuit]=((localStruct->GetHpt())&1);
-         fTriggerOutputLocalDataHPtDec[1][loCircuit]=((localStruct->GetHpt()>>1)&1);
-         fTriggerOutputLocalDataXPos[loCircuit]=Int_t(localStruct->GetXPos());
-         fTriggerOutputLocalDataYPos[loCircuit]=Int_t(localStruct->GetYPos());
-         fTriggerOutputLocalDataDev[loCircuit]=Int_t((localStruct->GetXDev())*(pow(-1.0,(localStruct->GetSXDev()))));
-         fTriggerOutputLocalDataTrigY[loCircuit]=Int_t(localStruct->GetTrigY());
-         
-         UShort_t x1  = (Int_t)localStruct->GetX1();
-         UShort_t x2  = (Int_t)localStruct->GetX2();
-         UShort_t x3  = (Int_t)localStruct->GetX3();
-         UShort_t x4  = (Int_t)localStruct->GetX4();
-
-         UShort_t y1  = (Int_t)localStruct->GetY1();
-         UShort_t y2  = (Int_t)localStruct->GetY2();
-         UShort_t y3  = (Int_t)localStruct->GetY3();
-         UShort_t y4  = (Int_t)localStruct->GetY4();
 
          // loop over strips
-         for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) {
-
-             fTriggerPatternX1[loCircuit][ibitxy]=Int_t((x1>>ibitxy)&1);
-             fTriggerPatternX2[loCircuit][ibitxy]=Int_t((x2>>ibitxy)&1);
-             fTriggerPatternX3[loCircuit][ibitxy]=Int_t((x3>>ibitxy)&1);
-             fTriggerPatternX4[loCircuit][ibitxy]=Int_t((x4>>ibitxy)&1);
-             
-             fTriggerPatternY1[loCircuit][ibitxy]=Int_t((y1>>ibitxy)&1);
-             fTriggerPatternY2[loCircuit][ibitxy]=Int_t((y2>>ibitxy)&1);
-             fTriggerPatternY3[loCircuit][ibitxy]=Int_t((y3>>ibitxy)&1);
-             fTriggerPatternY4[loCircuit][ibitxy]=Int_t((y4>>ibitxy)&1);
-             
-             if ( fillScalerHistos ) {
-                 if (ibitxy==0){
-                     AliDebug(AliQAv1::GetQADebugLevel(),"Filling trigger scalers");
-                 }
-
-                 UShort_t scalerVal[4] = {
-                   localStruct->GetXY1(ibitxy),
-                   localStruct->GetXY2(ibitxy),
-                   localStruct->GetXY3(ibitxy),
-                   localStruct->GetXY4(ibitxy)
-                 };
-
-                 for(Int_t ich=0; ich<AliMpConstants::NofTriggerChambers(); ich++){
-                   if ( scalerVal[ich] > 0 )
-                     ((TH2F*)GetRawsData(kTriggerScalers + AliMpConstants::NofTriggerChambers()*cathode + ich))
-                       ->Fill(loCircuit, ibitxy, 2*(Float_t)scalerVal[ich]);
-
-                   if ( scalerVal[ich] >= maxNcounts )
-                     nNoisyStrips++;
-                 } // loop on chamber
-             } // scaler event
-         } // loop on strips
+         if ( fillScalerHistos ) {
+           Int_t cathode = localStruct->GetComptXY()%2;
+           for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) {
+             if (ibitxy==0){
+               AliDebug(AliQAv1::GetQADebugLevel(),"Filling trigger scalers");
+             }
+
+             UShort_t scalerVal[4] = {
+               localStruct->GetXY1(ibitxy),
+               localStruct->GetXY2(ibitxy),
+               localStruct->GetXY3(ibitxy),
+               localStruct->GetXY4(ibitxy)
+             };
+
+             for(Int_t ich=0; ich<AliMpConstants::NofTriggerChambers(); ich++){
+               if ( scalerVal[ich] > 0 )
+                 ((TH2F*)GetRawsData(kTriggerScalers + AliMpConstants::NofTriggerChambers()*cathode + ich))
+                   ->Fill(loCircuit, ibitxy, 2*(Float_t)scalerVal[ich]);
+
+               if ( scalerVal[ich] >= maxNcounts )
+                 nNoisyStrips++;
+             } // loop on chamber
+           } // loop on strips
+         } // scaler event
        } // iLocal
        if ( nBoardsInReg == 0 )
          nDeadRegional++; // Not necessary when regional output will work
@@ -660,95 +654,17 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
       }
     }
 
-  fTriggerProcessor->Digits2Trigger(digitStore,triggerStore);
-
-  TIter next(triggerStore.CreateLocalIterator());
-  AliMUONLocalTrigger *localTrigger;
-
-  while ( ( localTrigger = static_cast<AliMUONLocalTrigger*>(next()) ) )
-  {
-    
-      //... extract information
-      loCircuit = localTrigger->LoCircuit();
-
-      AliMpLocalBoard* localBoardMp = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit);  // get local board objectfor switch value
-      if (localTrigger->GetLoDecision() != 0){
-         fTriggerOutputLocalRecTriggerDec[loCircuit]++;
-      }
-      
-      fTriggerOutputLocalRecLPtDec[0][loCircuit]=Int_t(localTrigger->LoLpt() & 1);
-      fTriggerOutputLocalRecLPtDec[1][loCircuit]=Int_t((localTrigger->LoLpt()>>1) & 1);
-      fTriggerOutputLocalRecHPtDec[0][loCircuit]=Int_t(localTrigger->LoHpt() & 1);
-      fTriggerOutputLocalRecHPtDec[1][loCircuit]=Int_t((localTrigger->LoHpt()>>1) & 1);
-      fTriggerOutputLocalRecXPos[loCircuit]=localTrigger->LoStripX();
-      fTriggerOutputLocalRecYPos[loCircuit]=localTrigger->LoStripY();
-      fTriggerOutputLocalRecTrigY[loCircuit]=localTrigger->LoTrigY();
-      fTriggerOutputLocalRecDev[loCircuit]=Int_t(localTrigger->LoDev()*(pow(-1.,localTrigger->LoSdev())));
-
-      Bool_t firstFillYCopy=kTRUE;
-
-      for (int bit=0; bit<16; bit++){
-         if (fTriggerPatternY1[loCircuit][bit]!=((localTrigger->GetY1Pattern()>>bit) & 1))
-         {
-             fTriggerErrorLocalYCopy[loCircuit]=kTRUE;
-             if (firstFillYCopy){
-                 ((TH1F*)GetRawsData(kTriggerErrorLocalYCopy))->Fill(loCircuit);
-                 ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalYCopy, 1./192.);
-                 firstFillYCopy=kFALSE;
-             }
-         }
-         if (fTriggerPatternY2[loCircuit][bit]!=((localTrigger->GetY2Pattern()>>bit) & 1))
-         {
-             fTriggerErrorLocalYCopy[loCircuit]=kTRUE;
-             if (firstFillYCopy){
-                 ((TH1F*)GetRawsData(kTriggerErrorLocalYCopy))->Fill(loCircuit);
-                 ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalYCopy, 1./192.);
-                 firstFillYCopy=kFALSE;
-             }
-         }
-         if (fTriggerPatternY3[loCircuit][bit]!=((localTrigger->GetY3Pattern()>>bit) & 1))
-         {
-             fTriggerErrorLocalYCopy[loCircuit]=kTRUE;
-             if (localBoardMp->GetSwitch(4)) fTriggerErrorLocalYCopy[loCircuit-1]=kTRUE;
-             if (localBoardMp->GetSwitch(3)) fTriggerErrorLocalYCopy[loCircuit+1]=kTRUE;
-             if (firstFillYCopy){
-                 ((TH1F*)GetRawsData(kTriggerErrorLocalYCopy))->Fill(loCircuit);
-                 ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalYCopy, 1./192.);
-                 firstFillYCopy=kFALSE;
-             }
-         }
-         if (fTriggerPatternY4[loCircuit][bit]!=((localTrigger->GetY4Pattern()>>bit) & 1))
-         {
-             fTriggerErrorLocalYCopy[loCircuit]=kTRUE;
-             if (localBoardMp->GetSwitch(4)) fTriggerErrorLocalYCopy[loCircuit-1]=kTRUE;
-             if (localBoardMp->GetSwitch(3)) fTriggerErrorLocalYCopy[loCircuit+1]=kTRUE;
-             if (firstFillYCopy){
-                 ((TH1F*)GetRawsData(kTriggerErrorLocalYCopy))->Fill(loCircuit);
-                 ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalYCopy, 1./192.);
-                 firstFillYCopy=kFALSE;
-             }
-         }
-      }
-  }
+  fTriggerProcessor->Digits2Trigger(digitStore,recoTriggerStore);
 
-    //Reconstruct Global decision from Global inputs
-    for (Int_t bit=0; bit<4; bit++){
-       for (Int_t i=0; i<32; i=i+4){
-           fgitmp[bit]+=UInt_t(((globaltemp[bit]>>i)&1)*pow(2.0,i+1));
-           fgitmp[bit]+=UInt_t(((globaltemp[bit]>>(i+1))&1)*pow(2.0,i));
-           fgitmp[bit]+=UInt_t(((globaltemp[bit]>>(i+2))&1)*pow(2.0,i+2));
-           fgitmp[bit]+=UInt_t(((globaltemp[bit]>>(i+3))&1)*pow(2.0,i+3));
-           }
-    }
-    RawTriggerInGlobal2OutGlobal();
-    for (Int_t bit=0; bit<6; bit++){
-       fTriggerOutputGlobalRecFromGlobalInput[bit]=fgotmp[bit];
-    }
+  //Reconstruct Global decision from Global inputs
+  UChar_t recoResp = RawTriggerInGlobal2OutGlobal(globalInput);
+  AliMUONGlobalTrigger recoGlobalTrigger;
+  recoGlobalTrigger.SetFromGlobalResponse(recoResp);
 
-    // Compare data and reconstructed decisions and fill histos
-    RawTriggerMatchOutLocal();
-    RawTriggerMatchOutLocalInRegional(); // Not tested, hardware read-out doesn't work
-    RawTriggerMatchOutGlobalFromInGlobal();
+  // Compare data and reconstructed decisions and fill histos
+  RawTriggerMatchOutLocal(inputTriggerStore, recoTriggerStore);
+  //RawTriggerMatchOutLocalInRegional(); // Not tested, hardware read-out doesn't work
+  RawTriggerMatchOutGlobalFromInGlobal(inputGlobalTrigger, recoGlobalTrigger);
 }
 
 //__________________________________________________________________
@@ -1088,12 +1004,14 @@ AliMUONTriggerQADataMakerRec::GetDCSValues(Int_t iMeas, Int_t detElemId,
 
 
 //____________________________________________________________________________ 
-void AliMUONTriggerQADataMakerRec::RawTriggerInGlobal2OutGlobal()
+UChar_t AliMUONTriggerQADataMakerRec::RawTriggerInGlobal2OutGlobal(UInt_t globalInput[4])
 {
   //
   /// Reconstruct Global Trigger decision using Global Inputs
   //
 
+    AliCodeTimerAuto("",0);
+
     AliMUONGlobalCrateConfig* globalConfig = fCalibrationData->GlobalTriggerCrateConfig();
 
     AliMUONGlobalTriggerBoard globalTriggerBoard;
@@ -1102,108 +1020,134 @@ void AliMUONTriggerQADataMakerRec::RawTriggerInGlobal2OutGlobal()
        globalTriggerBoard.Mask(i,globalConfig->GetGlobalMask(i));
     }
 
-
-    UShort_t regional[16];
-
-    for (Int_t iReg = 0; iReg < 16; iReg++) {
-      regional[iReg] = 0;
-      if (iReg < 8) {    // right
-       // Lpt
-       regional[iReg] |=  (fgitmp[0] >> (4*iReg))     & 0xF;
-       // Hpt
-       regional[iReg] |= ((fgitmp[2] >> (4*iReg))     & 0xF) << 4;
-      } else {           // left
-       // Lpt
-       regional[iReg] |=  (fgitmp[1] >> (4*(iReg-8))) & 0xF;
-       // Hpt
-       regional[iReg] |= ((fgitmp[3] >> (4*(iReg-8))) & 0xF) << 4;
-      }
-    }
-    globalTriggerBoard.SetRegionalResponse(regional);
+    globalTriggerBoard.RecomputeRegional(globalInput);
     globalTriggerBoard.Response();
+    return globalTriggerBoard.GetResponse();
 
-    for (Int_t bit=1; bit<7; bit++){
-       fgotmp[bit-1]=Int_t((globalTriggerBoard.GetResponse())>>bit&1);
-    }
 }
 
 //____________________________________________________________________________ 
-void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocal()
+void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocal(AliMUONVTriggerStore& inputTriggerStore,
+                                                          AliMUONVTriggerStore& recoTriggerStore)
 {
   //
   /// Match data and reconstructed Local Trigger decision
   //
 
-    Bool_t firstFillXPosDev=kTRUE;
-    Bool_t firstFillYPosTrigY=kTRUE;
-    Bool_t firstFillLUT=kTRUE;
+  AliCodeTimerAuto("",0);
 
-    for (int localId=1;localId<235;localId++){
-       if(fTriggerOutputLocalDataTriggerDec[localId]!=fTriggerOutputLocalRecTriggerDec[localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalTriggerDec))->Fill(localId);
-       }
-       if(fTriggerOutputLocalDataTrigY[localId]!=fTriggerOutputLocalRecTrigY[localId]){
-           if(fTriggerErrorLocalYCopy[localId]) continue;
-           ((TH1F*)GetRawsData(kTriggerErrorLocalTrigY))->Fill(localId);
-            if (firstFillYPosTrigY){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalY);
-                firstFillYPosTrigY=kFALSE;
-            }
-       }
+  Bool_t skipBoard[234];
+  memset(skipBoard,0,AliMUONConstants::NTriggerCircuit()*sizeof(Bool_t));
 
-       if(fTriggerOutputLocalDataYPos[localId]!=fTriggerOutputLocalRecYPos[localId]){
-           if(fTriggerErrorLocalYCopy[localId]) continue;
-           ((TH1F*)GetRawsData(kTriggerErrorLocalYPos))->Fill(localId);
-           if (firstFillYPosTrigY){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalY);
-                firstFillYPosTrigY=kFALSE;
-            }
-       }
-       if(fTriggerOutputLocalDataXPos[localId]!=fTriggerOutputLocalRecXPos[localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalXPos))->Fill(localId);
-            if (firstFillXPosDev){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalX);
-                firstFillXPosDev=kFALSE;
-            }
-       }
-       if(fTriggerOutputLocalDataDev[localId]!=fTriggerOutputLocalRecDev[localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalDev))->Fill(localId);
-            if (firstFillXPosDev){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalX);
-                firstFillXPosDev=kFALSE;
-            }
-       }
-       if(fTriggerOutputLocalDataLPtDec[0][localId]!=fTriggerOutputLocalRecLPtDec[0][localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalLPtLSB))->Fill(localId);
-            if (firstFillLUT){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalLUT);
-                firstFillLUT=kFALSE;
-            }
-       }
-       if(fTriggerOutputLocalDataLPtDec[1][localId]!=fTriggerOutputLocalRecLPtDec[1][localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalLPtMSB))->Fill(localId);
-            if (firstFillLUT){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalLUT);
-                firstFillLUT=kFALSE;
-            }
-       }
-       if(fTriggerOutputLocalDataHPtDec[0][localId]!=fTriggerOutputLocalRecHPtDec[0][localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalHPtLSB))->Fill(localId);
-            if (firstFillLUT){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalLUT);
-                firstFillLUT=kFALSE;
-            }
+  Bool_t errorInYCopy = kFALSE;
+
+  // First search for YCopy errors.
+  Int_t loCircuit = -1;
+  TIter next(recoTriggerStore.CreateLocalIterator());
+  AliMUONLocalTrigger* recoLocalTrigger, *inputLocalTrigger;
+  while ( ( recoLocalTrigger = static_cast<AliMUONLocalTrigger*>(next()) ) )
+  {  
+    loCircuit = recoLocalTrigger->LoCircuit();
+    Int_t iboard = loCircuit - 1;
+
+    ((TH1F*)GetRawsData(kTriggerErrorLocalYCopyTest))->Fill(loCircuit);
+  
+    inputLocalTrigger = inputTriggerStore.FindLocal(loCircuit);
+
+    Int_t recoTrigPattern[4]  = {recoLocalTrigger->GetY1Pattern(), recoLocalTrigger->GetY2Pattern(), recoLocalTrigger->GetY3Pattern(), recoLocalTrigger->GetY4Pattern()};
+    Int_t inputTrigPattern[4] = {inputLocalTrigger->GetY1Pattern(), inputLocalTrigger->GetY2Pattern(), inputLocalTrigger->GetY3Pattern(), inputLocalTrigger->GetY4Pattern()};
+
+    AliMpLocalBoard* localBoardMp = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit); // get local board object for switch value
+
+    Bool_t errorInCopyBoard = kFALSE;
+    for(Int_t ich=0; ich<4; ich++){
+      if ( recoTrigPattern[ich] != inputTrigPattern[ich] ){
+       skipBoard[iboard] = kTRUE;
+       if ( ich >=2 ){
+         if ( localBoardMp->GetSwitch(AliMpLocalBoard::kOR0) )
+           skipBoard[iboard+1] = kTRUE;
+         if ( localBoardMp->GetSwitch(AliMpLocalBoard::kOR1) )
+           skipBoard[iboard-1] = kTRUE;
        }
-       if(fTriggerOutputLocalDataHPtDec[1][localId]!=fTriggerOutputLocalRecHPtDec[1][localId]){
-           ((TH1F*)GetRawsData(kTriggerErrorLocalHPtMSB))->Fill(localId);
-            if (firstFillLUT){
-                ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoLocalLUT);
-                firstFillLUT=kFALSE;
-            }
+       errorInCopyBoard = kTRUE;
+       errorInYCopy = kTRUE;
+      }
+    } // loop on chambers
+    if ( errorInCopyBoard )
+      ((TH1F*)GetRawsData(kTriggerErrorLocalYCopy))->Fill(loCircuit);    
+  } // loop on local boards
+
+  if (errorInYCopy)
+    ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalYCopy);
+  
+  Bool_t errorInXPosDev = kFALSE;
+  Bool_t errorInYPosTrigY = kFALSE;
+  Bool_t errorInLUT = kFALSE;
+
+  next.Reset();
+  while ( ( recoLocalTrigger = static_cast<AliMUONLocalTrigger*>(next()) ) )
+  {  
+    loCircuit = recoLocalTrigger->LoCircuit();
+    Int_t iboard = loCircuit - 1;
+  
+    inputLocalTrigger = inputTriggerStore.FindLocal(loCircuit);
+
+    if ( recoLocalTrigger->LoStripX() != inputLocalTrigger->LoStripX() ) {
+      ((TH1F*)GetRawsData(kTriggerErrorLocalXPos))->Fill(loCircuit);
+      errorInXPosDev = kTRUE;
+    }
+
+    if ( recoLocalTrigger->GetDeviation() != inputLocalTrigger->GetDeviation() ) {
+      ((TH1F*)GetRawsData(kTriggerErrorLocalDev))->Fill(loCircuit);
+      errorInXPosDev = kTRUE;
+    }
+
+    // Skip following checks in case we previously found YCopy errors 
+    if ( skipBoard[iboard] ) continue;
+
+    if ( recoLocalTrigger->GetLoDecision() != inputLocalTrigger->GetLoDecision() ) {
+      ((TH1F*)GetRawsData(kTriggerErrorLocalTriggerDec))->Fill(loCircuit);
+    }
+
+    // Test Hpt and LPT
+    Int_t recoLut[2]  = { recoLocalTrigger->LoLpt(),  recoLocalTrigger->LoHpt() };
+    Int_t inputLut[2] = {inputLocalTrigger->LoLpt(), inputLocalTrigger->LoHpt() };
+    Int_t currIndex[2][2] = {{kTriggerErrorLocalLPtLSB, kTriggerErrorLocalLPtMSB},
+                            {kTriggerErrorLocalHPtMSB, kTriggerErrorLocalHPtMSB}};
+    for (Int_t ilut=0; ilut<2; ilut++){
+      Int_t bitDiff = recoLut[ilut]^inputLut[ilut];
+      if ( bitDiff == 0 ) continue;
+      for (Int_t ibit=0; ibit<2; ibit++){
+       Bool_t isBitDifferent = (bitDiff>>ibit)&1;
+       if ( isBitDifferent ){
+         ((TH1F*)GetRawsData(currIndex[ilut][ibit]))->Fill(loCircuit);
+         errorInLUT = kTRUE;
        }
-    } // loop over Local Boards
-}
+      }
+    }
 
+    if ( recoLocalTrigger->LoStripY() != inputLocalTrigger->LoStripY() ) {
+      ((TH1F*)GetRawsData(kTriggerErrorLocalYPos))->Fill(loCircuit);
+      errorInYPosTrigY = kTRUE;
+    }
+
+    if ( recoLocalTrigger->LoTrigY() != inputLocalTrigger->LoTrigY()  ) {
+      ((TH1F*)GetRawsData(kTriggerErrorLocalTrigY))->Fill(loCircuit);  
+      errorInYPosTrigY = kTRUE;
+    }
+  } // loop on local boards
+
+  if (errorInXPosDev)
+    ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalX);
+
+  if (errorInLUT)
+    ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalLUT);
+
+  if (errorInYPosTrigY)
+    ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalY);
+
+}
+/*
 //____________________________________________________________________________ 
 void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocalInRegional()
 {
@@ -1226,28 +1170,33 @@ void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocalInRegional()
            ((TH1F*)GetRawsData(kTriggerErrorLocal2RegionalHPtMSB))->Fill(localId);
        }
     }
-
 }
+*/
+
 
 //____________________________________________________________________________ 
-void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutGlobalFromInGlobal()
+void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutGlobalFromInGlobal(AliMUONGlobalTrigger& inputGlobalTrigger, 
+                                                                       AliMUONGlobalTrigger& recoGlobalTrigger)
 {
   //
   /// Match data and reconstructed Global Trigger decision for a reconstruction from Global inputs
   //
 
-  Bool_t firstFill=kTRUE;
+  if ( recoGlobalTrigger.GetGlobalResponse() == inputGlobalTrigger.GetGlobalResponse() )
+    return;
+
+  ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoGlobalFromGlobal);
+
+  Bool_t inputResp[6] = {inputGlobalTrigger.PairUnlikeHpt(), inputGlobalTrigger.PairUnlikeLpt(),
+                        inputGlobalTrigger.PairLikeHpt(), inputGlobalTrigger.PairLikeLpt(),
+                        inputGlobalTrigger.SingleHpt(), inputGlobalTrigger.SingleHpt()};
+
+  Bool_t recoResp[6] = {recoGlobalTrigger.PairUnlikeHpt(), recoGlobalTrigger.PairUnlikeLpt(),
+                       recoGlobalTrigger.PairLikeHpt(), recoGlobalTrigger.PairLikeLpt(),
+                       recoGlobalTrigger.SingleHpt(), recoGlobalTrigger.SingleHpt()};
 
   for (int bit=0;bit<6;bit++){
-    if(fTriggerOutputGlobalData[bit]!=0){
-      ((TH1F*)GetRawsData(kTriggerGlobalOutput))->Fill(5-bit);
-    }
-    if(fTriggerOutputGlobalData[bit]!=fTriggerOutputGlobalRecFromGlobalInput[bit]){
-      ((TH1F*)GetRawsData(kTriggerErrorOutGlobalFromInGlobal))->Fill(5-bit);
-      if (firstFill){
-       ((TH1F*)GetRawsData(kTriggerError))->Fill(kAlgoGlobalFromGlobal);
-       firstFill=kFALSE;
-      }
-    }
+    if ( recoResp[bit] != inputResp[bit] )
+      ((TH1F*)GetRawsData(kTriggerErrorOutGlobalFromInGlobal))->Fill(bit);
   }
 }
index 6c1cec9..99c673f 100644 (file)
@@ -21,6 +21,8 @@ class AliMUONVDigitStore;
 class TObjectArray;
 class TMap;
 class AliMpDCSNamer;
+class AliMUONVTriggerStore;
+class AliMUONGlobalTrigger;
 
 class AliMUONTriggerQADataMakerRec: public AliMUONVQADataMakerRec {
 
@@ -48,33 +50,38 @@ public:
 
   /// Raw histograms indices
   
-  enum ERaw { 
-    kTriggerScalers           = 22, ///< Trigger scalers histogram per plane index
-    kTriggerScalersDisplay    = 30, ///< Trigger scalers display histogram per plane index
-    kTriggerScalersTime       = 38, ///< Trigger scalers acquisition time index
-    kTriggerCalibSummary      = 39, ///< Summary of responding strips/boards and noisy strips 
-    kTriggeredBoards          = 40,  ///< Triggered boards histogram index
-    kTriggerBoardsDisplay     = 41, ///< Triggered boards display histogram index
-    kTriggerErrorLocalXPos = 50,  ///< Local board: Number of XPos Error vs Local Board Id
-    kTriggerErrorLocalYPos = 51,  ///< Local board: Number of YPos Error vs Local Board Id
-    kTriggerErrorLocalDev = 52,  ///< Local board: Number of Deviation Error vs Local Board
-    kTriggerErrorLocalTriggerDec = 53,  ///< Local board: Number of Trigger Decision (All Pt) Error vs Local Board Id
-    kTriggerErrorLocalLPtLSB = 54,  ///< Local board: Number of LSB Low Pt Error vs Local Board Id
-    kTriggerErrorLocalLPtMSB = 55,  ///< Local board: Number of MSB Low Pt Error vs Local Board Id
-    kTriggerErrorLocalHPtLSB = 56,  ///< Local board: Number of LSB High Pt Error vs Local Board Id
-    kTriggerErrorLocalHPtMSB = 57,  ///< Local board: Number of MSB High Pt Error vs Local Board Id
-    kTriggerErrorLocal2RegionalLPtLSB = 58,  ///< Local to Regional: Number of LPt LSB error vs Local Board Id
-    kTriggerErrorLocal2RegionalLPtMSB = 59,  ///< Local to Regional: Number of LPt MSB error vs Local Board Id
-    kTriggerErrorLocal2RegionalHPtLSB = 60,  ///< Local to Regional: Number of HPt LSB error vs Local Board Id
-    kTriggerErrorLocal2RegionalHPtMSB = 61,  ///< Local to Regional: Number of HPt MSB error vs Local Board Id
-    kTriggerErrorOutGlobalFromInGlobal = 62,  ///< Global board: Number of error vs output bit 
-    kTriggerError = 63,  ///< percentage of error for each trigger decision level (Local, Reg->Local, Reg, Reg->Glob, Global)
-    kTriggerErrorLocalTrigY = 64,  ///< Local board: Number of TrigY Error vs Local Board Id
-    kTriggerErrorLocalYCopy = 65,  ///< Local board: Number of Y Copy Error vs Local Board Id
-
-    kRawNAnalyzedEvents = 66, ///< Number of analyzed events per event specie
-    kTriggerReadOutErrors = 67, ///< Number of read-out errors
-    kTriggerGlobalOutput = 68 //< Histo including Global outputs and Global algo errors
+  enum ERaw {
+    kTriggerScalersTime       = 22, ///< Trigger scalers acquisition time index
+    kTriggerScalers           = 23, ///< Trigger scalers histogram per plane index
+    kTriggerScalersDisplay    = 31, ///< Trigger scalers display histogram per plane index
+    kTriggerCalibSummary      = 40, ///< Number of responding strips/boards and noisy strips 
+    kTriggerCalibSummaryNorm  = 41, ///< Percentage of responding strips/boards and noisy strips
+    kTriggerErrorLocalXPos = 50, ///< Local board: Number of XPos Error vs Local Board Id
+    kTriggerErrorLocalYPos = 51, ///< Local board: Number of YPos Error vs Local Board Id
+    kTriggerErrorLocalDev  = 52, ///< Local board: Number of Deviation Error vs Local Board
+    kTriggerErrorLocalTriggerDec = 53, ///< Local board: Number of Trigger Decision (All Pt) Error vs Local Board Id
+    kTriggerErrorLocalLPtLSB = 54, ///< Local board: Number of LSB Low Pt Error vs Local Board Id
+    kTriggerErrorLocalLPtMSB = 55, ///< Local board: Number of MSB Low Pt Error vs Local Board Id
+    kTriggerErrorLocalHPtLSB = 56, ///< Local board: Number of LSB High Pt Error vs Local Board Id
+    kTriggerErrorLocalHPtMSB = 57, ///< Local board: Number of MSB High Pt Error vs Local Board Id
+    kTriggerErrorLocalTrigY  = 58, ///< Local board: Number of TrigY Error vs Local Board Id
+    kTriggerErrorLocal2RegionalLPtLSB  = 59, ///< Local to Regional: Number of LPt LSB error vs Local Board Id
+    kTriggerErrorLocal2RegionalLPtMSB  = 60, ///< Local to Regional: Number of LPt MSB error vs Local Board Id
+    kTriggerErrorLocal2RegionalHPtLSB  = 61, ///< Local to Regional: Number of HPt LSB error vs Local Board Id
+    kTriggerErrorLocal2RegionalHPtMSB  = 62, ///< Local to Regional: Number of HPt MSB error vs Local Board Id
+    kTriggerErrorOutGlobalFromInGlobal = 63, ///< Global board: Number of error vs output bit 
+    kTriggerErrorSummary      = 64,  ///< Number of errors for each trigger decision level (Local, Reg->Local, Reg, Reg->Glob, Global)
+    kTriggerErrorSummaryNorm  = 65,  ///< Percentage of errors for each trigger decision level
+    kTriggerErrorLocalYCopy     = 67, ///< Local board: Number of Y Copy Error vs Local Board Id
+    kTriggerErrorLocalYCopyTest = 68, ///< Local Board: Number of Y copy error tests (for normalization)
+    kTriggerErrorLocalYCopyNorm = 69, ///< Local Board: Number of Y Copy Error vs Local Board Id Normalized to the number of tests
+    kTriggeredBoards          = 70,  ///< Triggered boards histogram index
+    kTriggerBoardsDisplay     = 71,  ///< Triggered boards display histogram index
+    kTriggerReadOutErrors     = 80,  ///< Number of read-out errors
+    kTriggerReadOutErrorsNorm = 81,  ///< Percentage of read-out errors
+    kTriggerGlobalOutput      = 90,  ///< Number of Global outputs and Global algo errors
+    kTriggerGlobalOutputNorm  = 91,  ///< Percentage of Global outputs and Global algo errors
+    kRawNAnalyzedEvents       = 100  ///< Number of analyzed events per event specie
   };
          
   /// Rec points histograms indices
@@ -131,53 +138,21 @@ private:
   TObjArray* GetDCSValues(Int_t iMeas, Int_t detElemId,
                          TMap* triggerDcsMap, AliMpDCSNamer& triggerDcsNamer);
   void RawTriggerInRegional2OutRegional();
-  void RawTriggerInGlobal2OutGlobal();
-  void RawTriggerMatchOutLocal();
-  void RawTriggerMatchOutLocalInRegional();
-  void RawTriggerMatchOutGlobalFromInGlobal();
-       
-  Int_t fTriggerOutputLocalDataTriggerDec[235]; ///< Data Local Trigger decision for each active Local Board
-  Int_t fTriggerOutputLocalDataTrigY[235]; ///< Data Local Trigger Y decision for each active Local Board
-  Int_t fTriggerOutputLocalDataLPtDec[2][235]; ///< Data Local decision Low Pt for each active Local Board (2 Bits -> 0:LSB, 1:MSB)
-  Int_t fTriggerOutputLocalDataHPtDec[2][235]; ///< Data Local decision High Pt for each active Local Board (2 Bits -> 0:LSB, 1:MSB)
-  Int_t fTriggerOutputLocalDataXPos[235]; ///< Data Local XPos for each active Local Board
-  Int_t fTriggerOutputLocalDataYPos[235]; ///< Data Local YPos for each active Local Board
-  Int_t fTriggerOutputLocalDataDev[235]; ///< Data Local deviation for each active Local Board
-
-  Int_t fTriggerOutputLocalRecTriggerDec[235]; ///< Reconstructed Local Trigger decision for each active Local Board
-  Int_t fTriggerOutputLocalRecTrigY[235]; ///< Reconstructed Local Trigger Y decision for each active Local Board
-  Int_t fTriggerOutputLocalRecLPtDec[2][235]; ///< Reconstructed Local decision Low Pt for each active Local Board (2 Bits -> 0:LSB, 1:MSB)
-  Int_t fTriggerOutputLocalRecHPtDec[2][235]; ///< Reconstructed Local decision High Pt for each active Local Board (2 Bits -> 0:LSB, 1:MSB)
-  Int_t fTriggerOutputLocalRecXPos[235]; ///< Reconstructed Local XPos for each active Local Board
-  Int_t fTriggerOutputLocalRecYPos[235]; ///< Reconstructed Local YPos for each active Local Board
-  Int_t fTriggerOutputLocalRecDev[235]; ///< Reconstructed Local deviation for each active Local Board
-
-  Int_t fTriggerInputRegionalDataLPt[2][235]; ///< Data Regional Input LPt for each Local board
-  Int_t fTriggerInputRegionalDataHPt[2][235]; ///< Data Regional Input HPt for each Local board
-  Int_t fTriggerOutputRegionalData[16]; ///< Data Regional Trigger decision for each Regional Board (1R:0, 2R:1, ... , 1L:8, ...) -> 4 bits LPt, 4 bits HPt
-  Int_t fTriggerInputRegionalRecLPt[2][16][16]; ///< Reconstructed Regional Input LPt for each Regional Board ([bit][reg][loc]) (reg -> 1R:0, 2R:1, ... , 1L:8, ...)
-  Int_t fTriggerInputRegionalRecHPt[2][16][16]; ///< Reconstructed Regional Input HPt for each Regional Board ([bit][reg][loc]) (reg -> 1R:0, 2R:1, ... , 1L:8, ...)
-  Int_t fTriggerOutputRegionalRec[16]; ///< Reconstructed Regional Trigger decision for each Regional Board (8 Bits)
-
-  Int_t fTriggerInputGlobalDataLPt[16][4]; ///< Data Global inputs LPt (1R:0, 2R:1, ... , 1L:8, ...)
-  Int_t fTriggerInputGlobalDataHPt[16][4]; ///< Data Global inputs HPt (1R:0, 2R:1, ... , 1L:8, ...)
-  Int_t fTriggerOutputGlobalData[6]; ///< Data Global outputs
-  Int_t fTriggerOutputGlobalRecFromGlobalInput[6]; //< Reconstructed Global outputs from Global inputs
-  Int_t fTriggerOutputGlobalRecFromLocalInput[6]; //< Reconstructed Global outputs from Local inputs
-  Int_t fTriggerOutputGlobalRecFromLocalOutput[6]; //< Reconstructed Global outputs from Local outputs
-  Int_t fgitmp[4]; //< Tempory used to store Global inputs
-  Int_t fgotmp[6]; //< Tempory used to store Global outputs
-
-  Int_t fTriggerPatternX1[243][16]; ///< Local pattern X1
-  Int_t fTriggerPatternX2[243][16]; ///< Local pattern X2
-  Int_t fTriggerPatternX3[243][16]; ///< Local pattern X3
-  Int_t fTriggerPatternX4[243][16]; ///< Local pattern X4
-  Int_t fTriggerPatternY1[243][16]; ///< Local pattern Y1
-  Int_t fTriggerPatternY2[243][16]; ///< Local pattern Y2
-  Int_t fTriggerPatternY3[243][16]; ///< Local pattern Y3
-  Int_t fTriggerPatternY4[243][16]; ///< Local pattern Y4
-
-  Bool_t fTriggerErrorLocalYCopy[235]; ///< True if Y copy error for Local Board i
+  UChar_t RawTriggerInGlobal2OutGlobal(UInt_t globalInput[4]);
+  void RawTriggerMatchOutLocal(AliMUONVTriggerStore& inputTriggerStore, AliMUONVTriggerStore& recoTriggerStore);
+  //void RawTriggerMatchOutLocalInRegional();
+  void RawTriggerMatchOutGlobalFromInGlobal(AliMUONGlobalTrigger& inputLocalTrigger,
+                                           AliMUONGlobalTrigger& recoGlobalTrigger);
+
+  //Int_t fTriggerOutputRegionalData[16]; ///< Data Regional Trigger decision for each Regional Board (1R:0, 2R:1, ... , 1L:8, ...) -> 4 bits LPt, 4 bits HPt
+  //Int_t fTriggerInputRegionalRecLPt[2][16][16]; ///< Reconstructed Regional Input LPt for each Regional Board ([bit][reg][loc]) (reg -> 1R:0, 2R:1, ... , 1L:8, ...)
+  //Int_t fTriggerInputRegionalRecHPt[2][16][16]; ///< Reconstructed Regional Input HPt for each Regional Board ([bit][reg][loc]) (reg -> 1R:0, 2R:1, ... , 1L:8, ...)
+  //Int_t fTriggerOutputRegionalRec[16]; ///< Reconstructed Regional Trigger decision for each Regional Board (8 Bits)
+
+  //Int_t fTriggerInputGlobalDataLPt[16][4]; ///< Data Global inputs LPt (1R:0, 2R:1, ... , 1L:8, ...)
+  //Int_t fTriggerInputGlobalDataHPt[16][4]; ///< Data Global inputs HPt (1R:0, 2R:1, ... , 1L:8, ...)
+  //Int_t fTriggerOutputGlobalRecFromLocalInput[6]; //< Reconstructed Global outputs from Local inputs
+  //Int_t fTriggerOutputGlobalRecFromLocalOutput[6]; //< Reconstructed Global outputs from Local outputs
   
   AliMUONDigitMaker* fDigitMaker; //!< pointer to digit maker
   AliMUONCalibrationData* fCalibrationData; //!< Used to load Local, Regional and Global masks