X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliQA.cxx;h=50f0a740b4a41587970789ef6f224082288eb4d0;hb=909eee575ce9f77645113230cc0acd685d40bc71;hp=19904bdb186c7745639d40ba0bded259100e0b59;hpb=4ecde5fcae912ba460d819423455260e821cf419;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliQA.cxx b/STEER/AliQA.cxx index 19904bdb186..50f0a740b4a 100644 --- a/STEER/AliQA.cxx +++ b/STEER/AliQA.cxx @@ -20,10 +20,11 @@ // Quality Assurance Object//_________________________________________________________________________ // Quality Assurance object. The QA status is held in one word per detector, // each bit corresponds to a different status. -// bit 0-3 : QA raised during simulation (SIM) -// bit 4-7 : QA raised during reconstruction (REC) -// bit 8-11 : QA raised during ESD checking (ESD) -// bit 12-15: QA raised during analysis (ANA) +// bit 0-3 : QA raised during simulation (RAW) +// bit 4-7 : QA raised during simulation (SIM) +// bit 8-11 : QA raised during reconstruction (REC) +// bit 12-15 : QA raised during ESD checking (ESD) +// bit 16-19 : QA raised during analysis (ANA) // Each of the 4 bits corresponds to a severity level of increasing importance // from lower to higher bit (INFO, WARNING, ERROR, FATAL) // @@ -31,140 +32,193 @@ ////////////////////////////////////////////////////////////////////////////// +#include // --- ROOT system --- #include #include +#include // --- Standard library --- // --- AliRoot header files --- -#include "AliCDBManager.h" -#include "AliCDBMetaData.h" -#include "AliCDBEntry.h" #include "AliLog.h" #include "AliQA.h" -#include "AliQAChecker.h" ClassImp(AliQA) - AliQA * AliQA::fgQA = 0x0 ; - TFile * AliQA::fgDataFile = 0x0 ; - TString AliQA::fgDataName = "QA" ; // will transform into Det.QA.run.cycle.root - TString AliQA::fgQARefDirName = "local://Ref/" ; - TString AliQA::fgQARefFileName = "QA.root" ; - TString AliQA::fgQAResultDirName = "local://RUN/" ; - TString AliQA::fgQAResultFileName = "QA.root" ; - TString AliQA::fgDetNames[] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", - "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"} ; - TString AliQA::fgTaskNames[] = {"Raws", "Hits", "SDigits", "Digits", "RecPoints", "TrackSegments", "RecParticles", "ESDs"} ; +AliQA * AliQA::fgQA = 0x0 ; +TFile * AliQA::fgQADataFile = 0x0 ; +TString AliQA::fgQADataFileName = "QA" ; // will transform into Det.QA.run.root +TFile * AliQA::fgQARefFile = 0x0 ; +TString AliQA::fgQARefDirName = "" ; +TString AliQA::fgQARefFileName = "QA.root" ; +TFile * AliQA::fgQAResultFile = 0x0 ; +TString AliQA::fgQAResultDirName = "" ; +TString AliQA::fgQAResultFileName = "QA.root" ; +TString AliQA::fgDetNames[] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", + "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT", "Global", "CORR"} ; +TString AliQA::fgGRPPath = "GRP/GRP/Data" ; +TString AliQA::fgTaskNames[] = {"Raws", "Hits", "SDigits", "Digits", "RecPoints", "TrackSegments", "RecParticles", "ESDs"} ; +const TString AliQA::fgkLabLocalFile = "file://" ; +const TString AliQA::fgkLabLocalOCDB = "local://" ; +const TString AliQA::fgkLabAliEnOCDB = "alien://" ; +const TString AliQA::fgkRefFileName = "QA.root" ; +const TString AliQA::fgkQAName = "QA" ; +const TString AliQA::fgkQACorrNtName = "CorrQA" ; +const TString AliQA::fgkRefOCDBDirName = "QA" ; +TString AliQA::fgRefDataDirName = "" ; +const TString AliQA::fgkQARefOCDBDefault = "alien://folder=/alice/QA/20" ; +const TString AliQA::fgkExpert = "Expert" ; +const UInt_t AliQA::fgkExpertBit = 16 ; +const UInt_t AliQA::fgkQABit = 17 ; //____________________________________________________________________________ AliQA::AliQA() : TNamed("", ""), fNdet(kNDET), - fQA(new ULong_t[fNdet]), + fNEventSpecies(AliRecoParam::kNSpecies), + fLengthQA(fNdet*fNEventSpecies), + fQA(new ULong_t[fLengthQA]), fDet(kNULLDET), - fTask(kNULLTASK) + fTask(kNULLTASK), + fEventSpecie(AliRecoParam::kDefault), + fEventSpecies(new Bool_t[fNEventSpecies]) { // default constructor - // beware singleton: not to be used - - for (Int_t index = 0 ; index < fNdet ; index++) - fQA[index] = 0 ; + memset(fQA,0,fLengthQA*sizeof(ULong_t)); + memset(fEventSpecies,kFALSE,fNEventSpecies*sizeof(Bool_t)); } //____________________________________________________________________________ AliQA::AliQA(const AliQA& qa) : TNamed(qa), fNdet(qa.fNdet), - fQA(qa.fQA), + fNEventSpecies(qa.fNEventSpecies), + fLengthQA(qa.fLengthQA), + fQA(new ULong_t[fLengthQA]), fDet(qa.fDet), - fTask(qa.fTask) + fTask(qa.fTask), + fEventSpecie(qa.fEventSpecie), + fEventSpecies(new Bool_t[fNEventSpecies]) { // cpy ctor + memcpy(fQA,qa.fQA,fLengthQA*sizeof(ULong_t)); + memcpy(fEventSpecies,qa.fEventSpecies,fNEventSpecies*sizeof(Bool_t)); } //_____________________________________________________________________________ AliQA& AliQA::operator = (const AliQA& qa) { -// assignment operator - - this->~AliQA(); - new(this) AliQA(qa); + // assignment operator + if(&qa != this) { + TNamed::operator=(qa); + fNdet = qa.fNdet; + fNEventSpecies = qa.fNEventSpecies; + fLengthQA = qa.fLengthQA; + + if(fQA) delete [] fQA; + fQA = new ULong_t[fLengthQA]; + memcpy(fQA,qa.fQA,fLengthQA*sizeof(ULong_t)); + + fDet = qa.fDet; + fTask = qa.fTask; + fEventSpecie = qa.fEventSpecie; + if(fEventSpecies) delete [] fEventSpecies; + fEventSpecies = new Bool_t[fNEventSpecies]; + memcpy(fEventSpecies,qa.fEventSpecies,fNEventSpecies*sizeof(Bool_t)); + } return *this; } //_______________________________________________________________ -AliQA::AliQA(const DETECTORINDEX det) : +AliQA::AliQA(const Int_t qalength, ULong_t * qa, const Int_t eslength, Bool_t * es) : +TNamed("QA", "Quality Assurance status"), +fNdet(kNDET), +fNEventSpecies(eslength), +fLengthQA(qalength), +fQA(new ULong_t[fLengthQA]), +fDet(kNULLDET), +fTask(kNULLTASK), +fEventSpecie(AliRecoParam::kDefault), +fEventSpecies(new Bool_t[fNEventSpecies]) +{ + // constructor to be used + memcpy(fQA, qa, fLengthQA*sizeof(ULong_t)); + memcpy(fEventSpecies, es, fNEventSpecies*sizeof(Bool_t)); +} + +//_______________________________________________________________ +AliQA::AliQA(const DETECTORINDEX_t det) : TNamed("QA", "Quality Assurance status"), - fNdet(kNDET), - fQA(new ULong_t[fNdet]), + fNdet(kNDET), + fNEventSpecies(AliRecoParam::kNSpecies), + fLengthQA(fNdet*fNEventSpecies), + fQA(new ULong_t[fLengthQA]), fDet(det), - fTask(kNULLTASK) + fTask(kNULLTASK), + fEventSpecie(AliRecoParam::kDefault), + fEventSpecies(new Bool_t[fNEventSpecies]) { // constructor to be used - if (! CheckRange(det) ) { - fDet = kNULLDET ; - return ; - } - Int_t index ; - for (index = 0; index < fNdet; index++) - fQA[index] = 0 ; + if (! CheckRange(det) ) fDet = kNULLDET ; + memset(fQA,0,fLengthQA*sizeof(ULong_t)); + memset(fEventSpecies,kFALSE,fNEventSpecies*sizeof(Bool_t)); } //_______________________________________________________________ -AliQA::AliQA(const ALITASK tsk) : - TNamed("QA", "Quality Assurance status"), - fNdet(kNDET), - fQA(new ULong_t[fNdet]), +AliQA::AliQA(const ALITASK_t tsk) : + TNamed("QA", "Quality Assurance status"), + fNdet(kNDET), + fNEventSpecies(AliRecoParam::kNSpecies), + fLengthQA(fNdet*fNEventSpecies), + fQA(new ULong_t[fLengthQA]), fDet(kNULLDET), - fTask(tsk) + fTask(tsk), + fEventSpecie(AliRecoParam::kDefault), + fEventSpecies(new Bool_t[fNEventSpecies]) { // constructor to be used in the AliRoot module (SIM, REC, ESD or ANA) - if (! CheckRange(tsk) ) { - fTask = kNULLTASK ; - return ; - } - Int_t index ; - for (index = 0; index < fNdet; index++) - fQA[index] = 0 ; + if (! CheckRange(tsk) ) fTask = kNULLTASK ; + memset(fQA,0,fLengthQA*sizeof(ULong_t)); + memset(fEventSpecies,kFALSE,fNEventSpecies*sizeof(Bool_t)); } //____________________________________________________________________________ AliQA::~AliQA() { // dtor - delete[] fQA ; + delete [] fQA; + delete [] fEventSpecies; } //_______________________________________________________________ -const Bool_t AliQA::AddQAData2CDB(const char * defSto) const +void AliQA::Close() { - // loads the QA data into the OCDB - Bool_t rv = kTRUE ; - AliCDBManager* man = AliCDBManager::Instance() ; - man->SetDefaultStorage(defSto) ; - AliCDBMetaData md ; - // loop over detectors - AliCDBId id("QA/Ref/PHOS",0,999999999) ; - - - return rv ; -} + // close the open files + if (fgQADataFile) + if (fgQADataFile->IsOpen()) + fgQADataFile->Close() ; + if (fgQAResultFile) + if (fgQAResultFile->IsOpen()) + fgQAResultFile->Close() ; + if (fgQARefFile) + if (fgQARefFile->IsOpen()) + fgQARefFile->Close() ; +} //_______________________________________________________________ -const Bool_t AliQA::CheckFatal() const +Bool_t AliQA::CheckFatal() const { // check if any FATAL status is set Bool_t rv = kFALSE ; Int_t index ; for (index = 0; index < kNDET ; index++) - rv = rv || IsSet(DETECTORINDEX(index), fTask, kFATAL) ; + rv = rv || IsSet(DETECTORINDEX_t(index), fTask, fEventSpecie, kFATAL) ; return rv ; } //_______________________________________________________________ -const Bool_t AliQA::CheckRange(DETECTORINDEX det) const +Bool_t AliQA::CheckRange(DETECTORINDEX_t det) const { // check if detector is in given detector range: 0-kNDET @@ -175,7 +229,7 @@ const Bool_t AliQA::CheckRange(DETECTORINDEX det) const } //_______________________________________________________________ -const Bool_t AliQA::CheckRange(ALITASK task) const +Bool_t AliQA::CheckRange(ALITASK_t task) const { // check if task is given taskk range: 0:kNTASK Bool_t rv = ( task < kRAW || task > kNTASK ) ? kFALSE : kTRUE ; @@ -185,7 +239,7 @@ const Bool_t AliQA::CheckRange(ALITASK task) const } //_______________________________________________________________ -const Bool_t AliQA::CheckRange(QABIT bit) const +Bool_t AliQA::CheckRange(QABIT_t bit) const { // check if bit is in given bit range: 0-kNBit @@ -196,36 +250,109 @@ const Bool_t AliQA::CheckRange(QABIT bit) const } //_______________________________________________________________ -TFile * AliQA::GetQADMOutFile(const char * name, const Int_t run, const Int_t cycle) -{ - // opens the file to store the detectors Quality Assurance Data Maker results - char temp[100] ; - sprintf(temp, "%s.%s.%d.%d.root", name, fgDataName.Data(), run, cycle) ; - TString opt ; - if (! fgDataFile ) { - if (gSystem->AccessPathName(temp)) - opt = "NEW" ; - else - opt = "UPDATE" ; - fgDataFile = TFile::Open(temp, opt.Data()) ; - } else { - if ( (strcmp(temp, fgDataFile->GetName()) != 0) ) { - if (gSystem->AccessPathName(temp)) - opt = "NEW" ; - else - opt = "UPDATE" ; - fgDataFile = TFile::Open(temp, opt.Data()) ; - } +Bool_t AliQA::CheckRange(AliRecoParam::EventSpecie_t es) const +{ + // check if bit is in given bit range: 0-kNBit + Bool_t rv = kFALSE ; + switch (es) { + case AliRecoParam::kDefault: + rv = kTRUE ; + break ; + case AliRecoParam::kLowMult: + rv = kTRUE ; + break ; + case AliRecoParam::kHighMult: + rv = kTRUE ; + break ; + case AliRecoParam::kCosmic: + rv = kTRUE ; + break ; + case AliRecoParam::kCalib: + rv = kTRUE ; + break ; } - return fgDataFile ; -} + if (!rv) + AliFatal(Form("Event Specie %d is not valid", es)) ; + return rv ; +} + +//_______________________________________________________________ +const char * AliQA::GetAliTaskName(ALITASK_t tsk) +{ + // returns the char name corresponding to module index + TString tskName ; + switch (tsk) { + case kNULLTASK: + break ; + case kRAW: + tskName = "RAW" ; + break ; + case kSIM: + tskName = "SIM" ; + break ; + case kREC: + tskName = "REC" ; + break ; + case kESD: + tskName = "ESD" ; + break ; + case kANA: + tskName = "ANA" ; + break ; + default: + tsk = kNULLTASK ; + break ; + } + return tskName.Data() ; +} +//_______________________________________________________________ +const char * AliQA::GetBitName(QABIT_t bit) const +{ + // returns the char name corresponding to bit + TString bitName ; + switch (bit) { + case kNULLBit: + break ; + case kINFO: + bitName = "INFO" ; + break ; + case kWARNING: + bitName = "WARNING" ; + break ; + case kERROR: + bitName = "ERROR" ; + break ; + case kFATAL: + bitName = "FATAL" ; + break ; + default: + bit = kNULLBit ; + break ; + } + return bitName.Data() ; +} + +//_______________________________________________________________ +AliQA::DETECTORINDEX_t AliQA::GetDetIndex(const char * name) +{ + // returns the detector index corresponding to a given name + TString sname(name) ; + DETECTORINDEX_t rv = kNULLDET ; + for (Int_t det = 0; det < kNDET ; det++) { + if ( GetDetName(det) == sname ) { + rv = DETECTORINDEX_t(det) ; + break ; + } + } + return rv ; +} //_______________________________________________________________ const char * AliQA::GetDetName(Int_t det) { // returns the detector name corresponding to a given index (needed in a loop) - + if ( det >= 0 && det < kNDET) return (fgDetNames[det]).Data() ; else @@ -233,97 +360,192 @@ const char * AliQA::GetDetName(Int_t det) } //_______________________________________________________________ -const char * AliQA::GetAliTaskName(ALITASK tsk) +TFile * AliQA::GetQADataFile(const char * name, Int_t run) { - // returns the char name corresponding to module index - TString tskName ; - switch (tsk) { - case kNULLTASK: - break ; - case kRAW: - tskName = "RAW" ; - break ; - case kSIM: - tskName = "SIM" ; - break ; - case kREC: - tskName = "REC" ; - break ; - case kESD: - tskName = "ESD" ; - break ; - case kANA: - tskName = "ANA" ; - break ; - default: - tsk = kNULLTASK ; - break ; + // opens the file to store the detectors Quality Assurance Data Maker results + const char * temp = Form("%s.%s.%d.root", name, fgQADataFileName.Data(), run) ; + TString opt ; + if (! fgQADataFile ) { + if (gSystem->AccessPathName(temp)) + opt = "NEW" ; + else + opt = "UPDATE" ; + fgQADataFile = TFile::Open(temp, opt.Data()) ; + } else { + if ( strcmp(temp, fgQADataFile->GetName()) != 0 ) { + fgQADataFile = dynamic_cast(gROOT->FindObject(temp)) ; + if ( !fgQADataFile ) { + if (gSystem->AccessPathName(temp)) + opt = "NEW" ; + else + opt = "UPDATE" ; + fgQADataFile = TFile::Open(temp, opt.Data()) ; + } + } } - return tskName.Data() ; -} + return fgQADataFile ; +} -//_______________________________________________________________ -TFile * AliQA::GetQARefFile() +//_____________________________________________________________________________ +TFile * AliQA::GetQADataFile(const char * fileName) { - // opens the file whwre Quality Assurance Reference Data are stored - - TString fileName(fgQARefDirName + fgQARefFileName) ; - - if ( fileName.Contains("local://")) - fileName.ReplaceAll("local://", "") ; - - return TFile::Open(fileName.Data(), "READ") ; -} + // Open if necessary the Data file and return its pointer + + if (!fgQADataFile) + if (!fileName) + fileName = AliQA::GetQADataFileName() ; + if (!gSystem->AccessPathName(fileName)) { + fgQADataFile = TFile::Open(fileName) ; + } else { + printf("File %s not found", fileName) ; + exit(1) ; + } + return fgQADataFile ; +} //_______________________________________________________________ TFile * AliQA::GetQAResultFile() { // opens the file to store the Quality Assurance Data Checker results - - TString fileName(fgQAResultDirName + fgQAResultFileName) ; - if ( fileName.Contains("local://")) - fileName.ReplaceAll("local://", "") ; - TString opt("") ; - if ( !gSystem->AccessPathName(fileName) ) - opt = "UPDATE" ; - else - opt = "NEW" ; - - return TFile::Open(fileName, opt) ; + if (fgQAResultFile) + fgQAResultFile->Close() ; + fgQAResultFile = 0x0 ; +// if (!fgQAResultFile) { + TString dirName(fgQAResultDirName) ; + if ( dirName.Contains(fgkLabLocalFile)) + dirName.ReplaceAll(fgkLabLocalFile, "") ; + TString fileName(dirName + fgQAResultFileName) ; + TString opt("") ; + if ( !gSystem->AccessPathName(fileName) ) + opt = "UPDATE" ; + else { + if ( gSystem->AccessPathName(dirName) ) + gSystem->mkdir(dirName) ; + opt = "NEW" ; + } + fgQAResultFile = TFile::Open(fileName, opt) ; +// } + + return fgQAResultFile ; +} + +//_______________________________________________________________ +AliQA::TASKINDEX_t AliQA::GetTaskIndex(const char * name) +{ + // returns the detector index corresponding to a given name + TString sname(name) ; + TASKINDEX_t rv = kNULLTASKINDEX ; + for (Int_t tsk = 0; tsk < kNTASKINDEX ; tsk++) { + if ( GetTaskName(tsk) == sname ) { + rv = TASKINDEX_t(tsk) ; + break ; + } + } + return rv ; } //_______________________________________________________________ -const Bool_t AliQA::IsSet(DETECTORINDEX det, ALITASK tsk, QABIT bit) const +Bool_t AliQA::IsSet(DETECTORINDEX_t det, ALITASK_t tsk, Int_t ies, QABIT_t bit) const { // Checks is the requested bit is set + + const AliRecoParam::EventSpecie_t es = AliRecoParam::Convert(ies) ; + return IsSet(det, tsk, es, bit) ; + +} +//_______________________________________________________________ +Bool_t AliQA::IsSet(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) const +{ + // Checks is the requested bit is set + CheckRange(det) ; CheckRange(tsk) ; CheckRange(bit) ; - + CheckRange(es) ; + ULong_t offset = Offset(tsk) ; - ULong_t status = GetStatus(det) ; + ULong_t status = GetStatus(det, es) ; offset+= bit ; status = (status & 1 << offset) != 0 ; return status ; } +//_______________________________________________________________ +Bool_t AliQA::IsSetAny(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es) const +{ + // Checks is the requested bit is set + + CheckRange(det) ; + CheckRange(tsk) ; + CheckRange(es) ; + + ULong_t offset = Offset(tsk) ; + ULong_t status = GetStatus(det, es) ; + ULong_t st = 0 ; + for ( Int_t bit = 0 ; bit < kNBIT ; bit++) { + offset+= bit ; + st += (status & 1 << offset) != 0 ; + } + if ( st == 0 ) + return kFALSE ; + else + return kTRUE ; +} +//_______________________________________________________________ +Bool_t AliQA::IsSetAny(DETECTORINDEX_t det, AliRecoParam::EventSpecie_t es) const +{ + // Checks is the requested bit is set + + CheckRange(det) ; + CheckRange(es) ; + + ULong_t status = GetStatus(det, es) ; + ULong_t st = 0 ; + for ( Int_t tsk = 0 ; tsk < kNTASK ; tsk++) { + ULong_t offset = Offset(ALITASK_t(tsk)) ; + for ( Int_t bit = 0 ; bit < kNBIT ; bit++) { + offset+= bit ; + st += (status & 1 << offset) != 0 ; + } + } + if ( st == 0 ) + return kFALSE ; + else + return kTRUE ; +} + //_______________________________________________________________ AliQA * AliQA::Instance() { - // Get an instance of the singleton. - // Object must have been instantiated with Instance(ALITASK) first + // Get an instance of the singleton. The only authorized way to call the ctor + if ( ! fgQA) { + TFile * f = GetQAResultFile() ; + fgQA = dynamic_cast(f->Get("QA")) ; + if ( ! fgQA ) + fgQA = new AliQA() ; + } return fgQA ; } //_______________________________________________________________ -AliQA * AliQA::Instance(const DETECTORINDEX det) +AliQA * AliQA::Instance(const Int_t qalength, ULong_t * qa, const Int_t eslength, Bool_t * es) +{ + // Get an instance of the singleton. The only authorized way to call the ctor + + if ( ! fgQA) + fgQA = new AliQA(qalength, qa, eslength, es) ; + return fgQA ; +} + +//_______________________________________________________________ +AliQA * AliQA::Instance(const DETECTORINDEX_t det) { // Get an instance of the singleton. The only authorized way to call the ctor if ( ! fgQA) { - TFile * f = AliQAChecker::GetQAResultFile() ; + TFile * f = GetQAResultFile() ; fgQA = dynamic_cast(f->Get("QA")) ; if ( ! fgQA ) fgQA = new AliQA(det) ; @@ -333,9 +555,9 @@ AliQA * AliQA::Instance(const DETECTORINDEX det) } //_______________________________________________________________ -AliQA * AliQA::Instance(const ALITASK tsk) +AliQA * AliQA::Instance(const ALITASK_t tsk) { - // get an instance of the singleton. + // Get an instance of the singleton. The only authorized way to call the ctor if ( ! fgQA) switch (tsk) { @@ -365,7 +587,48 @@ AliQA * AliQA::Instance(const ALITASK tsk) } //_______________________________________________________________ -const ULong_t AliQA::Offset(ALITASK tsk) const +AliQA * AliQA::Instance(const TASKINDEX_t tsk) +{ + // get an instance of the singleton. + + ALITASK_t index = kNULLTASK ; + + if ( tsk == kRAWS ) + index = kRAW ; + else if (tsk < kDIGITS) + index = kSIM ; + else if (tsk < kRECPARTICLES) + index = kREC ; + else if (tsk == kESDS) + index = kESD ; + + return Instance(index) ; +} + +//_______________________________________________________________ +void AliQA::Merge(TCollection * list) { + // Merge the QA resuls in the list into this single AliQA object + + for (Int_t det = 0 ; det < kNDET ; det++) { + Set(DETECTORINDEX_t(det)) ; + for (Int_t task = 0 ; task < kNTASK ; task++) { + Set(ALITASK_t(task)) ; + for (Int_t bit = 0 ; bit < kNBIT ; bit++) { + TIter next(list) ; + AliQA * qa ; + while ( (qa = (AliQA*)next() ) ) { + for (Int_t es = 0 ; es < fNEventSpecies ; es++) { + if (qa->IsSet(DETECTORINDEX_t(det), ALITASK_t(task), es, QABIT_t(bit))) + Set(QABIT_t(bit), es) ; + } + } // qa list + } // bit + } // task + } // detector +} + +//_______________________________________________________________ +ULong_t AliQA::Offset(ALITASK_t tsk) const { // Calculates the bit offset for a given module (SIM, REC, ESD, ANA) @@ -398,23 +661,48 @@ const ULong_t AliQA::Offset(ALITASK tsk) const } //_______________________________________________________________ -void AliQA::Set(QABIT bit) +void AliQA::ResetStatus(DETECTORINDEX_t det) +{ + // reset the status of det for all event specie + for (Int_t es = 0 ; es < fNEventSpecies ; es++) + fQA[det*fNdet+es] = 0 ; +} + +//_______________________________________________________________ +void AliQA::Set(QABIT_t bit, Int_t ies) { - // Set the status bit of the current detector in the current module + // Set the status bit of the current detector in the current module and for the current event specie + Set(bit, AliRecoParam::Convert(ies)) ; +} + +//_______________________________________________________________ +void AliQA::Set(QABIT_t bit, AliRecoParam::EventSpecie_t es) +{ + // Set the status bit of the current detector in the current module and for the current event specie - SetStatusBit(fDet, fTask, bit) ; + SetStatusBit(fDet, fTask, es, bit) ; } //_____________________________________________________________________________ -void AliQA::SetQARefDir(const char * name) +void AliQA::SetQARefStorage(const char * name) { - // Set the root directory where the QA reference data are stored - - fgQARefDirName.Prepend(name) ; - printf("AliQA::SetQARefDir: QA references are in %s\n", fgQARefDirName.Data()) ; - if ( fgQARefDirName.Contains("local://")) - fgQARefDirName.ReplaceAll("local:/", "") ; - fgQARefFileName.Prepend(fgQARefDirName) ; + // Set the root directory where the QA reference data are stored + + fgQARefDirName = name ; + if ( fgQARefDirName.Contains(fgkLabLocalFile) ) + fgQARefFileName = fgkRefFileName ; + else if ( fgQARefDirName.Contains(fgkLabLocalOCDB) ) + fgQARefFileName = fgkQAName ; + else if ( fgQARefDirName.Contains(fgkLabAliEnOCDB) ) + fgQARefFileName = fgkQAName ; + + else { + printf("ERROR: %s is an invalid storage definition\n", name) ; + fgQARefDirName = "" ; + fgQARefFileName = "" ; + } + TString tmp(fgQARefDirName) ; // + fgQARefFileName) ; + printf("AliQA::SetQARefDir: QA references are in %s\n", tmp.Data() ) ; } //_____________________________________________________________________________ @@ -424,48 +712,136 @@ void AliQA::SetQAResultDirName(const char * name) fgQAResultDirName.Prepend(name) ; printf("AliQA::SetQAResultDirName: QA results are in %s\n", fgQAResultDirName.Data()) ; - if ( fgQAResultDirName.Contains("local://")) - fgQAResultDirName.ReplaceAll("local:/", "") ; + if ( fgQAResultDirName.Contains(fgkLabLocalFile)) + fgQAResultDirName.ReplaceAll(fgkLabLocalFile, "") ; fgQAResultFileName.Prepend(fgQAResultDirName) ; } //_______________________________________________________________ -void AliQA::SetStatusBit(DETECTORINDEX det, ALITASK tsk, QABIT bit) +void AliQA::SetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) { // Set the status bit for a given detector and a given task CheckRange(det) ; CheckRange(tsk) ; CheckRange(bit) ; + CheckRange(es) ; ULong_t offset = Offset(tsk) ; - ULong_t status = GetStatus(det) ; + ULong_t status = GetStatus(det, es) ; offset+= bit ; status = status | 1 << offset ; - SetStatus(det, status) ; + SetStatus(det, es, status) ; +} + +//_______________________________________________________________ +void AliQA::Show() const +{ + // dispplay the QA status word + + for (Int_t ies = 0 ; ies < fNEventSpecies ; ies++) { + const Bool_t what = IsEventSpecieSet(ies) ; + if ( what ) + ShowStatus(fDet, fTask, AliRecoParam::Convert(ies)) ; + } +} + +//_______________________________________________________________ +void AliQA::Show(DETECTORINDEX_t det) const +{ + // dispplay the QA status word + + for (Int_t ies = 0 ; ies < fNEventSpecies ; ies++) { + const Bool_t what = IsEventSpecieSet(ies) ; + if ( what ) + ShowStatus(fDet, kNULLTASK, AliRecoParam::Convert(ies)) ; + } } //_______________________________________________________________ -void AliQA::ShowAll() const +void AliQA::ShowAll() const { // dispplay the QA status word Int_t index ; - for (index = 0 ; index < kNDET ; index++) - ShowStatus(DETECTORINDEX(index)) ; + for (index = 0 ; index < kNDET ; index++) { + for (Int_t tsk = kRAW ; tsk < kNTASK ; tsk++) { + for (Int_t ies = 0 ; ies < fNEventSpecies ; ies++) { + const Bool_t what = IsEventSpecieSet(ies) ; + if ( what ) + ShowStatus(DETECTORINDEX_t(index), ALITASK_t(tsk), AliRecoParam::Convert(ies)) ; + } + } + } } //_______________________________________________________________ -void AliQA::ShowStatus(DETECTORINDEX det) const +void AliQA::ShowStatus(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es) const { - // Prints the full QA status of a given detector - CheckRange(det) ; - ULong_t status = GetStatus(det) ; - ULong_t rawStatus = status & 0x0000f ; - ULong_t simStatus = status & 0x000f0 ; - ULong_t recStatus = status & 0x00f00 ; - ULong_t esdStatus = status & 0x0f000 ; - ULong_t anaStatus = status & 0xf0000 ; + // Prints the full QA status of a given detector + CheckRange(det) ; + CheckRange(es) ; + ULong_t status = GetStatus(det, es) ; + ULong_t tskStatus[kNTASK] ; + tskStatus[kRAW] = status & 0x0000f ; + tskStatus[kSIM] = status & 0x000f0 ; + tskStatus[kREC] = status & 0x00f00 ; + tskStatus[kESD] = status & 0x0f000 ; + tskStatus[kANA] = status & 0xf0000 ; + + AliInfo(Form("====> QA Status for %8s %8s raw =0x%x, sim=0x%x, rec=0x%x, esd=0x%x, ana=0x%x", GetDetName(det).Data(), AliRecoParam::GetEventSpecieName(es), + tskStatus[kRAW], tskStatus[kSIM], tskStatus[kREC], tskStatus[kESD], tskStatus[kANA] )) ; + if (tsk == kNULLTASK) { + for (Int_t itsk = kRAW ; itsk < kNTASK ; itsk++) { + ShowASCIIStatus(es, det, ALITASK_t(itsk), tskStatus[itsk]) ; + } + } else { + ShowASCIIStatus(es, det, tsk, tskStatus[tsk]) ; + } +} + +//_______________________________________________________________ +void AliQA::ShowASCIIStatus(AliRecoParam::EventSpecie_t es, DETECTORINDEX_t det, ALITASK_t tsk, const ULong_t status) const +{ + // print the QA status in human readable format + TString text; + for (Int_t bit = kINFO ; bit < kNBIT ; bit++) { + if (IsSet(det, tsk, es, QABIT_t(bit))) { + text = GetBitName(QABIT_t(bit)) ; + text += " " ; + } + } + if (! text.IsNull()) + printf(" %8s %8s %4s 0x%4lx, Problem signalled: %8s \n", AliRecoParam::GetEventSpecieName(es), GetDetName(det).Data(), GetAliTaskName(tsk), status, text.Data()) ; +} - AliInfo(Form("QA Status for %s raw =0x%x, sim=0x%x, rec=0x%x, esd=0x%x, ana=0x%x\n", GetDetName(det).Data(), rawStatus, simStatus, recStatus, esdStatus, anaStatus )) ; +//_______________________________________________________________ +void AliQA::UnSet(QABIT_t bit, Int_t ies) +{ + // UnSet the status bit of the current detector in the current module + UnSet(bit, AliRecoParam::Convert(ies)) ; } +//_______________________________________________________________ +void AliQA::UnSet(QABIT_t bit, AliRecoParam::EventSpecie_t es) +{ + // UnSet the status bit of the current detector in the current module + + UnSetStatusBit(fDet, fTask, es, bit) ; +} + +//_______________________________________________________________ +void AliQA::UnSetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) +{ + // UnSet the status bit for a given detector and a given task + + CheckRange(det) ; + CheckRange(tsk) ; + CheckRange(bit) ; + CheckRange(es) ; + + ULong_t offset = Offset(tsk) ; + ULong_t status = GetStatus(det, es) ; + offset+= bit ; + status = status & 0 << offset ; + SetStatus(det, es, status) ; +}