00001 #include "RecoJets/JetAssociationProducers/interface/TrackExtrapolator.h"
00002 #include "TrackingTools/TrackAssociator/interface/DetIdAssociator.h"
00003
00004
00005 #include <vector>
00006
00007
00008
00009
00010
00011 TrackExtrapolator::TrackExtrapolator(const edm::ParameterSet& iConfig) :
00012 tracksSrc_(iConfig.getParameter<edm::InputTag> ("trackSrc"))
00013 {
00014 trackQuality_ =
00015 reco::TrackBase::qualityByName (iConfig.getParameter<std::string> ("trackQuality"));
00016 if (trackQuality_ == reco::TrackBase::undefQuality) {
00017 throw cms::Exception("InvalidInput") << "Unknown trackQuality value '"
00018 << iConfig.getParameter<std::string> ("trackQuality")
00019 << "'. See possible values in 'reco::TrackBase::qualityByName'";
00020 }
00021
00022 produces< std::vector<reco::TrackExtrapolation> > ();
00023 }
00024
00025
00026 TrackExtrapolator::~TrackExtrapolator()
00027 {
00028 }
00029
00030
00031
00032
00033
00034
00035
00036 void
00037 TrackExtrapolator::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00038 {
00039
00040
00041 edm::ESHandle<MagneticField> field_h;
00042 iSetup.get<IdealMagneticFieldRecord>().get(field_h);
00043 edm::ESHandle<Propagator> propagator_h;
00044 iSetup.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAlong", propagator_h);
00045 edm::ESHandle<DetIdAssociator> ecalDetIdAssociator_h;
00046 iSetup.get<DetIdAssociatorRecord>().get("EcalDetIdAssociator", ecalDetIdAssociator_h);
00047 FiducialVolume const & ecalvolume = ecalDetIdAssociator_h->volume();
00048
00049
00050 edm::Handle <reco::TrackCollection> tracks_h;
00051 iEvent.getByLabel (tracksSrc_, tracks_h);
00052
00053 std::auto_ptr< std::vector<reco::TrackExtrapolation> > extrapolations( new std::vector<reco::TrackExtrapolation>() );
00054
00055
00056 std::vector <reco::TrackRef> goodTracks;
00057 for ( reco::TrackCollection::const_iterator trkBegin = tracks_h->begin(),
00058 trkEnd = tracks_h->end(), itrk = trkBegin;
00059 itrk != trkEnd; ++itrk ) {
00060 reco::TrackBase::TrackQuality trackQuality = reco::TrackBase::TrackQuality (trackQuality_);
00061
00062
00063 if (itrk->quality (trackQuality)) {
00064 goodTracks.push_back (reco::TrackRef (tracks_h, itrk - trkBegin));
00065 }
00066 }
00067 std::vector<reco::TrackBase::Point> vresultPos(1);
00068 std::vector<reco::TrackBase::Vector> vresultMom(1);
00069
00070
00071
00072 for ( std::vector<reco::TrackRef>::const_iterator trkBegin = goodTracks.begin(),
00073 trkEnd = goodTracks.end(), itrk = trkBegin;
00074 itrk != trkEnd; ++itrk ) {
00075 if( propagateTrackToVolume( **itrk, *field_h, *propagator_h, ecalvolume,
00076 vresultPos[0], vresultMom[0]) ) {
00077 extrapolations->push_back( reco::TrackExtrapolation( *itrk,
00078 vresultPos,
00079 vresultMom ) );
00080 }
00081 }
00082 iEvent.put( extrapolations );
00083 }
00084
00085
00086 void
00087 TrackExtrapolator::beginJob()
00088 {
00089 }
00090
00091
00092 void
00093 TrackExtrapolator::endJob() {
00094 }
00095
00096
00097
00098
00099
00100
00101 bool TrackExtrapolator::propagateTrackToVolume( const reco::Track& fTrack,
00102 const MagneticField& fField,
00103 const Propagator& fPropagator,
00104 const FiducialVolume& volume,
00105 reco::TrackBase::Point & resultPos,
00106 reco::TrackBase::Vector & resultMom
00107 )
00108 {
00109 GlobalPoint trackPosition (fTrack.vx(), fTrack.vy(), fTrack.vz());
00110 GlobalVector trackMomentum (fTrack.px(), fTrack.py(), fTrack.pz());
00111 if (fTrack.extra().isAvailable() ) {
00112 trackPosition = GlobalPoint (fTrack.outerX(), fTrack.outerY(), fTrack.outerZ());
00113 trackMomentum = GlobalVector (fTrack.outerPx(), fTrack.outerPy(), fTrack.outerPz());
00114 }
00115
00116 GlobalTrajectoryParameters trackParams(trackPosition, trackMomentum, fTrack.charge(), &fField);
00117 FreeTrajectoryState trackState (trackParams);
00118
00119 TrajectoryStateOnSurface
00120 propagatedInfo = fPropagator.propagate (trackState,
00121 *Cylinder::build (Surface::PositionType (0,0,0),
00122 Surface::RotationType(),
00123 volume.minR())
00124 );
00125
00126
00127 double minz=volume.minZ();
00128 if(propagatedInfo.isValid() && propagatedInfo.globalPosition().z()>minz) {
00129 propagatedInfo = fPropagator.propagate (trackState,
00130 *Plane::build (Surface::PositionType (0,0,minz),
00131 Surface::RotationType())
00132 );
00133
00134 } else if(propagatedInfo.isValid() && propagatedInfo.globalPosition().z()<-minz) {
00135 propagatedInfo = fPropagator.propagate (trackState,
00136 *Plane::build (Surface::PositionType (0,0,-minz),
00137 Surface::RotationType())
00138 );
00139 }
00140
00141
00142 if (propagatedInfo.isValid()) {
00143 resultPos = propagatedInfo.globalPosition ();
00144 resultMom = propagatedInfo.globalMomentum ();
00145 return true;
00146 }
00147 else {
00148 return false;
00149 }
00150 }
00151
00152
00153
00154
00155
00156 DEFINE_FWK_MODULE(TrackExtrapolator);