CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/RecoJets/JetAssociationAlgorithms/src/JetTracksAssociationDRCalo.cc

Go to the documentation of this file.
00001 // Associate jets with tracks by simple "dR" criteria
00002 // Fedor Ratnikov (UMd), Aug. 28, 2007
00003 // $Id: JetTracksAssociationDRCalo.cc,v 1.10 2012/12/26 14:25:08 innocent Exp $
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   // basic geometry constants, imported from Geometry/HcalTowerAlgo/src/CaloTowerHardcodeGeometryLoader.cc
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()); // reference point
00042     GlobalVector trackMomentum (fTrack.px(), fTrack.py(), fTrack.pz()); // reference momentum
00043     if (fTrack.extra().isAvailable() ) { // use outer point information, if available
00044       trackPosition =  GlobalPoint (fTrack.outerX(), fTrack.outerY(), fTrack.outerZ());
00045       trackMomentum = GlobalVector (fTrack.outerPx(), fTrack.outerPy(), fTrack.outerPz());
00046     }
00047 //     std::cout << "propagateTrackToCalo-> start propagating track"
00048 //            << " x/y/z: " << trackPosition.x() << '/' << trackPosition.y() << '/' << trackPosition.z()
00049 //            << ", pt/eta/phi: " << trackMomentum.perp() << '/' << trackMomentum.eta() << '/' << trackMomentum.barePhi()
00050 //            << std::endl;
00051     GlobalTrajectoryParameters trackParams(trackPosition, trackMomentum, fTrack.charge(), &fField);
00052     FreeTrajectoryState trackState (trackParams);
00053 
00054     // first propagate to barrel
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 //      std::cout << "propagateTrackToCalo-> propagated to barrel:"
00064 //                << " x/y/z/r: " << result.x() << '/' << result.y() << '/' << result.z() << '/' << result.perp()
00065 //                << std::endl;
00066         return result;
00067       }
00068     }
00069     
00070     // failed with barrel, try endcap
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 //      std::cout << "propagateTrackToCalo-> propagated to endcap:"
00080 //                << " x/y/z/r: " << result.x() << '/' << result.y() << '/' << result.z() << '/' << result.perp()
00081 //                << std::endl;
00082         return result;
00083       }
00084     }
00085     // failed with endcap, try VF
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 //      std::cout << "propagateTrackToCalo-> propagated to VF:"
00095 //                << " x/y/z/r: " << result.x() << '/' << result.y() << '/' << result.z() << '/' << result.perp()
00096 //                << std::endl;
00097         return result;
00098       }
00099     }
00100     // no luck
00101 //     std::cout << "propagateTrackToCalo-> failed to propagate track to calorimeter" << std::endl;
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   // cache track parameters
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) { // successful extrapolation
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 }