In trigger QA:
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerQAChecker.cxx
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 ClassImp(AliMUONTriggerQAChecker)
41 /// \endcond
42
43 //__________________________________________________________________
44 AliMUONTriggerQAChecker::AliMUONTriggerQAChecker() : AliMUONVQAChecker()
45 {
46         /// ctor
47 }          
48
49 //__________________________________________________________________
50 AliMUONTriggerQAChecker::~AliMUONTriggerQAChecker() 
51 {
52         /// dtor
53 }
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   if ( value != AliMUONVQAChecker::kInfo )
62   {
63     histo.SetBit(AliQAv1::GetQABit());
64   }
65   
66   return value;
67 }
68
69 //__________________________________________________________________
70 AliMUONVQAChecker::ECheckCode* 
71 AliMUONTriggerQAChecker::CheckRaws(TObjArray** list, const AliMUONRecoParam* )
72 {
73   /// Check raw data
74
75   AliMUONVQAChecker::ECheckCode * rv = new AliMUONVQAChecker::ECheckCode[AliRecoParam::kNSpecies];
76
77   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   Float_t alarmPercentTrigAlgo[AliMUONQAIndices::kNtrigAlgoErrorBins] = {safeFactor*1., safeFactor*1., safeFactor*1., 100., 100., 100., 100., safeFactor*1., safeFactor*1., safeFactor*1.};
88   Float_t alarmPercentCalib[AliMUONQAIndices::kNtrigCalibSummaryBins] = {safeFactor*0.4, safeFactor*1., 6.2, 0.0001, safeFactor*0.4};
89   Float_t alarmPercentReadout[AliMUONQAIndices::kNtrigStructErrorBins] = {safeFactor*1., safeFactor*1., safeFactor*1., safeFactor*1.};
90
91   Float_t* alarmPercent[kNrawsHistos] = {alarmPercentTrigAlgo, alarmPercentCalib, alarmPercentReadout};
92   // END OF LIMTS
93
94   TObjArray messages;
95   messages.SetOwner(kTRUE);
96
97   TH1* currHisto = 0x0;
98   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
99     rv[specie] = AliMUONVQAChecker::kInfo;
100     AliMUONVQAChecker::ECheckCode currRv = rv[specie];
101
102     TH1* hAnalyzedEvents = AliQAv1::GetData(list,AliMUONQAIndices::kTriggerRawNAnalyzedEvents,AliRecoParam::ConvertIndex(specie));
103     Int_t nAnalyzedEvents = 0;
104     if ( hAnalyzedEvents ) 
105       nAnalyzedEvents = TMath::Nint(hAnalyzedEvents->GetBinContent(1));
106
107     if ( nAnalyzedEvents == 0 )
108       currRv = AliMUONVQAChecker::kFatal;
109
110     for(Int_t ihisto = 0; ihisto<kNrawsHistos; ihisto++){
111       messages.Clear();
112       currHisto = AliQAv1::GetData(list,histoRawsPercentIndex[ihisto],AliRecoParam::ConvertIndex(specie));
113       if ( ! currHisto ) continue;
114
115       Int_t nbins = currHisto->GetXaxis()->GetNbins();
116       for (Int_t ibin = 1; ibin<=nbins; ibin++){
117         Double_t binContent = currHisto->GetBinContent(ibin);
118         if (binContent > alarmPercent[ihisto][ibin-1])
119           currRv = AliMUONVQAChecker::kWarning;
120       } // loop on bins
121       if ( currRv != AliMUONVQAChecker::kInfo ) {
122         switch ( histoRawsPercentIndex[ihisto] ) {
123         case AliMUONQAIndices::kTriggerErrorSummaryNorm:
124         case AliMUONQAIndices::kTriggerCalibSummaryNorm:
125           messages.Add(new TObjString("Trigger algo errors"));
126           break;
127         case AliMUONQAIndices::kTriggerReadOutErrorsNorm:
128           messages.Add(new TObjString("Readout errors"));
129         }
130         if ( currRv == AliMUONVQAChecker::kWarning )
131           messages.Add(new TObjString("are a little bit high"));
132         else if ( currRv == AliMUONVQAChecker::kError || 
133                   currRv == AliMUONVQAChecker::kFatal )
134           messages.Add(new TObjString("are too high"));
135       }
136       else {
137         switch ( histoRawsPercentIndex[ihisto] ) {
138         case AliMUONQAIndices::kTriggerErrorSummaryNorm:
139         case AliMUONQAIndices::kTriggerCalibSummaryNorm:
140         case AliMUONQAIndices::kTriggerReadOutErrorsNorm:
141           messages.Add(new TObjString("Values within limits"));
142           break;
143         }
144       }
145       rv[specie] = MarkHisto(*currHisto, currRv);
146       currHisto->GetYaxis()->SetRangeUser(0., 110.);
147       SetupHisto(nAnalyzedEvents, messages, *currHisto, rv[specie]);
148     } // loop on histos
149   } // loop on species
150
151   return rv;
152 }
153
154 //__________________________________________________________________
155 AliMUONVQAChecker::ECheckCode* 
156 AliMUONTriggerQAChecker::CheckRecPoints(TObjArray** , const AliMUONRecoParam* )
157 {
158   /// Check rec points
159   return 0x0;
160 }
161
162 //__________________________________________________________________
163 AliMUONVQAChecker::ECheckCode* 
164 AliMUONTriggerQAChecker::CheckESD(TObjArray** , const AliMUONRecoParam* )
165 {
166   /// Check esd
167   return 0x0;
168 }
169
170
171 //___________________________________________________________________ 
172 void AliMUONTriggerQAChecker::SetupHisto(Int_t nevents, const TObjArray& messages, TH1& histo, AliMUONVQAChecker::ECheckCode code)
173 {
174   //
175   /// Add text to histos
176   //
177
178   Double_t y1 = 0.97 - (messages.GetLast()+2)*0.075;
179   TPaveText* text = new TPaveText(0.5,y1,0.99,0.99,"NDC");
180     
181   text->AddText(Form("MTR - Total events %i", nevents));
182     
183   TIter next(&messages);
184   TObjString* str;
185     
186   while ( ( str = static_cast<TObjString*>(next()) ) ){
187     text->AddText(str->String());
188   }
189     
190   if ( nevents == 0 ) {
191     text->AddText("No event analyzed.");
192     text->AddText("Please make sure this is the MTR agent!");
193     text->AddText("(we share plots with MCH)");
194   }
195
196   TString defaultText = "";
197
198   Int_t color = 0;
199   switch ( code ) {
200   case AliMUONVQAChecker::kInfo:
201     color = kGreen;
202     defaultText = "All is fine!";
203     break;
204   case AliMUONVQAChecker::kWarning:
205     color = kYellow;
206     defaultText = "Please keep an eye on it!";
207     break;
208   case AliMUONVQAChecker::kFatal:
209     color = kRed;
210     defaultText = "This is bad: PLEASE CALL EXPERT!!!";
211     break;
212   default:
213     color = kOrange;
214     defaultText = "PLEASE NOTIFY EXPERT! (NOT at night)";
215     break;
216   }
217
218   if ( nevents == 0 )
219     defaultText = "Otherwise PLEASE CALL EXPERT!";
220
221   text->AddText(defaultText.Data());
222   text->SetFillColor(color);
223                       
224   histo.SetFillStyle(1001);
225   histo.SetFillColor(color);
226
227   histo.SetStats(kFALSE);
228     
229   histo.GetListOfFunctions()->Add(text);
230 }