v2.0.0
Loading...
Searching...
No Matches
evokedsetmodel.cpp
Go to the documentation of this file.
1//=============================================================================================================
34
35//=============================================================================================================
36// INCLUDES
37//=============================================================================================================
38
39#include "evokedsetmodel.h"
40
41#include <fiff/fiff_info.h>
43
44//=============================================================================================================
45// QT INCLUDES
46//=============================================================================================================
47
48#include <QtConcurrent>
49#include <QFuture>
50#include <QPair>
51#include <QColor>
52
53//=============================================================================================================
54// EIGEN INCLUDES
55//=============================================================================================================
56
57//=============================================================================================================
58// STL INCLUDES
59//=============================================================================================================
60
61#include <iostream>
62
63//=============================================================================================================
64// USED NAMESPACES
65//=============================================================================================================
66
67using namespace DISPLIB;
68using namespace FIFFLIB;
69using namespace Eigen;
70
71//=============================================================================================================
72// DEFINE MEMBER METHODS
73//=============================================================================================================
74
76: QAbstractTableModel(parent)
77, m_fSps(1024.0f)
78, m_bIsFreezed(false)
79, m_bProjActivated(false)
80, m_bCompActivated(false)
81, m_bIsInit(false)
82, m_qMapAverageColor(QSharedPointer<QMap<QString, QColor> >::create())
83, m_qMapAverageActivation(QSharedPointer<QMap<QString, bool> >::create())
84, m_qMapAverageColorOld(QSharedPointer<QMap<QString, QColor> >::create())
85, m_qMapAverageActivationOld(QSharedPointer<QMap<QString, bool> >::create())
86{
87}
88
89//=============================================================================================================
90
94
95//=============================================================================================================
96//virtual functions
97int EvokedSetModel::rowCount(const QModelIndex & /*parent*/) const
98{
99 if(m_pEvokedSet) {
100 return m_pEvokedSet->info.nchan;
101 }
102
103 return 0;
104}
105
106//=============================================================================================================
107
108int EvokedSetModel::columnCount(const QModelIndex & /*parent*/) const
109{
110 return 3;
111}
112
113//=============================================================================================================
114
115QVariant EvokedSetModel::data(const QModelIndex &index, int role) const
116{
117 if(role != Qt::DisplayRole && role != Qt::BackgroundRole && role != EvokedSetModelRoles::GetAverageData) {
118 return QVariant();
119 }
120
121 if(index.isValid()) {
122 qint32 row = m_qMapIdxRowSelection[index.row()];
123
124 //******** first column (chname) ********
125 if(index.column() == 0 && role == Qt::DisplayRole) {
126 return QVariant(m_pEvokedSet->info.ch_names);
127 }
128
129 //******** second column (butterfly data plot) ********
130 //TODO: Bring this into a better structure see colum three
131 if(index.column()==1) {
132 QVariant v;
133
134 QList<DISPLIB::AvrTypeRowVector> lRowDataPerTrigType;
136
137 switch(role) {
138 case Qt::DisplayRole: {
139 //pack all adjacent (after reload) RowVectorPairs into a QList
140
141 if(m_bIsFreezed) {
142 // data freeze
143 for(int i = 0; i < m_matDataFreeze.size(); ++i) {
144 pairItem.first = m_lAvrTypes.at(i);
145 pairItem.second = m_matDataFreeze.at(i).row(row);
146 lRowDataPerTrigType.append(pairItem);
147 }
148 } else {
149 // data stream
150 for(int i = 0; i < m_matData.size(); ++i) {
151 pairItem.first = m_lAvrTypes.at(i);
152 pairItem.second = m_matData.at(i).row(row);
153 lRowDataPerTrigType.append(pairItem);
154 }
155 }
156
157 v.setValue(lRowDataPerTrigType);
158
159 return v;
160 break;
161 }
162 case Qt::BackgroundRole: {
163// if(m_fiffInfo.bads.contains(m_chInfolist[row].ch_name)) {
164// QBrush brush;
165// brush.setStyle(Qt::SolidPattern);
166// // qDebug() << m_chInfolist[row].ch_name << "is marked as bad, index:" << row;
167// brush.setColor(Qt::red);
168// return QVariant(brush);
169// }
170// else
171 return QVariant();
172
173 break;
174 }
175 } // end role switch
176 } // end column check
177
178 //******** third column (2D layout data plot, this third column is needed because the te data needs to be in another structure for the 2D layout to work) ********
179 if(index.column()==2) {
180 QVariant v;
181 QList<DISPLIB::AvrTypeRowVectorPair> lRowDataPerTrigType;
183
184 switch(role) {
186 if(m_bIsFreezed){
187 // data freeze
188 for(int i = 0; i < m_matDataFreeze.size(); ++i) {
189 averagedData.first = m_lAvrTypes.at(i);
190 averagedData.second.first = m_matDataFreeze.at(i).data();
191 averagedData.second.second = m_matDataFreeze.at(i).cols();
192
193 lRowDataPerTrigType.append(averagedData);
194 }
195 } else {
196 for(int i = 0; i < m_matData.size(); ++i) {
197 averagedData.first = m_lAvrTypes.at(i);
198 averagedData.second.first = m_matData.at(i).data();
199 averagedData.second.second = m_matData.at(i).cols();
200
201 lRowDataPerTrigType.append(averagedData);
202 }
203 }
204
205 v.setValue(lRowDataPerTrigType);
206 }
207 }
208
209 return v;
210 }//end column check
211
212 } // end index.valid() check
213
214 return QVariant();
215}
216
217//=============================================================================================================
218
219QVariant EvokedSetModel::headerData(int section, Qt::Orientation orientation, int role) const
220{
221 if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole) {
222 return QVariant();
223 }
224
225 if(orientation == Qt::Horizontal) {
226 switch(section) {
227 case 0: //chname column
228 return QVariant();
229 case 1: //data plot column
230 switch(role) {
231 case Qt::DisplayRole:
232 return QVariant("data plot");
233 case Qt::TextAlignmentRole:
234 return QVariant(Qt::AlignLeft);
235 }
236 return QVariant("data plot");
237 }
238 }
239 else if(orientation == Qt::Vertical) {
240 QModelIndex chname = createIndex(section,0);
241 switch(role) {
242 case Qt::DisplayRole:
243 return QVariant(data(chname).toString());
244 }
245 }
246
247 return QVariant();
248}
249
250//=============================================================================================================
251
252void EvokedSetModel::setEvokedSet(QSharedPointer<FiffEvokedSet> pEvokedSet)
253{
254 m_pEvokedSet = pEvokedSet;
255
256 if(!m_bIsInit) {
257 init();
258 }
259
260 updateData();
261}
262
263//=============================================================================================================
264
266{
267 if(!m_pEvokedSet) {
268 return;
269 }
270
271 beginResetModel();
272
273 //Generate bad channel index list
274 RowVectorXi sel;// = RowVectorXi(0,0);
275 QStringList emptyExclude;
276
277 if(m_pEvokedSet->info.bads.size() > 0) {
278 sel = FiffInfoBase::pick_channels(m_pEvokedSet->info.ch_names, m_pEvokedSet->info.bads, emptyExclude);
279 }
280
281 m_vecBadIdcs = sel;
282
283 m_fSps = m_pEvokedSet->info.sfreq;
284
285 m_matSparseProjMult = SparseMatrix<double>(m_pEvokedSet->info.chs.size(),m_pEvokedSet->info.chs.size());
286 m_matSparseCompMult = SparseMatrix<double>(m_pEvokedSet->info.chs.size(),m_pEvokedSet->info.chs.size());
287 m_matSparseProjCompMult = SparseMatrix<double>(m_pEvokedSet->info.chs.size(),m_pEvokedSet->info.chs.size());
288
289 m_matSparseProjMult.setIdentity();
290 m_matSparseCompMult.setIdentity();
291 m_matSparseProjCompMult.setIdentity();
292
293 m_qMapAverageActivation->clear();
294 m_qMapAverageColor->clear();
295 m_qMapAverageActivationOld->clear();
296 m_qMapAverageColorOld->clear();
297
298 //Create the initial SSP projector
299 updateProjection(m_pEvokedSet->info.projs);
300
301 //Create the initial Compensator projector
303
304 endResetModel();
305
307
308 m_bIsInit = true;
309}
310
311//=============================================================================================================
312
314{
315 if(!m_pEvokedSet) {
316 return;
317 }
318
319 m_matData.clear();
320 m_lAvrTypes.clear();
321
322 for(int i = 0; i < m_pEvokedSet->evoked.size(); ++i) {
323 bool doProj = m_bProjActivated && m_pEvokedSet->evoked.at(i).data.cols() > 0 && m_pEvokedSet->evoked.at(i).data.rows() == m_matProj.cols() ? true : false;
324
325 bool doComp = m_bCompActivated && m_pEvokedSet->evoked.at(i).data.cols() > 0 && m_pEvokedSet->evoked.at(i).data.rows() == m_matComp.cols() ? true : false;
326
327 if(doComp) {
328 if(doProj) {
329 //Comp + Proj
330 m_matData.append(m_matSparseProjCompMult * m_pEvokedSet->evoked.at(i).data);
331 } else {
332 //Comp
333 m_matData.append(m_matSparseCompMult * m_pEvokedSet->evoked.at(i).data);
334 }
335 } else {
336 if(doProj) {
337 //Proj
338 m_matData.append(m_matSparseProjMult * m_pEvokedSet->evoked.at(i).data);
339 } else {
340 //None - Raw
341 m_matData.append(m_pEvokedSet->evoked.at(i).data);
342 }
343 }
344
345 m_pairBaseline = m_pEvokedSet->evoked.at(i).baseline;
346
347 m_lAvrTypes.append(m_pEvokedSet->evoked.at(i).comment);
348 }
349
350 // Update average selection information map. Use old colors if existing.
351 QStringList slCurrentAvrComments;
352 int iSizeAvrActivation = m_qMapAverageActivation->size();
353 int iSizeAvrColor = m_qMapAverageColor->size();
354
355 for(int i = 0; i < m_pEvokedSet->evoked.size(); ++i) {
356 slCurrentAvrComments << m_pEvokedSet->evoked.at(i).comment;
357
358 if(!m_qMapAverageActivation->contains(m_pEvokedSet->evoked.at(i).comment)) {
359 if(m_qMapAverageActivationOld->contains(m_pEvokedSet->evoked.at(i).comment)) {
360 m_qMapAverageActivation->insert(m_pEvokedSet->evoked.at(i).comment, m_qMapAverageActivationOld->value(m_pEvokedSet->evoked.at(i).comment));
361 } else {
362 m_qMapAverageActivation->insert(m_pEvokedSet->evoked.at(i).comment, true);
363 }
364 }
365
366 if(!m_qMapAverageColor->contains(m_pEvokedSet->evoked.at(i).comment)) {
367 if(m_qMapAverageColorOld->contains(m_pEvokedSet->evoked.at(i).comment)) {
368 m_qMapAverageColor->insert(m_pEvokedSet->evoked.at(i).comment, m_qMapAverageColorOld->value(m_pEvokedSet->evoked.at(i).comment));
369 } else {
370 m_qMapAverageColor->insert(m_pEvokedSet->evoked.at(i).comment, Qt::yellow);
371 }
372 }
373 }
374
375 // Delete average color and activation if they are no longer present in the evoked set
376 QMutableMapIterator<QString, bool> itrActivation(*m_qMapAverageActivation);
377 while(itrActivation.hasNext()) {
378 itrActivation.next();
379 if(!slCurrentAvrComments.contains(itrActivation.key())) {
380 m_qMapAverageActivationOld->insert(itrActivation.key(),itrActivation.value());
381 itrActivation.remove();
382 }
383 }
384
385 QMutableMapIterator<QString, QColor> itrColor(*m_qMapAverageColor);
386 while(itrColor.hasNext()) {
387 itrColor.next();
388 if(!slCurrentAvrComments.contains(itrColor.key())) {
389 m_qMapAverageColorOld->insert(itrColor.key(),itrColor.value());
390 itrColor.remove();
391 }
392 }
393
394 // Only emit new colors and activations if evoked types were added or deleted
395 if(iSizeAvrColor != m_qMapAverageColor->size()) {
396 emit newAverageColorMap(m_qMapAverageColor);
397 }
398
399 if(iSizeAvrActivation != m_qMapAverageActivation->size()) {
400 emit newAverageActivationMap(m_qMapAverageActivation);
401 }
402
403 //Update data content
404 QModelIndex topLeft = this->index(0,1);
405 QModelIndex bottomRight = this->index(m_pEvokedSet->info.nchan-1,1);
406 QVector<int> roles; roles << Qt::DisplayRole;
407
408 emit dataChanged(topLeft, bottomRight, roles);
409}
410
411//=============================================================================================================
412
413QSharedPointer<QMap<QString, QColor> > EvokedSetModel::getAverageColor() const
414{
415 return m_qMapAverageColor;
416}
417
418//=============================================================================================================
419
420QSharedPointer<QMap<QString, bool> > EvokedSetModel::getAverageActivation() const
421{
422 return m_qMapAverageActivation;
423}
424
425//=============================================================================================================
426
427void EvokedSetModel::setAverageColor(const QSharedPointer<QMap<QString, QColor> > qMapAverageColor)
428{
429 m_qMapAverageColor = qMapAverageColor;
430}
431
432//=============================================================================================================
433
434void EvokedSetModel::setAverageActivation(const QSharedPointer<QMap<QString, bool> > qMapAverageActivation)
435{
436 m_qMapAverageActivation = qMapAverageActivation;
437}
438
439//=============================================================================================================
440
442{
443 if(row < m_qMapIdxRowSelection.size()) {
444 qint32 chRow = m_qMapIdxRowSelection[row];
445 return m_pEvokedSet->info.chs[chRow].kind;
446 }
447
448 return 0;
449}
450
451//=============================================================================================================
452
454{
455 bool bIsBad = false;
456
457 if(row < m_qMapIdxRowSelection.size()) {
458 qint32 chRow = m_qMapIdxRowSelection[row];
459 bIsBad = m_pEvokedSet->info.bads.contains(m_pEvokedSet->info.chs[chRow].ch_name);
460 }
461
462 return bIsBad;
463}
464
465//=============================================================================================================
466
468{
469 if(row < m_qMapIdxRowSelection.size()) {
470 qint32 chRow = m_qMapIdxRowSelection[row];
471 return m_pEvokedSet->info.chs[chRow].unit;
472 }
473
474 return FIFF_UNIT_NONE;
475}
476
477//=============================================================================================================
478
480{
481 if(row < m_qMapIdxRowSelection.size()) {
482 qint32 chRow = m_qMapIdxRowSelection[row];
483 return m_pEvokedSet->info.chs[chRow].chpos.coil_type;
484 }
485
486 return FIFFV_COIL_NONE;
487}
488
489//=============================================================================================================
490
492{
493 return m_bIsInit;
494}
495
496//=============================================================================================================
497
499{
500 qint32 iNumSamples = 0;
501
502 if(!m_matData.isEmpty()) {
503 iNumSamples = m_matData.first().cols();
504 }
505
506 return m_bIsInit ? iNumSamples : 0;
507}
508
509//=============================================================================================================
510
511QVariant EvokedSetModel::data(int row, int column, int role) const
512{
513 return data(index(row, column), role);
514}
515
516//=============================================================================================================
517
518const QMap<qint32,qint32>& EvokedSetModel::getIdxSelMap() const
519{
520 return m_qMapIdxRowSelection;
521}
522
523//=============================================================================================================
524
526{
527 qint32 iNumSamples = 0;
528
529 if(!m_matData.isEmpty()) {
530 iNumSamples = m_matData.first().cols();
531 }
532
533 return (qint32)(iNumSamples/m_fSps) - 1;
534}
535
536//=============================================================================================================
537
539{
540 int iPreSamples = 0;
541
542 if(!m_pEvokedSet) {
543 return iPreSamples;
544 }
545
546 if (!m_pEvokedSet->evoked.isEmpty()) {
547 RowVectorXf times = m_pEvokedSet->evoked.first().times;
548
549 // Search for stim onset via times
550 for(int i = 0; i < times.cols(); i++) {
551 if(times(i) == 0.0f) {
552 break;
553 }
554
555 iPreSamples++;
556 }
557 }
558
559 return iPreSamples;
560}
561
562//=============================================================================================================
563
565{
566 return m_fSps;
567}
568
569//=============================================================================================================
570
572{
573 return m_bIsFreezed;
574}
575
576//=============================================================================================================
577
579{
580 //std::cout<<floor((m_matData.cols()/m_fSps)*10)<<std::endl;
581 qint32 iNumSamples = 0;
582
583 if(!m_matData.isEmpty()) {
584 iNumSamples = m_matData.first().cols();
585 }
586
587 return floor((iNumSamples/m_fSps)*10);
588}
589
590//=============================================================================================================
591
592QPair<QVariant,QVariant> EvokedSetModel::getBaselineInfo() const
593{
594 //qDebug()<<floor((m_matData.cols()/m_fSps)*10);
595 return m_pairBaseline;
596}
597
598//=============================================================================================================
599
601{
602 return m_matData.size();
603}
604
605//=============================================================================================================
606
607void EvokedSetModel::selectRows(const QList<qint32> &selection)
608{
609 if(!m_pEvokedSet) {
610 return;
611 }
612
613 beginResetModel();
614
615 m_qMapIdxRowSelection.clear();
616
617 qint32 count = 0;
618 for(qint32 i = 0; i < selection.size(); ++i) {
619 if(selection[i] < m_pEvokedSet->info.nchan) {
620 m_qMapIdxRowSelection.insert(count,selection[i]);
621 ++count;
622 }
623 }
624
625 emit newSelection(selection);
626
627 endResetModel();
628}
629
630//=============================================================================================================
631
633{
634 if(!m_pEvokedSet) {
635 return;
636 }
637
638 beginResetModel();
639
640 m_qMapIdxRowSelection.clear();
641
642 for(qint32 i = 0; i < m_pEvokedSet->info.nchan; ++i) {
643 m_qMapIdxRowSelection.insert(i,i);
644 }
645
646 endResetModel();
647}
648
649//=============================================================================================================
650
651void EvokedSetModel::updateProjection(const QList<FiffProj>& projs)
652{
653 if(!m_pEvokedSet) {
654 return;
655 }
656
657 // Update the SSP projector
658 if(m_pEvokedSet->info.chs.size() > 0) {
659 m_pEvokedSet->info.projs = projs;
660 m_bProjActivated = false;
661 for(qint32 i = 0; i < projs.size(); ++i) {
662 if(m_pEvokedSet->info.projs[i].active) {
663 m_bProjActivated = true;
664 }
665 }
666
667 m_pEvokedSet->info.make_projector(m_matProj);
668 //qDebug() << "EvokedSetModel::updateProjection - New projection calculated. m_bProjActivated is "<<m_bProjActivated;
669
670 //set columns of matrix to zero depending on bad channels indexes
671 RowVectorXi sel;// = RowVectorXi(0,0);
672 QStringList emptyExclude;
673
674 if(m_pEvokedSet->info.bads.size() > 0) {
675 sel = FiffInfoBase::pick_channels(m_pEvokedSet->info.ch_names, m_pEvokedSet->info.bads, emptyExclude);
676 }
677
678 m_vecBadIdcs = sel;
679
680 for(qint32 j = 0; j < m_vecBadIdcs.cols(); ++j) {
681 m_matProj.col(m_vecBadIdcs[j]).setZero();
682 }
683
684// qDebug() << "Bads\n" << m_vecBadIdcs;
685// qDebug() << "Proj\n";
686// qDebug() << m_matProj.block(0,0,10,10);
687
688 qint32 nchan = m_pEvokedSet->info.nchan;
689 qint32 i, k;
690
691 typedef Eigen::Triplet<double> T;
692 std::vector<T> tripletList;
693 tripletList.reserve(nchan);
694
695 //
696 // Make proj sparse
697 //
698 tripletList.clear();
699 tripletList.reserve(m_matProj.rows()*m_matProj.cols());
700 for(i = 0; i < m_matProj.rows(); ++i) {
701 for(k = 0; k < m_matProj.cols(); ++k) {
702 if(m_matProj(i,k) != 0) {
703 tripletList.push_back(T(i, k, m_matProj(i,k)));
704 }
705 }
706 }
707
708 m_matSparseProjMult = SparseMatrix<double>(m_matProj.rows(),m_matProj.cols());
709 if(tripletList.size() > 0) {
710 m_matSparseProjMult.setFromTriplets(tripletList.begin(), tripletList.end());
711 }
712
713 //Create full multiplication matrix
714 m_matSparseProjCompMult = m_matSparseProjMult * m_matSparseCompMult;
715 }
716}
717
718//=============================================================================================================
719
721{
722 if(!m_pEvokedSet) {
723 return;
724 }
725
726 // Update the compensator
727 if(m_pEvokedSet->info.chs.size() > 0)
728 {
729 if(to == 0) {
730 m_bCompActivated = false;
731 } else {
732 m_bCompActivated = true;
733 }
734
735// qDebug()<<"to"<<to;
736// qDebug()<<"from"<<from;
737// qDebug()<<"m_bCompActivated"<<m_bCompActivated;
738
739 FiffCtfComp newComp;
740 m_pEvokedSet->info.make_compensator(0, to, newComp);//Do this always from 0 since we always read new raw data, we never actually perform a multiplication on already existing data
741
742 //We do not need to call this->m_pFiffInfo->set_current_comp(to);
743 //Because we will set the compensators to the coil in the same FiffInfo which is already used to write to file.
744 //Note that the data is written in raw form not in compensated form.
745 m_matComp = newComp.data->data;
746
747 //
748 // Make proj sparse
749 //
750 qint32 nchan = m_pEvokedSet->info.nchan;
751 qint32 i, k;
752
753 typedef Eigen::Triplet<double> T;
754 std::vector<T> tripletList;
755 tripletList.reserve(nchan);
756
757 tripletList.clear();
758 tripletList.reserve(m_matComp.rows()*m_matComp.cols());
759 for(i = 0; i < m_matComp.rows(); ++i) {
760 for(k = 0; k < m_matComp.cols(); ++k) {
761 if(m_matComp(i,k) != 0) {
762 tripletList.push_back(T(i, k, m_matComp(i,k)));
763 }
764 }
765 }
766
767 m_matSparseCompMult = SparseMatrix<double>(m_matComp.rows(),m_matComp.cols());
768 if(tripletList.size() > 0) {
769 m_matSparseCompMult.setFromTriplets(tripletList.begin(), tripletList.end());
770 }
771
772 //Create full multiplication matrix
773 m_matSparseProjCompMult = m_matSparseProjMult * m_matSparseCompMult;
774 }
775}
776
777//=============================================================================================================
778
780{
781 m_bIsFreezed = !m_bIsFreezed;
782
783 if(m_bIsFreezed) {
784 m_matDataFreeze = m_matData;
785 }
786
787 //Update data content
788 QModelIndex topLeft = this->index(0,1);
789 QModelIndex bottomRight = this->index(this->rowCount(),1);
790 QVector<int> roles; roles << Qt::DisplayRole;
791 emit dataChanged(topLeft, bottomRight, roles);
792}
793
794//=============================================================================================================
795
796QSharedPointer<FIFFLIB::FiffEvokedSet> EvokedSetModel::getEvokedSet()
797{
798 if (!m_pEvokedSet){
799 return Q_NULLPTR;
800 } else {
801 return m_pEvokedSet;
802 }
803}
Declaration of the EvokedSetModel Class.
FiffInfo class declaration.
#define FIFF_UNIT_NONE
#define FIFFV_COIL_NONE
FiffEvokedSet class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
qint32 fiff_int_t
Definition fiff_types.h:89
2-D display widgets and visualisation helpers (charts, topography, colour maps).
QPair< QString, DISPLIB::RowVectorPair > AvrTypeRowVectorPair
QPair< QString, Eigen::RowVectorXd > AvrTypeRowVector
FIFFLIB::fiff_int_t getUnit(qint32 row) const
QSharedPointer< QMap< QString, bool > > getAverageActivation() const
void setAverageActivation(const QSharedPointer< QMap< QString, bool > > qMapAverageActivation)
QVariant data(int row, int column, int role=Qt::DisplayRole) const
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
void newSelection(QList< qint32 > selection)
void newAverageActivationMap(const QSharedPointer< QMap< QString, bool > > qMapAverageActivation)
float getSamplingFrequency() const
void newAverageColorMap(const QSharedPointer< QMap< QString, QColor > > qMapAverageColor)
void selectRows(const QList< qint32 > &selection)
void updateProjection(const QList< FIFFLIB::FiffProj > &projs)
void setAverageColor(const QSharedPointer< QMap< QString, QColor > > qMapAverageColor)
const QMap< qint32, qint32 > & getIdxSelMap() const
qint32 getNumPreStimSamples() const
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
QPair< QVariant, QVariant > getBaselineInfo() const
QSharedPointer< QMap< QString, QColor > > getAverageColor() const
FIFFLIB::fiff_int_t getCoil(qint32 row) const
bool getIsChannelBad(qint32 row) const
void setEvokedSet(QSharedPointer< FIFFLIB::FiffEvokedSet > pEvokedSet)
QSharedPointer< FIFFLIB::FiffEvokedSet > getEvokedSet()
EvokedSetModel(QObject *parent=0)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
FIFFLIB::fiff_int_t getKind(qint32 row) const
CTF software compensation data.
FiffNamedMatrix::SDPtr data
static Eigen::RowVectorXi pick_channels(const QStringList &ch_names, const QStringList &include=defaultQStringList, const QStringList &exclude=defaultQStringList)