122 if(
f<parm[0]) itype=1;
123 else if(
f<parm[0]+parm[1]) itype=2;
134 ptgen=
pow(t*(
pow(parm[3],a1)-x0)+x0,1./a1);
136 if(iType) *iType=itype;
137 if(ptGen) *ptGen=ptgen;
141 TMath::Sqrt(parm[7]*parm[7]*ptgen+parm[8]*parm[8]*ptgen*ptgen);
146 triggerParm[2]/(1.+
TMath::Exp((triggerParm[0]-ptObs)/triggerParm[1]));
147 isTriggered= rnd->
Rndm()<triggerProb;
149 }
while((!triggerFlag) && (!isTriggered));
151 if(triggerFlag) *triggerFlag=isTriggered;
210 TH1D *histUnfoldInput=
211 new TH1D(
"unfolding input rec",
";ptrec",nDet,xminDet,xmaxDet);
212 TH2D *histUnfoldMatrix=
213 new TH2D(
"unfolding matrix",
";ptgen;ptrec",
214 nGen,xminGen,xmaxGen,nDet,xminDet,xmaxDet);
215 TH1D *histUnfoldBgr1=
216 new TH1D(
"unfolding bgr1 rec",
";ptrec",nDet,xminDet,xmaxDet);
217 TH1D *histUnfoldBgr2=
218 new TH1D(
"unfolding bgr2 rec",
";ptrec",nDet,xminDet,xmaxDet);
219 TH2D *histUnfoldMatrixSys=
220 new TH2D(
"unfolding matrix sys",
";ptgen;ptrec",
221 nGen,xminGen,xmaxGen,nDet,xminDet,xmaxDet);
225 new TH1D(
"bbb input rec",
";ptrec",nGen,xminGen,xmaxGen);
226 TH1D *histBbbSignalRec=
227 new TH1D(
"bbb signal rec",
";ptrec",nGen,xminGen,xmaxGen);
229 new TH1D(
"bbb bgr1 rec",
";ptrec",nGen,xminGen,xmaxGen);
231 new TH1D(
"bbb bgr2 rec",
";ptrec",nGen,xminGen,xmaxGen);
233 new TH1D(
"bbb bgrPt rec",
";ptrec",nGen,xminGen,xmaxGen);
234 TH1D *histBbbSignalGen=
235 new TH1D(
"bbb signal gen",
";ptgen",nGen,xminGen,xmaxGen);
236 TH1D *histBbbSignalRecSys=
237 new TH1D(
"bbb signal sys rec",
";ptrec",nGen,xminGen,xmaxGen);
238 TH1D *histBbbBgrPtSys=
239 new TH1D(
"bbb bgrPt sys rec",
";ptrec",nGen,xminGen,xmaxGen);
240 TH1D *histBbbSignalGenSys=
241 new TH1D(
"bbb signal sys gen",
";ptgen",nGen,xminGen,xmaxGen);
245 new TH1D(
"DATA truth gen",
";ptgen",nGen,xminGen,xmaxGen);
247 new TH1D(
"MC prediction rec",
";ptrec",nDet,xminDet,xmaxDet);
263 static Double_t triggerParm_DATA[]={8.0,
269 while(intLumi<lumiData) {
273 Double_t ptObs=GenerateEvent(parm_DATA,triggerParm_DATA,&intLumi,
274 &isTriggered,&ptGen,&iTypeGen);
277 histUnfoldInput->
Fill(ptObs);
280 histBbbInput->
Fill(ptObs);
283 if(iTypeGen==0) histDataTruth->
Fill(ptGen);
303 static Double_t triggerParm_MC[]={8.0,
309 Double_t lumiWeight = lumiData/lumiMC;
311 while(intLumi<lumiMC) {
315 Double_t ptObs=GenerateEvent(parm_MC,triggerParm_MC,&intLumi,&isTriggered,
317 if(!isTriggered) ptObs=0.0;
322 histUnfoldMatrix->
Fill(ptGen,ptObs,lumiWeight);
323 }
else if(iTypeGen==1) {
324 histUnfoldBgr1->
Fill(ptObs,lumiWeight);
325 }
else if(iTypeGen==2) {
326 histUnfoldBgr2->
Fill(ptObs,lumiWeight);
331 if((ptGen>=xminGen)&&(ptGen<xmaxGen)) {
332 histBbbSignalRec->
Fill(ptObs,lumiWeight);
334 histBbbBgrPt->
Fill(ptObs,lumiWeight);
336 histBbbSignalGen->
Fill(ptGen,lumiWeight);
337 }
else if(iTypeGen==1) {
338 histBbbBgr1->
Fill(ptObs,lumiWeight);
339 }
else if(iTypeGen==2) {
340 histBbbBgr2->
Fill(ptObs,lumiWeight);
344 histDetMC ->
Fill(ptObs,lumiWeight);
364 while(intLumi<lumiMC) {
368 Double_t ptObs=GenerateEvent(parm_MC_SYS,triggerParm_MC,&intLumi,
369 &isTriggered,&ptGen,&iTypeGen);
370 if(!isTriggered) ptObs=0.0;
374 histUnfoldMatrixSys->
Fill(ptGen,ptObs);
379 if((ptGen>=xminGen)&&(ptGen<xmaxGen)) {
380 histBbbSignalRecSys->
Fill(ptObs);
382 histBbbBgrPtSys->
Fill(ptObs);
384 histBbbSignalGenSys->
Fill(ptGen);
411 regMode,constraintMode,densityFlags);
414 unfold.SetInput(histUnfoldInput);
420 unfold.SubtractBackground(histUnfoldBgr1,
"background1",scale_bgr,dscale_bgr);
421 unfold.SubtractBackground(histUnfoldBgr2,
"background2",scale_bgr,dscale_bgr);
424 unfold.AddSysError(histUnfoldMatrixSys,
"signalshape_SYS",
434 Int_t iBest=unfold.ScanLcurve(nScan,0.,0.,&lCurve,&logTauX,&logTauY);
436 cout<<
"chi**2="<<unfold.GetChi2A()<<
"+"<<unfold.GetChi2L()
437 <<
" / "<<unfold.GetNdf()<<
"\n";
453 TH1 *histUnfoldOutput=unfold.GetOutput(
"PT(unfold,stat+bgrerr)");
456 TH2 *histEmatStat=unfold.GetEmatrixInput(
"unfolding stat error matrix");
460 TH2 *histEmatTotal=unfold.GetEmatrixTotal(
"unfolding total error matrix");
464 TH1 *histUnfoldStat=
new TH1D(
"PT(unfold,staterr)",
";Pt(gen)",
465 nGen,xminGen,xmaxGen);
466 TH1 *histUnfoldTotal=
new TH1D(
"PT(unfold,totalerr)",
";Pt(gen)",
467 nGen,xminGen,xmaxGen);
468 for(
Int_t i=0;i<nGen+2;i++) {
483 TH2D *histCorr=
new TH2D(
"Corr(total)",
";Pt(gen);Pt(gen)",
484 nGen,xminGen,xmaxGen,nGen,xminGen,xmaxGen);
485 for(
Int_t i=0;i<nGen+2;i++) {
488 if(ei<=0.0)
continue;
489 for(
Int_t j=0;j<nGen+2;j++) {
491 if(ej<=0.0)
continue;
497 TH1 *histDetNormBgr1=unfold.GetBackground(
"bgr1 normalized",
499 TH1 *histDetNormBgrTotal=unfold.GetBackground(
"bgr total normalized");
509 histUnfoldInput->
Draw(
"E");
514 histDetMC->
Draw(
"SAME HIST");
515 histDetNormBgr1->
Draw(
"SAME HIST");
516 histDetNormBgrTotal->
Draw(
"SAME HIST");
523 histUnfoldTotal->
Draw(
"E");
525 histUnfoldOutput->
Draw(
"SAME E1");
527 histUnfoldStat->
Draw(
"SAME E1");
528 histDataTruth->
Draw(
"SAME HIST");
530 histBbbSignalGen->
Draw(
"SAME HIST");
535 histUnfoldMatrix->
Draw(
"BOX");
541 bestLogTauLogChi2->
Draw(
"*");
547 bestLcurve->
Draw(
"*");
551 histCorr->
Draw(
"BOX");
553 output.SaveAs(
"testUnfold3.ps");
558 std::cout<<
"bin truth result (stat) (bgr) (sys)\n";
559 std::cout<<
"===+=====+=========+========+========+=======\n";
560 for(
Int_t i=1;i<=nGen;i++) {
583 Double_t errData_stat_bbb = errData*fCorr;
585 Double_t errData_statbgr_bbb = errData_bgr*fCorr;
591 Double_t shift_sys= data_bgr*fCorr_sys - data_bbb;
595 TMath::Sqrt(errData_statbgr_bbb*errData_statbgr_bbb
596 +shift_sys*shift_sys);
607 (
"%3d %5.0f %8.1f +/-%5.1f +/-%5.1f +/-%5.1f (unfolding)",
609 errData_stat_unfold,
TMath::Sqrt(errData_statbgr_unfold*
610 errData_statbgr_unfold-
612 errData_stat_unfold),
614 errData_total_unfold-
615 errData_statbgr_unfold*
616 errData_statbgr_unfold))<<
"\n";
618 (
" %8.1f +/-%5.1f +/-%5.1f +/-%5.1f (bin-by-bin)",
619 data_bbb,errData_stat_bbb,
TMath::Sqrt(errData_statbgr_bbb*
626 errData_statbgr_bbb))
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
R__EXTERN TStyle * gStyle
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
A TGraph is an object made of two arrays X and Y with npoints each.
void Draw(Option_t *chopt="") override
Draw this graph with its current attributes.
1-D histogram with a double per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
virtual void SetMaximum(Double_t maximum=-1111)
virtual void SetBinError(Int_t bin, Double_t error)
Set the bin Error Note that this resets the bin eror option to be of Normal Type and for the non-empt...
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
void Draw(Option_t *option="") override
Draw this histogram with options.
virtual void SetMinimum(Double_t minimum=-1111)
static void SetDefaultSumw2(Bool_t sumw2=kTRUE)
When this static function is called with sumw2=kTRUE, all new histograms will automatically activate ...
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
2-D histogram with a double per channel (see TH1 documentation)
Service class for 2-D histogram classes.
void SetBinContent(Int_t bin, Double_t content) override
Set bin content.
Double_t GetBinContent(Int_t binx, Int_t biny) const override
Int_t Fill(Double_t) override
Invalid Fill method.
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
Automatic pad generation by division.
Random number generator class based on M.
This is the base class for the ROOT Random number generators.
Double_t Rndm() override
Machine independent random number generator.
virtual Double_t BreitWigner(Double_t mean=0, Double_t gamma=1)
Return a number distributed following a BreitWigner function with mean and gamma.
Base class for spline implementation containing the Draw/Paint methods.
void Draw(Option_t *option="") override
Draw this function with its current attributes.
virtual void GetKnot(Int_t i, Double_t &x, Double_t &y) const =0
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void SetOptFit(Int_t fit=1)
The type of information about fit parameters printed in the histogram statistics box can be selected ...
An algorithm to unfold distributions from detector to truth level.
EDensityMode
choice of regularisation scale factors to cinstruct the matrix L
@ kDensityModeBinWidth
scale factors from multidimensional bin width
@ kSysErrModeMatrix
matrix is an alternative to the default matrix, the errors are the difference to the original matrix
static const char * GetTUnfoldVersion(void)
return a string describing the TUnfold version
EConstraint
type of extra constraint
@ kEConstraintArea
enforce preservation of the area
ERegMode
choice of regularisation scheme
@ kRegModeCurvature
regularize the 2nd derivative of the output distribution
@ kHistMapOutputHoriz
truth level on x-axis of the response matrix
RVec< PromoteTypes< T0, T1 > > pow(const T0 &x, const RVec< T1 > &v)
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.