From 5212582271961be92b66078d9f3e9a364d5c8431 Mon Sep 17 00:00:00 2001 From: nshadskiy Date: Thu, 23 Feb 2023 18:28:35 +0100 Subject: [PATCH 1/4] implementation of a producer for fake factor evaluation --- code_generation/analysis_template.cxx | 1 + code_generation/subset_template.cxx | 1 + .../2018/FF_corrections_mt.json.gz | Bin 0 -> 17137 bytes .../fake_factors/2018/fake_factors_mt.json.gz | Bin 0 -> 10974 bytes include/fakefactors.hxx | 17 ++ src/fake_factors.cxx | 171 ++++++++++++++++++ 6 files changed, 190 insertions(+) create mode 100644 data/fake_factors/2018/FF_corrections_mt.json.gz create mode 100644 data/fake_factors/2018/fake_factors_mt.json.gz create mode 100644 include/fakefactors.hxx create mode 100644 src/fake_factors.cxx diff --git a/code_generation/analysis_template.cxx b/code_generation/analysis_template.cxx index 0147edec..08f1f67a 100644 --- a/code_generation/analysis_template.cxx +++ b/code_generation/analysis_template.cxx @@ -15,6 +15,7 @@ #include "include/scalefactors.hxx" #include "include/topreco.hxx" #include "include/triggers.hxx" +#include "include/fakefactors.hxx" #include "include/utility/Logger.hxx" #include #include diff --git a/code_generation/subset_template.cxx b/code_generation/subset_template.cxx index e4123125..49137866 100644 --- a/code_generation/subset_template.cxx +++ b/code_generation/subset_template.cxx @@ -16,6 +16,7 @@ #include "include/scalefactors.hxx" #include "include/topreco.hxx" #include "include/triggers.hxx" +#include "include/fakefactors.hxx" #include "include/utility/Logger.hxx" #include #include diff --git a/data/fake_factors/2018/FF_corrections_mt.json.gz b/data/fake_factors/2018/FF_corrections_mt.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..cf67e8e453c6f7786dce9bb08453f5dd3c32bf04 GIT binary patch literal 17137 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 literal 0 HcmV?d00001 diff --git a/data/fake_factors/2018/fake_factors_mt.json.gz b/data/fake_factors/2018/fake_factors_mt.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..26fb06505710078426c795db70dce99c4cf2dda2 GIT binary patch literal 10974 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 Ib0Nb0A1N}oKmY&$ literal 0 HcmV?d00001 diff --git a/include/fakefactors.hxx b/include/fakefactors.hxx new file mode 100644 index 00000000..8d18c9df --- /dev/null +++ b/include/fakefactors.hxx @@ -0,0 +1,17 @@ +#ifndef GUARDFAKEFACTORS_H +#define GUARDFAKEFACTORS_H + +namespace fakefactors { + +ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &variation, const std::string &ff_file); +ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &lep_pt, const std::string &lep_iso, + const std::string &variation, + const std::string &ff_file, const std::string &ff_corr_file); +} // namespace fakefactors +#endif /* GUARDFAKEFACTORS_H */ \ No newline at end of file diff --git a/src/fake_factors.cxx b/src/fake_factors.cxx new file mode 100644 index 00000000..99d44159 --- /dev/null +++ b/src/fake_factors.cxx @@ -0,0 +1,171 @@ +#ifndef GUARDFAKEFACTORS_H +#define GUARDFAKEFACTORS_H +/// The namespace that contains the fake factor function. +#include "../include/utility/Logger.hxx" +// #include "ROOT/RDFHelpers.hxx" +#include "ROOT/RDataFrame.hxx" +#include "correction.h" +// #include +// #include + +namespace fakefactors { + +/// Function to calculate raw fake factors without corrections with correctionlib +/// +/// \param df the dataframe to add the quantity to +/// \param outputname name of the output column for the fake factor +/// \param tau_pt pt of the hadronic tau in the tau pair +/// \param njets number of good jets in the event +/// \param lep_mt transverse mass of the leptonic tau in the tau pair +/// \param nbtags number of good b-tagged jets in the event +/// \param variation name of the uncertainty variation or nominal +/// \param ff_file correctionlib json file with the fake factors +/// +/// \returns a dataframe with the fake factors +ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &variation, const std::string &ff_file) { + auto calc_fake_factor = [variation, ff_file] + (const float &pt_2, const int &njets, + const float &mt_1, const int &nbtag) { + Logger::get("RawFakeFactor")->debug( + "Setting up functions for raw fake factor (without corrections) evaluation with correctionlib"); + Logger::get("RawFakeFactor")->debug("Variation - Name {}", variation); + auto qcd = + correction::CorrectionSet::from_file(ff_file)->at("QCD_fake_factors"); + auto wjets = + correction::CorrectionSet::from_file(ff_file)->at("Wjets_fake_factors"); + auto ttbar = + correction::CorrectionSet::from_file(ff_file)->at("ttbar_fake_factors"); + auto fractions = + correction::CorrectionSet::from_file(ff_file)->at("process_fractions"); + + float ff = -1.; + if (pt_2 >= 0.) { + Logger::get("RawFakeFactor")->debug("Tau pt - value {}", pt_2); + Logger::get("RawFakeFactor")->debug("N jets - value {}", njets); + + float qcd_ff = qcd->evaluate({pt_2, (float)njets, variation}); + Logger::get("RawFakeFactor")->debug("QCD - value {}", qcd_ff); + float wjets_ff = wjets->evaluate({pt_2, (float)njets, variation}); + Logger::get("RawFakeFactor")->debug("Wjets - value {}", wjets_ff); + float ttbar_ff = ttbar->evaluate({pt_2, (float)njets, variation}); + Logger::get("RawFakeFactor")->debug("ttbar - value {}", ttbar_ff); + + Logger::get("RawFakeFactor")->debug("Lep mt - value {}", mt_1); + Logger::get("RawFakeFactor")->debug("N b-jets - value {}", nbtag); + + float qcd_frac = fractions->evaluate({"QCD", mt_1, (float)nbtag, variation}); + Logger::get("RawFakeFactor")->debug("QCD - fraction {}", qcd_frac); + float wjets_frac = fractions->evaluate({"Wjets", mt_1, (float)nbtag, variation}); + Logger::get("RawFakeFactor")->debug("Wjets - fraction {}", wjets_frac); + float ttbar_frac = fractions->evaluate({"ttbar", mt_1, (float)nbtag, variation}); + Logger::get("RawFakeFactor")->debug("ttbar - fraction {}", ttbar_frac); + + ff = qcd_frac*qcd_ff + wjets_frac*wjets_ff + ttbar_frac*ttbar_ff; + } + + Logger::get("RawFakeFactor")->debug("Event Fake Factor {}", ff); + return ff; + }; + auto df1 = df.Define( + outputname, calc_fake_factor, + {tau_pt, njets, lep_mt, nbtags}); + return df1; +} + +/// Function to calculate fake factors with correctionlib +/// +/// \param df the dataframe to add the quantity to +/// \param outputname name of the output column for the fake factor +/// \param tau_pt pt of the hadronic tau in the tau pair +/// \param njets number of good jets in the event +/// \param lep_mt transverse mass of the leptonic tau in the tau pair +/// \param nbtags number of good b-tagged jets in the event +/// \param lep_pt pt of the leptonic tau in the tau pair +/// \param lep_iso isolation of the leptonic tau in the tau pair +/// \param variation name of the uncertainty variation or nominal +/// \param ff_file correctionlib json file with the fake factors +/// \param ff_corr_file correctionlib json file with corrections for the fake factors +/// +/// \returns a dataframe with the fake factors +ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &lep_pt, const std::string &lep_iso, + const std::string &variation, + const std::string &ff_file, const std::string &ff_corr_file) { + auto calc_fake_factor = [variation, ff_file, ff_corr_file] + (const float &pt_2, const int &njets, + const float &mt_1, const int &nbtag, + const float &pt_1, const float &iso_1) { + Logger::get("FakeFactor")->debug( + "Setting up functions for fake factor evaluation with correctionlib"); + Logger::get("FakeFactor")->debug("Variation - Name {}", variation); + auto qcd = + correction::CorrectionSet::from_file(ff_file)->at("QCD_fake_factors"); + auto wjets = + correction::CorrectionSet::from_file(ff_file)->at("Wjets_fake_factors"); + auto ttbar = + correction::CorrectionSet::from_file(ff_file)->at("ttbar_fake_factors"); + auto fractions = + correction::CorrectionSet::from_file(ff_file)->at("process_fractions"); + + auto qcd_lep_pt_closure = + correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_non_closure_lep_pt_correction"); + auto qcd_lep_iso_closure = + correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_non_closure_lep_iso_correction"); + auto wjets_lep_pt_closure = + correction::CorrectionSet::from_file(ff_corr_file)->at("Wjets_non_closure_lep_pt_correction"); + auto ttbar_lep_pt_closure = + correction::CorrectionSet::from_file(ff_corr_file)->at("ttbar_non_closure_lep_pt_correction"); + + float ff = -1.; + if (pt_2 >= 0.) { + Logger::get("FakeFactor")->debug("Tau pt - value {}", pt_2); + Logger::get("FakeFactor")->debug("N jets - value {}", njets); + + float qcd_ff = qcd->evaluate({pt_2, (float)njets, variation}); + Logger::get("FakeFactor")->debug("QCD - value {}", qcd_ff); + float wjets_ff = wjets->evaluate({pt_2, (float)njets, variation}); + Logger::get("FakeFactor")->debug("Wjets - value {}", wjets_ff); + float ttbar_ff = ttbar->evaluate({pt_2, (float)njets, variation}); + Logger::get("FakeFactor")->debug("ttbar - value {}", ttbar_ff); + + Logger::get("FakeFactor")->debug("Lep mt - value {}", mt_1); + Logger::get("FakeFactor")->debug("N b-jets - value {}", nbtag); + + float qcd_frac = fractions->evaluate({"QCD", mt_1, (float)nbtag, variation}); + Logger::get("FakeFactor")->debug("QCD - fraction {}", qcd_frac); + float wjets_frac = fractions->evaluate({"Wjets", mt_1, (float)nbtag, variation}); + Logger::get("FakeFactor")->debug("Wjets - fraction {}", wjets_frac); + float ttbar_frac = fractions->evaluate({"ttbar", mt_1, (float)nbtag, variation}); + Logger::get("FakeFactor")->debug("ttbar - fraction {}", ttbar_frac); + + Logger::get("FakeFactor")->debug("Lep pt - value {}", pt_1); + Logger::get("FakeFactor")->debug("Lep iso - value {}", iso_1); + + float qcd_lep_pt_corr = qcd_lep_pt_closure->evaluate({pt_1, variation}); + Logger::get("FakeFactor")->debug("QCD - lep pt correction {}", qcd_lep_pt_corr); + float qcd_lep_iso_corr = qcd_lep_iso_closure->evaluate({iso_1, variation}); + Logger::get("FakeFactor")->debug("QCD - lep iso correction {}", qcd_lep_iso_corr); + float wjets_lep_pt_corr = wjets_lep_pt_closure->evaluate({pt_1, variation}); + Logger::get("FakeFactor")->debug("Wjets - lep pt correction {}", wjets_lep_pt_corr); + float ttbar_lep_pt_corr = ttbar_lep_pt_closure->evaluate({pt_1, variation}); + Logger::get("FakeFactor")->debug("ttbar - lep pt correction {}", ttbar_lep_pt_corr); + + ff = qcd_frac*qcd_ff*qcd_lep_pt_corr*qcd_lep_iso_corr + wjets_frac*wjets_ff*wjets_lep_pt_corr + ttbar_frac*ttbar_ff*ttbar_lep_pt_corr; + } + + Logger::get("FakeFactor")->debug("Event Fake Factor {}", ff); + return ff; + }; + auto df1 = df.Define( + outputname, calc_fake_factor, + {tau_pt, njets, lep_mt, nbtags, lep_pt, lep_iso}); + return df1; +} + +} // namespace fakefactors +#endif /* GUARDFAKEFACTORS_H */ \ No newline at end of file From 55feee309c932a125b748de53a990285dd4b4a39 Mon Sep 17 00:00:00 2001 From: nshadskiy Date: Thu, 30 Mar 2023 08:38:55 +0200 Subject: [PATCH 2/4] some small fake factor adjustments --- include/fakefactors.hxx | 2 +- src/{fake_factors.cxx => fakefactors.cxx} | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) rename src/{fake_factors.cxx => fakefactors.cxx} (89%) diff --git a/include/fakefactors.hxx b/include/fakefactors.hxx index 8d18c9df..a6a79dd9 100644 --- a/include/fakefactors.hxx +++ b/include/fakefactors.hxx @@ -11,7 +11,7 @@ ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &out const std::string &tau_pt, const std::string &njets, const std::string &lep_mt, const std::string &nbtags, const std::string &lep_pt, const std::string &lep_iso, - const std::string &variation, + const std::string &m_vis, const std::string &variation, const std::string &ff_file, const std::string &ff_corr_file); } // namespace fakefactors #endif /* GUARDFAKEFACTORS_H */ \ No newline at end of file diff --git a/src/fake_factors.cxx b/src/fakefactors.cxx similarity index 89% rename from src/fake_factors.cxx rename to src/fakefactors.cxx index 99d44159..7f35c2e2 100644 --- a/src/fake_factors.cxx +++ b/src/fakefactors.cxx @@ -2,11 +2,8 @@ #define GUARDFAKEFACTORS_H /// The namespace that contains the fake factor function. #include "../include/utility/Logger.hxx" -// #include "ROOT/RDFHelpers.hxx" #include "ROOT/RDataFrame.hxx" #include "correction.h" -// #include -// #include namespace fakefactors { @@ -85,6 +82,7 @@ ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string /// \param nbtags number of good b-tagged jets in the event /// \param lep_pt pt of the leptonic tau in the tau pair /// \param lep_iso isolation of the leptonic tau in the tau pair +/// \param m_vis visible mass of the tau pair /// \param variation name of the uncertainty variation or nominal /// \param ff_file correctionlib json file with the fake factors /// \param ff_corr_file correctionlib json file with corrections for the fake factors @@ -94,12 +92,13 @@ ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &out const std::string &tau_pt, const std::string &njets, const std::string &lep_mt, const std::string &nbtags, const std::string &lep_pt, const std::string &lep_iso, - const std::string &variation, + const std::string &m_vis, const std::string &variation, const std::string &ff_file, const std::string &ff_corr_file) { auto calc_fake_factor = [variation, ff_file, ff_corr_file] (const float &pt_2, const int &njets, const float &mt_1, const int &nbtag, - const float &pt_1, const float &iso_1) { + const float &pt_1, const float &iso_1, + const float &m_vis) { Logger::get("FakeFactor")->debug( "Setting up functions for fake factor evaluation with correctionlib"); Logger::get("FakeFactor")->debug("Variation - Name {}", variation); @@ -116,8 +115,12 @@ ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &out correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_non_closure_lep_pt_correction"); auto qcd_lep_iso_closure = correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_non_closure_lep_iso_correction"); + auto qcd_DR_SR = + correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_DR_SR_correction"); auto wjets_lep_pt_closure = correction::CorrectionSet::from_file(ff_corr_file)->at("Wjets_non_closure_lep_pt_correction"); + auto wjets_DR_SR = + correction::CorrectionSet::from_file(ff_corr_file)->at("Wjets_DR_SR_correction"); auto ttbar_lep_pt_closure = correction::CorrectionSet::from_file(ff_corr_file)->at("ttbar_non_closure_lep_pt_correction"); @@ -145,17 +148,22 @@ ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &out Logger::get("FakeFactor")->debug("Lep pt - value {}", pt_1); Logger::get("FakeFactor")->debug("Lep iso - value {}", iso_1); + Logger::get("FakeFactor")->debug("m_vis - value {}", m_vis); float qcd_lep_pt_corr = qcd_lep_pt_closure->evaluate({pt_1, variation}); Logger::get("FakeFactor")->debug("QCD - lep pt correction {}", qcd_lep_pt_corr); float qcd_lep_iso_corr = qcd_lep_iso_closure->evaluate({iso_1, variation}); Logger::get("FakeFactor")->debug("QCD - lep iso correction {}", qcd_lep_iso_corr); + float qcd_DR_SR_corr = qcd_DR_SR->evaluate({m_vis, variation}); + Logger::get("FakeFactor")->debug("QCD - DR to SR correction {}", qcd_DR_SR_corr); float wjets_lep_pt_corr = wjets_lep_pt_closure->evaluate({pt_1, variation}); Logger::get("FakeFactor")->debug("Wjets - lep pt correction {}", wjets_lep_pt_corr); + float wjets_DR_SR_corr = wjets_DR_SR->evaluate({m_vis, variation}); + Logger::get("FakeFactor")->debug("Wjets - DR to SR correction {}", wjets_DR_SR_corr); float ttbar_lep_pt_corr = ttbar_lep_pt_closure->evaluate({pt_1, variation}); Logger::get("FakeFactor")->debug("ttbar - lep pt correction {}", ttbar_lep_pt_corr); - ff = qcd_frac*qcd_ff*qcd_lep_pt_corr*qcd_lep_iso_corr + wjets_frac*wjets_ff*wjets_lep_pt_corr + ttbar_frac*ttbar_ff*ttbar_lep_pt_corr; + ff = qcd_frac*qcd_ff*qcd_lep_pt_corr*qcd_lep_iso_corr*qcd_DR_SR_corr + wjets_frac*wjets_ff*wjets_lep_pt_corr*wjets_DR_SR_corr + ttbar_frac*ttbar_ff*ttbar_lep_pt_corr; } Logger::get("FakeFactor")->debug("Event Fake Factor {}", ff); @@ -163,7 +171,7 @@ ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &out }; auto df1 = df.Define( outputname, calc_fake_factor, - {tau_pt, njets, lep_mt, nbtags, lep_pt, lep_iso}); + {tau_pt, njets, lep_mt, nbtags, lep_pt, lep_iso, m_vis}); return df1; } From 9386b490f854027aa962126b03178426ad56913d Mon Sep 17 00:00:00 2001 From: nshadskiy Date: Thu, 30 Mar 2023 08:55:20 +0200 Subject: [PATCH 3/4] clang-format --- include/fakefactors.hxx | 24 ++--- src/fakefactors.cxx | 189 +++++++++++++++++++++++----------------- 2 files changed, 125 insertions(+), 88 deletions(-) diff --git a/include/fakefactors.hxx b/include/fakefactors.hxx index a6a79dd9..0c00bd52 100644 --- a/include/fakefactors.hxx +++ b/include/fakefactors.hxx @@ -3,15 +3,19 @@ namespace fakefactors { -ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, - const std::string &tau_pt, const std::string &njets, - const std::string &lep_mt, const std::string &nbtags, - const std::string &variation, const std::string &ff_file); -ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, - const std::string &tau_pt, const std::string &njets, - const std::string &lep_mt, const std::string &nbtags, - const std::string &lep_pt, const std::string &lep_iso, - const std::string &m_vis, const std::string &variation, - const std::string &ff_file, const std::string &ff_corr_file); +ROOT::RDF::RNode +raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &variation, + const std::string &ff_file); +ROOT::RDF::RNode +fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &lep_pt, const std::string &lep_iso, + const std::string &m_vis, const std::string &variation, + const std::string &ff_file, + const std::string &ff_corr_file); } // namespace fakefactors #endif /* GUARDFAKEFACTORS_H */ \ No newline at end of file diff --git a/src/fakefactors.cxx b/src/fakefactors.cxx index 7f35c2e2..df7eaafe 100644 --- a/src/fakefactors.cxx +++ b/src/fakefactors.cxx @@ -7,7 +7,8 @@ namespace fakefactors { -/// Function to calculate raw fake factors without corrections with correctionlib +/// Function to calculate raw fake factors without corrections with +/// correctionlib /// /// \param df the dataframe to add the quantity to /// \param outputname name of the output column for the fake factor @@ -19,24 +20,27 @@ namespace fakefactors { /// \param ff_file correctionlib json file with the fake factors /// /// \returns a dataframe with the fake factors -ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, - const std::string &tau_pt, const std::string &njets, - const std::string &lep_mt, const std::string &nbtags, - const std::string &variation, const std::string &ff_file) { - auto calc_fake_factor = [variation, ff_file] - (const float &pt_2, const int &njets, - const float &mt_1, const int &nbtag) { - Logger::get("RawFakeFactor")->debug( - "Setting up functions for raw fake factor (without corrections) evaluation with correctionlib"); +ROOT::RDF::RNode +raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &variation, + const std::string &ff_file) { + auto calc_fake_factor = [variation, + ff_file](const float &pt_2, const int &njets, + const float &mt_1, const int &nbtag) { + Logger::get("RawFakeFactor") + ->debug("Setting up functions for raw fake factor (without " + "corrections) evaluation with correctionlib"); Logger::get("RawFakeFactor")->debug("Variation - Name {}", variation); - auto qcd = - correction::CorrectionSet::from_file(ff_file)->at("QCD_fake_factors"); - auto wjets = - correction::CorrectionSet::from_file(ff_file)->at("Wjets_fake_factors"); - auto ttbar = - correction::CorrectionSet::from_file(ff_file)->at("ttbar_fake_factors"); - auto fractions = - correction::CorrectionSet::from_file(ff_file)->at("process_fractions"); + auto qcd = correction::CorrectionSet::from_file(ff_file)->at( + "QCD_fake_factors"); + auto wjets = correction::CorrectionSet::from_file(ff_file)->at( + "Wjets_fake_factors"); + auto ttbar = correction::CorrectionSet::from_file(ff_file)->at( + "ttbar_fake_factors"); + auto fractions = correction::CorrectionSet::from_file(ff_file)->at( + "process_fractions"); float ff = -1.; if (pt_2 >= 0.) { @@ -53,26 +57,31 @@ ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string Logger::get("RawFakeFactor")->debug("Lep mt - value {}", mt_1); Logger::get("RawFakeFactor")->debug("N b-jets - value {}", nbtag); - float qcd_frac = fractions->evaluate({"QCD", mt_1, (float)nbtag, variation}); + float qcd_frac = + fractions->evaluate({"QCD", mt_1, (float)nbtag, variation}); Logger::get("RawFakeFactor")->debug("QCD - fraction {}", qcd_frac); - float wjets_frac = fractions->evaluate({"Wjets", mt_1, (float)nbtag, variation}); - Logger::get("RawFakeFactor")->debug("Wjets - fraction {}", wjets_frac); - float ttbar_frac = fractions->evaluate({"ttbar", mt_1, (float)nbtag, variation}); - Logger::get("RawFakeFactor")->debug("ttbar - fraction {}", ttbar_frac); - - ff = qcd_frac*qcd_ff + wjets_frac*wjets_ff + ttbar_frac*ttbar_ff; + float wjets_frac = + fractions->evaluate({"Wjets", mt_1, (float)nbtag, variation}); + Logger::get("RawFakeFactor") + ->debug("Wjets - fraction {}", wjets_frac); + float ttbar_frac = + fractions->evaluate({"ttbar", mt_1, (float)nbtag, variation}); + Logger::get("RawFakeFactor") + ->debug("ttbar - fraction {}", ttbar_frac); + + ff = qcd_frac * qcd_ff + wjets_frac * wjets_ff + + ttbar_frac * ttbar_ff; } - + Logger::get("RawFakeFactor")->debug("Event Fake Factor {}", ff); return ff; }; - auto df1 = df.Define( - outputname, calc_fake_factor, - {tau_pt, njets, lep_mt, nbtags}); + auto df1 = df.Define(outputname, calc_fake_factor, + {tau_pt, njets, lep_mt, nbtags}); return df1; } -/// Function to calculate fake factors with correctionlib +/// Function to calculate fake factors with correctionlib /// /// \param df the dataframe to add the quantity to /// \param outputname name of the output column for the fake factor @@ -85,44 +94,52 @@ ROOT::RDF::RNode raw_fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string /// \param m_vis visible mass of the tau pair /// \param variation name of the uncertainty variation or nominal /// \param ff_file correctionlib json file with the fake factors -/// \param ff_corr_file correctionlib json file with corrections for the fake factors +/// \param ff_corr_file correctionlib json file with corrections for the fake +/// factors /// /// \returns a dataframe with the fake factors -ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, - const std::string &tau_pt, const std::string &njets, - const std::string &lep_mt, const std::string &nbtags, - const std::string &lep_pt, const std::string &lep_iso, - const std::string &m_vis, const std::string &variation, - const std::string &ff_file, const std::string &ff_corr_file) { - auto calc_fake_factor = [variation, ff_file, ff_corr_file] - (const float &pt_2, const int &njets, - const float &mt_1, const int &nbtag, - const float &pt_1, const float &iso_1, - const float &m_vis) { - Logger::get("FakeFactor")->debug( - "Setting up functions for fake factor evaluation with correctionlib"); +ROOT::RDF::RNode +fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &outputname, + const std::string &tau_pt, const std::string &njets, + const std::string &lep_mt, const std::string &nbtags, + const std::string &lep_pt, const std::string &lep_iso, + const std::string &m_vis, const std::string &variation, + const std::string &ff_file, + const std::string &ff_corr_file) { + auto calc_fake_factor = [variation, ff_file, ff_corr_file]( + const float &pt_2, const int &njets, + const float &mt_1, const int &nbtag, + const float &pt_1, const float &iso_1, + const float &m_vis) { + Logger::get("FakeFactor") + ->debug("Setting up functions for fake factor evaluation with " + "correctionlib"); Logger::get("FakeFactor")->debug("Variation - Name {}", variation); - auto qcd = - correction::CorrectionSet::from_file(ff_file)->at("QCD_fake_factors"); - auto wjets = - correction::CorrectionSet::from_file(ff_file)->at("Wjets_fake_factors"); - auto ttbar = - correction::CorrectionSet::from_file(ff_file)->at("ttbar_fake_factors"); - auto fractions = - correction::CorrectionSet::from_file(ff_file)->at("process_fractions"); + auto qcd = correction::CorrectionSet::from_file(ff_file)->at( + "QCD_fake_factors"); + auto wjets = correction::CorrectionSet::from_file(ff_file)->at( + "Wjets_fake_factors"); + auto ttbar = correction::CorrectionSet::from_file(ff_file)->at( + "ttbar_fake_factors"); + auto fractions = correction::CorrectionSet::from_file(ff_file)->at( + "process_fractions"); auto qcd_lep_pt_closure = - correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_non_closure_lep_pt_correction"); + correction::CorrectionSet::from_file(ff_corr_file) + ->at("QCD_non_closure_lep_pt_correction"); auto qcd_lep_iso_closure = - correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_non_closure_lep_iso_correction"); - auto qcd_DR_SR = - correction::CorrectionSet::from_file(ff_corr_file)->at("QCD_DR_SR_correction"); + correction::CorrectionSet::from_file(ff_corr_file) + ->at("QCD_non_closure_lep_iso_correction"); + auto qcd_DR_SR = correction::CorrectionSet::from_file(ff_corr_file) + ->at("QCD_DR_SR_correction"); auto wjets_lep_pt_closure = - correction::CorrectionSet::from_file(ff_corr_file)->at("Wjets_non_closure_lep_pt_correction"); - auto wjets_DR_SR = - correction::CorrectionSet::from_file(ff_corr_file)->at("Wjets_DR_SR_correction"); + correction::CorrectionSet::from_file(ff_corr_file) + ->at("Wjets_non_closure_lep_pt_correction"); + auto wjets_DR_SR = correction::CorrectionSet::from_file(ff_corr_file) + ->at("Wjets_DR_SR_correction"); auto ttbar_lep_pt_closure = - correction::CorrectionSet::from_file(ff_corr_file)->at("ttbar_non_closure_lep_pt_correction"); + correction::CorrectionSet::from_file(ff_corr_file) + ->at("ttbar_non_closure_lep_pt_correction"); float ff = -1.; if (pt_2 >= 0.) { @@ -139,39 +156,55 @@ ROOT::RDF::RNode fakefactor_nmssm_lt(ROOT::RDF::RNode df, const std::string &out Logger::get("FakeFactor")->debug("Lep mt - value {}", mt_1); Logger::get("FakeFactor")->debug("N b-jets - value {}", nbtag); - float qcd_frac = fractions->evaluate({"QCD", mt_1, (float)nbtag, variation}); + float qcd_frac = + fractions->evaluate({"QCD", mt_1, (float)nbtag, variation}); Logger::get("FakeFactor")->debug("QCD - fraction {}", qcd_frac); - float wjets_frac = fractions->evaluate({"Wjets", mt_1, (float)nbtag, variation}); + float wjets_frac = + fractions->evaluate({"Wjets", mt_1, (float)nbtag, variation}); Logger::get("FakeFactor")->debug("Wjets - fraction {}", wjets_frac); - float ttbar_frac = fractions->evaluate({"ttbar", mt_1, (float)nbtag, variation}); + float ttbar_frac = + fractions->evaluate({"ttbar", mt_1, (float)nbtag, variation}); Logger::get("FakeFactor")->debug("ttbar - fraction {}", ttbar_frac); Logger::get("FakeFactor")->debug("Lep pt - value {}", pt_1); Logger::get("FakeFactor")->debug("Lep iso - value {}", iso_1); Logger::get("FakeFactor")->debug("m_vis - value {}", m_vis); - float qcd_lep_pt_corr = qcd_lep_pt_closure->evaluate({pt_1, variation}); - Logger::get("FakeFactor")->debug("QCD - lep pt correction {}", qcd_lep_pt_corr); - float qcd_lep_iso_corr = qcd_lep_iso_closure->evaluate({iso_1, variation}); - Logger::get("FakeFactor")->debug("QCD - lep iso correction {}", qcd_lep_iso_corr); + float qcd_lep_pt_corr = + qcd_lep_pt_closure->evaluate({pt_1, variation}); + Logger::get("FakeFactor") + ->debug("QCD - lep pt correction {}", qcd_lep_pt_corr); + float qcd_lep_iso_corr = + qcd_lep_iso_closure->evaluate({iso_1, variation}); + Logger::get("FakeFactor") + ->debug("QCD - lep iso correction {}", qcd_lep_iso_corr); float qcd_DR_SR_corr = qcd_DR_SR->evaluate({m_vis, variation}); - Logger::get("FakeFactor")->debug("QCD - DR to SR correction {}", qcd_DR_SR_corr); - float wjets_lep_pt_corr = wjets_lep_pt_closure->evaluate({pt_1, variation}); - Logger::get("FakeFactor")->debug("Wjets - lep pt correction {}", wjets_lep_pt_corr); + Logger::get("FakeFactor") + ->debug("QCD - DR to SR correction {}", qcd_DR_SR_corr); + float wjets_lep_pt_corr = + wjets_lep_pt_closure->evaluate({pt_1, variation}); + Logger::get("FakeFactor") + ->debug("Wjets - lep pt correction {}", wjets_lep_pt_corr); float wjets_DR_SR_corr = wjets_DR_SR->evaluate({m_vis, variation}); - Logger::get("FakeFactor")->debug("Wjets - DR to SR correction {}", wjets_DR_SR_corr); - float ttbar_lep_pt_corr = ttbar_lep_pt_closure->evaluate({pt_1, variation}); - Logger::get("FakeFactor")->debug("ttbar - lep pt correction {}", ttbar_lep_pt_corr); - - ff = qcd_frac*qcd_ff*qcd_lep_pt_corr*qcd_lep_iso_corr*qcd_DR_SR_corr + wjets_frac*wjets_ff*wjets_lep_pt_corr*wjets_DR_SR_corr + ttbar_frac*ttbar_ff*ttbar_lep_pt_corr; + Logger::get("FakeFactor") + ->debug("Wjets - DR to SR correction {}", wjets_DR_SR_corr); + float ttbar_lep_pt_corr = + ttbar_lep_pt_closure->evaluate({pt_1, variation}); + Logger::get("FakeFactor") + ->debug("ttbar - lep pt correction {}", ttbar_lep_pt_corr); + + ff = qcd_frac * qcd_ff * qcd_lep_pt_corr * qcd_lep_iso_corr * + qcd_DR_SR_corr + + wjets_frac * wjets_ff * wjets_lep_pt_corr * wjets_DR_SR_corr + + ttbar_frac * ttbar_ff * ttbar_lep_pt_corr; } Logger::get("FakeFactor")->debug("Event Fake Factor {}", ff); return ff; }; - auto df1 = df.Define( - outputname, calc_fake_factor, - {tau_pt, njets, lep_mt, nbtags, lep_pt, lep_iso, m_vis}); + auto df1 = + df.Define(outputname, calc_fake_factor, + {tau_pt, njets, lep_mt, nbtags, lep_pt, lep_iso, m_vis}); return df1; } From 14034e01a35f1982934222812645f70ea7956544 Mon Sep 17 00:00:00 2001 From: nshadskiy Date: Thu, 30 Mar 2023 11:10:41 +0200 Subject: [PATCH 4/4] incorporate comment --- .../{ => nmssm}/2018/FF_corrections_mt.json.gz | Bin .../{ => nmssm}/2018/fake_factors_mt.json.gz | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename data/fake_factors/{ => nmssm}/2018/FF_corrections_mt.json.gz (100%) rename data/fake_factors/{ => nmssm}/2018/fake_factors_mt.json.gz (100%) diff --git a/data/fake_factors/2018/FF_corrections_mt.json.gz b/data/fake_factors/nmssm/2018/FF_corrections_mt.json.gz similarity index 100% rename from data/fake_factors/2018/FF_corrections_mt.json.gz rename to data/fake_factors/nmssm/2018/FF_corrections_mt.json.gz diff --git a/data/fake_factors/2018/fake_factors_mt.json.gz b/data/fake_factors/nmssm/2018/fake_factors_mt.json.gz similarity index 100% rename from data/fake_factors/2018/fake_factors_mt.json.gz rename to data/fake_factors/nmssm/2018/fake_factors_mt.json.gz