13 #include <TObjString.h>
39 TObjString* versionInfo{
nullptr};
50 std::vector<std::pair<double, double>> rangeEtaNoInt;
51 std::pair<double, double> apair(1.26, 1.665);
52 rangeEtaNoInt.push_back(apair);
54 std::vector<std::pair<double, double>> rangePtNoInt;
57 rangePtNoInt.push_back(apair);
58 std::map<std::string, Interp3D::VetoInterp> amap;
60 veto.xRange = rangePtNoInt;
61 veto.yRange = std::vector<std::pair<double, double>>();
62 amap.insert(std::make_pair(std::string(
"el_cutValues_ptvarcone20"),
veto));
63 veto.yRange = rangeEtaNoInt;
64 amap.insert(std::make_pair(std::string(
"el_cutValues_topoetcone20"),
veto));
65 m_Interp = std::make_unique<Interp3D>(amap);
78 #ifndef XAOD_STANDALONE
81 return StatusCode::SUCCESS;
86 if (container.empty())
return;
87 for (
const std::unique_ptr<IsolationCondition>& cond :
wp.conditions()) {
88 for (
unsigned int acc = 0;
acc < cond->num_types(); ++
acc) {
105 return StatusCode::FAILURE;
108 return StatusCode::SUCCESS;
115 return StatusCode::FAILURE;
118 std::string
varname(xAOD::Iso::toCString(isoCutRemap));
121 TH3F* calibHisto{
nullptr};
125 return StatusCode::FAILURE;
127 calibHisto->SetDirectory(
nullptr);
128 std::unique_ptr<TH3F>
histogram(calibHisto);
129 std::unique_ptr<IsolationConditionHist> ich =
133 wp->addCut(std::move(ich));
135 return StatusCode::SUCCESS;
144 std::unique_ptr<IsolationWP>
wp = std::make_unique<IsolationWP>(muWPname);
145 if (muWPname ==
"HighPtTrackOnly") {
146 wp->addCut(std::make_unique<IsolationConditionFormula>(
148 }
else if (muWPname ==
"TightTrackOnly_FixedRad") {
149 wp->addCut(std::make_unique<IsolationConditionFormula>(
151 wp->addCut(std::make_unique<IsolationConditionFormula>(
153 }
else if (muWPname ==
"Tight_FixedRad") {
154 wp->addCut(std::make_unique<IsolationConditionFormula>(
156 wp->addCut(std::make_unique<IsolationConditionFormula>(
159 }
else if (muWPname ==
"Loose_FixedRad") {
160 wp->addCut(std::make_unique<IsolationConditionFormula>(
162 wp->addCut(std::make_unique<IsolationConditionFormula>(
165 }
else if (muWPname ==
"TightTrackOnly_VarRad") {
166 wp->addCut(std::make_unique<IsolationConditionFormula>(
"MuonFixedCutHighMuTrackOnly",
168 }
else if (muWPname ==
"Tight_VarRad") {
169 wp->addCut(std::make_unique<IsolationConditionFormula>(
"MuonFixedCutHighMuTight_track",
172 }
else if (muWPname ==
"Loose_VarRad") {
173 wp->addCut(std::make_unique<IsolationConditionFormula>(
"MuonFixedCutHighMuLoose_track",
176 }
else if (muWPname ==
"PflowTight_FixedRad") {
181 wp->addCut(std::make_unique<IsolationConditionCombined>(
"MuonPFlowTightLowPt", isoTypesLowPt,
182 std::make_unique<TF2>(
"pflowTFunctionLowPt",
"fabs(x)+0.4*(y>0?y:0)"),
184 wp->addCut(std::make_unique<IsolationConditionCombined>(
"MuonPFlowTightHighPt", isoTypesHighPt,
185 std::make_unique<TF2>(
"pflowTFunctionHighPt",
"fabs(x)+0.4*(y>0?y:0)"),
187 }
else if (muWPname ==
"PflowTight_VarRad") {
190 wp->addCut(std::make_unique<IsolationConditionCombined>(
191 "MuonPFlowTight", isoTypes, std::make_unique<TF2>(
"pflowTFunction",
"fabs(x)+0.4*(y>0?y:0)"),
"0.045*x",
m_isoDecSuffix));
192 }
else if (muWPname ==
"PflowLoose_FixedRad") {
197 wp->addCut(std::make_unique<IsolationConditionCombined>(
"MuonPFlowLooseLowPt", isoTypesLowPt,
198 std::make_unique<TF2>(
"pflowLFunctionLowPt",
"fabs(x)+0.4*(y>0?y:0)"),
200 wp->addCut(std::make_unique<IsolationConditionCombined>(
"MuonPFlowLooseHighPt", isoTypesHighPt,
201 std::make_unique<TF2>(
"pflowLFunctionHighPt",
"fabs(x)+0.4*(y>0?y:0)"),
203 }
else if (muWPname ==
"PflowLoose_VarRad") {
206 wp->addCut(std::make_unique<IsolationConditionCombined>(
207 "MuonPFlowLoose", isoTypes, std::make_unique<TF2>(
"pflowTFunction",
"fabs(x)+0.4*(y>0?y:0)"),
"0.16*x",
m_isoDecSuffix));
208 }
else if (muWPname ==
"R3PLITasPLIVefficiencyTight") {
209 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
210 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
211 const std::vector<std::vector<double>>
parameters = {{3.75},
212 {2.4599999999999946, 0.0002400000000000006},
213 {2.6437499999999883, 0.00023250000000000085},
214 {5.576250000000033, 2.249999999999814e-05},
215 {7.061249999999798, -5.2499999999991085e-05},
216 {6.933482142856749, -4.553571428570058e-05},
217 {7.271590909090752, -5.5909090909086746e-05},
218 {5.105882352941061, -1.1764705882350721e-05},
219 {4.4250000000000025, -2.97364147850582e-20},
220 {4.425000000000001}};
222 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R3PLITasPLIVefficiencyTight", isoTypes,
223 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
226 }
else if (muWPname ==
"R3PLITasPLIVefficiencyVeryTight") {
227 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
228 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
229 const std::vector<std::vector<double>>
parameters = {{4.050000000000001},
230 {2.5912499999999903, 0.0002625000000000011},
231 {2.8012499999999214, 0.00024750000000000623},
232 {5.677499999999787, 4.500000000001207e-05},
233 {6.2137499999998145, 2.2500000000008228e-05},
234 {7.09151785714283, -1.8749999999999094e-05},
235 {8.57727272727282, -6.545454545454794e-05},
236 {5.969852941176529, -1.0294117647059968e-05},
237 {5.528483606557319, -2.581967213113981e-06},
238 {5.324999999999999}};
240 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R3PLITasPLIVefficiencyVeryTight", isoTypes,
241 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
244 }
else if (muWPname ==
"R3PLITasPLIVrejectionTight") {
245 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
246 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
247 const std::vector<std::vector<double>>
parameters = {{3.6750000000000007},
248 {2.4374999999999987, 0.00022500000000000008},
249 {2.572499999999916, 0.00022500000000000666},
250 {5.351249999999845, 2.2500000000008773e-05},
251 {7.113749999999581, -6.749999999998147e-05},
252 {7.213392857142764, -6.964285714285394e-05},
253 {7.4778409090906415, -7.977272727272016e-05},
254 {4.105790441176434, -1.3419117647058116e-05},
255 {3.590163934426209, -4.180327868852198e-06},
256 {3.1499999999999986}};
258 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R3PLITasPLIVrejectionTight", isoTypes,
259 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
262 }
else if (muWPname ==
"R3PLITasPLIVrejectionVeryTight") {
263 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
264 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
265 const std::vector<std::vector<double>>
parameters = {{3.974999999999998},
266 {2.5875000000000035, 0.0002549999999999993},
267 {2.8687499999999373, 0.00023250000000000495},
268 {5.527499999999797, 4.500000000001146e-05},
269 {6.048749999999677, 2.2500000000014293e-05},
270 {7.019196428571157, -2.4107142857133378e-05},
271 {8.878977272727232, -8.38636363636353e-05},
272 {5.708823529411479, -1.76470588235239e-05},
273 {5.215573770491751, -7.131147540982918e-06},
274 {4.649999999999999}};
276 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R3PLITasPLIVrejectionVeryTight", isoTypes,
277 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
280 }
else if (muWPname ==
"R2PLITasPLIVefficiencyTight") {
281 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
282 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
283 const std::vector<std::vector<double>>
parameters = {{3.974999999999998},
284 {2.789999999999986, 0.00021000000000000172},
285 {2.39249999999993, 0.00025500000000000555},
286 {5.737499999999933, 1.5000000000003797e-05},
287 {7.413749999999598, -6.749999999998225e-05},
288 {7.098214285714245, -5.3571428571427186e-05},
289 {6.934090909090853, -4.909090909090761e-05},
290 {5.253676470587868, -1.6176470588228218e-05},
291 {4.275000000000021, -3.17095862137587e-19},
292 {4.349999999999998}};
294 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R2PLITasPLIVefficiencyTight", isoTypes,
295 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
298 }
else if (muWPname ==
"R2PLITasPLIVefficiencyVeryTight") {
299 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
300 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
301 const std::vector<std::vector<double>>
parameters = {{4.199999999999999},
302 {2.9625000000000026, 0.00022499999999999956},
303 {2.7674999999999454, 0.0002550000000000043},
304 {5.752499999999801, 4.500000000001117e-05},
305 {6.2887499999995, 2.2500000000022112e-05},
306 {7.265625000000208, -2.4107142857150163e-05},
307 {8.287500000000128, -5.863636363636705e-05},
308 {5.99329044117658, -1.194852941176682e-05},
309 {5.653893442622939, -5.5327868852457475e-06},
312 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R2PLITasPLIVefficiencyVeryTight", isoTypes,
313 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
316 }
else if (muWPname ==
"R2PLITasPLIVrejectionTight") {
317 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
318 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
319 const std::vector<std::vector<double>>
parameters = {{3.8999999999999986},
320 {2.853749999999994, 0.00018750000000000065},
321 {2.321250000000002, 0.0002474999999999998},
322 {5.426250000000083, 2.2499999999995095e-05},
323 {7.312499999999872, -7.499999999999437e-05},
324 {7.552232142857126, -8.303571428571374e-05},
325 {7.140340909090713, -7.022727272726753e-05},
326 {4.7727941176470186, -2.499999999999921e-05},
327 {3.679918032786865, -5.409836065573509e-06},
330 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R2PLITasPLIVrejectionTight", isoTypes,
331 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
334 }
else if (muWPname ==
"R2PLITasPLIVrejectionVeryTight") {
335 const std::vector<std::string>& isoTypes = {
"PLIT_TPLTmu_pmuxpromp",
"PLIT_TPLTmu_pnpxall"};
336 const std::vector<double> boundaries = {5500.0, 10000.0, 15000.0, 20000.0, 25000.0, 32000.0, 43000.0, 60000.0, 95000.0};
337 const std::vector<std::vector<double>>
parameters = {{4.199999999999999},
338 {2.9887499999999982, 0.0002175000000000001},
339 {2.9287500000000426, 0.0002324999999999965},
340 {5.602499999999976, 4.500000000000134e-05},
341 {6.262499999999722, 1.5000000000012243e-05},
342 {7.651339285714248, -4.5535714285712985e-05},
343 {8.947159090908924, -8.659090909090467e-05},
344 {5.994117647058617, -2.3529411764701903e-05},
345 {4.8565573770491985, -2.213114754098622e-06},
346 {4.349999999999998}};
348 wp->addCut(std::make_unique<IsolationConditionCombined>(
"R2PLITasPLIVrejectionVeryTight", isoTypes,
349 std::make_unique<TF2>(
"muonPLIT",
"TMath::Log(x / y)"),
354 return StatusCode::FAILURE;
357 #ifndef XAOD_STANDALONE
361 return StatusCode::SUCCESS;
365 std::unique_ptr<IsolationWP>
wp = std::make_unique<IsolationWP>(phWPname);
366 if (phWPname ==
"TightCaloOnly") {
368 }
else if (phWPname ==
"FixedCutTight") {
371 }
else if (phWPname ==
"FixedCutLoose") {
374 }
else if (phWPname ==
"Tight") {
376 wp->addCut(std::make_unique<IsolationConditionFormula>(
"PhFixedCut_Tighttrack20",
378 }
else if (phWPname ==
"Loose") {
380 wp->addCut(std::make_unique<IsolationConditionFormula>(
"PhFixedCut_Tighttrack20",
384 return StatusCode::FAILURE;
388 #ifndef XAOD_STANDALONE
394 return StatusCode::SUCCESS;
398 std::unique_ptr<IsolationWP>
wp = std::make_unique<IsolationWP>(elWPname);
400 if (elWPname ==
"HighPtCaloOnly") {
403 }
else if (elWPname ==
"Tight_VarRad") {
404 wp->addCut(std::make_unique<IsolationConditionFormula>(
407 }
else if (elWPname ==
"Loose_VarRad") {
408 wp->addCut(std::make_unique<IsolationConditionFormula>(
411 }
else if (elWPname ==
"TightTrackOnly_VarRad") {
412 wp->addCut(std::make_unique<IsolationConditionFormula>(
414 }
else if (elWPname ==
"TightTrackOnly_FixedRad") {
415 wp->addCut(std::make_unique<IsolationConditionFormula>(
417 wp->addCut(std::make_unique<IsolationConditionFormula>(
419 }
else if (elWPname ==
"PflowTight_FixedRad") {
424 wp->addCut(std::make_unique<IsolationConditionCombined>(
"ElecPFlowTightLowPt", isoTypesLowPt,
425 std::make_unique<TF2>(
"pflowTFunctionLowPt",
"fabs(x)+0.4*(y>0?y:0)"),
427 wp->addCut(std::make_unique<IsolationConditionCombined>(
"ElecPFlowTightHighPt", isoTypesHighPt,
428 std::make_unique<TF2>(
"pflowTFunctionHighPt",
"fabs(x)+0.4*(y>0?y:0)"),
430 }
else if (elWPname ==
"PflowTight") {
433 wp->addCut(std::make_unique<IsolationConditionCombined>(
434 "ElecPFlowTight", isoTypes, std::make_unique<TF2>(
"pflowLFunction",
"fabs(x)+0.4*(y>0?y:0)"),
"0.045*x",
m_isoDecSuffix));
435 }
else if (elWPname ==
"PflowLoose_FixedRad") {
440 wp->addCut(std::make_unique<IsolationConditionCombined>(
"ElecPFlowLooseLowPt", isoTypesLowPt,
441 std::make_unique<TF2>(
"pflowLFunctionLowPt",
"fabs(x)+0.4*(y>0?y:0)"),
443 wp->addCut(std::make_unique<IsolationConditionCombined>(
"ElecPFlowLooseHighPt", isoTypesHighPt,
444 std::make_unique<TF2>(
"pflowLFunctionHighPt",
"fabs(x)+0.4*(y>0?y:0)"),
446 }
else if (elWPname ==
"PflowLoose") {
449 wp->addCut(std::make_unique<IsolationConditionCombined>(
450 "ElecPFlowLoose", isoTypes, std::make_unique<TF2>(
"pflowLFunction",
"fabs(x)+0.4*(y>0?y:0)"),
"0.16*x",
m_isoDecSuffix));
452 ATH_MSG_ERROR(
"Unknown electron isolation WP: " << elWPname);
453 return StatusCode::FAILURE;
457 #ifndef XAOD_STANDALONE
463 return StatusCode::SUCCESS;
467 std::vector<std::pair<xAOD::Iso::IsolationType, std::string>>&
cuts,
469 std::vector<std::unique_ptr<IsolationWP>>* wps(
nullptr);
483 }
else if (ObjType == xAOD::Type::Other) {
484 if (
key ==
"")
return StatusCode::FAILURE;
488 return StatusCode::FAILURE;
491 std::unique_ptr<IsolationWP>
wp = std::make_unique<IsolationWP>(WPname);
495 for (
auto&
c :
cuts)
wp->addCut(std::make_unique<IsolationConditionFormula>(xAOD::Iso::toCString(
c.first),
c.first,
c.second));
497 ATH_MSG_ERROR(
"Unknown isolation WP type -- should not happen.");
498 return StatusCode::FAILURE;
502 wps->push_back(std::move(
wp));
503 return StatusCode::SUCCESS;
515 return StatusCode::FAILURE;
529 }
else if (ObjType == xAOD::Type::Other) {
533 return StatusCode::FAILURE;
536 return StatusCode::SUCCESS;
538 template <
typename T>
541 for (
const std::unique_ptr<IsolationWP>&
i :
WP) {
617 if (isOpen && boundaries.size() !=
parameters.size() - 1) {
618 ATH_MSG_ERROR(
"The number of region boundaries must be one less than the number of parameters for the piecewise polynomial function.");
620 }
else if (!isOpen && boundaries.size() !=
parameters.size() + 1) {
621 ATH_MSG_ERROR(
"The number of region boundaries must be one more than the number of parameters for the piecewise polynomial function.");
625 std::ostringstream oss;
626 oss << std::setprecision(16);
630 auto polynomial = [](
const std::vector<double>&
params) {
631 std::ostringstream oss;
632 oss << std::setprecision(16);
634 for (
size_t i = 0;
i <
params.size(); ++
i) {
635 if (
i > 0) oss <<
" + ";
641 oss <<
params[
i] <<
" * pow(x, " <<
i <<
")";
658 for (
size_t i = 0;
i < boundaries.size(); ++
i) {
659 if (
i == 0) oss <<
"(";
660 oss <<
"(x < " << boundaries[
i] <<
") ? " << polynomial(
params[
i]) <<
" : ";
662 oss << polynomial(
params.back()) <<
")";