1 | #ifndef MARS_MUnfold
|
---|
2 | #define MARS_MUnfold
|
---|
3 |
|
---|
4 | #ifndef ROOT_TH1
|
---|
5 | #include <TH1.h>
|
---|
6 | #endif
|
---|
7 |
|
---|
8 | #ifndef ROOT_TMatrixD
|
---|
9 | #include <TMatrixD.h>
|
---|
10 | #endif
|
---|
11 |
|
---|
12 | #ifndef MARS_MTask
|
---|
13 | #include "MTask.h"
|
---|
14 | #endif
|
---|
15 |
|
---|
16 | class TH2;
|
---|
17 | class TH3;
|
---|
18 | class TString;
|
---|
19 | class TVectorD;
|
---|
20 | class TH2D;
|
---|
21 | class TH3D;
|
---|
22 |
|
---|
23 | class MUnfold : public MTask
|
---|
24 | {
|
---|
25 |
|
---|
26 | private:
|
---|
27 |
|
---|
28 | TH1 *DrawMatrixClone(const TMatrixD &m, Option_t *opt);
|
---|
29 | TH1 *DrawMatrixColClone(const TMatrixD &m, Option_t *opt, Int_t col);
|
---|
30 | void PrintTH3Content(const TH3 &hist);
|
---|
31 | void PrintTH3Error(const TH3 &hist);
|
---|
32 | void PrintTH2Content(const TH2 &hist);
|
---|
33 | void PrintTH2Error(const TH2 &hist);
|
---|
34 | void PrintTH1Content(const TH1 &hist);
|
---|
35 | void PrintTH1Error(const TH1 &hist);
|
---|
36 | void CopyCol(TMatrixD &m, const TH1 &h, Int_t col);
|
---|
37 | void CopyCol(TH1 &h, const TMatrixD &m, Int_t col);
|
---|
38 | void CopyH2M(TMatrixD &m, const TH2 &h);
|
---|
39 | void CopySqr(TMatrixD &m, const TH1 &h);
|
---|
40 | Double_t GetMatrixSumRow(const TMatrixD &m, Int_t row);
|
---|
41 | Double_t GetMatrixSumDiag(const TMatrixD &m);
|
---|
42 | Double_t GetMatrixSumCol(const TMatrixD &m, Int_t col);
|
---|
43 | Double_t GetMatrixSum(const TMatrixD &m);
|
---|
44 |
|
---|
45 | public:
|
---|
46 | TString bintitle;
|
---|
47 |
|
---|
48 | UInt_t fNa; // Number of bins in the distribution to be unfolded
|
---|
49 | UInt_t fNb; // Number of bins in the unfolded distribution
|
---|
50 |
|
---|
51 | TMatrixD fMigrat; // migration matrix (fNa, fNb)
|
---|
52 | TMatrixD fMigraterr2;// error**2 of migration matrix (fNa, fNb)
|
---|
53 |
|
---|
54 | TMatrixD fMigOrig; // original migration matrix (fNa, fNb)
|
---|
55 | TMatrixD fMigOrigerr2;// error**2 oforiginal migr. matrix (fNa, fNb)
|
---|
56 |
|
---|
57 | TMatrixD fMigSmoo; // smoothed migration matrix M (fNa, fNb)
|
---|
58 | TMatrixD fMigSmooerr2;// error**2 of smoothed migr. matrix (fNa, fNb)
|
---|
59 | TMatrixD fMigChi2; // chi2 contributions for smoothing (fNa, fNb)
|
---|
60 |
|
---|
61 | TMatrixD fVa; // distribution to be unfolded (fNa)
|
---|
62 | TMatrixD fVacov; // error matrix of fVa (fNa, fNa)
|
---|
63 | TMatrixD fVacovInv; // inverse of fVacov (fNa, fNa)
|
---|
64 | Double_t fSpurVacov; // Spur of fVacov
|
---|
65 |
|
---|
66 | // UInt_t fVaevents; // total number of events
|
---|
67 | UInt_t fVapoints; // number of significant measurements
|
---|
68 |
|
---|
69 | TMatrixD fVb; // unfolded distribution (fNb)
|
---|
70 | TMatrixD fVbcov; // error matrix of fVb (fNb, fNb)
|
---|
71 |
|
---|
72 | TMatrixD fVEps; // prior distribution (fNb)
|
---|
73 | TMatrixDColumn fVEps0;
|
---|
74 |
|
---|
75 | Double_t fW; // weight
|
---|
76 | Double_t fWbest; // best weight
|
---|
77 | Int_t ixbest;
|
---|
78 |
|
---|
79 | TMatrixD fResult; // unfolded distribution and errors (fNb, 5)
|
---|
80 | TMatrixD fChi2; // chisquared contribution (fNa, 1)
|
---|
81 |
|
---|
82 | Double_t fChisq; // total chisquared
|
---|
83 | Double_t fNdf; // number of degrees of freedom
|
---|
84 | Double_t fProb; // chisquared probability
|
---|
85 |
|
---|
86 | TMatrixD G; // G = M * M(transposed) (fNa, fNa)
|
---|
87 | TVectorD EigenValue; // vector of eigenvalues lambda of G (fNa)
|
---|
88 | TMatrixD Eigen; // matrix of eigen vectors of G (fNa, fNa)
|
---|
89 | Double_t RankG; // rank of G
|
---|
90 | Double_t tau; // 1 / lambda_max
|
---|
91 | Double_t EpsLambda;
|
---|
92 |
|
---|
93 | // quantities stored for each weight :
|
---|
94 | TVectorD SpSig; // Spur of covariance matrix of fVbcov
|
---|
95 | TVectorD SpAR; // effective rank of G^tilde
|
---|
96 | TVectorD chisq; // chi squared (measures agreement between
|
---|
97 | // fVa and the folded fVb)
|
---|
98 | TVectorD SecDer; // regularization term = sum of (2nd der.)**2
|
---|
99 | TVectorD ZerDer; // regularization term = sum of (fVb)**2
|
---|
100 | TVectorD Entrop; // regularization term = reduced cross-entropy
|
---|
101 | TVectorD DAR2; //
|
---|
102 | TVectorD Dsqbar; //
|
---|
103 |
|
---|
104 | Double_t SpurAR;
|
---|
105 | Double_t SpurSigma;
|
---|
106 | Double_t SecDeriv;
|
---|
107 | Double_t ZerDeriv;
|
---|
108 | Double_t Entropy;
|
---|
109 | Double_t DiffAR2;
|
---|
110 | Double_t Chisq;
|
---|
111 | Double_t D2bar;
|
---|
112 |
|
---|
113 | TMatrixD Chi2;
|
---|
114 |
|
---|
115 | //
|
---|
116 |
|
---|
117 | // plots versus weight
|
---|
118 | Int_t Nix;
|
---|
119 | Double_t xmin;
|
---|
120 | Double_t xmax;
|
---|
121 | Double_t dlogx;
|
---|
122 |
|
---|
123 | TH1D *hBchisq;
|
---|
124 | TH1D *hBSpAR;
|
---|
125 | TH1D *hBDSpAR;
|
---|
126 | TH1D *hBSpSig;
|
---|
127 | TH1D *hBDSpSig;
|
---|
128 | TH1D *hBSecDeriv;
|
---|
129 | TH1D *hBDSecDeriv;
|
---|
130 | TH1D *hBZerDeriv;
|
---|
131 | TH1D *hBDZerDeriv;
|
---|
132 | TH1D *hBEntropy;
|
---|
133 | TH1D *hBDEntropy;
|
---|
134 | TH1D *hBDAR2;
|
---|
135 | TH1D *hBD2bar;
|
---|
136 |
|
---|
137 | //
|
---|
138 | TH1D *hEigen;
|
---|
139 |
|
---|
140 | // plots for the best solution
|
---|
141 | TH2D *fhmig;
|
---|
142 | TH2D *shmig;
|
---|
143 | TH2D *shmigChi2;
|
---|
144 |
|
---|
145 | TH1D *fhb0;
|
---|
146 |
|
---|
147 | TH1D *fha;
|
---|
148 |
|
---|
149 | TH1D *hprior;
|
---|
150 |
|
---|
151 | TH1D *hb;
|
---|
152 |
|
---|
153 | Double_t CalcSpurSigma(TMatrixD &T, Double_t norm=1);
|
---|
154 |
|
---|
155 | // -----------------------------------------------------------------------
|
---|
156 | //
|
---|
157 | // Constructor
|
---|
158 | // copy histograms into matrices
|
---|
159 | //
|
---|
160 | MUnfold(TH1D &ha, TH2D &hacov, TH2D &hmig);
|
---|
161 | ~MUnfold();
|
---|
162 |
|
---|
163 | void SetPriorConstant();
|
---|
164 | Bool_t SetPriorRebin(TH1D &ha);
|
---|
165 | Bool_t SetPriorInput(TH1D &hpr);
|
---|
166 | Bool_t SetPriorPower(Double_t gamma);
|
---|
167 | Bool_t SetInitialWeight(Double_t &weight);
|
---|
168 | void PrintResults();
|
---|
169 | Bool_t Schmelling(TH1D &hb0);
|
---|
170 | void SchmellCore(Int_t full, Double_t &xiter, TMatrixD &gamma,
|
---|
171 | TMatrixD &dgamma, Double_t &dga2);
|
---|
172 | Bool_t SmoothMigrationMatrix(TH2D &hmigorig);
|
---|
173 | Bool_t Tikhonov2(TH1D &hb0);
|
---|
174 | Bool_t Bertero(TH1D &hb0);
|
---|
175 | Bool_t BertCore(Double_t &xiter);
|
---|
176 | Bool_t CalculateG();
|
---|
177 | Bool_t SelectBestWeight();
|
---|
178 | Bool_t DrawPlots();
|
---|
179 | Bool_t CallMinuit(
|
---|
180 | void (*fcnx)(Int_t &, Double_t *, Double_t &, Double_t *, Int_t),
|
---|
181 | UInt_t npar, char name[20][100],
|
---|
182 | Double_t vinit[20], Double_t step[20],
|
---|
183 | Double_t limlo[20], Double_t limup[20], Int_t fix[20]);
|
---|
184 | TMatrixD &GetVb() { return fVb; }
|
---|
185 | TMatrixD &GetVbcov() { return fVbcov; }
|
---|
186 | TMatrixD &GetResult() { return fResult; }
|
---|
187 | TMatrixD &GetChi2() { return fChi2; }
|
---|
188 | Double_t &GetChisq() { return fChisq; }
|
---|
189 | Double_t &GetNdf() { return fNdf; }
|
---|
190 | Double_t &GetProb() { return fProb; }
|
---|
191 | TMatrixD &GetMigSmoo() { return fMigSmoo; }
|
---|
192 | TMatrixD &GetMigSmooerr2() { return fMigSmooerr2; }
|
---|
193 | TMatrixD &GetMigChi2() { return fMigChi2; }
|
---|
194 |
|
---|
195 | ClassDef(MUnfold, 1)
|
---|
196 |
|
---|
197 | };
|
---|
198 |
|
---|
199 | #endif
|
---|