Updated checking and display for AMORE (Yves)
[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,47.5)),
59 fLineRow(new TLine(-0.5,23.5,95.5,23.5)),
60 fText(new TPaveText(0.2,1000.,0.7,2000.,"NDC")),
61 fTest(new Double_t[AliRecoParam::kNSpecies])
62 {
63   // ctor
64   fLineCol->SetLineColor(1);
65   fLineCol->SetLineWidth(2);
66   fLineRow->SetLineColor(1);
67   fLineRow->SetLineWidth(2);
68
69   fTextSM[0]= new TText(20, 12, "SM A0");
70   fTextSM[1]= new TText(20, 38, "SM A1");
71   fTextSM[2]= new TText(64, 12, "SM C0");
72   fTextSM[3]= new TText(64, 38, "SM A0");
73
74   for (Int_t sm = 0 ; sm < fknSM ; sm++){
75 //    fLine[sm] = NULL ; 
76 //    fHref[sm] = NULL ; 
77   }
78   for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) {
79    fTest[es] = 1.0 ; 
80   } 
81 }          
82
83 //__________________________________________________________________
84 AliEMCALQAChecker::~AliEMCALQAChecker() 
85 {
86         /// dtor
87 //  delete [] fLine ; 
88 //  delete [] fHref ;
89   delete [] fTextSM ;
90   if (fLineCol)
91     delete fLineCol ;
92   if (fLineRow)
93     delete fLineRow ;
94   if (fText) 
95     delete fText  ; 
96   if (fTest)
97     delete [] fTest ;
98 }
99
100 //__________________________________________________________________
101 AliEMCALQAChecker::AliEMCALQAChecker(const AliEMCALQAChecker& qac) : 
102 AliQACheckerBase(qac.GetName(), qac.GetTitle()), 
103 fTextSM(new TText*[fknSM]) ,
104 fLineCol(static_cast<TLine*>(qac.fLineCol->Clone())) , 
105 fLineRow(static_cast<TLine*>(qac.fLineRow->Clone())) , 
106 fText(new TPaveText(0.2,1000.,0.7,2000.,"NDC")),
107 fTest(new Double_t[AliRecoParam::kNSpecies])
108 {
109    // copy ctor 
110   for (Int_t sm = 0 ; sm < fknSM ; sm++){
111 //    fLine[sm] = new TLine(qac.fLine[sm]) ; 
112 //    fHref[sm] = new TLine(qac.fHref[sm]) ; 
113     fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
114   }
115   for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) {
116    fTest[es] = 0.0 ; 
117   } 
118 }   
119 //__________________________________________________________________
120 AliEMCALQAChecker& AliEMCALQAChecker::operator = (const AliEMCALQAChecker &qac) 
121 {
122   fTextSM  = new TText*[fknSM] ;
123   fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ; 
124   fLineRow = static_cast<TLine*>(qac.fLineRow->Clone()) ; 
125   fText    = new TPaveText(0.2,1000.,0.7,2000.,"NDC") ;
126   fTest    = new Double_t[AliRecoParam::kNSpecies] ;
127   for (Int_t sm = 0 ; sm < fknSM ; sm++){
128     fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ;
129   }
130   for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) {
131    fTest[es] = 0.0 ; 
132   } 
133   return *this ;
134 }
135
136 //______________________________________________________________________________
137 Double_t *
138 AliEMCALQAChecker::Check(AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
139 {
140         /// Check objects in list
141         
142         if ( index == AliQAv1::kRAW ) 
143         {
144                 return CheckRaws(list);
145                 printf ("checkers for task %d \n", index) ;             
146         }
147         
148         if ( index == AliQAv1::kREC)
149         {
150                 return CheckRecPoints(list);
151         }
152         
153         if ( index == AliQAv1::kESD )
154         {
155                 return CheckESD(list);
156         }
157         AliWarning(Form("Checker for task %d not implement for the moment",index));
158         return NULL;
159 }
160
161 //______________________________________________________________________________
162 TH1* 
163 AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
164 {
165         /// Get a given histo from the list
166         TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
167         if (!h)
168         {
169                 AliError(Form("Did not find expected histo %s",hname));
170         }
171         return h;
172 }
173
174 //______________________________________________________________________________
175 Double_t 
176 AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
177 {
178         /// Mark histo as originator of some QA error/warning
179         
180         if ( value != 1.0 )
181         {
182                 histo.SetBit(AliQAv1::GetQABit());
183         }
184         
185         return value;
186 }
187
188
189 //______________________________________________________________________________
190 Double_t * AliEMCALQAChecker::CheckRaws(TObjArray ** list)
191 {
192 //  Check RAW QA histograms     
193 //  We count the times of the response for each tower, the propability for all towers should be the same (average is given value).
194 //  We skip the first few cycles since the statistics is not enough, the average should be always larger than 1 at least.
195 //  By calculating the difference between the counts for each tower and the average, we decide whether we should recalculate 
196 //  the average depending the the gaus fitting on the divation distribution. 
197 //  During the recalutation of the average, we count how many towers are used for the calculation.
198 //  From the fraction of towers used, we decide whether each SM works fine or not
199 //  From the divation of average, we set the QA flag for the full detetcor as INFO, WARNING, ERROR or FATAL.
200   
201 //  -- Yaxian Mao, CCNU/CERN/LPSC
202                                 
203   //Float_t kThreshold = 80. ; 
204   Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
205   Double_t nTot = fknSM * nTowersPerSM ;
206   Double_t rv = 0. ;
207   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
208     if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) 
209       continue ; 
210     if (list[specie]->GetEntries() == 0)  
211       fTest[specie] = 0. ; // nothing to check
212     else {
213       TH2F * hdata  = (TH2F*)list[specie]->At(k2DRatioAmp) ; 
214       TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
215       if(hdata->GetEntries()==0 || ratio->GetEntries()==0)
216         continue;
217       //adding the lines to distinguish different SMs
218       if ( hdata->GetListOfFunctions()->GetEntries() == 0 ){
219         hdata->GetListOfFunctions()->Add(fLineCol); 
220         hdata->GetListOfFunctions()->Add(fLineRow); 
221         //Now adding the text to for each SM
222         for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){  //number of SMs loop start
223           hdata->GetListOfFunctions()->Add(fTextSM[iSM]); 
224         }
225       }   
226       if ( ratio->GetListOfFunctions()->GetEntries() == 0 ){
227         ratio->GetListOfFunctions()->Add(fText) ;
228       }
229
230       //now check the ratio histogram
231       Double_t binContent = 0. ;  
232       Int_t NGoodTower = 0 ;
233       for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
234         for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
235           binContent = hdata->GetBinContent(ix, iy) ; 
236           if (binContent < 1.2 && binContent > 0.8) 
237             NGoodTower++ ;
238         }
239       }
240       rv = NGoodTower/nTot ; 
241       
242       
243       if (rv < 0.9) {
244         fTest[specie] = 0.9 ;
245         // 2 lines text info for quality 
246         fText->Clear() ; 
247         fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100)); 
248         fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); 
249       }
250       else {
251         fTest[specie] = 0.1 ;
252         fText->Clear() ; 
253         fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100)); 
254         fText->AddText(Form("EMCAL = OK")); 
255       }
256      } 
257     } //finish the checking
258    return fTest ; 
259 }
260
261 //______________________________________________________________________________
262 void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) 
263 {
264         /// intialises QA and QA checker settings
265         AliQAv1::Instance(det) ; 
266         Float_t hiValue[AliQAv1::kNBIT] ; 
267         Float_t lowValue[AliQAv1::kNBIT] ;
268         lowValue[AliQAv1::kINFO]      = 0.0   ; 
269         hiValue[AliQAv1::kINFO]       = 0.1 ; 
270         lowValue[AliQAv1::kWARNING]   = 0.1 ; 
271   hiValue[AliQAv1::kWARNING]    = 0.5 ; 
272         lowValue[AliQAv1::kERROR]     = 0.5   ; 
273         hiValue[AliQAv1::kERROR]      = 0.8 ; 
274         lowValue[AliQAv1::kFATAL]     = 0.8   ; 
275         hiValue[AliQAv1::kFATAL]      = 1.0 ; 
276         SetHiLo(&hiValue[0], &lowValue[0]) ; 
277 }
278