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