Back to home page

Project CMSSW displayed by LXR

 
 

    


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 /// b-tag a jet based on track-to-jet parameters in the extened info collection
0068 float HeavyIonCSVTagger::discriminator(const TagInfoHelper &tagInfo) const {
0069   // default value, used if there are no leptons associated to this jet
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   // Loop over input variables
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     //vectorial tagging variable
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     //single value tagging var
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 }