v2.0.0
Loading...
Searching...
No Matches
averagelayoutview.cpp
Go to the documentation of this file.
1//=============================================================================================================
15
16//=============================================================================================================
17// INCLUDES
18//=============================================================================================================
19
20#include "averagelayoutview.h"
21
27
28#include <fiff/fiff_info.h>
29
30//=============================================================================================================
31// QT INCLUDES
32//=============================================================================================================
33
34#include <QLabel>
35#include <QVBoxLayout>
36#include <QGraphicsView>
37#include <QSvgGenerator>
38#include <QDebug>
39#include <QGraphicsItem>
40#include <QSettings>
41#include <QRhiWidget>
42
43
44//=============================================================================================================
45// USED NAMESPACES
46//=============================================================================================================
47
48using namespace DISPLIB;
49using namespace FIFFLIB;
50
51//=============================================================================================================
52// DEFINE MEMBER METHODS
53//=============================================================================================================
54
55AverageLayoutView::AverageLayoutView(const QString& sSettingsPath,
56 QWidget* parent,
57 Qt::WindowFlags f)
58: AbstractView(parent, f)
59, m_qMapAverageColor(QSharedPointer<QMap<QString, QColor>>::create())
60, m_qMapAverageActivation(QSharedPointer<QMap<QString, bool>>::create())
61{
62 m_sSettingsPath = sSettingsPath;
63 this->setWindowTitle("Average Layout");
64
65 m_pAverageLayoutView = new QGraphicsView();
66
67 auto* rhiViewport = new QRhiWidget;
68#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
69 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
70#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
71 rhiViewport->setApi(QRhiWidget::Api::Metal);
72#elif defined(Q_OS_WIN)
73 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
74#else
75 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
76#endif
77 m_pAverageLayoutView->setViewport(rhiViewport);
78
79 m_pAverageLayoutView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
80 m_pAverageLayoutView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
81
83 m_pAverageScene->setBackgroundBrush(QBrush(Qt::white));
84
85 m_pAverageLayoutView->setScene(m_pAverageScene.data());
86
87 //set layouts
88 QVBoxLayout* neLayout = new QVBoxLayout(this);
89 neLayout->setContentsMargins(0, 0, 0, 0);
90 neLayout->addWidget(m_pAverageLayoutView);
91 this->setLayout(neLayout);
93}
94
95//=============================================================================================================
96
101
102//=============================================================================================================
103
105{
107 auto* rhiViewport = new QRhiWidget;
108#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
109 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
110#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
111 rhiViewport->setApi(QRhiWidget::Api::Metal);
112#elif defined(Q_OS_WIN)
113 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
114#else
115 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
116#endif
117 m_pAverageLayoutView->setViewport(rhiViewport);
118 }
119}
120
121//=============================================================================================================
122
123void AverageLayoutView::setChannelInfoModel(QSharedPointer<ChannelInfoModel>& pChannelInfoModel)
124{
125 m_pChannelInfoModel = pChannelInfoModel;
126}
127
128//=============================================================================================================
129
130void AverageLayoutView::setEvokedSetModel(QSharedPointer<EvokedSetModel> pEvokedSetModel)
131{
132 if (pEvokedSetModel) {
133 connect(pEvokedSetModel.data(), &EvokedSetModel::dataChanged,
134 this, &AverageLayoutView::updateData, Qt::UniqueConnection);
135 }
136
137 m_pEvokedSetModel = pEvokedSetModel;
138}
139
140//=============================================================================================================
141
142void AverageLayoutView::setBackgroundColor(const QColor& backgroundColor)
143{
144 if (!m_pAverageScene) {
145 qDebug() << "AverageLayoutView::setBackgroundColor - m_pAverageScene is NULL. Returning. ";
146 return;
147 }
148
149 QBrush backgroundBrush = m_pAverageScene->backgroundBrush();
150 backgroundBrush.setColor(backgroundColor);
151 m_pAverageScene->setBackgroundBrush(backgroundBrush);
152}
153
154//=============================================================================================================
155
157{
158 if (!m_pAverageScene) {
159 qDebug() << "AverageLayoutView::getBackgroundColor - m_pAverageScene is NULL. Returning. ";
160 return QColor();
161 }
162
163 return m_pAverageScene->backgroundBrush().color();
164}
165
166//=============================================================================================================
167
168void AverageLayoutView::takeScreenshot(const QString& fileName)
169{
170 if (!m_pAverageScene) {
171 qDebug() << "AverageLayoutView::takeScreenshot - m_pAverageScene is NULL. Returning. ";
172 return;
173 }
174
175 if (fileName.contains(".svg", Qt::CaseInsensitive)) {
176 // Generate screenshot
177 QSvgGenerator svgGen;
178 svgGen.setFileName(fileName);
179 QRectF rect = m_pAverageScene->itemsBoundingRect();
180 svgGen.setSize(QSize(rect.width(), rect.height()));
181
182 QPainter painter(&svgGen);
183 m_pAverageScene->render(&painter);
184 }
185
186 if (fileName.contains(".png", Qt::CaseInsensitive)) {
187 QRect rect = m_pAverageLayoutView->frameRect();
188 QPixmap pixMap = QWidget::grab(rect);
189 pixMap.save(fileName);
190 }
191}
192
193//=============================================================================================================
194
195void AverageLayoutView::setScaleMap(const QMap<qint32, float>& scaleMap)
196{
197 if (!m_pAverageScene) {
198 qDebug() << "AverageLayoutView::setScaleMap - m_pAverageScene is NULL. Returning. ";
199 return;
200 }
201
202 m_scaleMap = scaleMap;
203
204 m_pAverageScene->setScaleMap(scaleMap);
205
206 updateData();
207}
208
209//=============================================================================================================
210
211QSharedPointer<QMap<QString, QColor>> AverageLayoutView::getAverageColor() const
212{
213 return m_qMapAverageColor;
214}
215
216//=============================================================================================================
217
218QSharedPointer<QMap<QString, bool>> AverageLayoutView::getAverageActivation() const
219{
221}
222
223//=============================================================================================================
224
225void AverageLayoutView::setAverageColor(const QSharedPointer<QMap<QString, QColor>> qMapAverageColor)
226{
227 if (!m_pAverageScene) {
228 qDebug() << "AverageLayoutView::setAverageColor - m_pAverageScene is NULL. Returning. ";
229 return;
230 }
231
232 m_qMapAverageColor = qMapAverageColor;
233 m_pAverageScene->setColorPerAverage(m_qMapAverageColor);
234}
235
236//=============================================================================================================
237
239{
240 for (QString mapKey : m_qMapAverageColor->keys()) {
241 m_qMapAverageColor->insert(mapKey, avgColor);
242 }
243
244 m_pAverageScene->setColorPerAverage(m_qMapAverageColor);
245 m_pAverageScene->setSignalItemColor(avgColor);
246}
247
248//=============================================================================================================
249
250void AverageLayoutView::setAverageActivation(const QSharedPointer<QMap<QString, bool>> qMapAverageActivation)
251{
252 if (!m_pAverageScene) {
253 qDebug() << "AverageLayoutView::setAverageActivation - m_pAverageScene is NULL. Returning. ";
254 return;
255 }
256
257 m_qMapAverageActivation = qMapAverageActivation;
258 m_pAverageScene->setActivationPerAverage(qMapAverageActivation);
259}
260
261//=============================================================================================================
262
263void AverageLayoutView::channelSelectionManagerChanged(const QList<QGraphicsItem*>& selectedChannelItems)
264{
265 if (!m_pAverageScene) {
266 qDebug() << "AverageLayoutView::channelSelectionManagerChanged - m_pAverageScene is NULL. Returning. ";
267 return;
268 }
269 //Repaint the average items in the average scene based on the input parameter selectedChannelItems and update them with current data
270 m_pAverageScene->repaintItems(selectedChannelItems);
274 updateData();
275}
276
277//=============================================================================================================
278
279void AverageLayoutView::channelSelectionChanged(const QVariant& selectionData)
280{
281 if (!m_pAverageScene) {
282 qDebug() << "AverageLayoutView::channelSelectionManagerChanged - m_pAverageScene is NULL. Returning. ";
283 return;
284 }
285
286 SelectionItem* pSelectionItem = selectionData.value<DISPLIB::SelectionItem*>();
287
288 //Repaint the average items in the average scene based on the input parameter selectedChannelItems and update them with current selectionData
289 m_pAverageScene->repaintSelectionItems(*pSelectionItem);
293 updateData();
294}
295
296//=============================================================================================================
297
299{
300 if (m_pFiffInfo) {
301 QList<QGraphicsItem*> currentAverageSceneItems = m_pAverageScene->items();
302
303 //Set new data for all averageSceneItems
304 for (int i = 0; i < currentAverageSceneItems.size(); i++) {
305 AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
306
307 averageSceneItemTemp->m_lAverageData.clear();
308
309 if (m_pEvokedSetModel) {
310 //Get only the necessary data from the average model (use column 2)
311 QList<QPair<QString, DISPLIB::RowVectorPair>> averageData = m_pEvokedSetModel->data(0, 2, EvokedSetModelRoles::GetAverageData).value<QList<QPair<QString, DISPLIB::RowVectorPair>>>();
312
313 //Get the averageScenItem specific data row
314 int channelNumber = averageSceneItemTemp->m_iChannelNumber;
315
316 if (channelNumber != -1) {
317 averageSceneItemTemp->m_iChannelKind = m_pFiffInfo->chs.at(channelNumber).kind;
318 averageSceneItemTemp->m_iChannelUnit = m_pFiffInfo->chs.at(channelNumber).unit;
319 averageSceneItemTemp->m_firstLastSample.first = (-1) * m_pEvokedSetModel->getNumPreStimSamples();
320
321 if (!averageData.isEmpty()) {
322 averageSceneItemTemp->m_firstLastSample.second = averageData.first().second.second - m_pEvokedSetModel->getNumPreStimSamples();
323 }
324
325 averageSceneItemTemp->m_iTotalNumberChannels = m_pEvokedSetModel->rowCount();
326 averageSceneItemTemp->m_lAverageData = averageData;
327 averageSceneItemTemp->m_bIsBad = m_pEvokedSetModel->getIsChannelBad(channelNumber);
328 }
329 }
330 }
331
332 m_pAverageScene->updateScene();
333 return;
334 }
335
337 qDebug() << "AverageLayoutView::updateData - m_pAverageScene, m_pEvokedSetModel or m_pChannelInfoModel are NULL. Returning. ";
338 return;
339 }
340 //Get current items from the average scene
341 QList<QGraphicsItem*> currentAverageSceneItems = m_pAverageScene->items();
342
343 //Set new data for all averageSceneItems
344 for (int i = 0; i < currentAverageSceneItems.size(); i++) {
345 AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
346
347 averageSceneItemTemp->m_lAverageData.clear();
348
349 //Get only the necessary data from the average model (use column 2)
350 QList<QPair<QString, DISPLIB::RowVectorPair>> averageData = m_pEvokedSetModel->data(0, 2, EvokedSetModelRoles::GetAverageData).value<QList<QPair<QString, DISPLIB::RowVectorPair>>>();
351
352 //Get the averageScenItem specific data row
353 int channelNumber = m_pChannelInfoModel->getIndexFromMappedChName(averageSceneItemTemp->m_sChannelName);
354
355 if (channelNumber != -1) {
356 //qDebug() << "Change data for" << channelNumber << "" << averageSceneItemTemp->m_sChannelName;
357
358 averageSceneItemTemp->m_iChannelKind = m_pChannelInfoModel->data(m_pChannelInfoModel->index(channelNumber, 4), ChannelInfoModelRoles::GetChKind).toInt();
359 averageSceneItemTemp->m_iChannelUnit = m_pChannelInfoModel->data(m_pChannelInfoModel->index(channelNumber, 6), ChannelInfoModelRoles::GetChUnit).toInt();
360 averageSceneItemTemp->m_firstLastSample.first = (-1) * m_pEvokedSetModel->getNumPreStimSamples();
361
362 if (!averageData.isEmpty()) {
363 averageSceneItemTemp->m_firstLastSample.second = averageData.first().second.second - m_pEvokedSetModel->getNumPreStimSamples();
364 }
365
366 averageSceneItemTemp->m_iChannelNumber = channelNumber;
367 averageSceneItemTemp->m_iTotalNumberChannels = m_pEvokedSetModel->rowCount();
368 averageSceneItemTemp->m_lAverageData = averageData;
369 averageSceneItemTemp->m_bIsBad = m_pEvokedSetModel->getIsChannelBad(channelNumber);
370 }
371 }
372
373 m_pAverageScene->updateScene();
374}
375
376//=============================================================================================================
377
379{
380 if (m_sSettingsPath.isEmpty()) {
381 return;
382 }
383
384 QSettings settings("MNECPP");
385}
386
387//=============================================================================================================
388
390{
391 if (m_sSettingsPath.isEmpty()) {
392 return;
393 }
394
395 QSettings settings("MNECPP");
396}
397
398//=============================================================================================================
399
401{
402 switch (mode) {
404 break;
405 default: // default is research mode
406 break;
407 }
408}
409
410//=============================================================================================================
411
413{
414 switch (mode) {
416 break;
417 default: // default is realtime mode
418 break;
419 }
420}
421
422//=============================================================================================================
423
424void AverageLayoutView::setFiffInfo(const QSharedPointer<FIFFLIB::FiffInfo> pFiffInfo)
425{
426 m_pFiffInfo = pFiffInfo;
427}
428
429//=============================================================================================================
430
431QSharedPointer<EvokedSetModel> AverageLayoutView::getEvokedSetModel()
432{
433 return m_pEvokedSetModel;
434}
435
436//=============================================================================================================
437
439{
440 setEvokedSetModel(Q_NULLPTR);
441 updateData();
442}
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
2-D sensor-layout view placing per-channel evoked traces at their physical positions.
QAbstractTableModel wrapping a FiffEvokedSet so views can render per-condition averages without copyi...
QGraphicsScene that lays DISPLIB::AverageSceneItem mini-traces on the active sensor layout.
QAbstractTableModel exposing per-channel FIFF metadata (name, type, unit, position,...
Channel-selection group descriptor (DISPLIB::SelectionItem) and the matching QGraphicsItem (DISPLIB::...
QGraphicsObject painting one channel's averaged evoked trace at its sensor position.
FIFF file I/O, in-memory data structures and high-level readers/writers.
2-D display widgets and visualisation helpers (charts, topography, colour maps).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void setBackgroundColor(const QColor &backgroundColor)
void setEvokedSetModel(QSharedPointer< EvokedSetModel > pEvokedSetModel)
void setChannelInfoModel(QSharedPointer< ChannelInfoModel > &pChannelInfoModel)
QSharedPointer< QMap< QString, bool > > getAverageActivation() const
QSharedPointer< FIFFLIB::FiffInfo > m_pFiffInfo
QSharedPointer< DISPLIB::EvokedSetModel > m_pEvokedSetModel
QMap< qint32, float > m_scaleMap
void setAverageColor(const QSharedPointer< QMap< QString, QColor > > qMapAverageColor)
QPointer< QGraphicsView > m_pAverageLayoutView
QSharedPointer< AverageScene > m_pAverageScene
QSharedPointer< QMap< QString, QColor > > m_qMapAverageColor
QSharedPointer< QMap< QString, QColor > > getAverageColor() const
void channelSelectionChanged(const QVariant &selectionData)
QSharedPointer< QMap< QString, bool > > m_qMapAverageActivation
void setScaleMap(const QMap< qint32, float > &scaleMap)
void takeScreenshot(const QString &fileName)
void setAverageActivation(const QSharedPointer< QMap< QString, bool > > qMapAverageActivation)
QSharedPointer< DISPLIB::ChannelInfoModel > m_pChannelInfoModel
void setFiffInfo(const QSharedPointer< FIFFLIB::FiffInfo > pFiffInfo)
AverageLayoutView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void updateProcessingMode(ProcessingMode mode)
void channelSelectionManagerChanged(const QList< QGraphicsItem * > &selectedChannelItems)
void setSingleAverageColor(const QColor &avgColor)
QSharedPointer< EvokedSetModel > getEvokedSetModel()
Sensor-layout QGraphicsScene placing one AverageSceneItem per visible channel.
QSharedPointer< AverageScene > SPtr
QGraphicsObject painting one channel's averaged evoked traces inside AverageScene.
QList< QPair< QString, RowVectorPair > > m_lAverageData
QPair< int, int > m_firstLastSample
Value type describing one named selection group (label + list of channel names).