Mercurial > hg > svcore
comparison data/model/Dense3DModelPeakCache.cpp @ 1206:659372323b45 tony-2.0-integration
Merge latest SV 3.0 branch code
author | Chris Cannam |
---|---|
date | Fri, 19 Aug 2016 15:58:57 +0100 |
parents | 9884efa1f88a |
children | f5f83fb49852 |
comparison
equal
deleted
inserted
replaced
1136:e94719f941ba | 1206:659372323b45 |
---|---|
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 Dense3DModelPeakCache::Dense3DModelPeakCache(const DenseThreeDimensionalModel *source, |
21 int columnsPerPeak) : | 21 int columnsPerPeak) : |
22 m_source(source), | 22 m_source(source), |
23 m_resolution(columnsPerPeak) | 23 m_columnsPerPeak(columnsPerPeak) |
24 { | 24 { |
25 m_coverage.resize(1); // otherwise it is simply invalid | |
26 | |
27 m_cache = new EditableDenseThreeDimensionalModel | 25 m_cache = new EditableDenseThreeDimensionalModel |
28 (source->getSampleRate(), | 26 (source->getSampleRate(), |
29 getResolution(), | 27 getResolution(), |
30 source->getHeight(), | 28 source->getHeight(), |
31 EditableDenseThreeDimensionalModel::NoCompression, | 29 EditableDenseThreeDimensionalModel::NoCompression, |
39 } | 37 } |
40 | 38 |
41 Dense3DModelPeakCache::~Dense3DModelPeakCache() | 39 Dense3DModelPeakCache::~Dense3DModelPeakCache() |
42 { | 40 { |
43 delete m_cache; | 41 delete m_cache; |
44 } | |
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 } | 42 } |
59 | 43 |
60 Dense3DModelPeakCache::Column | 44 Dense3DModelPeakCache::Column |
61 Dense3DModelPeakCache::getColumn(int column) const | 45 Dense3DModelPeakCache::getColumn(int column) const |
62 { | 46 { |
79 { | 63 { |
80 if (!m_source) return; | 64 if (!m_source) return; |
81 if (m_coverage.size() > 0) { | 65 if (m_coverage.size() > 0) { |
82 // The last peak may have come from an incomplete read, which | 66 // The last peak may have come from an incomplete read, which |
83 // may since have been filled, so reset it | 67 // may since have been filled, so reset it |
84 m_coverage.reset(m_coverage.size()-1); | 68 m_coverage[m_coverage.size()-1] = false; |
85 } | 69 } |
86 m_coverage.resize(getWidth()); // retaining data | 70 m_coverage.resize(getWidth(), false); // retaining data |
87 } | 71 } |
88 | 72 |
89 void | 73 void |
90 Dense3DModelPeakCache::sourceModelAboutToBeDeleted() | 74 Dense3DModelPeakCache::sourceModelAboutToBeDeleted() |
91 { | 75 { |
93 } | 77 } |
94 | 78 |
95 bool | 79 bool |
96 Dense3DModelPeakCache::haveColumn(int column) const | 80 Dense3DModelPeakCache::haveColumn(int column) const |
97 { | 81 { |
98 return column < (int)m_coverage.size() && m_coverage.get(column); | 82 return in_range_for(m_coverage, column) && m_coverage[column]; |
99 } | 83 } |
100 | 84 |
101 void | 85 void |
102 Dense3DModelPeakCache::fillColumn(int column) const | 86 Dense3DModelPeakCache::fillColumn(int column) const |
103 { | 87 { |
104 Profiler profiler("Dense3DModelPeakCache::fillColumn"); | 88 Profiler profiler("Dense3DModelPeakCache::fillColumn"); |
105 | 89 |
106 if (column >= (int)m_coverage.size()) { | 90 if (!in_range_for(m_coverage, column)) { |
107 // see note in sourceModelChanged | 91 if (m_coverage.size() > 0) { |
108 if (m_coverage.size() > 0) m_coverage.reset(m_coverage.size()-1); | 92 // The last peak may have come from an incomplete read, which |
109 m_coverage.resize(column + 1); | 93 // may since have been filled, so reset it |
94 m_coverage[m_coverage.size()-1] = false; | |
95 } | |
96 m_coverage.resize(column + 1, false); | |
110 } | 97 } |
111 | 98 |
99 int sourceWidth = m_source->getWidth(); | |
100 | |
112 Column peak; | 101 Column peak; |
113 for (int i = 0; i < int(m_resolution); ++i) { | 102 int n = 0; |
114 Column here = m_source->getColumn(column * m_resolution + i); | 103 for (int i = 0; i < m_columnsPerPeak; ++i) { |
104 | |
105 int sourceColumn = column * m_columnsPerPeak + i; | |
106 if (sourceColumn >= sourceWidth) break; | |
107 | |
108 Column here = m_source->getColumn(sourceColumn); | |
109 | |
110 // cerr << "Dense3DModelPeakCache::fillColumn(" << column << "): source col " | |
111 // << sourceColumn << " of " << sourceWidth | |
112 // << " returned " << here.size() << " elts" << endl; | |
113 | |
115 if (i == 0) { | 114 if (i == 0) { |
116 peak = here; | 115 peak = here; |
116 n = int(peak.size()); | |
117 } else { | 117 } else { |
118 for (int j = 0; j < (int)peak.size() && j < (int)here.size(); ++j) { | 118 int m = std::min(n, int(here.size())); |
119 if (here[j] > peak[j]) peak[j] = here[j]; | 119 for (int j = 0; j < m; ++j) { |
120 peak[j] = std::max(here[j], peak[j]); | |
120 } | 121 } |
121 } | 122 } |
122 } | 123 } |
123 | 124 |
124 m_cache->setColumn(column, peak); | 125 m_cache->setColumn(column, peak); |
125 m_coverage.set(column); | 126 m_coverage[column] = true; |
126 } | 127 } |
127 | 128 |
128 | 129 |