File indexing completed on 2024-04-06 12:27:28
0001 #include "RecoParticleFlow/PFProducer/interface/BlockElementLinkerBase.h"
0002 #include "DataFormats/ParticleFlowReco/interface/PFRecTrack.h"
0003 #include "DataFormats/ParticleFlowReco/interface/PFBlockElementGsfTrack.h"
0004 #include "DataFormats/ParticleFlowReco/interface/PFBlockElementBrem.h"
0005 #include "RecoParticleFlow/PFClusterTools/interface/LinkByRecHit.h"
0006
0007 class GSFAndBREMLinker : public BlockElementLinkerBase {
0008 public:
0009 GSFAndBREMLinker(const edm::ParameterSet& conf)
0010 : BlockElementLinkerBase(conf),
0011 useKDTree_(conf.getParameter<bool>("useKDTree")),
0012 debug_(conf.getUntrackedParameter<bool>("debug", false)) {}
0013
0014 double testLink(const reco::PFBlockElement*, const reco::PFBlockElement*) const override;
0015
0016 private:
0017 bool useKDTree_, debug_;
0018 };
0019
0020 DEFINE_EDM_PLUGIN(BlockElementLinkerFactory, GSFAndBREMLinker, "GSFAndBREMLinker");
0021
0022 double GSFAndBREMLinker::testLink(const reco::PFBlockElement* elem1, const reco::PFBlockElement* elem2) const {
0023 double dist = -1.0;
0024 const reco::PFBlockElementGsfTrack* gsfelem(nullptr);
0025 const reco::PFBlockElementBrem* bremelem(nullptr);
0026 if (elem1->type() < elem2->type()) {
0027 gsfelem = static_cast<const reco::PFBlockElementGsfTrack*>(elem1);
0028 bremelem = static_cast<const reco::PFBlockElementBrem*>(elem2);
0029 } else {
0030 gsfelem = static_cast<const reco::PFBlockElementGsfTrack*>(elem2);
0031 bremelem = static_cast<const reco::PFBlockElementBrem*>(elem1);
0032 }
0033 const reco::GsfPFRecTrackRef& gsfref = gsfelem->GsftrackRefPF();
0034 const reco::GsfPFRecTrackRef& bremref = bremelem->GsftrackRefPF();
0035 if (gsfref.isNonnull() && bremref.isNonnull() && gsfref == bremref) {
0036 dist = 0.001;
0037 }
0038 return dist;
0039 }