47 std::string default_flexible(
int flavsize,
const std::string&
suffix =
":default"){
49 for(
int i = 0 ;
i < flavsize ;
i++){
52 if(
i != flavsize - 1){
61 const std::string labelB =
"GhostBHadronsFinal";
62 const std::string labelC =
"GhostCHadronsFinal";
63 const std::string labelTau =
"GhostTausFinal";
65 std::vector<const IParticle*> ghostB;
66 if (
jet.getAssociatedObjects<
IParticle>(labelB, ghostB) && ghostB.size() > 0)
return 5;
67 std::vector<const IParticle*> ghostC;
68 if (
jet.getAssociatedObjects<
IParticle>(labelC, ghostC) && ghostC.size() > 0)
return 4;
69 std::vector<const IParticle*> ghostTau;
70 if (
jet.getAssociatedObjects<
IParticle>(labelTau, ghostTau) && ghostTau.size() > 0)
return 15;
81 jet.getAttribute(
"TruthLabelID",
label);
91 jet.getAttribute(
"HadronConeExclExtendedTruthLabelID",
label);
93 jet.getAttribute(
"HadronConeExclTruthLabelID",
label);
98 int LargeJetTruthLabel(
const xAOD::Jet&
jet,
const std::string& jetauthor){
100 if (jetauthor !=
"AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets"){
101 jet.getAttribute(
"R10TruthLabel_R22v1",
label);
109 int jetFlavourLabel (
const xAOD::Jet&
jet,
bool doConeLabelling,
bool doOldLabelling,
bool doExtended,
bool doXbbTagging,
const std::string& jetauthor) {
111 return LargeJetTruthLabel(
jet, jetauthor);
112 }
else if (doConeLabelling){
121 std::string
trim(
const std::string&
str,
122 const std::string& whitespace =
" \t") {
123 const auto strBegin =
str.find_first_not_of(whitespace);
124 if (strBegin == std::string::npos)
127 const auto strEnd =
str.find_last_not_of(whitespace);
128 const auto strRange = strEnd - strBegin + 1;
130 return str.substr(strBegin, strRange);
134 std::vector<std::string>
split(
const std::string&
str,
char token =
';') {
135 std::vector<std::string>
result;
136 if (
str.size() > 0) {
137 std::string::size_type
end;
144 }
while (
end != std::string::npos);
155 declareProperty(
"ScaleFactorFileName",
m_SFFile =
"",
"name of the official scale factor calibration CDI file (uses PathResolver)");
156 declareProperty(
"UseDevelopmentFile",
m_useDevFile =
false,
"specify whether or not to use the (PathResolver) area for temporary scale factor calibration CDI files");
158 declareProperty(
"EfficiencyConfig",
m_EffConfigFile =
"",
"name of config file specifying which efficiency map to use with a given samples DSID");
159 declareProperty(
"ScaleFactorBCalibration",
m_SFNames[
"B"] =
"default",
"name of b-jet scale factor calibration object");
160 declareProperty(
"ScaleFactorCCalibration",
m_SFNames[
"C"] =
"default",
"name of c-jet scale factor calibration object");
161 declareProperty(
"ScaleFactorTCalibration",
m_SFNames[
"T"] =
"default",
"name of tau-jet scale factor calibration object");
162 declareProperty(
"ScaleFactorLightCalibration",
m_SFNames[
"Light"] =
"default",
"name of light-flavour jet scale factor calibration object");
163 declareProperty(
"EigenvectorReductionB",
m_EVReduction[
"B"] =
"Loose",
"b-jet scale factor Eigenvector reduction strategy; choose between 'Loose', 'Medium', 'Tight'");
164 declareProperty(
"EigenvectorReductionC",
m_EVReduction[
"C"] =
"Loose",
"c-jet scale factor Eigenvector reduction strategy; choose between 'Loose', 'Medium', 'Tight'");
165 declareProperty(
"EigenvectorReductionLight",
m_EVReduction[
"Light"] =
"Loose",
"light-flavour jet scale factor Eigenvector reduction strategy; choose between 'Loose', 'Medium', 'Tight'");
166 declareProperty(
"EfficiencyBCalibrations",
m_EffNames[
"B"] =
"default",
"(semicolon-separated) name(s) of b-jet efficiency object(s)");
167 declareProperty(
"EfficiencyCCalibrations",
m_EffNames[
"C"] =
"default",
"(semicolon-separated) name(s) of c-jet efficiency object(s)");
168 declareProperty(
"EfficiencyTCalibrations",
m_EffNames[
"T"] =
"default",
"(semicolon-separated) name(s) of tau-jet efficiency object(s)");
169 declareProperty(
"EfficiencyLightCalibrations",
m_EffNames[
"Light"] =
"default",
"(semicolon-separated) name(s) of light-flavour-jet efficiency object(s)");
174 declareProperty(
"ExcludeFromEigenVectorTreatment",
m_excludeFromEV =
"",
"(semicolon-separated) names of uncertainties to be excluded from all eigenvector decompositions (if used)");
175 declareProperty(
"ExcludeFromEigenVectorBTreatment",
m_excludeFlvFromEV[
"B"] =
"",
"(semicolon-separated) names of uncertainties to be excluded from b-jet eigenvector decomposition (if used)");
176 declareProperty(
"ExcludeFromEigenVectorCTreatment",
m_excludeFlvFromEV[
"C"] =
"",
"(semicolon-separated) names of uncertainties to be excluded from c-jet eigenvector decomposition (if used)");
177 declareProperty(
"ExcludeFromEigenVectorLightTreatment",
m_excludeFlvFromEV[
"Light"] =
"",
"(semicolon-separated) names of uncertainties to be excluded from light-flavour-jet eigenvector decomposition (if used)");
178 declareProperty(
"ExcludeRecommendedFromEigenVectorTreatment",
m_useRecommendedEVExclusions =
false,
"specify whether or not to add recommended lists to the user specified eigenvector decomposition exclusion lists");
180 declareProperty(
"SystematicsStrategy",
m_systStrategy =
"SFEigen",
"name of systematics model; presently choose between 'SFEigen' and 'Envelope'");
181 declareProperty(
"ConeFlavourLabel",
m_coneFlavourLabel =
true,
"specify whether or not to use the cone-based flavour labelling instead of the default ghost association based labelling");
182 declareProperty(
"ExtendedFlavourLabel",
m_extFlavourLabel =
false,
"specify whether or not to use an 'extended' flavour labelling (allowing for multiple HF hadrons or perhaps partons)");
183 declareProperty(
"OldConeFlavourLabel",
m_oldConeFlavourLabel =
false,
"when using cone-based flavour labelling, specify whether or not to use the (deprecated) Run-1 legacy labelling");
185 declareProperty(
"useCTagging",
m_useCTag=
false,
"Enabled only for FixedCut or Continuous WPs: define wether the cuts refer to b-tagging or c-tagging");
189 declareProperty(
"useFlexibleConfig",
m_useFlex =
false,
"Setup the flexible configuration of the xAODBTaggingEfficiencyTool with alternate labeling");
190 declareProperty(
"doXbbTagging",
m_doXbbTagging =
false,
"Configure the xAODBTaggingEfficiencyTool to perform alternate labeling on large radius jets (typically X->bb tagging)");
191 declareProperty(
"FlexibleScaleFactorCalibrations",
m_SFName_flex =
"",
"(semicolon-separated) name of scale factor calibration object for (0,1,2..) indexed flavour labels, e.g. '0:default;1:default;2:default;3:default' ");
192 declareProperty(
"FlexibleEfficiencyCalibrations",
m_EffNames_flex =
"",
"(semicolon-separated) name(s) of efficiency object(s) names for (0,1,2..) indexed flavour labels, e.g. '0:default;1:default;2:default;3:default' ");
193 declareProperty(
"FlexibleEigenvectorReduction",
m_EVReduction_flex =
"",
"(semicolon-separated) list of eigenvector reduction strategy for (0,1,2..) indexed flavour labels; choose between 'Loose', 'Medium', 'Tight' for different labels, e.g. '0:Loose;1:Loose;2:Loose' ");
194 declareProperty(
"FlexibleUncertaintySuffix",
m_uncertaintySuffixes_flex =
"",
"optional (semicolon-separated) list of suffixes for (0,1,2..) indexed flavour label uncertainty naming, e.g. '0:;1:;2:;3:' ");
195 declareProperty(
"FlexibleExcludeFromEVTreatment",
m_excludeFlvFromEV_flex =
"",
"(semicolon-separated) names of uncertainties to be excluded from (0,1,2..) indexed flavour eigenvector decompositions (if used), e.g. '0:;1:;2:;3:' ");
216 ATH_MSG_INFO(
" Hello BTaggingEfficiencyTool user... initializing");
227 std::string prepend =
"";
229 ATH_MSG_WARNING(
" Attempting to retrieve b-tagging scale factor calibration file from development area");
232 prepend +=
"xAODBTaggingEfficiency/";
236 ATH_MSG_WARNING(
" Unable to retrieve b-tagging scale factor calibration file!");
250 std::map<std::string, Analysis::EVReductionStrategy> EVRedStrategies, mappings;
259 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - follow the above suggestions to correct your config!");
260 return StatusCode::FAILURE;
263 ATH_MSG_INFO(
" --- Calibration file configuration options ---" );
265 Reader.printJetCollections();
266 Reader.printWorkingPoints();
269 std::vector<std::string> config_labels =
Reader.getLabels();
270 std::vector<std::string> flavours;
272 std::map<std::string, std::vector<std::string> > EffNames;
273 std::vector<std::string> EVflavours = {
"B",
"C",
"Light" };
275 std::map<std::string, std::vector<std::string> > excludeFromEVCov;
281 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - cannot perform Xbb tagging without flexible configuration.");
282 return StatusCode::FAILURE;
291 std::getline(eff_config_file,
str);
298 while (std::getline(eff_config_file,
str)) {
299 std::vector<std::string> dsid_and_effmap =
split(
str,
':');
300 unsigned int dsid = std::stoul( dsid_and_effmap[0] );
301 unsigned int map_index = std::stoul( dsid_and_effmap[1] );
308 flavours = {
"B",
"C",
"Light",
"T"};
310 for (
auto const& flavour : flavours) {
331 flavours = config_labels;
336 int size_of_labels = flavours.size();
338 m_SFName_flex = default_flexible(flavours.size(),
":default");
356 for (
auto const& effconfig : efficiencies_map) {
357 std::vector<std::string> effmap =
split(effconfig,
':');
358 if(effmap.size() != 2){
359 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - efficiency files not included properly in the (experimental) flexible configuration!");
360 return StatusCode::FAILURE;
362 int index = std::stoi(effmap.at(0));
363 std::vector<std::string> effcalibs;
364 if(effmap.at(1) !=
"default"){
365 effcalibs =
split(effmap.at(1),
',');
367 effcalibs.push_back(effmap.at(1));
369 std::string flavour_name = flavours.at(
index);
371 EffNames[flavour_name] = effcalibs;
375 for (
auto const& sfconfig : scalefactor_map) {
376 std::vector<std::string> sfmap =
split(sfconfig,
':');
377 if(sfmap.size() != 2){
378 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - efficiency files not included properly in the (experimental) flexible configuration!");
379 return StatusCode::FAILURE;
381 int index = std::stoi(sfmap.at(0));
382 std::string flavour_name = flavours.at(
index);
385 for(
const std::string& flav : flavours){
391 EVflavours = flavours;
394 for (
auto const& evred : evreduction_map) {
395 std::vector<std::string> evredmap =
split(evred,
':');
396 if(evredmap.size() != 2){
397 if(std::stoi(evredmap.at(0)) < size_of_labels){
398 evredmap.push_back(
"");
400 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - reduction strategies not set properly in the (experimental) flexible configuration!");
401 return StatusCode::FAILURE;
404 int index = std::stoi(evredmap.at(0));
405 const std::string& flavour_name = flavours.at(
index);
411 for (
auto const& excl : exclusion_map) {
412 std::vector<std::string> exclmap =
split(excl,
':');
413 if(exclmap.size() != 2){
414 if(std::stoi(exclmap.at(0)) < size_of_labels){
415 exclmap.push_back(
"");
417 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - uncertainty exclusion not set properly in the (experimental) flexible configuration!");
418 return StatusCode::FAILURE;
421 int index = std::stoi(exclmap.at(0));
422 std::vector<std::string> uncertainties_to_exclude =
split(exclmap.at(1),
',');;
423 const std::string& flavour_name = flavours.at(
index);
429 for (
auto const& flavour : EVflavours) {
431 excludeFromEVCov[flavour] = to_exclude;
433 excludeFromEVCov[flavour].insert(excludeFromEVCov[flavour].
end(), further_exclude.begin(), further_exclude.end());
439 std::vector<std::string> conventional_labels = {
"B",
"C",
"Light",
"T"};
440 if (flavours == conventional_labels) {
445 EVRedStrategies[
"T"] = EVRedStrategies[
"C"];
449 excludeFromEVCov[
"T"] = excludeFromEVCov[
"C"];
454 excludeFromEVCov[
"T"].push_back(
"extrapolation from charm");
457 if(
m_OP.find(
"Continuous") != std::string::npos){
458 excludeFromEVCov[
"B"].push_back(
"extrapolation_pt_b_Eigen*");
459 excludeFromEVCov[
"C"].push_back(
"extrapolation_pt_c_Eigen*");
460 excludeFromEVCov[
"Light"].push_back(
"extrapolation_pt_l_Eigen*");
461 excludeFromEVCov[
"T"].push_back(
"extrapolation_pt_c_Eigen*");
465 if (
m_OP ==
"Continuous") {
473 else if (
m_OP.find(
"Continuous2D") != std::string::npos) {
477 std::vector<std::string> jetAliases;
497 ATH_MSG_INFO(
"BTEffTool->initialize : setMapIndex(Light)");
506 for(
const auto& flavour : flavours){
508 ATH_MSG_INFO(
" - - -BTEffTool->initialize : setMapIndex(" << flavour <<
")");
518 std::vector<std::string> suffixes;
520 for (
int i = 0;
i < 4; ++
i) {
521 std::string flav = flavours[
i];
if (flav ==
"T") flav =
"C";
524 if (
test.length() > 0 &&
test[0] !=
'_')
test.insert(0,
"_");
525 suffixes.push_back(
test);
530 int size_of_labels = flavours.size();
531 for (
auto const& suff : suffixvec) {
532 std::vector<std::string> suffmap =
split(suff,
':');
533 if(suffmap.size() != 2){
534 if(std::stoi(suffmap.at(0)) < size_of_labels){
535 suffmap.push_back(
"");
537 ATH_MSG_ERROR(
"BTaggingEfficiencyTool configuration is invalid - suffix configuration not set properly in the (experimental) flexible configuration!");
538 return StatusCode::FAILURE;
541 int index = std::stoi(suffmap.at(0));
542 std::string flavour_name = flavours.at(
index);
546 suffixes.push_back(
suffix);
553 for (
long unsigned int i = 0;
i < flavours.size(); ++
i) {
555 unsigned int flavourID;
564 ATH_MSG_ERROR(
"No entry for flavour " << flavourID <<
" which is " << flavours[
i] <<
" in SFIndices map, invalid initialization");
565 return StatusCode::FAILURE;
567 int id = mapIter->second;
575 unsigned int flavourIDRef;
577 flavourIDRef = (flavourID == 15) ? 4 : flavourID;
579 flavourIDRef = flavourID;
581 int idRef =
m_SFIndices.find(flavourIDRef)->second;
583 std::vector<std::string>
systematics =
m_CDI->listScaleFactorUncertainties(idRef, flavours.at(
i),
true);
595 std::replace_if(systematic.begin(), systematic.end(), [] (
char c) { return c ==
' '; },
'_');
600 ATH_MSG_ERROR(
"SFEigen model: error adding named systematics for flavour " <<
getLabel(flavourIDRef) <<
", invalid initialization");
601 return StatusCode::FAILURE;
606 if (hasExtrapolation) {
607 std::vector<std::string> extrapSyst; extrapSyst.push_back(std::string(
"FT_EFF_extrapolation"));
609 ATH_MSG_ERROR(
"SFEigen model: error adding extrapolation uncertainty for flavour " <<
getLabel(flavourIDRef) <<
", invalid initialization");
610 return StatusCode::FAILURE;
615 std::vector<std::string> eigenSysts;
623 ATH_MSG_ERROR(
"SFEigen model: error adding eigenvector systematics for flavour " <<
getLabel(flavourIDRef) <<
", invalid initialization");
624 return StatusCode::FAILURE;
636 ATH_MSG_ERROR(
"SFGlobalEigen model: error adding eigenvector systematics for flavour " <<
getLabel(flavourIDRef) <<
" ie " <<
getLabel(flavourID) <<
", invalid initialization");
637 return StatusCode::FAILURE;
643 if (flavourID == 15) {
645 std::vector<std::string> all_systematics =
m_CDI->listScaleFactorUncertainties(
id,
getLabel(flavourID));
647 const std::string s_tau_extrap =
"extrapolation from charm";
648 if (
std::find(all_systematics.begin(), all_systematics.end(), s_tau_extrap) != all_systematics.end()) {
650 std::string
entry =
"FT_EFF_extrapolation_from_charm";
651 std::vector<std::string> extrapSyst; extrapSyst.push_back(
entry);
653 ATH_MSG_ERROR(
"SFEigen model: error adding charm->tau systematics for flavour " <<
getLabel(flavourID) <<
", invalid initialization");
654 return StatusCode::FAILURE;
666 unsigned int flavourIDRef = (flavourID == 15) ? 4 : flavourID;
667 int idRef =
m_SFIndices.find(flavourIDRef)->second;
669 std::vector<std::string> all_ref_systematics =
m_CDI->listScaleFactorUncertainties(idRef,
getLabel(flavourID),
false);
670 const std::string s_total =
"systematics";
671 if (
std::find(all_ref_systematics.begin(), all_ref_systematics.end(), s_total) == all_ref_systematics.end()) {
672 ATH_MSG_ERROR(
"Envelope model: required uncertainty " << s_total <<
" not found for flavour " <<
getLabel(flavourIDRef)
673 <<
", invalid initialization");
674 return StatusCode::FAILURE;
676 std::vector<std::string> totalSyst; totalSyst.push_back(
"FT_EFF_" +
getLabel(flavourIDRef) +
"_" + s_total + suffixes[
i]);
678 ATH_MSG_ERROR(
"Envelope model: error adding systematics uncertainty for flavour " <<
getLabel(flavourIDRef)
679 <<
", invalid initialization");
680 return StatusCode::FAILURE;
683 const std::string s_extrap =
"extrapolation";
684 if (
std::find(all_ref_systematics.begin(), all_ref_systematics.end(), s_extrap) != all_ref_systematics.end()) {
685 std::vector<std::string> extrapSyst; extrapSyst.push_back(
"FT_EFF_" + s_extrap + suffixes[
i]);
687 ATH_MSG_ERROR(
"Envelope model: error adding extrapolation uncertainty for flavour " <<
getLabel(flavourIDRef)
688 <<
", invalid initialization");
689 return StatusCode::FAILURE;
693 if (flavourID == 15) {
695 std::vector<std::string> all_systematics =
m_CDI->listScaleFactorUncertainties(
id,
getLabel(flavourID));
697 const std::string s_tau_extrap =
"extrapolation from charm";
698 if (
std::find(all_systematics.begin(), all_systematics.end(), s_tau_extrap) != all_systematics.end()) {
699 std::vector<std::string> extrapSyst; extrapSyst.push_back(
"FT_EFF_extrapolation_from_charm" + suffixes[
i]);
701 ATH_MSG_ERROR(
"Envelope model: error adding charm->tau systematics for flavour " <<
getLabel(flavourID) <<
", invalid initialization");
702 return StatusCode::FAILURE;
716 if(
registry.registerSystematics(*
this) != StatusCode::SUCCESS)
717 return StatusCode::FAILURE;
734 ATH_MSG_INFO(
"!!!!! You have chosen to disable out-of-validity return codes -- contact the Flavour Tagging group if such jets comprise a substantial part of the phase space in your analysis !!!!!");
740 if (pathtoonnxfile ==
""){
741 ATH_MSG_ERROR(
"ONNX error: Model file doesn't exist! Please set the property 'pathToONNX' to a valid ONNX file");
742 return StatusCode::FAILURE;
749 return StatusCode::SUCCESS;
756 ATH_MSG_ERROR(
"BTaggingEfficiencyTool has not been initialised");
772 ATH_MSG_ERROR(
"unable to fill variables required for scale factor evaluation");
784 ATH_MSG_ERROR(
"BTaggingEfficiencyTool has not been initialised");
790 unsigned int sfindex = 0;
791 unsigned int efindex = 0;
798 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getScaleFactor call to getIndices failed " << flavour <<
" " << sfindex <<
" " << efindex);
803 unsigned int unc_ind=0;
808 ATH_MSG_VERBOSE(
"getScaleFactor: requested variation cannot be applied to flavour " <<
getLabel(flavour) <<
", returning nominal result");
814 status = (
m_isContinuous ||
m_isContinuous2D) ?
m_CDI->getWeightScaleFactor(
v,sfindex,efindex, unc,unc_ind,
result) :
m_CDI->getScaleFactor(
v,sfindex,efindex, unc,unc_ind,
result,
getLabel(flavour));
829 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getScaleFactor call to underlying code returned a kError!");
836 return CorrectionCode::Ok;
851 ATH_MSG_ERROR(
"unable to fill variables required for efficiency evaluation");
866 unsigned int sfindex = 0;
867 unsigned int efindex = 0;
870 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getEfficiency call to getIndices failed " << flavour <<
" " << sfindex <<
" " << efindex);
874 unsigned int unc_ind = 0;
886 ATH_MSG_VERBOSE(
"getEfficiency: requested variation cannot be applied to flavour " <<
getLabel(flavour) <<
", returning nominal result");
905 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getEfficiency call to underlying code returned a kError!");
912 return CorrectionCode::Ok;
926 ATH_MSG_ERROR(
"unable to fill variables required for scale factor evaluation");
941 unsigned int sfindex = 0;
942 unsigned int efindex = 0;
945 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getInefficiency call to getIndices failed " << flavour <<
" " << sfindex <<
" " << efindex);
949 unsigned int unc_ind = 0;
961 <<
", returning nominal result");
981 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getInefficiency call to underlying code returned a kError!");
988 return CorrectionCode::Ok;
1002 ATH_MSG_ERROR(
"unable to fill variables required for scale factor evaluation");
1017 unsigned int sfindex = 0;
1018 unsigned int efindex = 0;
1021 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getInefficiencyScaleFactor call to getIndices failed " << flavour <<
" " << sfindex <<
" " << efindex);
1025 unsigned int unc_ind=0;
1036 ATH_MSG_VERBOSE(
"getInefficiencyScaleFactor: requested variation cannot be applied to flavour " <<
getLabel(flavour)
1037 <<
", returning nominal result");
1057 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getInefficiencyScaleFactor call to underlying code returned a kError!");
1064 return CorrectionCode::Ok;
1078 ATH_MSG_ERROR(
"unable to fill variables required for scale factor evaluation");
1092 unsigned int sfindex = 0;
1093 unsigned int efindex = 0;
1096 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getMCEfficiency call to getIndices failed " << flavour <<
" " << sfindex <<
" " << efindex);
1109 ATH_MSG_ERROR(
"BTaggingEfficiencyTool::getMCEfficiency call to underlying code returned a kError!");
1116 return CorrectionCode::Ok;
1124 m_onnxUtil->runInference(node_feat, effAllJet);
1125 return CorrectionCode::Ok;
1132 m_onnxUtil->runInference(node_feat, effAllJetAllWp);
1133 return CorrectionCode::Ok;
1141 return sys.find( systematic) !=
sys.end();
1154 const std::map<SystematicVariation, std::vector<std::string> >
1156 std::map<SystematicVariation, std::vector<std::string> >
results;
1159 ATH_MSG_ERROR(
"listSystematics() cannot be called before initialisation is finished");
1164 std::vector<unsigned int> all_flavours{5, 4, 15, 0};
1173 std::vector<std::string> flavours;
1174 for(
const unsigned int flavour : all_flavours){
1176 if (
info.second.getIndex(flavour,
idx)){
1177 flavours.push_back(
getLabel(
int(flavour)));
1180 results[variation] = flavours;
1191 std::map<std::string, std::vector<std::string> >
1193 std::map<std::string, std::vector<std::string> > uncertainties;
1195 std::vector<unsigned int> all_flavours;
1197 all_flavours = { 5, 4, 15, 0 };
1202 for (
const unsigned int flavourID : all_flavours){
1205 unsigned int flavourIDRef = flavourID;
1211 ATH_MSG_ERROR(
"No entry for flavour " << flavourIDRef <<
" in SFIndices map, invalid initialization");
1214 int idRef = mapIter->second;
1223 return uncertainties;
1234 ATH_MSG_ERROR(
"BTaggingEfficiencyTool has not been initialised");
1237 if(
label.compare(
"B") != 0 &&
1238 label.compare(
"C") != 0 &&
1239 label.compare(
"T") != 0 &&
1240 label.compare(
"Light") != 0){
1241 ATH_MSG_ERROR(
"Flavour label is illegal! Label need to be B,C,T or Light.");
1246 ATH_MSG_ERROR(
"Failure running EigenVectorRecomposition Method.");
1249 coefficientMap =
m_CDI->getEigenVectorRecompositionCoefficientMap();
1250 return CorrectionCode::Ok;
1258 if (systConfig.
size() == 1 ) {
1264 return StatusCode::SUCCESS;
1270 if (SystematicSet::filterForAffectingSystematics(systConfig,
affectingSystematics(), filteredSysts) != StatusCode::SUCCESS) {
1272 return StatusCode::FAILURE;
1275 if (filteredSysts.
size() == 0) {
1279 return StatusCode::SUCCESS;
1280 }
else if (filteredSysts.
size() > 1) {
1282 ATH_MSG_WARNING(
"more than a single b-tagging systematic variation requested but not (yet) supported");
1283 return StatusCode::FAILURE;
1290 return StatusCode::FAILURE;
1296 return StatusCode::SUCCESS;
1304 x.jetEta =
jet.eta();
1305 x.jetTagWeight = 0.;
1314 if (!tagInfo)
return false;
1332 x.jetTagWeight = jetTagWeight;
1347 unsigned int flavourID = -1;
1357 unsigned int effIndex;
1362 unsigned int sfIndex;
1388 return set_b && set_c && set_light && set_t;
1400 std::vector<std::string> systStrings;
1402 std::ostringstream
ost;
1414 sf = mapIter->second;
1421 ef = mapIter->second;
1430 auto mapIter =
indexMap.find(flavourID);
1434 index = mapIter->second;
1444 for (
int i=0,
n=systematicNames.size();
i<
n; ++
i) {
1445 const std::string
systName = systematicNames[
i];
1453 info.uncType = uncType;
1454 info.indexMap[flavourID] =
i;
1463 std::map<unsigned int, unsigned int>::const_iterator indIter =
info.indexMap.find(flavourID);
1464 if (indIter !=
info.indexMap.end()) {
1465 ATH_MSG_ERROR(
"addSystematics : flavourID " << flavourID <<
" is already in the map for uncertainty '" <<
systName <<
"', ignoring");
1468 info.indexMap[flavourID] =
i;