reverting coverity fix
[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   fTextSM  = new TText*[fknSM] ;
116   fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ; 
117   fText    = new TPaveText(0.2,0.7,0.8,0.9,"NDC") ;
118   for (Int_t sm = 0 ; sm < fknSM ; sm++){
119     fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
120   }
121         for(Int_t i = 0; i < 4; i++) {
122
123                 fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ; 
124         }
125   return *this ;
126 }
127
128 //______________________________________________________________________________
129 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
130 {
131         /// Check objects in list
132         
133         if ( index == AliQAv1::kRAW ) 
134         {
135     CheckRaws(test, list);
136                 printf ("checkers for task %d \n", index) ;             
137         }
138         
139         if ( index == AliQAv1::kREC)
140         {
141     CheckRecPoints(test, list);
142         }
143         
144         if ( index == AliQAv1::kESD )
145         {
146     CheckESD(test, list);
147         }
148         AliWarning(Form("Checker for task %d not implement for the moment",index));
149 }
150
151 //______________________________________________________________________________
152 TH1* 
153 AliEMCALQAChecker::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 //______________________________________________________________________________
165 Double_t 
166 AliEMCALQAChecker::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 //______________________________________________________________________________
180 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
181 {
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. 
187   
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 ;
192   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
193     test[specie] = 0.0 ; 
194     if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) 
195       continue ; 
196     if (list[specie]->GetEntries() == 0)  
197       test[specie] = 0. ; // nothing to check
198     else {
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); 
206                                 for(Int_t iLine = 0; iLine < 4; iLine++) {
207                                         hdata->GetListOfFunctions()->Add(fLineRow[iLine]);
208                                 } 
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       }   
214       if ( ratio->GetListOfFunctions()->GetEntries() == 0 ){ //adding the object at the beginning
215         ratio->GetListOfFunctions()->Add(fText) ;
216       }
217
218       //now check the ratio histogram
219       Double_t binContent = 0. ;  
220       Int_t NGoodTower = 0 ;
221       Double_t rv = 0. ;
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++ ;
227         }
228       }
229       rv = NGoodTower/nTot ; 
230       printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
231       if(fText){
232         fText->Clear() ; 
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
249      } 
250     } //finish the checking
251 }
252
253 //______________________________________________________________________________
254 void 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 ; 
262         lowValue[AliQAv1::kWARNING]   = 0.1 ; 
263   hiValue[AliQAv1::kWARNING]    = 0.5 ; 
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 }
270