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 : }
|