]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALQAChecker.cxx
Coverity 18262 solved by non-implemented private copy constructor and assignment...
[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   fTextSM[5]= new TText(20, 132,"SM A5");
71
72   fTextSM[6]= new TText(64, 12, "SM C0");
73   fTextSM[7]= new TText(64, 36, "SM C1");
74   fTextSM[8]= new TText(64, 60, "SM C2");
75   fTextSM[9]= new TText(64, 84, "SM C3");
76   fTextSM[10]= new TText(64, 108,"SM C4");
77   fTextSM[11]= new TText(64, 132,"SM C5");
78
79         for(int i = 0; i < 5; i++) {
80                 fLineRow[i] = new TLine(-0.5,23.5+(24*i),95.5,23.5+(24*i));
81                 fLineRow[i]->SetLineColor(1);
82                 fLineRow[i]->SetLineWidth(2);
83         }
84
85
86 }          
87
88 //__________________________________________________________________
89 AliEMCALQAChecker::~AliEMCALQAChecker() 
90 {
91         /// dtor
92   delete [] fTextSM ;
93   delete fLineCol ;
94   for (Int_t i=0; i<5; ++i) delete fLineRow[i] ;
95   delete fText  ; 
96 }
97
98 //______________________________________________________________________________
99 void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
100 {
101         /// Check objects in list
102         
103         if ( index == AliQAv1::kRAW ) 
104         {
105     CheckRaws(test, list);
106                 printf ("checkers for task %d \n", index) ;             
107         }
108         
109         if ( index == AliQAv1::kREC)
110         {
111     CheckRecPoints(test, list);
112         }
113         
114         if ( index == AliQAv1::kESD )
115         {
116     CheckESD(test, list);
117         }
118         AliWarning(Form("Checker for task %d not implement for the moment",index));
119 }
120
121 //______________________________________________________________________________
122 TH1* 
123 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
124 {
125         /// Get a given histo from the list
126         TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
127         if (!h)
128         {
129                 AliError(Form("Did not find expected histo %s",hname));
130         }
131         return h;
132 }
133
134 //______________________________________________________________________________
135 Double_t 
136 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
137 {
138         /// Mark histo as originator of some QA error/warning
139         
140         if ( value != 1.0 )
141         {
142                 histo.SetBit(AliQAv1::GetQABit());
143         }
144         
145         return value;
146 }
147
148
149 //______________________________________________________________________________
150 void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
151 {
152   //  Check RAW QA histograms   
153   //  -- Yaxian Mao, CCNU/CERN/LPSC
154   //adding new checking method: 25/04/2010, Yaxian Mao
155   //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
156   //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted. 
157   
158                                 
159   //Float_t kThreshold = 80. ; 
160   Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
161   Double_t nTot = fgknSM * nTowersPerSM ;
162   TList *lstF = 0;
163   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
164     test[specie] = 0.0 ; 
165     if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) 
166       continue ; 
167     if (list[specie]->GetEntries() == 0)  
168       test[specie] = 0. ; // nothing to check
169     else {
170       TH2F * hdata  = (TH2F*)list[specie]->At(k2DRatioAmp) ; 
171       TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
172       if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
173         continue;
174       //adding the lines to distinguish different SMs
175       lstF = hdata->GetListOfFunctions();
176       { // RS: clean list of functions
177         if (lstF) {
178           TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
179           TObject *obj;
180           while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
181           if (stats) lstF->Add(stats);
182         }
183         else {
184           AliWarning(Form("Checker : empty list of data functions; returning"));
185           return;
186         }
187       }
188       lstF->Add(fLineCol->Clone()); 
189       for(Int_t iLine = 0; iLine < 4; iLine++) {
190         lstF->Add(fLineRow[iLine]->Clone());
191       } 
192       //Now adding the text to for each SM
193       for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){  //number of SMs loop start
194         lstF->Add(fTextSM[iSM]->Clone()); 
195       }
196       //
197       lstF = ratio->GetListOfFunctions();
198       { // RS: clean list of functions
199         if (lstF) {
200           TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats);
201           TObject *obj;
202           while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; }
203           if (stats) lstF->Add(stats);
204         }
205         else {
206           AliWarning(Form("Checker : empty list of ratio functions; returning"));
207           return;
208         } 
209       }
210       //
211       //now check the ratio histogram
212       Double_t binContent = 0. ;  
213       Int_t NGoodTower = 0 ;
214       Double_t rv = 0. ;
215       for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
216         for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
217           binContent = hdata->GetBinContent(ix, iy) ; 
218           if (binContent < 1.2 && binContent > 0.8) 
219             NGoodTower++ ;
220         }
221       }
222       rv = NGoodTower/nTot ; 
223       printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
224       if(fText){
225         lstF->Add(fText->Clone()) ;
226         fText->Clear() ; 
227         
228         fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));     
229         if (rv < 0.9) {
230           test[specie] = 0.9 ;
231           // 2 lines text info for quality         
232           fText->SetFillColor(2) ;
233           fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); 
234         }
235         else {
236           test[specie] = 0.1 ;
237           fText->SetFillColor(3) ;
238           fText->AddText(Form("EMCAL = OK, ENJOY...")); 
239         }
240         //hdata->Reset("ICE");
241         //ratio->Reset("ICE");
242       }//fText
243     } 
244   } //finish the checking
245 }
246
247 //______________________________________________________________________________
248 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) 
249 {
250         /// intialises QA and QA checker settings
251         AliQAv1::Instance(det) ; 
252         Float_t hiValue[AliQAv1::kNBIT] ; 
253         Float_t lowValue[AliQAv1::kNBIT] ;
254         lowValue[AliQAv1::kINFO]      = 0.0   ; 
255         hiValue[AliQAv1::kINFO]       = 0.1 ; 
256         lowValue[AliQAv1::kWARNING]   = 0.1 ; 
257   hiValue[AliQAv1::kWARNING]    = 0.5 ; 
258         lowValue[AliQAv1::kERROR]     = 0.5   ; 
259         hiValue[AliQAv1::kERROR]      = 0.8 ; 
260         lowValue[AliQAv1::kFATAL]     = 0.8   ; 
261         hiValue[AliQAv1::kFATAL]      = 1.0 ; 
262         SetHiLo(&hiValue[0], &lowValue[0]) ; 
263 }
264