MNE-CPP  0.1.9
A Framework for Electrophysiology
spline.h
Go to the documentation of this file.
1 //=============================================================================================================
34 #ifndef SPLINE_H
35 #define SPLINE_H
36 
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
41 #include "../disp_global.h"
42 
43 //=============================================================================================================
44 // QT INCLUDES
45 //=============================================================================================================
46 
47 #include <QWidget>
48 #include <QtCharts/QChart>
49 #include <QtCharts/QSplineSeries>
50 #include <QVector3D>
51 
52 //=============================================================================================================
53 // EIGEN INCLUDES
54 //=============================================================================================================
55 
56 #include <Eigen/Core>
57 
58 //=============================================================================================================
59 // FORWARD DECLARATIONS
60 //=============================================================================================================
61 
62 class QMouseEvent;
63 
64 namespace QtCharts
65 {
66  class QLineSeries;
67 }
68 
69 //=============================================================================================================
70 // DEFINE NAMESPACE DISPLIB
71 //=============================================================================================================
72 
73 namespace DISPLIB
74 {
75 
76 //=============================================================================================================
77 // DISPLIB FORWARD DECLARATIONS
78 //=============================================================================================================
79 
80 //=============================================================================================================
85 class DISPSHARED_EXPORT Spline: public QWidget
86 {
87  Q_OBJECT
88 
89 public:
90  typedef QSharedPointer<Spline> SPtr;
91  typedef QSharedPointer<const Spline> ConstSPtr;
93  //=========================================================================================================
99  Spline(QWidget* parent = 0, const QString& title = "Spline Histogram");
100 
101  //=========================================================================================================
108  template<typename T>
109  void setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
110  const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData);
111  template<typename T>
112  void setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
113  const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData);
114 
115  //=========================================================================================================
122  template<typename T>
123  void updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
124  const Eigen::VectorXi& matClassFrequencyData);
125 
126  //=========================================================================================================
132  void mousePressEvent(QMouseEvent *event);
133 
134  //=========================================================================================================
143  template<typename T>
144  void splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
145  int iClassAmount,
146  Eigen::VectorXd& vecCoefficientResults,
147  Eigen::VectorXi& vecExponentValues);
148 
149  //=========================================================================================================
155  void setThreshold(const QVector3D& vecThresholdValues);
156 
157  //=========================================================================================================
163  const QVector3D& getThreshold();
164 
165  //=========================================================================================================
173  QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues,
174  QString functionName);
175 
176  //=========================================================================================================
182  void setColorMap (const QString &colorMap);
183 
184  Eigen::VectorXi m_vecResultExponentValues;
185  double m_dMinAxisX;
186  double m_dMaxAxisX;
188 protected:
189  //=========================================================================================================
196  void updateThreshold (QtCharts::QLineSeries *lineSeries);
197 
198  QtCharts::QChart* m_pChart;
199  QtCharts::QSplineSeries* m_pSeries;
200  QtCharts::QLineSeries* m_pLeftThreshold;
201  QtCharts::QLineSeries* m_pMiddleThreshold;
202  QtCharts::QLineSeries* m_pRightThreshold;
204  QList<QVector3D> m_pReturnList;
205  QString m_colorMap;
206  QVector3D m_vecReturnVector;
208 signals:
209  //=========================================================================================================
217  void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold);
218 };
219 
220 //=============================================================================================================
221 // INLINE DEFINITIONS
222 //=============================================================================================================
223 
224 template <typename T>
225 void Spline::setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
226  const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData)
227 {
228  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matClassLimitData.rows(),1);
229  matrixName.col(0) = matClassLimitData;
230  this->updatePlot(matrixName, matClassFrequencyData);
231 }
232 
233 //=========================================================================================================
234 
235 template <typename T>
236 void Spline::setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
237  const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData)
238 {
239  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1, matClassLimitData.cols());
240  matrixName.row(0) = matClassLimitData;
241  this->updatePlot(matrixName, matClassFrequencyData);
242 }
243 
244 //=========================================================================================================
245 
246 template<typename T>
247 void Spline::updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
248  const Eigen::VectorXi& matClassFrequencyData)
249 {
250  Eigen::VectorXd resultDisplayValues;
251  int iClassAmount = matClassFrequencyData.rows();
252  this->splitCoefficientAndExponent (matClassLimitData, iClassAmount, resultDisplayValues, m_vecResultExponentValues);
253 
254  // Start of Qtchart histogram display
255  QString histogramExponent;
256  histogramExponent = "X-axis scale: 10e" + QString::number(m_vecResultExponentValues(0)); //used to tell the user the exponential scale used in the histogram
257  m_pSeries->setName(histogramExponent);
258  m_pSeries->clear();
259  m_pChart->removeSeries(m_pSeries);
260  m_pChart->removeSeries(m_pLeftThreshold); //create new series and then clear the plot and update with new data
261  m_pChart->removeSeries(m_pMiddleThreshold);
262  m_pChart->removeSeries(m_pRightThreshold);
263 
264  m_dMinAxisX = resultDisplayValues(0);
265  m_dMaxAxisX = resultDisplayValues(iClassAmount);
266  double classMark; //class mark is the middle point between lower and upper class limit
267  m_iMaximumFrequency = 0; //iMaximumFrequency used to create an intuitive histogram
268 
269  for (int ir = 0; ir < iClassAmount; ++ir)
270  {
271  classMark = (resultDisplayValues(ir) + resultDisplayValues(ir+1))/2 ;
272  m_pSeries->append(classMark, matClassFrequencyData(ir));
273  //std::cout << "Spline data points = " << classMark << ", " << matClassFrequencyData(ir) << std::endl;
274  if (matClassFrequencyData(ir) > m_iMaximumFrequency)
275  {
276  m_iMaximumFrequency = matClassFrequencyData(ir);
277  }
278  }
279  m_pLeftThreshold = new QtCharts::QLineSeries();
280  m_pMiddleThreshold = new QtCharts::QLineSeries();
281  m_pRightThreshold = new QtCharts::QLineSeries();
282  m_pLeftThreshold->setName("left");
283  m_pMiddleThreshold->setName("middle");
284  m_pRightThreshold->setName("right");
285 
286  m_pChart->addSeries(m_pSeries);
287  m_pChart->legend()->setVisible(true);
288  m_pChart->legend()->setAlignment(Qt::AlignBottom);
289  m_pChart->createDefaultAxes();
290  m_pChart->axisX()->setRange(m_dMinAxisX, m_dMaxAxisX);
291 }
292 
293 //=============================================================================================================
294 
295 template <typename T>
296 void Spline::splitCoefficientAndExponent (const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
297  int iClassAmount,
298  Eigen::VectorXd& vecCoefficientResults,
299  Eigen::VectorXi& vecExponentValues)
300 {
301  vecCoefficientResults.resize(iClassAmount + 1);
302  vecExponentValues.resize(iClassAmount + 1);
303  double originalValue(0.0),
304  limitDisplayValue(0.0),
305  doubleExponentValue(0.0);
306  int limitExponentValue(0);
307  for (int ir = 0; ir <= iClassAmount; ++ir)
308  {
309  originalValue = matClassLimitData(ir);
310  if (originalValue == 0.0) //mechanism to guard against evaluation of log(0.0) which is infinity
311  {
312  doubleExponentValue = 0.0;
313  }
314 
315  else
316  {
317  doubleExponentValue = log10(std::fabs(originalValue)); //return the exponent value in double
318  }
319 
320  limitExponentValue = round(doubleExponentValue); //round the exponent value to the nearest signed integer
321  limitDisplayValue = originalValue * (pow(10,-(limitExponentValue))); //display value is derived from multiplying class limit with inverse 10 to the power of negative exponent
322  vecCoefficientResults(ir) = limitDisplayValue; //append the display value to the return vector
323  vecExponentValues(ir) = limitExponentValue; //append the exponent value to the return vector
324  }
325 
326  int lowestExponentValue{0},
327  highestExponentValue{0};
328 
329  for (int ir = 0; ir <= iClassAmount; ++ir)
330  {
331  if (vecExponentValues(ir) < lowestExponentValue)
332  {
333  lowestExponentValue = vecExponentValues(ir); //find lowest exponent value to normalize display values for negative exponent
334  }
335  if (vecExponentValues(ir) > highestExponentValue) //find highest exponent value to normalize display values for positive exponent
336  {
337  highestExponentValue = vecExponentValues(ir);
338  }
339  }
340 
341  if (highestExponentValue > 0)
342  {
343  for (int ir = 0; ir <= iClassAmount; ++ir)
344  {
345  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
346  {
347  vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
348  vecExponentValues(ir)++;
349  }
350  }
351  }
352 
353  if (lowestExponentValue < 0)
354  {
355  for (int ir = 0; ir <= iClassAmount; ++ir)
356  {
357  while (vecExponentValues(ir) > lowestExponentValue)
358  {
359  vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
360  vecExponentValues(ir)--;
361  }
362  }
363  }
364 }
365 } // NAMESPACE
366 
367 #endif // SPLINE_H
double m_dMaxAxisX
Definition: spline.h:186
QSharedPointer< Spline > SPtr
Definition: spline.h:90
QString m_colorMap
Definition: spline.h:205
QtCharts::QLineSeries * m_pLeftThreshold
Definition: spline.h:200
Eigen::VectorXi m_vecResultExponentValues
Definition: spline.h:184
QtCharts::QLineSeries * m_pMiddleThreshold
Definition: spline.h:201
Spline class for histogram display using Qtcharts/QSpline.
Definition: spline.h:85
QVector3D m_vecReturnVector
Definition: spline.h:206
int m_iMaximumFrequency
Definition: spline.h:203
QtCharts::QLineSeries * m_pRightThreshold
Definition: spline.h:202
QtCharts::QChart * m_pChart
Definition: spline.h:198
QtCharts::QSplineSeries * m_pSeries
Definition: spline.h:199
double m_dMinAxisX
Definition: spline.h:185
QList< QVector3D > m_pReturnList
Definition: spline.h:204
#define DISPSHARED_EXPORT
Definition: disp_global.h:55
QSharedPointer< const Spline > ConstSPtr
Definition: spline.h:91