diff --git a/PhysicsTools/NanoAOD/plugins/VertexTableProducer.cc b/PhysicsTools/NanoAOD/plugins/VertexTableProducer.cc index e79ecf40450c8..61b149c721e0e 100644 --- a/PhysicsTools/NanoAOD/plugins/VertexTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/VertexTableProducer.cc @@ -41,6 +41,9 @@ #include "RecoVertex/VertexPrimitives/interface/VertexState.h" #include "DataFormats/Common/interface/ValueMap.h" +#include "DataFormats/PatCandidates/interface/PackedCandidate.h" +#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h" + // // class declaration // @@ -65,6 +68,7 @@ class VertexTableProducer : public edm::stream::EDProducer<> { // ----------member data --------------------------- const edm::EDGetTokenT> pvs_; + const edm::EDGetTokenT pfc_; const edm::EDGetTokenT> pvsScore_; const edm::EDGetTokenT> svs_; const StringCutObjectSelector svCut_; @@ -81,6 +85,7 @@ class VertexTableProducer : public edm::stream::EDProducer<> { // VertexTableProducer::VertexTableProducer(const edm::ParameterSet& params) : pvs_(consumes>(params.getParameter("pvSrc"))), + pfc_(consumes(params.getParameter("pfcSrc"))), pvsScore_(consumes>(params.getParameter("pvSrc"))), svs_(consumes>(params.getParameter("svSrc"))), svCut_(params.getParameter("svCut"), true), @@ -115,6 +120,9 @@ void VertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe const auto& pvsScoreProd = iEvent.get(pvsScore_); auto pvsIn = iEvent.getHandle(pvs_); + //pf candidates collection + auto pfcIn = iEvent.getHandle(pfc_); + auto pvTable = std::make_unique(1, pvName_, true); pvTable->addColumnValue("ndof", (*pvsIn)[0].ndof(), "main primary vertex number of degree of freedom", 8); pvTable->addColumnValue("x", (*pvsIn)[0].position().x(), "main primary vertex position x coordinate", 10); @@ -131,6 +139,31 @@ void VertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe pvTable->addColumnValue( "score", pvsScoreProd.get(pvsIn.id(), 0), "main primary vertex score, i.e. sum pt2 of clustered objects", 8); + float pv_sumpt2 = 0.0; + for (const auto& obj : *pfcIn) { + if (obj.charge() == 0) { + continue; + } // skip neutrals + double dz = fabs(obj.dz((*pvsIn)[0].position())); + bool include_pfc = false; + if (dz < 0.2) { + include_pfc = true; + for (size_t j = 1; j < (*pvsIn).size(); j++) { + double newdz = fabs(obj.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; + } + } + pvTable->addColumnValue( + "sumpt2", pv_sumpt2, "sum pt2 of pf charged candidates for the main primary vertex", 10); + auto otherPVsTable = std::make_unique((*pvsIn).size() > 4 ? 3 : (*pvsIn).size() - 1, "Other" + pvName_, false); std::vector pvsz; @@ -207,6 +240,7 @@ void VertexTableProducer::fillDescriptions(edm::ConfigurationDescriptions& descr desc.add("pvSrc")->setComment( "std::vector and ValueMap primary vertex input collections"); + desc.add("pfcSrc")->setComment("packedPFCandidates input collections"); desc.add("goodPvCut")->setComment("selection on the primary vertex"); desc.add("svSrc")->setComment( "reco::VertexCompositePtrCandidate compatible secondary vertex input collection"); diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 7feb200b41190..9185efbd0e98f 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -622,6 +622,7 @@ Plot1D('npvs', 'npvs', 20, 0, 60, 'total number of reconstructed primary vertices'), Plot1D('npvsGood', 'npvsGood', 20, 0, 60, 'total number of Good primary vertices'), Plot1D('score', 'score', 20, 0, 300000, 'main primary vertex score, i.e. sum pt2 of clustered objects'), + Plot1D('sumpt2', 'sumpt2', 100, 0, 300000, 'main primary vertex sum pt2 of the charged pf candidates'), Plot1D('x', 'x', 20, -0.3, 0.3, 'main primary vertex position x coordinate'), Plot1D('y', 'y', 20, -0.3, 0.3, 'main primary vertex position y coordinate'), Plot1D('z', 'z', 20, -20, 20, 'main primary vertex position z coordinate'), diff --git a/PhysicsTools/NanoAOD/python/vertices_cff.py b/PhysicsTools/NanoAOD/python/vertices_cff.py index ddda0ba422c1e..69d105795d25d 100644 --- a/PhysicsTools/NanoAOD/python/vertices_cff.py +++ b/PhysicsTools/NanoAOD/python/vertices_cff.py @@ -10,6 +10,7 @@ vertexTable = cms.EDProducer("VertexTableProducer", pvSrc = cms.InputTag("offlineSlimmedPrimaryVertices"), goodPvCut = cms.string("!isFake && ndof > 4 && abs(z) <= 24 && position.Rho <= 2"), + pfcSrc = cms.InputTag("packedPFCandidates"), svSrc = cms.InputTag("linkedObjects", "vertices"), svCut = cms.string(""), # careful: adding a cut here would make the collection matching inconsistent with the SV table dlenMin = cms.double(0),