Update mini-task with big output flag and add current status macros
[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"),
38986b78 57fTextSM(new TText*[fknSM]),
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()),
38986b78 99fTextSM(new TText*[fknSM]) ,
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
9e47432c 104 for (Int_t sm = 0 ; sm < fknSM ; 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)
9e47432c 114{
38986b78 115 fTextSM = new TText*[fknSM] ;
116 fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ;
00957c37 117 fText = new TPaveText(0.2,0.7,0.8,0.9,"NDC") ;
9e47432c 118 for (Int_t sm = 0 ; sm < fknSM ; sm++){
38986b78 119 fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
9e47432c 120 }
8a38cd34 121 for(Int_t i = 0; i < 4; i++) {
122
123 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ;
124 }
9e47432c 125 return *this ;
126}
127
128//______________________________________________________________________________
a42ceb0e 129void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
9e47432c 130{
131 /// Check objects in list
132
133 if ( index == AliQAv1::kRAW )
134 {
a42ceb0e 135 CheckRaws(test, list);
9e47432c 136 printf ("checkers for task %d \n", index) ;
137 }
138
139 if ( index == AliQAv1::kREC)
140 {
a42ceb0e 141 CheckRecPoints(test, list);
9e47432c 142 }
143
144 if ( index == AliQAv1::kESD )
145 {
a42ceb0e 146 CheckESD(test, list);
9e47432c 147 }
148 AliWarning(Form("Checker for task %d not implement for the moment",index));
9e47432c 149}
150
151//______________________________________________________________________________
152TH1*
153AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
154{
155 /// Get a given histo from the list
156 TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
157 if (!h)
158 {
159 AliError(Form("Did not find expected histo %s",hname));
160 }
161 return h;
162}
163
164//______________________________________________________________________________
165Double_t
166AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
167{
168 /// Mark histo as originator of some QA error/warning
169
170 if ( value != 1.0 )
171 {
172 histo.SetBit(AliQAv1::GetQABit());
173 }
174
175 return value;
176}
177
178
179//______________________________________________________________________________
a42ceb0e 180void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
9e47432c 181{
f05c8877 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.
6a754398 187
38986b78 188
189 //Float_t kThreshold = 80. ;
190 Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
191 Double_t nTot = fknSM * nTowersPerSM ;
a2655076 192 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
a42ceb0e 193 test[specie] = 0.0 ;
a2655076 194 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie))
195 continue ;
196 if (list[specie]->GetEntries() == 0)
a42ceb0e 197 test[specie] = 0. ; // nothing to check
a2655076 198 else {
38986b78 199 TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ;
200 TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
201 if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
202 continue;
203 //adding the lines to distinguish different SMs
204 if ( hdata->GetListOfFunctions()->GetEntries() == 0 ){
205 hdata->GetListOfFunctions()->Add(fLineCol);
8a38cd34 206 for(Int_t iLine = 0; iLine < 4; iLine++) {
207 hdata->GetListOfFunctions()->Add(fLineRow[iLine]);
208 }
38986b78 209 //Now adding the text to for each SM
210 for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){ //number of SMs loop start
211 hdata->GetListOfFunctions()->Add(fTextSM[iSM]);
212 }
213 }
00957c37 214 if ( ratio->GetListOfFunctions()->GetEntries() == 0 ){ //adding the object at the beginning
f05c8877 215 ratio->GetListOfFunctions()->Add(fText) ;
216 }
38986b78 217
218 //now check the ratio histogram
219 Double_t binContent = 0. ;
220 Int_t NGoodTower = 0 ;
f05c8877 221 Double_t rv = 0. ;
38986b78 222 for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
223 for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
224 binContent = hdata->GetBinContent(ix, iy) ;
225 if (binContent < 1.2 && binContent > 0.8)
226 NGoodTower++ ;
6a754398 227 }
6a754398 228 }
38986b78 229 rv = NGoodTower/nTot ;
f05c8877 230 printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
231 if(fText){
f05c8877 232 fText->Clear() ;
7e1d9a9b 233
234 fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));
235 if (rv < 0.9) {
236 test[specie] = 0.9 ;
237 // 2 lines text info for quality
238 fText->SetFillColor(2) ;
239 fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!"));
240 }
241 else {
242 test[specie] = 0.1 ;
243 fText->SetFillColor(3) ;
244 fText->AddText(Form("EMCAL = OK, ENJOY..."));
245 }
246 //hdata->Reset("ICE");
247 //ratio->Reset("ICE");
248 }//fText
38986b78 249 }
250 } //finish the checking
9e47432c 251}
252
253//______________________________________________________________________________
254void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
255{
256 /// intialises QA and QA checker settings
257 AliQAv1::Instance(det) ;
258 Float_t hiValue[AliQAv1::kNBIT] ;
259 Float_t lowValue[AliQAv1::kNBIT] ;
260 lowValue[AliQAv1::kINFO] = 0.0 ;
261 hiValue[AliQAv1::kINFO] = 0.1 ;
9e47432c 262 lowValue[AliQAv1::kWARNING] = 0.1 ;
6a754398 263 hiValue[AliQAv1::kWARNING] = 0.5 ;
9e47432c 264 lowValue[AliQAv1::kERROR] = 0.5 ;
265 hiValue[AliQAv1::kERROR] = 0.8 ;
266 lowValue[AliQAv1::kFATAL] = 0.8 ;
267 hiValue[AliQAv1::kFATAL] = 1.0 ;
268 SetHiLo(&hiValue[0], &lowValue[0]) ;
269}
94594e5d 270