File indexing completed on 2025-01-31 02:19:51
0001 #include "RecoBTag/Combined/interface/HeavyIonCSVTagger.h"
0002 #include "DataFormats/BTauReco/interface/CandIPTagInfo.h"
0003 #include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h"
0004 #include "FWCore/Utilities/interface/ESInputTag.h"
0005 #include "CondFormats/DataRecord/interface/GBRWrapperRcd.h"
0006 #include <memory>
0007 #include <algorithm>
0008 #include <map>
0009 #include <vector>
0010
0011 HeavyIonCSVTagger::Tokens::Tokens(const edm::ParameterSet &configuration, edm::ESConsumesCollector &&cc) {
0012 if (configuration.getParameter<bool>("useCondDB")) {
0013 gbrForest_ = cc.consumes(edm::ESInputTag{"", configuration.getParameter<std::string>("gbrForestLabel")});
0014 }
0015 }
0016 HeavyIonCSVTagger::HeavyIonCSVTagger(const edm::ParameterSet &configuration, Tokens tokens)
0017 : sv_computer_(configuration.getParameter<edm::ParameterSet>("sv_cfg")),
0018 mva_name_(configuration.getParameter<std::string>("mvaName")),
0019 weight_file_(configuration.getParameter<edm::FileInPath>("weightFile")),
0020 use_GBRForest_(configuration.getParameter<bool>("useGBRForest")),
0021 use_adaBoost_(configuration.getParameter<bool>("useAdaBoost")),
0022 tokens_{tokens} {
0023 vpset vars_definition = configuration.getParameter<vpset>("variables");
0024
0025 for (auto &var : vars_definition) {
0026 MVAVar mva_var;
0027 mva_var.name = var.getParameter<std::string>("name");
0028 mva_var.id = reco::getTaggingVariableName(var.getParameter<std::string>("taggingVarName"));
0029
0030 mva_var.has_index = var.existsAs<int>("idx");
0031 mva_var.index = mva_var.has_index ? var.getParameter<int>("idx") : 0;
0032 mva_var.default_value = var.getParameter<double>("default");
0033
0034 variables_.push_back(mva_var);
0035 }
0036
0037 uses(0, "impactParameterTagInfos");
0038 uses(1, "secondaryVertexTagInfos");
0039 }
0040
0041 void HeavyIonCSVTagger::initialize(const JetTagComputerRecord &record) {
0042 mvaID_ = std::make_unique<TMVAEvaluator>();
0043
0044 std::vector<std::string> variable_names;
0045 variable_names.reserve(variables_.size());
0046
0047 for (auto &var : variables_) {
0048 variable_names.push_back(var.name);
0049 }
0050 std::vector<std::string> spectators;
0051
0052 if (tokens_.gbrForest_.isInitialized()) {
0053 mvaID_->initializeGBRForest(&record.get(tokens_.gbrForest_), variable_names, spectators, use_adaBoost_);
0054 } else {
0055 mvaID_->initialize("Color:Silent:Error",
0056 mva_name_,
0057 weight_file_.fullPath(),
0058 variable_names,
0059 spectators,
0060 use_GBRForest_,
0061 use_adaBoost_);
0062 }
0063 }
0064
0065 HeavyIonCSVTagger::~HeavyIonCSVTagger() {}
0066
0067
0068 float HeavyIonCSVTagger::discriminator(const TagInfoHelper &tagInfo) const {
0069
0070 const reco::TrackIPTagInfo &ip_info = tagInfo.get<reco::TrackIPTagInfo>(0);
0071 const reco::SecondaryVertexTagInfo &sv_info = tagInfo.get<reco::SecondaryVertexTagInfo>(1);
0072 reco::TaggingVariableList vars = sv_computer_(ip_info, sv_info);
0073
0074
0075 std::map<std::string, float> inputs;
0076 std::vector<float> tagValList = vars.getList(reco::btau::trackSip3dSig, false);
0077 bool noTrack = (tagValList.empty());
0078
0079 for (auto &mva_var : variables_) {
0080
0081 if (mva_var.has_index) {
0082 std::vector<float> vals = vars.getList(mva_var.id, false);
0083 inputs[mva_var.name] = (vals.size() > mva_var.index) ? vals[mva_var.index] : mva_var.default_value;
0084 }
0085
0086 else {
0087 inputs[mva_var.name] = vars.get(mva_var.id, mva_var.default_value);
0088 if (noTrack) {
0089 if (mva_var.name == "TagVarCSV_vertexMass") {
0090 if (inputs[mva_var.name] < 0)
0091 return -1;
0092 noTrack = false;
0093 }
0094 }
0095 }
0096 }
0097
0098 return (mvaID_->evaluate(inputs) + 1.) / 2.;
0099 }
0100
0101 void HeavyIonCSVTagger::fillPSetDescription(edm::ParameterSetDescription &desc) {
0102 desc.add<bool>("useCondDB", false);
0103 desc.add<bool>("useAdaBoost", false);
0104 desc.add<bool>("useGBRForest", true);
0105 desc.add<std::string>("mvaName", "");
0106 desc.add<std::string>("gbrForestLabel", "");
0107 desc.add<edm::FileInPath>("weightFile", edm::FileInPath());
0108
0109 edm::ParameterSetDescription svComputerCfg;
0110 svComputerCfg.setAllowAnything();
0111 desc.add<edm::ParameterSetDescription>("sv_cfg", svComputerCfg);
0112
0113 {
0114 std::vector<edm::ParameterSet> temp;
0115 edm::ParameterSetDescription variablePSet;
0116 variablePSet.add<int>("idx", 0.);
0117 variablePSet.add<double>("default", 1.);
0118 variablePSet.add<std::string>("name", "");
0119 variablePSet.add<std::string>("taggingVarName", "");
0120 desc.addVPSet("variables", variablePSet, temp)->setComment("Default empty VPSet, can contain anything");
0121 }
0122 }