00001 #include <cmath>
00002 #include <map>
00003
00004 #include <Math/VectorUtil.h>
00005
00006 #include "DataFormats/Math/interface/Vector3D.h"
00007 #include "DataFormats/BTauReco/interface/TrackIPTagInfo.h"
00008 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00009 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00010 #include "DataFormats/GeometryVector/interface/VectorUtil.h"
00011 #include "DataFormats/TrackReco/interface/Track.h"
00012 #include "DataFormats/VertexReco/interface/Vertex.h"
00013
00014 using namespace reco;
00015 using namespace std;
00016
00017 static double etaRel(const math::XYZVector &dir, const math::XYZVector &track)
00018 {
00019 double momPar = dir.Dot(track);
00020 double energy = sqrt(track.Mag2() + ROOT::Math::Square(0.13957));
00021 return 0.5 * log((energy + momPar) / (energy - momPar));
00022 }
00023
00024 TaggingVariableList TrackIPTagInfo::taggingVariables(void) const {
00025 TaggingVariableList vars;
00026
00027 math::XYZVector jetDir = jet()->momentum().Unit();
00028 bool havePv = primaryVertex().isNonnull();
00029 GlobalPoint pv;
00030 if (havePv)
00031 pv = GlobalPoint(primaryVertex()->x(),
00032 primaryVertex()->y(),
00033 primaryVertex()->z());
00034
00035 std::vector<size_t> indexes = sortedIndexes();
00036 for(std::vector<size_t>::const_iterator it = indexes.begin();
00037 it != indexes.end(); ++it)
00038 {
00039 using namespace ROOT::Math;
00040 TrackRef track = m_selectedTracks[*it];
00041 const TrackIPData *data = &m_data[*it];
00042 math::XYZVector trackMom = track->momentum();
00043 double trackMag = std::sqrt(trackMom.Mag2());
00044
00045 vars.insert(btau::trackMomentum, trackMag, true);
00046 vars.insert(btau::trackEta, trackMom.Eta(), true);
00047 vars.insert(btau::trackEtaRel, etaRel(jetDir, trackMom), true);
00048 vars.insert(btau::trackPtRel, VectorUtil::Perp(trackMom, jetDir), true);
00049 vars.insert(btau::trackPPar, jetDir.Dot(trackMom), true);
00050 vars.insert(btau::trackDeltaR, VectorUtil::DeltaR(trackMom, jetDir), true);
00051 vars.insert(btau::trackPtRatio, VectorUtil::Perp(trackMom, jetDir) / trackMag, true);
00052 vars.insert(btau::trackPParRatio, jetDir.Dot(trackMom) / trackMag, true);
00053 vars.insert(btau::trackSip3dVal, data->ip3d.value(), true);
00054 vars.insert(btau::trackSip3dSig, data->ip3d.significance(), true);
00055 vars.insert(btau::trackSip2dVal, data->ip2d.value(), true);
00056 vars.insert(btau::trackSip2dSig, data->ip2d.significance(), true);
00057 vars.insert(btau::trackDecayLenVal, havePv ? (data->closestToJetAxis - pv).mag() : -1.0, true);
00058 vars.insert(btau::trackJetDistVal, data->distanceToJetAxis.value(), true);
00059 vars.insert(btau::trackJetDistSig, data->distanceToJetAxis.significance(), true);
00060 vars.insert(btau::trackGhostTrackDistVal, data->distanceToGhostTrack.value(), true);
00061 vars.insert(btau::trackGhostTrackDistSig, data->distanceToGhostTrack.significance(), true);
00062 vars.insert(btau::trackGhostTrackWeight, data->ghostTrackWeight, true);
00063 vars.insert(btau::trackChi2, track->normalizedChi2(), true);
00064 vars.insert(btau::trackNTotalHits, track->hitPattern().numberOfValidHits(), true);
00065 vars.insert(btau::trackNPixelHits, track->hitPattern().numberOfValidPixelHits(), true);
00066 }
00067 vars.finalize();
00068 return vars;
00069 }
00070
00071 TrackRefVector TrackIPTagInfo::sortedTracks(std::vector<size_t> indexes) const
00072 {
00073 TrackRefVector tr;
00074 for(size_t i =0 ; i < indexes.size(); i++) tr.push_back(m_selectedTracks[indexes[i]]);
00075 return tr;
00076 }
00077
00078 std::vector<size_t> TrackIPTagInfo::sortedIndexes(SortCriteria mode) const
00079 {
00080 float cut=-1e99;
00081 if((mode == Prob3D || mode == Prob2D)) cut=1e99;
00082 return sortedIndexesWithCut(cut,mode);
00083 }
00084
00085 std::vector<size_t> TrackIPTagInfo::sortedIndexesWithCut(float cut, SortCriteria mode) const
00086 {
00087 multimap<float,size_t> sortedIdx;
00088 size_t nSelectedTracks = m_selectedTracks.size();
00089 std::vector<size_t> result;
00090
00091
00092 if((mode == Prob3D || mode == Prob2D) && ! hasProbabilities())
00093 {
00094 return result;
00095 }
00096
00097 for(size_t i=0;i<nSelectedTracks;i++)
00098 {
00099 float sortingKey;
00100 switch(mode)
00101 {
00102 case IP3DSig:
00103 sortingKey=m_data[i].ip3d.significance();
00104 break;
00105 case IP2DSig:
00106 sortingKey=m_data[i].ip2d.significance();
00107 break;
00108 case IP3DValue:
00109 sortingKey=m_data[i].ip3d.value();
00110 break;
00111 case IP2DValue:
00112 sortingKey=m_data[i].ip2d.value();
00113 break;
00114 case Prob3D:
00115 sortingKey=m_prob3d[i];
00116 break;
00117 case Prob2D:
00118 sortingKey=m_prob2d[i];
00119 break;
00120
00121 default:
00122 sortingKey=i;
00123 }
00124 sortedIdx.insert(std::pair<float,size_t>(sortingKey,i));
00125 }
00126
00127
00128 if(mode == IP3DSig || mode == IP2DSig ||mode == IP3DValue || mode == IP2DValue)
00129 {
00130 for(std::multimap<float,size_t>::reverse_iterator it = sortedIdx.rbegin(); it!=sortedIdx.rend(); it++)
00131 if(it->first >= cut) result.push_back(it->second);
00132 } else
00133
00134 {
00135 for(std::multimap<float,size_t>::iterator it = sortedIdx.begin(); it!=sortedIdx.end(); it++)
00136 if(it->first <= cut) result.push_back(it->second);
00137 }
00138 return result;
00139 }