#ifndef ALIESDRUN_H
#define ALIESDRUN_H
#include <TObject.h>
#include <TObjArray.h>
#include <TString.h>
class TGeoHMatrix;
class AliESDVertex;
class AliESDRun: public TObject {
public:
enum StatusBits {kBInfoStored = BIT(14), kUniformBMap = BIT(15), kConvSqrtSHalfGeV = BIT(16)};
AliESDRun();
AliESDRun(const AliESDRun& esd);
AliESDRun& operator=(const AliESDRun& esd);
virtual void Copy(TObject &obj) const;
virtual ~AliESDRun();
Bool_t InitMagneticField() const;
Int_t GetRunNumber() const {return fRunNumber;}
void SetRunNumber(Int_t n) {fRunNumber=n;}
void SetMagneticField(Float_t mf){fMagneticField = mf;}
Double_t GetMagneticField() const {return fMagneticField;}
UInt_t GetPeriodNumber() const {return fPeriodNumber;}
void SetPeriodNumber(Int_t n) {fPeriodNumber=n;}
void Reset();
void Print(const Option_t *opt=0) const;
void SetDiamond(const AliESDVertex *vertex);
void SetTriggerClass(const char*name, Int_t index);
void SetCurrentL3(Float_t cur) {fCurrentL3 = cur;}
void SetCurrentDip(Float_t cur) {fCurrentDip = cur;}
void SetBeamEnergy(Float_t be) {fBeamEnergy = be;}
void SetBeamType(const char* bt) {fBeamType = bt;}
void SetBeamEnergyIsSqrtSHalfGeV(Bool_t v=kTRUE) {SetBit(kConvSqrtSHalfGeV,v);}
void SetDetectorsInDAQ(UInt_t detmask) { fDetInDAQ = detmask; }
void SetDetectorsInReco(UInt_t detmask) { fDetInReco = detmask; }
Bool_t IsBeamEnergyIsSqrtSHalfGeV() const {return TestBit(kConvSqrtSHalfGeV);}
Double_t GetDiamondX() const {return fDiamondXY[0];}
Double_t GetDiamondY() const {return fDiamondXY[1];}
Double_t GetDiamondZ() const {return fDiamondZ;}
Double_t GetSigma2DiamondX() const {return fDiamondCovXY[0];}
Double_t GetSigma2DiamondY() const {return fDiamondCovXY[2];}
Double_t GetSigma2DiamondZ() const {return fDiamondSig2Z;}
void GetDiamondCovXY(Float_t cov[3]) const {
for(Int_t i=0;i<3;i++) cov[i]=fDiamondCovXY[i]; return;
}
const char* GetTriggerClass(Int_t index) const;
TString GetActiveTriggerClasses() const;
TString GetFiredTriggerClasses(ULong64_t mask) const;
TString GetFiredTriggerClassesNext50(ULong64_t mask) const;
TString GetFiredTriggerClasses(ULong64_t mask,ULong64_t mask2) const;
void PrintAllTriggerClasses() const;
Bool_t IsTriggerClassFired(ULong64_t mask, const char *name) const;
Bool_t IsTriggerClassFired(ULong64_t mask, ULong64_t mask2,const char *name) const;
Float_t GetCurrentL3() const {return fCurrentL3;}
Float_t GetCurrentDip() const {return fCurrentDip;}
Float_t GetBeamEnergy() const {return IsBeamEnergyIsSqrtSHalfGeV() ? fBeamEnergy : fBeamEnergy/2;}
const char* GetBeamType() const {return (fBeamType=="Pb-Pb") ? "A-A":fBeamType.Data();}
void SetBeamParticle(Int_t az, Int_t ibeam) {fBeamParticle[ibeam] = az;}
Int_t GetBeamParticle(Int_t ibeam) const {return fBeamParticle[ibeam];}
Int_t GetBeamParticleA(Int_t ibeam) const {return fBeamParticle[ibeam]/1000;}
Int_t GetBeamParticleZ(Int_t ibeam) const {return fBeamParticle[ibeam]%1000;}
UInt_t GetDetectorsInDAQ() const {return fDetInDAQ; }
UInt_t GetDetectorsInReco() const {return fDetInReco; }
void SetPHOSMatrix(TGeoHMatrix*matrix, Int_t i) {
if ((i >= 0) && (i < kNPHOSMatrix)) fPHOSMatrix[i] = matrix;
}
const TGeoHMatrix* GetPHOSMatrix(Int_t i) const {
return ((i >= 0) && (i < kNPHOSMatrix)) ? fPHOSMatrix[i] : NULL;
}
void SetEMCALMatrix(TGeoHMatrix*matrix, Int_t i) {
if ((i >= 0) && (i < kNEMCALMatrix)) fEMCALMatrix[i] = matrix;
}
const TGeoHMatrix* GetEMCALMatrix(Int_t i) const {
return ((i >= 0) && (i < kNEMCALMatrix)) ? fEMCALMatrix[i] : NULL;
}
enum {kNTriggerClasses = 100};
enum {kNPHOSMatrix = 5};
enum {kNEMCALMatrix = 22};
enum {kT0spreadSize = 4};
Double_t GetMeanIntensity(int beam,int btp) const
{ return (beam>=0&&beam<2&&btp>=0&&btp<2) ? fMeanBeamInt[beam][btp]:0;}
void SetMeanIntensity(int beam,int btp, double v=-1)
{ if (beam>=0&&beam<2&&btp>=0&&btp<2) fMeanBeamInt[beam][btp]=v;}
Double_t GetMeanIntensityIntecting(int beam) const {return GetMeanIntensity(beam,0);}
Double_t GetMeanIntensityNonIntecting(int beam) const {return GetMeanIntensity(beam,1);}
Float_t GetT0spread(Int_t i) const {
return ((i >= 0) && (i<kT0spreadSize)) ? fT0spread[i] : 0;}
void SetT0spread(Int_t i, Float_t t);
void SetT0spread(Float_t *t);
void SetCaloTriggerType(const Int_t* in) {for (int i = 0; i < 15; i++) fCaloTriggerType[i] = in[i];}
Int_t* GetCaloTriggerType() {return fCaloTriggerType;}
void SetVZEROEqFactors(Float_t factors[64]) {for (Int_t i = 0; i < 64; ++i) fVZEROEqFactors[i] = factors[i];}
const Float_t* GetVZEROEqFactors() const {return fVZEROEqFactors;}
Float_t GetVZEROEqFactors(Int_t i) const {return fVZEROEqFactors[i];}
private:
Float_t fCurrentL3;
Float_t fCurrentDip;
Float_t fBeamEnergy;
Double32_t fMagneticField;
Double32_t fMeanBeamInt[2][2];
Double32_t fDiamondXY[2];
Double32_t fDiamondCovXY[3];
Double32_t fDiamondZ;
Double32_t fDiamondSig2Z;
UInt_t fPeriodNumber;
Int_t fRunNumber;
Int_t fRecoVersion;
Int_t fBeamParticle[2];
TString fBeamType;
TObjArray fTriggerClasses;
UInt_t fDetInDAQ;
UInt_t fDetInReco;
TGeoHMatrix* fPHOSMatrix[kNPHOSMatrix];
TGeoHMatrix* fEMCALMatrix[kNEMCALMatrix];
Float_t fT0spread[kT0spreadSize];
Int_t fCaloTriggerType[15];
Float_t fVZEROEqFactors[64];
ClassDef(AliESDRun,15)
};
#endif