#include "AliCDBEntry.h"
#include "AliQAManager.h"
#include "AliCDBStorage.h"
#include "AliRunInfo.h"
#include "AliLog.h"
#include "AliModule.h"
#include "AliQAv1.h"
#include "AliQAChecker.h"
#include "AliQACheckerBase.h"
#include "AliCorrQAChecker.h"
#include "AliGlobalQAChecker.h"
#include "AliGRPObject.h"
#include <TKey.h>
#include <TObjArray.h>
#include <TObjString.h>
#include <TPluginManager.h>
#include <TROOT.h>
#include <TStopwatch.h>
#include <TString.h>
#include <TSystem.h>
#include <TList.h>
#include <TNtupleD.h>
ClassImp(AliQAChecker)
AliQAChecker * AliQAChecker::fgQAChecker = 0x0 ;
AliQAChecker::AliQAChecker(const char* name, const char* title) :
TNamed(name, title),
fDataFile(0x0),
fRunInfo(0x0),
fRunInfoOwner(kFALSE),
fRefFile(0x0),
fFoundDetectors("."),
fEventSpecie(AliRecoParam::kDefault),
fRun(0)
{
for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++)
fCheckers[det] = NULL ;
}
AliQAChecker::AliQAChecker(const AliQAChecker& qac) :
TNamed(qac),
fDataFile(qac.fDataFile),
fRunInfo(qac.fRunInfo),
fRunInfoOwner(kFALSE),
fRefFile(qac.fRefFile),
fFoundDetectors(qac.fFoundDetectors),
fEventSpecie(qac.fEventSpecie),
fRun(qac.fRun)
{
for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++)
fCheckers[det] = NULL ;
}
AliQAChecker& AliQAChecker::operator = (const AliQAChecker& qac)
{
this->~AliQAChecker();
new(this) AliQAChecker(qac);
return *this;
}
AliQAChecker::~AliQAChecker()
{
if (fRunInfo)
delete fRunInfo ;
for (Int_t det=0; det<AliQAv1::kNDET; det++)
delete fCheckers[det] ;
AliQAv1::Close() ;
}
AliQACheckerBase * AliQAChecker::GetDetQAChecker(Int_t det)
{
if (det<0 || det>=AliQAv1::kNDET) return NULL;
if (fCheckers[det])
return fCheckers[det];
AliQACheckerBase * qac = NULL ;
TString detName(AliQAv1::GetDetName(det)) ;
if (det == AliQAv1::kGLOBAL) {
qac = new AliGlobalQAChecker() ;
} else if (det == AliQAv1::kCORR) {
qac = new AliCorrQAChecker() ;
} else {
AliDebugClass(AliQAv1::GetQADebugLevel(), Form("Retrieving QA checker for %s", detName.Data())) ;
TPluginManager* pluginManager = gROOT->GetPluginManager() ;
TString qacName = "Ali" + detName + "QAChecker" ;
TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQAChecker", detName.Data());
if (!pluginHandler) {
TString libs = gSystem->GetLibraries();
if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0))
pluginManager->AddHandler("AliQAChecker", detName, qacName, detName + "qac", qacName + "()");
else
pluginManager->AddHandler("AliQAChecker", detName, qacName, detName, qacName + "()");
pluginHandler = pluginManager->FindHandler("AliQAChecker", detName);
if (pluginHandler && (pluginHandler->LoadPlugin() == 0))
qac = (AliQACheckerBase *) pluginHandler->ExecPlugin(0);
}
}
if (qac)
fCheckers[det] = qac ;
return qac ;
}
AliQAChecker * AliQAChecker::Instance()
{
if ( ! fgQAChecker )
fgQAChecker = new AliQAChecker() ;
return fgQAChecker ;
}
void AliQAChecker::LoadRunInfoFromGRP()
{
AliCDBManager* man = AliCDBManager::Instance() ;
AliCDBEntry* entry = man->Get(AliQAv1::GetGRPPath().Data());
AliGRPObject* grpObject = 0x0;
if (entry) {
TMap* m = static_cast<TMap*>(entry->GetObject());
if (m) {
AliDebug(AliQAv1::GetQADebugLevel(), "It is a map");
grpObject = new AliGRPObject();
grpObject->ReadValuesFromMap(m);
}
else {
AliDebug(AliQAv1::GetQADebugLevel(), "It is a new GRP object");
grpObject = static_cast<AliGRPObject*>(entry->GetObject());
}
entry->SetOwner(0);
AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
}
if (!grpObject) {
AliFatal("No GRP entry found in OCDB!");
}
TString lhcState = grpObject->GetLHCState();
if (lhcState==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
lhcState = "UNKNOWN";
}
TString beamType = grpObject->GetBeamType();
if (beamType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
beamType = "UNKNOWN";
}
Float_t beamEnergy = grpObject->GetBeamEnergy();
if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
beamEnergy = 0;
}
TString runType = grpObject->GetRunType();
if (runType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
runType = "UNKNOWN";
}
Int_t activeDetectors = grpObject->GetDetectorMask();
if (activeDetectors==AliGRPObject::GetInvalidInt()) {
AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
activeDetectors = 1074790399;
}
fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
fRunInfoOwner = kTRUE ;
fEventSpecie = AliRecoParam::kDefault ;
if (strcmp(runType,"PHYSICS")) {
fEventSpecie = AliRecoParam::kCalib ;
return;
}
if (strcmp(lhcState,"STABLE_BEAMS") == 0) {
fEventSpecie = AliRecoParam::kHighMult ;
if ((strcmp(beamType,"p-p") == 0) ||
(strcmp(beamType,"p-") == 0) ||
(strcmp(beamType,"-p") == 0) ||
(strcmp(beamType,"P-P") == 0) ||
(strcmp(beamType,"P-") == 0) ||
(strcmp(beamType,"-P") == 0)) {
fEventSpecie = AliRecoParam::kLowMult ;
}
else if (strcmp(beamType,"-") == 0) {
fEventSpecie = AliRecoParam::kCosmic ;
}
else if (strcmp(beamType,"UNKNOWN") == 0) {
fEventSpecie = AliRecoParam::kDefault ;
}
}
}
Bool_t AliQAChecker::Run(const char * fileName, AliDetectorRecoParam * recoParam)
{
TStopwatch stopwatch;
stopwatch.Start();
TList * detKeyList = AliQAv1::GetQADataFile(fileName)->GetListOfKeys() ;
TIter nextd(detKeyList) ;
TKey * detKey ;
while ( (detKey = static_cast<TKey *>(nextd()) ) ) {
AliDebug(AliQAv1::GetQADebugLevel(), Form("Found %s", detKey->GetName())) ;
TString detName ;
TString detNameQA(detKey->GetName()) ;
Int_t det ;
for ( det = 0; det < AliQAv1::kNDET ; det++) {
detName = AliQAv1::GetDetName(det) ;
if (detNameQA.Contains(detName)) {
fFoundDetectors+=detName ;
fFoundDetectors+="." ;
break ;
}
}
TDirectory * detDir = AliQAv1::GetQADataFile(fileName)->GetDirectory(detKey->GetName()) ;
TList * taskKeyList = detDir->GetListOfKeys() ;
TIter nextt(taskKeyList) ;
TKey * taskKey ;
while ( (taskKey = static_cast<TKey *>(nextt()) ) ) {
TString taskName( taskKey->GetName() ) ;
AliDebug(AliQAv1::GetQADebugLevel(), Form("Found %s", taskName.Data())) ;
TDirectory * taskDir = detDir->GetDirectory(taskName.Data()) ;
taskDir->cd() ;
AliQACheckerBase * qac = GetDetQAChecker(det) ;
if (qac)
AliDebug(AliQAv1::GetQADebugLevel(), Form("QA checker found for %s", detName.Data())) ;
if (!qac)
AliFatal(Form("QA checker not found for %s", detName.Data())) ;
AliQAv1::ALITASK_t index = AliQAv1::kNULLTASK ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kHITS) )
index = AliQAv1::kSIM ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kSDIGITS) )
index = AliQAv1::kSIM ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kDIGITS) )
index = AliQAv1::kSIM ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kRAWS) )
index = AliQAv1::kRAW ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kDIGITSR) )
index = AliQAv1::kREC ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kRECPOINTS) )
index = AliQAv1::kREC ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kTRACKSEGMENTS) )
index = AliQAv1::kREC ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kRECPARTICLES) )
index = AliQAv1::kREC ;
if ( taskName == AliQAv1::GetTaskName(AliQAv1::kESDS) )
index = AliQAv1::kESD ;
qac->Init(AliQAv1::DETECTORINDEX_t(det)) ;
qac->Run(index, recoParam) ;
}
}
TString detList ;
for ( Int_t det = 0; det < AliQAv1::kNDET; det++) {
if (fFoundDetectors.Contains(AliQAv1::GetDetName(det))) {
detList += AliQAv1::GetDetName(det) ;
detList += " " ;
fFoundDetectors.ReplaceAll(AliQAv1::GetDetName(det), "") ;
AliQAv1::Instance()->Show(AliQAv1::GetDetIndex(AliQAv1::GetDetName(det))) ;
}
}
AliInfo(Form("QA performed for following detectors: %s", detList.Data())) ;
return kTRUE ;
}
Bool_t AliQAChecker::Run(AliQAv1::DETECTORINDEX_t det, AliQAv1::TASKINDEX_t task, TObjArray ** list, AliDetectorRecoParam * recoParam)
{
if (det >= AliQAv1::kNDET) {
AliError(Form("det = %i is larger than AliQAv1::kNDET ... should never happen", det));
return kFALSE ;
}
AliQACheckerBase * qac = GetDetQAChecker(det) ;
if (qac)
AliDebug(AliQAv1::GetQADebugLevel(), Form("QA checker found for %s", AliQAv1::GetDetName(det).Data())) ;
if (!qac) {
AliError(Form("QA checker not found for %s", AliQAv1::GetDetName(det).Data())) ;
return kFALSE;
}
AliQAv1::ALITASK_t index = AliQAv1::kNULLTASK ;
if ( task == AliQAv1::kRAWS )
index = AliQAv1::kRAW ;
else if ( task == AliQAv1::kHITS )
index = AliQAv1::kSIM ;
else if ( task == AliQAv1::kSDIGITS )
index = AliQAv1::kSIM ;
else if ( task == AliQAv1::kDIGITS )
index = AliQAv1::kSIM ;
else if ( task == AliQAv1::kDIGITSR )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kRECPOINTS )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kTRACKSEGMENTS )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kRECPARTICLES )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kESDS )
index = AliQAv1::kESD ;
qac->Init(det) ;
qac->Run(index, list, recoParam) ;
qac->MakeImage(list, task, AliQAv1::Mode(task)) ;
return kTRUE ;
}
Bool_t AliQAChecker::Run(AliQAv1::DETECTORINDEX_t det, AliQAv1::TASKINDEX_t task, TNtupleD ** list, AliDetectorRecoParam * recoParam)
{
AliQACheckerBase * qac = GetDetQAChecker(det) ;
if (qac)
AliDebug(AliQAv1::GetQADebugLevel(), Form("QA checker found for %s", AliQAv1::GetDetName(det).Data())) ;
if (!qac) {
AliError(Form("QA checker not found for %s", AliQAv1::GetDetName(det).Data())) ;
return kFALSE;
}
AliQAv1::ALITASK_t index = AliQAv1::kNULLTASK ;
if ( task == AliQAv1::kRAWS )
index = AliQAv1::kRAW ;
else if ( task == AliQAv1::kHITS )
index = AliQAv1::kSIM ;
else if ( task == AliQAv1::kSDIGITS )
index = AliQAv1::kSIM ;
else if ( task == AliQAv1::kDIGITS )
index = AliQAv1::kSIM ;
else if ( task == AliQAv1::kDIGITSR )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kRECPOINTS )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kTRACKSEGMENTS )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kRECPARTICLES )
index = AliQAv1::kREC ;
else if ( task == AliQAv1::kESDS )
index = AliQAv1::kESD ;
qac->Init(det) ;
qac->Run(index, list, recoParam) ;
return kTRUE ;
}