]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALQAChecker.cxx
Fix Coverity
[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   new (this) AliEMCALQAChecker(qac);
118   return *this;
119 }
120
121 //______________________________________________________________________________
122 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
123 {
124         /// Check objects in list
125         
126         if ( index == AliQAv1::kRAW ) 
127         {
128     CheckRaws(test, list);
129                 printf ("checkers for task %d \n", index) ;             
130         }
131         
132         if ( index == AliQAv1::kREC)
133         {
134     CheckRecPoints(test, list);
135         }
136         
137         if ( index == AliQAv1::kESD )
138         {
139     CheckESD(test, list);
140         }
141         AliWarning(Form("Checker for task %d not implement for the moment",index));
142 }
143
144 //______________________________________________________________________________
145 TH1* 
146 AliEMCALQAChecker::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 //______________________________________________________________________________
158 Double_t 
159 AliEMCALQAChecker::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 //______________________________________________________________________________
173 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
174 {
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. 
180   
181                                 
182   //Float_t kThreshold = 80. ; 
183   Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
184   Double_t nTot = fgknSM * nTowersPerSM ;
185   TList *lstF = 0;
186   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
187     test[specie] = 0.0 ; 
188     if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) 
189       continue ; 
190     if (list[specie]->GetEntries() == 0)  
191       test[specie] = 0. ; // nothing to check
192     else {
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
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);
205         }
206         else {
207           AliWarning(Form("Checker : empty list of data functions; returning"));
208           return;
209         }
210       }
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
216       for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){  //number of SMs loop start
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);
227         }
228         else {
229           AliWarning(Form("Checker : empty list of ratio functions; returning"));
230           return;
231         } 
232       }
233       lstF->Add(fText->Clone()) ;
234       //
235       //now check the ratio histogram
236       Double_t binContent = 0. ;  
237       Int_t NGoodTower = 0 ;
238       Double_t rv = 0. ;
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++ ;
244         }
245       }
246       rv = NGoodTower/nTot ; 
247       printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
248       if(fText){
249         fText->Clear() ; 
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
266     } 
267   } //finish the checking
268 }
269
270 //______________________________________________________________________________
271 void 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 ; 
279         lowValue[AliQAv1::kWARNING]   = 0.1 ; 
280   hiValue[AliQAv1::kWARNING]    = 0.5 ; 
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 }
287