IndexedVertexTrackSelector

TemplatedSecondaryVertexTagInfo

TrackData

TrackFinder

VertexData

VertexTrackSelector

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
#ifndef DataFormats_BTauReco_TemplatedSecondaryVertexTagInfo_h
#define DataFormats_BTauReco_TemplatedSecondaryVertexTagInfo_h

#include <utility>
#include <vector>

#include "DataFormats/Common/interface/CMS_CLASS_VERSION.h"
#include "DataFormats/GeometryCommonDetAlgo/interface/Measurement1D.h"
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "DataFormats/VertexReco/interface/Vertex.h"
#include "DataFormats/GeometryVector/interface/GlobalPoint.h"
#include "DataFormats/GeometryVector/interface/GlobalVector.h"
#include "DataFormats/JetReco/interface/JetTracksAssociation.h"
#include "DataFormats/BTauReco/interface/JTATagInfo.h"
#include "DataFormats/BTauReco/interface/TrackIPTagInfo.h"
#include "DataFormats/BTauReco/interface/CandIPTagInfo.h"
#include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h"
#include <functional>
#include <algorithm>

#include "FWCore/Utilities/interface/EDMException.h"
#include "DataFormats/GeometryVector/interface/VectorUtil.h"
#include "DataFormats/BTauReco/interface/TaggingVariable.h"

namespace reco {
  namespace btag {
    inline float weight(const reco::TrackRef &t, const reco::Vertex &v) { return v.trackWeight(t); }
    inline float weight(const reco::CandidatePtr &c, const reco::VertexCompositePtrCandidate &v) {
      return std::find(v.daughterPtrVector().begin(), v.daughterPtrVector().end(), c) != v.daughterPtrVector().end();
    }

    struct TrackData {
      static constexpr int trackSelected = 0;
      static constexpr int trackUsedForVertexFit = 1;
      static constexpr int trackAssociatedToVertex = 2;
      inline bool usedForVertexFit() const { return svStatus >= trackUsedForVertexFit; }
      inline bool associatedToVertex() const { return svStatus >= trackAssociatedToVertex; }
      inline bool associatedToVertex(unsigned int index) const {
        return svStatus == trackAssociatedToVertex + (int)index;
      }
      int svStatus;
    };
    typedef std::pair<unsigned int, TrackData> IndexedTrackData;

  }  // namespace btag
  template <class IPTI, class VTX>
  class TemplatedSecondaryVertexTagInfo : public BaseTagInfo {
  public:
    typedef reco::btag::TrackData TrackData;
    typedef reco::btag::IndexedTrackData IndexedTrackData;

    struct VertexData {
      VTX vertex;
      Measurement1D dist1d, dist2d, dist3d;
      GlobalVector direction;

      // Used by ROOT storage
      CMS_CLASS_VERSION(12)
    };

    struct TrackFinder {
      TrackFinder(const typename IPTI::input_container &tracks, const typename IPTI::input_container::value_type &track)
          : tracks(tracks), track(track) {}

      bool operator()(const IndexedTrackData &idt) { return tracks[idt.first] == track; }

      const typename IPTI::input_container &tracks;
      const typename IPTI::input_container::value_type &track;
    };

    struct VertexTrackSelector {
      bool operator()(const IndexedTrackData &idt) { return idt.second.associatedToVertex(); }
    };

    struct IndexedVertexTrackSelector {
      IndexedVertexTrackSelector(unsigned int index) : index(index) {}

      bool operator()(const IndexedTrackData &idt) { return idt.second.associatedToVertex(index); }

      unsigned int index;
    };

    typedef typename IPTI::input_container input_container;

    TemplatedSecondaryVertexTagInfo() {}
    ~TemplatedSecondaryVertexTagInfo() override {}

    TemplatedSecondaryVertexTagInfo(const std::vector<IndexedTrackData> &trackData,
                                    const std::vector<VertexData> &svData,
                                    unsigned int vertexCandidates,
                                    const edm::Ref<std::vector<IPTI> > &);

    /// clone
    TemplatedSecondaryVertexTagInfo *clone(void) const override { return new TemplatedSecondaryVertexTagInfo(*this); }

    const edm::Ref<std::vector<IPTI> > &trackIPTagInfoRef() const { return m_trackIPTagInfoRef; }

    edm::RefToBase<Jet> jet(void) const override { return m_trackIPTagInfoRef->jet(); }

    //	virtual input_container ipTracks(void) const
    //	{ return m_trackIPTagInfoRef->tracks(); }

