00001 #include "TrackingTools/TransientTrack/interface/GsfTransientTrack.h" 00002 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h" 00003 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h" 00004 #include "TrackingTools/GsfTools/interface/GsfPropagatorAdapter.h" 00005 #include "TrackingTools/GsfTools/interface/MultiTrajectoryStateTransform.h" 00006 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h" 00007 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h" 00008 #include <iostream> 00009 00010 using namespace reco; 00011 using namespace std; 00012 00013 00014 00015 GsfTransientTrack::GsfTransientTrack() : 00016 GsfTrack(), tkr_(), theField(0), initialTSOSAvailable(false), 00017 initialTSCPAvailable(false), blStateAvailable(false), theTIPExtrapolator() 00018 {} 00019 00020 GsfTransientTrack::GsfTransientTrack( const GsfTrack & tk , const MagneticField* field) : 00021 GsfTrack(tk), 00022 tkr_(), theField(field), initialTSOSAvailable(false), 00023 initialTSCPAvailable(false), blStateAvailable(false) 00024 { 00025 TrajectoryStateTransform theTransform; 00026 initialFTS = theTransform.initialFreeState(tk, field); 00027 } 00028 00029 00030 GsfTransientTrack::GsfTransientTrack( const GsfTrackRef & tk , const MagneticField* field) : 00031 GsfTrack(*tk), 00032 tkr_(tk), theField(field), initialTSOSAvailable(false), 00033 initialTSCPAvailable(false), blStateAvailable(false), 00034 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) 00035 { 00036 TrajectoryStateTransform theTransform; 00037 initialFTS = theTransform.initialFreeState(*tk, field); 00038 } 00039 00040 GsfTransientTrack::GsfTransientTrack( const GsfTrack & tk , const MagneticField* field, 00041 const edm::ESHandle<GlobalTrackingGeometry>& tg) : 00042 GsfTrack(tk), 00043 tkr_(), theField(field), initialTSOSAvailable(false), 00044 initialTSCPAvailable(false), blStateAvailable(false), theTrackingGeometry(tg), 00045 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) 00046 { 00047 TrajectoryStateTransform theTransform; 00048 initialFTS = theTransform.initialFreeState(tk, field); 00049 } 00050 00051 GsfTransientTrack::GsfTransientTrack( const GsfTrackRef & tk , const MagneticField* field, 00052 const edm::ESHandle<GlobalTrackingGeometry>& tg) : 00053 GsfTrack(*tk), 00054 tkr_(tk), theField(field), initialTSOSAvailable(false), 00055 initialTSCPAvailable(false), blStateAvailable(false), theTrackingGeometry(tg), 00056 theTIPExtrapolator(AnalyticalPropagator(field, alongMomentum)) 00057 { 00058 TrajectoryStateTransform theTransform; 00059 initialFTS = theTransform.initialFreeState(*tk, field); 00060 } 00061 00062 00063 GsfTransientTrack::GsfTransientTrack( const GsfTransientTrack & tt ) : 00064 GsfTrack(tt), 00065 tkr_(tt.persistentTrackRef()), theField(tt.field()), 00066 initialFTS(tt.initialFreeState()), initialTSOSAvailable(false), 00067 initialTSCPAvailable(false), 00068 theTIPExtrapolator(AnalyticalPropagator(tt.field(), alongMomentum)) 00069 { 00070 if (tt.initialTSOSAvailable) { 00071 initialTSOS= tt.impactPointState(); 00072 initialTSOSAvailable = true; 00073 } 00074 if (tt.initialTSCPAvailable) { 00075 initialTSCP= tt.impactPointTSCP(); 00076 initialTSCPAvailable = true; 00077 } 00078 } 00079 00080 00081 00082 void GsfTransientTrack::setES(const edm::EventSetup& setup) { 00083 00084 setup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry); 00085 00086 } 00087 00088 void GsfTransientTrack::setTrackingGeometry(const edm::ESHandle<GlobalTrackingGeometry>& tg) { 00089 00090 theTrackingGeometry = tg; 00091 00092 } 00093 00094 void GsfTransientTrack::setBeamSpot(const BeamSpot& beamSpot) 00095 { 00096 theBeamSpot = beamSpot; 00097 blStateAvailable = false; 00098 } 00099 00100 00101 TrajectoryStateOnSurface GsfTransientTrack::impactPointState() const 00102 { 00103 if (!initialTSOSAvailable) calculateTSOSAtVertex(); 00104 return initialTSOS; 00105 } 00106 00107 TrajectoryStateClosestToPoint GsfTransientTrack::impactPointTSCP() const 00108 { 00109 if (!initialTSCPAvailable) { 00110 initialTSCP = builder(initialFTS, initialFTS.position()); 00111 initialTSCPAvailable = true; 00112 } 00113 return initialTSCP; 00114 } 00115 00116 TrajectoryStateOnSurface GsfTransientTrack::outermostMeasurementState() const 00117 { 00118 MultiTrajectoryStateTransform theTransform; 00119 return theTransform.outerStateOnSurface((*this),*theTrackingGeometry,theField); 00120 } 00121 00122 TrajectoryStateOnSurface GsfTransientTrack::innermostMeasurementState() const 00123 { 00124 MultiTrajectoryStateTransform theTransform; 00125 return theTransform.innerStateOnSurface((*this),*theTrackingGeometry,theField); 00126 } 00127 00128 void GsfTransientTrack::calculateTSOSAtVertex() const 00129 { 00130 TransverseImpactPointExtrapolator tipe(theField); 00131 initialTSOS = tipe.extrapolate(initialFTS, initialFTS.position()); 00132 initialTSOSAvailable = true; 00133 } 00134 00135 TrajectoryStateOnSurface 00136 GsfTransientTrack::stateOnSurface(const GlobalPoint & point) const 00137 { 00138 return theTIPExtrapolator.extrapolate(innermostMeasurementState(), point); 00139 } 00140 00141 00142 TrajectoryStateClosestToPoint 00143 GsfTransientTrack::trajectoryStateClosestToPoint( const GlobalPoint & point ) const 00144 { 00145 return builder(stateOnSurface(point), point); 00146 } 00147 00148 TrajectoryStateClosestToBeamLine GsfTransientTrack::stateAtBeamLine() const 00149 { 00150 if (!blStateAvailable) { 00151 TSCBLBuilderNoMaterial blsBuilder; 00152 trajectoryStateClosestToBeamLine = blsBuilder(initialFTS, theBeamSpot); 00153 blStateAvailable = true; 00154 } 00155 return trajectoryStateClosestToBeamLine; 00156 } 00157