#ifndef ALITRDCALIBRAFIT_H
#define ALITRDCALIBRAFIT_H
#ifndef ROOT_TObject
# include <TObject.h>
#endif
#ifndef ROOT_TVectorD
# include <TVectorD.h>
#endif
class TString;
class TTree;
class TProfile2D;
class TGraphErrors;
class TObjArray;
class TH1I;
class TH1;
class TH1F;
class TH2I;
class TH2F;
class TF1;
class TTreeSRedirector;
class AliLog;
class AliTRDCalibraMode;
class AliTRDCalibraVector;
class AliTRDCalibraVdriftLinearFit;
class AliTRDCalibraExbAltFit;
class AliTRDCalDet;
class AliTRDCalROC;
class AliTRDgeometry;
class AliTRDCalibraFit : public TObject {
public:
static AliTRDCalibraFit *Instance();
static void Terminate();
static void Destroy();
void DestroyDebugStreamer();
AliTRDCalibraFit(const AliTRDCalibraFit &c);
AliTRDCalibraFit &operator=(const AliTRDCalibraFit &) { return *this; }
void SetCalDetVdriftExB(AliTRDCalDet *calDetVdriftUsed,AliTRDCalDet *calDetExBUsed) {fCalDetVdriftUsed = calDetVdriftUsed; fCalDetExBUsed = calDetExBUsed;};
Bool_t AnalyseCH(const TH2I *ch);
Bool_t AnalyseCH(AliTRDCalibraVector *calvect);
Double_t AnalyseCHAllTogether(const TH2I *ch);
Bool_t AnalysePH(const TProfile2D *ph);
Bool_t AnalysePH(AliTRDCalibraVector *calvect);
Double_t AnalysePHAllTogether(const TProfile2D *ph);
Bool_t AnalysePRF(const TProfile2D *prf);
Bool_t AnalysePRF(AliTRDCalibraVector *calvect);
Bool_t AnalysePRFMarianFit(const TProfile2D *prf);
Bool_t AnalysePRFMarianFit(AliTRDCalibraVector *calvect);
Bool_t AnalyseLinearFitters(AliTRDCalibraVdriftLinearFit *calivdli);
void AnalyseLinearFittersAllTogether(AliTRDCalibraVdriftLinearFit *calivdli, Double_t &vdriftoverall, Double_t &exboverall);
Bool_t AnalyseExbAltFit(AliTRDCalibraExbAltFit *calivdli);
Bool_t SetModeCalibration(TString name, Int_t i);
void ResetVectorFit();
void CalculPolynomeLagrange2(const Double_t *x, const Double_t *y, Double_t &c0, Double_t &c1, Double_t &c2, Double_t &c3, Double_t &c4) const;
void CalculPolynomeLagrange3(const Double_t *x, const Double_t *y, Double_t &c0, Double_t &c1, Double_t &c2, Double_t &c3, Double_t &c4) const;
void CalculPolynomeLagrange4(const Double_t *x, const Double_t *y, Double_t &c0, Double_t &c1, Double_t &c2, Double_t &c3, Double_t &c4) const;
void RemoveOutliers(Int_t type, Bool_t perdetector = kFALSE);
void RemoveOutliers2(Bool_t perdetector = kFALSE);
void PutMeanValueOtherVectorFit(Int_t ofwhat = 1, Bool_t perdetector = kFALSE);
void PutMeanValueOtherVectorFit2(Int_t ofwhat = 1, Bool_t perdetector = kFALSE);
AliTRDCalDet *CreateDetObjectVdrift(const TObjArray *vectorFit, Bool_t perdetector = kFALSE);
AliTRDCalDet *CreateDetObjectGain(const TObjArray *vectorFit, Bool_t meanOtherBefore=kTRUE, Double_t scaleFitFactor = 0.02431, Bool_t perdetector = kTRUE);
AliTRDCalDet *CreateDetObjectT0(const TObjArray *vectorFit, Bool_t perdetector = kFALSE);
AliTRDCalDet *CreateDetObjectLorentzAngle(const TObjArray *vectorFit);
AliTRDCalDet *CreateDetObjectExbAlt(const TObjArray *vectorFit);
TObject *CreatePadObjectGain(const TObjArray *vectorFit = 0, Double_t scaleFitFactor = 1.0, const AliTRDCalDet *detobject = 0);
TObject *CreatePadObjectVdrift(const TObjArray *vectorFit = 0, const AliTRDCalDet *detobject = 0);
TObject *CreatePadObjectT0(const TObjArray *vectorFit = 0, const AliTRDCalDet *detobject = 0);
TObject *CreatePadObjectPRF(const TObjArray *vectorFit);
AliTRDCalDet *MakeOutliersStatDet(const TObjArray *vectorFit, const char *name, Double_t &mean);
TObject *MakeOutliersStatPad(const TObjArray *vectorFit, const char *name, Double_t &mean);
void ChooseMethod(Short_t method) { fMethod = method; }
void SetBeginFitCharge(Float_t beginFitCharge);
void SetFitOutliersChargeLow(Float_t fitOutliersChargeLow) { fOutliersFitChargeLow = fitOutliersChargeLow; }
void SetFitOutliersChargeHigh(Float_t fitOutliersChargeHigh) { fOutliersFitChargeHigh = fitOutliersChargeHigh; }
void SetPeriodeFitPH(Int_t periodeFitPH);
void SetTakeTheMaxPH() { fTakeTheMaxPH = kTRUE; }
void SetT0Shift0(Float_t t0Shift0);
void SetT0Shift1(Float_t t0Shift1);
void SetRangeFitPRF(Float_t rangeFitPRF);
void SetAccCDB() { fAccCDB = kTRUE; }
void SetMinEntries(Int_t minEntries);
void SetRebin(Short_t rebin);
Int_t GetPeriodeFitPH() const { return fFitPHPeriode; }
Float_t GetFitOutliersChargeLow() const { return fOutliersFitChargeLow; }
Float_t GetFitOutliersChargeHigh() const { return fOutliersFitChargeHigh; }
Bool_t GetTakeTheMaxPH() const { return fTakeTheMaxPH; }
Float_t GetT0Shift0() const { return fT0Shift0; }
Float_t GetT0Shift1() const { return fT0Shift1; }
Float_t GetRangeFitPRF() const { return fRangeFitPRF; }
Bool_t GetAccCDB() const { return fAccCDB; }
Int_t GetMinEntries() const { return fMinEntries; }
Short_t GetRebin() const { return fRebin; }
Float_t GetScaleFactorGain() const { return fScaleGain; }
Int_t GetNumberFit() const { return fNumberFit; }
Int_t GetNumberFitSuccess() const { return fNumberFitSuccess; }
Int_t GetNumberEnt() const { return fNumberEnt; }
Double_t GetStatisticMean() const { return fStatisticMean; }
void SetDebugLevel(Short_t level) { fDebugLevel = level; }
void SetDet(Int_t iLayer, Int_t iStack, Int_t iSector) { fDet[0] = iLayer;
fDet[1] = iStack;
fDet[2] = iSector; }
void SetFitVoir(Int_t fitVoir) { fFitVoir = fitVoir; }
void SetMagneticField(Float_t magneticfield) { fMagneticField = magneticfield; }
Double_t GetScaleFitFactor() const { return fScaleFitFactor; }
TObjArray GetVectorFit() const { return fVectorFit; }
TObjArray GetVectorFit2() const { return fVectorFit2; }
AliTRDCalibraMode *GetCalibraMode() const { return fCalibraMode; }
class AliTRDFitInfo : public TObject {
public:
AliTRDFitInfo()
:TObject()
,fCoef(0x0)
,fDetector(-1) { }
AliTRDFitInfo(const AliTRDFitInfo &i)
:TObject(i)
,fCoef(0x0)
,fDetector(-1) { }
AliTRDFitInfo &operator=(const AliTRDFitInfo&) { return *this; }
virtual ~AliTRDFitInfo() { if(fCoef) { delete [] fCoef;} }
void SetCoef(Float_t *coef) { fCoef = coef; }
void SetDetector(Int_t detector) { fDetector = detector; }
Float_t *GetCoef() const { return fCoef; }
Int_t GetDetector() const { return fDetector; }
protected:
Float_t *fCoef;
Int_t fDetector;
};
void FitLagrangePoly(TH1* projPH);
protected:
AliTRDgeometry *fGeo;
Int_t fNumberOfBinsExpected;
Short_t fMethod;
Float_t fBeginFitCharge;
Float_t fOutliersFitChargeLow;
Float_t fOutliersFitChargeHigh;
Int_t fFitPHPeriode;
Bool_t fTakeTheMaxPH;
Float_t fT0Shift0;
Float_t fT0Shift1;
Float_t fRangeFitPRF;
Bool_t fAccCDB;
Int_t fMinEntries;
Short_t fRebin;
Float_t fScaleGain;
Int_t fNumberFit;
Int_t fNumberFitSuccess;
Int_t fNumberEnt;
Double_t fStatisticMean;
TTreeSRedirector *fDebugStreamer;
Short_t fDebugLevel;
Int_t fDet[3];
Int_t fFitVoir;
Float_t fMagneticField;
AliTRDCalibraMode *fCalibraMode;
Float_t fCurrentCoef[2];
Float_t fCurrentCoefE;
Float_t fCurrentCoef2[2];
Float_t fCurrentCoefE2;
Float_t fPhd[3];
Int_t fDect1;
Int_t fDect2;
Double_t fScaleFitFactor;
Int_t fEntriesCurrent;
Int_t fCountDet;
Int_t fCount;
Int_t fNbDet;
AliTRDCalDet *fCalDet;
AliTRDCalROC *fCalROC;
AliTRDCalDet *fCalDet2;
AliTRDCalROC *fCalROC2;
AliTRDCalDet *fCalDetVdriftUsed;
AliTRDCalDet *fCalDetExBUsed;
Float_t *fCurrentCoefDetector;
Float_t *fCurrentCoefDetector2;
TObjArray fVectorFit;
TObjArray fVectorFit2;
Bool_t InitFit(Int_t nbins, Int_t i);
Bool_t InitFitCH();
Bool_t InitFitPH();
Bool_t InitFitPRF();
Bool_t InitFitLinearFitter();
Bool_t InitFitExbAlt();
Bool_t NotEnoughStatisticCH(Int_t idect);
Bool_t NotEnoughStatisticPH(Int_t idect,Double_t nentries);
Bool_t NotEnoughStatisticPRF(Int_t idect);
Bool_t NotEnoughStatisticLinearFitter();
Bool_t NotEnoughStatisticExbAlt();
Bool_t FillInfosFitCH(Int_t idect);
Bool_t FillInfosFitPH(Int_t idect,Double_t nentries);
Bool_t FillInfosFitPRF(Int_t idect);
Bool_t FillInfosFitLinearFitter();
Bool_t FillInfosFitExbAlt();
void FillFillCH(Int_t idect);
void FillFillPH(Int_t idect,Double_t nentries);
void FillFillPRF(Int_t idect);
void FillFillLinearFitter();
void FillFillExbAlt();
Bool_t FillVectorFit();
Bool_t FillVectorFit2();
void InitfCountDetAndfCount(Int_t i);
void CalculNumberOfBinsExpected(Int_t i);
void CalculDect1Dect2(Int_t i);
void UpdatefCountDetAndfCount(Int_t idect, Int_t i);
void ReconstructFitRowMinRowMax(Int_t idect, Int_t i);
Bool_t CheckFitVoir();
void NormierungCharge();
Bool_t SetNrphiFromTObject(TString name, Int_t i);
Bool_t SetNzFromTObject(TString name, Int_t i);
Int_t GetNumberOfGroupsPRF(TString nametitle);
Bool_t CalculVdriftCoefMean();
Bool_t CalculChargeCoefMean(Bool_t vrai);
Bool_t CalculPRFCoefMean();
Bool_t CalculT0CoefMean();
Bool_t CalculVdriftLorentzCoef();
Float_t GetPRFDefault(Int_t layer) const;
void SetCalROC(Int_t i);
void FitBisCHEx(TH1 *projch, Double_t mean, Double_t nentries);
void FitBisCH(TH1 *projch, Double_t mean, Double_t nentries);
void FitCH(TH1 *projch, Double_t mean, Double_t nentries);
void FitLandau(TH1 *projch, Double_t mean, Double_t nentries);
void FitMeanW(TH1 *projch, Double_t nentries);
void FitMeanWSm(TH1 *projch, Float_t sumAll);
void FitMean(TH1 *projch, Double_t nentries, Double_t mean);
void FitPH(TH1 *projPH, Int_t idect);
void FitPRF(TH1 *projPRF);
void RmsPRF(TH1 *projPRF);
Bool_t FitPRFGausMI(Double_t *arraye,Double_t *arraym,Double_t *arrayme,Int_t nBins,Float_t xMin,Float_t xMax);
Double_t FitGausMI(Double_t *arraye,Double_t *arraym,Double_t *arrayme,Int_t nBins, Float_t xMin,Float_t xMax,TVectorD *param, Bool_t kError= kTRUE);
void FitPente(TH1 *projPH);
void FitTnpRange(Double_t *arraye,Double_t *arraym,Double_t *arrayme,Int_t nbg,Int_t nybins);
TH1I *ReBin(const TH1I *hist) const;
TH1F *ReBin(const TH1F *hist) const;
virtual Int_t GetLayer(Int_t d) const;
virtual Int_t GetStack(Int_t d) const;
virtual Int_t GetSector(Int_t d) const;
static AliTRDCalibraFit *fgInstance;
static Bool_t fgTerminated;
private:
static Double_t PH(const Double_t *x, const Double_t *par);
static Double_t AsymmGauss(const Double_t *x, const Double_t *par);
static Double_t FuncLandauGaus(const Double_t *x, const Double_t *par);
static Double_t LanGauFun(const Double_t *x, const Double_t *par);
static Double_t LanGauFunEx(const Double_t *x, const Double_t *par);
TF1 *LanGauFit(TH1 *his, const Double_t *fitrange, const Double_t *startvalues
, const Double_t *parlimitslo, const Double_t *parlimitshi, Double_t *fitparams
, Double_t *fiterrors, Double_t *chiSqr, Int_t *ndf) const;
TF1 *LanGauFitEx(TH1 *his, const Double_t *fitrange, const Double_t *startvalues
, const Double_t *parlimitslo, const Double_t *parlimitshi
, Double_t *fitparams, Double_t *fiterrors
, Double_t *chiSqr, Int_t *ndf) const;
AliTRDCalibraFit();
virtual ~AliTRDCalibraFit();
ClassDef(AliTRDCalibraFit,3)
};
#endif