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
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
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
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
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
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
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
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 }