00001
00002
00003
00004
00005 #include "RecoJets/JetAssociationAlgorithms/interface/JetTracksAssociationDRCalo.h"
00006
00007 #include "DataFormats/JetReco/interface/Jet.h"
00008 #include "DataFormats/TrackReco/interface/Track.h"
00009
00010 #include "DataFormats/Math/interface/deltaR.h"
00011 #include "DataFormats/Math/interface/Vector3D.h"
00012
00013 #include "DataFormats/GeometrySurface/interface/Cylinder.h"
00014 #include "DataFormats/GeometrySurface/interface/Plane.h"
00015
00016 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00017 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00018 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00019 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00020 #include "MagneticField/Engine/interface/MagneticField.h"
00021
00022
00023 namespace {
00024
00025 const double rBarrel = 129.;
00026 const double zEndcap = 320.;
00027 const double zVF = 1100.;
00028 const double rEndcapMin = zEndcap * tan ( 2*atan (exp (-3.)));
00029 const double rVFMin = zEndcap * tan ( 2*atan (exp (-5.191)));
00030
00031 struct ImpactPoint {
00032 unsigned index;
00033 double eta;
00034 double phi;
00035 };
00036
00037 GlobalPoint propagateTrackToCalo (const reco::Track& fTrack,
00038 const MagneticField& fField,
00039 const Propagator& fPropagator)
00040 {
00041 GlobalPoint trackPosition (fTrack.vx(), fTrack.vy(), fTrack.vz());
00042 GlobalVector trackMomentum (fTrack.px(), fTrack.py(), fTrack.pz());
00043 if (fTrack.extra().isAvailable() ) {
00044 trackPosition = GlobalPoint (fTrack.outerX(), fTrack.outerY(), fTrack.outerZ());
00045 trackMomentum = GlobalVector (fTrack.outerPx(), fTrack.outerPy(), fTrack.outerPz());
00046 }
00047
00048
00049
00050
00051 GlobalTrajectoryParameters trackParams(trackPosition, trackMomentum, fTrack.charge(), &fField);
00052 FreeTrajectoryState trackState (trackParams);
00053
00054
00055 TrajectoryStateOnSurface
00056 propagatedInfo = fPropagator.propagate (trackState,
00057 *Cylinder::build (rBarrel, Surface::PositionType (0,0,0),
00058 Surface::RotationType())
00059 );
00060 if (propagatedInfo.isValid()) {
00061 GlobalPoint result (propagatedInfo.globalPosition ());
00062 if (fabs (result.z()) < zEndcap) {
00063
00064
00065
00066 return result;
00067 }
00068 }
00069
00070
00071 double zTarget = trackMomentum.z() > 0 ? zEndcap : -zEndcap;
00072 propagatedInfo = fPropagator.propagate (trackState,
00073 *Plane::build( Surface::PositionType(0, 0, zTarget),
00074 Surface::RotationType())
00075 );
00076 if (propagatedInfo.isValid()) {
00077 GlobalPoint result (propagatedInfo.globalPosition ());
00078 if (fabs (result.perp()) > rEndcapMin) {
00079
00080
00081
00082 return result;
00083 }
00084 }
00085
00086 zTarget = trackMomentum.z() > 0 ? zVF : -zVF;
00087 propagatedInfo = fPropagator.propagate (trackState,
00088 *Plane::build( Surface::PositionType(0, 0, zTarget),
00089 Surface::RotationType())
00090 );
00091 if (propagatedInfo.isValid()) {
00092 GlobalPoint result (propagatedInfo.globalPosition ());
00093 if (fabs (result.perp()) > rVFMin) {
00094
00095
00096
00097 return result;
00098 }
00099 }
00100
00101
00102 return GlobalPoint (0, 0, 0);
00103 }
00104 }
00105
00106 JetTracksAssociationDRCalo::JetTracksAssociationDRCalo (double fDr)
00107 : mDeltaR2Threshold (fDr*fDr)
00108 {}
00109
00110 void JetTracksAssociationDRCalo::produce (reco::JetTracksAssociation::Container* fAssociation,
00111 const std::vector <edm::RefToBase<reco::Jet> >& fJets,
00112 const std::vector <reco::TrackRef>& fTracks,
00113 const MagneticField& fField,
00114 const Propagator& fPropagator) const
00115 {
00116
00117 std::vector<ImpactPoint> impacts;
00118 for (unsigned t = 0; t < fTracks.size(); ++t) {
00119 GlobalPoint impact = propagateTrackToCalo (*(fTracks[t]), fField, fPropagator);
00120 if (impact.mag () > 0) {
00121 ImpactPoint goodTrack;
00122 goodTrack.index = t;
00123 goodTrack.eta = impact.eta ();
00124 goodTrack.phi = impact.barePhi();
00125 impacts.push_back (goodTrack);
00126 }
00127 }
00128
00129 for (unsigned j = 0; j < fJets.size(); ++j) {
00130 reco::TrackRefVector assoTracks;
00131 const reco::Jet* jet = &*(fJets[j]);
00132 double jetEta = jet->eta();
00133 double jetPhi = jet->phi();
00134 for (unsigned t = 0; t < impacts.size(); ++t) {
00135 double dR2 = deltaR2 (jetEta, jetPhi, impacts[t].eta, impacts[t].phi);
00136 if (dR2 < mDeltaR2Threshold) assoTracks.push_back (fTracks[impacts[t].index]);
00137 }
00138 reco::JetTracksAssociation::setValue (fAssociation, fJets[j], assoTracks);
00139 }
00140 }
00141
00142 math::XYZPoint JetTracksAssociationDRCalo::propagateTrackToCalorimeter (const reco::Track& fTrack,
00143 const MagneticField& fField,
00144 const Propagator& fPropagator)
00145 {
00146 GlobalPoint result (propagateTrackToCalo (fTrack, fField, fPropagator));
00147 return math::XYZPoint (result.x(), result.y(), result.z());
00148 }