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