A++ » INCLUDE » TUnfold

class TUnfold: public TObject



TUnfold provides functionality to correct data
for migration effects.

Citation: S.Schmitt, JINST 7 (2012) T10003 [arXiv:1205.6201]


TUnfold solves the inverse problem

T   -1            2          T
chi**2 = (y-Ax) Vyy  (y-Ax) + tau  (L(x-x0)) L(x-x0)

Monte Carlo input
y: vector of measured quantities  (dimension ny)
Vyy: covariance matrix for y (dimension ny x ny)
A: migration matrix               (dimension ny x nx)
x: unknown underlying distribution (dimension nx)
Regularisation
tau: parameter, defining the regularisation strength
L: matrix of regularisation conditions (dimension nl x nx)
x0: underlying distribution bias

where chi**2 is minimized as a function of x

The algorithm is based on "standard" matrix inversion, with the
known limitations in numerical accuracy and computing cost for
matrices with large dimensions.

Thus the algorithm should not used for large dimensions of x and y
dim(x) should not exceed O(100)
dim(y) should not exceed O(500)


Function Members (Methods)

public:
virtual~TUnfold()
voidTObject::AbstractMethod(const char* method) const
virtual voidTObject::AppendPad(Option_t* option = "")
virtual voidTObject::Browse(TBrowser* b)
static TClass*Class()
virtual const char*TObject::ClassName() const
virtual voidTObject::Clear(Option_t* = "")
virtual TObject*TObject::Clone(const char* newname = "") const
virtual Int_tTObject::Compare(const TObject* obj) const
virtual voidTObject::Copy(TObject& object) const
virtual voidTObject::Delete(Option_t* option = "")MENU
virtual Int_tTObject::DistancetoPrimitive(Int_t px, Int_t py)
virtual Double_tDoUnfold(Double_t tau)
Double_tDoUnfold(Double_t tau, const TH1* hist_y, Double_t scaleBias = 0.)
virtual voidTObject::Draw(Option_t* option = "")
virtual voidTObject::DrawClass() constMENU
virtual TObject*TObject::DrawClone(Option_t* option = "") constMENU
virtual voidTObject::Dump() constMENU
virtual voidTObject::Error(const char* method, const char* msgfmt) const
virtual voidTObject::Execute(const char* method, const char* params, Int_t* error = 0)
virtual voidTObject::Execute(TMethod* method, TObjArray* params, Int_t* error = 0)
virtual voidTObject::ExecuteEvent(Int_t event, Int_t px, Int_t py)
virtual voidTObject::Fatal(const char* method, const char* msgfmt) const
virtual TObject*TObject::FindObject(const char* name) const
virtual TObject*TObject::FindObject(const TObject* obj) const
voidGetBias(TH1* bias, const Int_t* binMap = 0) const
Double_tGetChi2A() const
Double_tGetChi2L() const
virtual Option_t*TObject::GetDrawOption() const
static Long_tTObject::GetDtorOnly()
voidGetEmatrix(TH2* ematrix, const Int_t* binMap = 0) const
Double_tGetEpsMatrix() const
voidGetFoldedOutput(TH1* folded, const Int_t* binMap = 0) const
virtual const char*TObject::GetIconName() const
voidGetInput(TH1* inputData, const Int_t* binMap = 0) const
voidGetInputInverseEmatrix(TH2* ematrix)
voidGetL(TH2* l) const
virtual Double_tGetLcurveX() const
virtual Double_tGetLcurveY() const
voidGetLsquared(TH2* lsquared) const
virtual const char*TObject::GetName() const
Int_tGetNdf() const
voidGetNormalisationVector(TH1* s, const Int_t* binMap = 0) const
Int_tGetNpar() const
Int_tGetNr() const
virtual char*TObject::GetObjectInfo(Int_t px, Int_t py) const
static Bool_tTObject::GetObjectStat()
virtual Option_t*TObject::GetOption() const
voidGetOutput(TH1* output, const Int_t* binMap = 0) const
voidGetProbabilityMatrix(TH2* A, TUnfold::EHistMap histmap) const
Double_tGetRhoAvg() const
Double_tGetRhoI(TH1* rhoi, const Int_t* binMap = 0, TH2* invEmat = 0) const
voidGetRhoIJ(TH2* rhoij, const Int_t* binMap = 0) const
Double_tGetRhoMax() const
Double_tGetTau() const
virtual const char*TObject::GetTitle() const
static const char*GetTUnfoldVersion()
virtual UInt_tTObject::GetUniqueID() const
virtual Bool_tTObject::HandleTimer(TTimer* timer)
virtual ULong_tTObject::Hash() const
virtual voidTObject::Info(const char* method, const char* msgfmt) const
virtual Bool_tTObject::InheritsFrom(const char* classname) const
virtual Bool_tTObject::InheritsFrom(const TClass* cl) const
virtual voidTObject::Inspect() constMENU
voidTObject::InvertBit(UInt_t f)
virtual TClass*IsA() const
virtual Bool_tTObject::IsEqual(const TObject* obj) const
virtual Bool_tTObject::IsFolder() const
Bool_tTObject::IsOnHeap() const
virtual Bool_tTObject::IsSortable() const
Bool_tTObject::IsZombie() const
virtual voidTObject::ls(Option_t* option = "") const
voidTObject::MayNotUse(const char* method) const
virtual Bool_tTObject::Notify()
voidTObject::Obsolete(const char* method, const char* asOfVers, const char* removedFromVers) const
voidTObject::operator delete(void* ptr)
voidTObject::operator delete(void* ptr, void* vp)
voidTObject::operator delete[](void* ptr)
voidTObject::operator delete[](void* ptr, void* vp)
void*TObject::operator new(size_t sz)
void*TObject::operator new(size_t sz, void* vp)
void*TObject::operator new[](size_t sz)
void*TObject::operator new[](size_t sz, void* vp)
TUnfold&operator=(const TUnfold&)
virtual voidTObject::Paint(Option_t* option = "")
virtual voidTObject::Pop()
virtual voidTObject::Print(Option_t* option = "") const
virtual Int_tTObject::Read(const char* name)
virtual voidTObject::RecursiveRemove(TObject* obj)
Int_tRegularizeBins(int start, int step, int nbin, TUnfold::ERegMode regmode)
Int_tRegularizeBins2D(int start_bin, int step1, int nbin1, int step2, int nbin2, TUnfold::ERegMode regmode)
Int_tRegularizeCurvature(int left_bin, int center_bin, int right_bin, Double_t scale_left = 1., Double_t scale_right = 1.)
Int_tRegularizeDerivative(int left_bin, int right_bin, Double_t scale = 1.)
Int_tRegularizeSize(int bin, Double_t scale = 1.)
voidTObject::ResetBit(UInt_t f)
virtual voidTObject::SaveAs(const char* filename = "", Option_t* option = "") constMENU
virtual voidTObject::SavePrimitive(ostream& out, Option_t* option = "")
virtual Int_tScanLcurve(Int_t nPoint, Double_t tauMin, Double_t tauMax, TGraph** lCurve, TSpline** logTauX = 0, TSpline** logTauY = 0)
voidSetBias(const TH1* bias)
voidTObject::SetBit(UInt_t f)
voidTObject::SetBit(UInt_t f, Bool_t set)
voidSetConstraint(TUnfold::EConstraint constraint)
virtual voidTObject::SetDrawOption(Option_t* option = "")MENU
static voidTObject::SetDtorOnly(void* obj)
voidSetEpsMatrix(Double_t eps)
virtual Int_tSetInput(const TH1* hist_y, Double_t scaleBias = 0., Double_t oneOverZeroError = 0., const TH2* hist_vyy = 0, const TH2* hist_vyy_inv = 0)
static voidTObject::SetObjectStat(Bool_t stat)
virtual voidTObject::SetUniqueID(UInt_t uid)
virtual voidShowMembers(TMemberInspector& insp) const
virtual voidStreamer(TBuffer&)
voidStreamerNVirtual(TBuffer& ClassDef_StreamerNVirtual_b)
virtual voidTObject::SysError(const char* method, const char* msgfmt) const
Bool_tTObject::TestBit(UInt_t f) const
Int_tTObject::TestBits(UInt_t f) const
TUnfold(const TUnfold&)
TUnfold(const TH2* hist_A, TUnfold::EHistMap histmap, TUnfold::ERegMode regmode = kRegModeSize, TUnfold::EConstraint constraint = kEConstraintArea)
virtual voidTObject::UseCurrentStyle()
virtual voidTObject::Warning(const char* method, const char* msgfmt) const
virtual Int_tTObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0)
virtual Int_tTObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) const
protected:
voidAddMSparse(TMatrixDSparse* dest, Double_t f, const TMatrixDSparse* src) const
Bool_tAddRegularisationCondition(Int_t nEle, const Int_t* indices, const Double_t* rowData)
Bool_tAddRegularisationCondition(Int_t i0, Double_t f0, Int_t i1 = -1, Double_t f1 = 0., Int_t i2 = -1, Double_t f2 = 0.)
voidClearHistogram(TH1* h, Double_t x = 0.) const
virtual voidClearResults()
TMatrixDSparse*CreateSparseMatrix(Int_t nrow, Int_t ncol, Int_t nele, Int_t* row, Int_t* col, Double_t* data) const
static voidDeleteMatrix(TMatrixD** m)
static voidDeleteMatrix(TMatrixDSparse** m)
virtual voidTObject::DoError(int level, const char* location, const char* fmt, va_list va) const
virtual Double_tDoUnfold()
voidErrorMatrixToHist(TH2* ematrix, const TMatrixDSparse* emat, const Int_t* binMap, Bool_t doClear) const
const TMatrixDSparse*GetAx() const
Int_tGetBinFromRow(int ix) const
const TMatrixDSparse*GetDXDAM(int i) const
const TMatrixDSparse*GetDXDAZ(int i) const
const TMatrixDSparse*GetDXDtauSquared() const
const TMatrixDSparse*GetDXDY() const
const TMatrixDSparse*GetE() const
const TMatrixDSparse*GetEinv() const
Int_tGetNx() const
Int_tGetNy() const
virtual TStringGetOutputBinName(Int_t iBinX) const
Double_tGetRhoIFromMatrix(TH1* rhoi, const TMatrixDSparse* eOrig, const Int_t* binMap, TH2* invEmat) const
Int_tGetRowFromBin(int ix) const
const TMatrixDSparse*GetVxx() const
const TMatrixDSparse*GetVxxInv() const
const TMatrixDSparse*GetVyyInv() const
const TMatrixD*GetX() const
TMatrixDSparse*InvertMSparseSymmPos(const TMatrixDSparse* A, Int_t* rank) const
voidTObject::MakeZombie()
TMatrixDSparse*MultiplyMSparseM(const TMatrixDSparse* a, const TMatrixD* b) const
TMatrixDSparse*MultiplyMSparseMSparse(const TMatrixDSparse* a, const TMatrixDSparse* b) const
TMatrixDSparse*MultiplyMSparseMSparseTranspVector(const TMatrixDSparse* m1, const TMatrixDSparse* m2, const TMatrixTBase<Double_t>* v) const
TMatrixDSparse*MultiplyMSparseTranspMSparse(const TMatrixDSparse* a, const TMatrixDSparse* b) const
TUnfold()
private:
voidInitTUnfold()

