File indexing completed on 2025-06-26 23:26:40
0001 #ifndef SiStripMatchedRecHit2D_H
0002 #define SiStripMatchedRecHit2D_H
0003
0004 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
0005
0006 #include "TkCloner.h"
0007
0008 class SiStripMatchedRecHit2D final : public BaseTrackerRecHit {
0009 public:
0010 typedef BaseTrackerRecHit Base;
0011
0012 SiStripMatchedRecHit2D() {}
0013 ~SiStripMatchedRecHit2D() override {}
0014
0015 SiStripMatchedRecHit2D(const LocalPoint& pos,
0016 const LocalError& err,
0017 GeomDet const& idet,
0018 const SiStripRecHit2D* rMono,
0019 const SiStripRecHit2D* rStereo)
0020 : BaseTrackerRecHit(pos, err, idet, trackerHitRTTI::match),
0021 clusterMono_(rMono->omniClusterRef()),
0022 clusterStereo_(rStereo->omniClusterRef()) {}
0023
0024
0025 SiStripRecHit2D stereoHit() const { return SiStripRecHit2D(stereoId(), stereoClusterRef()); }
0026 SiStripRecHit2D monoHit() const { return SiStripRecHit2D(monoId(), monoClusterRef()); }
0027
0028 unsigned int stereoId() const { return rawId() + 1; }
0029 unsigned int monoId() const { return rawId() + 2; }
0030
0031
0032 OmniClusterRef const& firstClusterRef() const override { return monoClusterRef(); }
0033
0034 OmniClusterRef const& stereoClusterRef() const { return clusterStereo_; }
0035 OmniClusterRef const& monoClusterRef() const { return clusterMono_; }
0036
0037 OmniClusterRef& stereoClusterRef() { return clusterStereo_; }
0038 OmniClusterRef& monoClusterRef() { return clusterMono_; }
0039
0040 SiStripCluster const& stereoCluster() const { return stereoClusterRef().stripCluster(); }
0041 SiStripCluster const& monoCluster() const { return monoClusterRef().stripCluster(); }
0042
0043 SiStripMatchedRecHit2D* clone() const override { return new SiStripMatchedRecHit2D(*this); }
0044 #ifndef __GCCXML__
0045 RecHitPointer cloneSH() const override { return std::make_shared<SiStripMatchedRecHit2D>(*this); }
0046 #endif
0047
0048 int dimension() const override { return 2; }
0049 void getKfComponents(KfComponentsHolder& holder) const override { getKfComponents2D(holder); }
0050
0051 bool sharesInput(const TrackingRecHit* other, SharedInputType what) const override;
0052
0053 bool sharesInput(TrackerSingleRecHit const& other) const;
0054
0055 std::vector<const TrackingRecHit*> recHits() const override;
0056
0057 std::vector<TrackingRecHit*> recHits() override;
0058
0059 bool canImproveWithTrack() const override { return true; }
0060
0061 private:
0062
0063 SiStripMatchedRecHit2D* clone_(TkCloner const& cloner, TrajectoryStateOnSurface const& tsos) const override {
0064 return cloner(*this, tsos).release();
0065 }
0066 #ifndef __GCCXML__
0067 RecHitPointer cloneSH_(TkCloner const& cloner, TrajectoryStateOnSurface const& tsos) const override {
0068 return cloner.makeShared(*this, tsos);
0069 }
0070 #endif
0071
0072 private:
0073 OmniClusterRef clusterMono_, clusterStereo_;
0074 };
0075
0076 inline bool sharesClusters(SiStripMatchedRecHit2D const& h1,
0077 SiStripMatchedRecHit2D const& h2,
0078 TrackingRecHit::SharedInputType what) {
0079 auto const& thisMonoClus = h1.monoClusterRef();
0080 auto const& otherMonoClus = h2.monoClusterRef();
0081 auto const& thisStereoClus = h1.stereoClusterRef();
0082 auto const& otherStereoClus = h2.stereoClusterRef();
0083
0084 if (thisMonoClus.id() == otherMonoClus.id()) {
0085 const bool monoIdentity = thisMonoClus == otherMonoClus;
0086 const bool stereoIdentity = thisStereoClus == otherStereoClus;
0087 return (what == TrackingRecHit::all) ? (monoIdentity && stereoIdentity) : (monoIdentity || stereoIdentity);
0088 } else {
0089 bool monoOverlap = (h1.monoId() == h2.monoId()) ? otherMonoClus.stripOverlap(thisMonoClus) : false;
0090 bool stereoOverlap = (h1.stereoId() == h2.stereoId()) ? otherStereoClus.stripOverlap(thisStereoClus) : false;
0091 return (what == TrackingRecHit::all) ? (monoOverlap && stereoOverlap) : (monoOverlap || stereoOverlap);
0092 }
0093 }
0094
0095 #endif