70 Double_t GenerateEvent(
const Double_t *parm,
71 const Double_t *triggerParm,
74 Double_t *ptGen,Int_t *iType)
117 Bool_t isTriggered=kFALSE;
121 Double_t f=rnd->Rndm();
124 if(f<parm[0]) itype=1;
125 else if(f<parm[0]+parm[1]) itype=2;
128 Double_t a=parm[4+itype];
130 Double_t t=rnd->Rndm();
132 Double_t x0=TMath::Log(parm[2]);
133 ptgen=TMath::Exp(t*(TMath::Log(parm[3])-x0)+x0);
135 Double_t x0=pow(parm[2],a1);
136 ptgen=pow(t*(pow(parm[3],a1)-x0)+x0,1./a1);
138 if(iType) *iType=itype;
139 if(ptGen) *ptGen=ptgen;
143 TMath::Sqrt(parm[7]*parm[7]*ptgen+parm[8]*parm[8]*ptgen*ptgen);
144 ptObs=rnd->BreitWigner(ptgen,sigma);
147 Double_t triggerProb =
148 triggerParm[2]/(1.+TMath::Exp((triggerParm[0]-ptObs)/triggerParm[1]));
149 isTriggered= rnd->Rndm()<triggerProb;
151 }
while((!triggerFlag) && (!isTriggered));
153 if(triggerFlag) *triggerFlag=isTriggered;
161 TH1::SetDefaultSumw2();
164 gStyle->SetOptFit(1111);
170 Double_t
const lumiData= 30000;
171 Double_t
const lumiMC =1000000;
178 Double_t
const xminDet=4.0;
179 Double_t
const xmaxDet=28.0;
183 Double_t
const xminGen= 6.0;
184 Double_t
const xmaxGen=26.0;
212 TH1D *histUnfoldInput=
213 new TH1D(
"unfolding input rec",
";ptrec",nDet,xminDet,xmaxDet);
214 TH2D *histUnfoldMatrix=
215 new TH2D(
"unfolding matrix",
";ptgen;ptrec",
216 nGen,xminGen,xmaxGen,nDet,xminDet,xmaxDet);
217 TH1D *histUnfoldBgr1=
218 new TH1D(
"unfolding bgr1 rec",
";ptrec",nDet,xminDet,xmaxDet);
219 TH1D *histUnfoldBgr2=
220 new TH1D(
"unfolding bgr2 rec",
";ptrec",nDet,xminDet,xmaxDet);
221 TH2D *histUnfoldMatrixSys=
222 new TH2D(
"unfolding matrix sys",
";ptgen;ptrec",
223 nGen,xminGen,xmaxGen,nDet,xminDet,xmaxDet);
227 new TH1D(
"bbb input rec",
";ptrec",nGen,xminGen,xmaxGen);
228 TH1D *histBbbSignalRec=
229 new TH1D(
"bbb signal rec",
";ptrec",nGen,xminGen,xmaxGen);
231 new TH1D(
"bbb bgr1 rec",
";ptrec",nGen,xminGen,xmaxGen);
233 new TH1D(
"bbb bgr2 rec",
";ptrec",nGen,xminGen,xmaxGen);
235 new TH1D(
"bbb bgrPt rec",
";ptrec",nGen,xminGen,xmaxGen);
236 TH1D *histBbbSignalGen=
237 new TH1D(
"bbb signal gen",
";ptgen",nGen,xminGen,xmaxGen);
238 TH1D *histBbbSignalRecSys=
239 new TH1D(
"bbb signal sys rec",
";ptrec",nGen,xminGen,xmaxGen);
240 TH1D *histBbbBgrPtSys=
241 new TH1D(
"bbb bgrPt sys rec",
";ptrec",nGen,xminGen,xmaxGen);
242 TH1D *histBbbSignalGenSys=
243 new TH1D(
"bbb signal sys gen",
";ptgen",nGen,xminGen,xmaxGen);
247 new TH1D(
"DATA truth gen",
";ptgen",nGen,xminGen,xmaxGen);
249 new TH1D(
"MC prediction rec",
";ptrec",nDet,xminDet,xmaxDet);
254 static Double_t parm_DATA[]={
265 static Double_t triggerParm_DATA[]={8.0,
270 Double_t intLumi=0.0;
271 while(intLumi<lumiData) {
275 Double_t ptObs=GenerateEvent(parm_DATA,triggerParm_DATA,&intLumi,
276 &isTriggered,&ptGen,&iTypeGen);
279 histUnfoldInput->Fill(ptObs);
282 histBbbInput->Fill(ptObs);
285 if(iTypeGen==0) histDataTruth->Fill(ptGen);
293 static Double_t parm_MC[]={
305 static Double_t triggerParm_MC[]={8.0,
311 Double_t lumiWeight = lumiData/lumiMC;
313 while(intLumi<lumiMC) {
317 Double_t ptObs=GenerateEvent(parm_MC,triggerParm_MC,&intLumi,&isTriggered,
319 if(!isTriggered) ptObs=0.0;
324 histUnfoldMatrix->Fill(ptGen,ptObs,lumiWeight);
325 }
else if(iTypeGen==1) {
326 histUnfoldBgr1->Fill(ptObs,lumiWeight);
327 }
else if(iTypeGen==2) {
328 histUnfoldBgr2->Fill(ptObs,lumiWeight);
333 if((ptGen>=xminGen)&&(ptGen<xmaxGen)) {
334 histBbbSignalRec->Fill(ptObs,lumiWeight);
336 histBbbBgrPt->Fill(ptObs,lumiWeight);
338 histBbbSignalGen->Fill(ptGen,lumiWeight);
339 }
else if(iTypeGen==1) {
340 histBbbBgr1->Fill(ptObs,lumiWeight);
341 }
else if(iTypeGen==2) {
342 histBbbBgr2->Fill(ptObs,lumiWeight);
346 histDetMC ->Fill(ptObs,lumiWeight);
353 static Double_t parm_MC_SYS[]={
366 while(intLumi<lumiMC) {
370 Double_t ptObs=GenerateEvent(parm_MC_SYS,triggerParm_MC,&intLumi,
371 &isTriggered,&ptGen,&iTypeGen);
372 if(!isTriggered) ptObs=0.0;
376 histUnfoldMatrixSys->Fill(ptGen,ptObs);
381 if((ptGen>=xminGen)&&(ptGen<xmaxGen)) {
382 histBbbSignalRecSys->Fill(ptObs);
384 histBbbBgrPtSys->Fill(ptObs);
386 histBbbSignalGenSys->Fill(ptGen);
391 cout<<
"TUnfold version is "<<TUnfold::GetTUnfoldVersion()<<
"\n";
400 TUnfold::ERegMode regMode =
401 TUnfold::kRegModeCurvature;
404 TUnfold::EConstraint constraintMode=
405 TUnfold::kEConstraintArea;
408 TUnfoldDensity::EDensityMode densityFlags=
409 TUnfoldDensity::kDensityModeBinWidth;
412 TUnfoldDensity unfold(histUnfoldMatrix,TUnfold::kHistMapOutputHoriz,
413 regMode,constraintMode,densityFlags);
416 unfold.SetInput(histUnfoldInput);
420 Double_t scale_bgr=1.0;
421 Double_t dscale_bgr=0.1;
422 unfold.SubtractBackground(histUnfoldBgr1,
"background1",scale_bgr,dscale_bgr);
423 unfold.SubtractBackground(histUnfoldBgr2,
"background2",scale_bgr,dscale_bgr);
426 unfold.AddSysError(histUnfoldMatrixSys,
"signalshape_SYS",
427 TUnfold::kHistMapOutputHoriz,
428 TUnfoldSys::kSysErrModeMatrix);
432 TSpline *logTauX,*logTauY;
436 Int_t iBest=unfold.ScanLcurve(nScan,0.,0.,&lCurve,&logTauX,&logTauY);
438 cout<<
"chi**2="<<unfold.GetChi2A()<<
"+"<<unfold.GetChi2L()
439 <<
" / "<<unfold.GetNdf()<<
"\n";
442 Double_t t[1],x[1],y[1];
443 logTauX->GetKnot(iBest,t[0],x[0]);
444 logTauY->GetKnot(iBest,t[0],y[0]);
445 TGraph *bestLcurve=
new TGraph(1,x,y);
446 TGraph *bestLogTauLogChi2=
new TGraph(1,t,x);
455 TH1 *histUnfoldOutput=unfold.GetOutput(
"PT(unfold,stat+bgrerr)");
458 TH2 *histEmatStat=unfold.GetEmatrixInput(
"unfolding stat error matrix");
462 TH2 *histEmatTotal=unfold.GetEmatrixTotal(
"unfolding total error matrix");
466 TH1 *histUnfoldStat=
new TH1D(
"PT(unfold,staterr)",
";Pt(gen)",
467 nGen,xminGen,xmaxGen);
468 TH1 *histUnfoldTotal=
new TH1D(
"PT(unfold,totalerr)",
";Pt(gen)",
469 nGen,xminGen,xmaxGen);
470 for(Int_t i=0;i<nGen+2;i++) {
471 Double_t c=histUnfoldOutput->GetBinContent(i);
474 histUnfoldStat->SetBinContent(i,c);
475 histUnfoldStat->SetBinError
476 (i,TMath::Sqrt(histEmatStat->GetBinContent(i,i)));
479 histUnfoldTotal->SetBinContent(i,c);
480 histUnfoldTotal->SetBinError
481 (i,TMath::Sqrt(histEmatTotal->GetBinContent(i,i)));
485 TH2D *histCorr=
new TH2D(
"Corr(total)",
";Pt(gen);Pt(gen)",
486 nGen,xminGen,xmaxGen,nGen,xminGen,xmaxGen);
487 for(Int_t i=0;i<nGen+2;i++) {
489 ei=TMath::Sqrt(histEmatTotal->GetBinContent(i,i));
490 if(ei<=0.0)
continue;
491 for(Int_t j=0;j<nGen+2;j++) {
492 ej=TMath::Sqrt(histEmatTotal->GetBinContent(j,j));
493 if(ej<=0.0)
continue;
494 histCorr->SetBinContent(i,j,histEmatTotal->GetBinContent(i,j)/ei/ej);
499 TH1 *histDetNormBgr1=unfold.GetBackground(
"bgr1 normalized",
501 TH1 *histDetNormBgrTotal=unfold.GetBackground(
"bgr total normalized");
510 histUnfoldInput->SetMinimum(0.0);
511 histUnfoldInput->Draw(
"E");
512 histDetMC->SetMinimum(0.0);
513 histDetMC->SetLineColor(kBlue);
514 histDetNormBgrTotal->SetLineColor(kRed);
515 histDetNormBgr1->SetLineColor(kCyan);
516 histDetMC->Draw(
"SAME HIST");
517 histDetNormBgr1->Draw(
"SAME HIST");
518 histDetNormBgrTotal->Draw(
"SAME HIST");
522 histUnfoldTotal->SetMinimum(0.0);
523 histUnfoldTotal->SetMaximum(histUnfoldTotal->GetMaximum()*1.5);
525 histUnfoldTotal->Draw(
"E");
527 histUnfoldOutput->Draw(
"SAME E1");
529 histUnfoldStat->Draw(
"SAME E1");
530 histDataTruth->Draw(
"SAME HIST");
531 histBbbSignalGen->SetLineColor(kBlue);
532 histBbbSignalGen->Draw(
"SAME HIST");
536 histUnfoldMatrix->SetLineColor(kBlue);
537 histUnfoldMatrix->Draw(
"BOX");
542 bestLogTauLogChi2->SetMarkerColor(kRed);
543 bestLogTauLogChi2->Draw(
"*");
548 bestLcurve->SetMarkerColor(kRed);
549 bestLcurve->Draw(
"*");
553 histCorr->Draw(
"BOX");
555 output.SaveAs(
"testUnfold3.ps");
560 std::cout<<
"bin truth result (stat) (bgr) (sys)\n";
561 std::cout<<
"===+=====+=========+========+========+=======\n";
562 for(Int_t i=1;i<=nGen;i++) {
564 Double_t data=histBbbInput->GetBinContent(i);
565 Double_t errData=histBbbInput->GetBinError(i);
568 Double_t data_bgr=data
569 - scale_bgr*(histBbbBgr1->GetBinContent(i)
570 + histBbbBgr2->GetBinContent(i)
571 + histBbbBgrPt->GetBinContent(i));
572 Double_t errData_bgr=TMath::Sqrt
574 TMath::Power(dscale_bgr*histBbbBgr1->GetBinContent(i),2)+
575 TMath::Power(scale_bgr*histBbbBgr1->GetBinError(i),2)+
576 TMath::Power(dscale_bgr*histBbbBgr2->GetBinContent(i),2)+
577 TMath::Power(scale_bgr*histBbbBgr2->GetBinError(i),2)+
578 TMath::Power(dscale_bgr*histBbbBgrPt->GetBinContent(i),2)+
579 TMath::Power(scale_bgr*histBbbBgrPt->GetBinError(i),2));
581 Double_t fCorr=(histBbbSignalGen->GetBinContent(i)/
582 histBbbSignalRec->GetBinContent(i));
583 Double_t data_bbb= data_bgr *fCorr;
585 Double_t errData_stat_bbb = errData*fCorr;
587 Double_t errData_statbgr_bbb = errData_bgr*fCorr;
591 Double_t fCorr_sys=(histBbbSignalGenSys->GetBinContent(i)/
592 histBbbSignalRecSys->GetBinContent(i));
593 Double_t shift_sys= data_bgr*fCorr_sys - data_bbb;
596 Double_t errData_total_bbb=
597 TMath::Sqrt(errData_statbgr_bbb*errData_statbgr_bbb
598 +shift_sys*shift_sys);
601 Double_t data_unfold= histUnfoldStat->GetBinContent(i);
602 Double_t errData_stat_unfold=histUnfoldStat->GetBinError(i);
603 Double_t errData_statbgr_unfold=histUnfoldOutput->GetBinError(i);
604 Double_t errData_total_unfold=histUnfoldTotal->GetBinError(i);
608 std::cout<<TString::Format
609 (
"%3d %5.0f %8.1f +/-%5.1f +/-%5.1f +/-%5.1f (unfolding)",
610 i,histDataTruth->GetBinContent(i),data_unfold,
611 errData_stat_unfold,TMath::Sqrt(errData_statbgr_unfold*
612 errData_statbgr_unfold-
614 errData_stat_unfold),
615 TMath::Sqrt(errData_total_unfold*
616 errData_total_unfold-
617 errData_statbgr_unfold*
618 errData_statbgr_unfold))<<
"\n";
619 std::cout<<TString::Format
620 (
" %8.1f +/-%5.1f +/-%5.1f +/-%5.1f (bin-by-bin)",
621 data_bbb,errData_stat_bbb,TMath::Sqrt(errData_statbgr_bbb*
625 TMath::Sqrt(errData_total_bbb*
628 errData_statbgr_bbb))