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*[fgknSM]),
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*[fgknSM]) ,
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 < fgknSM ; 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)
114 { // assignment operator; use copy ctor
115 if (&qac == this) return *this;
117 new (this) AliEMCALQAChecker(qac);
121 //______________________________________________________________________________
122 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
124 /// Check objects in list
126 if ( index == AliQAv1::kRAW )
128 CheckRaws(test, list);
129 printf ("checkers for task %d \n", index) ;
132 if ( index == AliQAv1::kREC)
134 CheckRecPoints(test, list);
137 if ( index == AliQAv1::kESD )
139 CheckESD(test, list);
141 AliWarning(Form("Checker for task %d not implement for the moment",index));
144 //______________________________________________________________________________
146 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
148 /// Get a given histo from the list
149 TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
152 AliError(Form("Did not find expected histo %s",hname));
157 //______________________________________________________________________________
159 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
161 /// Mark histo as originator of some QA error/warning
165 histo.SetBit(AliQAv1::GetQABit());
172 //______________________________________________________________________________
173 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
175 // Check RAW QA histograms
176 // -- Yaxian Mao, CCNU/CERN/LPSC
177 //adding new checking method: 25/04/2010, Yaxian Mao
178 //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
179 //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted.
182 //Float_t kThreshold = 80. ;
183 Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
184 Double_t nTot = fgknSM * nTowersPerSM ;
186 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
188 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie))
190 if (list[specie]->GetEntries() == 0)
191 test[specie] = 0. ; // nothing to check
193 TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ;
194 TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
195 if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
197 //adding the lines to distinguish different SMs
198 lstF = hdata->GetListOfFunctions();
199 { // RS: clean list of functions
201 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
203 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
204 if (stats) lstF->Add(stats);
207 AliWarning(Form("Checker : empty list of data functions; returning"));
211 lstF->Add(fLineCol->Clone());
212 for(Int_t iLine = 0; iLine < 4; iLine++) {
213 lstF->Add(fLineRow[iLine]->Clone());
215 //Now adding the text to for each SM
216 for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){ //number of SMs loop start
217 lstF->Add(fTextSM[iSM]->Clone());
220 lstF = ratio->GetListOfFunctions();
221 { // RS: clean list of functions
223 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
225 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
226 if (stats) lstF->Add(stats);
229 AliWarning(Form("Checker : empty list of ratio functions; returning"));
233 lstF->Add(fText->Clone()) ;
235 //now check the ratio histogram
236 Double_t binContent = 0. ;
237 Int_t NGoodTower = 0 ;
239 for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
240 for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
241 binContent = hdata->GetBinContent(ix, iy) ;
242 if (binContent < 1.2 && binContent > 0.8)
246 rv = NGoodTower/nTot ;
247 printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
251 fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));
254 // 2 lines text info for quality
255 fText->SetFillColor(2) ;
256 fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!"));
260 fText->SetFillColor(3) ;
261 fText->AddText(Form("EMCAL = OK, ENJOY..."));
263 //hdata->Reset("ICE");
264 //ratio->Reset("ICE");
267 } //finish the checking
270 //______________________________________________________________________________
271 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
273 /// intialises QA and QA checker settings
274 AliQAv1::Instance(det) ;
275 Float_t hiValue[AliQAv1::kNBIT] ;
276 Float_t lowValue[AliQAv1::kNBIT] ;
277 lowValue[AliQAv1::kINFO] = 0.0 ;
278 hiValue[AliQAv1::kINFO] = 0.1 ;
279 lowValue[AliQAv1::kWARNING] = 0.1 ;
280 hiValue[AliQAv1::kWARNING] = 0.5 ;
281 lowValue[AliQAv1::kERROR] = 0.5 ;
282 hiValue[AliQAv1::kERROR] = 0.8 ;
283 lowValue[AliQAv1::kFATAL] = 0.8 ;
284 hiValue[AliQAv1::kFATAL] = 1.0 ;
285 SetHiLo(&hiValue[0], &lowValue[0]) ;