- Bug fix in the trigger scaler decoder
authorlaphecet <laphecet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 8 Feb 2011 13:31:22 +0000 (13:31 +0000)
committerlaphecet <laphecet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 8 Feb 2011 13:31:22 +0000 (13:31 +0000)
- Bug fix in the display of trigger scalers events per local board (in the non-bending plane)
(Diego)

MUON/AliMUONLocalStruct.h
MUON/AliMUONTriggerDDLDecoderEventHandler.h
MUON/AliMUONTriggerDisplay.cxx
MUON/AliMUONTriggerQADataMakerRec.cxx

index ba1b269..84620b5 100644 (file)
@@ -97,22 +97,22 @@ public:
    UChar_t GetComptXY() const {return  fEOS & 1;}
 
             /// Return XY1
-   UShort_t GetXY1(Int_t n) const {return  (n % 2 == 0) ?
+   UShort_t GetXY1(Int_t n) const {return  (n % 2 == 1) ?
        (fScaler[TMath::Nint(Float_t(n/2))] &  0xFFFF) : 
        (fScaler[TMath::Nint(Float_t(n/2))] >> 16) &  0xFFFF;}
 
             /// Return XY2
-   UShort_t GetXY2(Int_t n) const {return  (n % 2 == 0) ?
+   UShort_t GetXY2(Int_t n) const {return  (n % 2 == 1) ?
        (fScaler[8 + TMath::Nint(Float_t(n/2))] &  0xFFFF) : 
        (fScaler[8 + TMath::Nint(Float_t(n/2))] >> 16) &  0xFFFF;}
 
             /// Return XY3
-   UShort_t GetXY3(Int_t n) const {return  (n % 2 == 0) ?
+   UShort_t GetXY3(Int_t n) const {return  (n % 2 == 1) ?
        (fScaler[8*2 + TMath::Nint(Float_t(n/2))] &  0xFFFF) : 
        (fScaler[8*2 + TMath::Nint(Float_t(n/2))] >> 16) &  0xFFFF;}
 
             /// Return XY4
-   UShort_t GetXY4(Int_t n) const {return  (n % 2 == 0) ?
+   UShort_t GetXY4(Int_t n) const {return  (n % 2 == 1) ?
        (fScaler[8*3 + TMath::Nint(Float_t(n/2))] &  0xFFFF) : 
        (fScaler[8*3 + TMath::Nint(Float_t(n/2))] >> 16) &  0xFFFF;}
 
index 9a089a1..55a1090 100644 (file)
@@ -690,7 +690,7 @@ public:
        static UShort_t GetLocalXY1(const AliMUONLocalScalarsStruct* scalars, UInt_t n)
        {
                assert(scalars != NULL and n < 16);
-               return  (n % 2 == 0) ? (scalars->fScaler[(n/2)] & 0xFFFF)
+               return  (n % 2 == 1) ? (scalars->fScaler[(n/2)] & 0xFFFF)
                                     : ((scalars->fScaler[(n/2)] >> 16) &  0xFFFF);
        }
        
@@ -698,7 +698,7 @@ public:
        static UShort_t GetLocalXY2(const AliMUONLocalScalarsStruct* scalars, UInt_t n)
        {
                assert(scalars != NULL and n < 16);
-               return  (n % 2 == 0) ? (scalars->fScaler[8 + (n/2)] & 0xFFFF)
+               return  (n % 2 == 1) ? (scalars->fScaler[8 + (n/2)] & 0xFFFF)
                                     : ((scalars->fScaler[8 + (n/2)] >> 16) &  0xFFFF);
        }
        
@@ -706,7 +706,7 @@ public:
        static UShort_t GetLocalXY3(const AliMUONLocalScalarsStruct* scalars, UInt_t n)
        {
                assert(scalars != NULL and n < 16);
-               return  (n % 2 == 0) ? (scalars->fScaler[8*2 + (n/2)] & 0xFFFF)
+               return  (n % 2 == 1) ? (scalars->fScaler[8*2 + (n/2)] & 0xFFFF)
                                     : ((scalars->fScaler[8*2 + (n/2)] >> 16) &  0xFFFF);
        }
        
@@ -714,7 +714,7 @@ public:
        static UShort_t GetLocalXY4(const AliMUONLocalScalarsStruct* scalars, UInt_t n)
        {
                assert(scalars != NULL and n < 16);
-               return  (n % 2 == 0) ? (scalars->fScaler[8*3 + (n/2)] & 0xFFFF)
+               return  (n % 2 == 1) ? (scalars->fScaler[8*3 + (n/2)] & 0xFFFF)
                                     : ((scalars->fScaler[8*3 + (n/2)] >> 16) &  0xFFFF);
        }
        
index 162fb22..6e2b47e 100644 (file)
@@ -292,6 +292,8 @@ Bool_t AliMUONTriggerDisplay::InitOrDisplayTriggerInfo(TObject* inputObject, TH2
       sign = -1.;
     }
     yOffsetLine = (Float_t)(line - 4) * 2. * yWidthSlat;
+         
+    Int_t nLocations = 1;
 
     for(Int_t cath=0; cath<AliMpConstants::NofCathodes(); cath++){
       // Loop on cathodes: 
@@ -299,13 +301,13 @@ Bool_t AliMUONTriggerDisplay::InitOrDisplayTriggerInfo(TObject* inputObject, TH2
       // board info is read only from cathode 0
 
       // loop over strips
-      for (Int_t iStrip = 0; iStrip < 16; ++iStrip) {
+      for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) {
        // get pad from electronics
 
        Int_t offset = 0;
        if (cath && localBoard->GetSwitch(AliMpLocalBoard::kZeroAllYLSB)) offset = -8;
 
-       AliMpPad pad = seg[cath]->PadByLocation(iBoard,iStrip+offset,kFALSE);
+       AliMpPad pad = seg[cath]->PadByLocation(iBoard,ibitxy+offset,kFALSE);
 
        if (!pad.IsValid()) continue;
 
@@ -314,6 +316,8 @@ Bool_t AliMUONTriggerDisplay::InitOrDisplayTriggerInfo(TObject* inputObject, TH2
        xcPad = sign * (pad.GetPositionX() + xOffsetLine);
        if(line==4) xcPad += 0.75 * sign * xWidthCol;
        ycPad = pad.GetPositionY() + yOffsetLine;
+       nLocations = pad.GetNofLocations();
+       Int_t iStrip = pad.GetLocalBoardChannel(0);
 
        if(cath==iCath){
          x1 = xcPad - xWidth + kShiftX;
@@ -333,13 +337,14 @@ Bool_t AliMUONTriggerDisplay::InitOrDisplayTriggerInfo(TObject* inputObject, TH2
        }
 
        if(cath==0){
-         if(iStrip+offset==0) {
+         if(iStrip==0) {
            x1b = xcPad - xWidth + kShiftEl;
            y1b = ycPad - yWidth + kShiftEl;
          }
          x2b = xcPad + xWidth - kShiftEl;
          y2b = ycPad + yWidth - kShiftEl;
        }
+
       } // loop on strips
 
       // if iCath==0 strip info and board info are both filled -> break!
@@ -356,7 +361,7 @@ Bool_t AliMUONTriggerDisplay::InitOrDisplayTriggerInfo(TObject* inputObject, TH2
       AddSortedPoint(y2b, yAxisBoard, kResetValue);
     }
     else if(displayType==kDisplayBoards) 
-      FillBins(inputObject, displayHisto, iBoard, -1, x1b, x2b, y1b, y2b, kShiftEl, kShiftEl, displayOpt);
+      FillBins(inputObject, displayHisto, iBoard, -nLocations, x1b, x2b, y1b, y2b, kShiftEl, kShiftEl, displayOpt);
     else if(displayType==kDisplaySlats) 
       FillBins(inputObject, displayHisto, slat, -1, x1b, x2b, y1b, y2b, kShiftEl, kShiftEl, displayOpt);
   } // loop on local boards
@@ -497,6 +502,13 @@ void AliMUONTriggerDisplay::FillBins(TObject* inputObject, TH2* displayHisto,
                              // x2 = x_c + xHalfWidth - kShiftX
                              // x1 = x_c - xHalfWidth + kShiftX
                              // so x2 - x1 + 2*kShiftX returns the element width.
+         
+         // If iElement2 is less than 0, then its meaning is the 
+         // number of boards covered by one strip
+         // the area has therefore to be multiplied accordingly
+         // This fixes the problem when filling the trigger rate per boards in non-bending plane
+         // which is overestimated since the segmentation is always given by the bending-plane
+         if ( iElement2 < 0 ) elementArea *= -(Double_t)iElement2;
 
   }
 
index 7d0ec7b..75079da 100644 (file)
@@ -61,6 +61,9 @@ ClassImp(AliMUONTriggerQADataMakerRec)
 #include "AliMUONGlobalTrigger.h"
 #include "AliMUONGlobalCrateConfig.h"
 #include "AliMUONQAIndices.h"
+#include "AliMpPad.h"
+#include "AliMpVSegmentation.h"
+#include "AliMpSegmentation.h"
 
 namespace
 {
@@ -499,13 +502,6 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
     //}
 
     AliMUONDigitStoreV2R digitStore;
-
-    AliMUONDigitStoreV2R digitStoreAll;
-    TArrayS xyPatternAll[2];
-    for(Int_t icath=0; icath<AliMpConstants::NofCathodes(); icath++){
-      xyPatternAll[icath].Set(AliMpConstants::NofTriggerChambers());
-      xyPatternAll[icath].Reset(1);
-    }
     
     AliMUONTriggerStoreV1 recoTriggerStore;
 
@@ -525,6 +521,7 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
     const AliMUONRawStreamTriggerHP::AliLocalStruct*     localStruct = 0x0;
 
     Int_t nDeadLocal = 0, nDeadRegional = 0, nDeadGlobal = 0, nNoisyStrips = 0;
+    Int_t nFiredStrips = 0, nStripsTot = 0;
 
     // When a crate is not present, the loop on boards is not performed
     // This should allow to correctly count the local boards
@@ -633,8 +630,6 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
          localStruct->GetXPattern(xyPattern[0]);
          localStruct->GetYPattern(xyPattern[1]);
          fDigitMaker->TriggerDigits(loCircuit, xyPattern, digitStore);
-         if ( fillScalerHistos ) // Compute total number of strips
-           fDigitMaker->TriggerDigits(loCircuit, xyPatternAll, digitStoreAll);
 
          //Get electronic Decisions from data
 
@@ -653,6 +648,10 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
          // loop over strips
          if ( fillScalerHistos ) {
            Int_t cathode = localStruct->GetComptXY()%2;
+      
+      Int_t offset = 0;
+      if (cathode && localBoard->GetSwitch(AliMpLocalBoard::kZeroAllYLSB)) offset = -8;
+
            for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) {
              if (ibitxy==0){
                AliDebug(AliQAv1::GetQADebugLevel(),"Filling trigger scalers");
@@ -664,15 +663,34 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
                localStruct->GetXY3(ibitxy),
                localStruct->GetXY4(ibitxy)
              };
-
-             for(Int_t ich=0; ich<AliMpConstants::NofTriggerChambers(); ich++){
-               if ( scalerVal[ich] > 0 )
-                 ((TH2F*)GetRawsData(AliMUONQAIndices::kTriggerScalers + AliMpConstants::NofTriggerChambers()*cathode + ich))
-                   ->Fill(loCircuit, ibitxy, 2*(Float_t)scalerVal[ich]);
-
-               if ( scalerVal[ich] >= maxNcounts )
-                 nNoisyStrips++;
-             } // loop on chamber
+        
+        
+
+        for(Int_t ich=0; ich<AliMpConstants::NofTriggerChambers(); ich++){
+          // getDetElemId
+          Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromLocalBoard(loCircuit, ich);
+                                       
+          const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode));
+                                       
+                                       
+          Int_t istrip = ibitxy + offset;
+                                       
+          AliMpPad pad = seg->PadByLocation(loCircuit,istrip,kFALSE);
+          if (!pad.IsValid()) continue;
+          nStripsTot++;
+          
+          // UShort_t pattern = (UShort_t)xyPattern[cathode].At(ich); 
+          // if ((pattern >> ibitxy) & 0x1) nFiredStrips++;
+          
+          if ( scalerVal[ich] > 0 ) {
+            ((TH2F*)GetRawsData(AliMUONQAIndices::kTriggerScalers + AliMpConstants::NofTriggerChambers()*cathode + ich))
+              ->Fill(loCircuit, istrip, 2*(Float_t)scalerVal[ich]);
+            nFiredStrips++;
+          }
+
+          if ( scalerVal[ich] >= maxNcounts )
+            nNoisyStrips++;
+        } // loop on chamber
            } // loop on strips
          } // scaler event
        } // iLocal
@@ -698,10 +716,10 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader)
     GetRawsData(AliMUONQAIndices::kTriggerRawNAnalyzedEvents)->Fill(1.);
 
     nDeadLocal += AliMUONConstants::NTriggerCircuit() - countNotifiedBoards;
-    Int_t nStripsTot = digitStoreAll.GetSize();
     if ( nStripsTot > 0 ) { // The value is != 0 only for scaler events
+      AliDebug(AliQAv1::GetQADebugLevel(), Form("nStripsFired %i  nStripsTot %i", nFiredStrips, nStripsTot));
       Float_t fraction[AliMUONQAIndices::kNtrigCalibSummaryBins] = {
-       ((Float_t)(nStripsTot - digitStore.GetSize())) / ((Float_t)nStripsTot),
+       ((Float_t)(nStripsTot - nFiredStrips)) / ((Float_t)nStripsTot),
        //(Float_t)nDeadLocal / ((Float_t)countNotifiedBoards),
        (Float_t)nDeadLocal / ((Float_t)AliMUONConstants::NTriggerCircuit()),
        (Float_t)nDeadRegional / 16.,