CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC4_patch1/src/TrackingTools/TransientTrack/src/GsfTransientTrack.cc

Go to the documentation of this file.
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   
00026   initialFTS = trajectoryStateTransform::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   
00037   initialFTS = trajectoryStateTransform::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   
00048   initialFTS = trajectoryStateTransform::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   
00059   initialFTS = trajectoryStateTransform::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 theMTransform;
00119     return theMTransform.outerStateOnSurface((*this),*theTrackingGeometry,theField);
00120 }
00121 
00122 TrajectoryStateOnSurface GsfTransientTrack::innermostMeasurementState() const
00123 {
00124     MultiTrajectoryStateTransform theMTransform;   
00125     return theMTransform.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