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(0, 0.7, 24, 0.7);
149 linelowyellow.SetLineColor(5);
150 linelowyellow.SetLineStyle(3);
151 linelowyellow.SetLineWidth(4);
152 TLine linelowred(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(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 // clean objects added at previous checks
164 TList* lstF = fhRawEff[ih]->GetListOfFunctions();
166 TObject *stats = lstF->FindObject("stats");
169 while ((obj = lstF->First())) {
170 while(lstF->Remove(obj)) { }
173 if (stats) lstF->Add(stats);
175 fhRawEff[ih]->SetLineWidth(2);
176 fhRawEff[ih]->SetMaximum(2.);
177 fhRawEff[ih]->SetMinimum(0.);
178 fhRawEff[ih]->GetListOfFunctions()->Add((TLine*)linelowyellow.Clone());
179 fhRawEff[ih]->GetListOfFunctions()->Add((TLine*)linelowred.Clone());
181 Int_t nbins= fhRawEff[ih]->GetNbinsX();
182 Bool_t yell = kFALSE;
184 for (Int_t in=1; in<nbins-1; in++)
186 if(ih==0 && in==5) continue;
187 chcont=fhRawEff[ih]->GetBinContent(in);
188 if (chcont < thryell ) yell = kTRUE;
189 if (chcont < thrred ) red = kTRUE;
192 if (! yell && !red) {
193 AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s is good", fhRawEff[ih]->GetName() ));
195 // text.AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
196 // text.AddText(Form(" No problems "));
197 // text.SetFillColor(3);
202 AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s is not so good", fhRawEff[ih]->GetName() ));
203 // text.AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
204 // text.AddText(Form("Very serious problem, call expert "));
205 // text.SetFillColor(2);
209 AliDebug(AliQAv1::GetQADebugLevel(), Form(" efficiency in all channes %s is not so good", fhRawEff[ih]->GetName() ));
211 // text.AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
212 // text.AddText(Form("Some problems "));
213 // text.SetFillColor(5);
215 // fhRawEff[ih]->GetListOfFunctions()->Add((TPaveText*)text.Clone());
222 //--------------------------------------------------------------------------
223 Double_t AliT0QAChecker::CheckESD(TObjArray *listrec ) const
228 fhESD = (TH1*) listrec->UncheckedAt(2);
230 AliDebug(AliQAv1::GetQADebugLevel(), Form("count %s ", fhESD->GetName()) );
231 TF1 *f1 = new TF1("f1","gaus",-1,1);
232 fhESD->Fit("f1","R","Q", -1,1);
234 f1->GetParameters(&par[0]);
236 TPaveText text(0.30,0.50,0.99,0.99,"NDC");
238 text.AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
240 AliDebug(AliQAv1::GetQADebugLevel(), Form("numentries %d mean %f #sigma %f", (int)fhESD->GetEntries(),par[1], par[2]));
243 if (par[2] > 0.07 && par[2] < 1.) {
245 text.AddText(Form("not good resolution :\n %f ns\n", par[2] ));
246 text.SetFillColor(5);
247 printf("T0 detector resolution is not good enouph: %f ns\n",par[2] );
249 if(TMath::Abs(par[1])>0.05) {
251 text.AddText(Form(" Check clock shift on %f ns", par[1]));
252 text.SetFillColor(5);
254 if (par[2] > 1. || TMath::Abs(par[1])>0.1) {
256 text.AddText(Form(" Bad resolution:\n mean %f ns sigma %f ns", par[1], par[2]));
257 text.SetFillColor(2);
258 { // RS Clean previous additions
259 TList* lstF = fhESD->GetListOfFunctions();
261 TObject *stats = lstF->FindObject("stats");
264 while ((obj = lstF->First())) {
265 while(lstF->Remove(obj)) { }
268 if (stats) lstF->Add(stats);
271 fhESD->GetListOfFunctions()->Add((TPaveText*)text.Clone());
272 AliDebug(AliQAv1::GetQADebugLevel(),
273 Form("Please, check calibration: shift= %f resolution %f test=%f\n",
274 par[1], par[2], checkr) ) ;
279 AliDebug(AliQAv1::GetQADebugLevel(),
280 Form("No ESD QA histogram found, nothing to check"));