CMS 3D CMS Logo

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

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 }