coverity and RuleChecker viol fixes
[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*[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"))
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*[fgknSM]) ,
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 < fgknSM ; 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 { // assignment operator; use copy ctor
115   if (&qac == this) return *this;
116
117   this->~AliEMCALQAChecker();
118   new (this) AliEMCALQAChecker(qac);
119   return *this;
120 }
121
122 //______________________________________________________________________________
123 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
124 {
125         /// Check objects in list
126         
127         if ( index == AliQAv1::kRAW ) 
128         {
129     CheckRaws(test, list);
130                 printf ("checkers for task %d \n", index) ;             
131         }
132         
133         if ( index == AliQAv1::kREC)
134         {
135     CheckRecPoints(test, list);
136         }
137         
138         if ( index == AliQAv1::kESD )
139         {
140     CheckESD(test, list);
141         }
142         AliWarning(Form("Checker for task %d not implement for the moment",index));
143 }
144
145 //______________________________________________________________________________
146 TH1* 
147 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
148 {
149         /// Get a given histo from the list
150         TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
151         if (!h)
152         {
153                 AliError(Form("Did not find expected histo %s",hname));
154         }
155         return h;
156 }
157
158 //______________________________________________________________________________
159 Double_t 
160 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
161 {
162         /// Mark histo as originator of some QA error/warning
163         
164         if ( value != 1.0 )
165         {
166                 histo.SetBit(AliQAv1::GetQABit());
167         }
168         
169         return value;
170 }
171
172
173 //______________________________________________________________________________
174 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
175 {
176   //  Check RAW QA histograms   
177   //  -- Yaxian Mao, CCNU/CERN/LPSC
178   //adding new checking method: 25/04/2010, Yaxian Mao
179   //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
180   //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted. 
181   
182                                 
183   //Float_t kThreshold = 80. ; 
184   Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
185   Double_t nTot = fgknSM * nTowersPerSM ;
186   TList *lstF = 0;
187   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
188     test[specie] = 0.0 ; 
189     if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) 
190       continue ; 
191     if (list[specie]->GetEntries() == 0)  
192       test[specie] = 0. ; // nothing to check
193     else {
194       TH2F * hdata  = (TH2F*)list[specie]->At(k2DRatioAmp) ; 
195       TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
196       if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
197         continue;
198       //adding the lines to distinguish different SMs
199       lstF = hdata->GetListOfFunctions();
200       { // RS: clean list of functions
201         if (lstF) {
202           TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
203           TObject *obj;
204           while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
205           if (stats) lstF->Add(stats);
206         }
207         else {
208           AliWarning(Form("Checker : empty list of data functions; returning"));
209           return;
210         }
211       }
212       lstF->Add(fLineCol->Clone()); 
213       for(Int_t iLine = 0; iLine < 4; iLine++) {
214         lstF->Add(fLineRow[iLine]->Clone());
215       } 
216       //Now adding the text to for each SM
217       for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){  //number of SMs loop start
218         lstF->Add(fTextSM[iSM]->Clone()); 
219       }
220       //
221       lstF = ratio->GetListOfFunctions();
222       { // RS: clean list of functions
223         if (lstF) {
224           TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
225           TObject *obj;
226           while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
227           if (stats) lstF->Add(stats);
228         }
229         else {
230           AliWarning(Form("Checker : empty list of ratio functions; returning"));
231           return;
232         } 
233       }
234       lstF->Add(fText->Clone()) ;
235       //
236       //now check the ratio histogram
237       Double_t binContent = 0. ;  
238       Int_t NGoodTower = 0 ;
239       Double_t rv = 0. ;
240       for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
241         for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
242           binContent = hdata->GetBinContent(ix, iy) ; 
243           if (binContent < 1.2 && binContent > 0.8) 
244             NGoodTower++ ;
245         }
246       }
247       rv = NGoodTower/nTot ; 
248       printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
249       if(fText){
250         fText->Clear() ; 
251         
252         fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));     
253         if (rv < 0.9) {
254           test[specie] = 0.9 ;
255           // 2 lines text info for quality         
256           fText->SetFillColor(2) ;
257           fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); 
258         }
259         else {
260           test[specie] = 0.1 ;
261           fText->SetFillColor(3) ;
262           fText->AddText(Form("EMCAL = OK, ENJOY...")); 
263         }
264         //hdata->Reset("ICE");
265         //ratio->Reset("ICE");
266       }//fText
267     } 
268   } //finish the checking
269 }
270
271 //______________________________________________________________________________
272 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) 
273 {
274         /// intialises QA and QA checker settings
275         AliQAv1::Instance(det) ; 
276         Float_t hiValue[AliQAv1::kNBIT] ; 
277         Float_t lowValue[AliQAv1::kNBIT] ;
278         lowValue[AliQAv1::kINFO]      = 0.0   ; 
279         hiValue[AliQAv1::kINFO]       = 0.1 ; 
280         lowValue[AliQAv1::kWARNING]   = 0.1 ; 
281   hiValue[AliQAv1::kWARNING]    = 0.5 ; 
282         lowValue[AliQAv1::kERROR]     = 0.5   ; 
283         hiValue[AliQAv1::kERROR]      = 0.8 ; 
284         lowValue[AliQAv1::kFATAL]     = 0.8   ; 
285         hiValue[AliQAv1::kFATAL]      = 1.0 ; 
286         SetHiLo(&hiValue[0], &lowValue[0]) ; 
287 }
288