LCOV - code coverage report
Current view: top level - MUON/MUONbase - AliMUONTriggerQAChecker.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 89 4.5 %
Date: 2016-06-14 17:26:59 Functions: 3 11 27.3 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : // $Id$
      17             : 
      18             : #include "AliMUONTriggerQAChecker.h"
      19             : 
      20             : /// \class AliMUONTriggerQAChecker
      21             : ///
      22             : /// Implementation of QAChecker for MTR
      23             : ///
      24             : /// For the moment we only implement the checking of raw data QA for the trigger
      25             : /// by looking at the local structure and trigger response errors.
      26             : ///
      27             : /// \author Diego Stocco, Subatech
      28             : 
      29             : 
      30             : #include "AliRecoParam.h"
      31             : #include "AliMUONQAIndices.h"
      32             : #include "AliQAv1.h"
      33             : #include "TH1.h"
      34             : #include "TPaveText.h"
      35             : #include "TString.h"
      36             : #include "TObjArray.h"
      37             : #include "TList.h"
      38             : 
      39             : /// \cond CLASSIMP
      40          18 : ClassImp(AliMUONTriggerQAChecker)
      41             : /// \endcond
      42             : 
      43             : //__________________________________________________________________
      44           2 : AliMUONTriggerQAChecker::AliMUONTriggerQAChecker() : AliMUONVQAChecker()
      45          10 : {
      46             :         /// ctor
      47           4 : }          
      48             : 
      49             : //__________________________________________________________________
      50             : AliMUONTriggerQAChecker::~AliMUONTriggerQAChecker() 
      51           0 : {
      52             :         /// dtor
      53           0 : }
      54             : 
      55             : //______________________________________________________________________________
      56             : AliMUONVQAChecker::ECheckCode 
      57             : AliMUONTriggerQAChecker::MarkHisto(TH1& histo, AliMUONVQAChecker::ECheckCode value) const
      58             : {
      59             :   /// Mark histo as originator of some QA error/warning
      60             :   
      61           0 :   if ( value != AliMUONVQAChecker::kInfo )
      62             :   {
      63           0 :     histo.SetBit(AliQAv1::GetQABit());
      64           0 :   }
      65             :   
      66           0 :   return value;
      67             : }
      68             : 
      69             : //__________________________________________________________________
      70             : AliMUONVQAChecker::ECheckCode* 
      71             : AliMUONTriggerQAChecker::CheckRaws(TObjArray** list, const AliMUONRecoParam* )
      72             : {
      73             :   /// Check raw data
      74             : 
      75           0 :   AliMUONVQAChecker::ECheckCode * rv = new AliMUONVQAChecker::ECheckCode[AliRecoParam::kNSpecies];
      76             : 
      77           0 :   Int_t histoRawsPercentIndex[] = {
      78             :     AliMUONQAIndices::kTriggerErrorSummaryNorm, 
      79             :     AliMUONQAIndices::kTriggerCalibSummaryNorm,
      80             :     AliMUONQAIndices::kTriggerReadOutErrorsNorm
      81             :   };
      82             :   const Int_t kNrawsHistos = sizeof(histoRawsPercentIndex)/sizeof(histoRawsPercentIndex[0]);
      83             : 
      84             :   // BEGIN OF LIMITS
      85             :   // Fixme: Move me to reference histos
      86             :   Float_t safeFactor = 5.;
      87           0 :   Float_t warningPercentTrigAlgo[AliMUONQAIndices::kNtrigAlgoErrorBins] = {static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.), 100., 100., 100., 100., static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.)};
      88           0 :   Float_t warningPercentCalib[AliMUONQAIndices::kNtrigCalibSummaryBins] = {static_cast<Float_t>(safeFactor*0.4), static_cast<Float_t>(safeFactor*1.), 3.1, 0.0001, static_cast<Float_t>(safeFactor*0.4)};
      89           0 :   Float_t warningPercentReadout[AliMUONQAIndices::kNtrigStructErrorBins] = {static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.), static_cast<Float_t>(safeFactor*1.)};
      90             : 
      91           0 :   Float_t* warningPercent[kNrawsHistos] = {warningPercentTrigAlgo, warningPercentCalib, warningPercentReadout};
      92             :   
      93             :   Float_t errorFactor = 30.;
      94           0 :   Float_t errorPercentTrigAlgo[AliMUONQAIndices::kNtrigAlgoErrorBins] = {static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.), 100., 100., 100., 100., static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.)};
      95           0 :   Float_t errorPercentCalib[AliMUONQAIndices::kNtrigCalibSummaryBins] = {static_cast<Float_t>(errorFactor*0.4), static_cast<Float_t>(errorFactor*1.), 6.2, 3.*0.0001, static_cast<Float_t>(errorFactor*0.4)};
      96           0 :   Float_t errorPercentReadout[AliMUONQAIndices::kNtrigStructErrorBins] = {static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.), static_cast<Float_t>(errorFactor*1.)};
      97             :   // END OF LIMTS
      98             : 
      99           0 :   Float_t* errorPercent[kNrawsHistos] = {errorPercentTrigAlgo, errorPercentCalib, errorPercentReadout};
     100             :   
     101           0 :   TObjArray messages;
     102           0 :   messages.SetOwner(kTRUE);
     103             : 
     104             :   TH1* currHisto = 0x0;
     105           0 :   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
     106           0 :     rv[specie] = AliMUONVQAChecker::kInfo;
     107             : 
     108           0 :     TH1* hAnalyzedEvents = AliQAv1::GetData(list,AliMUONQAIndices::kTriggerRawNAnalyzedEvents,AliRecoParam::ConvertIndex(specie));
     109             : 
     110             :     //if ( nAnalyzedEvents == 0 ) rv[specie] = AliMUONVQAChecker::kFatal;
     111             : 
     112           0 :     for(Int_t ihisto = 0; ihisto<kNrawsHistos; ihisto++){
     113             :       Int_t nAnalyzedEvents = 0;
     114           0 :       Int_t ibinNevents = ( histoRawsPercentIndex[ihisto] == AliMUONQAIndices::kTriggerReadOutErrorsNorm ) ? 1 : 2;
     115           0 :       if ( hAnalyzedEvents ) nAnalyzedEvents = TMath::Nint(hAnalyzedEvents->GetBinContent(ibinNevents));
     116             :       AliMUONVQAChecker::ECheckCode currRv = AliMUONVQAChecker::kInfo;
     117           0 :       messages.Clear();
     118           0 :       currHisto = AliQAv1::GetData(list,histoRawsPercentIndex[ihisto],AliRecoParam::ConvertIndex(specie));
     119           0 :       if ( ! currHisto ) continue;
     120             : 
     121           0 :       Int_t nbins = currHisto->GetXaxis()->GetNbins();
     122           0 :       for (Int_t ibin = 1; ibin<=nbins; ibin++){
     123           0 :         Double_t binContent = currHisto->GetBinContent(ibin);
     124           0 :         if ( binContent > errorPercent[ihisto][ibin-1] )
     125           0 :           currRv = AliMUONVQAChecker::kError;
     126           0 :         else if ( binContent > warningPercent[ihisto][ibin-1] )
     127           0 :           currRv = AliMUONVQAChecker::kWarning;
     128           0 :         else if ( ibin == 4 && binContent > 50. && AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib) {
     129           0 :           messages.Add(new TObjString("Do not panic:")); 
     130           0 :           messages.Add(new TObjString("copy errors do not affect data"));
     131             :         }
     132             :       } // loop on bins
     133           0 :       if ( currRv != AliMUONVQAChecker::kInfo ) {
     134           0 :         switch ( histoRawsPercentIndex[ihisto] ) {
     135             :         case AliMUONQAIndices::kTriggerErrorSummaryNorm:
     136             :         case AliMUONQAIndices::kTriggerCalibSummaryNorm:
     137           0 :           messages.Add(new TObjString("Trigger algo errors"));
     138             :           break;
     139             :         case AliMUONQAIndices::kTriggerReadOutErrorsNorm:
     140           0 :           messages.Add(new TObjString("Readout errors"));
     141             :           break;
     142             :         }
     143           0 :         if ( currRv == AliMUONVQAChecker::kWarning )
     144           0 :           messages.Add(new TObjString("are a little bit high"));
     145           0 :         else if ( currRv == AliMUONVQAChecker::kError || 
     146           0 :                   currRv == AliMUONVQAChecker::kFatal )
     147           0 :           messages.Add(new TObjString("are too high"));
     148             :       }
     149           0 :       else if ( nAnalyzedEvents != 0 ) {
     150           0 :         switch ( histoRawsPercentIndex[ihisto] ) {
     151             :         case AliMUONQAIndices::kTriggerErrorSummaryNorm:
     152             :         case AliMUONQAIndices::kTriggerCalibSummaryNorm:
     153             :         case AliMUONQAIndices::kTriggerReadOutErrorsNorm:
     154           0 :           messages.Add(new TObjString("Values within limits"));
     155             :           break;
     156             :         }
     157             :       }
     158           0 :       if ( MarkHisto(*currHisto, currRv) < rv[specie] )
     159           0 :         rv[specie] = currRv;
     160           0 :       currHisto->GetYaxis()->SetRangeUser(0., 110.);
     161           0 :       SetupHisto(nAnalyzedEvents, messages, *currHisto, currRv, specie);
     162           0 :     } // loop on histos
     163             :   } // loop on species
     164             : 
     165             :   return rv;
     166           0 : }
     167             : 
     168             : //__________________________________________________________________
     169             : AliMUONVQAChecker::ECheckCode* 
     170             : AliMUONTriggerQAChecker::CheckRecPoints(TObjArray** , const AliMUONRecoParam* )
     171             : {
     172             :   /// Check rec points
     173           0 :   return 0x0;
     174             : }
     175             : 
     176             : //__________________________________________________________________
     177             : AliMUONVQAChecker::ECheckCode* 
     178             : AliMUONTriggerQAChecker::CheckESD(TObjArray** , const AliMUONRecoParam* )
     179             : {
     180             :   /// Check esd
     181           0 :   return 0x0;
     182             : }
     183             : 
     184             : 
     185             : //___________________________________________________________________ 
     186             : void AliMUONTriggerQAChecker::SetupHisto(Int_t nevents, const TObjArray& messages, TH1& histo, AliMUONVQAChecker::ECheckCode code, Int_t esIndex)
     187             : {
     188             :   //
     189             :   /// Add text to histos
     190             :   //
     191             : 
     192           0 :   Double_t y1 = 0.87 - (messages.GetLast()+2)*0.075;
     193           0 :   TPaveText* text = new TPaveText(0.25,y1,0.75,0.89,"NDC");
     194             :   
     195           0 :   Int_t eventLimit = ( AliRecoParam::ConvertIndex(esIndex) == AliRecoParam::kCalib ) ? 5 : 20;
     196             : 
     197           0 :   text->AddText(Form("MTR - Specie: %s", AliRecoParam::GetEventSpecieName(esIndex)));
     198           0 :   text->AddText(Form("Total events %i", nevents));
     199             : 
     200           0 :   TString defaultText = "";  
     201             :   Int_t color = 0;
     202             :   
     203           0 :   if ( nevents == 0 ) {
     204             :     color = AliMUONVQAChecker::kFatalColor;
     205           0 :     defaultText = "No events analyzed!";
     206             :   }
     207           0 :   else if ( nevents <= eventLimit ) {
     208             :     color = AliMUONVQAChecker::kWarningColor;
     209           0 :     text->AddText("Not enough events to judge");
     210           0 :     defaultText = "Please wait for more statistics";
     211             :   }
     212             :   else {
     213           0 :     TIter next(&messages);
     214             :     TObjString* str;
     215             :     
     216           0 :     while ( ( str = static_cast<TObjString*>(next()) ) ){
     217           0 :       text->AddText(str->String());
     218             :     }
     219             :     
     220           0 :     switch ( code ) {
     221             :       case AliMUONVQAChecker::kInfo:
     222             :         color = AliMUONVQAChecker::kInfoColor;
     223           0 :         defaultText = "All is fine!";
     224             :         break;
     225             :       case AliMUONVQAChecker::kWarning:
     226             :         color = AliMUONVQAChecker::kWarningColor;
     227           0 :         defaultText = "Please keep an eye on it!";
     228             :         break;
     229             :       case AliMUONVQAChecker::kFatal:
     230             :         color = AliMUONVQAChecker::kFatalColor;
     231           0 :         defaultText = "PLEASE CALL MUON TRIGGER EXPERT!!!";
     232             :         break;
     233             :       default:
     234             :         color = AliMUONVQAChecker::kErrorColor;
     235           0 :         defaultText = "PLEASE CALL MUON TRIGGER EXPERT!";
     236             :         break;
     237             :     }
     238           0 :   }
     239             : 
     240           0 :   text->AddText(defaultText.Data());
     241           0 :   text->SetFillColor(color);
     242             :                       
     243           0 :   histo.SetFillStyle(1001);
     244           0 :   histo.SetFillColor(color);
     245             : 
     246           0 :   histo.SetStats(kFALSE);
     247             :     
     248           0 :   histo.GetListOfFunctions()->Delete();
     249           0 :   histo.GetListOfFunctions()->Add(text);
     250           0 : }

Generated by: LCOV version 1.11