File indexing completed on 2024-04-06 12:01:07
0001 #include "CommonTools/ParticleFlow/interface/PFPileUpAlgo.h"
0002 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
0003 #include "DataFormats/VertexReco/interface/Vertex.h"
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005
0006 void PFPileUpAlgo::process(const PFCollection& pfCandidates, const reco::VertexCollection& vertices) {
0007 pfCandidatesFromVtx_.clear();
0008 pfCandidatesFromPU_.clear();
0009
0010 for (unsigned i = 0; i < pfCandidates.size(); i++) {
0011 const reco::PFCandidate& cand = *(pfCandidates[i]);
0012
0013 int ivertex;
0014
0015 switch (cand.particleId()) {
0016 case reco::PFCandidate::h:
0017 ivertex = chargedHadronVertex(vertices, cand);
0018 break;
0019 default:
0020 continue;
0021 }
0022
0023
0024
0025 if ((ivertex == -1 || ivertex == 0 ||
0026 (fNumOfPUVtxsForCharged_ > 0 && !vertices.empty() && ivertex <= int(fNumOfPUVtxsForCharged_) &&
0027 std::abs(cand.vertex().z() - vertices[0].z()) < fDzCutForChargedFromPUVtxs_))) {
0028 if (verbose_)
0029 std::cout << "VTX " << i << " " << *(pfCandidates[i]) << std::endl;
0030 pfCandidatesFromVtx_.push_back(pfCandidates[i]);
0031 } else {
0032 if (verbose_)
0033 std::cout << "PU " << i << " " << *(pfCandidates[i]) << std::endl;
0034
0035 pfCandidatesFromPU_.push_back(pfCandidates[i]);
0036 }
0037 }
0038 }
0039
0040 int PFPileUpAlgo::chargedHadronVertex(const reco::VertexCollection& vertices, const reco::PFCandidate& pfcand) const {
0041 auto const& track = pfcand.trackRef();
0042 size_t iVertex = 0;
0043 unsigned int index = 0;
0044 unsigned int nFoundVertex = 0;
0045 float bestweight = 0;
0046 for (auto const& vtx : vertices) {
0047 float w = vtx.trackWeight(track);
0048
0049 if (w > bestweight) {
0050 bestweight = w;
0051 iVertex = index;
0052 nFoundVertex++;
0053 }
0054 ++index;
0055 }
0056
0057 if (nFoundVertex > 0) {
0058 if (nFoundVertex != 1)
0059 edm::LogWarning("TrackOnTwoVertex") << "a track is shared by at least two verteces. Used to be an assert";
0060 return iVertex;
0061 }
0062
0063
0064
0065 if (checkClosestZVertex_) {
0066 double dzmin = 10000;
0067 double ztrack = pfcand.vertex().z();
0068 bool foundVertex = false;
0069 index = 0;
0070 for (auto iv = vertices.begin(); iv != vertices.end(); ++iv, ++index) {
0071 double dz = fabs(ztrack - iv->z());
0072 if (dz < dzmin) {
0073 dzmin = dz;
0074 iVertex = index;
0075 foundVertex = true;
0076 }
0077 }
0078
0079 if (foundVertex)
0080 return iVertex;
0081 }
0082
0083 return -1;
0084 }