/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ // // Base class for detectors quality assurance checkers // Compares Data made by QADataMakers with reference data // Y. Schutz CERN August 2007 // // --- ROOT system --- #include #include #include #include #include #include #include // --- Standard library --- // --- AliRoot header files --- #include "AliLog.h" #include "AliQA.h" #include "AliQAChecker.h" #include "AliQACheckerBase.h" #include "AliQADataMaker.h" ClassImp(AliQACheckerBase) //____________________________________________________________________________ AliQACheckerBase::AliQACheckerBase(const char * name, const char * title) : TNamed(name, title), fDataSubDir(0x0), fRefSubDir(0x0), fRefOCDBSubDir(0x0) { // ctor } //____________________________________________________________________________ AliQACheckerBase::AliQACheckerBase(const AliQACheckerBase& qac) : TNamed(qac.GetName(), qac.GetTitle()), fDataSubDir(qac.fDataSubDir), fRefSubDir(qac.fRefSubDir), fRefOCDBSubDir(qac.fRefOCDBSubDir) { //copy ctor } //____________________________________________________________________________ AliQACheckerBase& AliQACheckerBase::operator = (const AliQACheckerBase& qadm ) { // Equal operator. this->~AliQACheckerBase(); new(this) AliQACheckerBase(qadm); return *this; } //____________________________________________________________________________ const Double_t AliQACheckerBase::Check() { // Performs a basic checking // Compares all the histograms stored in the directory // With reference histograms either in a file of in OCDB Double_t test = 0.0 ; Int_t count = 0 ; if (!fDataSubDir) test = 1. ; // nothing to check else if (!fRefSubDir && !fRefOCDBSubDir) test = -1 ; // no reference data else { TList * keyList = fDataSubDir->GetListOfKeys() ; TIter next(keyList) ; TKey * key ; count = 0 ; while ( (key = static_cast(next())) ) { TObject * odata = fRefSubDir->Get(key->GetName()) ; if ( odata->IsA()->InheritsFrom("TH1") ) { TH1 * hdata = static_cast(odata) ; TH1 * href = NULL ; if (fRefSubDir) href = static_cast(fRefSubDir->Get(key->GetName())) ; else if (fRefOCDBSubDir) { href = static_cast(fRefOCDBSubDir->FindObject(key->GetName())) ; } if (!href) test = -1 ; // no reference data ; else { Double_t rv = DiffK(hdata, href) ; AliInfo(Form("%s ->Test = %f", hdata->GetName(), rv)) ; test += rv ; count++ ; } } else AliError(Form("%s Is a Classname that cannot be processed", key->GetClassName())) ; } } if (count != 0) test /= count ; return test ; } //____________________________________________________________________________ const Double_t AliQACheckerBase::Check(TObjArray * list) { // Performs a basic checking // Compares all the histograms in the list Double_t test = 0.0 ; Int_t count = 0 ; if (list->GetEntries() == 0) test = 1. ; // nothing to check else { if (!fRefSubDir) test = -1 ; // no reference data else { TIter next(list) ; TH1 * hdata ; count = 0 ; while ( (hdata = dynamic_cast(next())) ) { if ( hdata) { TH1 * href = NULL ; if (fRefSubDir) href = static_cast(fRefSubDir->Get(hdata->GetName())) ; else if (fRefOCDBSubDir) href = static_cast(fRefOCDBSubDir->FindObject(hdata->GetName())) ; if (!href) test = -1 ; // no reference data ; else { Double_t rv = DiffK(hdata, href) ; AliInfo(Form("%s ->Test = %f", hdata->GetName(), rv)) ; test += rv ; count++ ; } } else AliError("Data type cannot be processed") ; } } } if (count != 0) test /= count ; return test ; } //____________________________________________________________________________ const Double_t AliQACheckerBase::DiffC(const TH1 * href, const TH1 * hin) const { // compares two histograms using the Chi2 test if ( hin->Integral() == 0 ) { AliWarning(Form("Spectrum %s is empty", hin->GetName())) ; return 0. ; } return hin->Chi2Test(href) ; } //____________________________________________________________________________ const Double_t AliQACheckerBase::DiffK(const TH1 * href, const TH1 * hin) const { // compares two histograms using the Kolmogorov test if ( hin->Integral() == 0 ) { AliWarning(Form("Spectrum %s is empty", hin->GetName())) ; return 0. ; } return hin->KolmogorovTest(href) ; } //____________________________________________________________________________ void AliQACheckerBase::Init(const AliQA::DETECTORINDEX_t det) { AliQA::Instance(det) ; } //____________________________________________________________________________ void AliQACheckerBase::Run(AliQA::ALITASK_t index, TObjArray * list) { AliDebug(1, Form("Processing %s", AliQA::GetAliTaskName(index))) ; AliQA * qa = AliQA::Instance(index) ; Double_t rv = -1 ; if (list) rv = Check(list) ; else rv = Check() ; if ( rv <= 0.) qa->Set(AliQA::kFATAL) ; else if ( rv > 0 && rv <= 0.0002 ) qa->Set(AliQA::kERROR) ; else if ( rv > 0.0002 && rv <= 0.5 ) qa->Set(AliQA::kWARNING) ; else if ( rv > 0.5 && rv < 1 ) qa->Set(AliQA::kINFO) ; AliDebug(1, Form("Test result of %s", AliQA::GetAliTaskName(index))) ; Finish() ; } //____________________________________________________________________________ void AliQACheckerBase::Finish() const { // wrap up and save QA in proper file AliQA * qa = AliQA::Instance() ; qa->Show() ; AliQA::GetQAResultFile()->cd() ; qa->Write(qa->GetName(), kWriteDelete) ; AliQA::GetQAResultFile()->Close() ; }