Go to the documentation of this file.00001 #include <functional>
00002 #include <ext/functional>
00003 #include <algorithm>
00004
00005 #include "FWCore/Utilities/interface/EDMException.h"
00006 #include "DataFormats/GeometryVector/interface/VectorUtil.h"
00007 #include "DataFormats/BTauReco/interface/TaggingVariable.h"
00008
00009 #include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h"
00010
00011 using namespace reco;
00012
00013 namespace {
00014 struct TrackFinder {
00015 TrackFinder(const TrackRefVector &tracks,
00016 const TrackRef &track) :
00017 tracks(tracks), track(track) {}
00018
00019 bool operator () (const SecondaryVertexTagInfo::IndexedTrackData &idt)
00020 { return tracks[idt.first] == track; }
00021
00022 const TrackRefVector &tracks;
00023 const TrackRef &track;
00024 };
00025
00026 struct VertexTrackSelector {
00027 bool operator () (const SecondaryVertexTagInfo::IndexedTrackData &idt)
00028 { return idt.second.associatedToVertex(); }
00029 };
00030
00031 struct IndexedVertexTrackSelector {
00032 IndexedVertexTrackSelector(unsigned int index) :
00033 index(index) {}
00034
00035 bool operator () (const SecondaryVertexTagInfo::IndexedTrackData &idt)
00036 { return idt.second.associatedToVertex(index); }
00037
00038 unsigned int index;
00039 };
00040 }
00041
00042 SecondaryVertexTagInfo::SecondaryVertexTagInfo(
00043 const std::vector<IndexedTrackData> &trackData,
00044 const std::vector<VertexData> &svData,
00045 unsigned int vertexCandidates,
00046 const TrackIPTagInfoRef &trackIPTagInfoRef) :
00047 m_trackData(trackData),
00048 m_svData(svData),
00049 m_vertexCandidates(vertexCandidates),
00050 m_trackIPTagInfoRef(trackIPTagInfoRef)
00051 {
00052 }
00053
00054 unsigned int SecondaryVertexTagInfo::nVertexTracks() const
00055 {
00056 return std::count_if(m_trackData.begin(), m_trackData.end(),
00057 VertexTrackSelector());
00058 }
00059
00060 unsigned int SecondaryVertexTagInfo::nVertexTracks(unsigned int index) const
00061 {
00062 return std::count_if(m_trackData.begin(), m_trackData.end(),
00063 IndexedVertexTrackSelector(index));
00064 }
00065
00066 TrackRefVector SecondaryVertexTagInfo::selectedTracks() const
00067 {
00068 TrackRefVector trackRefs;
00069 const TrackRefVector &trackIPTrackRefs =
00070 m_trackIPTagInfoRef->selectedTracks();
00071
00072 for(std::vector<IndexedTrackData>::const_iterator iter =
00073 m_trackData.begin(); iter != m_trackData.end(); iter++)
00074
00075 trackRefs.push_back(trackIPTrackRefs[iter->first]);
00076
00077 return trackRefs;
00078 }
00079
00080 TrackRefVector SecondaryVertexTagInfo::vertexTracks() const
00081 {
00082 TrackRefVector trackRefs;
00083 const TrackRefVector &trackIPTrackRefs =
00084 m_trackIPTagInfoRef->selectedTracks();
00085
00086 for(std::vector<IndexedTrackData>::const_iterator iter =
00087 m_trackData.begin(); iter != m_trackData.end(); iter++)
00088
00089 if (iter->second.associatedToVertex())
00090 trackRefs.push_back(trackIPTrackRefs[iter->first]);
00091
00092 return trackRefs;
00093 }
00094
00095 TrackRefVector SecondaryVertexTagInfo::vertexTracks(unsigned int index) const
00096 {
00097 TrackRefVector trackRefs;
00098 const TrackRefVector &trackIPTrackRefs =
00099 m_trackIPTagInfoRef->selectedTracks();
00100
00101 for(std::vector<IndexedTrackData>::const_iterator iter =
00102 m_trackData.begin(); iter != m_trackData.end(); iter++)
00103
00104 if (iter->second.associatedToVertex(index))
00105 trackRefs.push_back(trackIPTrackRefs[iter->first]);
00106
00107 return trackRefs;
00108 }
00109
00110 TrackRef SecondaryVertexTagInfo::track(unsigned int index) const
00111 {
00112 return m_trackIPTagInfoRef->selectedTracks()[m_trackData[index].first];
00113 }
00114
00115 unsigned int SecondaryVertexTagInfo::findTrack(const TrackRef &track) const
00116 {
00117 std::vector<IndexedTrackData>::const_iterator pos =
00118 std::find_if(m_trackData.begin(), m_trackData.end(),
00119 TrackFinder(m_trackIPTagInfoRef->selectedTracks(),
00120 track));
00121
00122 if (pos == m_trackData.end())
00123 throw edm::Exception(edm::errors::InvalidReference)
00124 << "Track not found in "
00125 "SecondaryVertexTagInfo::findTrack." << std::endl;
00126
00127 return pos - m_trackData.begin();
00128 }
00129
00130 const SecondaryVertexTagInfo::TrackData&
00131 SecondaryVertexTagInfo::trackData(unsigned int index) const
00132 {
00133 return m_trackData[index].second;
00134 }
00135
00136 const SecondaryVertexTagInfo::TrackData&
00137 SecondaryVertexTagInfo::trackData(const TrackRef &track) const
00138 {
00139 return m_trackData[findTrack(track)].second;
00140 }
00141
00142 const TrackIPTagInfo::TrackIPData&
00143 SecondaryVertexTagInfo::trackIPData(unsigned int index) const
00144 {
00145 return m_trackIPTagInfoRef->impactParameterData()[
00146 m_trackData[index].first];
00147 }
00148
00149 const TrackIPTagInfo::TrackIPData&
00150 SecondaryVertexTagInfo::trackIPData(const TrackRef &track) const
00151 {
00152 return trackIPData(findTrack(track));
00153 }
00154
00155 float SecondaryVertexTagInfo::trackWeight(unsigned int svIndex,
00156 const TrackRef &track) const
00157 {
00158 return m_svData[svIndex].vertex.trackWeight(track);
00159 }
00160
00161 float SecondaryVertexTagInfo::trackWeight(unsigned int svIndex,
00162 unsigned int trackIndex) const
00163 {
00164 return trackWeight(svIndex, track(trackIndex));
00165 }
00166
00167 TaggingVariableList SecondaryVertexTagInfo::taggingVariables() const
00168 {
00169 TaggingVariableList vars;
00170
00171 for(std::vector<VertexData>::const_iterator iter = m_svData.begin();
00172 iter != m_svData.end(); iter++) {
00173 vars.insert(btau::flightDistance2dVal,
00174 iter->dist2d.value(), true);
00175 vars.insert(btau::flightDistance2dSig,
00176 iter->dist2d.significance(), true);
00177 vars.insert(btau::flightDistance3dVal,
00178 iter->dist3d.value(), true);
00179 vars.insert(btau::flightDistance3dSig,
00180 iter->dist3d.significance(), true);
00181
00182 vars.insert(btau::vertexJetDeltaR,
00183 Geom::deltaR(iter->direction, jet()->momentum()), true);
00184 }
00185
00186 vars.insert(btau::jetNSecondaryVertices, m_vertexCandidates, true);
00187 vars.insert(btau::vertexNTracks, nVertexTracks(), true);
00188
00189 vars.finalize();
00190 return vars;
00191 }