    //AR TODO is it needed?
    //	const JetTracksAssociationRef &jtaRef(void) const
    //	{ return m_trackIPTagInfoRef->jtaRef(); }

    const VTX &secondaryVertex(unsigned int index) const { return m_svData[index].vertex; }

    unsigned int nSelectedTracks() const { return m_trackData.size(); }
    unsigned int nVertexTracks() const;
    unsigned int nVertexTracks(unsigned int index) const;
    unsigned int nVertices() const { return m_svData.size(); }
    unsigned int nVertexCandidates() const { return m_vertexCandidates; }

    input_container selectedTracks() const;
    input_container vertexTracks() const;
    input_container vertexTracks(unsigned int index) const;

    typename input_container::value_type track(unsigned int index) const;
    unsigned int findTrack(const typename input_container::value_type &track) const;

    const TrackData &trackData(unsigned int index) const;
    const TrackData &trackData(const typename input_container::value_type &track) const;

    const reco::btag::TrackIPData &trackIPData(unsigned int index) const;
    const reco::btag::TrackIPData &trackIPData(const typename input_container::value_type &track) const;

    float trackWeight(unsigned int svIndex, unsigned int trackindex) const;
    float trackWeight(unsigned int svIndex, const typename input_container::value_type &track) const;

    Measurement1D flightDistance(unsigned int index, int dim = 0) const {
      if (dim == 1)
        return m_svData[index].dist1d;
      else if (dim == 2)
        return m_svData[index].dist2d;
      else
        return m_svData[index].dist3d;
    }
    const GlobalVector &flightDirection(unsigned int index) const { return m_svData[index].direction; }
    TaggingVariableList taggingVariables() const override;

    // Used by ROOT storage
    CMS_CLASS_VERSION(11)

  private:
    std::vector<IndexedTrackData> m_trackData;
    std::vector<VertexData> m_svData;
    unsigned int m_vertexCandidates;

    edm::Ref<std::vector<IPTI> > m_trackIPTagInfoRef;
  };

  template <class IPTI, class VTX>
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::TemplatedSecondaryVertexTagInfo(
      const std::vector<IndexedTrackData> &trackData,
      const std::vector<VertexData> &svData,
      unsigned int vertexCandidates,
      const edm::Ref<std::vector<IPTI> > &trackIPTagInfoRef)
      : m_trackData(trackData),
        m_svData(svData),
        m_vertexCandidates(vertexCandidates),
        m_trackIPTagInfoRef(trackIPTagInfoRef) {}

  template <class IPTI, class VTX>
  unsigned int TemplatedSecondaryVertexTagInfo<IPTI, VTX>::nVertexTracks() const {
    return std::count_if(m_trackData.begin(), m_trackData.end(), VertexTrackSelector());
  }

  template <class IPTI, class VTX>
  unsigned int TemplatedSecondaryVertexTagInfo<IPTI, VTX>::nVertexTracks(unsigned int index) const {
    return std::count_if(m_trackData.begin(), m_trackData.end(), IndexedVertexTrackSelector(index));
  }

  template <class IPTI, class VTX>
  typename reco::TemplatedSecondaryVertexTagInfo<IPTI, VTX>::input_container
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::selectedTracks() const {
    input_container trackRefs;
    const input_container &trackIPTrackRefs = m_trackIPTagInfoRef->selectedTracks();

    for (typename std::vector<
             typename reco::TemplatedSecondaryVertexTagInfo<IPTI, VTX>::IndexedTrackData>::const_iterator iter =
             m_trackData.begin();
         iter != m_trackData.end();
         iter++)

      trackRefs.push_back(trackIPTrackRefs[iter->first]);

    return trackRefs;
  }

  template <class IPTI, class VTX>
  typename TemplatedSecondaryVertexTagInfo<IPTI, VTX>::input_container
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::vertexTracks() const {
    input_container trackRefs;
    const input_container &trackIPTrackRefs = m_trackIPTagInfoRef->selectedTracks();

    for (typename std::vector<
             typename reco::TemplatedSecondaryVertexTagInfo<IPTI, VTX>::IndexedTrackData>::const_iterator iter =
             m_trackData.begin();
         iter != m_trackData.end();
         iter++)

      if (iter->second.associatedToVertex())
        trackRefs.push_back(trackIPTrackRefs[iter->first]);

    return trackRefs;
  }

