File indexing completed on 2024-04-06 12:29:02
0001 #include <memory>
0002 #include <set>
0003
0004 #include "FWCore/Framework/interface/stream/EDProducer.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 #include "FWCore/Utilities/interface/InputTag.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009
0010 #include "DataFormats/Common/interface/Handle.h"
0011 #include "DataFormats/TrackReco/interface/Track.h"
0012 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0013 #include "DataFormats/VertexReco/interface/Vertex.h"
0014 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0015 #include "RecoVertex/VertexTools/interface/VertexDistance3D.h"
0016 #include "RecoVertex/VertexTools/interface/SharedTracks.h"
0017 #include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h"
0018 #include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h"
0019 #include "RecoVertex/VertexPrimitives/interface/VertexState.h"
0020
0021 template <class VTX>
0022 class TemplatedVertexMerger : public edm::stream::EDProducer<> {
0023 public:
0024 typedef std::vector<VTX> Product;
0025 TemplatedVertexMerger(const edm::ParameterSet ¶ms);
0026
0027 void produce(edm::Event &event, const edm::EventSetup &es) override;
0028
0029 private:
0030 bool trackFilter(const reco::TrackRef &track) const;
0031
0032 edm::EDGetTokenT<Product> token_secondaryVertex;
0033 double maxFraction;
0034 double minSignificance;
0035 };
0036
0037 template <class VTX>
0038 TemplatedVertexMerger<VTX>::TemplatedVertexMerger(const edm::ParameterSet ¶ms)
0039 : maxFraction(params.getParameter<double>("maxFraction")),
0040 minSignificance(params.getParameter<double>("minSignificance")) {
0041 token_secondaryVertex = consumes<Product>(params.getParameter<edm::InputTag>("secondaryVertices"));
0042 produces<Product>();
0043 }
0044
0045 template <class VTX>
0046 void TemplatedVertexMerger<VTX>::produce(edm::Event &event, const edm::EventSetup &es) {
0047 using namespace reco;
0048
0049 edm::Handle<Product> secondaryVertices;
0050 event.getByToken(token_secondaryVertex, secondaryVertices);
0051
0052 VertexDistance3D dist;
0053 auto recoVertices = std::make_unique<Product>();
0054 for (typename Product::const_iterator sv = secondaryVertices->begin(); sv != secondaryVertices->end(); ++sv) {
0055 recoVertices->push_back(*sv);
0056 }
0057 for (typename Product::iterator sv = recoVertices->begin(); sv != recoVertices->end(); ++sv) {
0058 bool shared = false;
0059 VertexState s1(RecoVertex::convertPos(sv->position()), RecoVertex::convertError(sv->error()));
0060 for (typename Product::iterator sv2 = recoVertices->begin(); sv2 != recoVertices->end(); ++sv2) {
0061 VertexState s2(RecoVertex::convertPos(sv2->position()), RecoVertex::convertError(sv2->error()));
0062 double fr = vertexTools::computeSharedTracks(*sv2, *sv);
0063
0064
0065 if (fr > maxFraction && dist.distance(s1, s2).significance() < minSignificance && sv - sv2 != 0 &&
0066 fr >= vertexTools::computeSharedTracks(*sv, *sv2)) {
0067 shared = true;
0068
0069 }
0070 }
0071 if (shared) {
0072 sv = recoVertices->erase(sv) - 1;
0073 }
0074
0075 }
0076
0077 event.put(std::move(recoVertices));
0078 }
0079
0080 typedef TemplatedVertexMerger<reco::Vertex> VertexMerger;
0081 typedef TemplatedVertexMerger<reco::VertexCompositePtrCandidate> CandidateVertexMerger;
0082
0083 DEFINE_FWK_MODULE(VertexMerger);
0084 DEFINE_FWK_MODULE(CandidateVertexMerger);