MNE-CPP  0.1.9
A Framework for Electrophysiology
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 
69 namespace DISPLIB
70 {
71 
72 //=============================================================================================================
73 // DISPLIB FORWARD DECLARATIONS
74 //=============================================================================================================
75 
76 //=============================================================================================================
82 class DISPSHARED_EXPORT Bar : public QWidget
83 {
84  Q_OBJECT
85 
86 public:
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 
141 private:
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 
158 template<typename T>
159 void 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 
170 template<typename T>
171 void 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 
182 template<typename T>
183 void 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 
227 template <typename T>
228 void 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
DISPSHARED_EXPORT
#define DISPSHARED_EXPORT
Definition: disp_global.h:55
DISPLIB::Bar::updatePlot
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
DISPLIB::Bar::splitCoefficientAndExponent
void splitCoefficientAndExponent(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, int iClassAmount, Eigen::VectorXd &vecCoefficientResults, Eigen::VectorXi &vecExponentValues)
Definition: bar.h:228
DISPLIB::Bar
Bar class for histogram display using QtCharts.
Definition: bar.h:82
DISPLIB::Bar::ConstSPtr
QSharedPointer< const Bar > ConstSPtr
Definition: bar.h:88
DISPLIB::Bar::setData
void setData(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &matClassFrequencyData, int iPrecisionValue)
Definition: bar.h:159
DISPLIB::Bar::SPtr
QSharedPointer< Bar > SPtr
Definition: bar.h:87