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