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");
70 fTextSM[5]= new TText(20, 132,"SM A5");
72 fTextSM[6]= new TText(64, 12, "SM C0");
73 fTextSM[7]= new TText(64, 36, "SM C1");
74 fTextSM[8]= new TText(64, 60, "SM C2");
75 fTextSM[9]= new TText(64, 84, "SM C3");
76 fTextSM[10]= new TText(64, 108,"SM C4");
77 fTextSM[11]= new TText(64, 132,"SM C5");
79 for(int i = 0; i < 5; i++) {
80 fLineRow[i] = new TLine(-0.5,23.5+(24*i),95.5,23.5+(24*i));
81 fLineRow[i]->SetLineColor(1);
82 fLineRow[i]->SetLineWidth(2);
88 //__________________________________________________________________
89 AliEMCALQAChecker::~AliEMCALQAChecker()
94 for (Int_t i=0; i<5; ++i) delete fLineRow[i] ;
98 //______________________________________________________________________________
99 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
101 /// Check objects in list
103 if ( index == AliQAv1::kRAW )
105 CheckRaws(test, list);
106 printf ("checkers for task %d \n", index) ;
109 if ( index == AliQAv1::kREC)
111 CheckRecPoints(test, list);
114 if ( index == AliQAv1::kESD )
116 CheckESD(test, list);
118 AliWarning(Form("Checker for task %d not implement for the moment",index));
121 //______________________________________________________________________________
123 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
125 /// Get a given histo from the list
126 TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
129 AliError(Form("Did not find expected histo %s",hname));
134 //______________________________________________________________________________
136 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
138 /// Mark histo as originator of some QA error/warning
142 histo.SetBit(AliQAv1::GetQABit());
149 //______________________________________________________________________________
150 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
152 // Check RAW QA histograms
153 // -- Yaxian Mao, CCNU/CERN/LPSC
154 //adding new checking method: 25/04/2010, Yaxian Mao
155 //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
156 //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted.
159 //Float_t kThreshold = 80. ;
160 Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
161 Double_t nTot = fgknSM * nTowersPerSM ;
163 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
165 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie))
167 if (list[specie]->GetEntries() == 0)
168 test[specie] = 0. ; // nothing to check
170 TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ;
171 TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
172 if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
174 //adding the lines to distinguish different SMs
175 lstF = hdata->GetListOfFunctions();
176 { // RS: clean list of functions
178 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
180 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
181 if (stats) lstF->Add(stats);
184 AliWarning(Form("Checker : empty list of data functions; returning"));
188 lstF->Add(fLineCol->Clone());
189 for(Int_t iLine = 0; iLine < 4; iLine++) {
190 lstF->Add(fLineRow[iLine]->Clone());
192 //Now adding the text to for each SM
193 for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){ //number of SMs loop start
194 lstF->Add(fTextSM[iSM]->Clone());
197 lstF = ratio->GetListOfFunctions();
198 { // RS: clean list of functions
200 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
202 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
203 if (stats) lstF->Add(stats);
206 AliWarning(Form("Checker : empty list of ratio functions; returning"));
211 //now check the ratio histogram
212 Double_t binContent = 0. ;
213 Int_t NGoodTower = 0 ;
215 for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
216 for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
217 binContent = hdata->GetBinContent(ix, iy) ;
218 if (binContent < 1.2 && binContent > 0.8)
222 rv = NGoodTower/nTot ;
223 printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
225 lstF->Add(fText->Clone()) ;
228 fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));
231 // 2 lines text info for quality
232 fText->SetFillColor(2) ;
233 fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!"));
237 fText->SetFillColor(3) ;
238 fText->AddText(Form("EMCAL = OK, ENJOY..."));
240 //hdata->Reset("ICE");
241 //ratio->Reset("ICE");
244 } //finish the checking
247 //______________________________________________________________________________
248 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
250 /// intialises QA and QA checker settings
251 AliQAv1::Instance(det) ;
252 Float_t hiValue[AliQAv1::kNBIT] ;
253 Float_t lowValue[AliQAv1::kNBIT] ;
254 lowValue[AliQAv1::kINFO] = 0.0 ;
255 hiValue[AliQAv1::kINFO] = 0.1 ;
256 lowValue[AliQAv1::kWARNING] = 0.1 ;
257 hiValue[AliQAv1::kWARNING] = 0.5 ;
258 lowValue[AliQAv1::kERROR] = 0.5 ;
259 hiValue[AliQAv1::kERROR] = 0.8 ;
260 lowValue[AliQAv1::kFATAL] = 0.8 ;
261 hiValue[AliQAv1::kFATAL] = 1.0 ;
262 SetHiLo(&hiValue[0], &lowValue[0]) ;