X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliQACheckerBase.cxx;h=4fcbc132dfc1281c8fadec445bb2234d990ea347;hb=4ab8985c1f7fbe9b9642049b922752f866ac00a2;hp=6226a0a7202151cbb254e2d3877f8e32eeed524f;hpb=eca4fa66e575b53a72c027046dc9ea60487c3240;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliQACheckerBase.cxx b/STEER/AliQACheckerBase.cxx index 6226a0a7202..4fcbc132dfc 100644 --- a/STEER/AliQACheckerBase.cxx +++ b/STEER/AliQACheckerBase.cxx @@ -23,6 +23,7 @@ // // --- ROOT system --- +#include #include #include #include @@ -31,15 +32,20 @@ #include #include #include +#include +#include // --- Standard library --- // --- AliRoot header files --- +#include "AliCDBEntry.h" #include "AliLog.h" #include "AliQAv1.h" #include "AliQAChecker.h" #include "AliQACheckerBase.h" #include "AliQADataMaker.h" +#include "AliQAManager.h" +#include "AliDetectorRecoParam.h" ClassImp(AliQACheckerBase) @@ -49,9 +55,12 @@ AliQACheckerBase::AliQACheckerBase(const char * name, const char * title) : TNamed(name, title), fDataSubDir(0x0), fRefSubDir(0x0), - fRefOCDBSubDir(0x0), + fRefOCDBSubDir(new TObjArray*[AliRecoParam::kNSpecies]), fLowTestValue(0x0), - fUpTestValue(0x0) + fUpTestValue(0x0), + fImage(new TCanvas*[AliRecoParam::kNSpecies]), + fPrintImage(kTRUE), + fExternParamList(new TList()) { // ctor fLowTestValue = new Float_t[AliQAv1::kNBIT] ; @@ -74,6 +83,11 @@ AliQACheckerBase::AliQACheckerBase(const char * name, const char * title) : fLowTestValue[AliQAv1::kFATAL], fUpTestValue[AliQAv1::kFATAL]) ; AliInfo(Form("%s", text)) ; } + + for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { + fImage[specie] = NULL ; + fRefOCDBSubDir[specie] = NULL ; + } } //____________________________________________________________________________ @@ -83,22 +97,34 @@ AliQACheckerBase::AliQACheckerBase(const AliQACheckerBase& qac) : fRefSubDir(qac.fRefSubDir), fRefOCDBSubDir(qac.fRefOCDBSubDir), fLowTestValue(qac.fLowTestValue), - fUpTestValue(qac.fLowTestValue) + fUpTestValue(qac.fLowTestValue), + fImage(NULL), + fPrintImage(kTRUE), + fExternParamList(new TList()) { //copy ctor for (Int_t index = 0 ; index < AliQAv1::kNBIT ; index++) { fLowTestValue[index] = qac.fLowTestValue[index] ; fUpTestValue[index] = qac.fUpTestValue[index] ; } - + for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { + fImage[specie] = qac.fImage[specie] ; + fRefOCDBSubDir[specie] = qac.fRefOCDBSubDir[specie] ; + } + if (qac.fExternParamList) { + TIter next(qac.fExternParamList) ; + TParameter * p ; + while ( (p = (TParameter*)next()) ) + fExternParamList->Add(p) ; + } } //____________________________________________________________________________ -AliQACheckerBase& AliQACheckerBase::operator = (const AliQACheckerBase& qadm ) +AliQACheckerBase& AliQACheckerBase::operator = (const AliQACheckerBase& qac ) { // Equal operator. this->~AliQACheckerBase(); - new(this) AliQACheckerBase(qadm); + new(this) AliQACheckerBase(qac); return *this; } @@ -107,61 +133,64 @@ AliQACheckerBase::~AliQACheckerBase() { delete [] fLowTestValue ; delete [] fUpTestValue ; + for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) { + if ( fImage[esIndex] ) + delete fImage[esIndex] ; + if ( fRefOCDBSubDir[esIndex] ) + delete fRefOCDBSubDir[esIndex] ; + } + delete[] fImage ; + delete[] fRefOCDBSubDir ; + AliQAv1::GetQAResultFile()->Close() ; + if (fExternParamList) { + fExternParamList->Clear() ; + delete fExternParamList ; + } } //____________________________________________________________________________ -Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t /*index*/) +Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t index, const AliDetectorRecoParam * recoParam) { // 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 = new Double_t[AliRecoParam::kNSpecies] ; - Int_t count[AliRecoParam::kNSpecies] = { 0 }; - - for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { - test[specie] = 1.0 ; + TObjArray ** list = new TObjArray *[AliRecoParam::kNSpecies] ; + Int_t specie ; + for (specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { + list[specie] = new TObjArray(AliQAv1::GetMaxQAObj()) ; if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ; - if (!fDataSubDir) { - test[specie] = 0. ; // nothing to check - } else if (!fRefSubDir && !fRefOCDBSubDir) { - test[specie] = -1 ; // no reference data - } else { + if (fDataSubDir) { TList * keyList = fDataSubDir->GetListOfKeys() ; TIter next(keyList) ; TKey * key ; - count[specie] = 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[specie]) { - href = static_cast(fRefOCDBSubDir[specie]->FindObject(key->GetName())) ; - } - if (!href) - test[specie] = -1 ; // no reference data ; - else { - Double_t rv = DiffK(hdata, href) ; - AliDebug(AliQAv1::GetQADebugLevel(), Form("%s ->Test = %f", hdata->GetName(), rv)) ; - test[specie] += rv ; - count[specie]++ ; - } - } else - AliError(Form("%s Is a Classname that cannot be processed", key->GetClassName())) ; + TDirectory * specieDir = fDataSubDir->GetDirectory(key->GetName()) ; + TList * keykeyList = specieDir->GetListOfKeys() ; + TIter next2(keykeyList) ; + TKey * keykey ; + while ( (keykey = static_cast(next2())) ) { + TObject * odata = specieDir->Get(keykey->GetName()) ; + if ( odata->IsA()->InheritsFrom("TH1") ) { + TH1 * hdata = static_cast(odata) ; + list[specie]->Add(hdata) ; + } else if (!odata->IsA()->InheritsFrom("TDirectory")) // skip the expert directory + AliError(Form("%s Is a Classname that cannot be processed", key->GetClassName())) ; + } } - if (count[specie] != 0) - test[specie] /= count[specie] ; } } - return test ; + + Double_t * test = Check(index, list, recoParam) ; + + delete[] list ; + + return test ; } //____________________________________________________________________________ -Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t /*index*/, TObjArray ** list) +Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t task, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/) { // Performs a basic checking // Compares all the histograms in the list @@ -169,9 +198,14 @@ Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t /*index*/, TObjArray ** li Double_t * test = new Double_t[AliRecoParam::kNSpecies] ; Int_t count[AliRecoParam::kNSpecies] = { 0 }; +// TDirectory * refDir = NULL ; +// TObjArray ** refOCDBDir = NULL ; + GetRefSubDir(GetName(), AliQAv1::GetTaskName(task), fRefSubDir, fRefOCDBSubDir) ; + // SetRefandData(refDir, refOCDBDir) ; + for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { test[specie] = 1.0 ; - if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) + if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) continue ; if (list[specie]->GetEntries() == 0) test[specie] = 0. ; // nothing to check @@ -183,10 +217,7 @@ Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t /*index*/, TObjArray ** li TH1 * hdata ; count[specie] = 0 ; while ( (hdata = static_cast(next())) ) { - TString cln(hdata->ClassName()) ; - if ( ! cln.Contains("TH1") ) - continue ; - if ( hdata) { + if ( hdata->IsA()->InheritsFrom("TH1") ) { if ( hdata->TestBit(AliQAv1::GetExpertBit()) ) // does not perform the test for expert data continue ; TH1 * href = NULL ; @@ -200,18 +231,17 @@ Double_t * AliQACheckerBase::Check(AliQAv1::ALITASK_t /*index*/, TObjArray ** li Double_t rv = DiffK(hdata, href) ; AliDebug(AliQAv1::GetQADebugLevel(), Form("%s ->Test = %f", hdata->GetName(), rv)) ; test[specie] += rv ; - count[specie]++ ; + count[specie]++ ; } - } - else + } else AliError("Data type cannot be processed") ; + if (count[specie] != 0) + test[specie] /= count[specie] ; } - if (count[specie] != 0) - test[specie] /= count[specie] ; } } } - return test ; + return test ; } @@ -231,24 +261,92 @@ Double_t AliQACheckerBase::DiffC(const TH1 * href, const TH1 * hin) const Double_t AliQACheckerBase::DiffK(const TH1 * href, const TH1 * hin) const { // compares two histograms using the Kolmogorov test - if ( hin->Integral() == 0 ) { - AliDebug(AliQAv1::GetQADebugLevel(), Form("Spectrum %s is empty", hin->GetName())) ; + if ( hin->Integral() == 0 || href->Integral() == 0) { + AliDebug(AliQAv1::GetQADebugLevel(), Form("Spectrum %s or its reference is empty", hin->GetName())) ; return 0. ; } return hin->KolmogorovTest(href) ; } + //_____________________________________________________________________________ +void AliQACheckerBase::GetRefSubDir(const char * det, const char * task, TDirectory *& dirFile, TObjArray **& dirOCDB) +{ + // Opens and returns the file with the reference data + dirFile = NULL ; + TString refStorage(AliQAv1::GetQARefStorage()) ; + if (!refStorage.Contains(AliQAv1::GetLabLocalOCDB()) && !refStorage.Contains(AliQAv1::GetLabAliEnOCDB())) { + AliError(Form("%s is not a valid location for reference data", refStorage.Data())) ; + return ; + } else { + AliQAManager* manQA = AliQAManager::QAManager(AliQAv1::GetTaskIndex(task)) ; + dirOCDB = new TObjArray*[AliRecoParam::kNSpecies] ; + for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { + dirOCDB[specie] = NULL ; + if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) + continue ; + AliQAv1::SetQARefDataDirName(specie) ; + if ( ! manQA->GetLock() ) { + manQA->SetDefaultStorage(AliQAv1::GetQARefStorage()) ; + manQA->SetSpecificStorage("*", AliQAv1::GetQARefStorage()) ; + manQA->SetRun(AliCDBManager::Instance()->GetRun()) ; + manQA->SetLock() ; + } + char * detOCDBDir = Form("%s/%s/%s", det, AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName()) ; + AliCDBEntry * entry = manQA->Get(detOCDBDir, manQA->GetRun()) ; + if (entry) { + TList * listDetQAD =static_cast(entry->GetObject()) ; + if ( strcmp(listDetQAD->ClassName(), "TList") != 0 ) { + AliError(Form("Expected a Tlist and found a %s for detector %s", listDetQAD->ClassName(), det)) ; + listDetQAD = NULL ; + continue ; + } + if ( listDetQAD ) { + TIter next(listDetQAD) ; + TObjArray * ar ; + while ( (ar = (TObjArray*)next()) ) + dirOCDB[specie] = static_cast(listDetQAD->FindObject(Form("%s/%s", task, AliRecoParam::GetEventSpecieName(specie)))) ; + } + } + } + } +} + +//____________________________________________________________________________ +void AliQACheckerBase::PrintExternParam() +{ + // Print the list of external parameter list + TIter next(fExternParamList) ; + TParameter *pp ; + TString printit("\n") ; + while( (pp = (TParameter*)next()) ) + printit += Form("%s = %f\n", pp->GetName(), pp->GetVal()); + AliInfo(Form("%s", printit.Data())) ; +} + +//____________________________________________________________________________ +void AliQACheckerBase::Run(AliQAv1::ALITASK_t index, AliDetectorRecoParam * recoParam) +{ + AliDebug(AliQAv1::GetQADebugLevel(), Form("Processing %s", AliQAv1::GetAliTaskName(index))) ; + + Double_t * rv = NULL ; + rv = Check(index, recoParam) ; + SetQA(index, rv) ; + + AliDebug(AliQAv1::GetQADebugLevel(), Form("Test result of %s", AliQAv1::GetAliTaskName(index))) ; + + if (rv) + delete [] rv ; + Finish() ; +} + //____________________________________________________________________________ -void AliQACheckerBase::Run(AliQAv1::ALITASK_t index, TObjArray ** list) +void AliQACheckerBase::Run(AliQAv1::ALITASK_t index, TObjArray ** list, AliDetectorRecoParam * recoParam) { AliDebug(AliQAv1::GetQADebugLevel(), Form("Processing %s", AliQAv1::GetAliTaskName(index))) ; Double_t * rv = NULL ; - if ( !list) - rv = Check(index) ; - else - rv = Check(index, list) ; + rv = Check(index, list, recoParam) ; SetQA(index, rv) ; AliDebug(AliQAv1::GetQADebugLevel(), Form("Test result of %s", AliQAv1::GetAliTaskName(index))) ; @@ -262,11 +360,71 @@ void AliQACheckerBase::Run(AliQAv1::ALITASK_t index, TObjArray ** list) void AliQACheckerBase::Finish() const { // wrap up and save QA in proper file + AliQAv1::GetQAResultFile() ; AliQAv1 * qa = AliQAv1::Instance() ; - qa->Show() ; - AliQAv1::GetQAResultFile()->cd() ; - qa->Write(qa->GetName(), kWriteDelete) ; - AliQAv1::GetQAResultFile()->Close() ; + qa->Write(AliQAv1::GetQAName(), kWriteDelete) ; +} + +//____________________________________________________________________________ +void AliQACheckerBase::MakeImage( TObjArray ** list, AliQAv1::TASKINDEX_t task, AliQAv1::MODE_t mode) +{ + // makes the QA image for sim and rec + Int_t nImages = 0 ; + for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) { + if (! AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(esIndex)) ) + continue ; + TIter next(list[esIndex]) ; + TH1 * hdata = NULL ; + while ( (hdata=static_cast(next())) ) { + TString cln(hdata->ClassName()) ; + if ( ! cln.Contains("TH") ) + continue ; + if ( hdata->TestBit(AliQAv1::GetImageBit()) ) + nImages++; + } + break ; + } + if ( nImages == 0 ) { + AliDebug(AliQAv1::GetQADebugLevel(), Form("No histogram will be plotted for %s %s\n", GetName(), AliQAv1::GetTaskName(task).Data())) ; + } else { + AliDebug(AliQAv1::GetQADebugLevel(), Form("%d histograms will be plotted for %s %s\n", nImages, GetName(), AliQAv1::GetTaskName(task).Data())) ; + for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) { + if (! AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(esIndex)) || list[esIndex]->GetEntries() == 0) + continue ; + const Char_t * title = Form("QA_%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(esIndex)) ; + if ( !fImage[esIndex] ) { + fImage[esIndex] = new TCanvas(title, title) ; + } + fImage[esIndex]->Clear() ; + fImage[esIndex]->SetTitle(title) ; + fImage[esIndex]->cd() ; + TPaveText someText(0.015, 0.015, 0.98, 0.98) ; + someText.AddText(title) ; + someText.Draw() ; + fImage[esIndex]->Print(Form("%s%s%d.%s", AliQAv1::GetImageFileName(), AliQAv1::GetModeName(mode), AliQAChecker::Instance()->GetRunNumber(), AliQAv1::GetImageFileFormat()), "ps") ; + fImage[esIndex]->Clear() ; + Int_t nx = TMath::Nint(TMath::Sqrt(nImages)); + Int_t ny = nx ; + if (nx < TMath::Sqrt(nImages)) + ny++ ; + + fImage[esIndex]->Divide(nx, ny) ; + TIter nexthist(list[esIndex]) ; + TH1* hist = NULL ; + Int_t npad = 1 ; + fImage[esIndex]->cd(npad) ; + while ( (hist=static_cast(nexthist())) ) { + TString cln(hist->ClassName()) ; + if ( ! cln.Contains("TH") ) + continue ; + if(hist->TestBit(AliQAv1::GetImageBit())) { + hist->Draw() ; + fImage[esIndex]->cd(++npad) ; + } + } + fImage[esIndex]->Print(Form("%s%s%d.%s", AliQAv1::GetImageFileName(), AliQAv1::GetModeName(mode), AliQAChecker::Instance()->GetRunNumber(), AliQAv1::GetImageFileFormat()), "ps") ; + } + } } //____________________________________________________________________________ @@ -302,18 +460,21 @@ void AliQACheckerBase::SetQA(AliQAv1::ALITASK_t index, Double_t * value) const // sets the QA according the return value of the Check AliQAv1 * qa = AliQAv1::Instance(index) ; + for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { + if (! qa->IsEventSpecieSet(AliRecoParam::ConvertIndex(specie))) + continue ; if ( value == NULL ) { // No checker is implemented, set all QA to Fatal qa->Set(AliQAv1::kFATAL, specie) ; } else { if ( value[specie] >= fLowTestValue[AliQAv1::kFATAL] && value[specie] < fUpTestValue[AliQAv1::kFATAL] ) - qa->Set(AliQAv1::kFATAL, specie) ; + qa->Set(AliQAv1::kFATAL, AliRecoParam::ConvertIndex(specie)) ; else if ( value[specie] > fLowTestValue[AliQAv1::kERROR] && value[specie] <= fUpTestValue[AliQAv1::kERROR] ) - qa->Set(AliQAv1::kERROR, specie) ; + qa->Set(AliQAv1::kERROR, AliRecoParam::ConvertIndex(specie)) ; else if ( value[specie] > fLowTestValue[AliQAv1::kWARNING] && value[specie] <= fUpTestValue[AliQAv1::kWARNING] ) - qa->Set(AliQAv1::kWARNING, specie) ; + qa->Set(AliQAv1::kWARNING, AliRecoParam::ConvertIndex(specie)) ; else if ( value[specie] > fLowTestValue[AliQAv1::kINFO] && value[specie] <= fUpTestValue[AliQAv1::kINFO] ) - qa->Set(AliQAv1::kINFO, specie) ; + qa->Set(AliQAv1::kINFO, AliRecoParam::ConvertIndex(specie)) ; } } }