CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/BTauReco/src/IsolatedTauTagInfo.cc

Go to the documentation of this file.
00001 #include "DataFormats/BTauReco/interface/IsolatedTauTagInfo.h"
00002 #include "DataFormats/TrackReco/interface/Track.h" 
00003 #include "DataFormats/TrackReco/interface/TrackFwd.h" 
00004 #include <Math/GenVector/VectorUtil.h>
00005 
00006 using namespace edm;
00007 using namespace reco;
00008 
00009 const RefVector<TrackCollection> IsolatedTauTagInfo::tracksInCone( const math::XYZVector myVector, const float size,  const float pt_min) const { 
00010   
00011   RefVector<TrackCollection> tmp;
00012  
00013   RefVector<TrackCollection>::const_iterator myTrack = selectedTracks_.begin();
00014   for(;myTrack != selectedTracks_.end(); myTrack++)
00015     {
00016       const math::XYZVector trackMomentum = (*myTrack)->momentum() ;
00017       float pt_tk = (*myTrack)->pt();
00018       float deltaR = ROOT::Math::VectorUtil::DeltaR(myVector, trackMomentum);
00019       if ( deltaR < size && pt_tk > pt_min) tmp.push_back( *myTrack);
00020       }
00021 
00022   //  sort(tmp.begin(), tmp.end(), SortByDescendingTrackPt());
00023   return tmp;
00024 }
00025 
00026 const RefVector<TrackCollection> IsolatedTauTagInfo::tracksInCone( const math::XYZVector myVector, const float size,  const float pt_min, const float z_pv, const float dz_lt) const { 
00027   
00028   RefVector<TrackCollection> tmp;
00029  
00030   RefVector<TrackCollection>::const_iterator myTrack = selectedTracks_.begin();
00031   for(;myTrack != selectedTracks_.end(); myTrack++)
00032     {
00033       const math::XYZVector trackMomentum = (*myTrack)->momentum() ;
00034       float pt_tk = (*myTrack)->pt();
00035       float deltaR = ROOT::Math::VectorUtil::DeltaR(myVector, trackMomentum);
00036       if ( deltaR < size && pt_tk > pt_min && fabs((*myTrack)->dz() - z_pv) < dz_lt) tmp.push_back( *myTrack);
00037       }
00038 
00039   //  sort(tmp.begin(), tmp.end(), SortByDescendingTrackPt());
00040   return tmp;
00041 }
00042 
00043 
00044 void IsolatedTauTagInfo::setLeadingTrack(const TrackRef leadTk) {
00045   leadTrack_ = leadTk ;
00046 
00047 }
00048 
00049 const TrackRef  IsolatedTauTagInfo::leadingSignalTrack() const {
00050   return leadTrack_;
00051 }
00052 
00053 const TrackRef IsolatedTauTagInfo::leadingSignalTrack(const float rm_cone, const float pt_min) const {
00054 
00055   const Jet & myjet = * jet(); 
00056   math::XYZVector jet3Vec   (myjet.px(),myjet.py(),myjet.pz()) ;
00057 
00058   const  RefVector<TrackCollection>  sTracks = tracksInCone(jet3Vec, rm_cone, pt_min);
00059   TrackRef leadTk;
00060   float pt_cut = pt_min;
00061   if (sTracks.size() >0) 
00062     {
00063       RefVector<TrackCollection>::const_iterator myTrack =sTracks.begin();
00064       for(;myTrack!=sTracks.end();myTrack++)
00065         {
00066           if((*myTrack)->pt() > pt_cut) {
00067             leadTk = *myTrack;
00068             pt_cut = (*myTrack)->pt();
00069           }
00070         }
00071     }
00072   return leadTk;
00073 }
00074 
00075 
00076 const TrackRef  IsolatedTauTagInfo::leadingSignalTrack(const math::XYZVector myVector, const float rm_cone, const float pt_min) const {
00077   const RefVector<TrackCollection> sTracks = tracksInCone(myVector, rm_cone, pt_min);
00078   TrackRef leadTk;
00079   float pt_cut = pt_min;
00080   if (sTracks.size() >0) 
00081     {
00082       RefVector<TrackCollection>::const_iterator myTrack =sTracks.begin();
00083       for(;myTrack!=sTracks.end();myTrack++)
00084         {
00085           if((*myTrack)->pt() > pt_cut) {
00086             leadTk = *myTrack;
00087             pt_cut = (*myTrack)->pt();
00088           }
00089         }
00090     }
00091   return leadTk;
00092 }
00093 
00094 float IsolatedTauTagInfo::discriminator(float m_cone, float sig_cone, float iso_cone, float pt_min_lt, float pt_min_tk, int nTracksIsoRing) const
00095 {
00096   double myDiscriminator = 0.;
00097   const TrackRef leadTk = leadingSignalTrack(m_cone, pt_min_lt);
00098 
00099   if(!leadTk) {
00100     return myDiscriminator;
00101   }
00102   //if signal cone is greater then the isolation cone and the leadTk exists, the jet is isolated.
00103   if(sig_cone > iso_cone) return 1.;
00104 
00105   math::XYZVector trackMomentum = leadTk->momentum() ;
00106   const RefVector<TrackCollection> signalTracks = tracksInCone(trackMomentum, sig_cone, pt_min_tk);
00107   const RefVector<TrackCollection> isolationTracks = tracksInCone(trackMomentum, iso_cone, pt_min_tk); 
00108   
00109   if (signalTracks.size() > 0 && (int)(isolationTracks.size() - signalTracks.size()) <= nTracksIsoRing)
00110     myDiscriminator=1;
00111 
00112   return myDiscriminator;
00113 }
00114 
00115 float IsolatedTauTagInfo::discriminator(math::XYZVector myVector, float m_cone, float sig_cone, float iso_cone, float pt_min_lt, float pt_min_tk, int nTracksIsoRing) const
00116 {
00117   double myDiscriminator = 0;
00118   //if signal cone is greater then the isolation cone and the leadTk exists, the jet is isolated.
00119   if(sig_cone > iso_cone) return 1.;
00120 
00121 const  TrackRef leadTk = leadingSignalTrack(myVector, m_cone, pt_min_lt);
00122   if(!leadTk) return myDiscriminator;
00123 
00124   //if signal cone is greater then the isolation cone and the leadTk exists, the jet is isolated.
00125   if(sig_cone > iso_cone) return 1.;
00126 
00127   math::XYZVector trackMomentum = leadTk->momentum() ;
00128   const RefVector<TrackCollection> signalTracks = tracksInCone(trackMomentum, sig_cone, pt_min_tk);
00129   const RefVector<TrackCollection> isolationTracks = tracksInCone(trackMomentum, iso_cone, pt_min_tk); 
00130   
00131   if (signalTracks.size() > 0 && (int)(isolationTracks.size() - signalTracks.size()) <= nTracksIsoRing)
00132     myDiscriminator=1;
00133 
00134   return myDiscriminator;
00135 }
00136 
00137 float IsolatedTauTagInfo::discriminator(float m_cone, float sig_cone, float iso_cone, float pt_min_lt, float pt_min_tk, int nTracksIsoRing, float dz_lt) const
00138 {
00139   double myDiscriminator = 0;
00140 
00141   const TrackRef leadTk = leadingSignalTrack(m_cone, pt_min_lt);
00142 
00143   if(!leadTk) {
00144     return myDiscriminator;
00145   }
00146   //if signal cone is greater then the isolation cone and the leadTk exists, the jet is isolated.
00147   if(sig_cone > iso_cone) return 1.;
00148 
00149   math::XYZVector trackMomentum = leadTk->momentum() ;
00150   float z_pv = leadTk->dz();
00151   const RefVector<TrackCollection> signalTracks = tracksInCone(trackMomentum, sig_cone, pt_min_tk, z_pv, dz_lt);
00152   const RefVector<TrackCollection> isolationTracks = tracksInCone(trackMomentum, iso_cone, pt_min_tk, z_pv, dz_lt); 
00153   
00154   if (signalTracks.size() > 0 && (int)(isolationTracks.size() - signalTracks.size()) <= nTracksIsoRing)
00155     myDiscriminator=1;
00156 
00157   return myDiscriminator;
00158 }
00159 
00160 float IsolatedTauTagInfo::discriminator(math::XYZVector myVector, float m_cone, float sig_cone, float iso_cone, float pt_min_lt, float pt_min_tk, int nTracksIsoRing, float dz_lt) const
00161 {
00162   double myDiscriminator = 0;
00163 
00164 const  TrackRef leadTk = leadingSignalTrack(myVector, m_cone, pt_min_lt);
00165   if(!leadTk) return myDiscriminator;
00166   //if signal cone is greater then the isolation cone and the leadTk exists, the jet is isolated.
00167   if(sig_cone > iso_cone) return 1.;
00168 
00169   math::XYZVector trackMomentum = leadTk->momentum() ;
00170   float z_pv = leadTk->dz();
00171   const RefVector<TrackCollection> signalTracks = tracksInCone(trackMomentum, sig_cone, pt_min_tk, z_pv, dz_lt);
00172   const RefVector<TrackCollection> isolationTracks = tracksInCone(trackMomentum, iso_cone, pt_min_tk, z_pv, dz_lt); 
00173   
00174   if (signalTracks.size() > 0 && (int)(isolationTracks.size() - signalTracks.size()) <= nTracksIsoRing)
00175     myDiscriminator=1;
00176 
00177   return myDiscriminator;
00178 }