Changes in QA to be able to process separately different triggers (Ruben)
[u/mrichter/AliRoot.git] / T0 / AliT0QAChecker.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 //  Checks the quality assurance. 
17 //  By comparing with reference data
18 //  Skeleton for T0
19 //---------------------------------------------
20 //checkig without reference data:
21 //for RAW QA all histograms should have approximatly the same 
22 //number of entries as RefPoint
23 //for Rec Points checks 
24 //  - amplitude measured by 2 methos
25 //  - online and offline T0 measurements
26 // for ESD quality of reconstruction ( and measurements):
27 // RMS of vertex and T0 less than 75ps
28 //
29 // Alla.Maevskaya@cern.ch   
30 //...
31
32 // --- ROOT system ---
33 #include <Riostream.h>
34 #include <TClass.h>
35 #include <TH1F.h> 
36 #include <TF1.h> 
37 #include <TFitResultPtr.h>
38 #include <TH2.h> 
39 #include <TIterator.h> 
40 #include <TKey.h> 
41 #include <TFile.h> 
42 #include <TMath.h>
43 #include <TString.h>
44 #include <TPaveText.h>
45
46 // --- Standard library ---
47
48 // --- AliRoot header files ---
49 #include "AliLog.h"
50 #include "AliQAv1.h"
51 #include "AliQAChecker.h"
52 #include "AliCDBEntry.h"
53 #include "AliQAManager.h"
54 #include "AliT0QAChecker.h"
55
56 ClassImp(AliT0QAChecker)
57 //____________________________________________________________________________
58 AliT0QAChecker::AliT0QAChecker() :
59 AliQACheckerBase("T0","T0 Quality Assurance Checker")
60
61 {
62   // Standard constructor
63
64 }
65
66 //____________________________________________________________________________
67 AliT0QAChecker::AliT0QAChecker(const AliT0QAChecker& qac):
68   AliQACheckerBase(qac.GetName(), qac.GetTitle()) 
69 {
70   // copy constructor
71   AliError("Copy should not be used with this class\n");
72 }
73 //____________________________________________________________________________
74 AliT0QAChecker& AliT0QAChecker::operator=(const AliT0QAChecker& qac){
75   // assignment operator
76   this->~AliT0QAChecker();
77   new(this)AliT0QAChecker(qac);
78   return *this;
79 }
80
81
82 //____________________________________________________________________________
83 AliT0QAChecker::~AliT0QAChecker(){
84   // destructor
85
86 }
87
88 //__________________________________________________________________
89 void AliT0QAChecker::Check(Double_t *  test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
90 {
91
92   // Super-basic check on the QA histograms on the input list:
93   // look whether they are empty!
94     
95  char * detOCDBDir = Form("T0/%s/%s", AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName()) ; 
96
97   AliCDBEntry *QARefRec = AliQAManager::QAManager()->Get(detOCDBDir);
98   //  QARefRec->Dump();
99   if( !QARefRec){
100     AliInfo("QA reference data NOT retrieved for Reconstruction check. No T0 reference distribution");
101   }
102   
103   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) 
104     test[specie]    = 10.0 ; 
105
106   for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
107     //  TString dataType = AliQAv1::GetAliTaskName(index);
108     if (!(AliQAv1::Instance()->IsEventSpecieSet(specie) && list[specie]) || list[specie]->GetEntries() == 0) {
109       test[specie] = 1. ; // nothing to check
110       continue;
111     }
112     if (index == AliQAv1::kRAW && AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib)
113       //      if (index == AliQAv1::kRAW )
114       {
115         test[specie] = CheckRaw(list[specie]);
116       }
117     if (index == AliQAv1::kESD && AliRecoParam::Convert(specie) != AliRecoParam::kCalib)
118       test[specie] = CheckESD(list[specie]);
119     //
120   }
121 }
122
123 //--------------------------------------------------------------------------
124 Double_t AliT0QAChecker::CheckRaw(TObjArray *listrec) const
125 {
126    Float_t checkr = 0;
127    
128   TString hname[10];
129    TH1*hdata; 
130    const char *cname;
131    TH1 *fhRawEff[10];
132    Int_t nh=0;
133  
134
135    Int_t nnn[4] = { 420, 458, 459, 460};
136    for (Int_t ir=0; ir<4; ir++)
137      {
138          hdata = (TH1*) listrec->UncheckedAt(nnn[ir]);
139          if(hdata) {
140            cname = hdata->GetName();
141            hname[ir] = cname;
142            fhRawEff[nh] = hdata;
143            nh++;
144          }
145     }
146      
147    TLine *linelowyellow = new TLine(0, 0.7, 24, 0.7);    
148    linelowyellow->SetLineColor(5);
149    linelowyellow->SetLineStyle(3);
150    linelowyellow->SetLineWidth(4);
151    TLine *linelowred = new TLine(0, 0.2, 24, 0.2);    
152    linelowred->SetLineColor(2);
153    linelowred->SetLineStyle(3);
154    linelowred->SetLineWidth(4);
155
156    Float_t thryell = 0.7;
157    //   TPaveText* text = new TPaveText(0.30,0.50,0.99,0.99,"NDC");    
158    Float_t thrred = 0.2;
159    Float_t chcont =0;
160     for (Int_t ih= 0; ih<4; ih++)
161      { 
162        fhRawEff[ih]->SetLineWidth(2);
163        fhRawEff[ih]->SetMaximum(2.);
164        fhRawEff[ih]->SetMinimum(0.);
165        fhRawEff[ih]->GetListOfFunctions()->Add(linelowyellow);
166        fhRawEff[ih]->GetListOfFunctions()->Add(linelowred);
167
168        Int_t nbins= fhRawEff[ih]->GetNbinsX();
169        Bool_t yell = kFALSE;
170        Bool_t red = kFALSE;
171        for (Int_t in=1; in<nbins-1; in++)
172          {
173            if(ih==0 && in==5) continue;
174            chcont=fhRawEff[ih]->GetBinContent(in);
175            if (chcont < thryell  ) yell = kTRUE;
176            if (chcont < thrred  ) red = kTRUE;
177          }
178        
179        if (! yell && !red) {
180          AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s  is good", fhRawEff[ih]->GetName() ));
181          checkr=1.;
182          //      text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
183          //      text->AddText(Form(" No problems "));
184          //      text->SetFillColor(3);
185        }
186        
187        if(red ) {
188          checkr = 0.;
189          AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s  is not so good", fhRawEff[ih]->GetName() ));
190          //      text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
191          //      text->AddText(Form("Very serious problem, call expert "));
192          //      text->SetFillColor(2);
193        }
194        
195        if ( yell && !red) {
196          AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s  is not so good", fhRawEff[ih]->GetName() ));
197          checkr=0.75;
198          //      text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
199          //      text->AddText(Form("Some problems "));
200          //      text->SetFillColor(5);
201       }
202        // fhRawEff[ih]->GetListOfFunctions()->Add(text);        
203
204      }
205   return checkr;
206   
207 }
208
209
210 //--------------------------------------------------------------------------
211 Double_t AliT0QAChecker::CheckESD(TObjArray *listrec ) const
212 {
213   Float_t checkr = 0;
214   TH1 *fhESD;
215  
216   fhESD  = (TH1*) listrec->UncheckedAt(2);
217   if(fhESD){
218     AliDebug(AliQAv1::GetQADebugLevel(), Form("count %s ", fhESD->GetName()) );
219      TF1 *f1 = new TF1("f1","gaus",-1,1);
220     fhESD->Fit("f1","R","Q", -1,1);
221     Double_t par[3];
222     f1->GetParameters(&par[0]);
223     
224     TPaveText* text = new TPaveText(0.30,0.50,0.99,0.99,"NDC");
225     
226     text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
227     
228     AliDebug(AliQAv1::GetQADebugLevel(), Form("numentries %f mean %f  #sigma %f", fhESD->GetEntries(),par[1], par[2]));
229     
230     
231     if (par[2] > 0.07 && par[2] < 1.) {
232       checkr=0.5;
233        text->AddText(Form("not good resolution :\n %f ns\n", par[2] ));
234        text->SetFillColor(5);
235        printf("T0 detector resolution is not good enouph: %f ns\n",par[2] );
236     }
237     if(TMath::Abs(par[1])>0.05) {
238       checkr = 0.5;
239       text->AddText(Form(" Check clock shift on %f ns", par[1]));
240       text->SetFillColor(5);
241     }
242     if (par[2] >  1. || TMath::Abs(par[1])>0.1) {
243       checkr = 0.25;
244       text->AddText(Form(" Bad resolution:\n mean %f ns sigma %f ns", par[1], par[2]));
245       text->SetFillColor(2);
246       
247       fhESD->GetListOfFunctions()->Add(text);   
248        AliDebug(AliQAv1::GetQADebugLevel(),
249                 Form("Please, check calibration: shift= %f resolution %f test=%f\n",
250                      par[1], par[2], checkr) ) ; 
251     }
252   }
253   else
254     {
255       AliDebug(AliQAv1::GetQADebugLevel(),
256                Form("No ESD QA histogram found, nothing to check"));
257         checkr=0;
258     }
259   
260   
261   return checkr;
262 }