Mercurial > hg > svcore
comparison data/model/EditableDenseThreeDimensionalModel.cpp @ 256:9c85517ff0f5
* Fix #1706927 NaNs from plugin outputs should not be used
| author | Chris Cannam |
|---|---|
| date | Fri, 27 Apr 2007 15:39:48 +0000 |
| parents | 3e6fee4e4257 |
| children | 46398ab6ff58 |
comparison
equal
deleted
inserted
replaced
| 255:7033e188b2b2 | 256:9c85517ff0f5 |
|---|---|
| 17 | 17 |
| 18 #include <QTextStream> | 18 #include <QTextStream> |
| 19 | 19 |
| 20 #include <iostream> | 20 #include <iostream> |
| 21 | 21 |
| 22 #include <cmath> | |
| 23 | |
| 22 EditableDenseThreeDimensionalModel::EditableDenseThreeDimensionalModel(size_t sampleRate, | 24 EditableDenseThreeDimensionalModel::EditableDenseThreeDimensionalModel(size_t sampleRate, |
| 23 size_t resolution, | 25 size_t resolution, |
| 24 size_t yBinCount, | 26 size_t yBinCount, |
| 25 bool notifyOnAdd) : | 27 bool notifyOnAdd) : |
| 26 m_sampleRate(sampleRate), | 28 m_sampleRate(sampleRate), |
| 27 m_resolution(resolution), | 29 m_resolution(resolution), |
| 28 m_yBinCount(yBinCount), | 30 m_yBinCount(yBinCount), |
| 29 m_minimum(0.0), | 31 m_minimum(0.0), |
| 30 m_maximum(0.0), | 32 m_maximum(0.0), |
| 33 m_haveExtents(false), | |
| 31 m_notifyOnAdd(notifyOnAdd), | 34 m_notifyOnAdd(notifyOnAdd), |
| 32 m_sinceLastNotifyMin(-1), | 35 m_sinceLastNotifyMin(-1), |
| 33 m_sinceLastNotifyMax(-1), | 36 m_sinceLastNotifyMax(-1), |
| 34 m_completion(100) | 37 m_completion(100) |
| 35 { | 38 { |
| 66 new EditableDenseThreeDimensionalModel | 69 new EditableDenseThreeDimensionalModel |
| 67 (m_sampleRate, m_resolution, m_yBinCount); | 70 (m_sampleRate, m_resolution, m_yBinCount); |
| 68 | 71 |
| 69 model->m_minimum = m_minimum; | 72 model->m_minimum = m_minimum; |
| 70 model->m_maximum = m_maximum; | 73 model->m_maximum = m_maximum; |
| 74 model->m_haveExtents = m_haveExtents; | |
| 71 | 75 |
| 72 for (size_t i = 0; i < m_data.size(); ++i) { | 76 for (size_t i = 0; i < m_data.size(); ++i) { |
| 73 model->setColumn(i, m_data[i]); | 77 model->setColumn(i, m_data[i]); |
| 74 } | 78 } |
| 75 | 79 |
| 150 { | 154 { |
| 151 QMutexLocker locker(&m_mutex); | 155 QMutexLocker locker(&m_mutex); |
| 152 | 156 |
| 153 if (index < m_data.size()) { | 157 if (index < m_data.size()) { |
| 154 const Column &s = m_data[index]; | 158 const Column &s = m_data[index]; |
| 155 std::cerr << "index " << index << ", n " << n << ", res " << m_resolution << ", size " << s.size() | 159 // std::cerr << "index " << index << ", n " << n << ", res " << m_resolution << ", size " << s.size() |
| 156 << std::endl; | 160 // << std::endl; |
| 157 if (n < s.size()) return s[n]; | 161 if (n < s.size()) return s[n]; |
| 158 } | 162 } |
| 159 | 163 |
| 160 return m_minimum; | 164 return m_minimum; |
| 161 } | 165 } |
| 168 | 172 |
| 169 while (index >= m_data.size()) { | 173 while (index >= m_data.size()) { |
| 170 m_data.push_back(Column()); | 174 m_data.push_back(Column()); |
| 171 } | 175 } |
| 172 | 176 |
| 173 bool newExtents = (m_data.empty() && (m_minimum == m_maximum)); | |
| 174 bool allChange = false; | 177 bool allChange = false; |
| 175 | 178 |
| 176 for (size_t i = 0; i < values.size(); ++i) { | 179 for (size_t i = 0; i < values.size(); ++i) { |
| 177 if (newExtents || values[i] < m_minimum) { | 180 float value = values[i]; |
| 178 m_minimum = values[i]; | 181 if (isnan(value) || isinf(value)) { |
| 182 continue; | |
| 183 } | |
| 184 if (!m_haveExtents || value < m_minimum) { | |
| 185 m_minimum = value; | |
| 179 allChange = true; | 186 allChange = true; |
| 180 } | 187 } |
| 181 if (newExtents || values[i] > m_maximum) { | 188 if (!m_haveExtents || value > m_maximum) { |
| 182 m_maximum = values[i]; | 189 m_maximum = value; |
| 183 allChange = true; | 190 allChange = true; |
| 184 } | 191 } |
| 192 m_haveExtents = true; | |
| 185 } | 193 } |
| 186 | 194 |
| 187 m_data[index] = values; | 195 m_data[index] = values; |
| 188 | 196 |
| 189 long windowStart = index; | 197 long windowStart = index; |
