00001 #include "RecoJets/JetAssociationProducers/interface/TrackExtrapolator.h"
00002 #include "TrackingTools/TrackAssociator/interface/EcalDetIdAssociator.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 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
00068
00069 for ( std::vector<reco::TrackRef>::const_iterator trkBegin = goodTracks.begin(),
00070 trkEnd = goodTracks.end(), itrk = trkBegin;
00071 itrk != trkEnd; ++itrk ) {
00072 std::vector<reco::TrackBase::Point> vresultPos;
00073 std::vector<reco::TrackBase::Vector> vresultMom;
00074 std::vector<reco::TrackBase::Vector> vresultDir;
00075 std::vector<bool> visValid;
00076
00077 reco::TrackBase::Point resultPos;
00078 reco::TrackBase::Vector resultMom;
00079 reco::TrackBase::Vector resultDir;
00080 bool isValid = propagateTrackToVolume( **itrk, *field_h, *propagator_h, ecalvolume,
00081 resultPos, resultMom, resultDir );
00082 visValid.push_back(isValid);
00083 vresultPos.push_back( resultPos );
00084 vresultMom.push_back( resultMom );
00085 vresultDir.push_back( resultDir );
00086
00087 extrapolations->push_back( reco::TrackExtrapolation( *itrk,
00088 visValid,
00089 vresultPos,
00090 vresultMom,
00091 vresultDir ) );
00092 }
00093
00094 iEvent.put( extrapolations );
00095 }
00096
00097
00098 void
00099 TrackExtrapolator::beginJob()
00100 {
00101 }
00102
00103
00104 void
00105 TrackExtrapolator::endJob() {
00106 }
00107
00108
00109
00110
00111
00112
00113 bool TrackExtrapolator::propagateTrackToVolume( const reco::Track& fTrack,
00114 const MagneticField& fField,
00115 const Propagator& fPropagator,
00116 const FiducialVolume& volume,
00117 reco::TrackBase::Point & resultPos,
00118 reco::TrackBase::Vector & resultMom,
00119 reco::TrackBase::Vector & resultDir
00120 )
00121 {
00122 GlobalPoint trackPosition (fTrack.vx(), fTrack.vy(), fTrack.vz());
00123 GlobalVector trackMomentum (fTrack.px(), fTrack.py(), fTrack.pz());
00124 if (fTrack.extra().isAvailable() ) {
00125 trackPosition = GlobalPoint (fTrack.outerX(), fTrack.outerY(), fTrack.outerZ());
00126 trackMomentum = GlobalVector (fTrack.outerPx(), fTrack.outerPy(), fTrack.outerPz());
00127 }
00128
00129 GlobalTrajectoryParameters trackParams(trackPosition, trackMomentum, fTrack.charge(), &fField);
00130 FreeTrajectoryState trackState (trackParams);
00131
00132 TrajectoryStateOnSurface
00133 propagatedInfo = fPropagator.propagate (trackState,
00134 *Cylinder::build (Surface::PositionType (0,0,0),
00135 Surface::RotationType(),
00136 volume.minR())
00137 );
00138
00139
00140 double minz=volume.minZ();
00141 if(propagatedInfo.isValid() && propagatedInfo.globalPosition().z()>minz) {
00142 propagatedInfo = fPropagator.propagate (trackState,
00143 *Plane::build (Surface::PositionType (0,0,minz),
00144 Surface::RotationType())
00145 );
00146
00147 } else if(propagatedInfo.isValid() && propagatedInfo.globalPosition().z()<-minz) {
00148 propagatedInfo = fPropagator.propagate (trackState,
00149 *Plane::build (Surface::PositionType (0,0,-minz),
00150 Surface::RotationType())
00151 );
00152 }
00153
00154
00155 if (propagatedInfo.isValid()) {
00156 resultPos = propagatedInfo.globalPosition ();
00157 resultMom = propagatedInfo.globalMomentum ();
00158 resultDir = propagatedInfo.globalDirection();
00159 return true;
00160 }
00161 else {
00162 return false;
00163 }
00164 }
00165
00166
00167
00168
00169
00170 DEFINE_FWK_MODULE(TrackExtrapolator);