#ifndef ROOT_TUnfoldSys
#define ROOT_TUnfoldSys
#include <TUnfold.h>
class TMap;
class TUnfoldSys : public TUnfold {
private:
void InitTUnfoldSys(void);
protected:
TMatrixDSparse *fDAinRelSq;
TMatrixD* fDAinColRelSq;
TMatrixD* fAoutside;
TMap *fSysIn;
TMap *fBgrIn;
TMap *fBgrErrUncorrIn;
TMap *fBgrErrCorrIn;
Double_t fDtau;
TMatrixD *fYData;
TMatrixDSparse *fVyyData;
TMatrixDSparse *fEmatUncorrX;
TMatrixDSparse *fEmatUncorrAx;
TMap *fDeltaCorrX;
TMap *fDeltaCorrAx;
TMatrixDSparse *fDeltaSysTau;
protected:
TUnfoldSys(void);
virtual void ClearResults(void);
virtual void PrepareSysError(void);
virtual TMatrixDSparse *PrepareUncorrEmat(const TMatrixDSparse *m1,const TMatrixDSparse *m2);
virtual TMatrixDSparse *PrepareCorrEmat(const TMatrixDSparse *m1,const TMatrixDSparse *m2,const TMatrixDSparse *dsys);
void ScaleColumnsByVector(TMatrixDSparse *m,const TMatrixTBase<Double_t> *v) const;
void VectorMapToHist(TH1 *hist_delta,const TMatrixDSparse *delta,const Int_t *binMap);
void GetEmatrixFromVyy(const TMatrixDSparse *vyy,TH2 *ematrix,const Int_t *binMap,Bool_t clearEmat);
void DoBackgroundSubtraction(void);
public:
enum ESysErrMode {
kSysErrModeMatrix=0,
kSysErrModeShift=1,
kSysErrModeRelative=2
};
TUnfoldSys(const TH2 *hist_A, EHistMap histmap, ERegMode regmode = kRegModeSize,
EConstraint constraint=kEConstraintNone);
virtual ~ TUnfoldSys(void);
void AddSysError(const TH2 *sysError,const char *name, EHistMap histmap,
ESysErrMode mode);
void GetDeltaSysSource(TH1 *hist_delta,const char *source,
const Int_t *binMap=0);
void SubtractBackground(const TH1 *hist_bgr,const char *name,
Double_t scale=1.0,
Double_t scale_error=0.0);
virtual Int_t SetInput(const TH1 *hist_y,Double_t scaleBias=0.0,Double_t oneOverZeroError=0.0);
void GetDeltaSysBackgroundScale(TH1 *delta,const char *source,
const Int_t *binMap=0);
void SetTauError(Double_t delta_tau);
void GetDeltaSysTau(TH1 *delta,const Int_t *binMap=0);
void GetEmatrixSysUncorr(TH2 *ematrix,const Int_t *binMap=0,Bool_t clearEmat=kTRUE);
void GetEmatrixSysSource(TH2 *ematrix,const char *source,
const Int_t *binMap=0,Bool_t clearEmat=kTRUE);
void GetEmatrixSysBackgroundUncorr(TH2 *ematrix,const char *source,
const Int_t *binMap=0,Bool_t clearEmat=kTRUE);
void GetEmatrixSysBackgroundScale(TH2 *ematrix,const char *source,
const Int_t *binMap=0,Bool_t clearEmat=kTRUE);
void GetEmatrixSysTau(TH2 *ematrix,
const Int_t *binMap=0,Bool_t clearEmat=kTRUE);
void GetEmatrixInput(TH2 *ematrix,const Int_t *binMap=0,Bool_t clearEmat=kTRUE);
void GetEmatrixTotal(TH2 *ematrix,const Int_t *binMap=0);
Double_t GetChi2Sys(void);
ClassDef(TUnfoldSys, 0)
};
#endif