rf711_lagrangianmorph

Morphing effective field theory distributions with RooLagrangianMorphFunc A morphing function as a function of one coefficient is setup and can be used to obtain the distribution for any value of the coefficient.

Author: Rahul Balasubramanian
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Wednesday, November 30, 2022 at 11:24 AM.

In [1]:
%%cpp -d
#include <RooAbsCollection.h>
#include <RooDataHist.h>
#include <RooDataSet.h>
#include <RooLagrangianMorphFunc.h>
#include <RooPlot.h>
#include <RooRealVar.h>

#include <TCanvas.h>
#include <TColor.h>
#include <TFile.h>
#include <TFolder.h>
#include <TH1.h>
#include <TLegend.h>
#include <TStyle.h>

using namespace RooFit;

Create variables for

morphing function

In [2]:
std::string observablename = "pTV";

Setup observable that is morphed

In [3]:
RooRealVar obsvar(observablename.c_str(), "p_{T}^{V}", 10, 600);

Setup two couplings that enters the morphing function kSM -> SM coupling set to constant (1) cHq3 -> EFT parameter with NewPhysics attribute set to true

In [4]:
RooRealVar kSM("kSM", "sm modifier", 1.0);
RooRealVar cHq3("cHq3", "EFT modifier", 0.0, 1.0);
cHq3.setAttribute("NewPhysics", true);

Inputs needed for config

In [5]:
std::string infilename = std::string(gROOT->GetTutorialDir()) + "/roofit/input_histos_rf_lagrangianmorph.root";
std::vector<std::string> samplelist = {"SM_NPsq0", "cHq3_NPsq1", "cHq3_NPsq2"};

Setup Config

In [6]:
RooLagrangianMorphFunc::Config config;
config.fileName = infilename;
config.observableName = observablename;
config.folderNames = samplelist;
config.couplings.add(cHq3);
config.couplings.add(kSM);

Create morphing function

