Back to home page

Project CMSSW displayed by LXR

 
 

    


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;  // break on failures if doing an AND, and on successes if doing an OR
0055   }
0056   return isAnd_;  // if we arrive here, we have no successes for OR, and no failures for AND
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;  // break on failures if doing an AND, and on successes if doing an OR
0065   }
0066   return isAnd_;  // if we arrive here, we have no successes for OR, and no failures for AND
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;  // break on failures if doing an AND, and on successes if doing an OR
0076   }
0077   return isAnd_;  // if we arrive here, we have no successes for OR, and no failures for AND
0078 }
0079 
0080 DEFINE_EDM_PLUGIN(SeedComparitorFactory, CombinedSeedComparitor, "CombinedSeedComparitor");