UPDATES:
- 21/09, htt_scalefactors_v5.root
- Updated electron and muon trigger functions from DESY to use the fine-binned variants that are now aligned with the offline pT cuts used in the MSSM analysis.
- 16/09, htt_scalefactors_v5.root
- Fixed bug in
m_trgOR_data
andm_trgOR_binned_data
- these were inadvertently giving the efficiencies of the IsoMu22 trigger, not the OR with the IsoTkMu22 trigger. - The muon ID efficiencies are now measured using the generalTracks collection as probes, to be in-line with what is done by the MuonPOG. However the efficiencies for pT < 20 GeV are still made with the tracker muons as probes, as the purity in the fail region is not high enough to use the tracks. These low pT scale factors may therefore be updated in the future.
- Added muon trigger efficiencies for the
HLT_IsoMu19_eta2p1_LooseIsoPFTau20
andHLT_IsoMu19_eta2p1_LooseIsoPFTau20_SingleL1
cross triggers. For the former, another object in the event is required to have fired the tau part of the L1 seed as part of the denominator selection. - Added trigger efficiencies for the e-mu cross triggers measured by the DESY group.
- Added updated LO DYJetsToLL Z pT vs mass weights
- Fixed bug in
Clone this repository and initialise the other repositories which are handled as git submodules:
git clone https://github.com/CMS-HTT/CorrectionsWorkspace.git
cd CorrectionsWorkspace
git submodule update --init
The workspace is produced by running the following script:
python makeCorrectionsWorkspace.py
The contents of the output can be inspected with:
root -l htt_scalefactors_v5.root
w->Print()
# See more detail on the evaluation of a particular object:
w->function("m_id_ratio")->Print("tree")
Each name here corresponds to a RooFit function object in the workspace. See below for usage.
-
m_id_data
andm_id_mc
: double Voigtian signal pdf, RooCMSShape background pdf- Probe denominator: Tracks unpacked from the PFCandidates,
pt > 20
andabs(eta) < 2.4
. Forpt < 20
uses tracker muons. - Probe numerator: Passes medium Muon HIP-safe ID and
d_xy < 0.045
andd_z < 0.2
- pt x abs(eta) bins: [10., 15., 20., 25., 30., 40., 50., 60., 80., 100., 200., 1000.] x [0, 0.9, 1.2, 2.1, 2.4]
- Data/MC ratio available as
m_id_ratio
- Workspace variables to set:
m_pt
andm_eta
- Probe denominator: Tracks unpacked from the PFCandidates,
-
m_iso_data
andm_iso_mc
: double Voigtian signal pdf, Exponential background pdf- Probe denominator: numerator of the ID measurement above
- Probe numerator: Passes
I_rel < 0.15
, whereI_rel
is the delta-beta corrected PF isolation with cone size 0.4 - pt x abs(eta) bins: [20., 25., 30., 40., 50., 60., 80., 100., 200., 1000.] x [0, 0.9, 1.2, 2.1, 2.4]
- Data/MC ratio available as
m_iso_ratio
- Workspace variables to set:
m_pt
andm_eta
-
For convenience, product of ID and iso factors available as
m_idiso_[data,mc,ratio]
-
m_trg_data
andm_trgOR_data
: double Voigtian signal pdf, Exponential background pdf- Probe denominator: numerator of the Iso measurement above
- Probe numerator: For
m_trg_data
: fires theHLT_IsoMu22
path and matches the final HLT filter object withinDR < 0.5
. Form_trgOR_data
use the OR of theHLT_IsoMu22
andHLT_IsoTkMu22
paths - pt x abs(eta) bins: [20., 21., 22., 23., 24., 25., 30., 40., 50., 60., 80., 100., 200., 1000.] x [0, 0.9, 1.2, 2.1, 2.4]
- Workspace variables to set:
m_pt
andm_eta
-
m_trgMT_data
andm_trgMTL1_data
: double Voigtian signal pdf, Exponential background pdf- Probe denominator: numerator of the Iso measurement above. For
m_trgMT_data
also require some other well separate object in the event fired the L1 tau part. - Probe numerator: For both triggers require that the muon part fired by matching to the final muon filter HLT object within
DR < 0.5
. - pt x abs(eta) bins: [17., 18., 19., 20., 21., 22., 25., 30., 40., 50., 60., 80., 100., 200., 1000.] x [0, 0.9, 1.2, 2.1]
- Workspace variables to set:
m_pt
andm_eta
- Probe denominator: numerator of the Iso measurement above. For
Additional isolation and trigger efficiencies have been measured with isolation definitions in the numerator and denominator probe selections respectively: I_rel = [0.15, 0.25]
and I_rel = [0.25, 0.50]
. These are available via the following functions:
-
m_iso_binned_data
andm_iso_binned_mc
: double Voigtian signal pdf, Exponential background pdf- pt x abs(eta) bins: [20., 25., 30., 40., 50., 60., 80., 100., 200., 1000.] x [0, 0.9, 1.2, 2.1, 2.4]
- Data/MC ratio available as
m_iso_binned_ratio
- Workspace variables to set:
m_pt
,m_eta
andm_iso
-
m_trg_binned_data
andm_trgOR_binned_data
: double Voigtian signal pdf, Exponential background pdf- pt x abs(eta) bins: [20., 21., 22., 23., 24., 25., 30., 40., 50., 60., 80., 100., 200., 1000.] x [0, 0.9, 1.2, 2.1, 2.4] for the nominal isolation, and [20., 21., 22., 23., 24., 25., 30., 40., 50., 60., 80., 100., 1000.] x [0, 2.4] for the additional isolation bins due to the lower number of events.
- Workspace variables to set:
m_pt
,m_eta
andm_iso
Note that all electron measurements have been made using the electron supercluster eta - you should use this as the e_eta
input
-
e_id_data
ande_id_mc
: double Voigtian signal pdf, RooCMSShape background pdf- Probe denominator: all electrons
slimmedElectrons
collection,pt > 10
andabs(eta) < 2.5
- Probe numerator: Passes MVA non-triggering ID and
d_xy < 0.045
andd_z < 0.2
- pt x abs(eta) bins: [10., 20., 25., 30., 40., 50., 100., 200., 1000.] x [0, 1.0, 1.4442, 1.56, 2.1, 2.5]
- Data/MC ratio available as
e_id_ratio
- Workspace variables to set:
e_pt
ande_eta
- Probe denominator: all electrons
-
e_iso_data
ande_iso_mc
: double Voigtian signal pdf, Exponential background pdf- Probe denominator: numerator of the ID measurement above
- Probe numerator: Passes
I_rel < 0.10
, whereI_rel
is the delta-beta corrected PF isolation with cone size 0.3 - pt x abs(eta) bins: [10., 20., 25., 30., 40., 50., 100., 200., 1000.] x [0, 1.0, 1.4442, 1.56, 2.1, 2.5]
- Data/MC ratio available as
e_iso_ratio
- Workspace variables to set:
e_pt
ande_eta
-
For convenience, product of ID and iso factors available as
e_idiso_[data,mc,ratio]
-
e_trg_data
: double Voigtian signal pdf, Exponential background pdf- Probe denominator: numerator of the Iso measurement above
- Probe numerator: Fires the
HLT_Ele25_eta2p1_WPTight_Gsf
path and matches the final HLT filter object withinDR < 0.5
. - pt x abs(eta) bins: [10., 20., 22., 24., 26., 28., 30., 40., 50., 100., 200., 1000.] x [0, 1.0, 1.4442, 1.56, 2.1, 2.5]
- Workspace variables to set:
e_pt
ande_eta
Additional isolation and trigger efficiencies have been measured with isolation definitions in the numerator and denominator probe selections respectively: I_rel = [0.10, 0.20]
and I_rel = [0.20, 0.50]
. These are available via the following functions:
-
e_iso_binned_data
ande_iso_binned_mc
: double Voigtian signal pdf, Exponential background pdf- pt x abs(eta) bins: [10., 20., 25., 30., 40., 50., 100., 200., 1000.] x [0, 1.0, 1.4442, 1.56, 2.1, 2.5]
- Data/MC ratio available as
e_iso_binned_ratio
- Workspace variables to set:
e_pt
,e_eta
ande_iso
-
e_trg_binned_data
: double Voigtian signal pdf, Exponential background pdf- pt x abs(eta) bins: [10., 20., 22., 24., 26., 28., 30., 40., 50., 100., 200., 1000.] x [0, 1.0, 1.4442, 1.56, 2.1, 2.5] for the nominal isolation, and [10., 20., 22., 24., 26., 28., 30., 40., 50., 100. 1000.] x [0, 2.5] for the additional isolation bins due to the lower number of events.
- Workspace variables to set:
e_pt
,e_eta
ande_iso
Scale factors are defined as a function of t_pt
, t_eta
, and t_dm
(the integer decay mode of the tau). Currently measurements are made inclusively in pT and eta for each decay mode. However, a minimum pT cut is applied to mirror the offline selection used in the HTT analyses. The following functions are available:
t_iso_mva_m_pt30_sf
: medium MVA isolation working point, tau pT > 30 GeV and abs(eta) < 2.3. Intended for use in the e-tau and mu-tau channels of the MSSM analysis. Workspace variables to set:t_pt
,t_eta
, andt_dm
.t_iso_mva_t_pt40_eta2p1_sf
: tight MVA isolation working point, tau pT > 40 GeV and abs(eta) < 2.1. Intended for use in the tau-tau channel of the MSSM analysis. Workspace variables to set:t_pt
,t_eta
, andt_dm
.
The data and MC efficiencies calculated in the fits are currently stored in TH2D histograms. To minimize the amount of extra work needed to extract these numbers, the TH2Ds have been wrapped in RooFit objects and stored inside a workspace, named scalefactors_2016_vX.root
. Example usage in C++ and python below:
C++:
#include "RooWorkspace.h"
#include "RooRealVar.h"
TFile f("scalefactors_2016_v5.root");
RooWorkspace *w = (RooWorkspace*)f.Get("w");
f.Close();
// In the event loop:
w->var("m_pt")->setVal(muon.pt());
w->var("m_eta")->setVal(muon.eta());
double muon_id_scalefactor = w->function("m_id_ratio")->getVal();
double muon_iso_scalefactor = w->function("m_iso_ratio")->getVal();
double muon_trg_efficiency = w->function("m_trg_data")->getVal();
// Alternatively (and slightly faster):
// Create a RooFit function object taking the m_pt, m_eta and m_iso values as arguments
#include "RooFunctor.h"
RooFunctor* m_trg_data_func = w->function("m_trg_binned_data")->functor(w->argSet("m_pt,m_eta,m_iso"))
// In the event loop need to pass an array of the argument:
auto args = std::vector<double>{muon.pt(), muon.eta(), muon.pf04Iso()};
double muon_trg_eff = m_trg_data_func->eval(args.data());
Python:
import ROOT
from array import array
f = ROOT.TFile("scalefactors_2016_v5.root")
w = f.Get("w")
f.Close()
# In the event loop:
w.var("m_pt").setVal(muon.pt())
w.var("m_eta").setVal(muon.eta())
muon_id_scalefactor = w.function("m_id_ratio").getVal()
muon_iso_scalefactor = w.function("m_iso_ratio").getVal()
muon_trg_efficiency = w.function("m_trg_data").getVal()
# Alternatively (and slightly faster):
# Create a RooFit function object taking the m_pt, m_eta and m_iso values as arguments
m_trg_data_func = w.function("m_trg_binned_data").functor(ROOT.RooArgList(w.argSet("m_pt,m_eta,m_iso")))
# In the event loop need to pass an array of the argument:
muon_trg_eff = m_trg_data_func.eval(array('d', [muon.pt(), muon.eta(), muon.pf04Iso()]))
Note that despite the efficiencies currently being measured in bins of absolute eta the signed eta value should still be used here as the argument to setVal
. The conversion to the absolute value will be performed internally within the workspace. In this way it will be easy to switch to scale factors binned in signed eta in the future. There is also no need to check for pT or eta values outside the bounds of the measurement - the supplied values of m_pt
and m_eta
will be adjusted to the bounds of the TH2Ds automatically.
Corrections from other sources are also added to the workspace:
The LeptonEfficiencies repository is a git submodule located in inputs/LeptonEfficiencies
. The makeCorrectionsWorkspace.py
script will first convert the TGraphAsymmErrors objects containing the efficiencies into TH2Ds binned in pT and eta before wrapping these in RooFit functions. The table below lists the available function names:
Function name | Input variables | Created from input |
---|---|---|
m_idiso0p15_desy_[mc,data,ratio] | m_pt,m_eta | Muon/Run2016BCD/Muon_IdIso0p15_eff.root |
m_idiso0p20_desy_[mc,data,ratio] | m_pt,m_eta | Muon/Run2016BCD/Muon_IdIso0p20_eff.root |
m_idiso0p20_desy_data | m_pt,m_eta | Muon/Run2016BCD/Muon_IdIso0p20_eff.root |
m_trgIsoMu22_desy_data | m_pt,m_eta | Muon/Run2016BCD/Muon_IsoMu22_eff_fineBinning.root |
m_trgIsoMu22orTkIsoMu22_desy_data | m_pt,m_eta | Muon/Run2016BCD/Muon_IsoMu22_OR_TkIsoMu22_eff_fineBinning.root |
m_trgMu8leg_desy_data | m_pt,m_eta | Muon/Run2016BCD/Muon_Mu8leg_eff.root |
m_trgMu23leg_desy_data | m_pt,m_eta | Muon/Run2016BCD/Muon_Mu23leg_eff.root |
e_idiso0p10_desy_[mc,data,ratio] | e_pt,e_eta | Electron/Run2016BCD/Electron_IdIso0p10_eff.root |
e_idiso0p15_desy_[mc,data,ratio] | e_pt,e_eta | Electron/Run2016BCD/Electron_IdIso0p15_eff.root |
e_trgEle25eta2p1WPTight_desy_data | e_pt,e_eta | Electron/Run2016BCD/Electron_Ele25eta2p1WPTight_eff_fineBinning.root |
e_trgEle12leg_desy_data | e_pt,e_eta | Electron/Run2016BCD/Electron_Ele12leg_eff.root |
e_trgEle23leg_desy_data | e_pt,e_eta | Electron/Run2016BCD/Electron_Ele23leg_eff.root |
The eta-dependent scale factor histogram from here has been added as the function m_trk_ratio
. Similarly the pt and eta-dependent scale factors from here has been added as the function e_trk_ratio
.
The triggerSF repository is a git submodule located in inputs/triggerSF
. The efficiencies are given as functions of tau pT using a convolution of a CrystalBall resolution and a step function. Since such a function does not exist natively in ROOT, the function provided here has been converted into a RooFit function class and saved in this repository (CrystalBallEfficiency.h
and CrystalBallEfficiency.cxx
). The makeCorrectionsWorkspace.py
script will build a CrystalBallEfficiency object for each parameter set in the real_taus_cumulative.json
and same_sign_cumulative.json
input files. The function objects are named like t_trg[WP_LABEL]_data
and t_trg[WP_LABEL]SS_data
respectively.
IMPORTANT: If desired you can add the code for the CrystalBallEfficiency class to your framework and compile a ROOT dictionary from it. However this is not required for reading from the workspace as RooFit has a mechanism to embed the class code in the workspace itself and generate the dictionary on the fly. When the workspace is first opened a message like
[#1] INFO:ObjectHandling -- RooWorkspace::CodeRepo::compileClasses() creating code export directory .wscode.963a5b90-58a3-31e6-9717-bfb44a46514d.w to extract coded embedded in workspace
[#1] INFO:ObjectHandling -- RooWorkspace::CodeRepo::compileClasses() Extracting declaration code of class CrystalBallEfficiency, file .wscode.963a5b90-58a3-31e6-9717-bfb44a46514d.w/CrystalBallEfficiency.h
[#1] INFO:ObjectHandling -- RooWorkspace::CodeRepo::compileClasses() Extracting implementation code of class CrystalBallEfficiency, file .wscode.963a5b90-58a3-31e6-9717-bfb44a46514d.w/CrystalBallEfficiency.cxx
[#1] INFO:ObjectHandling -- RooWorkspace::CodeRepo::compileClasses() Compiling code unit CrystalBallEfficiency to define class CrystalBallEfficiency
will be produced. This step does incur a few seconds delay, though this should only happen the first time a workspace is opened. If a dictionary for the class is already known to ROOT then this step will be skipped automatically.
NB: It appears in some older versions of CMSSW (e.g. 7_1_5
), the RooFit headers are not included in the default ROOT search path. If you have problems with the CrystalBallEfficiency class not compiling automatically then do this before accessing the workspace:
gSystem->AddIncludePath("-I$ROOFITSYS/include")
Available via the function zpt_weight
which takes the generator Z boson mass z_gen_mass
and pT z_gen_pt
as input.