Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TUnfoldIterativeEM.cxx
Go to the documentation of this file.
2#include "TUnfoldBinning.h"
3#include <TVectorD.h>
4#include <TGraph.h>
5
7
9 f_inputBins=nullptr;
10 f_outputBins=nullptr;
11 f_constInputBins=nullptr;
12 f_constOutputBins=nullptr;
13 fA=nullptr;
14 fEpsilon=nullptr;
15 fX0=nullptr;
16 fY=nullptr;
17 fBgr=nullptr;
18 fX=nullptr;
19 fDXDY=nullptr;
20}
21
25 // copied from TUnfoldDensity
26 TAxis const *genAxis,*detAxis;
28 genAxis=hist_A->GetXaxis();
29 detAxis=hist_A->GetYaxis();
30 } else {
31 genAxis=hist_A->GetYaxis();
32 detAxis=hist_A->GetXaxis();
33 }
34 if(!inputBins) {
37 } else {
38 f_inputBins=nullptr;
40 }
41 if(!outputBins) {
44 } else {
45 f_outputBins=nullptr;
47 }
48 int nGen=f_constOutputBins->GetEndBin();
49 int nRec=f_constInputBins->GetEndBin();
50 fA=new TMatrixD(nRec-1,nGen);
52 fX0=new TVectorD(nGen);
53 for(int iGen=0;iGen<nGen;iGen++) {
54 double sum=0.;
55 for(int iRec=0;iRec<=nRec;iRec++) {
56 double c;
58 c= hist_A->GetBinContent(iGen,iRec);
59 } else {
60 c= hist_A->GetBinContent(iRec,iGen);
61 }
62 if((iRec>0)&&(iRec<=fA->GetNrows())) {
63 (*fA)(iRec-1,iGen)=c;
64 }
65 sum +=c;
66 }
67 double epsilon=0.;
68 if(sum!=0.) {
69 for(int iRec=0;iRec<fA->GetNrows();iRec++) {
70 (*fA)(iRec,iGen) /=sum;
71 epsilon += (*fA)(iRec,iGen);
72 }
73 }
74 (*fEpsilon)(iGen)=epsilon;
75 (*fX0)(iGen)=sum;
76 }
77 fStep=-1;
78 fScaleBias=1.;
79 fY=new TVectorD(nRec-1);
80 fBgr=new TVectorD(nRec-1);
81 fX=new TVectorD(*fX0);
82 fDXDY=new TMatrixD(nGen,nRec-1);
83}
84
86 if(f_inputBins) delete f_inputBins;
87 if(f_outputBins) delete f_outputBins;
88 if(fA) delete fA;
89 if(fEpsilon) delete fEpsilon;
90 if(fX0) delete fX0;
91 if(fY) delete fY;
92 if(fBgr) delete fBgr;
93 if(fX) delete fX;
94 if(fDXDY) delete fDXDY;
95}
96
99 Reset();
100 }
101 while(fStep<numIterations) {
102 IterateOnce();
103 }
104}
105
107 int nRec=f_constInputBins->GetEndBin();
108 for(int iRec=1;iRec<nRec;iRec++) {
109 (*fY)(iRec-1)=hist_y->GetBinContent(iRec);
110 }
111 // reset start value
113 Reset();
114 return 0;
115}
116
118 for(int iGen=0;iGen<fX->GetNrows();iGen++) {
119 (*fX)=fScaleBias*(*fX0);
120 }
121 for(int i=0;i<fDXDY->GetNrows();i++) {
122 for(int j=0;j<fDXDY->GetNcols();j++) {
123 (*fDXDY)(i,j)=0.;
124 }
125 }
126 fStep=-1;
127}
128
130 int nRec=f_constInputBins->GetEndBin();
131 for(int iRec=1;iRec<nRec;iRec++) {
132 (*fBgr)(iRec-1)+=hist_bgr->GetBinContent(iRec)*scale;
133 }
134}
135
141
143 TVectorD Ax_plus_bgr=(*fA)*(*fX)+(*fBgr);
144 TMatrixD f(fY->GetNrows(),1);
147 for(int i=0;i<f.GetNrows();i++) {
148 f(i,0)=(*fY)(i)/Ax_plus_bgr(i);
149 // dfdx(i,j)=-f(i,0)/Ax(i)*(*fA)(i,j);
150 dfdy(i,i)=1./Ax_plus_bgr(i);
151 for(int j=0;j<fY->GetNrows();j++) {
152 dfdy(i,j) -= f(i,0)/Ax_plus_bgr(i)*ADXDY(i,j);
153 }
154 }
155 //
158 for(int i=0;i<fX->GetNrows();i++) {
159 if((*fEpsilon)(i)<=0.) continue;
160 double factor=At_f(i,0)/(*fEpsilon)(i);
161 for(int j=0;j<fY->GetNrows();j++) {
162 (*fDXDY)(i,j) *= factor;
163 (*fDXDY)(i,j) += (*fX)(i)/(*fEpsilon)(i)*At_dfdy(i,j);
164 }
165 (*fX)(i) *= factor;
166 }
167 fStep++;
168}
169
172 Reset();
173 double minSURE=GetSURE();
174 int stepSURE=fStep;
177 std::vector<double> nIter,scanSURE,scanDeviance,scanDF;
178 nIter.push_back(fStep);
179 scanSURE.push_back(minSURE);
180 scanDeviance.push_back(GetDeviance());
181 scanDF.push_back(GetDF());
182 Info("TUnfoldIterativeEM::ScanSURE",
183 "step=%d SURE=%lf DF=%lf deviance=%lf",
184 fStep,*scanSURE.rbegin(),*scanDF.rbegin(),*scanDeviance.rbegin());
185 while(fStep<nIterMax) {
186 DoUnfold(fStep+1);
187 double SURE=GetSURE();
188 nIter.push_back(fStep);
189 scanSURE.push_back(SURE);
190 scanDeviance.push_back(GetDeviance());
191 scanDF.push_back(GetDF());
192 Info("TUnfoldIterativeEM::ScanSURE",
193 "step=%d SURE=%lf DF=%lf deviance=%lf",
194 fStep,*scanSURE.rbegin(),*scanDF.rbegin(),*scanDeviance.rbegin());
195 if(SURE<minSURE) {
197 X_SURE=*fX;
200 }
201 }
202 if(graphSURE) {
203 *graphSURE=new TGraph(nIter.size(),nIter.data(),scanSURE.data());
204 }
205 if(df_deviance) {
207 (scanDeviance.size(),scanDF.data(),scanDeviance.data());
208 }
209
210 *fX=X_SURE;
213
214 return fStep;
215}
216
218(const char *histogramName,const char *histogramTitle,
219 const char *distributionName,const char *projectionMode,
220 Bool_t useAxisBinning) const {
221 TUnfoldBinning const *binning=f_constOutputBins->FindNode(distributionName);
222 Int_t *binMap=nullptr;
223 TH1 *r=binning->CreateHistogram
225 if(r) {
226 for(Int_t i=0;i<binning->GetEndBin();i++) {
228 if(destBin<0.) continue;
229 r->SetBinContent(destBin,r->GetBinContent(destBin)+(*fX)(i));
230 Double_t Vii=0.;
231 for(Int_t k=0;k<binning->GetEndBin();k++) {
232 if(binMap[k]!=destBin) continue;
233 for(int j=0;j<fDXDY->GetNcols();j++) {
234 // add up Poisson errors squared
235 Vii += (*fDXDY)(i,j)*(*fY)(j)*(*fDXDY)(k,j);
236 }
237 }
238 r->SetBinError(destBin,TMath::Sqrt(r->GetBinError(destBin)+Vii));
239 }
240 }
241 if(binMap) {
242 delete [] binMap;
243 }
244 return r;
245}
246
248(const char *histogramName,const char *histogramTitle,
249 const char *distributionName,const char *projectionMode,
251 TUnfoldBinning const *binning=f_constInputBins->FindNode(distributionName);
252 Int_t *binMap=nullptr;
253 TH1 *r=binning->CreateHistogram
255 if(r) {
256 TVectorD folded((*fA)*(*fX));
257 if(addBgr) folded+= *fBgr;
258 TMatrixD dFoldedDY((*fA)*(*fDXDY));
259 for(Int_t i=1;i<binning->GetEndBin();i++) {
261 if(destBin<0.) continue;
262 r->SetBinContent(destBin,r->GetBinContent(destBin)+folded(i-1));
263 Double_t Vii=0.;
264 for(Int_t k=1;k<binning->GetEndBin();k++) {
265 if(binMap[k]!=destBin) continue;
266 for(int j=0;j<dFoldedDY.GetNcols();j++) {
267 // add up Poisson errors squared
268 Vii += dFoldedDY(i-1,j)*(*fY)(j)*dFoldedDY(k-1,j);
269 }
270 }
271 r->SetBinError(destBin,TMath::Sqrt(r->GetBinError(destBin)+Vii));
272 }
273 }
274 if(binMap) {
275 delete [] binMap;
276 }
277 return r;
278}
279
280
282 // fold data with matrix
283 TVectorD Ax_plus_bgr=(*fA)*(*fX)+(*fBgr);
284 double r=0.;
285 for(int i=0;i<Ax_plus_bgr.GetNrows();i++) {
286 double n=(*fY)(i);
287 double mu=Ax_plus_bgr(i);
288 if(n>0.) {
289 r += 2.* (mu-n-n*TMath::Log(mu/n));
290 } else if(mu>0.) {
291 r += 2.*mu;
292 }
293 }
294 return r;
295}
296
298 double r=0.;
299 for(int i=0;i<fA->GetNrows();i++) {
300 for(int j=0;j<fA->GetNcols();j++) {
301 r += (*fA)(i,j)*(*fDXDY)(j,i);
302 }
303 }
304 return r;
305}
306
308 return GetDeviance()+2.*GetDF();
309}
#define f(i)
Definition RSha256.hxx:104
#define c(i)
Definition RSha256.hxx:101
#define ClassImp(name)
Definition Rtypes.h:374
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
TMatrixT< Double_t > TMatrixD
Definition TMatrixDfwd.h:23
TVectorT< Double_t > TVectorD
Definition TVectorDfwd.h:23
Class to manage histogram axis.
Definition TAxis.h:32
A TGraph is an object made of two arrays X and Y with npoints each.
Definition TGraph.h:41
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:108
Service class for 2-D histogram classes.
Definition TH2.h:30
Int_t GetNrows() const
Int_t GetNcols() const
Binning schemes for use with the unfolding algorithm TUnfoldDensity.
TH1 * CreateHistogram(const char *histogramName, Bool_t originalAxisBinning=kFALSE, Int_t **binMap=nullptr, const char *histogramTitle=nullptr, const char *axisSteering=nullptr) const
create a THxx histogram capable to hold the bins of this binning node and its children
Int_t GetEndBin(void) const
last+1 bin of this node (includes children)
const TUnfoldBinning * f_constInputBins
virtual void Reset(void)
Double_t GetDeviance(void) const
const TUnfoldBinning * f_constOutputBins
TUnfoldBinning * f_outputBins
Double_t GetSURE(void) const
virtual void DoUnfold(Int_t numIterations)
Double_t GetDF(void) const
TH1 * GetFoldedOutput(const char *histogramName, const char *histogramTitle=nullptr, const char *distributionName=nullptr, const char *projectionMode=nullptr, Bool_t useAxisBinning=kTRUE, Bool_t addBgr=kFALSE) const
void SubtractBackground(const TH1 *hist_bgr, const char *name, Double_t scale=1.0)
virtual void IterateOnce(void)
TH1 * GetOutput(const char *histogramName, const char *histogramTitle=nullptr, const char *distributionName=nullptr, const char *projectionMode=nullptr, Bool_t useAxisBinning=kTRUE) const
virtual Int_t SetInput(const TH1 *hist_y, Double_t scaleBias=1.0)
TUnfoldBinning * f_inputBins
virtual Int_t ScanSURE(Int_t nIterMax, TGraph **SURE=nullptr, TGraph **df_deviance=nullptr)
EHistMap
arrangement of axes for the response matrix (TH2 histogram)
Definition TUnfold.h:143
@ kHistMapOutputHoriz
truth level on x-axis of the response matrix
Definition TUnfold.h:146
Int_t GetNrows() const
Definition TVectorT.h:75
std::ostream & Info()
Definition hadd.cxx:177
const Int_t n
Definition legend1.C:16
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Definition TMath.h:762
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:668
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2345