#ifndef ALIITSPLANEEFFSPD_H
#define ALIITSPLANEEFFSPD_H
#include <TH1F.h>
#include <TH2I.h>
#include <TProfile.h>
#include "AliITSPlaneEff.h"
class AliCDBId;
class AliITSPlaneEffSPD : public AliITSPlaneEff {
public:
AliITSPlaneEffSPD();
virtual ~AliITSPlaneEffSPD();
AliITSPlaneEffSPD(const AliITSPlaneEffSPD &source);
AliITSPlaneEffSPD& operator=(const AliITSPlaneEffSPD &s);
AliITSPlaneEffSPD& operator +=( const AliITSPlaneEffSPD &add);
Double_t PlaneEff(const UInt_t mod, const UInt_t chip, Bool_t FO=kFALSE, const UInt_t BCm4=0) const;
Double_t ErrPlaneEff(const UInt_t mod, const UInt_t chip, Bool_t FO=kFALSE, const UInt_t BCm4=0) const;
Double_t PlaneEff(const UInt_t key) const
{return PlaneEff(GetModFromKey(key),GetChipFromKey(key),IsForFO(key),GetBCm4FromKey(key));};
Double_t ErrPlaneEff(const UInt_t key) const
{return ErrPlaneEff(GetModFromKey(key),GetChipFromKey(key),IsForFO(key),GetBCm4FromKey(key));};
Int_t GetFound(const UInt_t key) const;
Int_t GetTried(const UInt_t key) const;
Bool_t UpDatePlaneEff(const Bool_t Kfound, const UInt_t mod, const UInt_t chip, Bool_t FO=kFALSE, const UInt_t BCm4=0);
Bool_t UpDatePlaneEff(const Bool_t Kfound, const UInt_t key)
{return UpDatePlaneEff(Kfound,GetModFromKey(key),GetChipFromKey(key),IsForFO(key),GetBCm4FromKey(key));};
enum {kNModule = 240};
enum {kNModuleLy1 = 80};
enum {kNChip = 5};
enum {kNCol = 32};
enum {kNRow = 256};
enum {kNClockPhase = 4};
virtual Double_t LivePlaneEff(UInt_t key) const;
Double_t LivePlaneEff(const UInt_t mod, const UInt_t chip) const
{return LivePlaneEff(GetKey(mod,chip));};
virtual Double_t ErrLivePlaneEff(UInt_t key) const;
Double_t ErrLivePlaneEff(const UInt_t mod, const UInt_t chip) const
{return ErrLivePlaneEff(GetKey(mod,chip));};
virtual Double_t GetFracLive(const UInt_t key) const;
virtual Double_t GetFracBad(const UInt_t key) const;
virtual Bool_t WriteIntoCDB() const;
virtual Bool_t ReadFromCDB();
Bool_t AddFromCDB(AliCDBId *cdbId);
virtual Bool_t AddFromCDB() {AliCDBId *cdbId=0; return AddFromCDB(cdbId);}
UInt_t GetKey(const UInt_t mod, const UInt_t chip, const Bool_t FO=kFALSE, const UInt_t BCm4=0) const;
UInt_t SwitchChipKeyNumbering(UInt_t key) const;
UInt_t GetKeyFromDetLocCoord(Int_t ilay,Int_t idet, Float_t, Float_t locz) const;
UInt_t Nblock() const;
Bool_t GetBlockBoundaries(const UInt_t key,Float_t& xmn,Float_t& xmx,Float_t& zmn,Float_t& zmx) const;
virtual void SetCreateHistos(Bool_t his=kFALSE)
{fHis=his; if(fHis) {DeleteHistos(); InitHistos();} else DeleteHistos(); return; }
virtual Bool_t FillHistos(UInt_t key, Bool_t found, Float_t *track, Float_t *cluster, Int_t *ctype, Float_t *angtrkmod);
virtual Bool_t WriteHistosToFile(TString filename="PlaneEffSPDHistos.root",Option_t* option = "RECREATE");
virtual Bool_t ReadHistosFromFile(TString filename="PlaneEffSPDHistos.root");
protected:
virtual void Copy(TObject &obj) const;
Int_t GetMissingTracksForGivenEff(Double_t eff, Double_t RelErr, UInt_t im, UInt_t ic) const;
UInt_t GetModFromKey(const UInt_t key) const;
UInt_t GetChipFromKey(const UInt_t key) const;
Bool_t IsForFO(const UInt_t key) const;
UInt_t GetBCm4FromKey(const UInt_t key) const;
UInt_t GetChipFromCol(const UInt_t col) const;
UInt_t GetColFromLocZ(Float_t zloc) const;
Float_t GetLocZFromCol(const UInt_t col) const;
Float_t GetLocXFromRow(const UInt_t row) const;
void GetModAndChipFromKey(const UInt_t key, UInt_t& mod, UInt_t& chip) const;
void GetDeadAndNoisyInChip(const UInt_t key, UInt_t& dead, UInt_t& noisy) const;
Int_t fFound[kNModule*kNChip*(kNClockPhase+1)];
Int_t fTried[kNModule*kNChip*(kNClockPhase+1)];
Bool_t FillHistosStd(UInt_t key, Bool_t found, Float_t *track, Float_t *cluster, Int_t *ctype, Float_t *angtrkmod);
Bool_t FillHistosFO(UInt_t key, Bool_t found, Float_t *track);
private:
enum {kNHisto = kNModule};
enum {kNclu = 3};
virtual void InitHistos();
virtual void DeleteHistos();
virtual void CopyHistos(AliITSPlaneEffSPD& target) const;
TH1F **fHisResX;
TH1F **fHisResZ;
TH2F **fHisResXZ;
TH2I **fHisClusterSize;
TH1F ***fHisResXclu;
TH1F ***fHisResZclu;
TH1F ***fHisResXchip;
TH1F ***fHisResZchip;
TProfile **fProfResXvsPhi;
TProfile **fProfResZvsDip;
TProfile ***fProfResXvsPhiclu;
TProfile ***fProfResZvsDipclu;
TH1F **fHisTrackErrX;
TH1F **fHisTrackErrZ;
TH1F **fHisClusErrX;
TH1F **fHisClusErrZ;
TH1F ***fHisTrackXFOtrue;
TH1F ***fHisTrackZFOtrue;
TH1F ***fHisTrackXFOfalse;
TH1F ***fHisTrackZFOfalse;
TH2F ***fHisTrackXZFOtrue;
TH2F ***fHisTrackXZFOfalse;
ClassDef(AliITSPlaneEffSPD,4)
};
inline UInt_t AliITSPlaneEffSPD::Nblock() const {return kNModule*kNChip;}
inline Int_t AliITSPlaneEffSPD::GetFound(const UInt_t key) const {
if(key>=kNModule*kNChip*(kNClockPhase+1)) {AliWarning("GetFound: you asked for a non existing key"); return -1;}
if(key>=kNModule*kNChip)AliWarning("GetFound: you asked for FO efficiency studies");
return fFound[key];
}
inline Int_t AliITSPlaneEffSPD::GetTried(const UInt_t key) const {
if(key>=kNModule*kNChip*(kNClockPhase+1)) {AliWarning("GetTried: you asked for a non existing key"); return -1;}
if(key>=kNModule*kNChip)AliWarning("GetTried: you asked for FO efficiency studies");
return fTried[key];
}
#endif