ROOT logo
// Author: Stefan Schmitt
// DESY, 23/01/09

// Version 13, support for systematic errors

#ifndef ROOT_TUnfoldSys
#define ROOT_TUnfoldSys

#include <TUnfold.h>

class TMap;

class TUnfoldSys : public TUnfold {
 private:
   void InitTUnfoldSys(void);     // initialize all data members
 protected:
   TMatrixDSparse * fDA2;       // Input: uncorrelated errors on fA (squared)
   TMatrixD* fDAcol;            // Input: normalized column errors on fA
   TMatrixD* fAoutside;         // Input: underflow/overflow bins
   TMap *fSysIn;                // Input: correlated errors
   TMatrixDSparse *fESparse;    // Result: sparse version of fE
   TMatrixDSparse *fVYAx;       // Result: V(y-Ax) for syst.errors
   TMatrixDSparse *fEAtV;       // Result: EA#V    for syst.errors  
   TMatrixDSparse *fAE;         // Result: AE for chi**2
   TMatrixDSparse *fAEAtV_one;  // Result: AEA#V-1 for chi**2
   TMatrixD *fErrorUncorrX;     // Result: syst.error from fDA2 on fX
   TMatrixD *fErrorUncorrAx;    // Result: syst.error from fDA2 on fAx
   TMap *fErrorCorrX;           // Result: syst.error from fSysIn
   TMap *fErrorCorrAx;          // Result: syst.error from fSysIn
 protected:
   TUnfoldSys(void);            // for derived classes
   virtual void ClearResults(void);     // clear all results
   virtual void PrepareSysError(void); // common calculations for syst.errors
   virtual TMatrixD *PrepareUncorrEmat(TMatrixDSparse const *m1,TMatrixDSparse const *m2); // calculate uncorrelated error matrix
   virtual TMatrixD *PrepareCorrEmat(TMatrixDSparse const *m1,TMatrixDSparse const *m2,TMatrixDSparse const *dsys); // calculate correlated error matrix
 public:
   enum ESysErrMode { // meaning of the argument to AddSysError()
     kSysErrModeMatrix=0, // matrix is an alternative to the default matrix, the errors are the difference to the original matrix
     kSysErrModeShift=1, // matrix gives the absolute shifts
     kSysErrModeRelative=2 // matrix gives the relative shifts
   };
   TUnfoldSys(TH2 const *hist_A, EHistMap histmap, ERegMode regmode = kRegModeSize);      // constructor
   virtual ~ TUnfoldSys(void);    // delete data members
   void AddSysError(TH2 const *sysError,char const *name, EHistMap histmap,
                    ESysErrMode mode); // add a systematic error source
   void GetEmatrixSysUncorr(TH2 *ematrix,Int_t const *binMap=0,Bool_t clearEmat=kTRUE); // get error matrix contribution from statistical errors on the matrix A
   void GetEmatrixSysSource(TH2 *ematrix,char const *source,
                            Int_t const *binMap=0,Bool_t clearEmat=kTRUE); // get error matrix from one systematic source

   void GetEmatrixSysTotal(TH2 *ematrix,Int_t const *binMap=0,Bool_t clearEmat=kTRUE); // get total systematic error
   void GetEmatrixTotal(TH2 *ematrix,Int_t const *binMap=0); // get total error including statistical error

   Double_t GetChi2Sys(void);

   ClassDef(TUnfoldSys, 0) //Unfolding with support for systematic error propagation
};

#endif
 TUnfoldSys.h:1
 TUnfoldSys.h:2
 TUnfoldSys.h:3
 TUnfoldSys.h:4
 TUnfoldSys.h:5
 TUnfoldSys.h:6
 TUnfoldSys.h:7
 TUnfoldSys.h:8
 TUnfoldSys.h:9
 TUnfoldSys.h:10
 TUnfoldSys.h:11
 TUnfoldSys.h:12
 TUnfoldSys.h:13
 TUnfoldSys.h:14
 TUnfoldSys.h:15
 TUnfoldSys.h:16
 TUnfoldSys.h:17
 TUnfoldSys.h:18
 TUnfoldSys.h:19
 TUnfoldSys.h:20
 TUnfoldSys.h:21
 TUnfoldSys.h:22
 TUnfoldSys.h:23
 TUnfoldSys.h:24
 TUnfoldSys.h:25
 TUnfoldSys.h:26
 TUnfoldSys.h:27
 TUnfoldSys.h:28
 TUnfoldSys.h:29
 TUnfoldSys.h:30
 TUnfoldSys.h:31
 TUnfoldSys.h:32
 TUnfoldSys.h:33
 TUnfoldSys.h:34
 TUnfoldSys.h:35
 TUnfoldSys.h:36
 TUnfoldSys.h:37
 TUnfoldSys.h:38
 TUnfoldSys.h:39
 TUnfoldSys.h:40
 TUnfoldSys.h:41
 TUnfoldSys.h:42
 TUnfoldSys.h:43
 TUnfoldSys.h:44
 TUnfoldSys.h:45
 TUnfoldSys.h:46
 TUnfoldSys.h:47
 TUnfoldSys.h:48
 TUnfoldSys.h:49
 TUnfoldSys.h:50
 TUnfoldSys.h:51
 TUnfoldSys.h:52
 TUnfoldSys.h:53
 TUnfoldSys.h:54
 TUnfoldSys.h:55
 TUnfoldSys.h:56
 TUnfoldSys.h:57
 TUnfoldSys.h:58