File indexing completed on 2023-03-17 11:26:27
0001 #ifndef TrackingTools_TrackingRecHitPropagator_h
0002 #define TrackingTools_TrackingRecHitPropagator_h
0003
0004 #include "DataFormats/TrackingRecHit/interface/InvalidTrackingRecHit.h"
0005 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
0006 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
0007 #include "RecoTracker/TransientTrackingRecHit/interface/TkClonerImpl.h"
0008
0009 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
0010 #include "TrackingTools/KalmanUpdators/interface/TrackingRecHitPropagator.h"
0011 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
0012 #include "MagneticField/Engine/interface/MagneticField.h"
0013 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
0014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0015
0016
0017
0018
0019
0020
0021 class TrackingRecHitPropagator {
0022 public:
0023 TrackingRecHitPropagator(const MagneticField* magf) {
0024 thePropagator = new AnalyticalPropagator(magf, anyDirection, 1.6);
0025 };
0026
0027 ~TrackingRecHitPropagator() { delete thePropagator; }
0028
0029 template <class ResultingHit>
0030 TrackingRecHit::RecHitPointer project(const TrackingRecHit::ConstRecHitPointer hit,
0031 const GeomDet& det,
0032 const TrajectoryStateOnSurface ts,
0033 const TransientTrackingRecHitBuilder* builder) const {
0034 TkClonerImpl hc = static_cast<TkTransientTrackingRecHitBuilder const*>(builder)->cloner();
0035
0036
0037
0038
0039
0040
0041 if (!ts.isValid())
0042 return std::make_shared<InvalidTrackingRecHit>(*hit->det(), TrackingRecHit::missing);
0043
0044
0045 TrajectoryStateOnSurface propagated = ts;
0046 if (hit->surface() != &(ts.surface()))
0047 propagated = thePropagator->propagate(ts, *(hit->surface()));
0048 if (!propagated.isValid())
0049 return std::make_shared<InvalidTrackingRecHit>(*hit->det(), TrackingRecHit::missing);
0050
0051
0052
0053 TrackingRecHit::RecHitPointer updatedOriginal = hc.makeShared(hit, propagated);
0054
0055
0056
0057 LocalTrajectoryParameters ltp(updatedOriginal->localPosition(), propagated.localMomentum(), propagated.charge());
0058 AlgebraicSymMatrix55 ltem;
0059 ltem(3, 3) = (updatedOriginal->parametersError())(1, 1);
0060 ltem(4, 4) = (updatedOriginal->parametersError())(2, 2);
0061 ltem(3, 4) = (updatedOriginal->parametersError())(1, 2);
0062
0063 LocalTrajectoryError lte(ltem);
0064
0065 TrajectoryStateOnSurface hit_state(ltp, lte, propagated.surface(), propagated.magneticField());
0066 TrajectoryStateOnSurface projected_hit_state = thePropagator->propagate(hit_state, det.surface());
0067 if (!projected_hit_state.isValid())
0068 return std::make_shared<InvalidTrackingRecHit>(*hit->det(), TrackingRecHit::missing);
0069 LocalPoint p = projected_hit_state.localPosition();
0070 LocalError e = projected_hit_state.localError().positionError();
0071
0072
0073
0074
0075
0076 return ResultingHit::build(p, e, &det, updatedOriginal->det(), updatedOriginal, this);
0077 }
0078
0079 private:
0080 const AnalyticalPropagator* thePropagator;
0081 };
0082
0083 #endif