100 #define TUnfold_VERSION "V17.6"
101 #define TUnfold_CLASS_VERSION 17
104 class TUnfold :
public TObject {
106 void InitTUnfold(
void);
129 kRegModeDerivative = 2,
132 kRegModeCurvature = 3,
143 kHistMapOutputHoriz = 0,
146 kHistMapOutputVert = 1
157 TMatrixDSparse *fVyy;
163 Double_t fTauSquared;
171 EConstraint fConstraint;
182 TMatrixDSparse *fVxx;
184 TMatrixDSparse *fVxxInv;
186 TMatrixDSparse *fVyyInv;
200 TMatrixDSparse *fDXDAM[2];
202 TMatrixDSparse *fDXDAZ[2];
204 TMatrixDSparse *fDXDtauSquared;
206 TMatrixDSparse *fDXDY;
208 TMatrixDSparse *fEinv;
213 virtual Double_t DoUnfold(
void);
214 virtual void ClearResults(
void);
215 void ClearHistogram(TH1 *h,Double_t x=0.)
const;
216 virtual TString GetOutputBinName(Int_t iBinX)
const;
217 TMatrixDSparse *MultiplyMSparseM(
const TMatrixDSparse *a,
const TMatrixD *b)
const;
218 TMatrixDSparse *MultiplyMSparseMSparse(
const TMatrixDSparse *a,
const TMatrixDSparse *b)
const;
219 TMatrixDSparse *MultiplyMSparseTranspMSparse(
const TMatrixDSparse *a,
const TMatrixDSparse *b)
const;
220 TMatrixDSparse *MultiplyMSparseMSparseTranspVector
221 (
const TMatrixDSparse *m1,
const TMatrixDSparse *m2,
222 const TMatrixTBase<Double_t> *v)
const;
223 TMatrixDSparse *InvertMSparseSymmPos(
const TMatrixDSparse *A,Int_t *rank)
const;
224 void AddMSparse(TMatrixDSparse *dest,Double_t f,
const TMatrixDSparse *src)
const;
225 TMatrixDSparse *CreateSparseMatrix(Int_t nrow,Int_t ncol,Int_t nele,Int_t *row,Int_t *col,Double_t *data)
const;
227 inline Int_t GetNx(
void)
const {
228 return fA->GetNcols();
231 inline Int_t GetRowFromBin(
int ix)
const {
return fHistToX[ix]; }
233 inline Int_t GetBinFromRow(
int ix)
const {
return fXToHist[ix]; }
235 inline Int_t GetNy(
void)
const {
236 return fA->GetNrows();
239 inline const TMatrixD *GetX(
void)
const {
return fX; }
241 inline const TMatrixDSparse *GetVxx(
void)
const {
return fVxx; }
243 inline const TMatrixDSparse *GetVxxInv(
void)
const {
return fVxxInv; }
245 inline const TMatrixDSparse *GetAx(
void)
const {
return fAx; }
247 inline const TMatrixDSparse *GetDXDY(
void)
const {
return fDXDY; }
249 inline const TMatrixDSparse *GetDXDAM(
int i)
const {
return fDXDAM[i]; }
251 inline const TMatrixDSparse *GetDXDAZ(
int i)
const {
return fDXDAZ[i]; }
253 inline const TMatrixDSparse *GetEinv(
void)
const {
return fEinv; }
255 inline const TMatrixDSparse *GetE(
void)
const {
return fE; }
257 inline const TMatrixDSparse *GetVyyInv(
void)
const {
return fVyyInv; }
259 void ErrorMatrixToHist(TH2 *ematrix,
const TMatrixDSparse *emat,
const Int_t *binMap,Bool_t doClear)
const;
260 Double_t GetRhoIFromMatrix(TH1 *rhoi,
const TMatrixDSparse *eOrig,
const Int_t *binMap,TH2 *invEmat)
const;
262 inline const TMatrixDSparse *GetDXDtauSquared(
void)
const {
return fDXDtauSquared; }
264 static void DeleteMatrix(TMatrixD **m);
266 static void DeleteMatrix(TMatrixDSparse **m);
268 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.);
269 Bool_t AddRegularisationCondition(Int_t nEle,
const Int_t *indices,
const Double_t *rowData);
271 static const char*GetTUnfoldVersion(
void);
273 TUnfold(
const TH2 *hist_A, EHistMap histmap,
274 ERegMode regmode = kRegModeSize,
275 EConstraint constraint=kEConstraintArea);
278 virtual ~TUnfold(
void);
280 virtual Int_t SetInput(
const TH1 *hist_y, Double_t scaleBias=0.0,Double_t oneOverZeroError=0.0,
const TH2 *hist_vyy=0,
const TH2 *hist_vyy_inv=0);
282 virtual Double_t DoUnfold(Double_t tau);
283 Double_t DoUnfold(Double_t tau,
const TH1 *hist_y, Double_t scaleBias=0.0);
285 virtual Int_t ScanLcurve(Int_t nPoint,Double_t tauMin,
286 Double_t tauMax,TGraph **lCurve,
287 TSpline **logTauX=0,TSpline **logTauY=0,
288 TSpline **logTauCurvature=0);
291 Double_t GetTau(
void)
const;
292 void GetOutput(TH1 *output,
const Int_t *binMap=0)
const;
293 void GetEmatrix(TH2 *ematrix,
const Int_t *binMap=0)
const;
294 void GetRhoIJ(TH2 *rhoij,
const Int_t *binMap=0)
const;
295 Double_t GetRhoI(TH1 *rhoi,
const Int_t *binMap=0,TH2 *invEmat=0)
const;
296 void GetFoldedOutput(TH1 *folded,
const Int_t *binMap=0)
const;
299 void GetProbabilityMatrix(TH2 *A,EHistMap histmap)
const;
300 void GetNormalisationVector(TH1 *s,
const Int_t *binMap=0)
const;
301 void GetInput(TH1 *inputData,
const Int_t *binMap=0)
const;
302 void GetInputInverseEmatrix(TH2 *ematrix);
303 void GetBias(TH1 *bias,
const Int_t *binMap=0)
const;
304 Int_t GetNr(
void)
const;
305 void GetL(TH2 *l)
const;
306 void GetLsquared(TH2 *lsquared)
const;
310 inline Double_t GetRhoMax(
void)
const {
return fRhoMax; }
312 inline Double_t GetRhoAvg(
void)
const {
return fRhoAvg; }
314 inline Double_t GetChi2A(
void)
const {
return fChi2A; }
316 Double_t GetChi2L(
void)
const;
317 virtual Double_t GetLcurveX(
void)
const;
318 virtual Double_t GetLcurveY(
void)
const;
324 inline Int_t GetNdf(
void)
const {
return fNdf; }
325 Int_t GetNpar(
void)
const;
328 void SetBias(
const TH1 *bias);
329 void SetConstraint(EConstraint constraint);
330 Int_t RegularizeSize(
int bin, Double_t scale = 1.0);
331 Int_t RegularizeDerivative(
int left_bin,
int right_bin, Double_t scale = 1.0);
332 Int_t RegularizeCurvature(
int left_bin,
int center_bin,
int right_bin, Double_t scale_left = 1.0, Double_t scale_right = 1.0);
333 Int_t RegularizeBins(
int start,
int step,
int nbin, ERegMode regmode);
334 Int_t RegularizeBins2D(
int start_bin,
int step1,
int nbin1,
int step2,
int nbin2, ERegMode regmode);
337 inline Double_t GetEpsMatrix(
void)
const {
return fEpsMatrix; }
340 void SetEpsMatrix(Double_t eps);
342 ClassDef(TUnfold, TUnfold_CLASS_VERSION)