File indexing completed on 2024-04-06 12:31:31
0001 #include "TrackingTools/GsfTracking/interface/GsfConstraintAtVertex.h"
0002
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004
0005 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0006 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0007 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
0008 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
0009 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
0010 #include "DataFormats/GeometrySurface/interface/Surface.h"
0011
0012
0013
0014 #include "TrackingTools/GsfTools/interface/GsfPropagatorAdapter.h"
0015 #include "TrackingTools/PatternTools/interface/TransverseImpactPointExtrapolator.h"
0016 #include "TrackingTools/GsfTracking/interface/GsfMultiStateUpdator.h"
0017 #include "DataFormats/GeometryCommonDetAlgo/interface/ErrorFrameTransformer.h"
0018
0019 GsfConstraintAtVertex::GsfConstraintAtVertex(const TrackerGeometry* geometry, const MagneticField* magField)
0020 : geometry_(geometry),
0021 magField_(magField),
0022 gsfPropagator_(AnalyticalPropagator(magField, anyDirection)),
0023 tipExtrapolator_(gsfPropagator_) {}
0024
0025 TrajectoryStateOnSurface GsfConstraintAtVertex::constrainAtBeamSpot(const reco::GsfTrack& track,
0026 const reco::BeamSpot& beamSpot) const {
0027
0028
0029
0030 GlobalPoint bsPosGlobal(beamSpot.x0(), beamSpot.y0(), beamSpot.z0());
0031 GlobalError bsCovGlobal(beamSpot.rotatedCovariance3D());
0032
0033 return constrainAtPoint(track, bsPosGlobal, bsCovGlobal);
0034 }
0035
0036 TrajectoryStateOnSurface GsfConstraintAtVertex::constrainAtVertex(const reco::GsfTrack& track,
0037 const reco::Vertex& vertex) const {
0038
0039
0040
0041 GlobalPoint vtxPosGlobal(vertex.position().x(), vertex.position().y(), vertex.position().z());
0042 GlobalError vtxCovGlobal(vertex.covariance());
0043
0044 return constrainAtPoint(track, vtxPosGlobal, vtxCovGlobal);
0045 }
0046
0047 TrajectoryStateOnSurface GsfConstraintAtVertex::constrainAtPoint(const reco::GsfTrack& track,
0048 const GlobalPoint& globalPosition,
0049 const GlobalError& globalError) const {
0050
0051
0052
0053 TrajectoryStateOnSurface innerState = multiStateTransformer_.innerStateOnSurface(track, *geometry_, magField_);
0054 if (!innerState.isValid())
0055 return TrajectoryStateOnSurface();
0056 TrajectoryStateOnSurface tipState = tipExtrapolator_.extrapolate(innerState, globalPosition);
0057 if (!tipState.isValid())
0058 return TrajectoryStateOnSurface();
0059
0060
0061
0062 LocalError bsCovLocal = ErrorFrameTransformer().transform(globalError, tipState.surface());
0063 auto bsHit =
0064 TRecHit2DPosConstraint::build(tipState.surface().toLocal(globalPosition), bsCovLocal, &tipState.surface());
0065
0066
0067
0068 TrajectoryStateOnSurface updatedState = gsfUpdator_.update(tipState, *bsHit);
0069 if (!updatedState.isValid()) {
0070 edm::LogWarning("GsfConstraintAtVertex") << " GSF update with vertex constraint failed";
0071 return TrajectoryStateOnSurface();
0072 }
0073
0074 return updatedState;
0075 }