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 **************************************************************************/
17 Checks the quality assurance.
18 By comparing with reference data
20 Based on PHOS code written by
21 Y. Schutz CERN July 2007
23 For the moment we only implement the checking of raw data QA.
24 The checked for ESD and RecPoints will be implemented later.
30 // --- ROOT system ---
36 #include <TIterator.h>
41 #include <TPaveText.h>
44 // --- Standard library ---
46 // --- AliRoot header files ---
49 #include "AliQAChecker.h"
50 #include "AliEMCALQAChecker.h"
52 ClassImp(AliEMCALQAChecker)
54 //__________________________________________________________________
55 AliEMCALQAChecker::AliEMCALQAChecker() :
56 AliQACheckerBase("EMCAL","EMCAL Quality Assurance Data Maker"),
57 fTextSM(new TText*[fknSM]),
58 fLineCol(new TLine(47.5,-0.5,47.5,119.5)),
59 fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC"))
62 fLineCol->SetLineColor(1);
63 fLineCol->SetLineWidth(2);
65 fTextSM[0]= new TText(20, 12, "SM A0");
66 fTextSM[1]= new TText(20, 36, "SM A1");
67 fTextSM[2]= new TText(20, 60, "SM A2");
68 fTextSM[3]= new TText(20, 84, "SM A3");
69 fTextSM[4]= new TText(20, 108,"SM A4");
71 fTextSM[5]= new TText(64, 12, "SM C0");
72 fTextSM[6]= new TText(64, 36, "SM C1");
73 fTextSM[7]= new TText(64, 60, "SM C2");
74 fTextSM[8]= new TText(64, 84, "SM C3");
75 fTextSM[9]= new TText(64, 108,"SM C4");
77 for(int i = 0; i < 4; i++) {
78 fLineRow[i] = new TLine(-0.5,23.5+(24*i),95.5,23.5+(24*i));
79 fLineRow[i]->SetLineColor(1);
80 fLineRow[i]->SetLineWidth(2);
86 //__________________________________________________________________
87 AliEMCALQAChecker::~AliEMCALQAChecker()
92 for (Int_t i=0; i<4; ++i) delete fLineRow[i] ;
96 //__________________________________________________________________
97 AliEMCALQAChecker::AliEMCALQAChecker(const AliEMCALQAChecker& qac) :
98 AliQACheckerBase(qac.GetName(), qac.GetTitle()),
99 fTextSM(new TText*[fknSM]) ,
100 fLineCol(static_cast<TLine*>(qac.fLineCol->Clone())) ,
101 fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC"))
104 for (Int_t sm = 0 ; sm < fknSM ; sm++){
105 fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
107 for(Int_t i = 0 ; i < 4 ; i++) {
109 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ;
112 //__________________________________________________________________
113 AliEMCALQAChecker& AliEMCALQAChecker::operator = (const AliEMCALQAChecker &qac)
115 AliQACheckerBase(qac.GetName(), qac.GetTitle());
116 fTextSM = new TText*[fknSM] ;
117 fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ;
118 fText = new TPaveText(0.2,0.7,0.8,0.9,"NDC") ;
119 for (Int_t sm = 0 ; sm < fknSM ; sm++){
120 fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
122 for(Int_t i = 0; i < 4; i++) {
124 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ;
129 //______________________________________________________________________________
130 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
132 /// Check objects in list
134 if ( index == AliQAv1::kRAW )
136 CheckRaws(test, list);
137 printf ("checkers for task %d \n", index) ;
140 if ( index == AliQAv1::kREC)
142 CheckRecPoints(test, list);
145 if ( index == AliQAv1::kESD )
147 CheckESD(test, list);
149 AliWarning(Form("Checker for task %d not implement for the moment",index));
152 //______________________________________________________________________________
154 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
156 /// Get a given histo from the list
157 TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
160 AliError(Form("Did not find expected histo %s",hname));
165 //______________________________________________________________________________
167 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
169 /// Mark histo as originator of some QA error/warning
173 histo.SetBit(AliQAv1::GetQABit());
180 //______________________________________________________________________________
181 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
183 // Check RAW QA histograms
184 // -- Yaxian Mao, CCNU/CERN/LPSC
185 //adding new checking method: 25/04/2010, Yaxian Mao
186 //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
187 //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted.
190 //Float_t kThreshold = 80. ;
191 Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
192 Double_t nTot = fknSM * nTowersPerSM ;
194 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
196 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie))
198 if (list[specie]->GetEntries() == 0)
199 test[specie] = 0. ; // nothing to check
201 TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ;
202 TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
203 if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
205 //adding the lines to distinguish different SMs
206 lstF = hdata->GetListOfFunctions();
207 { // RS: clean list of functions
209 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
211 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
212 if (stats) lstF->Add(stats);
215 AliWarning(Form("Checker : empty list of data functions; returning"));
219 lstF->Add(fLineCol->Clone());
220 for(Int_t iLine = 0; iLine < 4; iLine++) {
221 lstF->Add(fLineRow[iLine]->Clone());
223 //Now adding the text to for each SM
224 for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){ //number of SMs loop start
225 lstF->Add(fTextSM[iSM]->Clone());
228 lstF = ratio->GetListOfFunctions();
229 { // RS: clean list of functions
231 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
233 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
234 if (stats) lstF->Add(stats);
237 AliWarning(Form("Checker : empty list of ratio functions; returning"));
241 lstF->Add(fText->Clone()) ;
243 //now check the ratio histogram
244 Double_t binContent = 0. ;
245 Int_t NGoodTower = 0 ;
247 for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
248 for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
249 binContent = hdata->GetBinContent(ix, iy) ;
250 if (binContent < 1.2 && binContent > 0.8)
254 rv = NGoodTower/nTot ;
255 printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
259 fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));
262 // 2 lines text info for quality
263 fText->SetFillColor(2) ;
264 fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!"));
268 fText->SetFillColor(3) ;
269 fText->AddText(Form("EMCAL = OK, ENJOY..."));
271 //hdata->Reset("ICE");
272 //ratio->Reset("ICE");
275 } //finish the checking
278 //______________________________________________________________________________
279 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
281 /// intialises QA and QA checker settings
282 AliQAv1::Instance(det) ;
283 Float_t hiValue[AliQAv1::kNBIT] ;
284 Float_t lowValue[AliQAv1::kNBIT] ;
285 lowValue[AliQAv1::kINFO] = 0.0 ;
286 hiValue[AliQAv1::kINFO] = 0.1 ;
287 lowValue[AliQAv1::kWARNING] = 0.1 ;
288 hiValue[AliQAv1::kWARNING] = 0.5 ;
289 lowValue[AliQAv1::kERROR] = 0.5 ;
290 hiValue[AliQAv1::kERROR] = 0.8 ;
291 lowValue[AliQAv1::kFATAL] = 0.8 ;
292 hiValue[AliQAv1::kFATAL] = 1.0 ;
293 SetHiLo(&hiValue[0], &lowValue[0]) ;