Data Members

public:
static TObject::(anonymous)TObject::kBitMask
static TObject::EStatusBitsTObject::kCanDelete
static TObject::EStatusBitsTObject::kCannotPick
static TUnfold::EConstraintkEConstraintArea
static TUnfold::EConstraintkEConstraintNone
static TObject::EStatusBitsTObject::kHasUUID
static TUnfold::EHistMapkHistMapOutputHoriz
static TUnfold::EHistMapkHistMapOutputVert
static TObject::EStatusBitsTObject::kInvalidObject
static TObject::(anonymous)TObject::kIsOnHeap
static TObject::EStatusBitsTObject::kIsReferenced
static TObject::EStatusBitsTObject::kMustCleanup
static TObject::EStatusBitsTObject::kNoContextMenu
static TObject::(anonymous)TObject::kNotDeleted
static TObject::EStatusBitsTObject::kObjInCanvas
static TObject::(anonymous)TObject::kOverwrite
static TUnfold::ERegModekRegModeCurvature
static TUnfold::ERegModekRegModeDerivative
static TUnfold::ERegModekRegModeMixed
static TUnfold::ERegModekRegModeNone
static TUnfold::ERegModekRegModeSize
static TObject::(anonymous)TObject::kSingleKey
static TObject::(anonymous)TObject::kWriteDelete
static TObject::(anonymous)TObject::kZombie
protected:
TMatrixDSparse*fAInput: matrix
Double_tfBiasScaleInput: scale factor for the bias
TUnfold::EConstraintfConstraintInput: type of constraint to use
TArrayIfHistToXInput: histogram bins -> matrix indices
TMatrixDSparse*fLInput: regularisation conditions
TUnfold::ERegModefRegModeInput: type of regularisation
TArrayDfSumOverYInput: sum of all columns
Double_tfTauSquaredInput: regularisation parameter
TMatrixDSparse*fVyyInput: covariance matrix for y
TMatrixD*fX0Input: x0
TArrayIfXToHistInput: matrix indices -> histogram bins
TMatrixD*fYInput: y
private:
TMatrixDSparse*fAxResult: Ax
Double_tfChi2AResult: chi**2 contribution from (y-Ax)V(y-Ax)
TMatrixDSparse*fDXDAM[2]Result: part of derivative dx_k/dA_ij
TMatrixDSparse*fDXDAZ[2]Result: part of derivative dx_k/dA_ij
TMatrixDSparse*fDXDYResult: derivative dx/dy
TMatrixDSparse*fDXDtauSquaredResult: derivative dx/dtau
TMatrixDSparse*fEResult: matrix E
TMatrixDSparse*fEinvResult: matrix E^(-1)
Double_tfEpsMatrixmachine accuracy for eingenvalue analysis
Int_tfIgnoredBinsnumber of input bins which are dropped because they have error=0
Double_tfLXsquaredResult: chi**2 contribution from (x-s*x0)Lsquared(x-s*x0)
Int_tfNdfResult: number of degrees of freedom
Double_tfRhoAvgResult: average global correlation
Double_tfRhoMaxResult: maximum global correlation
TMatrixDSparse*fVxxResult: covariance matrix on x
TMatrixDSparse*fVxxInvResult: inverse of covariance matrix on x
TMatrixDSparse*fVyyInvResult: inverse of covariance matrix on y
TMatrixD*fXResult: x

