1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 // Checks the quality assurance.
17 // By comparing with reference data
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
29 // Alla.Maevskaya@cern.ch
32 // --- ROOT system ---
33 #include <Riostream.h>
37 #include <TFitResultPtr.h>
39 #include <TIterator.h>
44 #include <TPaveText.h>
46 // --- Standard library ---
48 // --- AliRoot header files ---
51 #include "AliQAChecker.h"
52 #include "AliCDBEntry.h"
53 #include "AliQAManager.h"
54 #include "AliT0QAChecker.h"
56 ClassImp(AliT0QAChecker)
57 //____________________________________________________________________________
58 AliT0QAChecker::AliT0QAChecker() :
59 AliQACheckerBase("T0","T0 Quality Assurance Checker")
62 // Standard constructor
66 //____________________________________________________________________________
67 AliT0QAChecker::AliT0QAChecker(const AliT0QAChecker& qac):
68 AliQACheckerBase(qac.GetName(), qac.GetTitle())
71 AliError("Copy should not be used with this class\n");
73 //____________________________________________________________________________
74 AliT0QAChecker& AliT0QAChecker::operator=(const AliT0QAChecker& qac){
75 // assignment operator
76 this->~AliT0QAChecker();
77 new(this)AliT0QAChecker(qac);
82 //____________________________________________________________________________
83 AliT0QAChecker::~AliT0QAChecker(){
88 //__________________________________________________________________
89 void AliT0QAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
92 // Super-basic check on the QA histograms on the input list:
93 // look whether they are empty!
95 char * detOCDBDir = Form("T0/%s/%s", AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName()) ;
97 AliCDBEntry *QARefRec = AliQAManager::QAManager()->Get(detOCDBDir);
100 AliInfo("QA reference data NOT retrieved for Reconstruction check. No T0 reference distribution");
103 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
104 test[specie] = 10.0 ;
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
112 if (index == AliQAv1::kRAW && AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib)
113 // if (index == AliQAv1::kRAW )
115 test[specie] = CheckRaw(list[specie]);
117 if (index == AliQAv1::kESD && AliRecoParam::Convert(specie) != AliRecoParam::kCalib)
118 test[specie] = CheckESD(list[specie]);
123 //--------------------------------------------------------------------------
124 Double_t AliT0QAChecker::CheckRaw(TObjArray *listrec) const
135 // Int_t nnn[4] = { 420, 458, 459, 460};
136 Int_t nnn[4] = { 169, 207, 208, 209};
137 for (Int_t ir=0; ir<4; ir++)
139 hdata = (TH1*) listrec->UncheckedAt(nnn[ir]);
141 cname = hdata->GetName();
143 fhRawEff[nh] = hdata;
148 TLine *linelowyellow = new TLine(0, 0.7, 24, 0.7);
149 linelowyellow->SetLineColor(5);
150 linelowyellow->SetLineStyle(3);
151 linelowyellow->SetLineWidth(4);
152 TLine *linelowred = new TLine(0, 0.2, 24, 0.2);
153 linelowred->SetLineColor(2);
154 linelowred->SetLineStyle(3);
155 linelowred->SetLineWidth(4);
157 Float_t thryell = 0.7;
158 // TPaveText* text = new TPaveText(0.30,0.50,0.99,0.99,"NDC");
159 Float_t thrred = 0.2;
161 for (Int_t ih= 0; ih<4; ih++)
163 fhRawEff[ih]->SetLineWidth(2);
164 fhRawEff[ih]->SetMaximum(2.);
165 fhRawEff[ih]->SetMinimum(0.);
166 fhRawEff[ih]->GetListOfFunctions()->Add(linelowyellow);
167 fhRawEff[ih]->GetListOfFunctions()->Add(linelowred);
169 Int_t nbins= fhRawEff[ih]->GetNbinsX();
170 Bool_t yell = kFALSE;
172 for (Int_t in=1; in<nbins-1; in++)
174 if(ih==0 && in==5) continue;
175 chcont=fhRawEff[ih]->GetBinContent(in);
176 if (chcont < thryell ) yell = kTRUE;
177 if (chcont < thrred ) red = kTRUE;
180 if (! yell && !red) {
181 AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s is good", fhRawEff[ih]->GetName() ));
183 // text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
184 // text->AddText(Form(" No problems "));
185 // text->SetFillColor(3);
190 AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s is not so good", fhRawEff[ih]->GetName() ));
191 // text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
192 // text->AddText(Form("Very serious problem, call expert "));
193 // text->SetFillColor(2);
197 AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s is not so good", fhRawEff[ih]->GetName() ));
199 // text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
200 // text->AddText(Form("Some problems "));
201 // text->SetFillColor(5);
203 // fhRawEff[ih]->GetListOfFunctions()->Add(text);
206 delete linelowyellow;
213 //--------------------------------------------------------------------------
214 Double_t AliT0QAChecker::CheckESD(TObjArray *listrec ) const
219 fhESD = (TH1*) listrec->UncheckedAt(2);
221 AliDebug(AliQAv1::GetQADebugLevel(), Form("count %s ", fhESD->GetName()) );
222 TF1 *f1 = new TF1("f1","gaus",-1,1);
223 fhESD->Fit("f1","R","Q", -1,1);
225 f1->GetParameters(&par[0]);
227 TPaveText* text = new TPaveText(0.30,0.50,0.99,0.99,"NDC");
229 text->AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
231 AliDebug(AliQAv1::GetQADebugLevel(), Form("numentries %d mean %f #sigma %f", (int)fhESD->GetEntries(),par[1], par[2]));
234 if (par[2] > 0.07 && par[2] < 1.) {
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] );
240 if(TMath::Abs(par[1])>0.05) {
242 text->AddText(Form(" Check clock shift on %f ns", par[1]));
243 text->SetFillColor(5);
245 if (par[2] > 1. || TMath::Abs(par[1])>0.1) {
247 text->AddText(Form(" Bad resolution:\n mean %f ns sigma %f ns", par[1], par[2]));
248 text->SetFillColor(2);
250 fhESD->GetListOfFunctions()->Add(text);
251 AliDebug(AliQAv1::GetQADebugLevel(),
252 Form("Please, check calibration: shift= %f resolution %f test=%f\n",
253 par[1], par[2], checkr) ) ;
258 AliDebug(AliQAv1::GetQADebugLevel(),
259 Form("No ESD QA histogram found, nothing to check"));