diff --git a/PhysicsTools/PatAlgos/python/producersHeavyIons/heavyIonJets_cff.py b/PhysicsTools/PatAlgos/python/producersHeavyIons/heavyIonJets_cff.py index 05680c7e97ef5..04ff06aad908c 100644 --- a/PhysicsTools/PatAlgos/python/producersHeavyIons/heavyIonJets_cff.py +++ b/PhysicsTools/PatAlgos/python/producersHeavyIons/heavyIonJets_cff.py @@ -32,6 +32,7 @@ from RecoBTag.SecondaryVertex.simpleSecondaryVertex2TrkComputer_cfi import * from RecoBTag.SecondaryVertex.simpleSecondaryVertex3TrkComputer_cfi import * from RecoBTag.SecondaryVertex.combinedSecondaryVertexV2Computer_cfi import * +from RecoBTag.Combined.heavyIonCSVComputer_cfi import * from RecoBTag.ImpactParameter.jetBProbabilityComputer_cfi import * from RecoBTag.ImpactParameter.jetProbabilityComputer_cfi import * from RecoBTag.ImpactParameter.trackCounting3D2ndComputer_cfi import * diff --git a/PhysicsTools/PatAlgos/python/slimming/miniAOD_tools.py b/PhysicsTools/PatAlgos/python/slimming/miniAOD_tools.py index b6981349253b1..33afe7996060b 100644 --- a/PhysicsTools/PatAlgos/python/slimming/miniAOD_tools.py +++ b/PhysicsTools/PatAlgos/python/slimming/miniAOD_tools.py @@ -474,7 +474,6 @@ def _add_jetsPuppi(process): _run2_miniAOD_ANY.toModify(process.patJets, addTagInfos = False ) - _hiGeneral.toModify(process.patJets, addTagInfos = True ) _hiGeneral.toModify(process.patJets, tagInfoSources = cms.VInputTag(["impactParameterTagInfos","secondaryVertexTagInfos"]) ) ## puppi met diff --git a/RecoBTag/Combined/BuildFile.xml b/RecoBTag/Combined/BuildFile.xml index 41dca0fa9e5cf..5ce318d8b0e6e 100644 --- a/RecoBTag/Combined/BuildFile.xml +++ b/RecoBTag/Combined/BuildFile.xml @@ -7,6 +7,7 @@ + diff --git a/RecoBTag/Combined/interface/HeavyIonCSVTagger.h b/RecoBTag/Combined/interface/HeavyIonCSVTagger.h new file mode 100644 index 0000000000000..5bf4b53179e35 --- /dev/null +++ b/RecoBTag/Combined/interface/HeavyIonCSVTagger.h @@ -0,0 +1,55 @@ +#ifndef RecoBTag_Combined_HeavyIonCSVTagger_h +#define RecoBTag_Combined_HeavyIonCSVTagger_h + +#include "FWCore/Framework/interface/ESConsumesCollector.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "CommonTools/MVAUtils/interface/TMVAEvaluator.h" +#include "RecoBTau/JetTagComputer/interface/JetTagComputer.h" +#include "RecoBTag/SecondaryVertex/interface/CombinedSVComputer.h" +#include "DataFormats/BTauReco/interface/TaggingVariable.h" +#include "RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h" + +#include +#include + +/** \class HeavyIonCSVTagger + * \author M. Nguyen + * copied from CharmTagger.h (by M. Verzetti) + */ + +class HeavyIonCSVTagger : public JetTagComputer { +public: + struct Tokens { + Tokens(const edm::ParameterSet& configuration, edm::ESConsumesCollector&& cc); + edm::ESGetToken gbrForest_; + }; + + /// explicit ctor + HeavyIonCSVTagger(const edm::ParameterSet&, Tokens); + ~HeavyIonCSVTagger() override; + float discriminator(const TagInfoHelper& tagInfo) const override; + void initialize(const JetTagComputerRecord& record) override; + + typedef std::vector vpset; + + struct MVAVar { + std::string name; + reco::btau::TaggingVariableName id; + size_t index; + bool has_index; + float default_value; + }; + +private: + std::unique_ptr mvaID_; + CombinedSVComputer sv_computer_; + std::vector variables_; + + std::string mva_name_; + edm::FileInPath weight_file_; + bool use_GBRForest_; + bool use_adaBoost_; + Tokens tokens_; +}; + +#endif diff --git a/RecoBTag/Combined/plugins/HeavyIonCSVESProducer.cc b/RecoBTag/Combined/plugins/HeavyIonCSVESProducer.cc new file mode 100644 index 0000000000000..9add3528b65f4 --- /dev/null +++ b/RecoBTag/Combined/plugins/HeavyIonCSVESProducer.cc @@ -0,0 +1,8 @@ +#include "FWCore/Framework/interface/ModuleFactory.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "RecoBTau/JetTagComputer/interface/JetTagComputerESProducer.h" +#include "RecoBTag/Combined/interface/HeavyIonCSVTagger.h" + +typedef JetTagComputerESProducer HeavyIonCSVESProducer; +DEFINE_FWK_EVENTSETUP_MODULE(HeavyIonCSVESProducer); diff --git a/RecoBTag/Combined/python/heavyIonCSVComputer_cfi.py b/RecoBTag/Combined/python/heavyIonCSVComputer_cfi.py new file mode 100644 index 0000000000000..d7f4b730303b5 --- /dev/null +++ b/RecoBTag/Combined/python/heavyIonCSVComputer_cfi.py @@ -0,0 +1,24 @@ +import FWCore.ParameterSet.Config as cms +import RecoBTag.SecondaryVertex.candidateCombinedSecondaryVertexV2Computer_cfi as sv_cfg +from RecoBTag.Combined.heavyIonCSV_trainingSettings import heavyIonCSV_vpset + +heavyIonCSVComputer = cms.ESProducer( + 'HeavyIonCSVESProducer', + sv_cfg = cms.PSet( + **sv_cfg.candidateCombinedSecondaryVertexV2Computer.parameters_() + ), + weightFile = cms.FileInPath('RecoBTag/Combined/data/TMVA_Btag_CsJets_PbPb2018_BDTG.weights.xml'), + + variables = heavyIonCSV_vpset, + tagInfos = cms.VInputTag( + cms.InputTag('impactParameterTagInfos'), + cms.InputTag('secondaryVertexFinderTagInfos'), + ), + mvaName = cms.string('BDT'), + useCondDB = cms.bool(False), + gbrForestLabel = cms.string(''), + useGBRForest = cms.bool(True), + useAdaBoost = cms.bool(False) + ) + + diff --git a/RecoBTag/Combined/python/heavyIonCSVJetTags_cfi.py b/RecoBTag/Combined/python/heavyIonCSVJetTags_cfi.py new file mode 100644 index 0000000000000..2b601e9317eeb --- /dev/null +++ b/RecoBTag/Combined/python/heavyIonCSVJetTags_cfi.py @@ -0,0 +1,10 @@ +import FWCore.ParameterSet.Config as cms + +heavyIonCSVJetTags = cms.EDProducer( + "JetTagProducer", + jetTagComputer = cms.string('heavyIonCSVTags'), + tagInfos = cms.VInputTag( + cms.InputTag('impactParameterTagInfos'), + cms.InputTag('secondaryVertexFinderTagInfos'), + ) +) diff --git a/RecoBTag/Combined/python/heavyIonCSV_trainingSettings.py b/RecoBTag/Combined/python/heavyIonCSV_trainingSettings.py new file mode 100644 index 0000000000000..9dca13d8fb225 --- /dev/null +++ b/RecoBTag/Combined/python/heavyIonCSV_trainingSettings.py @@ -0,0 +1,183 @@ +import FWCore.ParameterSet.Config as cms +heavyIonCSV_vpset = cms.VPSet([ +cms.PSet( + default = cms.double(-100), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackSip3dSig_0'), + taggingVarName = cms.string('trackSip3dSig') +), cms.PSet( + default = cms.double(-100), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackSip3dSig_1'), + taggingVarName = cms.string('trackSip3dSig') +), cms.PSet( + default = cms.double(-100), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackSip3dSig_2'), + taggingVarName = cms.string('trackSip3dSig') +), cms.PSet( + default = cms.double(-100), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackSip3dSig_3'), + taggingVarName = cms.string('trackSip3dSig') +), cms.PSet( + default = cms.double(-999), + name = cms.string('TagVarCSV_trackSip3dSigAboveCharm'), + taggingVarName = cms.string('trackSip3dSigAboveCharm') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackPtRel_0'), + taggingVarName = cms.string('trackPtRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackPtRel_1'), + taggingVarName = cms.string('trackPtRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackPtRel_2'), + taggingVarName = cms.string('trackPtRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackPtRel_3'), + taggingVarName = cms.string('trackPtRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackEtaRel_0'), + taggingVarName = cms.string('trackEtaRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackEtaRel_1'), + taggingVarName = cms.string('trackEtaRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackEtaRel_2'), + taggingVarName = cms.string('trackEtaRel') +), cms.PSet( + default = cms.double(-1), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackEtaRel_3'), + taggingVarName = cms.string('trackEtaRel') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackDeltaR_0'), + taggingVarName = cms.string('trackDeltaR') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackDeltaR_1'), + taggingVarName = cms.string('trackDeltaR') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackDeltaR_2'), + taggingVarName = cms.string('trackDeltaR') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackDeltaR_3'), + taggingVarName = cms.string('trackDeltaR') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackPtRatio_0'), + taggingVarName = cms.string('trackPtRatio') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackPtRatio_1'), + taggingVarName = cms.string('trackPtRatio') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackPtRatio_2'), + taggingVarName = cms.string('trackPtRatio') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackPtRatio_3'), + taggingVarName = cms.string('trackPtRatio') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackJetDist_0'), + taggingVarName = cms.string('trackJetDist') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackJetDist_1'), + taggingVarName = cms.string('trackJetDist') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackJetDist_2'), + taggingVarName = cms.string('trackJetDist') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackJetDist_3'), + taggingVarName = cms.string('trackJetDist') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(0), + name = cms.string('TagVarCSV_trackDecayLenVal_0'), + taggingVarName = cms.string('trackDecayLenVal') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(1), + name = cms.string('TagVarCSV_trackDecayLenVal_1'), + taggingVarName = cms.string('trackDecayLenVal') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(2), + name = cms.string('TagVarCSV_trackDecayLenVal_2'), + taggingVarName = cms.string('trackDecayLenVal') +), cms.PSet( + default = cms.double(-0.1), + idx = cms.int32(3), + name = cms.string('TagVarCSV_trackDecayLenVal_3'), + taggingVarName = cms.string('trackDecayLenVal') +), cms.PSet( + default = cms.double(-0.1), + name = cms.string('TagVarCSV_trackSumJetEtRatio'), + taggingVarName = cms.string('trackSumJetEtRatio') +), cms.PSet( + default = cms.double(-0.1), + name = cms.string('TagVarCSV_trackSumJetDeltaR'), + taggingVarName = cms.string('trackSumJetDeltaR') +), cms.PSet( + default = cms.double(-0.1), + name = cms.string('TagVarCSV_vertexMass'), + taggingVarName = cms.string('vertexMass') +), cms.PSet( + default = cms.double(0), + name = cms.string('TagVarCSV_vertexNTracks'), + taggingVarName = cms.string('vertexNTracks') +), cms.PSet( + default = cms.double(-10), + name = cms.string('TagVarCSV_vertexEnergyRatio'), + taggingVarName = cms.string('vertexEnergyRatio') +), cms.PSet( + default = cms.double(-0.1), + name = cms.string('TagVarCSV_vertexJetDeltaR'), + taggingVarName = cms.string('vertexJetDeltaR') +), cms.PSet( + default = cms.double(-1), + name = cms.string('TagVarCSV_flightDistance2dSig'), + taggingVarName = cms.string('flightDistance2dSig') +), cms.PSet( + default = cms.double(0), + name = cms.string('TagVarCSV_jetNSecondaryVertices'), + taggingVarName = cms.string('jetNSecondaryVertices') +),cms.PSet( + default = cms.double(0), + name = cms.string('TagVarCSV_vertexCategory'), + taggingVarName = cms.string('vertexCategory') +)]) diff --git a/RecoBTag/Combined/src/HeavyIonCSVTagger.cc b/RecoBTag/Combined/src/HeavyIonCSVTagger.cc new file mode 100644 index 0000000000000..08ea2795f8fc9 --- /dev/null +++ b/RecoBTag/Combined/src/HeavyIonCSVTagger.cc @@ -0,0 +1,107 @@ +#include "RecoBTag/Combined/interface/HeavyIonCSVTagger.h" +#include "DataFormats/BTauReco/interface/CandIPTagInfo.h" +#include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h" +#include "FWCore/Utilities/interface/ESInputTag.h" +#include "CondFormats/DataRecord/interface/GBRWrapperRcd.h" +#include +#include +#include +#include + +HeavyIonCSVTagger::Tokens::Tokens(const edm::ParameterSet &configuration, edm::ESConsumesCollector &&cc) { + if (configuration.getParameter("useCondDB")) { + gbrForest_ = cc.consumes(edm::ESInputTag{"", + configuration.existsAs("gbrForestLabel") + ? configuration.getParameter("gbrForestLabel") + : ""}); + } +} +HeavyIonCSVTagger::HeavyIonCSVTagger(const edm::ParameterSet &configuration, Tokens tokens) + : sv_computer_(configuration.getParameter("sv_cfg")), + mva_name_(configuration.getParameter("mvaName")), + weight_file_(configuration.getParameter("weightFile")), + use_GBRForest_(configuration.getParameter("useGBRForest")), + use_adaBoost_(configuration.getParameter("useAdaBoost")), + tokens_{tokens} { + vpset vars_definition = configuration.getParameter("variables"); + + for (auto &var : vars_definition) { + MVAVar mva_var; + mva_var.name = var.getParameter("name"); + mva_var.id = reco::getTaggingVariableName(var.getParameter("taggingVarName")); + + mva_var.has_index = var.existsAs("idx"); + mva_var.index = mva_var.has_index ? var.getParameter("idx") : 0; + mva_var.default_value = var.getParameter("default"); + + variables_.push_back(mva_var); + } + + uses(0, "impactParameterTagInfos"); + uses(1, "secondaryVertexTagInfos"); +} + +void HeavyIonCSVTagger::initialize(const JetTagComputerRecord &record) { + mvaID_ = std::make_unique(); + + std::vector variable_names; + variable_names.reserve(variables_.size()); + + for (auto &var : variables_) { + variable_names.push_back(var.name); + } + std::vector spectators; + + if (tokens_.gbrForest_.isInitialized()) { + mvaID_->initializeGBRForest(&record.get(tokens_.gbrForest_), variable_names, spectators, use_adaBoost_); + } else { + mvaID_->initialize("Color:Silent:Error", + mva_name_, + weight_file_.fullPath(), + variable_names, + spectators, + use_GBRForest_, + use_adaBoost_); + } +} + +HeavyIonCSVTagger::~HeavyIonCSVTagger() {} + +/// b-tag a jet based on track-to-jet parameters in the extened info collection +float HeavyIonCSVTagger::discriminator(const TagInfoHelper &tagInfo) const { + // default value, used if there are no leptons associated to this jet + const reco::TrackIPTagInfo &ip_info = tagInfo.get(0); + const reco::SecondaryVertexTagInfo &sv_info = tagInfo.get(1); + reco::TaggingVariableList vars = sv_computer_(ip_info, sv_info); + + // Loop over input variables + std::map inputs; + + bool notTaggable = false; + std::vector tagValList = vars.getList(reco::btau::trackSip3dSig, false); + bool noTrack = (tagValList.empty()); + bool noVertex = (vars.get(reco::btau::vertexCategory, -1.0) == 2); + + for (auto &mva_var : variables_) { + //vectorial tagging variable + if (mva_var.has_index) { + std::vector vals = vars.getList(mva_var.id, false); + inputs[mva_var.name] = (vals.size() > mva_var.index) ? vals[mva_var.index] : mva_var.default_value; + } + //single value tagging var + else { + inputs[mva_var.name] = vars.get(mva_var.id, mva_var.default_value); + } + } + + if (noTrack && noVertex) + notTaggable = true; + + //get the MVA output + float tag = (mvaID_->evaluate(inputs) + 1.) / 2.; + + if (notTaggable) + tag = -1; + + return tag; +} diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexV2BJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexV2BJetTags_cfi.py index c4a4a33c8f9b5..edaf62b09956f 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexV2BJetTags_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexV2BJetTags_cfi.py @@ -5,3 +5,5 @@ tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), cms.InputTag("secondaryVertexTagInfos")) ) +from Configuration.Eras.Modifier_pp_on_AA_2018_cff import pp_on_AA_2018 +pp_on_AA_2018.toModify(combinedSecondaryVertexV2BJetTags,jetTagComputer = 'heavyIonCSVComputer')