Class Charts

Inheritance Chart:
TObject
TUnfold
TUnfoldSys
TUnfoldDensity

Function documentation

void InitTUnfold(void)
TUnfold(const TUnfold& )
 Int_t IsNotSymmetric(TMatrixDSparse const &m) const;
Double_t DoUnfold(Double_t tau)
void ClearResults(void)
void ClearHistogram(TH1* h, Double_t x = 0.) const
TString GetOutputBinName(Int_t iBinX) const
TMatrixDSparse * MultiplyMSparseM(const TMatrixDSparse* a, const TMatrixD* b) const
TMatrixDSparse * MultiplyMSparseMSparse(const TMatrixDSparse* a, const TMatrixDSparse* b) const
TMatrixDSparse * MultiplyMSparseTranspMSparse(const TMatrixDSparse* a, const TMatrixDSparse* b) const
TMatrixDSparse * InvertMSparseSymmPos(const TMatrixDSparse* A, Int_t* rank) const
void AddMSparse(TMatrixDSparse* dest, Double_t f, const TMatrixDSparse* src) const
TMatrixDSparse * CreateSparseMatrix(Int_t nrow, Int_t ncol, Int_t nele, Int_t* row, Int_t* col, Double_t* data) const
Int_t GetNx(void)
Int_t GetNy(void)
void ErrorMatrixToHist(TH2* ematrix, const TMatrixDSparse* emat, const Int_t* binMap, Bool_t doClear) const
Double_t GetRhoIFromMatrix(TH1* rhoi, const TMatrixDSparse* eOrig, const Int_t* binMap, TH2* invEmat) const
const TMatrixDSparse * GetDXDY(void)
{ return fDXDY; }
const TMatrixDSparse * GetDXDAM(int i) const
{ return fDXDAM[i]; }
const TMatrixDSparse * GetDXDAZ(int i) const
{ return fDXDAZ[i]; }
const TMatrixDSparse * GetDXDtauSquared(void)
{ return fDXDtauSquared; }
const TMatrixDSparse * GetAx(void)
{ return fAx; }
const TMatrixDSparse * GetEinv(void)
{ return fEinv; }
const TMatrixDSparse * GetE(void)
{ return fE; }
const TMatrixDSparse * GetVxx(void)
{ return fVxx; }
const TMatrixDSparse * GetVxxInv(void)
{ return fVxxInv; }
const TMatrixDSparse * GetVyyInv(void)
{ return fVyyInv; }
const TMatrixD * GetX(void)
{ return fX; }
Int_t GetRowFromBin(int ix) const
{ return fHistToX[ix]; }
Int_t GetBinFromRow(int ix) const
{ return fXToHist[ix]; }
void DeleteMatrix(TMatrixD** m)
void DeleteMatrix(TMatrixDSparse** m)
Bool_t AddRegularisationCondition(Int_t i0, Double_t f0, Int_t i1 = -1, Double_t f1 = 0., Int_t i2 = -1, Double_t f2 = 0.)
Bool_t AddRegularisationCondition(Int_t nEle, const Int_t* indices, const Double_t* rowData)
TUnfold(const TH2* hist_A, TUnfold::EHistMap histmap, TUnfold::ERegMode regmode = kRegModeSize, TUnfold::EConstraint constraint = kEConstraintArea)
const char* GetTUnfoldVersion(void)
void SetBias(const TH1* bias)
void SetConstraint(TUnfold::EConstraint constraint)
Int_t RegularizeSize(int bin, Double_t scale = 1.)
Int_t RegularizeDerivative(int left_bin, int right_bin, Double_t scale = 1.)
Int_t RegularizeCurvature(int left_bin, int center_bin, int right_bin, Double_t scale_left = 1., Double_t scale_right = 1.)
Int_t RegularizeBins(int start, int step, int nbin, TUnfold::ERegMode regmode)
Int_t RegularizeBins2D(int start_bin, int step1, int nbin1, int step2, int nbin2, TUnfold::ERegMode regmode)
Double_t DoUnfold(Double_t tau, const TH1* hist_y, Double_t scaleBias = 0.)
Double_t DoUnfold(Double_t tau)
Int_t ScanLcurve(Int_t nPoint, Double_t tauMin, Double_t tauMax, TGraph** lCurve, TSpline** logTauX = 0, TSpline** logTauY = 0)
void GetNormalisationVector(TH1* s, const Int_t* binMap = 0) const
void GetOutput(TH1* output, const Int_t* binMap = 0) const
void GetBias(TH1* bias, const Int_t* binMap = 0) const
void GetFoldedOutput(TH1* folded, const Int_t* binMap = 0) const
void GetInput(TH1* inputData, const Int_t* binMap = 0) const
void GetRhoIJ(TH2* rhoij, const Int_t* binMap = 0) const
void GetEmatrix(TH2* ematrix, const Int_t* binMap = 0) const
Double_t GetRhoI(TH1* rhoi, const Int_t* binMap = 0, TH2* invEmat = 0) const
void GetLsquared(TH2* lsquared) const
Int_t GetNr(void)
{ return fL->GetNrows(); }
void GetL(TH2* l) const
void GetInputInverseEmatrix(TH2* ematrix)
Double_t GetTau(void)
Double_t GetRhoMax(void)
{ return fRhoMax; }
Double_t GetRhoAvg(void)
{ return fRhoAvg; }
Double_t GetChi2A(void)
{ return fChi2A; }
Double_t GetChi2L(void)
Double_t GetLcurveX(void)
Double_t GetLcurveY(void)
Int_t GetNdf(void)
{ return fNdf; }
Int_t GetNpar(void)
Double_t GetEpsMatrix(void)
{ return fEpsMatrix; }
void SetEpsMatrix(Double_t eps)