File indexing completed on 2023-03-17 11:22:44
0001 #ifndef SiTrackerMRHTools_SimpleDAFHitCollector_h
0002 #define SiTrackerMRHTools_SimpleDAFHitCollector_h
0003 #include "RecoTracker/SiTrackerMRHTools/interface/MultiRecHitCollector.h"
0004 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
0005 #include "RecoTracker/TransientTrackingRecHit/interface/TkClonerImpl.h"
0006 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
0007 #include "RecoTracker/SiTrackerMRHTools/interface/SiTrackerMultiRecHitUpdator.h"
0008 #include <Geometry/CommonDetUnit/interface/GeomDetType.h>
0009 #include <vector>
0010 #include <memory>
0011
0012 class Propagator;
0013 class MeasurementEstimator;
0014
0015 class StripRecHit1D;
0016
0017 class SimpleDAFHitCollector : public MultiRecHitCollector {
0018 public:
0019 explicit SimpleDAFHitCollector(const TrackerTopology* trackerTopology,
0020 const MeasurementTracker* measurementTracker,
0021 const SiTrackerMultiRecHitUpdator* updator,
0022 const MeasurementEstimator* est,
0023 const Propagator* propagator,
0024 bool debug)
0025 : MultiRecHitCollector(measurementTracker),
0026 theTopology(trackerTopology),
0027 theUpdator(updator),
0028 theEstimator(est),
0029 thePropagator(propagator),
0030 debug_(debug) {
0031 theHitCloner = static_cast<TkTransientTrackingRecHitBuilder const*>(theUpdator->getBuilder())->cloner();
0032 }
0033
0034 ~SimpleDAFHitCollector() override {}
0035
0036
0037
0038
0039
0040
0041
0042
0043 std::vector<TrajectoryMeasurement> recHits(const Trajectory&, const MeasurementTrackerEvent* theMTE) const override;
0044
0045 const SiTrackerMultiRecHitUpdator* getUpdator() const { return theUpdator; }
0046 const MeasurementEstimator* getEstimator() const { return theEstimator; }
0047 const Propagator* getPropagator() const { return thePropagator; }
0048
0049 void Debug(const std::vector<TrajectoryMeasurement> TM) const;
0050
0051 private:
0052
0053
0054
0055 std::unique_ptr<TrackingRecHit> rightdimension(TrackingRecHit const& hit) const {
0056 if (!hit.isValid() || (hit.dimension() != 2)) {
0057 return std::unique_ptr<TrackingRecHit>{hit.clone()};
0058 }
0059 auto const& thit = static_cast<BaseTrackerRecHit const&>(hit);
0060 auto const& clus = thit.firstClusterRef();
0061 if (clus.isPixel())
0062 return std::unique_ptr<TrackingRecHit>{hit.clone()};
0063 else if (clus.isPhase2())
0064 return std::unique_ptr<TrackingRecHit>{hit.clone()};
0065 else if (thit.isMatched()) {
0066 LogDebug("MultiRecHitCollector") << " SiStripMatchedRecHit2D to check!!!";
0067 return std::unique_ptr<TrackingRecHit>{hit.clone()};
0068 } else if (thit.isProjected()) {
0069 edm::LogError("MultiRecHitCollector") << " ProjectedSiStripRecHit2D should not be present at this stage!!!";
0070 return std::unique_ptr<TrackingRecHit>{hit.clone()};
0071 } else
0072 return clone(thit);
0073 }
0074
0075 std::unique_ptr<TrackingRecHit> clone(BaseTrackerRecHit const& hit2D) const {
0076 auto const& detU = *hit2D.detUnit();
0077
0078 bool endcap = detU.type().isEndcap();
0079 if (endcap)
0080 return std::unique_ptr<TrackingRecHit>{hit2D.clone()};
0081 return std::unique_ptr<TrackingRecHit>{
0082 new SiStripRecHit1D(hit2D.localPosition(),
0083 LocalError(hit2D.localPositionError().xx(), 0.f, std::numeric_limits<float>::max()),
0084 *hit2D.det(),
0085 hit2D.firstClusterRef())};
0086 }
0087
0088 private:
0089 const TrackerTopology* theTopology;
0090 const SiTrackerMultiRecHitUpdator* theUpdator;
0091 const MeasurementEstimator* theEstimator;
0092
0093 const Propagator* thePropagator;
0094 TkClonerImpl theHitCloner;
0095 const bool debug_;
0096 };
0097
0098 #endif