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 fTextSM = new TText*[fknSM] ;
116 fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ;
117 fText = new TPaveText(0.2,0.7,0.8,0.9,"NDC") ;
118 for (Int_t sm = 0 ; sm < fknSM ; sm++){
119 fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
121 for(Int_t i = 0; i < 4; i++) {
123 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ;
128 //______________________________________________________________________________
129 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
131 /// Check objects in list
133 if ( index == AliQAv1::kRAW )
135 CheckRaws(test, list);
136 printf ("checkers for task %d \n", index) ;
139 if ( index == AliQAv1::kREC)
141 CheckRecPoints(test, list);
144 if ( index == AliQAv1::kESD )
146 CheckESD(test, list);
148 AliWarning(Form("Checker for task %d not implement for the moment",index));
151 //______________________________________________________________________________
153 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
155 /// Get a given histo from the list
156 TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
159 AliError(Form("Did not find expected histo %s",hname));
164 //______________________________________________________________________________
166 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
168 /// Mark histo as originator of some QA error/warning
172 histo.SetBit(AliQAv1::GetQABit());
179 //______________________________________________________________________________
180 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
182 // Check RAW QA histograms
183 // -- Yaxian Mao, CCNU/CERN/LPSC
184 //adding new checking method: 25/04/2010, Yaxian Mao
185 //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
186 //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted.
189 //Float_t kThreshold = 80. ;
190 Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
191 Double_t nTot = fknSM * nTowersPerSM ;
193 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
195 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie))
197 if (list[specie]->GetEntries() == 0)
198 test[specie] = 0. ; // nothing to check
200 TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ;
201 TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
202 if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
204 //adding the lines to distinguish different SMs
205 lstF = hdata->GetListOfFunctions();
206 { // RS: clean list of functions
208 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
210 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
211 if (stats) lstF->Add(stats);
214 lstF->Add(fLineCol->Clone());
215 for(Int_t iLine = 0; iLine < 4; iLine++) {
216 lstF->Add(fLineRow[iLine]->Clone());
218 //Now adding the text to for each SM
219 for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){ //number of SMs loop start
220 lstF->Add(fTextSM[iSM]->Clone());
223 lstF = ratio->GetListOfFunctions();
224 { // RS: clean list of functions
226 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
228 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
229 if (stats) lstF->Add(stats);
232 lstF->Add(fText->Clone()) ;
234 //now check the ratio histogram
235 Double_t binContent = 0. ;
236 Int_t NGoodTower = 0 ;
238 for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
239 for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
240 binContent = hdata->GetBinContent(ix, iy) ;
241 if (binContent < 1.2 && binContent > 0.8)
245 rv = NGoodTower/nTot ;
246 printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
250 fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));
253 // 2 lines text info for quality
254 fText->SetFillColor(2) ;
255 fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!"));
259 fText->SetFillColor(3) ;
260 fText->AddText(Form("EMCAL = OK, ENJOY..."));
262 //hdata->Reset("ICE");
263 //ratio->Reset("ICE");
266 } //finish the checking
269 //______________________________________________________________________________
270 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
272 /// intialises QA and QA checker settings
273 AliQAv1::Instance(det) ;
274 Float_t hiValue[AliQAv1::kNBIT] ;
275 Float_t lowValue[AliQAv1::kNBIT] ;
276 lowValue[AliQAv1::kINFO] = 0.0 ;
277 hiValue[AliQAv1::kINFO] = 0.1 ;
278 lowValue[AliQAv1::kWARNING] = 0.1 ;
279 hiValue[AliQAv1::kWARNING] = 0.5 ;
280 lowValue[AliQAv1::kERROR] = 0.5 ;
281 hiValue[AliQAv1::kERROR] = 0.8 ;
282 lowValue[AliQAv1::kFATAL] = 0.8 ;
283 hiValue[AliQAv1::kFATAL] = 1.0 ;
284 SetHiLo(&hiValue[0], &lowValue[0]) ;