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 {
177 // Generate screenshot
178 QSvgGenerator svgGen;
179 svgGen.setFileName(fileName);
180 QRectF rect = m_pAverageScene->itemsBoundingRect();
181 svgGen.setSize(QSize(rect.width(), rect.height()));
182
183 QPainter painter(&svgGen);
184 m_pAverageScene->render(&painter);
185 }
186
187 if(fileName.contains(".png", Qt::CaseInsensitive))
188 {
189 QRect rect = m_pAverageLayoutView->frameRect();
190 QPixmap pixMap = QWidget::grab(rect);
191 pixMap.save(fileName);
192 }
193}
194
195//=============================================================================================================
196
197void AverageLayoutView::setScaleMap(const QMap<qint32,float> &scaleMap)
198{
199 if(!m_pAverageScene) {
200 qDebug() << "AverageLayoutView::setScaleMap - m_pAverageScene is NULL. Returning. ";
201 return;
202 }
203
204 m_scaleMap = scaleMap;
205
206 m_pAverageScene->setScaleMap(scaleMap);
207
208 updateData();
209}
210
211//=============================================================================================================
212
213QSharedPointer<QMap<QString, QColor> > AverageLayoutView::getAverageColor() const
214{
215 return m_qMapAverageColor;
216}
217
218//=============================================================================================================
219
220QSharedPointer<QMap<QString, bool> > AverageLayoutView::getAverageActivation() const
221{
223}
224
225//=============================================================================================================
226
227void AverageLayoutView::setAverageColor(const QSharedPointer<QMap<QString, QColor> > qMapAverageColor)
228{
229 if(!m_pAverageScene) {
230 qDebug() << "AverageLayoutView::setAverageColor - m_pAverageScene is NULL. Returning. ";
231 return;
232 }
233
234 m_qMapAverageColor = qMapAverageColor;
235 m_pAverageScene->setColorPerAverage(m_qMapAverageColor);
236}
237
238//=============================================================================================================
239
241{
242 for (QString mapKey : m_qMapAverageColor->keys()){
243 m_qMapAverageColor->insert(mapKey, avgColor);
244 }
245
246 m_pAverageScene->setColorPerAverage(m_qMapAverageColor);
247 m_pAverageScene->setSignalItemColor(avgColor);
248}
249
250//=============================================================================================================
251
252void AverageLayoutView::setAverageActivation(const QSharedPointer<QMap<QString, bool> > qMapAverageActivation)
253{
254 if(!m_pAverageScene) {
255 qDebug() << "AverageLayoutView::setAverageActivation - m_pAverageScene is NULL. Returning. ";
256 return;
257 }
258
259 m_qMapAverageActivation = qMapAverageActivation;
260 m_pAverageScene->setActivationPerAverage(qMapAverageActivation);
261}
262
263//=============================================================================================================
264
265void AverageLayoutView::channelSelectionManagerChanged(const QList<QGraphicsItem*> &selectedChannelItems)
266{
267 if(!m_pAverageScene) {
268 qDebug() << "AverageLayoutView::channelSelectionManagerChanged - m_pAverageScene is NULL. Returning. ";
269 return;
270 }
271 //Repaint the average items in the average scene based on the input parameter selectedChannelItems and update them with current data
272 m_pAverageScene->repaintItems(selectedChannelItems);
276 updateData();
277}
278
279//=============================================================================================================
280
282{
283 if(!m_pAverageScene) {
284 qDebug() << "AverageLayoutView::channelSelectionManagerChanged - m_pAverageScene is NULL. Returning. ";
285 return;
286 }
287
288 SelectionItem* pSelectionItem = data.value<DISPLIB::SelectionItem*>();
289
290 //Repaint the average items in the average scene based on the input parameter selectedChannelItems and update them with current data
291 m_pAverageScene->repaintSelectionItems(*pSelectionItem);
295 updateData();
296}
297
298//=============================================================================================================
299
301{
302 if(m_pFiffInfo) {
303 QList<QGraphicsItem *> currentAverageSceneItems = m_pAverageScene->items();
304
305 //Set new data for all averageSceneItems
306 for(int i = 0; i < currentAverageSceneItems.size(); i++) {
307 AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
308
309 averageSceneItemTemp->m_lAverageData.clear();
310
312 //Get only the necessary data from the average model (use column 2)
313 QList<QPair<QString, DISPLIB::RowVectorPair> > averageData = m_pEvokedSetModel->data(0, 2, EvokedSetModelRoles::GetAverageData).value<QList<QPair<QString, DISPLIB::RowVectorPair> > >();
314
315 //Get the averageScenItem specific data row
316 int channelNumber = averageSceneItemTemp->m_iChannelNumber;
317
318 if(channelNumber != -1) {
319 averageSceneItemTemp->m_iChannelKind = m_pFiffInfo->chs.at(channelNumber).kind;
320 averageSceneItemTemp->m_iChannelUnit = m_pFiffInfo->chs.at(channelNumber).unit;
321 averageSceneItemTemp->m_firstLastSample.first = (-1)*m_pEvokedSetModel->getNumPreStimSamples();
322
323 if(!averageData.isEmpty()) {
324 averageSceneItemTemp->m_firstLastSample.second = averageData.first().second.second - m_pEvokedSetModel->getNumPreStimSamples();
325 }
326
327 averageSceneItemTemp->m_iTotalNumberChannels = m_pEvokedSetModel->rowCount();
328 averageSceneItemTemp->m_lAverageData = averageData;
329 averageSceneItemTemp->m_bIsBad = m_pEvokedSetModel->getIsChannelBad(channelNumber);
330 }
331 }
332 }
333
334 m_pAverageScene->updateScene();
335 return;
336 }
337
339 qDebug() << "AverageLayoutView::updateData - m_pAverageScene, m_pEvokedSetModel or m_pChannelInfoModel are NULL. Returning. ";
340 return;
341 }
342 //Get current items from the average scene
343 QList<QGraphicsItem *> currentAverageSceneItems = m_pAverageScene->items();
344
345 //Set new data for all averageSceneItems
346 for(int i = 0; i < currentAverageSceneItems.size(); i++) {
347 AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
348
349 averageSceneItemTemp->m_lAverageData.clear();
350
351 //Get only the necessary data from the average model (use column 2)
352 QList<QPair<QString, DISPLIB::RowVectorPair> > averageData = m_pEvokedSetModel->data(0, 2, EvokedSetModelRoles::GetAverageData).value<QList<QPair<QString, DISPLIB::RowVectorPair> > >();
353
354 //Get the averageScenItem specific data row
355 int channelNumber = m_pChannelInfoModel->getIndexFromMappedChName(averageSceneItemTemp->m_sChannelName);
356
357 if(channelNumber != -1) {
358 //qDebug() << "Change data for" << channelNumber << "" << averageSceneItemTemp->m_sChannelName;
359
360 averageSceneItemTemp->m_iChannelKind = m_pChannelInfoModel->data(m_pChannelInfoModel->index(channelNumber, 4), ChannelInfoModelRoles::GetChKind).toInt();
361 averageSceneItemTemp->m_iChannelUnit = m_pChannelInfoModel->data(m_pChannelInfoModel->index(channelNumber, 6), ChannelInfoModelRoles::GetChUnit).toInt();
362 averageSceneItemTemp->m_firstLastSample.first = (-1)*m_pEvokedSetModel->getNumPreStimSamples();
363
364 if(!averageData.isEmpty()) {
365 averageSceneItemTemp->m_firstLastSample.second = averageData.first().second.second - m_pEvokedSetModel->getNumPreStimSamples();
366 }
367
368 averageSceneItemTemp->m_iChannelNumber = channelNumber;
369 averageSceneItemTemp->m_iTotalNumberChannels = m_pEvokedSetModel->rowCount();
370 averageSceneItemTemp->m_lAverageData = averageData;
371 averageSceneItemTemp->m_bIsBad = m_pEvokedSetModel->getIsChannelBad(channelNumber);
372 }
373 }
374
375 m_pAverageScene->updateScene();
376}
377
378//=============================================================================================================
379
381{
382 if(m_sSettingsPath.isEmpty()) {
383 return;
384 }
385
386 QSettings settings("MNECPP");
387}
388
389//=============================================================================================================
390
392{
393 if(m_sSettingsPath.isEmpty()) {
394 return;
395 }
396
397 QSettings settings("MNECPP");
398}
399
400//=============================================================================================================
401
403{
404 switch(mode) {
406 break;
407 default: // default is research mode
408 break;
409 }
410}
411
412//=============================================================================================================
413
415{
416 switch(mode) {
418 break;
419 default: // default is realtime mode
420 break;
421 }
422}
423
424//=============================================================================================================
425
426void AverageLayoutView::setFiffInfo(const QSharedPointer<FIFFLIB::FiffInfo> pFiffInfo)
427{
428 m_pFiffInfo = pFiffInfo;
429}
430
431//=============================================================================================================
432
433QSharedPointer<EvokedSetModel> AverageLayoutView::getEvokedSetModel()
434{
435 return m_pEvokedSetModel;
436}
437
438//=============================================================================================================
439
441{
442 setEvokedSetModel(Q_NULLPTR);
443 updateData();
444}
QGraphicsObject painting one channel's averaged evoked trace at its sensor position.
QAbstractTableModel exposing per-channel FIFF metadata (name, type, unit, position,...
QGraphicsScene that lays AverageSceneItem mini-traces on the active sensor layout.
QAbstractTableModel wrapping a FiffEvokedSet so views can render per-condition averages without copyi...
Channel-selection group descriptor (SelectionItem) and the matching QGraphicsItem (SelectionSceneItem...
2-D sensor-layout view placing per-channel evoked traces at their physical positions.
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
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)
QMap< qint32, float > m_scaleMap
void setEvokedSetModel(QSharedPointer< EvokedSetModel > pEvokedSetModel)
void channelSelectionChanged(const QVariant &data)
void setChannelInfoModel(QSharedPointer< ChannelInfoModel > &pChannelInfoModel)
QSharedPointer< QMap< QString, bool > > getAverageActivation() const
QSharedPointer< FIFFLIB::FiffInfo > m_pFiffInfo
QSharedPointer< DISPLIB::EvokedSetModel > m_pEvokedSetModel
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
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).