Mercurial > hg > svcore
comparison data/model/Dense3DModelPeakCache.cpp @ 1365:3382d914e110
Merge from branch 3.0-integration
author | Chris Cannam |
---|---|
date | Fri, 13 Jan 2017 10:29:44 +0000 |
parents | f5f83fb49852 |
children | 368449629a30 |
comparison
equal
deleted
inserted
replaced
1272:6a7ea3bd0e10 | 1365:3382d914e110 |
---|---|
15 | 15 |
16 #include "Dense3DModelPeakCache.h" | 16 #include "Dense3DModelPeakCache.h" |
17 | 17 |
18 #include "base/Profiler.h" | 18 #include "base/Profiler.h" |
19 | 19 |
20 Dense3DModelPeakCache::Dense3DModelPeakCache(DenseThreeDimensionalModel *source, | 20 #include "base/HitCount.h" |
21 | |
22 Dense3DModelPeakCache::Dense3DModelPeakCache(const DenseThreeDimensionalModel *source, | |
21 int columnsPerPeak) : | 23 int columnsPerPeak) : |
22 m_source(source), | 24 m_source(source), |
23 m_resolution(columnsPerPeak) | 25 m_columnsPerPeak(columnsPerPeak) |
24 { | 26 { |
25 m_coverage.resize(1); // otherwise it is simply invalid | |
26 | |
27 m_cache = new EditableDenseThreeDimensionalModel | 27 m_cache = new EditableDenseThreeDimensionalModel |
28 (source->getSampleRate(), | 28 (source->getSampleRate(), |
29 getResolution(), | 29 getResolution(), |
30 source->getHeight(), | 30 source->getHeight(), |
31 EditableDenseThreeDimensionalModel::NoCompression, | 31 EditableDenseThreeDimensionalModel::NoCompression, |
41 Dense3DModelPeakCache::~Dense3DModelPeakCache() | 41 Dense3DModelPeakCache::~Dense3DModelPeakCache() |
42 { | 42 { |
43 delete m_cache; | 43 delete m_cache; |
44 } | 44 } |
45 | 45 |
46 bool | |
47 Dense3DModelPeakCache::isColumnAvailable(int column) const | |
48 { | |
49 if (!m_source) return false; | |
50 if (haveColumn(column)) return true; | |
51 for (int i = m_resolution; i > 0; ) { | |
52 --i; | |
53 if (!m_source->isColumnAvailable(column * m_resolution + i)) { | |
54 return false; | |
55 } | |
56 } | |
57 return true; | |
58 } | |
59 | |
60 Dense3DModelPeakCache::Column | 46 Dense3DModelPeakCache::Column |
61 Dense3DModelPeakCache::getColumn(int column) const | 47 Dense3DModelPeakCache::getColumn(int column) const |
62 { | 48 { |
63 Profiler profiler("Dense3DModelPeakCache::getColumn"); | |
64 if (!m_source) return Column(); | 49 if (!m_source) return Column(); |
65 if (!haveColumn(column)) fillColumn(column); | 50 if (!haveColumn(column)) fillColumn(column); |
66 return m_cache->getColumn(column); | 51 return m_cache->getColumn(column); |
67 } | 52 } |
68 | 53 |
79 { | 64 { |
80 if (!m_source) return; | 65 if (!m_source) return; |
81 if (m_coverage.size() > 0) { | 66 if (m_coverage.size() > 0) { |
82 // The last peak may have come from an incomplete read, which | 67 // The last peak may have come from an incomplete read, which |
83 // may since have been filled, so reset it | 68 // may since have been filled, so reset it |
84 m_coverage.reset(m_coverage.size()-1); | 69 m_coverage[m_coverage.size()-1] = false; |
85 } | 70 } |
86 m_coverage.resize(getWidth()); // retaining data | 71 m_coverage.resize(getWidth(), false); // retaining data |
87 } | 72 } |
88 | 73 |
89 void | 74 void |
90 Dense3DModelPeakCache::sourceModelAboutToBeDeleted() | 75 Dense3DModelPeakCache::sourceModelAboutToBeDeleted() |
91 { | 76 { |
93 } | 78 } |
94 | 79 |
95 bool | 80 bool |
96 Dense3DModelPeakCache::haveColumn(int column) const | 81 Dense3DModelPeakCache::haveColumn(int column) const |
97 { | 82 { |
98 return column < (int)m_coverage.size() && m_coverage.get(column); | 83 static HitCount count("Dense3DModelPeakCache"); |
84 if (in_range_for(m_coverage, column) && m_coverage[column]) { | |
85 count.hit(); | |
86 return true; | |
87 } else { | |
88 count.miss(); | |
89 return false; | |
90 } | |
99 } | 91 } |
100 | 92 |
101 void | 93 void |
102 Dense3DModelPeakCache::fillColumn(int column) const | 94 Dense3DModelPeakCache::fillColumn(int column) const |
103 { | 95 { |
104 Profiler profiler("Dense3DModelPeakCache::fillColumn"); | 96 Profiler profiler("Dense3DModelPeakCache::fillColumn"); |
105 | 97 |
106 if (column >= (int)m_coverage.size()) { | 98 if (!in_range_for(m_coverage, column)) { |
107 // see note in sourceModelChanged | 99 if (m_coverage.size() > 0) { |
108 if (m_coverage.size() > 0) m_coverage.reset(m_coverage.size()-1); | 100 // The last peak may have come from an incomplete read, which |
109 m_coverage.resize(column + 1); | 101 // may since have been filled, so reset it |
102 m_coverage[m_coverage.size()-1] = false; | |
103 } | |
104 m_coverage.resize(column + 1, false); | |
110 } | 105 } |
111 | 106 |
107 int sourceWidth = m_source->getWidth(); | |
108 | |
112 Column peak; | 109 Column peak; |
113 for (int i = 0; i < int(m_resolution); ++i) { | 110 int n = 0; |
114 Column here = m_source->getColumn(column * m_resolution + i); | 111 for (int i = 0; i < m_columnsPerPeak; ++i) { |
112 | |
113 int sourceColumn = column * m_columnsPerPeak + i; | |
114 if (sourceColumn >= sourceWidth) break; | |
115 | |
116 Column here = m_source->getColumn(sourceColumn); | |
117 | |
118 // cerr << "Dense3DModelPeakCache::fillColumn(" << column << "): source col " | |
119 // << sourceColumn << " of " << sourceWidth | |
120 // << " returned " << here.size() << " elts" << endl; | |
121 | |
115 if (i == 0) { | 122 if (i == 0) { |
116 peak = here; | 123 peak = here; |
124 n = int(peak.size()); | |
117 } else { | 125 } else { |
118 for (int j = 0; j < (int)peak.size() && j < (int)here.size(); ++j) { | 126 int m = std::min(n, int(here.size())); |
119 if (here[j] > peak[j]) peak[j] = here[j]; | 127 for (int j = 0; j < m; ++j) { |
128 peak[j] = std::max(here[j], peak[j]); | |
120 } | 129 } |
121 } | 130 } |
122 } | 131 } |
123 | 132 |
124 m_cache->setColumn(column, peak); | 133 m_cache->setColumn(column, peak); |
125 m_coverage.set(column); | 134 m_coverage[column] = true; |
126 } | 135 } |
127 | 136 |
128 | 137 |