new monitoring and checker
[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 (list[specie]->GetEntries() == 0){
109       test[specie] = 1. ; // nothing to check
110     }
111     else {
112       if (index == AliQAv1::kRAW && AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib)
113        //      if (index == AliQAv1::kRAW )
114         {
115           test[specie] = CheckRaw(list[specie]);
116         }
117       
118        if (index == AliQAv1::kESD && AliRecoParam::Convert(specie) != AliRecoParam::kCalib)
119           test[specie] = CheckESD(list[specie]);
120     }
121   
122   }
123 }
124
125 //--------------------------------------------------------------------------
126 Double_t AliT0QAChecker::CheckRaw(TObjArray *listrec) const
127 {
128    Float_t checkr = 0;
129    
130   TString hname[10];
131    TH1*hdata; 
132    const char *cname;
133    TH1 *fhRawEff[10];
134    Int_t nh=0;
135  
136
137    Int_t nnn[4] = { 420, 458, 459, 460};
138    for (Int_t ir=0; ir<4; ir++)
139      {
140          hdata = (TH1*) listrec->UncheckedAt(nnn[ir]);
141          if(hdata) {
142            cname = hdata->GetName();
143            hname[ir] = cname;
144            fhRawEff[nh] = hdata;
145            nh++;
146          }
147     }
148      
149    TLine *linelowyellow = new TLine(0, 0.7, 24, 0.7);    
150    linelowyellow->SetLineColor(5);
151    linelowyellow->SetLineStyle(3);
152    linelowyellow->SetLineWidth(4);
153    TLine *linelowred = new TLine(0, 0.2, 24, 0.2);    
154    linelowred->SetLineColor(2);
155    linelowred->SetLineStyle(3);
156    linelowred->SetLineWidth(4);
157
158    Float_t thryell = 0.7;
159    //   TPaveText* text = new TPaveText(0.30,0.50,0.99,0.99,"NDC");    
160    Float_t thrred = 0.2;
161    Float_t chcont =0;
162     for (Int_t ih= 0; ih<4; ih++)
163      { 
164        fhRawEff[ih]->SetLineWidth(2);
165        fhRawEff[ih]->SetMaximum(2.);
166        fhRawEff[ih]->SetMinimum(0.);
167        fhRawEff[ih]->GetListOfFunctions()->Add(linelowyellow);
168        fhRawEff[ih]->GetListOfFunctions()->Add(linelowred);
169
170        Int_t nbins= fhRawEff[ih]->GetNbinsX();
171        Bool_t yell = kFALSE;
172        Bool_t red = kFALSE;
173        for (Int_t in=1; in<nbins-1; in++)
174          {
175            if(ih==0 && in==5) continue;
176            chcont=fhRawEff[ih]->GetBinContent(in);
177            if (chcont < thryell  ) yell = kTRUE;
178            if (chcont < thrred  ) red = kTRUE;
179          }
180        
181        if (! yell && !red) {
182          AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s  is good", fhRawEff[ih]->GetName() ));
183          checkr=1.;
184          //      text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
185          //      text->AddText(Form(" No problems "));
186          //      text->SetFillColor(3);
187        }
188        
189        if(red ) {
190          checkr = 0.;
191          AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s  is not so good", fhRawEff[ih]->GetName() ));
192          //      text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
193          //      text->AddText(Form("Very serious problem, call expert "));
194          //      text->SetFillColor(2);
195        }
196        
197        if ( yell && !red) {
198          AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s  is not so good", fhRawEff[ih]->GetName() ));
199          checkr=0.75;
200          //      text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
201          //      text->AddText(Form("Some problems "));
202          //      text->SetFillColor(5);
203       }
204        // fhRawEff[ih]->GetListOfFunctions()->Add(text);        
205
206      }
207   return checkr;
208   
209 }
210
211
212 //--------------------------------------------------------------------------
213 Double_t AliT0QAChecker::CheckESD(TObjArray *listrec ) const
214 {
215   Float_t checkr = 0;
216   TH1 *fhESD;
217  
218   fhESD  = (TH1*) listrec->UncheckedAt(2);
219   if(fhESD){
220     AliDebug(AliQAv1::GetQADebugLevel(), Form("count %s ", fhESD->GetName()) );
221      TF1 *f1 = new TF1("f1","gaus",-1,1);
222     fhESD->Fit("f1","R","Q", -1,1);
223     Double_t par[3];
224     f1->GetParameters(&par[0]);
225     
226     TPaveText* text = new TPaveText(0.30,0.50,0.99,0.99,"NDC");
227     
228     text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
229     
230     printf("numentries %f mean %f #sigma %f ", fhESD->GetEntries(), par[2], par[2]);
231     AliDebug(AliQAv1::GetQADebugLevel(), Form("numentries %d mean %f  #sigma %f", fhESD->GetEntries(),par[1], par[2]));
232     
233     
234     if (par[2] > 0.07 && par[2] < 1.) {
235       checkr=0.5;
236        text->AddText(Form("not good resolution :\n %f ns\n", par[2] ));
237        text->SetFillColor(5);
238        printf("T0 detector resolution is not good enouph: %f ns\n",par[2] );
239     }
240     if(TMath::Abs(par[1])>0.05) {
241       checkr = 0.5;
242       text->AddText(Form(" Check clock shift on %f ns", par[1]));
243       text->SetFillColor(5);
244     }
245     if (par[2] >  1. || TMath::Abs(par[1])>0.1) {
246       checkr = 0.25;
247       text->AddText(Form(" Bad resolution:\n mean %f ns sigma %f ns", par[1], par[2]));
248       text->SetFillColor(2);
249       
250       fhESD->GetListOfFunctions()->Add(text);   
251       printf("Please, repeate calibration: shift= %f resolution %f test=%f\n",
252              par[1], par[2], checkr );
253        AliDebug(AliQAv1::GetQADebugLevel(),
254                 Form("Please, check calibration: shift= %f resolution %f test=%f\n",
255                      par[1], par[2], checkr) ) ; 
256     }
257   }
258   else
259     {
260       AliDebug(AliQAv1::GetQADebugLevel(),
261                Form("No ESD QA histogram found, nothing to check"));
262         checkr=0;
263     }
264   
265   
266   return checkr;
267 }