23 using namespace TopEventSelectionTools;
29 JetFtagEffPlots::JetFtagEffPlots(
const std::string&
name,
32 m_nominalHashValue(0),
33 m_CDIfile(
"xAODBTaggingEfficiency/13TeV/2020-21-13TeV-MC16-CDI-2020-03-11_v3.root"),
34 m_fill_total_hists(false),
35 m_histogram_suffix(
""),
36 m_dont_use_event_weight(false),
37 m_use_track_jets(false),
48 m_ptBins(
"15:20:30:45:60:80:110:160:210:260:310:400:500:600:800:1000:1200:1500:1800:2500"),
49 m_etaBins(
"0.:0.3:0.8:1.2:2.1:2.8:3.6:4.5"),
57 m_WP(
"FixedCutBEff_70"),
60 m_selection_tool(
"BTaggingSelectionTool/selTool"),
61 m_PMGTruthWeights(nullptr),
62 m_sfRetriever(nullptr) {
67 const std::string truthWeightToolName =
"PMGTruthWeightTool";
68 if (asg::ToolStore::contains<PMGTools::PMGTruthWeightTool>(truthWeightToolName))
m_PMGTruthWeights =
69 asg::ToolStore::get<PMGTools::PMGTruthWeightTool>(truthWeightToolName);
78 if (
s.substr(0, 3) ==
"WP:")
m_WP =
s.substr(3,
s.size() - 3);
79 else if (
s.substr(0, 7) ==
"tagger:")
m_tagger =
s.substr(7,
s.size() - 7);
80 else if (
s.substr(0, 8) ==
"CDIfile:")
m_CDIfile =
s.substr(8,
s.size() - 8);
81 else if (
s.substr(0, 3) ==
"pt:" ||
s.substr(0, 3) ==
"pT:")
m_ptBins =
s.substr(3,
s.size() - 3);
82 else if (
s.substr(0, 7) ==
"abseta:")
m_etaBins =
s.substr(7,
s.size() - 7);
83 else if (
s.substr(0, 7) ==
"max_pT:")
m_max_pT = std::stof(
s.substr(7,
s.size() - 7));
84 else if (
s.substr(0, 7) ==
"min_pT:")
m_min_pT = std::stof(
s.substr(7,
s.size() - 7));
85 else if (
s.substr(0, 5) ==
"N_pT:")
m_N_pT_bins = std::stoi(
s.substr(5,
s.size() - 5));
86 else if (
s.substr(0, 8) ==
"max_eta:")
m_max_Eta = std::stof(
s.substr(8,
s.size() - 8));
87 else if (
s.substr(0, 8) ==
"min_eta:")
m_min_Eta = std::stof(
s.substr(8,
s.size() - 8));
88 else if (
s.substr(0, 6) ==
"N_eta:")
m_N_Eta_bins = std::stoi(
s.substr(6,
s.size() - 6));
103 throw std::runtime_error {
104 "ERROR: Can't understand argument " +
s +
" for JETFTAGEFFPLOTS."
116 m_sfRetriever = asg::ToolStore::get<ScaleFactorRetriever>(
"top::ScaleFactorRetriever");
121 ATH_MSG_INFO(
"No variation has been set. Assuming nominal.");
139 std::vector<double> ptBins;
147 for (std::string flavour:{
"B",
"C",
"L",
"T"}) {
151 if (
m_hists)
m_hists->addHist(total_hist_name,
";pT [GeV];|#eta^{jet}|;Events",
152 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
154 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
156 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
158 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
160 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
162 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
164 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
166 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
168 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
170 if (
m_hists)
m_hists->addHist(total_hist_name,
";pT [GeV];|#eta^{jet}|;Events",
193 if (
m_hists)
m_hists->addHist(pass_hist_name,
";pT [GeV];|#eta^{jet}|;Events",
194 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
196 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
198 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
200 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
202 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
204 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
206 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
208 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
210 ptBins.size() - 1, ptBins.data(),
etaBins.size() - 1,
etaBins.data());
212 if (
m_hists)
m_hists->addHist(pass_hist_name,
";pT [GeV];|#eta^{jet}|;Events",
252 if (
event.m_isLoose && !
m_config->doLooseEvents())
return true;
254 if (!
event.m_isLoose && !
m_config->doTightEvents())
return true;
256 float eventWeightNominal = 1.0;
257 float eventWeightMuRup = 1.0;
258 float eventWeightMuRdown = 1.0;
259 float eventWeightMuFup = 1.0;
260 float eventWeightMuFdown = 1.0;
261 float eventWeightVar3cUp = 1.0;
262 float eventWeightVar3cDown = 1.0;
263 float eventWeightFSRUp = 1.0;
264 float eventWeightFSRDown = 1.0;
274 float jvt_sf =
event.m_jvtSF;
275 float pu_weight = 1.0;
282 eventWeightNominal =
event.m_info->auxdataConst<
float>(
"AnalysisTop_eventWeight") * jvt_sf * pu_weight * lepton_sf;
284 if (
m_doMuRup) eventWeightMuRup = muRup * jvt_sf * pu_weight * lepton_sf;
285 if (
m_doMuRdown) eventWeightMuRdown = muRdown * jvt_sf * pu_weight * lepton_sf;
286 if (
m_doMuFup) eventWeightMuFup = muFup * jvt_sf * pu_weight * lepton_sf;
287 if (
m_doMuFdown) eventWeightMuFdown = muFdown * jvt_sf * pu_weight * lepton_sf;
288 if (
m_doVar3cup) eventWeightVar3cUp = Var3cUp * jvt_sf * pu_weight * lepton_sf;
289 if (
m_doVar3cdown) eventWeightVar3cDown = Var3cDown * jvt_sf * pu_weight * lepton_sf;
290 if (
m_doFSRup) eventWeightFSRUp = FSRUp * jvt_sf * pu_weight * lepton_sf;
291 if (
m_doFSRdown) eventWeightFSRDown = FSRDown * jvt_sf * pu_weight * lepton_sf;
294 eventWeightNominal = 1.0;
314 jets = &
event.m_jets;
316 jets = &
event.m_trackJets;
319 for (
unsigned long jet_i = 0; jet_i <
jets->size(); jet_i++) {
322 int jet_flavor = -99;
327 std::string flav_name;
329 if (jet_flavor == 5) flav_name =
"B";
331 else if (jet_flavor == 4) flav_name =
"C";
333 else if (jet_flavor == 0) flav_name =
"L";
335 else if (jet_flavor == 15) flav_name =
"T";
345 static_cast<TH2D*
>(h_ptr->hist(hist_name))->Fill(jetPtr->
pt() *
toGeV, fabs(jetPtr->
eta()), w_event);
352 std::stringstream
ss(
str);
354 char separator =
':';
355 while (std::getline(
ss, tok, separator)) {
356 binEdges.push_back(
std::atof(tok.c_str()));
363 if (
type == WEIGHTTYPE::MURUP) {
366 }
else if (
type == WEIGHTTYPE::MURDOWN) {
369 }
else if (
type == WEIGHTTYPE::MUFUP) {
372 }
else if (
type == WEIGHTTYPE::MUFDOWN) {
375 }
else if (
type == WEIGHTTYPE::VAR3CUP) {
377 }
else if (
type == WEIGHTTYPE::VAR3CDOWN) {
379 }
else if (
type == WEIGHTTYPE::FSRUP) {
382 }
else if (
type == WEIGHTTYPE::FSRDOWN) {
391 return "JETFTAGEFFPLOTS";