MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
bar.h
Go to the documentation of this file.
1//=============================================================================================================
35#ifndef BAR_H
36#define BAR_H
37
38//=============================================================================================================
39// INCLUDES
40//=============================================================================================================
41
42#include "../disp_global.h"
43
44//=============================================================================================================
45// QT INCLUDES
46//=============================================================================================================
47
48#include <QWidget>
49#include <QPointer>
50#include <QtCharts/QChart>
51#include <QtCharts/QBarCategoryAxis>
52#include <QtCharts/QBarSet>
53#include <QtCharts/QBarSeries>
54
55//=============================================================================================================
56// EIGEN INCLUDES
57//=============================================================================================================
58
59#include <Eigen/Core>
60
61//=============================================================================================================
62// FORWARD DECLARATIONS
63//=============================================================================================================
64
65//=============================================================================================================
66// DEFINE NAMESPACE DISPLIB
67//=============================================================================================================
68
69namespace DISPLIB
70{
71
72//=============================================================================================================
73// DISPLIB FORWARD DECLARATIONS
74//=============================================================================================================
75
76//=============================================================================================================
82class DISPSHARED_EXPORT Bar : public QWidget
83{
84 Q_OBJECT
85
86public:
87 typedef QSharedPointer<Bar> SPtr;
88 typedef QSharedPointer<const Bar> ConstSPtr;
90 //=========================================================================================================
94 Bar(const QString& title = "", QWidget* parent = 0);
95
96 //=========================================================================================================
104 template<typename T>
105 void setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
106 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData,
107 int iPrecisionValue);
108 template<typename T>
109 void setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
110 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData,
111 int iPrecisionValue);
112
113 //=========================================================================================================
121 template<typename T>
122 void updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
123 const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>& matClassFrequencyData,
124 int iPrecisionValue);
125
126 //=========================================================================================================
135 template<typename T>
136 void splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
137 int iClassAmount,
138 Eigen::VectorXd& vecCoefficientResults,
139 Eigen::VectorXi& vecExponentValues);
140
141private:
142
143
144#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
145 QPointer<QtCharts::QChart> m_pChart;
146 QPointer<QtCharts::QBarCategoryAxis> m_pAxis;
147#else
148 QPointer<QChart> m_pChart;
149 QPointer<QBarCategoryAxis> m_pAxis;
150#endif
151
152};
153
154//=============================================================================================================
155// INLINE DEFINITIONS
156//=============================================================================================================
157
158template<typename T>
159void Bar::setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
160 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData,
161 int iPrecisionValue)
162{
163 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matClassLimitData.rows(),1);
164 matrixName.col(0) = matClassLimitData;
165 this->updatePlot(matrixName, matClassFrequencyData, iPrecisionValue);
166}
167
168//=============================================================================================================
169
170template<typename T>
171void Bar::setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
172 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData,
173 int iPrecisionValue)
174{
175 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1, matClassLimitData.cols());
176 matrixName.row(0) = matClassLimitData;
177 this->updatePlot(matrixName, matClassFrequencyData, iPrecisionValue);
178}
179
180//=============================================================================================================
181
182template<typename T>
183void Bar::updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
184 const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>& matClassFrequencyData,
185 int iPrecisionValue)
186{
187 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
188 using namespace QtCharts;
189 #endif
190 Eigen::VectorXd resultDisplayValues;
191 Eigen::VectorXi resultExponentValues;
192 int iClassAmount = matClassFrequencyData.rows();
193 this->splitCoefficientAndExponent (matClassLimitData, iClassAmount, resultDisplayValues, resultExponentValues);
194
195 //Setup legends
196 QString histogramExponent;
197 histogramExponent = "X-axis scale: 10e" + QString::number(resultExponentValues(0));
198 QBarSet* set = new QBarSet(histogramExponent);
199 QStringList categories;
200 QString currentLimits;
201 int classFreq;
202
203 for (int kr = 0; kr < iClassAmount; ++kr)
204 {
205 classFreq = matClassFrequencyData(kr);
206 currentLimits = ((QString::number(resultDisplayValues(kr), 'g' ,iPrecisionValue) + " to " + (QString::number(resultDisplayValues(kr+1), 'g', iPrecisionValue))));
207 categories << currentLimits;
208 *set << classFreq;
209// qDebug() << "Bar data points = " << currentLimits << " , " << classFreq;
210 }
211
212 //Create new series, then clear the plot and update with new data
213 QBarSeries *series = new QBarSeries();
214 series->append(set);
215
216 m_pChart->removeAllSeries();
217 m_pChart->addSeries(series);
218
219 m_pAxis->clear();
220 m_pAxis->append(categories);
221 m_pChart->createDefaultAxes();
222 m_pChart->setAxisX(m_pAxis, series);
223}
224
225//=============================================================================================================
226
227template <typename T>
228void Bar::splitCoefficientAndExponent (const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
229 int iClassAmount,
230 Eigen::VectorXd& vecCoefficientResults, Eigen::VectorXi& vecExponentValues)
231{
232 vecCoefficientResults.resize(iClassAmount + 1);
233 vecExponentValues.resize(iClassAmount + 1);
234 double originalValue(0.0),
235 limitDisplayValue(0.0),
236 doubleExponentValue(0.0);
237 int limitExponentValue(0);
238 for (int ir = 0; ir <= iClassAmount; ++ir)
239 {
240 originalValue = matClassLimitData(ir);
241 if (originalValue == 0.0) //mechanism to guard against evaluation of log(0.0) which is infinity
242 {
243 doubleExponentValue = 0.0;
244 }
245 else
246 {
247 doubleExponentValue = log10(std::fabs(originalValue)); //return the exponent value in double
248 }
249
250 limitExponentValue = round(doubleExponentValue); //round the exponent value to the nearest signed integer
251 limitDisplayValue = originalValue * (pow(10,-(limitExponentValue))); //display value is derived from multiplying class limit with inverse 10 to the power of negative exponent
252 vecCoefficientResults(ir) = limitDisplayValue; //append the display value to the return vector
253 vecExponentValues(ir) = limitExponentValue; //append the exponent value to the return vector
254 }
255
256 int lowestExponentValue{0},
257 highestExponentValue{0};
258
259 for (int ir = 0; ir <= iClassAmount; ++ir)
260 {
261 if (vecExponentValues(ir) < lowestExponentValue)
262 {
263 lowestExponentValue = vecExponentValues(ir); //find lowest exponent value to normalize display values for negative exponent
264 }
265 if (vecExponentValues(ir) > highestExponentValue) //find highest exponent value to normalize display values for positive exponent
266 {
267 highestExponentValue = vecExponentValues(ir);
268 }
269 }
270
271 if (highestExponentValue > 0)
272 {
273 for (int ir = 0; ir <= iClassAmount; ++ir)
274 {
275 while (vecExponentValues(ir) < highestExponentValue) //normalize the values by multiplying the display value by 10 and reducing the exponentValue by 1 until exponentValue reach the lowestExponentValue
276 {
277 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
278 vecExponentValues(ir)++;
279 }
280 }
281 }
282
283 if (lowestExponentValue < 0)
284 {
285 for (int ir = 0; ir <= iClassAmount; ++ir)
286 {
287 while (vecExponentValues(ir) > lowestExponentValue)
288 {
289 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
290 vecExponentValues(ir)--;
291 }
292 }
293 }
294}
295} // NAMESPACE
296
297#endif // BAR_H
#define DISPSHARED_EXPORT
Definition disp_global.h:55
Bar class for histogram display using QtCharts.
Definition bar.h:83
void splitCoefficientAndExponent(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, int iClassAmount, Eigen::VectorXd &vecCoefficientResults, Eigen::VectorXi &vecExponentValues)
Definition bar.h:228
QSharedPointer< const Bar > ConstSPtr
Definition bar.h:88
void setData(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &matClassFrequencyData, int iPrecisionValue)
Definition bar.h:159
void updatePlot(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, Eigen::Dynamic > &matClassFrequencyData, int iPrecisionValue)
Definition bar.h:183
QSharedPointer< Bar > SPtr
Definition bar.h:87