Belle II Software  release-05-02-19
OverlapMatrixCreator.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Martin Heck *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #pragma once
11 
12 #include <vector>
13 #include <algorithm>
14 
15 namespace Belle2 {
21  class OverlapMatrixCreator {
22  public:
30  OverlapMatrixCreator(std::vector <std::vector <unsigned short> > const& hitRelatedTracks,
31  unsigned short nSpacePointTrackCandidates) :
32  m_hitRelatedTracks(hitRelatedTracks), m_overlapMatrix(nSpacePointTrackCandidates)
33  {}
34 
40  std::vector <std::vector<unsigned short> > getOverlapMatrix(unsigned allowedOverlaps = 0)
41  {
42  //Loop over all the hits and make corresponding connections for the tracks
43  //This yields unordered indices of tracks, one for each shared hit.
44  for (auto && tracks : m_hitRelatedTracks) {
45  for (unsigned short ii = 0; ii < tracks.size(); ii++) {
46  for (unsigned short jj = ii + 1; jj < tracks.size(); jj++) {
47  m_overlapMatrix[tracks[ii]].push_back(tracks[jj]);
48  m_overlapMatrix[tracks[jj]].push_back(tracks[ii]);
49  }
50  }
51  }
52 
53  //If it makes sense to have this can be explored by Jonas and Felix...
54  //... so let's start with something that works, not necessarily what is fastest.
55  //This is probably slower then the version below for 0 overlaps, but shall work with
56  //any number of allowed overlaps.
57  if (allowedOverlaps) {
58  std::vector <unsigned short> overlapChache;
59 
60  for (auto && overlapTracks : m_overlapMatrix) {
61  std::sort(overlapTracks.begin(), overlapTracks.end());
62 
63  auto endIter = overlapTracks.end();
64  auto cacheIter = overlapTracks.begin();
65  for (auto iter = overlapTracks.begin(); iter != endIter; iter++) {
66  if (*iter != *cacheIter) {
67  cacheIter = iter;
68  } else if (iter - cacheIter == allowedOverlaps) {
69  overlapChache.push_back(*iter);
70  }
71  }
72  overlapTracks = overlapChache;
73  overlapChache.clear();
74  }
75  return m_overlapMatrix;
76  }
77 
78  //sort and erase duplicate overlaps
79  //TODO: Check in realistic situation alternative approach:
80  //see http://stackoverflow.com/questions/1041620/whats-the-most-efficient-way-to-erase-duplicates-and-sort-a-vector
81  for (auto && overlapTracks : m_overlapMatrix) {
82  std::sort(overlapTracks.begin(), overlapTracks.end());
83  overlapTracks.erase(std::unique(overlapTracks.begin(), overlapTracks.end()), overlapTracks.end());
84  }
85 
86  return m_overlapMatrix;
87  }
88 
89  private:
90  std::vector<std::vector <unsigned short> >const& m_hitRelatedTracks;
91  std::vector<std::vector <unsigned short> > m_overlapMatrix;
92  };
94 }
Belle2::OverlapMatrixCreator::OverlapMatrixCreator
OverlapMatrixCreator(std::vector< std::vector< unsigned short > > const &hitRelatedTracks, unsigned short nSpacePointTrackCandidates)
Constructor taking information necessary to perform algorithm.
Definition: OverlapMatrixCreator.h:38
Belle2::OverlapMatrixCreator::m_overlapMatrix
std::vector< std::vector< unsigned short > > m_overlapMatrix
Output information, see getOverlapMatrix.
Definition: OverlapMatrixCreator.h:99
Belle2::OverlapMatrixCreator::m_hitRelatedTracks
std::vector< std::vector< unsigned short > > const & m_hitRelatedTracks
Input information, see constructor.
Definition: OverlapMatrixCreator.h:98
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::OverlapMatrixCreator::getOverlapMatrix
std::vector< std::vector< unsigned short > > getOverlapMatrix(unsigned allowedOverlaps=0)
Fills and returns the overlap matrix.
Definition: OverlapMatrixCreator.h:48