Back to home page

Project CMSSW displayed by LXR

 
 

    


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 /// b-tag a jet based on track-to-jet parameters in the extened info collection
0074 float CharmTagger::discriminator(const TagInfoHelper &tagInfo) const {
0075   // default value, used if there are no leptons associated to this jet
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   // Loop over input variables
0083   std::map<std::string, float> inputs;
0084   for (auto &mva_var : variables_) {
0085     //vectorial tagging variable
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     //single value tagging var
0091     else {
0092       inputs[mva_var.name] = vars.get(mva_var.id, mva_var.default_value);
0093     }
0094   }
0095 
0096   //get the MVA output
0097   bool notracks = (vars.get(reco::btau::jetNTracks, 0) == 0);
0098   float tag = mvaID_->evaluate(inputs);
0099   if (defaultValueNoTracks_ && notracks) {
0100     tag = -2;
0101   }  // if no tracks available, put value at -2 (only for Phase I)
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 }