File indexing completed on 2024-04-06 12:31:42
0001 #include "TrackingTools/TransientTrack/interface/GsfTransientTrack.h"
0002 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
0003 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
0004 #include "TrackingTools/GsfTools/interface/GsfPropagatorAdapter.h"
0005 #include "TrackingTools/GsfTools/interface/MultiTrajectoryStateTransform.h"
0006 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0007 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
0008 #include <iostream>
0009
0010 using namespace reco;
0011 using namespace std;
0012
0013 GsfTransientTrack::GsfTransientTrack()
0014 : GsfTrack(),
0015 tkr_(),
0016 hasTime(false),
0017 timeExt_(0.),
0018 dtErrorExt_(0.),
0019 theField(nullptr),
0020 initialTSOSAvailable(false),
0021 initialTSCPAvailable(false),
0022 blStateAvailable(false),
0023 theTIPExtrapolator() {}
0024
0025 GsfTransientTrack::GsfTransientTrack(const GsfTrack& tk, const MagneticField* field)
0026 : GsfTrack(tk),
0027 tkr_(),
0028 hasTime(false),
0029 timeExt_(0.),
0030 dtErrorExt_(0.),
0031 theField(field),
0032 initialTSOSAvailable(false),
0033 initialTSCPAvailable(false),
0034 blStateAvailable(false) {
0035 initialFTS = trajectoryStateTransform::initialFreeState(tk, field);
0036 }
0037
0038 GsfTransientTrack::GsfTransientTrack(const GsfTrack& tk,
0039 const double time,
0040 const double dtime,
0041 const MagneticField* field)
0042 : GsfTrack(tk),
0043 tkr_(),
0044 hasTime(true),
0045 timeExt_(time),
0046 dtErrorExt_(dtime),
0047 theField(field),
0048 initialTSOSAvailable(false),
0049 initialTSCPAvailable(false),
0050 blStateAvailable(false) {
0051 initialFTS = trajectoryStateTransform::initialFreeState(tk, field);
0052 }
0053
0054 GsfTransientTrack::GsfTransientTrack(const GsfTrackRef& tk, const MagneticField* field)
0055 : GsfTrack(*tk),
0056 tkr_(tk),
0057 hasTime(false),
0058 timeExt_(0.),
0059 dtErrorExt_(0.),
0060 theField(field),
0061 initialTSOSAvailable(false),
0062 initialTSCPAvailable(false),
0063 blStateAvailable(false),
0064 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) {
0065 initialFTS = trajectoryStateTransform::initialFreeState(*tk, field);
0066 }
0067
0068 GsfTransientTrack::GsfTransientTrack(const GsfTrackRef& tk,
0069 const double time,
0070 const double dtime,
0071 const MagneticField* field)
0072 : GsfTrack(*tk),
0073 tkr_(tk),
0074 hasTime(true),
0075 timeExt_(time),
0076 dtErrorExt_(dtime),
0077 theField(field),
0078 initialTSOSAvailable(false),
0079 initialTSCPAvailable(false),
0080 blStateAvailable(false),
0081 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) {
0082 initialFTS = trajectoryStateTransform::initialFreeState(*tk, field);
0083 }
0084
0085 GsfTransientTrack::GsfTransientTrack(const GsfTrack& tk,
0086 const MagneticField* field,
0087 const edm::ESHandle<GlobalTrackingGeometry>& tg)
0088 : GsfTrack(tk),
0089 tkr_(),
0090 hasTime(false),
0091 timeExt_(0.),
0092 dtErrorExt_(0.),
0093 theField(field),
0094 initialTSOSAvailable(false),
0095 initialTSCPAvailable(false),
0096 blStateAvailable(false),
0097 theTrackingGeometry(tg),
0098 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) {
0099 initialFTS = trajectoryStateTransform::initialFreeState(tk, field);
0100 }
0101
0102 GsfTransientTrack::GsfTransientTrack(const GsfTrack& tk,
0103 const double time,
0104 const double dtime,
0105 const MagneticField* field,
0106 const edm::ESHandle<GlobalTrackingGeometry>& tg)
0107 : GsfTrack(tk),
0108 tkr_(),
0109 hasTime(true),
0110 timeExt_(time),
0111 dtErrorExt_(dtime),
0112 theField(field),
0113 initialTSOSAvailable(false),
0114 initialTSCPAvailable(false),
0115 blStateAvailable(false),
0116 theTrackingGeometry(tg),
0117 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) {
0118 initialFTS = trajectoryStateTransform::initialFreeState(tk, field);
0119 }
0120
0121 GsfTransientTrack::GsfTransientTrack(const GsfTrackRef& tk,
0122 const MagneticField* field,
0123 const edm::ESHandle<GlobalTrackingGeometry>& tg)
0124 : GsfTrack(*tk),
0125 tkr_(tk),
0126 hasTime(false),
0127 timeExt_(0.),
0128 dtErrorExt_(0.),
0129 theField(field),
0130 initialTSOSAvailable(false),
0131 initialTSCPAvailable(false),
0132 blStateAvailable(false),
0133 theTrackingGeometry(tg),
0134 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) {
0135 initialFTS = trajectoryStateTransform::initialFreeState(*tk, field);
0136 }
0137
0138 GsfTransientTrack::GsfTransientTrack(const GsfTrackRef& tk,
0139 const double time,
0140 const double dtime,
0141 const MagneticField* field,
0142 const edm::ESHandle<GlobalTrackingGeometry>& tg)
0143 : GsfTrack(*tk),
0144 tkr_(tk),
0145 hasTime(true),
0146 timeExt_(time),
0147 dtErrorExt_(dtime),
0148 theField(field),
0149 initialTSOSAvailable(false),
0150 initialTSCPAvailable(false),
0151 blStateAvailable(false),
0152 theTrackingGeometry(tg),
0153 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) {
0154 initialFTS = trajectoryStateTransform::initialFreeState(*tk, field);
0155 }
0156
0157 GsfTransientTrack::GsfTransientTrack(const GsfTransientTrack& tt)
0158 : GsfTrack(tt),
0159 tkr_(tt.persistentTrackRef()),
0160 hasTime(tt.hasTime),
0161 timeExt_(tt.timeExt_),
0162 dtErrorExt_(tt.dtErrorExt_),
0163 theField(tt.field()),
0164 initialFTS(tt.initialFreeState()),
0165 initialTSOSAvailable(false),
0166 initialTSCPAvailable(false),
0167 theTIPExtrapolator(AnalyticalPropagator(tt.field(), alongMomentum)) {
0168 if (tt.initialTSOSAvailable) {
0169 initialTSOS = tt.impactPointState();
0170 initialTSOSAvailable = true;
0171 }
0172 if (tt.initialTSCPAvailable) {
0173 initialTSCP = tt.impactPointTSCP();
0174 initialTSCPAvailable = true;
0175 }
0176 }
0177
0178 void GsfTransientTrack::setTrackingGeometry(const edm::ESHandle<GlobalTrackingGeometry>& tg) {
0179 theTrackingGeometry = tg;
0180 }
0181
0182 void GsfTransientTrack::setBeamSpot(const BeamSpot& beamSpot) {
0183 theBeamSpot = beamSpot;
0184 blStateAvailable = false;
0185 }
0186
0187 TrajectoryStateOnSurface GsfTransientTrack::impactPointState() const {
0188 if (!initialTSOSAvailable)
0189 calculateTSOSAtVertex();
0190 return initialTSOS;
0191 }
0192
0193 TrajectoryStateClosestToPoint GsfTransientTrack::impactPointTSCP() const {
0194 if (!initialTSCPAvailable) {
0195 initialTSCP = builder(initialFTS, initialFTS.position());
0196 initialTSCPAvailable = true;
0197 }
0198 return initialTSCP;
0199 }
0200
0201 TrajectoryStateOnSurface GsfTransientTrack::outermostMeasurementState() const {
0202 return MultiTrajectoryStateTransform::outerStateOnSurface(*this, *theTrackingGeometry, theField);
0203 }
0204
0205 TrajectoryStateOnSurface GsfTransientTrack::innermostMeasurementState() const {
0206 return MultiTrajectoryStateTransform::innerStateOnSurface(*this, *theTrackingGeometry, theField);
0207 }
0208
0209 void GsfTransientTrack::calculateTSOSAtVertex() const {
0210 TransverseImpactPointExtrapolator tipe(theField);
0211 initialTSOS = tipe.extrapolate(initialFTS, initialFTS.position());
0212 initialTSOSAvailable = true;
0213 }
0214
0215 TrajectoryStateOnSurface GsfTransientTrack::stateOnSurface(const GlobalPoint& point) const {
0216 return theTIPExtrapolator.extrapolate(innermostMeasurementState(), point);
0217 }
0218
0219 TrajectoryStateClosestToPoint GsfTransientTrack::trajectoryStateClosestToPoint(const GlobalPoint& point) const {
0220 return builder(stateOnSurface(point), point);
0221 }
0222
0223 TrajectoryStateClosestToBeamLine GsfTransientTrack::stateAtBeamLine() const {
0224 if (!blStateAvailable) {
0225 TSCBLBuilderNoMaterial blsBuilder;
0226 trajectoryStateClosestToBeamLine = blsBuilder(initialFTS, theBeamSpot);
0227 blStateAvailable = true;
0228 }
0229 return trajectoryStateClosestToBeamLine;
0230 }