attempt to address new coverity reports for AliCalo stuff and QA checker
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALQAChecker.cxx
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
22
23  For the moment we only implement the checking of raw data QA.
24  The checked for ESD and RecPoints will be implemented later.
25  
26
27  */
28
29
30 // --- ROOT system ---
31 #include <TClass.h>
32 #include <TH1.h> 
33 #include <TF1.h> 
34 #include <TH1I.h> 
35 #include <TH2F.h>
36 #include <TIterator.h> 
37 #include <TKey.h> 
38 #include <TFile.h> 
39 #include <TLine.h>
40 #include <TText.h>
41 #include <TPaveText.h>
42 #include <TMath.h>
43
44 // --- Standard library ---
45
46 // --- AliRoot header files ---
47 #include "AliLog.h"
48 #include "AliQAv1.h"
49 #include "AliQAChecker.h"
50 #include "AliEMCALQAChecker.h"
51
52 ClassImp(AliEMCALQAChecker)
53
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"))
60 {
61   // ctor
62   fLineCol->SetLineColor(1);
63   fLineCol->SetLineWidth(2);
64
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
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
84 }          
85
86 //__________________________________________________________________
87 AliEMCALQAChecker::~AliEMCALQAChecker() 
88 {
89         /// dtor
90   delete [] fTextSM ;
91   delete fLineCol ;
92   for (Int_t i=0; i<4; ++i) delete fLineRow[i] ;
93   delete fText  ; 
94 }
95
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"))
102 {
103    // copy ctor 
104   for (Int_t sm = 0 ; sm < fknSM ; sm++){
105     fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
106   }
107         for(Int_t i = 0 ; i < 4 ; i++) {
108
109                 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ; 
110         }
111 }   
112 //__________________________________________________________________
113 AliEMCALQAChecker& AliEMCALQAChecker::operator = (const AliEMCALQAChecker &qac) 
114 {
115   AliQACheckerBase(qac.GetName(), qac.GetTitle()); 
116   fTextSM  = new TText*[fknSM] ;
117   fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ; 
118   fText    = new TPaveText(0.2,0.7,0.8,0.9,"NDC") ;
119   for (Int_t sm = 0 ; sm < fknSM ; sm++){
120     fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
121   }
122         for(Int_t i = 0; i < 4; i++) {
123
124                 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ; 
125         }
126   return *this ;
127 }
128
129 //______________________________________________________________________________
130 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
131 {
132         /// Check objects in list
133         
134         if ( index == AliQAv1::kRAW ) 
135         {
136     CheckRaws(test, list);
137                 printf ("checkers for task %d \n", index) ;             
138         }
139         
140         if ( index == AliQAv1::kREC)
141         {
142     CheckRecPoints(test, list);
143         }
144         
145         if ( index == AliQAv1::kESD )
146         {
147     CheckESD(test, list);
148         }
149         AliWarning(Form("Checker for task %d not implement for the moment",index));
150 }
151
152 //______________________________________________________________________________
153 TH1* 
154 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
155 {
156         /// Get a given histo from the list
157         TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
158         if (!h)
159         {
160                 AliError(Form("Did not find expected histo %s",hname));
161         }
162         return h;
163 }
164
165 //______________________________________________________________________________
166 Double_t 
167 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
168 {
169         /// Mark histo as originator of some QA error/warning
170         
171         if ( value != 1.0 )
172         {
173                 histo.SetBit(AliQAv1::GetQABit());
174         }
175         
176         return value;
177 }
178
179
180 //______________________________________________________________________________
181 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
182 {
183   //  Check RAW QA histograms   
184   //  -- Yaxian Mao, CCNU/CERN/LPSC
185   //adding new checking method: 25/04/2010, Yaxian Mao
186   //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
187   //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted. 
188   
189                                 
190   //Float_t kThreshold = 80. ; 
191   Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
192   Double_t nTot = fknSM * nTowersPerSM ;
193   TList *lstF = 0;
194   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
195     test[specie] = 0.0 ; 
196     if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) 
197       continue ; 
198     if (list[specie]->GetEntries() == 0)  
199       test[specie] = 0. ; // nothing to check
200     else {
201       TH2F * hdata  = (TH2F*)list[specie]->At(k2DRatioAmp) ; 
202       TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
203       if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
204         continue;
205       //adding the lines to distinguish different SMs
206       lstF = hdata->GetListOfFunctions();
207       { // RS: clean list of functions
208         if (lstF) {
209           TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
210           TObject *obj;
211           while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
212           if (stats) lstF->Add(stats);
213         }
214         else {
215           AliWarning(Form("Checker : empty list of data functions; returning"));
216           return;
217         }
218       }
219       lstF->Add(fLineCol->Clone()); 
220       for(Int_t iLine = 0; iLine < 4; iLine++) {
221         lstF->Add(fLineRow[iLine]->Clone());
222       } 
223       //Now adding the text to for each SM
224       for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){  //number of SMs loop start
225         lstF->Add(fTextSM[iSM]->Clone()); 
226       }
227       //
228       lstF = ratio->GetListOfFunctions();
229       { // RS: clean list of functions
230         if (lstF) {
231           TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
232           TObject *obj;
233           while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
234           if (stats) lstF->Add(stats);
235         }
236         else {
237           AliWarning(Form("Checker : empty list of ratio functions; returning"));
238           return;
239         } 
240       }
241       lstF->Add(fText->Clone()) ;
242       //
243       //now check the ratio histogram
244       Double_t binContent = 0. ;  
245       Int_t NGoodTower = 0 ;
246       Double_t rv = 0. ;
247       for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
248         for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
249           binContent = hdata->GetBinContent(ix, iy) ; 
250           if (binContent < 1.2 && binContent > 0.8) 
251             NGoodTower++ ;
252         }
253       }
254       rv = NGoodTower/nTot ; 
255       printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
256       if(fText){
257         fText->Clear() ; 
258         
259         fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));     
260         if (rv < 0.9) {
261           test[specie] = 0.9 ;
262           // 2 lines text info for quality         
263           fText->SetFillColor(2) ;
264           fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); 
265         }
266         else {
267           test[specie] = 0.1 ;
268           fText->SetFillColor(3) ;
269           fText->AddText(Form("EMCAL = OK, ENJOY...")); 
270         }
271         //hdata->Reset("ICE");
272         //ratio->Reset("ICE");
273       }//fText
274     } 
275   } //finish the checking
276 }
277
278 //______________________________________________________________________________
279 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) 
280 {
281         /// intialises QA and QA checker settings
282         AliQAv1::Instance(det) ; 
283         Float_t hiValue[AliQAv1::kNBIT] ; 
284         Float_t lowValue[AliQAv1::kNBIT] ;
285         lowValue[AliQAv1::kINFO]      = 0.0   ; 
286         hiValue[AliQAv1::kINFO]       = 0.1 ; 
287         lowValue[AliQAv1::kWARNING]   = 0.1 ; 
288   hiValue[AliQAv1::kWARNING]    = 0.5 ; 
289         lowValue[AliQAv1::kERROR]     = 0.5   ; 
290         hiValue[AliQAv1::kERROR]      = 0.8 ; 
291         lowValue[AliQAv1::kFATAL]     = 0.8   ; 
292         hiValue[AliQAv1::kFATAL]      = 1.0 ; 
293         SetHiLo(&hiValue[0], &lowValue[0]) ; 
294 }
295