In [7]:
RooLagrangianMorphFunc morphfunc("morphfunc", "morphed dist. of pTV", config);
[#0] PROGRESS:InputArguments -- initializing physics inputs from file /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/tutorials/roofit/input_histos_rf_lagrangianmorph.root with object name(s) 'pTV'

Get morphed distribution for

different cHq3

In [8]:
morphfunc.setParameter("cHq3", 0.01);
auto morph_hist_0p01 = morphfunc.createTH1("morph_cHq3=0.01");
morphfunc.setParameter("cHq3", 0.25);
auto morph_hist_0p25 = morphfunc.createTH1("morph_cHq3=0.25");
morphfunc.setParameter("cHq3", 0.5);
auto morph_hist_0p5 = morphfunc.createTH1("morph_cHq3=0.5");
RooDataHist morph_datahist_0p01("morph_dh_cHq3=0.01", "", RooArgList(obsvar), morph_hist_0p01);
RooDataHist morph_datahist_0p25("morph_dh_cHq3=0.25", "", RooArgList(obsvar), morph_hist_0p25);
RooDataHist morph_datahist_0p5("morph_dh_cHq3=0.5", "", RooArgList(obsvar), morph_hist_0p5);
[#0] PROGRESS:Caching -- creating cache from getCache function for 0x7f0f78b79000
[#0] PROGRESS:Caching -- current storage has size 3
[#0] PROGRESS:ObjectHandling -- observable: pTV
[#0] PROGRESS:ObjectHandling -- binWidth: binWidth_pTV
[#1] INFO:DataHandling -- RooDataHist::adjustBinning(morph_dh_cHq3=0.01): fit range of variable pTV expanded to nearest bin boundaries: [10,600] --> [0,600]
[#1] INFO:DataHandling -- RooDataHist::adjustBinning(morph_dh_cHq3=0.25): fit range of variable pTV expanded to nearest bin boundaries: [0,600] --> [0,600]
[#1] INFO:DataHandling -- RooDataHist::adjustBinning(morph_dh_cHq3=0.5): fit range of variable pTV expanded to nearest bin boundaries: [0,600] --> [0,600]

Extract input templates

for plotting

In [9]:
TFile *file = new TFile(infilename.c_str(), "READ");
TFolder *folder = 0;
file->GetObject(samplelist[0].c_str(), folder);
TH1 *input_hist0 = dynamic_cast<TH1 *>(folder->FindObject(observablename.c_str()));
input_hist0->SetDirectory(NULL);
file->GetObject(samplelist[1].c_str(), folder);
TH1 *input_hist1 = dynamic_cast<TH1 *>(folder->FindObject(observablename.c_str()));
input_hist1->SetDirectory(NULL);
file->GetObject(samplelist[2].c_str(), folder);
TH1 *input_hist2 = dynamic_cast<TH1 *>(folder->FindObject(observablename.c_str()));
input_hist2->SetDirectory(NULL);
file->Close();

RooDataHist input_dh0(samplelist[0].c_str(), "", RooArgList(obsvar), input_hist0);
RooDataHist input_dh1(samplelist[1].c_str(), "", RooArgList(obsvar), input_hist1);
RooDataHist input_dh2(samplelist[2].c_str(), "", RooArgList(obsvar), input_hist2);

auto frame0 = obsvar.frame(Title("Input templates for p_{T}^{V}"));
input_dh0.plotOn(frame0, Name(samplelist[0].c_str()), LineColor(kBlack), MarkerColor(kBlack), MarkerSize(1));
input_dh1.plotOn(frame0, Name(samplelist[1].c_str()), LineColor(kRed), MarkerColor(kRed), MarkerSize(1));
input_dh2.plotOn(frame0, Name(samplelist[2].c_str()), LineColor(kBlue), MarkerColor(kBlue), MarkerSize(1));
[#1] INFO:InputArguments -- RooAbsData::plotOn(SM_NPsq0) INFO: dataset has non-integer weights, auto-selecting SumW2 errors instead of Poisson errors
[#1] INFO:InputArguments -- RooAbsData::plotOn(cHq3_NPsq1) INFO: dataset has non-integer weights, auto-selecting SumW2 errors instead of Poisson errors
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 24931.9 will supercede previous event count of 10852.3 for normalization of PDF projections
[#1] INFO:InputArguments -- RooAbsData::plotOn(cHq3_NPsq2) INFO: dataset has non-integer weights, auto-selecting SumW2 errors instead of Poisson errors
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 29789.2 will supercede previous event count of 24931.9 for normalization of PDF projections

Plot morphed distribution for

different cHq3

In [10]:
auto frame1 = obsvar.frame(Title("Morphed templates for selected values"));
morph_datahist_0p01.plotOn(frame1, Name("morph_dh_cHq3=0.01"), DrawOption("C"), LineColor(kGreen),
                           DataError(RooAbsData::None), XErrorSize(0));
morph_datahist_0p25.plotOn(frame1, Name("morph_dh_cHq3=0.25"), DrawOption("C"), LineColor(kGreen + 1),
                           DataError(RooAbsData::None), XErrorSize(0));
morph_datahist_0p5.plotOn(frame1, Name("morph_dh_cHq3=0.5"), DrawOption("C"), LineColor(kGreen + 2),
                          DataError(RooAbsData::None), XErrorSize(0));
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 18947.1 will supercede previous event count of 11104.6 for normalization of PDF projections
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 30765.5 will supercede previous event count of 18947.1 for normalization of PDF projections

Create wrapped pdf togenerate 2D d a t a s e t o f c H q 3 a s a f u n c t i o n o f

observable

In [11]:
RooWrapperPdf model("wrap_pdf", "wrap_pdf", morphfunc);
RooDataSet *data = model.generate(RooArgSet(cHq3, obsvar), 1000000);
TH1 *hh_data = data->createHistogram("pTV vs cHq3", obsvar, Binning(20), YVar(cHq3, Binning(50)));
hh_data->SetTitle("Morphing prediction");
[#0] PROGRESS:Caching -- creating cache from getCache function for 0x7f0f6da60bd0
[#0] PROGRESS:Caching -- current storage has size 3
[#0] PROGRESS:ObjectHandling -- observable: pTV
[#0] PROGRESS:ObjectHandling -- binWidth: binWidth_pTV

[#1] INFO:NumericIntegration -- RooRealIntegral::init(w_SM_NPsq0_morphfunc_Int[cHq3]) using numeric integrator RooIntegrator1D to calculate Int(cHq3)
[#1] INFO:NumericIntegration -- RooRealIntegral::init(w_cHq3_NPsq1_morphfunc_Int[cHq3]) using numeric integrator RooIntegrator1D to calculate Int(cHq3)
[#1] INFO:NumericIntegration -- RooRealIntegral::init(w_cHq3_NPsq2_morphfunc_Int[cHq3]) using numeric integrator RooIntegrator1D to calculate Int(cHq3)
[#0] PROGRESS:Caching -- creating cache from getCache function for 0x7f0f6da9ad50
[#0] PROGRESS:Caching -- current storage has size 3
[#0] PROGRESS:ObjectHandling -- observable: pTV
[#0] PROGRESS:ObjectHandling -- binWidth: binWidth_pTV

[#1] INFO:NumericIntegration -- RooRealIntegral::init(w_SM_NPsq0_morphfunc_Int[cHq3]) using numeric integrator RooIntegrator1D to calculate Int(cHq3)
[#1] INFO:NumericIntegration -- RooRealIntegral::init(w_cHq3_NPsq1_morphfunc_Int[cHq3]) using numeric integrator RooIntegrator1D to calculate Int(cHq3)
[#1] INFO:NumericIntegration -- RooRealIntegral::init(w_cHq3_NPsq2_morphfunc_Int[cHq3]) using numeric integrator RooIntegrator1D to calculate Int(cHq3)
input_line_81:3:1: warning: 'data' shadows a declaration with the same name in the 'std' namespace; use '::data' to reference this declaration
RooDataSet *data = model.generate(RooArgSet(cHq3, obsvar), 1000000);
^

Draw plots on canvas

In [12]:
TCanvas *c1 = new TCanvas("fig3", "fig3", 1200, 400);
c1->Divide(3, 1);

c1->cd(1);
gPad->SetLeftMargin(0.15);
gPad->SetRightMargin(0.05);

frame0->Draw();
TLegend *leg1 = new TLegend(0.55, 0.65, 0.94, 0.87);
leg1->SetTextSize(0.04);
leg1->SetFillColor(kWhite);
leg1->SetLineColor(kWhite);
leg1->AddEntry("SM_NPsq0", "SM", "LP");
leg1->AddEntry((TObject *)0, "", "");
leg1->AddEntry("cHq3_NPsq1", "c_{Hq^(3)}=1.0 at #Lambda^{-2}", "LP");
leg1->AddEntry((TObject *)0, "", "");
leg1->AddEntry("cHq3_NPsq2", "c_{Hq^(3)}=1.0 at #Lambda^{-4}", "LP");
leg1->Draw();

c1->cd(2);
gPad->SetLeftMargin(0.15);
gPad->SetRightMargin(0.05);

frame1->Draw();

TLegend *leg2 = new TLegend(0.60, 0.65, 0.94, 0.87);
leg2->SetTextSize(0.04);
leg2->SetFillColor(kWhite);
leg2->SetLineColor(kWhite);
leg2->AddEntry("morph_dh_cHq3=0.01", "c_{Hq^{(3)}}=0.01", "L");
leg2->AddEntry((TObject *)0, "", "");
leg2->AddEntry("morph_dh_cHq3=0.25", "c_{Hq^{(3)}}=0.25", "L");
leg2->AddEntry((TObject *)0, "", "");
leg2->AddEntry("morph_dh_cHq3=0.5", "c_{Hq^{(3)}}=0.5", "L");
leg2->AddEntry((TObject *)0, "", "");
leg2->Draw();

c1->cd(3);
gPad->SetLeftMargin(0.12);
gPad->SetRightMargin(0.18);
gStyle->SetNumberContours(255);
gStyle->SetPalette(kGreyScale);
gStyle->SetOptStat(0);
TColor::InvertPalette();
gPad->SetLogz();
hh_data->GetYaxis()->SetTitle("c_{Hq^{(3)}}");
hh_data->GetYaxis()->SetRangeUser(0, 0.5);
hh_data->GetZaxis()->SetTitleOffset(1.8);
hh_data->Draw("COLZ");
c1->SaveAs("rf711_lagrangianmorph.png");
Info in <TCanvas::Print>: png file rf711_lagrangianmorph.png has been created

Draw all canvases

In [13]:
%jsroot on
gROOT->GetListOfCanvases()->Draw()