MNE-CPP  0.1.9
A Framework for Electrophysiology
imagesc.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "imagesc.h"
41 #include "helpers/colormap.h"
42 
43 //=============================================================================================================
44 // QT INCLUDES
45 //=============================================================================================================
46 
47 #include <QPainter>
48 
49 //=============================================================================================================
50 // USED NAMESPACES
51 //=============================================================================================================
52 
53 using namespace DISPLIB;
54 using namespace Eigen;
55 
56 //=============================================================================================================
57 // DEFINE MEMBER METHODS
58 //=============================================================================================================
59 
60 ImageSc::ImageSc(QWidget *parent)
61 : Graph(parent)
62 , m_pPixmapData(NULL)
63 , m_pPixmapColorbar(NULL)
64 {
65  init();
66 }
67 
68 //=============================================================================================================
69 
70 ImageSc::ImageSc(MatrixXd &p_dMat, QWidget *parent)
71 : Graph(parent)
72 , m_pPixmapData(NULL)
73 , m_pPixmapColorbar(NULL)
74 {
75  init();
76  updateData(p_dMat);
77 }
78 
79 //=============================================================================================================
80 
81 ImageSc::ImageSc(MatrixXf &p_fMat, QWidget *parent)
82 : Graph(parent)
83 , m_pPixmapData(NULL)
84 , m_pPixmapColorbar(NULL)
85 {
86  init();
87  updateData(p_fMat);
88 }
89 
90 //=============================================================================================================
91 
92 ImageSc::ImageSc(MatrixXi &p_iMat, QWidget *parent)
93 : Graph(parent)
94 , m_pPixmapData(NULL)
95 , m_pPixmapColorbar(NULL)
96 {
97  init();
98  updateData(p_iMat);
99 }
100 
101 //=============================================================================================================
102 
104 {
105  if(m_pPixmapData)
106  delete m_pPixmapData;
108  delete m_pPixmapColorbar;
109 }
110 
111 //=============================================================================================================
112 
114 {
115  //Colormap
117  m_sColorMap = "Hot";
118 
119  //Parent init
120  Graph::init();
121 
122  m_iBorderTopBottom = 20;
123  m_iBorderLeftRight = 60;
124 
125  //Colorbar
126  m_bColorbar = true;
127  m_qFontColorbar.setPixelSize(10);
128  m_qPenColorbar = QPen(Qt::black);
129  m_iColorbarWidth = 12;
130  m_iColorbarSteps = 7;//>= 2!!
131  m_iColorbarGradSteps = 200;
132 }
133 
134 //=============================================================================================================
135 
136 void ImageSc::updateData(MatrixXd &p_dMat)
137 {
138  if(p_dMat.rows() > 0 && p_dMat.cols() > 0)
139  {
140  m_dMinValue = p_dMat.minCoeff();
141  m_dMaxValue = p_dMat.maxCoeff();
142 
143  // -- data --
144  m_matCentNormData = p_dMat;
145  double minValue = m_matCentNormData.minCoeff();
146  m_matCentNormData.array() -= minValue;
147  double maxValue = m_matCentNormData.maxCoeff();
148  m_matCentNormData.array() /= maxValue;
149 
150  updateMaps();
151  }
152 }
153 
154 //=============================================================================================================
155 
156 void ImageSc::updateData(MatrixXf &p_fMat)
157 {
158  MatrixXd t_dMat = p_fMat.cast<double>();
159  updateData(t_dMat);
160 }
161 
162 //=============================================================================================================
163 
164 void ImageSc::updateData(MatrixXi &p_iMat)
165 {
166  MatrixXd t_dMat = p_iMat.cast<double>();
167  updateData(t_dMat);
168 }
169 
170 //=============================================================================================================
171 
173 {
174  if(m_pPixmapData)
175  {
176  delete m_pPixmapData;
177  m_pPixmapData = NULL;
178  }
180  {
181  delete m_pPixmapColorbar;
182  m_pPixmapColorbar = NULL;
183  }
184 
185  if(m_matCentNormData.rows() > 0 && m_matCentNormData.cols() > 0)
186  {
187  // --Data--
188  qint32 x = m_matCentNormData.cols();
189  qint32 y = m_matCentNormData.rows();
190  qint32 i, j;
191  QImage t_qImageData(x, y, QImage::Format_RGB32);
192  for(i = 0; i < x; ++i)
193  for(j = 0; j < y; ++j)
194  t_qImageData.setPixel(i, j, pColorMapper(m_matCentNormData(j,i), m_sColorMap));
195 
196  m_pPixmapData = new QPixmap(QPixmap::fromImage(t_qImageData));
197 
198  // --Colorbar--
199  QImage t_qImageColorbar(1, m_iColorbarGradSteps, QImage::Format_RGB32);
200 
201  double t_dQuantile = 1.0/((double)m_iColorbarGradSteps-1);
202  for(j = 0; j < m_iColorbarGradSteps; ++j)
203  {
204  QRgb t_qRgb = pColorMapper(t_dQuantile*((double)(m_iColorbarGradSteps-1-j))*1.0, m_sColorMap);
205  t_qImageColorbar.setPixel(0, j, t_qRgb);
206  }
207  m_pPixmapColorbar = new QPixmap(QPixmap::fromImage(t_qImageColorbar));
208 
209  // --Scale Values--
210  m_qVecScaleValues.clear();
211 
212  double scale = pow(10, floor(log(m_dMaxValue-m_dMinValue)/log(10.0)));
213 
214  //Zero Based Scale?
215  if(m_dMaxValue > 0 && m_dMinValue < 0)
216  {
217  double quantum = floor((((m_dMaxValue-m_dMinValue)/scale)/(m_iColorbarSteps-1))*10.0)*(scale/10.0);
218  double start = 0;
219  while(m_dMinValue < (start - quantum))
220  start -= quantum;
221  //Create Steps
222  m_qVecScaleValues.push_back(start);
223  for(qint32 i = 1; i < m_iColorbarSteps-1; ++i)
224  m_qVecScaleValues.push_back(m_qVecScaleValues[i-1]+quantum);
225  }
226  else
227  {
228  double quantum = floor((((m_dMaxValue-m_dMinValue)/scale)/(m_iColorbarSteps-1))*10.0)*(scale/10.0);
229  double start = floor(((m_dMaxValue-m_dMinValue)/2.0 + m_dMinValue)/scale)*scale;
230  while(m_dMinValue < (start - quantum))
231  start -= quantum;
232  //Create Steps
233  m_qVecScaleValues.push_back(start);
234  for(qint32 i = 1; i < m_iColorbarSteps-1; ++i)
235  m_qVecScaleValues.push_back(m_qVecScaleValues[i-1]+quantum);
236  }
237  update();
238  }
239 }
240 
241 //=============================================================================================================
242 
243 void ImageSc::setColorMap(const QString &p_sColorMap)
244 {
245  m_sColorMap = p_sColorMap;
246 
247  updateMaps();
248 }
249 
250 //=============================================================================================================
251 
252 void ImageSc::paintEvent(QPaintEvent * event)
253 {
254  Q_UNUSED(event);
255 
256  QPainter painter(this);
257  if (m_pPixmapData)
258  {
259  QPoint t_qPointTopLeft(0,0);
260 
261  // -- Data --
262  QSize t_qSizePixmapData = m_qSizeWidget;
263 
264  t_qSizePixmapData.setHeight(t_qSizePixmapData.height()-m_iBorderTopBottom*2);
265  t_qSizePixmapData.setWidth(t_qSizePixmapData.width()-m_iBorderLeftRight*2);
266  // Scale data
267  QPixmap t_qPixmapScaledData = m_pPixmapData->scaled(t_qSizePixmapData, Qt::IgnoreAspectRatio);//Qt::KeepAspectRatio);
268  // Calculate data position
269  t_qPointTopLeft.setX((m_qSizeWidget.width()-t_qPixmapScaledData.width())/2);
270  t_qPointTopLeft.setY((m_qSizeWidget.height()-t_qPixmapScaledData.height())/2);
271  //Draw data
272  painter.drawPixmap(t_qPointTopLeft,t_qPixmapScaledData);
273  //Draw border
274  painter.drawRect(t_qPointTopLeft.x()-1, t_qPointTopLeft.y()-1, t_qPixmapScaledData.width()+1, t_qPixmapScaledData.height()+1);
275 
276  // -- Colorbar --
277  if(m_bColorbar && m_pPixmapColorbar && m_qVecScaleValues.size() >= 2)
278  {
279  QSize t_qSizePixmapColorbar = m_qSizeWidget;
280 
281  t_qSizePixmapColorbar.setWidth(m_iColorbarWidth);
282  t_qSizePixmapColorbar.setHeight(t_qPixmapScaledData.height());
283 
284  // Scale colorbar
285  QPixmap t_qPixmapScaledColorbar = m_pPixmapColorbar->scaled(t_qSizePixmapColorbar, Qt::IgnoreAspectRatio);
286  // Calculate colorbar position
287  t_qPointTopLeft.setY(t_qPointTopLeft.y());
288  t_qPointTopLeft.setX(t_qPointTopLeft.x() + t_qPixmapScaledData.width() + m_iBorderLeftRight/3);
289  //Draw colorbar
290  painter.drawPixmap(t_qPointTopLeft,t_qPixmapScaledColorbar);
291  //Draw border
292  painter.drawRect(t_qPointTopLeft.x()-1, t_qPointTopLeft.y()-1, m_iColorbarWidth+1, t_qPixmapScaledData.height()+1);
293 
294  // -- Scale --
295  painter.setPen(m_qPenColorbar);
296  painter.setFont(m_qFontColorbar);
297 
298  qint32 x = t_qPointTopLeft.x()+ m_iColorbarWidth + m_qFontColorbar.pixelSize()/2;
299  qint32 x_markLeft = x - m_iColorbarWidth - m_qFontColorbar.pixelSize()/2;
300  qint32 x_markRight = x_markLeft + m_iColorbarWidth;
301 
302  // max
303  painter.save();
304  qint32 y_max = t_qPointTopLeft.y() - m_qFontColorbar.pixelSize()/2;
305  painter.translate(x, y_max-1);
306  painter.drawText(QRect(0, 0, 100, 12), Qt::AlignLeft, QString::number(m_dMaxValue));
307  painter.restore();
308  //draw max marks
309  qint32 y_max_mark = y_max + m_qFontColorbar.pixelSize()/2;
310  painter.drawLine(x_markLeft,y_max_mark,x_markLeft+2,y_max_mark);
311  painter.drawLine(x_markRight-3,y_max_mark,x_markRight-1,y_max_mark);
312 
313  // min
314  painter.save();
315  qint32 y_min = t_qPointTopLeft.y() + t_qSizePixmapColorbar.height()-1 - m_qFontColorbar.pixelSize()/2;
316  painter.translate(x, y_min-1);
317  painter.drawText(QRect(0, 0, 100, 12), Qt::AlignLeft, QString::number(m_dMinValue));
318  painter.restore();
319  //draw min marks
320  qint32 y_min_mark = y_min + m_qFontColorbar.pixelSize()/2;
321  painter.drawLine(x_markLeft,y_min_mark,x_markLeft+2,y_min_mark);
322  painter.drawLine(x_markRight-3,y_min_mark,x_markRight-1,y_min_mark);
323 
324  //Scale values
325  qint32 y_dist = y_min - y_max;
326  double minPercent = (m_qVecScaleValues[0]- m_dMinValue)/(m_dMaxValue-m_dMinValue);
327  double distPercent = (m_qVecScaleValues[1]-m_qVecScaleValues[0])/(m_dMaxValue-m_dMinValue);
328  qint32 y_current = y_min - (minPercent*y_dist);
329  qint32 y_current_mark;
330  //draw scale
331  for(qint32 i = 0; i < m_qVecScaleValues.size(); ++i)
332  {
333  painter.save();
334  painter.translate(x, y_current-1);
335  painter.drawText(QRect(0, 0, 100, 12), Qt::AlignLeft, QString::number(m_qVecScaleValues[i]));
336  painter.restore();
337  //draw marks
338  y_current_mark = y_current + m_qFontColorbar.pixelSize()/2;
339  painter.drawLine(x_markLeft,y_current_mark,x_markLeft+2,y_current_mark);
340  painter.drawLine(x_markRight-3,y_current_mark,x_markRight-1,y_current_mark);
341  //update y_current
342  y_current -= distPercent*y_dist;
343  }
344  }
345 
346  //Draw title & axes
347  Graph::drawLabels(t_qPixmapScaledData.width(), t_qPixmapScaledData.height());
348  }
349 }
DISPLIB::ImageSc::pColorMapper
QRgb(* pColorMapper)(double, const QString &)
Definition: imagesc.h:199
DISPLIB::Graph::init
void init()
Definition: graph.cpp:72
DISPLIB::ImageSc::m_sColorMap
QString m_sColorMap
Definition: imagesc.h:184
DISPLIB::ImageSc::init
void init()
Definition: imagesc.cpp:113
imagesc.h
ImageSc class declaration.
DISPLIB::ImageSc::paintEvent
void paintEvent(QPaintEvent *event)
Definition: imagesc.cpp:252
DISPLIB::ImageSc::m_dMinValue
double m_dMinValue
Definition: imagesc.h:188
DISPLIB::Graph::m_iBorderLeftRight
qint32 m_iBorderLeftRight
Definition: graph.h:153
DISPLIB::Graph
Base class for graphs.
Definition: graph.h:80
DISPLIB::ColorMap::valueToColor
static QRgb valueToColor(double v, const QString &sMap)
Definition: colormap.h:688
DISPLIB::ImageSc::m_iColorbarGradSteps
qint32 m_iColorbarGradSteps
Definition: imagesc.h:195
DISPLIB::ImageSc::m_matCentNormData
Eigen::MatrixXd m_matCentNormData
Definition: imagesc.h:186
DISPLIB::ImageSc::m_pPixmapData
QPixmap * m_pPixmapData
Definition: imagesc.h:181
DISPLIB::ImageSc::setColorMap
void setColorMap(const QString &p_sColorMap)
Definition: imagesc.cpp:243
DISPLIB::Graph::m_qSizeWidget
QSize m_qSizeWidget
Definition: graph.h:146
DISPLIB::Graph::m_iBorderTopBottom
qint32 m_iBorderTopBottom
Definition: graph.h:152
DISPLIB::ImageSc::m_pPixmapColorbar
QPixmap * m_pPixmapColorbar
Definition: imagesc.h:182
DISPLIB::ImageSc::m_iColorbarSteps
qint32 m_iColorbarSteps
Definition: imagesc.h:194
DISPLIB::ImageSc::updateMaps
void updateMaps()
Definition: imagesc.cpp:172
DISPLIB::ImageSc::m_bColorbar
bool m_bColorbar
Definition: imagesc.h:191
DISPLIB::Graph::drawLabels
void drawLabels(qint32 p_iContentWidth, qint32 p_iContentHeight)
Definition: graph.cpp:120
DISPLIB::ImageSc::updateData
void updateData(Eigen::MatrixXd &p_dMat)
DISPLIB::ImageSc::m_qVecScaleValues
QVector< double > m_qVecScaleValues
Definition: imagesc.h:192
colormap.h
ColorMap class declaration.
DISPLIB::ImageSc::m_qPenColorbar
QPen m_qPenColorbar
Definition: imagesc.h:197
DISPLIB::ImageSc::m_qFontColorbar
QFont m_qFontColorbar
Definition: imagesc.h:196
DISPLIB::ImageSc::m_dMaxValue
double m_dMaxValue
Definition: imagesc.h:189
DISPLIB::ImageSc::ImageSc
ImageSc(QWidget *parent=0)
Definition: imagesc.cpp:60
DISPLIB::ImageSc::m_iColorbarWidth
qint32 m_iColorbarWidth
Definition: imagesc.h:193
DISPLIB::ImageSc::~ImageSc
~ImageSc()
Definition: imagesc.cpp:103