  template <class IPTI, class VTX>
  typename TemplatedSecondaryVertexTagInfo<IPTI, VTX>::input_container
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::vertexTracks(unsigned int index) const {
    input_container trackRefs;
    const input_container &trackIPTrackRefs = m_trackIPTagInfoRef->selectedTracks();

    for (typename std::vector<
             typename reco::TemplatedSecondaryVertexTagInfo<IPTI, VTX>::IndexedTrackData>::const_iterator iter =
             m_trackData.begin();
         iter != m_trackData.end();
         iter++)

      if (iter->second.associatedToVertex(index))
        trackRefs.push_back(trackIPTrackRefs[iter->first]);

    return trackRefs;
  }

  template <class IPTI, class VTX>
  typename TemplatedSecondaryVertexTagInfo<IPTI, VTX>::input_container::value_type
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::track(unsigned int index) const {
    return m_trackIPTagInfoRef->selectedTracks()[m_trackData[index].first];
  }

  template <class IPTI, class VTX>
  unsigned int TemplatedSecondaryVertexTagInfo<IPTI, VTX>::findTrack(
      const typename input_container::value_type &track) const {
    typename std::vector<typename reco::TemplatedSecondaryVertexTagInfo<IPTI, VTX>::IndexedTrackData>::const_iterator
        pos = std::find_if(
            m_trackData.begin(), m_trackData.end(), TrackFinder(m_trackIPTagInfoRef->selectedTracks(), track));

    if (pos == m_trackData.end())
      throw edm::Exception(edm::errors::InvalidReference) << "Track not found in "
                                                             " TemplatedSecondaryVertexTagInfo<IPTI,VTX>::findTrack."
                                                          << std::endl;

    return pos - m_trackData.begin();
  }

  template <class IPTI, class VTX>
  const typename TemplatedSecondaryVertexTagInfo<IPTI, VTX>::TrackData &
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::trackData(unsigned int index) const {
    return m_trackData[index].second;
  }

  template <class IPTI, class VTX>
  const typename TemplatedSecondaryVertexTagInfo<IPTI, VTX>::TrackData &
  TemplatedSecondaryVertexTagInfo<IPTI, VTX>::trackData(const typename input_container::value_type &track) const {
    return m_trackData[findTrack(track)].second;
  }

  template <class IPTI, class VTX>
  const reco::btag::TrackIPData &TemplatedSecondaryVertexTagInfo<IPTI, VTX>::trackIPData(unsigned int index) const {
    return m_trackIPTagInfoRef->impactParameterData()[m_trackData[index].first];
  }

  template <class IPTI, class VTX>
  const reco::btag::TrackIPData &TemplatedSecondaryVertexTagInfo<IPTI, VTX>::trackIPData(
      const typename input_container::value_type &track) const {
    return trackIPData(findTrack(track));
  }

  template <class IPTI, class VTX>
  float TemplatedSecondaryVertexTagInfo<IPTI, VTX>::trackWeight(
      unsigned int svIndex, const typename input_container::value_type &track) const {
    return reco::btag::weight(track, m_svData[svIndex].vertex);
  }

  template <class IPTI, class VTX>
  float TemplatedSecondaryVertexTagInfo<IPTI, VTX>::trackWeight(unsigned int svIndex, unsigned int trackIndex) const {
    return trackWeight(svIndex, track(trackIndex));
  }

  template <class IPTI, class VTX>
  TaggingVariableList TemplatedSecondaryVertexTagInfo<IPTI, VTX>::taggingVariables() const {
    TaggingVariableList vars;

    for (typename std::vector<typename TemplatedSecondaryVertexTagInfo<IPTI, VTX>::VertexData>::const_iterator iter =
             m_svData.begin();
         iter != m_svData.end();
         iter++) {
      vars.insert(btau::flightDistance1dVal, iter->dist1d.value(), true);
      vars.insert(btau::flightDistance1dSig, iter->dist1d.significance(), true);
      vars.insert(btau::flightDistance2dVal, iter->dist2d.value(), true);
      vars.insert(btau::flightDistance2dSig, iter->dist2d.significance(), true);
      vars.insert(btau::flightDistance3dVal, iter->dist3d.value(), true);
      vars.insert(btau::flightDistance3dSig, iter->dist3d.significance(), true);

      vars.insert(btau::vertexJetDeltaR, Geom::deltaR(iter->direction, jet()->momentum()), true);
    }

    vars.insert(btau::jetNSecondaryVertices, m_vertexCandidates, true);
    vars.insert(btau::vertexNTracks, nVertexTracks(), true);

    vars.finalize();
    return vars;
  }

}  // namespace reco
#endif  // DataFormats_BTauReco_TemplatedSecondaryVertexTagInfo_h