diff --git a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py index e16e9aedc0fd0..0a8d339209139 100644 --- a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py +++ b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py @@ -1774,6 +1774,7 @@ def setup_(self, step, stepName, stepDict, k, properties): stepDict[stepName][k] = merge([stepDict[step][k]]) def condition(self, fragment, stepList, key, hasHarvest): return fragment=="TTbar_14TeV" and 'Run4' in key + upgradeWFs['HLTTiming75e33'] = UpgradeWorkflow_HLT75e33Timing( steps = [ 'Reco', @@ -1794,7 +1795,7 @@ def condition(self, fragment, stepList, key, hasHarvest): 'DigiTrigger', 'ALCA', 'ALCAPhase2', - 'HARVESTGlobal' + 'HARVESTGlobal', 'RecoGlobalFakeHLT', 'HLT75e33', 'HARVESTGlobal', @@ -1920,6 +1921,61 @@ def condition(self, fragment, stepList, key, hasHarvest): '-s':'HARVESTING:@hltValidation' } +class UpgradeWorkflow_HLTPhase2_WithNano(UpgradeWorkflow): + def setup_(self, step, stepName, stepDict, k, properties): + # skip RECO, ALCA and HLT + if ('ALCA' in step) or ('Reco' in step) or ('HLT' in step) or ('HARVEST' in step): + stepDict[stepName][k] = None + elif 'DigiTrigger' in step: + stepDict[stepName][k] = merge([self.step2, stepDict[step][k]]) + else: + stepDict[stepName][k] = merge([stepDict[step][k]]) + def condition(self, fragment, stepList, key, hasHarvest): + return fragment=="TTbar_14TeV" and 'Run4' in key + +upgradeWFs['HLTPhaseWithNano'] = UpgradeWorkflow_HLTPhase2_WithNano( + steps = [ + 'Reco', + 'RecoGlobal', + 'RecoNano', + 'DigiTrigger', + 'ALCA', + 'ALCAPhase2', + 'RecoGlobalFakeHLT', + 'HLT75e33', + 'HARVESTGlobal', + 'HARVESTGlobalFakeHLT', + ], + PU = [ + 'Reco', + 'RecoGlobal', + 'RecoNano', + 'DigiTrigger', + 'ALCA', + 'ALCAPhase2', + 'RecoGlobalFakeHLT', + 'HLT75e33', + 'HARVESTGlobal', + 'HARVESTGlobalFakeHLT', + ], + suffix = '_HLTPhaseWithNano', + offset = 0.759, +) +upgradeWFs['HLTPhaseWithNano'].step2 = { + '-s':'DIGI:pdigi_valid,L1TrackTrigger,L1,L1P2GT,DIGI2RAW,HLT:75e33,NANO:@Phase2HLT', + '--datatier':'GEN-SIM-DIGI-RAW,NANOAODSIM', + '--eventcontent':'FEVTDEBUGHLT,NANOAODSIM' +} + +upgradeWFs['NGTScoutingWithNano'] = deepcopy(upgradeWFs['HLTPhaseWithNano']) +upgradeWFs['NGTScoutingWithNano'].suffix = '_NGTScoutingWithNano' +upgradeWFs['NGTScoutingWithNano'].offset = 0.771 +upgradeWFs['NGTScoutingWithNano'].step2 = { + '-s':'DIGI:pdigi_valid,L1TrackTrigger,L1,L1P2GT,DIGI2RAW,HLT:NGTScouting,NANO:@NGTScouting', + '--datatier':'GEN-SIM-DIGI-RAW,NANOAODSIM', + '--eventcontent':'FEVTDEBUGHLT,NANOAODSIM' +} + class UpgradeWorkflow_HLTwDIGI75e33(UpgradeWorkflow): def setup_(self, step, stepName, stepDict, k, properties): if 'DigiTrigger' in step: diff --git a/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTagsModEta2p4_cfi.py b/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTagsModEta2p4_cfi.py index 47bafe0743714..e7c35a044700f 100644 --- a/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTagsModEta2p4_cfi.py +++ b/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTagsModEta2p4_cfi.py @@ -19,5 +19,7 @@ mightGet = cms.optional.untracked.vstring, model_path = cms.FileInPath('RecoBTag/Combined/data/DeepFlavourV02_PhaseII/DeepJet_retraining_phase2_new_inputs.onnx'), output_names = cms.vstring(), - src = cms.InputTag("hltPfDeepFlavourTagInfosModEta2p4") + src = cms.InputTag("hltPfDeepFlavourTagInfosModEta2p4"), + produceValueMap = cms.untracked.bool(True), + jets = cms.InputTag("hltPFPuppiJetForBtagEta2p4") ) diff --git a/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTags_cfi.py b/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTags_cfi.py index bae231ffdf67f..416ed33df6ede 100644 --- a/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTags_cfi.py +++ b/HLTrigger/Configuration/python/HLT_75e33/modules/hltPfDeepFlavourJetTags_cfi.py @@ -19,5 +19,7 @@ mightGet = cms.optional.untracked.vstring, model_path = cms.FileInPath('RecoBTag/Combined/data/DeepFlavourV02_PhaseII/DeepJet_retraining_phase2_new_inputs.onnx'), output_names = cms.vstring(), - src = cms.InputTag("hltPfDeepFlavourTagInfos") + src = cms.InputTag("hltPfDeepFlavourTagInfos"), + produceValueMap = cms.untracked.bool(True), + jets = cms.InputTag("hltAK4PFPuppiJets") ) diff --git a/HLTrigger/Configuration/python/HLT_75e33/paths/DST_PFScouting_cfi.py b/HLTrigger/Configuration/python/HLT_75e33/paths/DST_PFScouting_cfi.py index 497bd9628f788..f312cc790442a 100644 --- a/HLTrigger/Configuration/python/HLT_75e33/paths/DST_PFScouting_cfi.py +++ b/HLTrigger/Configuration/python/HLT_75e33/paths/DST_PFScouting_cfi.py @@ -15,6 +15,11 @@ from ..modules.hltParticleFlowRecHitECALUnseeded_cfi import * from ..modules.hltPhase2L3MuonCandidates_cfi import * from ..modules.hltEgammaEleL1TrkIsoUnseeded_cfi import * +from ..modules.hltEgammaClusterShapeUnseeded_cfi import * +from ..modules.hltEgammaR9Unseeded_cfi import * +from ..modules.hltEgammaEcalPFClusterIsoUnseeded_cfi import * +from ..modules.hltEgammaEleGsfTrackIsoUnseeded_cfi import * +from ..modules.hltEgammaHcalPFClusterIsoUnseeded_cfi import * from ..sequences.HLTAK4PFJetsReconstruction_cfi import * from ..sequences.HLTAK4PFPuppiJetsReconstruction_cfi import * from ..sequences.HLTBeginSequence_cfi import * @@ -55,6 +60,11 @@ + HLTElePixelMatchUnseededSequence + HLTGsfElectronUnseededSequence + hltEgammaEleL1TrkIsoUnseeded + + hltEgammaClusterShapeUnseeded + + hltEgammaR9Unseeded + + hltEgammaEcalPFClusterIsoUnseeded + + hltEgammaEleGsfTrackIsoUnseeded + + hltEgammaHcalPFClusterIsoUnseeded + hltPhase2L3MuonCandidates + HLTPhase2L3MuonGeneralTracksSequence + HLTAK4PFJetsReconstruction diff --git a/HLTrigger/NGTScouting/plugins/BuildFile.xml b/HLTrigger/NGTScouting/plugins/BuildFile.xml new file mode 100644 index 0000000000000..232a1648cc203 --- /dev/null +++ b/HLTrigger/NGTScouting/plugins/BuildFile.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/HLTrigger/NGTScouting/plugins/HLTElectronTableProducer.cc b/HLTrigger/NGTScouting/plugins/HLTElectronTableProducer.cc new file mode 100644 index 0000000000000..23cc292dac076 --- /dev/null +++ b/HLTrigger/NGTScouting/plugins/HLTElectronTableProducer.cc @@ -0,0 +1,22 @@ +#include + +// user include files +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" + +#include "DataFormats/NanoAOD/interface/FlatTable.h" + +#include "PhysicsTools/NanoAOD/interface/SimpleFlatTableProducer.h" +#include "DataFormats/Scouting/interface/Run3ScoutingElectron.h" +typedef SimpleFlatTableProducer HLTElectronTableProducer; + +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(HLTElectronTableProducer); diff --git a/HLTrigger/NGTScouting/plugins/HLTPhotonTableProducer.cc b/HLTrigger/NGTScouting/plugins/HLTPhotonTableProducer.cc new file mode 100644 index 0000000000000..fcf314b071b81 --- /dev/null +++ b/HLTrigger/NGTScouting/plugins/HLTPhotonTableProducer.cc @@ -0,0 +1,22 @@ +#include + +// user include files +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" + +#include "DataFormats/NanoAOD/interface/FlatTable.h" + +#include "PhysicsTools/NanoAOD/interface/SimpleFlatTableProducer.h" +#include "DataFormats/Scouting/interface/Run3ScoutingPhoton.h" +typedef SimpleFlatTableProducer HLTPhotonTableProducer; + +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(HLTPhotonTableProducer); diff --git a/HLTrigger/NGTScouting/plugins/HLTVertexTableProducer.cc b/HLTrigger/NGTScouting/plugins/HLTVertexTableProducer.cc new file mode 100644 index 0000000000000..d2cf14365a4c4 --- /dev/null +++ b/HLTrigger/NGTScouting/plugins/HLTVertexTableProducer.cc @@ -0,0 +1,194 @@ +#include + +// user include files +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h" + +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" + +#include "DataFormats/NanoAOD/interface/FlatTable.h" +#include "RecoVertex/VertexTools/interface/VertexDistance3D.h" +#include "RecoVertex/VertexTools/interface/VertexDistanceXY.h" +#include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h" +#include "RecoVertex/VertexPrimitives/interface/VertexState.h" +#include "DataFormats/Common/interface/ValueMap.h" + +#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h" + +// +// class declaration +// + +class HLTVertexTableProducer : public edm::stream::EDProducer<> { +public: + explicit HLTVertexTableProducer(const edm::ParameterSet&); + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void produce(edm::Event&, const edm::EventSetup&) override; + + // ----------member data --------------------------- + const edm::EDGetTokenT> pvs_; + const edm::EDGetTokenT pfc_; + const edm::EDGetTokenT> pvsScore_; + const StringCutObjectSelector goodPvCut_; + const std::string goodPvCutString_; + const std::string pvName_; + const double dlenMin_, dlenSigMin_; +}; + +// +// constructors +// + +HLTVertexTableProducer::HLTVertexTableProducer(const edm::ParameterSet& params) + : pvs_(consumes>(params.getParameter("pvSrc"))), + pfc_(consumes(params.getParameter("pfSrc"))), + pvsScore_(consumes>(params.getParameter("pvSrc"))), + goodPvCut_(params.getParameter("goodPvCut"), true), + goodPvCutString_(params.getParameter("goodPvCut")), + pvName_(params.getParameter("pvName")), + dlenMin_(params.getParameter("dlenMin")), + dlenSigMin_(params.getParameter("dlenSigMin")) + +{ + produces("PV"); + produces>(); +} + +// +// member functions +// + +// ------------ method called to produce the data ------------ +void HLTVertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { + using namespace edm; + + //vertex collection + auto pvsIn = iEvent.getHandle(pvs_); + if (!pvsIn.isValid()) { + edm::LogWarning("HLTVertexTableProducer") + << "Invalid handle for " << pvName_ << " in primary vertex input collection"; + return; + } + const auto& pvsScoreProd = iEvent.get(pvsScore_); + + //pf candidates collection + auto pfcIn = iEvent.getHandle(pfc_); + if (!pfcIn.isValid()) { + edm::LogWarning("HLTVertexTableProducer") + << "Invalid handle for " << pvName_ << " in PF candidate input collection"; + return; + } + + std::vector v_ndof; + std::vector v_chi2; + std::vector v_x; + std::vector v_y; + std::vector v_z; + std::vector v_xError; + std::vector v_yError; + std::vector v_zError; + std::vector v_is_good; + std::vector v_nTracks; + std::vector v_pv_score; + std::vector v_pv_sumpt2; + std::vector v_pv_sumpx; + std::vector v_pv_sumpy; + + for (size_t i = 0; i < (*pvsIn).size(); i++) { + v_ndof.push_back((*pvsIn)[i].ndof()); + v_chi2.push_back((*pvsIn)[i].normalizedChi2()); + v_x.push_back((*pvsIn)[i].x()); + v_y.push_back((*pvsIn)[i].y()); + v_z.push_back((*pvsIn)[i].z()); + v_xError.push_back((*pvsIn)[i].xError()); + v_yError.push_back((*pvsIn)[i].yError()); + v_zError.push_back((*pvsIn)[i].zError()); + v_nTracks.push_back((*pvsIn)[i].nTracks()); + v_is_good.push_back(goodPvCut_((*pvsIn)[i])); + v_pv_score.push_back(pvsScoreProd.get(pvsIn.id(), i)); + + float pv_sumpt2 = 0; + float pv_sumpx = 0; + float pv_sumpy = 0; + for (const auto& obj : *pfcIn) { + // skip neutrals + if (obj.charge() == 0) + continue; + double dz = fabs(obj.trackRef()->dz((*pvsIn)[i].position())); + bool include_pfc = false; + if (dz < 0.2) { + include_pfc = true; + for (size_t j = 0; j < (*pvsIn).size() && j != i; j++) { + double newdz = fabs(obj.trackRef()->dz((*pvsIn)[j].position())); + if (newdz < dz) { + include_pfc = false; + break; + } + } // this pf candidate belongs to other PV + } + if (include_pfc) { + float pfc_pt = obj.pt(); + pv_sumpt2 += pfc_pt * pfc_pt; + pv_sumpx += obj.px(); + pv_sumpy += obj.py(); + } + } + + v_pv_sumpt2.push_back(pv_sumpt2); + v_pv_sumpx.push_back(pv_sumpx); + v_pv_sumpy.push_back(pv_sumpy); + } + + //table for all primary vertices + auto pvTable = std::make_unique((*pvsIn).size(), pvName_, true); + pvTable->addColumn("ndof", v_ndof, "primary vertex number of degrees of freedom", 8); + pvTable->addColumn("chi2", v_chi2, "primary vertex reduced chi2", 8); + pvTable->addColumn("x", v_x, "primary vertex x coordinate", 10); + pvTable->addColumn("y", v_y, "primary vertex y coordinate", 10); + pvTable->addColumn("z", v_z, "primary vertex z coordinate", 16); + pvTable->addColumn("xError", v_xError, "primary vertex error in x coordinate", 10); + pvTable->addColumn("yError", v_yError, "primary vertex error in y coordinate", 10); + pvTable->addColumn("zError", v_zError, "primary vertex error in z coordinate", 16); + pvTable->addColumn( + "isGood", v_is_good, "wheter the primary vertex passes selection: " + goodPvCutString_ + ")"); + pvTable->addColumn("nTracks", v_nTracks, "primary vertex number of associated tracks"); + pvTable->addColumn("score", v_pv_score, "primary vertex score, i.e. sum pt2 of clustered objects", 8); + pvTable->addColumn( + "sumpt2", v_pv_sumpt2, "sum pt2 of pf charged candidates within dz=0.2 for the main primary vertex", 10); + pvTable->addColumn( + "sumpx", v_pv_sumpx, "sum px of pf charged candidates within dz=0.2 for the main primary vertex", 10); + pvTable->addColumn( + "sumpy", v_pv_sumpy, "sum py of pf charged candidates within dz=0.2 for the main primary vertex", 10); + + iEvent.put(std::move(pvTable), "PV"); +} + +// ------------ fill 'descriptions' with the allowed parameters for the module ------------ +void HLTVertexTableProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + desc.add("pvName")->setComment("name of the flat table ouput"); + desc.add("pvSrc")->setComment( + "std::vector and ValueMap primary vertex input collections"); + desc.add("pfSrc")->setComment("reco::PFCandidateCollection PF candidates input collections"); + desc.add("goodPvCut")->setComment("selection on the primary vertex"); + + desc.add("dlenMin")->setComment("minimum value of dl to select secondary vertex"); + desc.add("dlenSigMin")->setComment("minimum value of dl significance to select secondary vertex"); + + descriptions.addWithDefaultLabel(desc); +} + +// ------------ define this as a plug-in ------------ +DEFINE_FWK_MODULE(HLTVertexTableProducer); diff --git a/HLTrigger/NGTScouting/python/HLTNanoProducer_cff.py b/HLTrigger/NGTScouting/python/HLTNanoProducer_cff.py new file mode 100644 index 0000000000000..9223c2e09293c --- /dev/null +++ b/HLTrigger/NGTScouting/python/HLTNanoProducer_cff.py @@ -0,0 +1,64 @@ +import FWCore.ParameterSet.Config as cms + +from PhysicsTools.NanoAOD.common_cff import * + +from PhysicsTools.NanoAOD.genparticles_cff import * +from PhysicsTools.PatAlgos.slimming.prunedGenParticles_cfi import * +from HLTrigger.NGTScouting.hltVertices_cfi import * +from HLTrigger.NGTScouting.hltEGammaPacker_cfi import * +from HLTrigger.NGTScouting.hltPhotons_cfi import * +from HLTrigger.NGTScouting.hltElectrons_cfi import * +from HLTrigger.NGTScouting.hltMuons_cfi import * +from HLTrigger.NGTScouting.hltTracks_cfi import * +from HLTrigger.NGTScouting.hltJets_cfi import * +from HLTrigger.NGTScouting.hltTriggerAcceptFilter_cfi import hltTriggerAcceptFilter,dstTriggerAcceptFilter + +hltNanoProducer = cms.Sequence( + prunedGenParticles + + finalGenParticles + + genParticleTable + + hltTriggerAcceptFilter + + hltVertexTable + + hltPixelTrackTable + + hltGeneralTrackTable + + hltEgammaPacker + + hltPhotonTable + + hltElectronTable + + hltPhase2L3MuonIdTracks + + hltMuonTable + + hltPFCandidateTable + + hltJetTable +) + +dstNanoProducer = cms.Sequence( + prunedGenParticles + + finalGenParticles + + genParticleTable + + dstTriggerAcceptFilter + + hltVertexTable + + hltPixelTrackTable + + hltGeneralTrackTable + + hltEgammaPacker + + hltPhotonTable + + hltElectronTable + + hltPhase2L3MuonIdTracks + + hltMuonTable + + hltPFCandidateTable + + hltJetTable +) + +def hltNanoCustomize(process): + + if hasattr(process, "NANOAODSIMoutput"): + process.prunedGenParticles.src = "genParticles" + process.genParticleTable.externalVariables = cms.PSet() # remove iso as external variable from PhysicsTools/NanoAOD/python/genparticles_cff.py:37 (hopefully temporarily) + process.NANOAODSIMoutput.outputCommands.append( + "keep nanoaodFlatTable_*Table*_*_*" + ) + process.NANOAODSIMoutput.SelectEvents = cms.untracked.PSet( + SelectEvents = cms.vstring( + [p for p in process.paths if p.startswith('HLT_') or p.startswith('DST_')] + ) + ) + + return process diff --git a/HLTrigger/NGTScouting/python/hltEGammaPacker_cfi.py b/HLTrigger/NGTScouting/python/hltEGammaPacker_cfi.py new file mode 100644 index 0000000000000..9878e653b8c38 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltEGammaPacker_cfi.py @@ -0,0 +1,28 @@ +import FWCore.ParameterSet.Config as cms + +hltEgammaPacker = cms.EDProducer( "HLTScoutingEgammaProducer", + EgammaCandidates = cms.InputTag( "hltEgammaCandidatesUnseeded" ), + EgammaGsfTracks = cms.InputTag( "hltEgammaGsfTracksUnseeded" ), + SigmaIEtaIEtaMap = cms.InputTag( 'hltEgammaClusterShapeUnseeded','sigmaIEtaIEta5x5NoiseCleaned' ), + r9Map = cms.InputTag( 'hltEgammaR9Unseeded','r95x5' ), + HoverEMap = cms.InputTag( "hltEgammaHoverEUnseeded" ), + DetaMap = cms.InputTag( 'hltEgammaBestGsfTrackVarsUnseeded','DetaSeed' ), + DphiMap = cms.InputTag( 'hltEgammaBestGsfTrackVarsUnseeded','Dphi' ), + MissingHitsMap = cms.InputTag( 'hltEgammaBestGsfTrackVarsUnseeded','MissingHits' ), + OneOEMinusOneOPMap = cms.InputTag( 'hltEgammaBestGsfTrackVarsUnseeded','OneOESuperMinusOneOP' ), + fBremMap = cms.InputTag( 'hltEgammaBestGsfTrackVarsUnseeded','fbrem' ), + EcalPFClusterIsoMap = cms.InputTag( "hltEgammaEcalPFClusterIsoUnseeded" ), + EleGsfTrackIsoMap = cms.InputTag( "hltEgammaEleGsfTrackIsoUnseeded" ), + HcalPFClusterIsoMap = cms.InputTag( "hltEgammaHcalPFClusterIsoUnseeded" ), + egammaPtCut = cms.double( 2.0 ), + egammaEtaCut = cms.double( 3.2 ), + egammaHoverECut = cms.double( 9999.0 ), + egammaSigmaIEtaIEtaCut = cms.vdouble( 99999.0, 99999.0 ), + absEtaBinUpperEdges = cms.vdouble( 1.479, 5.0 ), + saveRecHitTiming = cms.bool( False ), + mantissaPrecision = cms.int32( 10 ), + rechitMatrixSize = cms.int32( 10 ), + rechitZeroSuppression = cms.bool( True ), + ecalRechitEB = cms.InputTag( 'hltEcalRecHit','EcalRecHitsEB' ), + ecalRechitEE = cms.InputTag( 'hltEcalRecHit','EcalRecHitsEE' ) +) diff --git a/HLTrigger/NGTScouting/python/hltElectrons_cfi.py b/HLTrigger/NGTScouting/python/hltElectrons_cfi.py new file mode 100644 index 0000000000000..66d2b6eea4afe --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltElectrons_cfi.py @@ -0,0 +1,31 @@ +import FWCore.ParameterSet.Config as cms +from PhysicsTools.NanoAOD.common_cff import * + +##################### Tables for final output and docs ########################## +hltElectronTable = cms.EDProducer("HLTElectronTableProducer", + src = cms.InputTag("hltEgammaPacker"), + cut = cms.string(""), + name = cms.string("hltElectron"), + doc = cms.string("HLT Electron information"), + singleton = cms.bool(False), + extension = cms.bool(False), + variables = cms.PSet( + pt = Var('pt', 'float', precision=10, doc='super-cluster (SC) pt'), + eta = Var('eta', 'float', precision=10, doc='SC eta'), + phi = Var('phi', 'float', precision=10, doc='SC phi'), + m = Var('m', 'float', precision=10, doc='SC mass'), + dEtaIn = Var('dEtaIn', 'float', precision=10, doc='#Delta#eta(SC seed, track pixel seed)'), + dPhiIn = Var('dPhiIn', 'float', precision=10, doc='#Delta#phi(SC seed, track pixel seed)'), + sigmaIetaIeta = Var('sigmaIetaIeta', 'float', precision=10, doc='sigmaIetaIeta of the SC, calculated with full 5x5 region, noise cleaned'), + hOverE = Var('hOverE', 'float', precision=10, doc='Energy in HCAL / Energy in ECAL'), + ooEMOop = Var('ooEMOop', 'float', precision=10, doc='1/E(SC) - 1/p(track momentum)'), + missingHits = Var('missingHits', 'int', doc='missing hits in the tracker'), + ecalIso = Var('ecalIso', 'float', precision=10, doc='Isolation of SC in the ECAL'), + hcalIso = Var('hcalIso', 'float', precision=10, doc='Isolation of SC in the HCAL'), + trackIso = Var('trackIso', 'float', precision=10, doc='Isolation of electron track in the tracker'), + r9 = Var('r9', 'float', precision=10, doc='ELectron SC r9 as defined in https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideEgammaShowerShape'), + sMin = Var('sMin', 'float', precision=10, doc='minor moment of the SC shower shape'), + sMaj = Var('sMaj', 'float', precision=10, doc='major moment of the SC shower shape'), + seedId = Var('seedId', 'int', doc='ECAL ID of the SC seed'), + ) +) diff --git a/HLTrigger/NGTScouting/python/hltJets_cfi.py b/HLTrigger/NGTScouting/python/hltJets_cfi.py new file mode 100644 index 0000000000000..0ed0ec0230699 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltJets_cfi.py @@ -0,0 +1,47 @@ +import FWCore.ParameterSet.Config as cms +from PhysicsTools.NanoAOD.common_cff import * + +hltPFCandidateTable = cms.EDProducer("SimplePFCandidateFlatTableProducer", + src = cms.InputTag("hltParticleFlowTmp"), + name = cms.string("hltPFCandidate"), + cut = cms.string(""), + doc = cms.string("HLT PF information"), + singleton = cms.bool(False), + extension = cms.bool(False), + variables = cms.PSet( + CandVars, + trackIndex = Var("trackRef().key()", "uint8", doc="track index") + ), + ) + +hltJetTable = cms.EDProducer("SimplePFJetFlatTableProducer", + src = cms.InputTag("hltAK4PFPuppiJets"), + name = cms.string("hltAK4PuppiJet"), + cut = cms.string(""), + doc = cms.string("HLT PUPPI jets information"), + singleton = cms.bool(False), + extension = cms.bool(False), + externalVariables = cms.PSet( + DeepFlavour_prob_b = ExtVar(cms.InputTag("hltPfDeepFlavourJetTags:probb"), float, doc="DeepFlavour probability of b", precision=10), + DeepFalvour_prob_bb = ExtVar(cms.InputTag('hltPfDeepFlavourJetTags:probbb'), float, doc="DeepFlavour probability of bb", precision=10), + DeepFalvour_prob_c = ExtVar(cms.InputTag('hltPfDeepFlavourJetTags:probc'), float, doc="DeepFlavour probability of c", precision=10), + DeepFalvour_prob_uds = ExtVar(cms.InputTag('hltPfDeepFlavourJetTags:probuds'), float, doc="DeepFlavour probability of uds", precision=10), + DeepFalvour_prob_g = ExtVar(cms.InputTag('hltPfDeepFlavourJetTags:probg'), float, doc="DeepFlavour probability of g", precision=10), + DeepFalvour_prob_lepb = ExtVar(cms.InputTag('hltPfDeepFlavourJetTags:problepb'), float, doc="DeepFlavour probability of lepb", precision=10), + ), + variables = cms.PSet( + P4Vars, + area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), + chHEF = Var("chargedHadronEnergy()/(chargedHadronEnergy()+neutralHadronEnergy()+photonEnergy()+electronEnergy()+muonEnergy())", float, doc="charged Hadron Energy Fraction", precision= 6), + neHEF = Var("neutralHadronEnergy()/(chargedHadronEnergy()+neutralHadronEnergy()+photonEnergy()+electronEnergy()+muonEnergy())", float, doc="neutral Hadron Energy Fraction", precision= 6), + chEmEF = Var("(electronEnergy()+muonEnergy())/(chargedHadronEnergy()+neutralHadronEnergy()+photonEnergy()+electronEnergy()+muonEnergy())", float, doc="charged Electromagnetic Energy Fraction", precision= 6), + neEmEF = Var("(photonEnergy())/(chargedHadronEnergy()+neutralHadronEnergy()+photonEnergy()+electronEnergy()+muonEnergy())", float, doc="neutral Electromagnetic Energy Fraction", precision= 6), + muEF = Var("(muonEnergy())/(chargedHadronEnergy()+neutralHadronEnergy()+photonEnergy()+electronEnergy()+muonEnergy())", float, doc="muon Energy Fraction", precision= 6), + nCh = Var("chargedHadronMultiplicity()", int, doc="number of charged hadrons in the jet"), + nNh = Var("neutralHadronMultiplicity()", int, doc="number of neutral hadrons in the jet"), + nMuons = Var("muonMultiplicity()", int, doc="number of muons in the jet"), + nElectrons = Var("electronMultiplicity()", int, doc="number of electrons in the jet"), + nPhotons = Var("photonMultiplicity()", int, doc="number of photons in the jet"), + nConstituents = Var("numberOfDaughters()", "uint8", doc="number of particles in the jet") + ), +) diff --git a/HLTrigger/NGTScouting/python/hltMuons_cfi.py b/HLTrigger/NGTScouting/python/hltMuons_cfi.py new file mode 100644 index 0000000000000..8364edfedd792 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltMuons_cfi.py @@ -0,0 +1,31 @@ +import FWCore.ParameterSet.Config as cms +from PhysicsTools.NanoAOD.common_cff import * + +hltPhase2L3MuonIdTracks = cms.EDProducer("MuonTrackProducer", + muonsTag = cms.InputTag("hltPhase2L3Muons"), + inputDTRecSegment4DCollection = cms.InputTag("hltDt4DSegments"), + inputCSCSegmentCollection = cms.InputTag("hltCscSegments"), + selectionTags = cms.vstring('All'), + trackType = cms.string('recomuonTrack'), + ignoreMissingMuonCollection = cms.untracked.bool(False) +) + +hltMuonTable = cms.EDProducer( + "SimpleTriggerTrackFlatTableProducer", + src = cms.InputTag("hltPhase2L3MuonIdTracks"), + cut = cms.string(""), + name = cms.string("hltMuon"), + doc = cms.string("HLT Muon information"), + extension = cms.bool(False), + variables = cms.PSet( + pt = Var("pt()", "float", doc = "p_T (GeV)"), + eta = Var("eta()", "float", doc = "#eta"), + phi = Var("phi()", "float", doc = "#phi (rad)"), + dXY = Var("dxy()", "float", doc = "dXY (cm)"), + dZ = Var("dz()", "float", doc = "dZ (cm)"), + t0 = Var("t0()", "float", doc = "t0 (ns)"), + nPixelHits = Var("hitPattern().numberOfValidPixelHits()", "int16", doc = ""), + nTrkLays = Var("hitPattern().trackerLayersWithMeasurement()", "int16", doc = ""), + nMuHits = Var("hitPattern().numberOfValidMuonHits()", "int16", doc = "") + ) +) diff --git a/HLTrigger/NGTScouting/python/hltPhotons_cfi.py b/HLTrigger/NGTScouting/python/hltPhotons_cfi.py new file mode 100644 index 0000000000000..308999cc4da84 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltPhotons_cfi.py @@ -0,0 +1,26 @@ +import FWCore.ParameterSet.Config as cms +from PhysicsTools.NanoAOD.common_cff import * + +##################### Tables for final output and docs ########################## +hltPhotonTable = cms.EDProducer("HLTPhotonTableProducer", + src = cms.InputTag("hltEgammaPacker"), + cut = cms.string(""), + name = cms.string("hltPhoton"), + doc = cms.string("HLT Photon information"), + singleton = cms.bool(False), + extension = cms.bool(False), + variables = cms.PSet( + pt = Var('pt', 'float', precision=10, doc='super-cluster (SC) pt'), + eta = Var('eta', 'float', precision=10, doc='SC eta'), + phi = Var('phi', 'float', precision=10, doc='SC phi'), + m = Var('m', 'float', precision=10, doc='SC mass'), + sigmaIetaIeta = Var('sigmaIetaIeta', 'float', precision=10, doc='sigmaIetaIeta of the SC, calculated with full 5x5 region, noise cleaned'), + hOverE = Var('hOverE', 'float', precision=10, doc='Energy in HCAL / Energy in ECAL'), + ecalIso = Var('ecalIso', 'float', precision=10, doc='Isolation of SC in the ECAL'), + hcalIso = Var('hcalIso', 'float', precision=10, doc='Isolation of SC in the HCAL'), + r9 = Var('r9', 'float', precision=10, doc='Photon SC r9 as defined in https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideEgammaShowerShape'), + sMin = Var('sMin', 'float', precision=10, doc='minor moment of the SC shower shape'), + sMaj = Var('sMaj', 'float', precision=10, doc='major moment of the SC shower shape'), + seedId = Var('seedId', 'int', doc='ECAL ID of the SC seed'), + ) +) diff --git a/HLTrigger/NGTScouting/python/hltTracks_cfi.py b/HLTrigger/NGTScouting/python/hltTracks_cfi.py new file mode 100644 index 0000000000000..77cbba90eea71 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltTracks_cfi.py @@ -0,0 +1,42 @@ +import FWCore.ParameterSet.Config as cms +from PhysicsTools.NanoAOD.common_cff import * + +hltPixelTrackTable = cms.EDProducer( + "SimpleTriggerTrackFlatTableProducer", + src = cms.InputTag("hltPhase2PixelTracks"), + cut = cms.string(""), + name = cms.string("hltPixelTrack"), + doc = cms.string("HLT Pixel Track information"), + extension = cms.bool(False), + variables = cms.PSet( + pt = Var("pt()", "float", doc = "p_T (GeV)"), + eta = Var("eta()", "float", doc = "#eta"), + phi = Var("phi()", "float", doc = "#phi (rad)"), + dXY = Var("dxy()", "float", doc = "dXY (cm)"), + dZ = Var("dz()", "float", doc = "dZ (cm)"), + t0 = Var("t0()", "float", doc = "t0 (ns)"), + nPixelHits = Var("hitPattern().numberOfValidPixelHits()", "int16", doc = ""), + nTrkLays = Var("hitPattern().trackerLayersWithMeasurement()", "int16", doc = ""), + nMuHits = Var("hitPattern().numberOfValidMuonHits()", "int16", doc = "") + ) +) + +hltGeneralTrackTable = cms.EDProducer( + "SimpleTriggerTrackFlatTableProducer", + src = cms.InputTag("hltGeneralTracks"), + cut = cms.string(""), + name = cms.string("hltGeneralTrack"), + doc = cms.string("HLT General Track information"), + extension = cms.bool(False), + variables = cms.PSet( + pt = Var("pt()", "float", doc = "p_T (GeV)"), + eta = Var("eta()", "float", doc = "#eta"), + phi = Var("phi()", "float", doc = "#phi (rad)"), + dXY = Var("dxy()", "float", doc = "dXY (cm)"), + dZ = Var("dz()", "float", doc = "dZ (cm)"), + t0 = Var("t0()", "float", doc = "t0 (ns)"), + nPixelHits = Var("hitPattern().numberOfValidPixelHits()", "int16", doc = ""), + nTrkLays = Var("hitPattern().trackerLayersWithMeasurement()", "int16", doc = ""), + nMuHits = Var("hitPattern().numberOfValidMuonHits()", "int16", doc = "") + ) +) diff --git a/HLTrigger/NGTScouting/python/hltTriggerAcceptFilter_cfi.py b/HLTrigger/NGTScouting/python/hltTriggerAcceptFilter_cfi.py new file mode 100644 index 0000000000000..8fd1e9ac577c5 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltTriggerAcceptFilter_cfi.py @@ -0,0 +1,20 @@ +import FWCore.ParameterSet.Config as cms +from HLTrigger.HLTfilters.triggerResultsFilter_cfi import triggerResultsFilter as _triggerResultsFilter + +hltTriggerAcceptFilter = _triggerResultsFilter.clone( + usePathStatus = cms.bool( True ), + hltResults = cms.InputTag( "" ), + l1tResults = cms.InputTag( "" ), + l1tIgnoreMaskAndPrescale = cms.bool( False ), + throw = cms.bool( False ), + triggerConditions = cms.vstring('HLT_*') +) + +dstTriggerAcceptFilter = _triggerResultsFilter.clone( + usePathStatus = cms.bool( True ), + hltResults = cms.InputTag( "" ), + l1tResults = cms.InputTag( "" ), + l1tIgnoreMaskAndPrescale = cms.bool( False ), + throw = cms.bool( False ), + triggerConditions = cms.vstring('DST_*') +) diff --git a/HLTrigger/NGTScouting/python/hltVertices_cfi.py b/HLTrigger/NGTScouting/python/hltVertices_cfi.py new file mode 100644 index 0000000000000..87c9baca099a6 --- /dev/null +++ b/HLTrigger/NGTScouting/python/hltVertices_cfi.py @@ -0,0 +1,13 @@ +import FWCore.ParameterSet.Config as cms +from PhysicsTools.NanoAOD.common_cff import * + +##################### Tables for final output and docs ########################## +hltVertexTable = cms.EDProducer( + "HLTVertexTableProducer", + pvSrc = cms.InputTag("hltOfflinePrimaryVertices"), + goodPvCut = cms.string("!isFake && ndof >= 4.0 && abs(z) <= 24.0 && abs(position.Rho) <= 2.0"), + pfSrc = cms.InputTag("hltParticleFlowTmp"), + dlenMin = cms.double(0), + dlenSigMin = cms.double(3), + pvName = cms.string("hltPrimaryVertex"), +) diff --git a/PhysicsTools/NanoAOD/plugins/SimpleFlatTableProducerPlugins.cc b/PhysicsTools/NanoAOD/plugins/SimpleFlatTableProducerPlugins.cc index 84fc5d48b61d7..e82478fad7be0 100644 --- a/PhysicsTools/NanoAOD/plugins/SimpleFlatTableProducerPlugins.cc +++ b/PhysicsTools/NanoAOD/plugins/SimpleFlatTableProducerPlugins.cc @@ -2,6 +2,12 @@ #include "PhysicsTools/NanoAOD/interface/SimpleFlatTableProducer.h" typedef SimpleFlatTableProducer SimpleCandidateFlatTableProducer; +#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h" +typedef SimpleFlatTableProducer SimplePFCandidateFlatTableProducer; + +#include "DataFormats/TauReco/interface/PFTau.h" +typedef SimpleFlatTableProducer SimplePFTauCandidateFlatTableProducer; + typedef SimpleCollectionFlatTableProducer SimpleCandidateCollectionFlatTableProducer; #include "DataFormats/TrackReco/interface/Track.h" @@ -69,6 +75,8 @@ typedef SimpleFlatTableProducer SimpleCompositeCandidat #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(SimpleCandidateFlatTableProducer); +DEFINE_FWK_MODULE(SimplePFCandidateFlatTableProducer); +DEFINE_FWK_MODULE(SimplePFTauCandidateFlatTableProducer); DEFINE_FWK_MODULE(SimpleCandidateCollectionFlatTableProducer); DEFINE_FWK_MODULE(SimpleTrackFlatTableProducer); DEFINE_FWK_MODULE(SimpleSuperclusterFlatTableProducer); diff --git a/PhysicsTools/NanoAOD/python/autoNANO.py b/PhysicsTools/NanoAOD/python/autoNANO.py index 7e9a2e45e17be..bf143421cbc72 100644 --- a/PhysicsTools/NanoAOD/python/autoNANO.py +++ b/PhysicsTools/NanoAOD/python/autoNANO.py @@ -69,6 +69,13 @@ def expandNanoMapping(seqList, mapping, key): 'customize': 'DPGAnalysis/MuonTools/muNtupleProducer_cff.muDPGNanoCustomize'}, 'MUDPGBKG': {'sequence': 'DPGAnalysis/MuonTools/muNtupleProducerBkg_cff.muDPGNanoProducerBkg', 'customize': 'DPGAnalysis/MuonTools/muNtupleProducerBkg_cff.muDPGNanoBkgCustomize'}, + # HLT Nano + 'Phase2HLT' : {'sequence': 'HLTrigger/NGTScouting/HLTNanoProducer_cff.hltNanoProducer', + 'customize': 'HLTrigger/NGTScouting/HLTNanoProducer_cff.hltNanoCustomize'}, + + # NGT scouting Nano + 'NGTScouting' : {'sequence': 'HLTrigger/NGTScouting/HLTNanoProducer_cff.dstNanoProducer', + 'customize': 'HLTrigger/NGTScouting/HLTNanoProducer_cff.hltNanoCustomize'}, # Muon High Level Trigger 'MUHLT' : {'sequence': 'DPGAnalysis/MuonTools/muNtupleProducerHlt_cff.hltMuNanoProducer', 'customize': 'DPGAnalysis/MuonTools/muNtupleProducerHlt_cff.hltMuNanoCustomize'}, diff --git a/PhysicsTools/NanoAOD/scripts/inspectNanoFile.py b/PhysicsTools/NanoAOD/scripts/inspectNanoFile.py index 2b8ac1f4c26df..7757e4f720f74 100755 --- a/PhysicsTools/NanoAOD/scripts/inspectNanoFile.py +++ b/PhysicsTools/NanoAOD/scripts/inspectNanoFile.py @@ -190,12 +190,12 @@ def writeSizeReport(fileData, trees, stream): {title} - - - - - - + + + + + +

{title}

@@ -247,7 +247,7 @@ def writeSizeReport(fileData, trees, stream): for s in survey: stream.write("%s%s%d" % (s['doc'],s['name'],s['name'],s['kind'].lower(),len(s['subs']))) stream.write("%.2f%.3f%.1f" % (s['entries']/events, s['tot']/events, s['tot']/s['entries']*1024 if s['entries'] else 0)) - stream.write("" % (s['tot']/treetotal*200,10)) + stream.write("" % (s['tot']/treetotal*200,10)) stream.write("%.1f%%" % ( s['tot']/treetotal * 100.0)) stream.write("%.1f%%" % ( (runningtotal+s['tot'])/treetotal * 100.0)) stream.write("%.1f%%" % ( (treetotal-runningtotal)/treetotal * 100.0)) @@ -258,7 +258,7 @@ def writeSizeReport(fileData, trees, stream): # all known data stream.write("All %s data" % treename) stream.write("   %.2f " % (treetotal/events)) - stream.write("" % ( treetotal/filesize*100.0)) + stream.write("" % ( treetotal/filesize*100.0)) stream.write("%.1f%%a" % (treetotal/filesize*100.0)) stream.write("\n") @@ -266,7 +266,7 @@ def writeSizeReport(fileData, trees, stream): # non-event stream.write("Non per-event data or overhead") stream.write("   %.2f " % ( (filesize-treetotal)/events)) - stream.write("" % ( (filesize-treetotal)/filesize * 100, 10 )) + stream.write("" % ( (filesize-treetotal)/filesize * 100, 10 )) stream.write("%.1f%%a" % ( (filesize-treetotal)/filesize * 100.0 )) stream.write("\n") @@ -274,7 +274,7 @@ def writeSizeReport(fileData, trees, stream): # other, unknown overhead stream.write("Overhead") stream.write("   %.2f " % ( (filesize-runningtotal)/events)) - stream.write("" % ( (filesize-runningtotal)/filesize * 100, 10 )) + stream.write("" % ( (filesize-runningtotal)/filesize * 100, 10 )) stream.write("%.1f%%a" % ( (filesize-runningtotal)/filesize * 100.0 )) stream.write("\n") @@ -299,7 +299,7 @@ def writeSizeReport(fileData, trees, stream): subs = [ treeData['branches'][b] for b in s['subs'] ] for b in sorted(subs, key = lambda s : - s['tot']): stream.write("%s%s%.1f%.1f" % (b['doc'],b['name'], b['kind'], b['tot']/events*1024, b['tot']/s['entries']*1024 if s['entries'] else 0)) - stream.write("" % ( b['tot']/s['tot']*200, 10 )) + stream.write("" % ( b['tot']/s['tot']*200, 10 )) stream.write("%.1f%%" % (b['tot']/s['tot'] * 100.0)) stream.write("\n") stream.write("\n") @@ -312,7 +312,7 @@ def writeDocReport(fileName, trees, stream): Documentation for {filename} - + """.format(filename=fileName)) @@ -359,7 +359,7 @@ def writeMarkdownSizeReport(fileData, trees, stream): for s in survey: stream.write("| [**%s**](#%s '%s') | %s | %d" % (s['name'], s['name'].lower(), s['doc'].replace('|', '\|').replace('\'', '\"'), s['kind'].lower(), len(s['subs']))) stream.write("| %.2f|%.3f|%.1f" % (s['entries']/events, s['tot']/events, s['tot'] / s['entries'] * 1024 if s['entries'] else 0)) - stream.write("| " % (s['tot'] / treetotal * 200, 10)) + stream.write("| " % (s['tot'] / treetotal * 200, 10)) stream.write("| %.1f%%" % (s['tot'] / treetotal * 100.0)) stream.write("| %.1f%%" % ((runningtotal+s['tot'])/treetotal * 100.0)) stream.write("| %.1f%% |\n" % ((treetotal-runningtotal)/treetotal * 100.0)) @@ -368,21 +368,21 @@ def writeMarkdownSizeReport(fileData, trees, stream): # all known data stream.write("**All %s data**" % treename) stream.write("| | | | **%.2f**" % (treetotal/events)) - stream.write("| | " % (treetotal / filesize * 100.0, 10)) + stream.write("| | " % (treetotal / filesize * 100.0, 10)) stream.write("| %.1f%%a | | |\n" % (treetotal/filesize * 100.0)) if treename == "Events": # non-event stream.write("**Non per-event data or overhead**") stream.write("| | | | %.2f" % ((filesize-treetotal)/events)) - stream.write("| | " % ((filesize - treetotal) / filesize * 100, 10)) + stream.write("| | " % ((filesize - treetotal) / filesize * 100, 10)) stream.write("| %.1f%%a | | |\n" % ((filesize-treetotal)/filesize * 100.0)) if len(surveys) > 1: # other, unknown overhead stream.write("**Overhead**") stream.write("| | | | %.2f" % ((filesize-runningtotal)/events)) - stream.write("| | " % ((filesize - runningtotal) / filesize * 100, 10)) + stream.write("| | " % ((filesize - runningtotal) / filesize * 100, 10)) stream.write("| %.1f%%a | | |\n" % ((filesize-runningtotal)/filesize * 100.0)) # all file @@ -402,7 +402,7 @@ def writeMarkdownSizeReport(fileData, trees, stream): subs = [trees[treename]['branches'][b] for b in s['subs']] for b in sorted(subs, key = lambda s: - s['tot']): stream.write("| %s | %s | %.1f | %.1f" % (b['doc'].replace('|', '\|').replace('\'', '\"'), b['name'], b['kind'], b['tot'] / events * 1024, b['tot'] / s['entries'] * 1024 if s['entries'] else 0)) - stream.write("| " % (b['tot'] / s['tot'] * 200, 10)) + stream.write("| " % (b['tot'] / s['tot'] * 200, 10)) stream.write("| %.1f%% |\n" % (b['tot'] / s['tot'] * 100.0)) stream.write("\n") diff --git a/RecoBTag/ONNXRuntime/plugins/DeepFlavourONNXJetTagsProducer.cc b/RecoBTag/ONNXRuntime/plugins/DeepFlavourONNXJetTagsProducer.cc index 70687fa2b13d9..852eb1b1927da 100644 --- a/RecoBTag/ONNXRuntime/plugins/DeepFlavourONNXJetTagsProducer.cc +++ b/RecoBTag/ONNXRuntime/plugins/DeepFlavourONNXJetTagsProducer.cc @@ -36,6 +36,7 @@ class DeepFlavourONNXJetTagsProducer : public edm::stream::EDProducer src_; + edm::EDGetTokenT> jet_; std::vector flav_names_; std::vector input_names_; std::vector output_names_; @@ -53,6 +54,8 @@ class DeepFlavourONNXJetTagsProducer : public edm::stream::EDProducer> jets; }; const std::vector DeepFlavourONNXJetTagsProducer::input_sizes_{ @@ -63,10 +66,18 @@ DeepFlavourONNXJetTagsProducer::DeepFlavourONNXJetTagsProducer(const edm::Parame : src_(consumes(iConfig.getParameter("src"))), flav_names_(iConfig.getParameter>("flav_names")), input_names_(iConfig.getParameter>("input_names")), - output_names_(iConfig.getParameter>("output_names")) { + output_names_(iConfig.getParameter>("output_names")), + produceValueMap_(iConfig.getUntrackedParameter("produceValueMap", false)) { + if (produceValueMap_) { + jet_ = consumes>(iConfig.getParameter("jets")); + } + // get output names from flav_names for (const auto& flav_name : flav_names_) { produces(flav_name); + if (produceValueMap_) { + produces>(flav_name); + } } assert(input_names_.size() == input_sizes_.size()); @@ -85,6 +96,8 @@ void DeepFlavourONNXJetTagsProducer::fillDescriptions(edm::ConfigurationDescript desc.add>("output_names", {"ID_pred/Softmax:0"}); desc.add>( "flav_names", std::vector{"probb", "probbb", "problepb", "probc", "probuds", "probg"}); + desc.add("jets", edm::InputTag("hltAK4PFPuppiJets")); + desc.addOptionalUntracked("produceValueMap", false); descriptions.add("pfDeepFlavourJetTags", desc); } @@ -99,7 +112,16 @@ void DeepFlavourONNXJetTagsProducer::produce(edm::Event& iEvent, const edm::Even edm::Handle tag_infos; iEvent.getByToken(src_, tag_infos); + if (produceValueMap_) { + iEvent.getByToken(jet_, jets); + if (!jets.isValid()) { + edm::LogWarning("DeepFlavourONNXJetTagsProducer") << "Invalid handle in jet input collection"; + return; + } + } + std::vector> output_tags; + std::vector> output_scores(flav_names_.size(), std::vector(tag_infos->size(), -1.0)); if (!tag_infos->empty()) { // initialize output collection auto jet_ref = tag_infos->begin()->jet(); @@ -130,6 +152,9 @@ void DeepFlavourONNXJetTagsProducer::produce(edm::Event& iEvent, const edm::Even const auto& jet_ref = tag_infos->at(jet_n).jet(); for (std::size_t flav_n = 0; flav_n < flav_names_.size(); flav_n++) { (*(output_tags[flav_n]))[jet_ref] = outputs[i_output]; + if (produceValueMap_) { + output_scores[flav_n][jet_n] = outputs[flav_n]; + } ++i_output; } } @@ -142,6 +167,15 @@ void DeepFlavourONNXJetTagsProducer::produce(edm::Event& iEvent, const edm::Even // put into the event for (std::size_t flav_n = 0; flav_n < flav_names_.size(); ++flav_n) { + if (produceValueMap_) { + for (size_t k = 0; k < output_scores.size(); k++) { + std::unique_ptr> VM(new edm::ValueMap()); + edm::ValueMap::Filler filler(*VM); + filler.insert(jets, output_scores.at(k).begin(), output_scores.at(k).end()); + filler.fill(); + iEvent.put(std::move(VM), flav_names_[k]); + } + } iEvent.put(std::move(output_tags[flav_n]), flav_names_[flav_n]); } data_.clear();