#ifndef ALIQAV1_H
#define ALIQAV1_H
#include <TNamed.h>
#include <TMath.h>
class TFile ;
class TH1 ;
#include "AliLog.h"
#include "AliRecoParam.h"
class AliQAv1 : public TNamed {
public:
enum DETECTORINDEX_t {
kNULLDET=-1, kITS, kTPC, kTRD, kTOF, kPHOS, kHMPID, kEMCAL, kMUON, kFMD,
kZDC, kPMD, kT0, kVZERO, kACORDE, kAD, kFIT, kMFT, kHLT, kGLOBAL, kCORR, kNDET};
enum ALITASK_t {
kNULLTASK=-1, kRAW, kSIM, kREC, kESD, kANA, kNTASK };
enum QABIT_t {
kNULLBit=-1, kINFO, kWARNING, kERROR, kFATAL, kNBIT };
enum TASKINDEX_t {
kNULLTASKINDEX=-1, kRAWS, kHITS, kSDIGITS, kDIGITS, kDIGITSR, kRECPOINTS, kTRACKSEGMENTS, kRECPARTICLES, kESDS, kNTASKINDEX };
enum MODE_t {kNULLMODE=0, kSIMMODE, kRECMODE, kQAMODE};
AliQAv1();
AliQAv1(const Int_t qalength, ULong_t * qa, const Int_t eslength, Bool_t * es) ;
AliQAv1(const ALITASK_t tsk) ;
AliQAv1(const DETECTORINDEX_t det) ;
AliQAv1(const AliQAv1& qa) ;
AliQAv1& operator = (const AliQAv1& qa) ;
virtual ~AliQAv1();
static AliQAv1 * Instance() ;
static AliQAv1 * Instance(const Int_t qalength, ULong_t * qa, const Int_t eslength, Bool_t * es) ;
static AliQAv1 * Instance(const DETECTORINDEX_t det) ;
static AliQAv1 * Instance(const ALITASK_t tsk) ;
static AliQAv1 * Instance(const TASKINDEX_t tsk) ;
Bool_t CheckFatal() const ;
static void Close() ;
static const char * GetAliTaskName(ALITASK_t tsk) ;
static TH1 * GetData(TObjArray** list, Int_t index, AliRecoParam::EventSpecie_t eventSpecie) ;
Bool_t * GetEventSpecies() { return fEventSpecies ; }
static const TString GetExpert() { return fgkExpert ; }
static UInt_t GetExpertBit() { return fgkExpertBit ; }
static UInt_t GetImageBit() { return fgkImageBit ; }
static const char * GetImageFileName() { return fgkImageFileName.Data() ; }
static const char * GetImageFileFormat() { return fImageFileFormat.Data() ; }
static const TString GetLabLocalFile() { return fgkLabLocalFile ; }
static const TString GetLabLocalOCDB() { return fgkLabLocalOCDB ; }
static const TString GetLabAliEnOCDB() { return fgkLabAliEnOCDB ; }
static DETECTORINDEX_t GetDetIndex(const char * name) ;
static const TString GetDetName(DETECTORINDEX_t det) { return fgDetNames[det] ; }
static const char * GetDetName(Int_t det) ;
static const TString GetGRPPath() { return fgGRPPath ; }
ULong_t * GetQA() { return fQA ; }
static UInt_t GetQABit() { return fgkQABit ; }
static TFile * GetQADataFile(const char * name, Int_t run) ;
static TFile * GetQADataFile(const char * fileName) ;
static const char * GetQADataFileName(const char * name, Int_t run)
{return Form("%s.%s.%d.root", name, fgQADataFileName.Data(), run) ; }
static const char * GetQADataFileName() { return fgQADataFileName.Data() ; }
static Int_t GetQADebugLevel() { return fgkQADebugLevel ; }
static const char * GetQAName() { return fgkQAName ; }
static const char * GetQACorrName() { return fgkQACorrNtName ; }
static UShort_t GetMaxQAObj() { return fgkMaxQAObjects ; }
static TFile * GetQAResultFile() ;
static const char * GetQAResultFileName() { return (fgQAResultDirName + fgQAResultFileName).Data() ; }
static const char * GetQARefDefaultStorage() { return fgkQARefOCDBDefault.Data() ; }
static const char * GetQARefFileName() { return fgQARefFileName ; }
static const char * GetQARefStorage() { return fgQARefDirName.Data() ; }
QABIT_t GetQAStatusBit(AliRecoParam::EventSpecie_t es = AliRecoParam::kDefault, DETECTORINDEX_t det=kNULLDET, ALITASK_t tsk=kNULLTASK) const ;
static const char * GetRefOCDBDirName() { return fgkRefOCDBDirName.Data() ; }
static const char * GetRefDataDirName() { return fgRefDataDirName.Data() ; }
static UInt_t GetClonedBit() { return fgkQAClonedBit; }
static UInt_t GetForbidCloningBit() { return fgkForbidCloningBit; }
static UInt_t GetOrigHistoKeptBit() { return fgkOrigHistoKeptBit; }
static TASKINDEX_t GetTaskIndex(const char * name) ;
static TString GetTaskName(UInt_t tsk) { return fgTaskNames[tsk] ; }
static const char * GetModeName(MODE_t mode) { return (mode == kSIMMODE || mode == kRECMODE || mode == kQAMODE) ? (fgModeNames[mode]).Data() : "" ; }
Bool_t IsEventSpecieSet(AliRecoParam::EventSpecie_t es) const
{Int_t ibit=0; while(es!=1<<ibit) ++ibit; return fEventSpecies[ibit];}
Bool_t IsEventSpecieSet(Int_t es) const { return fEventSpecies[es] ; }
Bool_t IsSet(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) const ;
Bool_t IsSet(DETECTORINDEX_t det, ALITASK_t tsk, Int_t es, QABIT_t bit) const ;
Bool_t IsSetAny(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es) const ;
Bool_t IsSetAny(DETECTORINDEX_t det, AliRecoParam::EventSpecie_t es) const ;
Long64_t Merge(const TCollection * list) ;
static MODE_t Mode(TASKINDEX_t task) ;
void Set(QABIT_t bit, AliRecoParam::EventSpecie_t es) ;
void Set(QABIT_t bit, Int_t es) ;
void SetEventSpecie(AliRecoParam::EventSpecie_t es)
{if(es==AliRecoParam::kDefault) return; Int_t ibit=0; while(es!=1<<ibit) ++ibit; fEventSpecies[ibit] = kTRUE ; }
void UnSetEventSpecie(AliRecoParam::EventSpecie_t es)
{if(es==AliRecoParam::kDefault) return; Int_t ibit=0; while(es!=1<<ibit) ++ibit; fEventSpecies[ibit] = kFALSE ; }
static void SetQADebug() { AliLog::SetGlobalDebugLevel(GetQADebugLevel()); }
static void SetQAResultDirName(const char * name) ;
static void SetQARefStorage(const char * name) ;
static void SetQARefDataDirName(AliRecoParam::EventSpecie_t es) { fgRefDataDirName = AliRecoParam::GetEventSpecieName(es) ; }
static void SetQARefDataDirName(Int_t es) { fgRefDataDirName = AliRecoParam::GetEventSpecieName(es) ; }
void Show(DETECTORINDEX_t det = kNULLDET) const ;
void ShowAll() const ;
void ShowStatus(DETECTORINDEX_t det, ALITASK_t tsk=kNULLTASK, AliRecoParam::EventSpecie_t es=AliRecoParam::kDefault) const ;
void UnSet(QABIT_t bit, AliRecoParam::EventSpecie_t es) ;
void UnSet(QABIT_t bit, Int_t es) ;
private:
Bool_t CheckRange(DETECTORINDEX_t det) const ;
Bool_t CheckRange(ALITASK_t tsk) const ;
Bool_t CheckRange(QABIT_t bit) const ;
Bool_t CheckRange(AliRecoParam::EventSpecie_t es) const ;
const char * GetBitName(QABIT_t bit) const ;
ULong_t GetStatus(DETECTORINDEX_t det, AliRecoParam::EventSpecie_t es) const { return fQA[det*fNEventSpecies+AliRecoParam::AConvert(es)] ;}
void Finish() const ;
ULong_t Offset(ALITASK_t tsk) const ;
void ShowASCIIStatus(AliRecoParam::EventSpecie_t es, DETECTORINDEX_t det, ALITASK_t tsk, ULong_t status) const ;
void Reset(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es) ;
void ResetStatus(DETECTORINDEX_t det) ;
void Set(DETECTORINDEX_t det) { fDet = det ;}
void Set(ALITASK_t tsk) { fTask = tsk ; AliDebug(GetQADebugLevel(), Form("Ready to set QA status in %s", GetAliTaskName(tsk) )) ; }
void SetStatus(DETECTORINDEX_t det, AliRecoParam::EventSpecie_t es, ULong_t status) { fQA[det*fNEventSpecies+AliRecoParam::AConvert(es)] = status ; }
void SetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) ;
void UnSetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) ;
static AliQAv1 * fgQA ;
Int_t fNdet ;
Int_t fNEventSpecies ;
Int_t fLengthQA ;
ULong_t * fQA ;
DETECTORINDEX_t fDet ;
ALITASK_t fTask ;
AliRecoParam::EventSpecie_t fEventSpecie ;
static TString fgDetNames[] ;
static TString fgGRPPath ;
static TFile * fgQADataFile ;
static TString fgQADataFileName ;
static TFile * fgQARefFile ;
static TString fgQARefDirName ;
static TString fgQARefFileName ;
static TFile * fgQAResultFile ;
static TString fgQAResultDirName ;
static TString fgQAResultFileName ;
static TString fgRTNames[] ;
static TString fgTaskNames[] ;
static TString fgModeNames[] ;
static const TString fgkExpert ;
static const UInt_t fgkExpertBit ;
static const UInt_t fgkImageBit ;
static const TString fgkLabLocalFile ;
static const TString fgkLabLocalOCDB ;
static const TString fgkLabAliEnOCDB ;
static const TString fgkRefFileName ;
static const UInt_t fgkQABit ;
static const Int_t fgkQADebugLevel ;
static const TString fgkQAName ;
static const TString fgkQACorrNtName ;
static const TString fgkRefOCDBDirName ;
static TString fgRefDataDirName ;
static const TString fgkQARefOCDBDefault ;
Bool_t * fEventSpecies ;
static const TString fgkImageFileName ;
static const TString fImageFileFormat ;
static const UShort_t fgkMaxQAObjects ;
static const UInt_t fgkQAClonedBit ;
static const UInt_t fgkForbidCloningBit ;
static const UInt_t fgkOrigHistoKeptBit ;
ClassDef(AliQAv1,3)
};
#endif