MNE-CPP  beta 1.0
averagewindow.cpp
Go to the documentation of this file.
1 //=============================================================================================================
37 //*************************************************************************************************************
38 //=============================================================================================================
39 // INCLUDES
40 //=============================================================================================================
41 
42 #include "averagewindow.h"
43 
44 
45 //*************************************************************************************************************
46 //=============================================================================================================
47 // USED NAMESPACES
48 //=============================================================================================================
49 
50 using namespace MNEBrowseRawQt;
51 
52 
53 //*************************************************************************************************************
54 //=============================================================================================================
55 // DEFINE MEMBER METHODS
56 //=============================================================================================================
57 
58 AverageWindow::AverageWindow(QWidget *parent, QFile &file)
59 : QDockWidget(parent)
60 , ui(new Ui::AverageWindow)
61 {
62  ui->setupUi(this);
63  initMVC(file);
64  init();
65 }
66 
67 
68 //*************************************************************************************************************
69 
71 : QDockWidget(parent)
72 , ui(new Ui::AverageWindow)
73 {
74  ui->setupUi(this);
75  initMVC();
76  init();
77 }
78 
79 
80 //*************************************************************************************************************
81 
82 //AverageWindow::AverageWindow()
83 //: AverageWindow(0)
84 //{
85 //}
86 
87 
88 //*************************************************************************************************************
89 
91 {
92  delete ui;
93 }
94 
95 
96 //*************************************************************************************************************
97 
99 {
100  return m_pAverageModel;
101 }
102 
103 
104 //*************************************************************************************************************
105 
106 void AverageWindow::channelSelectionManagerChanged(const QList<QGraphicsItem*> &selectedChannelItems)
107 {
108  //Repaint the average items in the average scene based on the input parameter
109  m_pAverageScene->repaintItems(selectedChannelItems);
110 
111  //call the onSelection function manually to replot the data for the givven average items
112  onSelectionChanged(ui->m_tableView_loadedSets->selectionModel()->selection(), QItemSelection());
113 
114  //fit everything in the view and update the scene
115  ui->m_graphicsView_layout->fitInView(m_pAverageScene->sceneRect(), Qt::KeepAspectRatio);
116  m_pAverageScene->update(m_pAverageScene->sceneRect());
117 }
118 
119 
120 //*************************************************************************************************************
121 
122 void AverageWindow::scaleAveragedData(const QMap<QString,double> &scaleMap)
123 {
124  //Set the scale map received from the scale window
125  m_pAverageScene->setScaleMap(scaleMap);
126  m_pButterflyScene->setScaleMap(scaleMap);
127 }
128 
129 
130 //*************************************************************************************************************
131 
132 void AverageWindow::init()
133 {
134  initTableViewWidgets();
135  initAverageSceneView();
136  initButtons();
137  initComboBoxes();
138 }
139 
140 void AverageWindow::initMVC(QFile &file)
141 {
142  //Setup average model
143  if(file.exists())
144  m_pAverageModel = new AverageModel(file, this);
145  else
146  m_pAverageModel = new AverageModel(this);
147 
148  //Setup average delegate
149  m_pAverageDelegate = new AverageDelegate(this);
150 }
151 
152 void AverageWindow::initMVC()
153 {
154  m_pAverageModel = new AverageModel(this);
155 
156  //Setup average delegate
157  m_pAverageDelegate = new AverageDelegate(this);
158 }
159 
160 
161 //*************************************************************************************************************
162 
163 void AverageWindow::initTableViewWidgets()
164 {
165  //Set average model to list widget
166  ui->m_tableView_loadedSets->setModel(m_pAverageModel);
167  ui->m_tableView_loadedSets->setColumnHidden(1,true); //hide second column because the average model holds the aspect kind for this column
168  ui->m_tableView_loadedSets->setColumnHidden(4,true); //hide last column because the average model holds the data types for this column
169  ui->m_tableView_loadedSets->resizeColumnsToContents();
170 
171  ui->m_tableView_loadedSets->adjustSize();
172 
173  //Set initial selection
174  ui->m_tableView_loadedSets->selectionModel()->select(QItemSelection(m_pAverageModel->index(0,0,QModelIndex()), m_pAverageModel->index(0,3,QModelIndex())),
175  QItemSelectionModel::Select);
176 
177  //Connect selection of the loaded evoked files
178  connect(ui->m_tableView_loadedSets->selectionModel(), &QItemSelectionModel::selectionChanged,
179  this, &AverageWindow::onSelectionChanged);
180 }
181 
182 
183 //*************************************************************************************************************
184 
185 void AverageWindow::initAverageSceneView()
186 {
187  //Create average scene and set view
188  m_pAverageScene = new AverageScene(ui->m_graphicsView_layout, this);
189  ui->m_graphicsView_layout->setScene(m_pAverageScene);
190 
191  //Create butterfly average scene and set view
192  m_pButterflyScene = new ButterflyScene(ui->m_graphicsView_butterflyPlot, this);
193  ui->m_graphicsView_butterflyPlot->setScene(m_pButterflyScene);
194 
195  //Generate random colors for plotting
196  for(int i = 0; i<500; i++)
197  m_lButterflyColors.append(QColor(qrand()%256, qrand()%256, qrand()%256));
198 }
199 
200 
201 //*************************************************************************************************************
202 
203 void AverageWindow::initButtons()
204 {
205  connect(ui->m_pushButton_exportLayoutPlot, &QPushButton::released,
206  this, &AverageWindow::exportAverageLayoutPlot);
207 
208  connect(ui->m_pushButton_exportButterflyPlot, &QPushButton::released,
209  this, &AverageWindow::exportAverageButterflyPlot);
210 }
211 
212 
213 //*************************************************************************************************************
214 
215 void AverageWindow::initComboBoxes()
216 {
217  connect(ui->m_comboBox_channelKind, &QComboBox::currentTextChanged,
218  this, [this](){
219  this->onSelectionChanged(ui->m_tableView_loadedSets->selectionModel()->selection(),
220  ui->m_tableView_loadedSets->selectionModel()->selection());
221  });
222 }
223 
224 
225 //*************************************************************************************************************
226 
227 void AverageWindow::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
228 {
229  Q_UNUSED(deselected);
230  Q_UNUSED(selected);
231 
232  qDebug()<<"AverageWindow::onSelectionChanged";
233  //Get current items from the average scene
234  QList<QGraphicsItem *> currentAverageSceneItems = m_pAverageScene->items();
235 
236  //Set new data for all averageSceneItems
237  for(int i = 0; i<currentAverageSceneItems.size(); i++) {
238  AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
239 
240  averageSceneItemTemp->m_lAverageData.clear();
241 
242  //Do for all selected evoked sets
243  for(int u = 0; u<selected.indexes().size(); u++) {
244  //Get only the necessary data from the average model (use column 4)
245  QModelIndex index = selected.indexes().at(u);
246 
247  const FiffInfo* fiffInfo = m_pAverageModel->data(m_pAverageModel->index(index.row(), 4), AverageModelRoles::GetFiffInfo).value<const FiffInfo*>();
248  RowVectorPair averageData = m_pAverageModel->data(m_pAverageModel->index(index.row(), 4), AverageModelRoles::GetAverageData).value<RowVectorPair>();
249  int first = m_pAverageModel->data(m_pAverageModel->index(index.row(), 2), AverageModelRoles::GetFirstSample).toInt();
250  int last = m_pAverageModel->data(m_pAverageModel->index(index.row(), 3), AverageModelRoles::GetLastSample).toInt();
251 
252  //Get the averageScenItem specific data row
253  QStringList chNames = fiffInfo->ch_names;
254 
255  int channelNumber = chNames.indexOf(averageSceneItemTemp->m_sChannelName);
256  if(channelNumber != -1) {
257  averageSceneItemTemp->m_firstLastSample.first = first;
258  averageSceneItemTemp->m_firstLastSample.second = last;
259  averageSceneItemTemp->m_iChannelKind = fiffInfo->chs.at(channelNumber).kind;
260  averageSceneItemTemp->m_iChannelUnit = fiffInfo->chs.at(channelNumber).unit;;
261  averageSceneItemTemp->m_iChannelNumber = channelNumber;
262  averageSceneItemTemp->m_iTotalNumberChannels = chNames.size();
263  averageSceneItemTemp->m_lAverageData.append(averageData);
264  }
265  }
266  }
267 
268  m_pAverageScene->update();
269 
270  //Draw butterfly plot
271  m_pButterflyScene->clear();
272 
273  for(int i = 0; i<selected.indexes().size(); i++) {
274  //Get only the necessary data from the average model (use column 4)
275  QModelIndex index = selected.indexes().at(i);
276 
277  const FiffInfo* fiffInfo = m_pAverageModel->data(m_pAverageModel->index(index.row(), 4), AverageModelRoles::GetFiffInfo).value<const FiffInfo*>();
278  RowVectorPair averageData = m_pAverageModel->data(m_pAverageModel->index(index.row(), 4), AverageModelRoles::GetAverageData).value<RowVectorPair>();
279  int first = m_pAverageModel->data(m_pAverageModel->index(index.row(), 2), AverageModelRoles::GetFirstSample).toInt();
280  int last = m_pAverageModel->data(m_pAverageModel->index(index.row(), 3), AverageModelRoles::GetLastSample).toInt();
281  QString setName = m_pAverageModel->data(m_pAverageModel->index(index.row(), 0), Qt::DisplayRole).toString();
282 
283  //Create new butterfly scene item
284  fiff_int_t setUnit, setKind;
285  if(ui->m_comboBox_channelKind->currentText() == "MEG_grad")
286  setUnit = FIFF_UNIT_T_M;
287  else
288  setUnit = FIFF_UNIT_T;
289 
290  if(ui->m_comboBox_channelKind->currentText() == "EEG")
291  setKind = FIFFV_EEG_CH;
292  else
293  setKind = FIFFV_MEG_CH;
294 
295  ButterflySceneItem* butterflySceneItemTemp = new ButterflySceneItem(setName,
296  setKind,
297  setUnit,
298  m_lButterflyColors);
299 
300  butterflySceneItemTemp->m_lAverageData.first = averageData.first;
301  butterflySceneItemTemp->m_lAverageData.second = averageData.second;
302  butterflySceneItemTemp->m_pFiffInfo = fiffInfo;
303  butterflySceneItemTemp->m_firstLastSample.first = first;
304  butterflySceneItemTemp->m_firstLastSample.second = last;
305 
306  m_pButterflyScene->addItem(butterflySceneItemTemp);
307  }
308 
309  m_pButterflyScene->update();
310 }
311 
312 
313 //*************************************************************************************************************
314 
315 void AverageWindow::exportAverageLayoutPlot()
316 {
317  // Open file dialog
318  QDate date;
319  QString fileName = QFileDialog::getSaveFileName(this,
320  "Save average plot",
321  QString("%1/%2_%3_%4_AveragePlot").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(date.currentDate().year()).arg(date.currentDate().month()).arg(date.currentDate().day()),
322  tr("Vector graphic(*.svg);;Images (*.png)"));
323 
324  if(!fileName.isEmpty())
325  {
326  // Generate screenshot
327  if(fileName.contains(".svg"))
328  {
329  QSvgGenerator svgGen;
330 
331  svgGen.setFileName(fileName);
332  QRectF rect = m_pAverageScene->itemsBoundingRect();
333  svgGen.setSize(QSize(rect.width(), rect.height()));
334  //svgGen.setViewBox(QRect(0, 0, rect.width(), rect.height()));
335 
336  QPainter painter(&svgGen);
337  m_pAverageScene->render(&painter);
338  }
339 
340  if(fileName.contains(".png"))
341  {
342  m_pAverageScene->setSceneRect(m_pAverageScene->itemsBoundingRect()); // Re-shrink the scene to it's bounding contents
343  QImage image(m_pAverageScene->sceneRect().size().toSize(), QImage::Format_ARGB32); // Create the image with the exact size of the shrunk scene
344  image.fill(Qt::transparent); // Start all pixels transparent
345 
346  QPainter painter(&image);
347  m_pAverageScene->render(&painter);
348  image.save(fileName);
349  }
350  }
351 }
352 
353 
354 //*************************************************************************************************************
355 
356 void AverageWindow::exportAverageButterflyPlot()
357 {
358  // Open file dialog
359  QDate date;
360  QString fileName = QFileDialog::getSaveFileName(this,
361  "Save butterfly plot",
362  QString("%1/%2_%3_%4_ButterflyPlot").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(date.currentDate().year()).arg(date.currentDate().month()).arg(date.currentDate().day()),
363  tr("Vector graphic(*.svg);;Images (*.png)"));
364 
365  if(!fileName.isEmpty())
366  {
367  // Generate screenshot
368  if(fileName.contains(".svg"))
369  {
370  QSvgGenerator svgGen;
371 
372  svgGen.setFileName(fileName);
373  QRectF rect = m_pButterflyScene->itemsBoundingRect();
374  svgGen.setSize(QSize(rect.width(), rect.height()));
375  //svgGen.setViewBox(QRect(0, 0, rect.width(), rect.height()));
376 
377  QPainter painter(&svgGen);
378  m_pButterflyScene->render(&painter);
379  }
380 
381  if(fileName.contains(".png"))
382  {
383  m_pButterflyScene->setSceneRect(m_pButterflyScene->itemsBoundingRect()); // Re-shrink the scene to it's bounding contents
384  QImage image(m_pButterflyScene->sceneRect().size().toSize(), QImage::Format_ARGB32); // Create the image with the exact size of the shrunk scene
385  image.fill(Qt::transparent); // Start all pixels transparent
386 
387  QPainter painter(&image);
388  m_pButterflyScene->render(&painter);
389  image.save(fileName);
390  }
391  }
392 }
393 
394 
395 //*************************************************************************************************************
396 
397 void AverageWindow::resizeEvent(QResizeEvent *event)
398 {
399  Q_UNUSED(event);
400 }
AverageModel * getAverageModel()
Contains the declaration of the AverageWindow class.
FIFF measurement file information.
Definition: fiff_info.h:96
void channelSelectionManagerChanged(const QList< QGraphicsItem * > &selectedChannelItems)
The ButterflyScene class provides a reimplemented QGraphicsScene for 2D layout plotting.
Definition: aboutwindow.h:52
QList< RowVectorPair > m_lAverageData
The AverageScene class provides a reimplemented QGraphicsScene for 2D layout plotting.
Definition: averagescene.h:73
The ButterflySceneItem class provides a new data structure for visualizing averages in a 2D layout...
void setScaleMap(const QMap< QString, double > &scaleMap)
#define FIFF_UNIT_T_M
void setScaleMap(const QMap< QString, double > &scaleMap)
QList< FiffChInfo > chs
void scaleAveragedData(const QMap< QString, double > &scaleMap)
AverageWindow(QWidget *parent, QFile &file)
The AverageWindow class provides a dock window for plotting averages.
Definition: averagewindow.h:88
void repaintItems(const QList< QGraphicsItem * > &selectedChannelItems)
The AverageSceneItem class provides a new data structure for visualizing averages in a 2D layout...