typo
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALQAChecker.cxx
CommitLineData
94594e5d 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/*
17 Checks the quality assurance.
18 By comparing with reference data
19
20 Based on PHOS code written by
21 Y. Schutz CERN July 2007
9e47432c 22
a2655076 23 For the moment we only implement the checking of raw data QA.
24 The checked for ESD and RecPoints will be implemented later.
9e47432c 25
26
9e47432c 27 */
28
94594e5d 29
30// --- ROOT system ---
31#include <TClass.h>
9e47432c 32#include <TH1.h>
33#include <TF1.h>
94594e5d 34#include <TH1I.h>
38986b78 35#include <TH2F.h>
94594e5d 36#include <TIterator.h>
37#include <TKey.h>
38#include <TFile.h>
9e47432c 39#include <TLine.h>
38986b78 40#include <TText.h>
9e47432c 41#include <TPaveText.h>
42#include <TMath.h>
94594e5d 43
44// --- Standard library ---
45
46// --- AliRoot header files ---
47#include "AliLog.h"
4e25ac79 48#include "AliQAv1.h"
94594e5d 49#include "AliQAChecker.h"
50#include "AliEMCALQAChecker.h"
51
52ClassImp(AliEMCALQAChecker)
53
9e47432c 54//__________________________________________________________________
55AliEMCALQAChecker::AliEMCALQAChecker() :
56AliQACheckerBase("EMCAL","EMCAL Quality Assurance Data Maker"),
afae9650 57fTextSM(new TText*[fgknSM]),
8a38cd34 58fLineCol(new TLine(47.5,-0.5,47.5,119.5)),
00957c37 59fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC"))
9e47432c 60{
38986b78 61 // ctor
62 fLineCol->SetLineColor(1);
63 fLineCol->SetLineWidth(2);
38986b78 64
65 fTextSM[0]= new TText(20, 12, "SM A0");
8a38cd34 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
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");
76
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);
81 }
82
83
9e47432c 84}
85
86//__________________________________________________________________
87AliEMCALQAChecker::~AliEMCALQAChecker()
88{
89 /// dtor
38986b78 90 delete [] fTextSM ;
a42ceb0e 91 delete fLineCol ;
b08d5260 92 for (Int_t i=0; i<4; ++i) delete fLineRow[i] ;
a42ceb0e 93 delete fText ;
9e47432c 94}
95
96//__________________________________________________________________
97AliEMCALQAChecker::AliEMCALQAChecker(const AliEMCALQAChecker& qac) :
98AliQACheckerBase(qac.GetName(), qac.GetTitle()),
afae9650 99fTextSM(new TText*[fgknSM]) ,
38986b78 100fLineCol(static_cast<TLine*>(qac.fLineCol->Clone())) ,
00957c37 101fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC"))
9e47432c 102{
38986b78 103 // copy ctor
afae9650 104 for (Int_t sm = 0 ; sm < fgknSM ; sm++){
38986b78 105 fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
9e47432c 106 }
8a38cd34 107 for(Int_t i = 0 ; i < 4 ; i++) {
a42ceb0e 108
8a38cd34 109 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ;
110 }
9e47432c 111}
112//__________________________________________________________________
38986b78 113AliEMCALQAChecker& AliEMCALQAChecker::operator = (const AliEMCALQAChecker &qac)
dab4328c 114{ // assignment operator; use copy ctor
115 if (&qac == this) return *this;
8a38cd34 116
dab4328c 117 new (this) AliEMCALQAChecker(qac);
118 return *this;
9e47432c 119}
120
121//______________________________________________________________________________
a42ceb0e 122void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
9e47432c 123{
124 /// Check objects in list
125
126 if ( index == AliQAv1::kRAW )
127 {
a42ceb0e 128 CheckRaws(test, list);
9e47432c 129 printf ("checkers for task %d \n", index) ;
130 }
131
132 if ( index == AliQAv1::kREC)
133 {
a42ceb0e 134 CheckRecPoints(test, list);
9e47432c 135 }
136
137 if ( index == AliQAv1::kESD )
138 {
a42ceb0e 139 CheckESD(test, list);
9e47432c 140 }
141 AliWarning(Form("Checker for task %d not implement for the moment",index));
9e47432c 142}
143
144//______________________________________________________________________________
145TH1*
146AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
147{
148 /// Get a given histo from the list
149 TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
150 if (!h)
151 {
152 AliError(Form("Did not find expected histo %s",hname));
153 }
154 return h;
155}
156
157//______________________________________________________________________________
158Double_t
159AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
160{
161 /// Mark histo as originator of some QA error/warning
162
163 if ( value != 1.0 )
164 {
165 histo.SetBit(AliQAv1::GetQABit());
166 }
167
168 return value;
169}
170
171
172//______________________________________________________________________________
a42ceb0e 173void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
9e47432c 174{
f05c8877 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.
6a754398 180
38986b78 181
182 //Float_t kThreshold = 80. ;
183 Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
afae9650 184 Double_t nTot = fgknSM * nTowersPerSM ;
180c431b 185 TList *lstF = 0;
a2655076 186 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
a42ceb0e 187 test[specie] = 0.0 ;
a2655076 188 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie))
189 continue ;
190 if (list[specie]->GetEntries() == 0)
a42ceb0e 191 test[specie] = 0. ; // nothing to check
a2655076 192 else {
38986b78 193 TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ;
194 TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
195 if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
196 continue;
197 //adding the lines to distinguish different SMs
180c431b 198 lstF = hdata->GetListOfFunctions();
199 { // RS: clean list of functions
200 if (lstF) {
201 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
202 TObject *obj;
203 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
204 if (stats) lstF->Add(stats);
9ae19208 205 }
206 else {
207 AliWarning(Form("Checker : empty list of data functions; returning"));
208 return;
209 }
f05c8877 210 }
180c431b 211 lstF->Add(fLineCol->Clone());
212 for(Int_t iLine = 0; iLine < 4; iLine++) {
213 lstF->Add(fLineRow[iLine]->Clone());
214 }
215 //Now adding the text to for each SM
afae9650 216 for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){ //number of SMs loop start
180c431b 217 lstF->Add(fTextSM[iSM]->Clone());
218 }
219 //
220 lstF = ratio->GetListOfFunctions();
221 { // RS: clean list of functions
222 if (lstF) {
223 TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
224 TObject *obj;
225 while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
226 if (stats) lstF->Add(stats);
9ae19208 227 }
228 else {
229 AliWarning(Form("Checker : empty list of ratio functions; returning"));
230 return;
180c431b 231 }
232 }
233 lstF->Add(fText->Clone()) ;
234 //
38986b78 235 //now check the ratio histogram
236 Double_t binContent = 0. ;
237 Int_t NGoodTower = 0 ;
f05c8877 238 Double_t rv = 0. ;
38986b78 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)
243 NGoodTower++ ;
6a754398 244 }
6a754398 245 }
38986b78 246 rv = NGoodTower/nTot ;
f05c8877 247 printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
248 if(fText){
f05c8877 249 fText->Clear() ;
7e1d9a9b 250
251 fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));
252 if (rv < 0.9) {
253 test[specie] = 0.9 ;
254 // 2 lines text info for quality
255 fText->SetFillColor(2) ;
256 fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!"));
257 }
258 else {
259 test[specie] = 0.1 ;
260 fText->SetFillColor(3) ;
261 fText->AddText(Form("EMCAL = OK, ENJOY..."));
262 }
263 //hdata->Reset("ICE");
264 //ratio->Reset("ICE");
265 }//fText
180c431b 266 }
267 } //finish the checking
9e47432c 268}
269
270//______________________________________________________________________________
271void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
272{
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 ;
9e47432c 279 lowValue[AliQAv1::kWARNING] = 0.1 ;
6a754398 280 hiValue[AliQAv1::kWARNING] = 0.5 ;
9e47432c 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]) ;
286}
94594e5d 287