Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:28:43

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 //class SiTrackerMultiRecHitUpdator;
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   //given a trajectory it returns a collection
0037   //of SiTrackerMultiRecHits and InvalidTransientRecHits.
0038   //For each measurement in the trajectory, measurements are looked for according to the
0039   //MeasurementDet::fastMeasurements method only in the detector where the original measurement lays.
0040   //If measurements are found a SiTrackerMultiRecHit is built.
0041   //All the components will lay on the same detector
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   //TransientTrackingRecHit::ConstRecHitContainer buildMultiRecHits(const std::vector<TrajectoryMeasurementGroup>& measgroup) const;
0053   //void buildMultiRecHits(const std::vector<TrajectoryMeasurement>& measgroup, std::vector<TrajectoryMeasurement>& result) const;
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     //Use 2D SiStripRecHit in endcap
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   //this actually is not used in the fastMeasurement method
0093   const Propagator* thePropagator;
0094   TkClonerImpl theHitCloner;
0095   const bool debug_;
0096 };
0097 
0098 #endif