File indexing completed on 2024-04-06 12:28:55
0001 #include "RecoTracker/TkSeedingLayers/interface/SeedComparitor.h"
0002 #include "RecoTracker/TkSeedingLayers/interface/SeedComparitorFactory.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005
0006 #include <vector>
0007 #include <memory>
0008
0009 class CombinedSeedComparitor : public SeedComparitor {
0010 public:
0011 CombinedSeedComparitor(const edm::ParameterSet &cfg, edm::ConsumesCollector &iC);
0012 ~CombinedSeedComparitor() override;
0013 void init(const edm::Event &ev, const edm::EventSetup &es) override;
0014 bool compatible(const SeedingHitSet &hits) const override;
0015 bool compatible(const TrajectoryStateOnSurface &, SeedingHitSet::ConstRecHitPointer hit) const override;
0016 bool compatible(const SeedingHitSet &hits,
0017 const GlobalTrajectoryParameters &helixStateAtVertex,
0018 const FastHelix &helix) const override;
0019
0020 private:
0021 std::vector<std::unique_ptr<SeedComparitor>> comparitors_;
0022 bool isAnd_;
0023 };
0024
0025 CombinedSeedComparitor::CombinedSeedComparitor(const edm::ParameterSet &cfg, edm::ConsumesCollector &iC) {
0026 std::string mode = cfg.getParameter<std::string>("mode");
0027 if (mode == "and")
0028 isAnd_ = true;
0029 else if (mode == "or")
0030 isAnd_ = false;
0031 else
0032 throw cms::Exception("Configuration", "Parameter 'mode' of CombinedSeedComparitor must be either 'and' or 'or'\n");
0033
0034 typedef std::vector<edm::ParameterSet> VPSet;
0035 VPSet psets = cfg.getParameter<VPSet>("comparitors");
0036 for (VPSet::const_iterator it = psets.begin(), ed = psets.end(); it != ed; ++it) {
0037 std::string name = it->getParameter<std::string>("ComponentName");
0038 comparitors_.emplace_back(SeedComparitorFactory::get()->create(name, *it, iC));
0039 }
0040 }
0041
0042 CombinedSeedComparitor::~CombinedSeedComparitor() {}
0043
0044 void CombinedSeedComparitor::init(const edm::Event &ev, const edm::EventSetup &es) {
0045 for (const auto &it : comparitors_) {
0046 it->init(ev, es);
0047 }
0048 }
0049
0050 bool CombinedSeedComparitor::compatible(const SeedingHitSet &hits) const {
0051 for (const auto &it : comparitors_) {
0052 bool pass = it->compatible(hits);
0053 if (isAnd_ != pass)
0054 return pass;
0055 }
0056 return isAnd_;
0057 }
0058
0059 bool CombinedSeedComparitor::compatible(const TrajectoryStateOnSurface &tsos,
0060 SeedingHitSet::ConstRecHitPointer hit) const {
0061 for (const auto &it : comparitors_) {
0062 bool pass = it->compatible(tsos, hit);
0063 if (isAnd_ != pass)
0064 return pass;
0065 }
0066 return isAnd_;
0067 }
0068
0069 bool CombinedSeedComparitor::compatible(const SeedingHitSet &hits,
0070 const GlobalTrajectoryParameters &helixStateAtVertex,
0071 const FastHelix &helix) const {
0072 for (const auto &it : comparitors_) {
0073 bool pass = it->compatible(hits, helixStateAtVertex, helix);
0074 if (isAnd_ != pass)
0075 return pass;
0076 }
0077 return isAnd_;
0078 }
0079
0080 DEFINE_EDM_PLUGIN(SeedComparitorFactory, CombinedSeedComparitor, "CombinedSeedComparitor");