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