1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 #include "AliMUONTriggerQAChecker.h"
20 /// \class AliMUONTriggerQAChecker
22 /// Implementation of QAChecker for MTR
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.
27 /// \author Diego Stocco, Subatech
30 #include "AliRecoParam.h"
31 #include "AliMUONQAIndices.h"
34 #include "TPaveText.h"
36 #include "TObjArray.h"
40 ClassImp(AliMUONTriggerQAChecker)
43 //__________________________________________________________________
44 AliMUONTriggerQAChecker::AliMUONTriggerQAChecker() : AliMUONVQAChecker()
49 //__________________________________________________________________
50 AliMUONTriggerQAChecker::~AliMUONTriggerQAChecker()
55 //______________________________________________________________________________
56 AliMUONVQAChecker::ECheckCode
57 AliMUONTriggerQAChecker::MarkHisto(TH1& histo, AliMUONVQAChecker::ECheckCode value) const
59 /// Mark histo as originator of some QA error/warning
61 if ( value != AliMUONVQAChecker::kInfo )
63 histo.SetBit(AliQAv1::GetQABit());
69 //__________________________________________________________________
70 AliMUONVQAChecker::ECheckCode*
71 AliMUONTriggerQAChecker::CheckRaws(TObjArray** list, const AliMUONRecoParam* )
75 AliMUONVQAChecker::ECheckCode * rv = new AliMUONVQAChecker::ECheckCode[AliRecoParam::kNSpecies];
77 Int_t histoRawsPercentIndex[] = {
78 AliMUONQAIndices::kTriggerErrorSummaryNorm,
79 AliMUONQAIndices::kTriggerCalibSummaryNorm,
80 AliMUONQAIndices::kTriggerReadOutErrorsNorm
82 const Int_t kNrawsHistos = sizeof(histoRawsPercentIndex)/sizeof(histoRawsPercentIndex[0]);
85 // Fixme: Move me to reference histos
86 Float_t safeFactor = 5.;
87 Float_t warningPercentTrigAlgo[AliMUONQAIndices::kNtrigAlgoErrorBins] = {safeFactor*1., safeFactor*1., safeFactor*1., 100., 100., 100., 100., safeFactor*1., safeFactor*1., safeFactor*1.};
88 Float_t warningPercentCalib[AliMUONQAIndices::kNtrigCalibSummaryBins] = {safeFactor*0.4, safeFactor*1., 6.2, 0.0001, safeFactor*0.4};
89 Float_t warningPercentReadout[AliMUONQAIndices::kNtrigStructErrorBins] = {safeFactor*1., safeFactor*1., safeFactor*1., safeFactor*1.};
91 Float_t* warningPercent[kNrawsHistos] = {warningPercentTrigAlgo, warningPercentCalib, warningPercentReadout};
93 Float_t errorFactor = 30.;
94 Float_t errorPercentTrigAlgo[AliMUONQAIndices::kNtrigAlgoErrorBins] = {errorFactor*1., errorFactor*1., errorFactor*1., 100., 100., 100., 100., errorFactor*1., errorFactor*1., errorFactor*1.};
95 Float_t errorPercentCalib[AliMUONQAIndices::kNtrigCalibSummaryBins] = {errorFactor*0.4, errorFactor*1., 3.*6.2, 3.*0.0001, errorFactor*0.4};
96 Float_t errorPercentReadout[AliMUONQAIndices::kNtrigStructErrorBins] = {errorFactor*1., errorFactor*1., errorFactor*1., errorFactor*1.};
99 Float_t* errorPercent[kNrawsHistos] = {errorPercentTrigAlgo, errorPercentCalib, errorPercentReadout};
102 messages.SetOwner(kTRUE);
104 TH1* currHisto = 0x0;
105 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
106 rv[specie] = AliMUONVQAChecker::kInfo;
108 TH1* hAnalyzedEvents = AliQAv1::GetData(list,AliMUONQAIndices::kTriggerRawNAnalyzedEvents,AliRecoParam::ConvertIndex(specie));
109 Int_t nAnalyzedEvents = 0;
110 if ( hAnalyzedEvents )
111 nAnalyzedEvents = TMath::Nint(hAnalyzedEvents->GetBinContent(1));
113 //if ( nAnalyzedEvents == 0 ) rv[specie] = AliMUONVQAChecker::kFatal;
115 for(Int_t ihisto = 0; ihisto<kNrawsHistos; ihisto++){
116 AliMUONVQAChecker::ECheckCode currRv = AliMUONVQAChecker::kInfo;
118 currHisto = AliQAv1::GetData(list,histoRawsPercentIndex[ihisto],AliRecoParam::ConvertIndex(specie));
119 if ( ! currHisto ) continue;
121 Int_t nbins = currHisto->GetXaxis()->GetNbins();
122 for (Int_t ibin = 1; ibin<=nbins; ibin++){
123 Double_t binContent = currHisto->GetBinContent(ibin);
124 if ( binContent > errorPercent[ihisto][ibin-1] )
125 currRv = AliMUONVQAChecker::kError;
126 else if ( binContent > warningPercent[ihisto][ibin-1] )
127 currRv = AliMUONVQAChecker::kWarning;
128 else if ( ibin == 4 && binContent > 50. && AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib) {
129 messages.Add(new TObjString("Do not panic:"));
130 messages.Add(new TObjString("copy errors do not affect data"));
133 if ( currRv != AliMUONVQAChecker::kInfo ) {
134 switch ( histoRawsPercentIndex[ihisto] ) {
135 case AliMUONQAIndices::kTriggerErrorSummaryNorm:
136 case AliMUONQAIndices::kTriggerCalibSummaryNorm:
137 messages.Add(new TObjString("Trigger algo errors"));
139 case AliMUONQAIndices::kTriggerReadOutErrorsNorm:
140 messages.Add(new TObjString("Readout errors"));
143 if ( currRv == AliMUONVQAChecker::kWarning )
144 messages.Add(new TObjString("are a little bit high"));
145 else if ( currRv == AliMUONVQAChecker::kError ||
146 currRv == AliMUONVQAChecker::kFatal )
147 messages.Add(new TObjString("are too high"));
149 else if ( nAnalyzedEvents != 0 ) {
150 switch ( histoRawsPercentIndex[ihisto] ) {
151 case AliMUONQAIndices::kTriggerErrorSummaryNorm:
152 case AliMUONQAIndices::kTriggerCalibSummaryNorm:
153 case AliMUONQAIndices::kTriggerReadOutErrorsNorm:
154 messages.Add(new TObjString("Values within limits"));
158 if ( MarkHisto(*currHisto, currRv) < rv[specie] )
160 currHisto->GetYaxis()->SetRangeUser(0., 110.);
161 SetupHisto(nAnalyzedEvents, messages, *currHisto, currRv);
168 //__________________________________________________________________
169 AliMUONVQAChecker::ECheckCode*
170 AliMUONTriggerQAChecker::CheckRecPoints(TObjArray** , const AliMUONRecoParam* )
176 //__________________________________________________________________
177 AliMUONVQAChecker::ECheckCode*
178 AliMUONTriggerQAChecker::CheckESD(TObjArray** , const AliMUONRecoParam* )
185 //___________________________________________________________________
186 void AliMUONTriggerQAChecker::SetupHisto(Int_t nevents, const TObjArray& messages, TH1& histo, AliMUONVQAChecker::ECheckCode code)
189 /// Add text to histos
192 Double_t y1 = 0.87 - (messages.GetLast()+2)*0.075;
193 TPaveText* text = new TPaveText(0.25,y1,0.75,0.89,"NDC");
195 text->AddText(Form("MTR - Total events %i", nevents));
197 TIter next(&messages);
200 while ( ( str = static_cast<TObjString*>(next()) ) ){
201 text->AddText(str->String());
204 TString defaultText = "";
207 if ( nevents == 0 ) {
208 color = AliMUONVQAChecker::kFatalColor;
209 defaultText = "No events analyzed!";
211 else if ( nevents <= 20 ) {
212 color = AliMUONVQAChecker::kWarningColor;
213 text->AddText("Not enough events to judge");
214 text->AddText("Please wait for more statistics");
218 case AliMUONVQAChecker::kInfo:
219 color = AliMUONVQAChecker::kInfoColor;
220 defaultText = "All is fine!";
222 case AliMUONVQAChecker::kWarning:
223 color = AliMUONVQAChecker::kWarningColor;
224 defaultText = "Please keep an eye on it!";
226 case AliMUONVQAChecker::kFatal:
227 color = AliMUONVQAChecker::kFatalColor;
228 defaultText = "PLEASE CALL MUON TRIGGER EXPERT!!!";
231 color = AliMUONVQAChecker::kErrorColor;
232 defaultText = "PLEASE CALL MUON TRIGGER EXPERT!";
237 text->AddText(defaultText.Data());
238 text->SetFillColor(color);
240 histo.SetFillStyle(1001);
241 histo.SetFillColor(color);
243 histo.SetStats(kFALSE);
245 histo.GetListOfFunctions()->Delete();
246 histo.GetListOfFunctions()->Add(text);