58#include <QCoreApplication>
59#include <QtConcurrent>
88: QAbstractTableModel(parent)
89, m_bProjActivated(false)
90, m_bCompActivated(false)
91, m_bSpharaActivated(false)
93, m_bDrawFilterFront(true)
94, m_bPerformFiltering(false)
95, m_bTriggerDetectionActive(false)
97, m_dTriggerThreshold(0.01)
102, m_iCurrentStartingSample(0)
103, m_iCurrentSampleFreeze(0)
104, m_iMaxFilterLength(128)
105, m_iCurrentBlockSize(1024)
107, m_iCurrentTriggerChIndex(0)
108, m_iDistanceTimerSpacer(1000)
109, m_iDetectedTriggers(0)
110, m_sFilterChannelType(
"MEG")
112, m_colBackground(Qt::white)
126 if(!m_pFiffInfo->chs.isEmpty()) {
127 return m_pFiffInfo->chs.size();
144 if(role != Qt::DisplayRole && role != Qt::BackgroundRole) {
148 if (role == Qt::BackgroundRole) {
149 return QVariant(QBrush(m_colBackground));
152 if (index.isValid()) {
153 qint32 row = m_qMapIdxRowSelection.value(index.row(),0);
156 if(index.column() == 0 && role == Qt::DisplayRole)
157 return QVariant(m_pFiffInfo->ch_names[row]);
160 if(index.column() == 1) {
165 case Qt::DisplayRole: {
168 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
169 rowVectorPair.first = m_matDataFilteredFreeze.data() + row*m_matDataFilteredFreeze.cols();
170 rowVectorPair.second = m_matDataFilteredFreeze.cols();
171 v.setValue(rowVectorPair);
173 rowVectorPair.first = m_matDataRawFreeze.data() + row*m_matDataRawFreeze.cols();
174 rowVectorPair.second = m_matDataRawFreeze.cols();
175 v.setValue(rowVectorPair);
180 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
181 rowVectorPair.first = m_matDataFiltered.data() + row*m_matDataFiltered.cols();
182 rowVectorPair.second = m_matDataFiltered.cols();
183 v.setValue(rowVectorPair);
185 rowVectorPair.first = m_matDataRaw.data() + row*m_matDataRaw.cols();
186 rowVectorPair.second = m_matDataRaw.cols();
187 v.setValue(rowVectorPair);
197 if(index.column() == 2 && role == Qt::DisplayRole) {
198 return QVariant(m_pFiffInfo->bads.contains(m_pFiffInfo->ch_names[row]));
210 if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole)
213 if(orientation == Qt::Horizontal) {
219 case Qt::DisplayRole:
220 return QVariant(
"data plot");
221 case Qt::TextAlignmentRole:
222 return QVariant(Qt::AlignLeft);
224 return QVariant(
"data plot");
227 else if(orientation == Qt::Vertical) {
228 QModelIndex chname = createIndex(section,0);
230 case Qt::DisplayRole:
231 return QVariant(
data(chname).toString());
240void RtFiffRawViewModel::initSphara()
243 IOUtils::read_eigen_matrix(m_matSpharaVVGradLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/Vectorview_SPHARA_InvEuclidean_Grad.txt"));
244 IOUtils::read_eigen_matrix(m_matSpharaVVMagLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/Vectorview_SPHARA_InvEuclidean_Mag.txt"));
246 IOUtils::read_eigen_matrix(m_matSpharaBabyMEGInnerLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/BabyMEG_SPHARA_InvEuclidean_Inner.txt"));
247 IOUtils::read_eigen_matrix(m_matSpharaBabyMEGOuterLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/BabyMEG_SPHARA_InvEuclidean_Outer.txt"));
249 IOUtils::read_eigen_matrix(m_matSpharaEEGLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/Current_SPHARA_EEG.txt"));
252 m_vecIndicesFirstVV.resize(0);
253 m_vecIndicesSecondVV.resize(0);
255 for(
int r = 0; r < m_pFiffInfo->chs.size(); ++r) {
257 if(m_pFiffInfo->chs.at(r).chpos.coil_type == 3012) {
258 m_vecIndicesFirstVV.conservativeResize(m_vecIndicesFirstVV.rows()+1);
259 m_vecIndicesFirstVV(m_vecIndicesFirstVV.rows()-1) = r;
263 if(m_pFiffInfo->chs.at(r).chpos.coil_type == 3024) {
264 m_vecIndicesSecondVV.conservativeResize(m_vecIndicesSecondVV.rows()+1);
265 m_vecIndicesSecondVV(m_vecIndicesSecondVV.rows()-1) = r;
270 m_vecIndicesFirstBabyMEG.resize(0);
271 for(
int r = 0; r < m_pFiffInfo->chs.size(); ++r) {
273 if(m_pFiffInfo->chs.at(r).chpos.coil_type == 7002) {
274 m_vecIndicesFirstBabyMEG.conservativeResize(m_vecIndicesFirstBabyMEG.rows()+1);
275 m_vecIndicesFirstBabyMEG(m_vecIndicesFirstBabyMEG.rows()-1) = r;
282 m_vecIndicesFirstEEG.resize(0);
283 for(
int r = 0; r < m_pFiffInfo->chs.size(); ++r) {
286 m_vecIndicesFirstEEG.conservativeResize(m_vecIndicesFirstEEG.rows()+1);
287 m_vecIndicesFirstEEG(m_vecIndicesFirstEEG.rows()-1) = r;
294 qDebug()<<
"RtFiffRawViewModel::initSphara - Read VectorView mag matrix "<<m_matSpharaVVMagLoaded.rows()<<m_matSpharaVVMagLoaded.cols()<<
"and grad matrix"<<m_matSpharaVVGradLoaded.rows()<<m_matSpharaVVGradLoaded.cols();
295 qDebug()<<
"RtFiffRawViewModel::initSphara - Read BabyMEG inner layer matrix "<<m_matSpharaBabyMEGInnerLoaded.rows()<<m_matSpharaBabyMEGInnerLoaded.cols()<<
"and outer layer matrix"<<m_matSpharaBabyMEGOuterLoaded.rows()<<m_matSpharaBabyMEGOuterLoaded.cols();
304 QStringList emptyExclude;
306 if(p_pFiffInfo->bads.size() > 0) {
312 m_pFiffInfo = p_pFiffInfo;
317 m_matDataRaw.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
318 m_matDataRaw.setZero();
320 m_matDataFiltered.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
321 m_matDataFiltered.setZero();
323 m_vecLastBlockFirstValuesFiltered.conservativeResize(m_pFiffInfo->chs.size());
324 m_vecLastBlockFirstValuesFiltered.setZero();
326 m_vecLastBlockFirstValuesRaw.conservativeResize(m_pFiffInfo->chs.size());
327 m_vecLastBlockFirstValuesRaw.setZero();
329 m_matOverlap.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxFilterLength);
331 m_matSparseProjMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
332 m_matSparseCompMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
333 m_matSparseSpharaMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
334 m_matSparseProjCompMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
336 m_matSparseProjMult.setIdentity();
337 m_matSparseCompMult.setIdentity();
338 m_matSparseSpharaMult.setIdentity();
339 m_matSparseProjCompMult.setIdentity();
345 int visibleInit = 20;
346 QStringList filterChannels;
348 if(visibleInit > m_pFiffInfo->chs.size()) {
349 while(visibleInit>m_pFiffInfo->chs.size()) {
354 for(qint32 b = 0; b < visibleInit; ++b) {
355 filterChannels.append(m_pFiffInfo->ch_names.at(b));
369 m_vecBadIdcs = RowVectorXi(0,0);
370 m_matProj = MatrixXd(0,0);
371 m_matComp = MatrixXd(0,0);
383 m_iMaxSamples = (qint32) ceil(sps * T);
386 m_matDataRaw.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
387 m_matDataFiltered.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
388 m_vecLastBlockFirstValuesRaw.conservativeResize(m_pFiffInfo->chs.size());
389 m_vecLastBlockFirstValuesFiltered.conservativeResize(m_pFiffInfo->chs.size());
392 m_matDataRaw.setZero();
393 m_matDataFiltered.setZero();
394 m_vecLastBlockFirstValuesRaw.setZero();
395 m_vecLastBlockFirstValuesFiltered.setZero();
398 if(m_iCurrentSample>m_iMaxSamples) {
399 m_iCurrentStartingSample += m_iCurrentSample;
400 m_iCurrentSample = 0;
410 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
411 return m_matDataFiltered.block(0, m_iCurrentSample-m_iCurrentBlockSize, m_matDataFiltered.rows(), m_iCurrentBlockSize);
414 return m_matDataRaw.block(0, m_iCurrentSample-m_iCurrentBlockSize, m_matDataRaw.rows(), m_iCurrentBlockSize);
422 bool doProj = m_bProjActivated && m_matDataRaw.cols() > 0 && m_matDataRaw.rows() == m_matProj.cols() ? true :
false;
425 bool doComp = m_bCompActivated && m_matDataRaw.cols() > 0 && m_matDataRaw.rows() == m_matComp.cols() ? true :
false;
428 bool doSphara = m_bSpharaActivated && m_matSparseSpharaMult.cols() > 0 && m_matDataRaw.rows() == m_matSparseSpharaMult.cols() ? true :
false;
431 for(qint32 b = 0; b <
data.size(); ++b) {
432 int nCol =
data.at(b).cols();
433 int nRow =
data.at(b).rows();
435 if(nRow != m_matDataRaw.rows()) {
436 qDebug()<<
"incoming data does not match internal data row size. Returning...";
441 if(m_iCurrentSample+nCol > m_matDataRaw.cols()) {
442 m_iResidual = nCol - ((m_iCurrentSample+nCol) % m_matDataRaw.cols());
444 if(m_iResidual == nCol) {
456 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) = m_matSparseProjCompMult *
data.at(b).block(0,0,nRow,m_iResidual);
459 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) = m_matSparseCompMult *
data.at(b).block(0,0,nRow,m_iResidual);
465 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) = m_matSparseProjMult *
data.at(b).block(0,0,nRow,m_iResidual);
468 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) =
data.at(b).block(0,0,nRow,m_iResidual);
472 m_iCurrentStartingSample += m_iCurrentSample;
473 m_iCurrentStartingSample += m_iResidual;
475 m_iCurrentSample = 0;
478 m_vecLastBlockFirstValuesFiltered = m_matDataFiltered.col(0);
479 m_vecLastBlockFirstValuesRaw = m_matDataRaw.col(0);
483 m_qMapDetectedTriggerOld = m_qMapDetectedTrigger;
486 if(m_bTriggerDetectionActive) {
487 QMutableMapIterator<int,QList<QPair<int,double> > > i(m_qMapDetectedTrigger);
488 while (i.hasNext()) {
502 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseProjCompMult *
data.at(b);
505 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseCompMult *
data.at(b);
510 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseProjMult *
data.at(b);
513 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) =
data.at(b);
518 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
519 filterDataBlock(m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol), m_iCurrentSample);
523 if(m_iCurrentSample-m_iMaxFilterLength/2 >= 0) {
524 m_matDataFiltered.block(0, m_iCurrentSample-m_iMaxFilterLength/2, nRow, nCol) = m_matSparseSpharaMult * m_matDataFiltered.block(0, m_iCurrentSample-m_iMaxFilterLength/2, nRow, nCol);
527 if(m_iCurrentSample-m_iMaxFilterLength/2 < 0) {
528 m_matDataFiltered.block(0, 0, nRow, nCol) = m_matSparseSpharaMult * m_matDataFiltered.block(0, 0, nRow, nCol);
529 int iResidual = m_iResidual+m_iMaxFilterLength/2;
530 m_matDataFiltered.block(0, m_matDataFiltered.cols()-iResidual, nRow, iResidual) = m_matSparseSpharaMult * m_matDataFiltered.block(0, m_matDataFiltered.cols()-iResidual, nRow, iResidual);
535 m_matDataFiltered.block(0, m_iCurrentSample, nRow, nCol).setZero();
539 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseSpharaMult * m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol);
543 m_iCurrentSample += nCol;
544 m_iCurrentBlockSize = nCol;
547 if(m_bTriggerDetectionActive) {
548 int iOldDetectedTriggers = m_qMapDetectedTrigger[m_iCurrentTriggerChIndex].size();
554 m_qMapDetectedTrigger[m_iCurrentTriggerChIndex].append(qMapDetectedTrigger);
557 int newTriggers = m_qMapDetectedTrigger[m_iCurrentTriggerChIndex].size() - iOldDetectedTriggers;
560 m_iDetectedTriggers += newTriggers;
567 QModelIndex topLeft = this->index(0,1);
568 QModelIndex bottomRight = this->index(m_pFiffInfo->ch_names.size()-1,1);
569 QVector<int> roles; roles << Qt::DisplayRole;
571 emit dataChanged(topLeft, bottomRight, roles);
578 if(row < m_qMapIdxRowSelection.size()) {
579 qint32 chRow = m_qMapIdxRowSelection[row];
580 return m_pFiffInfo->chs.at(chRow).kind;
590 if(row < m_qMapIdxRowSelection.size()) {
591 qint32 chRow = m_qMapIdxRowSelection[row];
592 return m_pFiffInfo->chs.at(chRow).unit;
602 if(row < m_qMapIdxRowSelection.size()) {
603 qint32 chRow = m_qMapIdxRowSelection[row];
604 return m_pFiffInfo->chs.at(chRow).chpos.coil_type;
616 m_qMapIdxRowSelection.clear();
619 for(qint32 i = 0; i < selection.size(); ++i) {
620 if(selection[i] < m_pFiffInfo->chs.size()) {
621 m_qMapIdxRowSelection.insert(count,selection[i]);
637 for(qint32 i = 0; i < selection.size(); ++i) {
638 if(m_qMapIdxRowSelection.contains(selection.at(i))) {
639 m_qMapIdxRowSelection.remove(selection.at(i));
654 m_qMapIdxRowSelection.clear();
656 for(qint32 i = 0; i < m_pFiffInfo->chs.size(); ++i) {
657 m_qMapIdxRowSelection.insert(i,i);
667 m_bIsFreezed = !m_bIsFreezed;
670 m_matDataRawFreeze = m_matDataRaw;
671 m_matDataFilteredFreeze = m_matDataFiltered;
672 m_qMapDetectedTriggerFreeze = m_qMapDetectedTrigger;
673 m_qMapDetectedTriggerOldFreeze = m_qMapDetectedTriggerOld;
675 m_iCurrentSampleFreeze = m_iCurrentSample;
679 QModelIndex topLeft = this->index(0,1);
680 QModelIndex bottomRight = this->index(m_pFiffInfo->chs.size()-1,1);
681 QVector<int> roles; roles << Qt::DisplayRole;
683 emit dataChanged(topLeft, bottomRight, roles);
691 m_qMapChScaling = p_qMapChScaling;
702 m_bProjActivated =
false;
703 m_pFiffInfo->projs = projs;
705 for(qint32 i = 0; i < this->m_pFiffInfo->projs.size(); ++i) {
706 if(this->m_pFiffInfo->projs[i].active) {
707 m_bProjActivated =
true;
712 this->m_pFiffInfo->make_projector(m_matProj);
714 qDebug() <<
"RtFiffRawViewModel::updateProjection - New projection calculated.";
717 for(qint32 j = 0; j < m_vecBadIdcs.cols(); ++j) {
718 m_matProj.col(m_vecBadIdcs[j]).setZero();
728 qint32 nchan = this->m_pFiffInfo->nchan;
731 typedef Eigen::Triplet<double> T;
732 std::vector<T> tripletList;
733 tripletList.reserve(nchan);
736 tripletList.reserve(m_matProj.rows()*m_matProj.cols());
737 for(i = 0; i < m_matProj.rows(); ++i) {
738 for(k = 0; k < m_matProj.cols(); ++k) {
739 if(m_matProj(i,k) != 0) {
740 tripletList.push_back(T(i, k, m_matProj(i,k)));
745 m_matSparseProjMult = SparseMatrix<double>(m_matProj.rows(),m_matProj.cols());
746 if(tripletList.size() > 0) {
747 m_matSparseProjMult.setFromTriplets(tripletList.begin(), tripletList.end());
751 m_matSparseProjCompMult = m_matSparseProjMult * m_matSparseCompMult;
762 m_bCompActivated =
false;
764 m_bCompActivated =
true;
772 this->m_pFiffInfo->make_compensator(0, to, newComp);
777 m_matComp = newComp.
data->data;
782 qint32 nchan = this->m_pFiffInfo->nchan;
785 typedef Eigen::Triplet<double> T;
786 std::vector<T> tripletList;
787 tripletList.reserve(nchan);
790 tripletList.reserve(m_matComp.rows()*m_matComp.cols());
791 for(i = 0; i < m_matComp.rows(); ++i) {
792 for(k = 0; k < m_matComp.cols(); ++k) {
793 if(m_matComp(i,k) != 0) {
794 tripletList.push_back(T(i, k, m_matComp(i,k)));
799 m_matSparseCompMult = SparseMatrix<double>(m_matComp.rows(),m_matComp.cols());
800 if(tripletList.size() > 0) {
801 m_matSparseCompMult.setFromTriplets(tripletList.begin(), tripletList.end());
805 m_matSparseProjCompMult = m_matSparseProjMult * m_matSparseCompMult;
813 m_bSpharaActivated = state;
821 qDebug()<<
"RtFiffRawViewModel::updateSpharaOptions - Creating SPHARA operator for"<<sSytemType;
823 MatrixXd matSpharaMultFirst = MatrixXd::Identity(m_pFiffInfo->chs.size(), m_pFiffInfo->chs.size());
824 MatrixXd matSpharaMultSecond = MatrixXd::Identity(m_pFiffInfo->chs.size(), m_pFiffInfo->chs.size());
826 if(sSytemType ==
"VectorView" && m_matSpharaVVGradLoaded.size() != 0 && m_matSpharaVVMagLoaded.size() != 0) {
831 if(sSytemType ==
"BabyMEG" && m_matSpharaBabyMEGInnerLoaded.size() != 0) {
832 matSpharaMultFirst =
UTILSLIB::makeSpharaProjector(m_matSpharaBabyMEGInnerLoaded, m_vecIndicesFirstBabyMEG, m_pFiffInfo->nchan, nBaseFctsFirst, 0);
835 if(sSytemType ==
"EEG" && m_matSpharaEEGLoaded.size() != 0) {
847 qint32 nchan = this->m_pFiffInfo->nchan;
850 typedef Eigen::Triplet<double> T;
851 std::vector<T> tripletList;
852 tripletList.reserve(nchan);
856 tripletList.reserve(matSpharaMultFirst.rows()*matSpharaMultFirst.cols());
857 for(i = 0; i < matSpharaMultFirst.rows(); ++i) {
858 for(k = 0; k < matSpharaMultFirst.cols(); ++k) {
859 if(matSpharaMultFirst(i,k) != 0) {
860 tripletList.push_back(T(i, k, matSpharaMultFirst(i,k)));
865 Eigen::SparseMatrix<double> matSparseSpharaMultFirst = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
867 matSparseSpharaMultFirst = SparseMatrix<double>(matSpharaMultFirst.rows(),matSpharaMultFirst.cols());
868 if(tripletList.size() > 0) {
869 matSparseSpharaMultFirst.setFromTriplets(tripletList.begin(), tripletList.end());
874 tripletList.reserve(matSpharaMultSecond.rows()*matSpharaMultSecond.cols());
876 for(i = 0; i < matSpharaMultSecond.rows(); ++i) {
877 for(k = 0; k < matSpharaMultSecond.cols(); ++k) {
878 if(matSpharaMultSecond(i,k) != 0) {
879 tripletList.push_back(T(i, k, matSpharaMultSecond(i,k)));
884 Eigen::SparseMatrix<double>matSparseSpharaMultSecond = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
886 if(tripletList.size() > 0) {
887 matSparseSpharaMultSecond.setFromTriplets(tripletList.begin(), tripletList.end());
891 m_matSparseSpharaMult = matSparseSpharaMultFirst * matSparseSpharaMultSecond;
901 m_iMaxFilterLength = 1;
903 if(m_iMaxFilterLength<
filterData.at(i).getFilterOrder()) {
904 m_iMaxFilterLength =
filterData.at(i).getFilterOrder();
908 m_matOverlap.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxFilterLength);
909 m_matOverlap.setZero();
911 m_bDrawFilterFront =
false;
921 m_bPerformFiltering = state;
928 m_colBackground = color;
935 m_sFilterChannelType = channelType;
936 m_filterChannelList = m_visibleChannelList;
940 m_filterChannelList.clear();
942 for(
int i = 0; i<m_pFiffInfo->chs.size(); ++i) {
946 if(m_sFilterChannelType ==
"All") {
947 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
948 }
else if(m_pFiffInfo->chs.at(i).ch_name.contains(m_sFilterChannelType)) {
949 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
974 m_filterChannelList.clear();
975 m_visibleChannelList = channelNames;
990 for(
int i = 0; i < m_pFiffInfo->chs.size(); ++i) {
994 if(m_sFilterChannelType ==
"All") {
995 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
996 }
else if(m_pFiffInfo->chs.at(i).ch_name.contains(m_sFilterChannelType)) {
997 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
1015 QList<FiffChInfo> chInfolist = m_pFiffInfo->chs;
1018 if(!m_pFiffInfo->bads.contains(chInfolist[ch.row()].ch_name))
1019 m_pFiffInfo->bads.append(chInfolist[ch.row()].ch_name);
1020 qDebug() <<
"RawModel:" << chInfolist[ch.row()].ch_name <<
"marked as bad.";
1021 }
else if(m_pFiffInfo->bads.contains(chInfolist[ch.row()].ch_name)) {
1022 int index = m_pFiffInfo->bads.indexOf(chInfolist[ch.row()].ch_name);
1023 m_pFiffInfo->bads.removeAt(index);
1024 qDebug() <<
"RawModel:" << chInfolist[ch.row()].ch_name <<
"marked as good.";
1028 QStringList channelNames;
1032 QStringList emptyExclude;
1035 emit dataChanged(ch,ch);
1042 m_qMapTriggerColor = colorMap;
1043 m_bTriggerDetectionActive = active;
1044 m_dTriggerThreshold = threshold;
1047 if(m_sCurrentTriggerCh != triggerCh) {
1048 m_sCurrentTriggerCh = triggerCh;
1050 QList<QPair<int,double> > temp;
1051 m_qMapDetectedTrigger.clear();
1053 for(
int i = 0; i < m_pFiffInfo->chs.size(); ++i) {
1054 if(m_pFiffInfo->chs[i].ch_name == m_sCurrentTriggerCh) {
1055 m_iCurrentTriggerChIndex = i;
1056 m_qMapDetectedTrigger.insert(i, temp);
1062 m_sCurrentTriggerCh = triggerCh;
1070 m_iDistanceTimerSpacer = 1000;
1072 m_iDistanceTimerSpacer = value;
1080 m_iDetectedTriggers = 0;
1087 QList<FiffChInfo> chInfolist = m_pFiffInfo->chs;
1089 for(
int i = 0; i < chlist.size(); ++i) {
1091 if(!m_pFiffInfo->bads.contains(chInfolist[chlist[i].row()].ch_name))
1092 m_pFiffInfo->bads.append(chInfolist[chlist[i].row()].ch_name);
1094 if(m_pFiffInfo->bads.contains(chInfolist[chlist[i].row()].ch_name)) {
1095 int index = m_pFiffInfo->bads.indexOf(chInfolist[chlist[i].row()].ch_name);
1096 m_pFiffInfo->bads.removeAt(index);
1100 emit dataChanged(chlist[i],chlist[i]);
1104 QStringList emptyExclude;
1110void RtFiffRawViewModel::doFilterPerChannelRTMSA(QPair<QList<FilterKernel>,QPair<int,RowVectorXd> > &channelDataTime)
1112 for(
int i = 0; i < channelDataTime.first.size(); ++i) {
1114 channelDataTime.first[i].applyFftFilter(channelDataTime.second.second,
true);
1120void RtFiffRawViewModel::filterDataBlock()
1124 if(m_filterKernel.isEmpty() || !m_bPerformFiltering) {
1129 QList<FilterKernel> tempFilterList;
1131 int fftLength = m_matDataRaw.row(0).cols() + 4 * m_iMaxFilterLength;
1133 fftLength = pow(2, exp) < 512 ? 512 : pow(2, exp);
1135 for(
int i = 0; i<m_filterKernel.size(); ++i) {
1136 FilterKernel tempFilter(m_filterKernel.at(i).getName(),
1138 m_filterKernel.at(i).getFilterOrder(),
1139 m_filterKernel.at(i).getCenterFrequency(),
1140 m_filterKernel.at(i).getBandwidth(),
1141 m_filterKernel.at(i).getParksWidth(),
1142 m_filterKernel.at(i).getSamplingFrequency(),
1145 tempFilterList.append(tempFilter);
1149 QList<QPair<QList<FilterKernel>,QPair<int,RowVectorXd> > > timeData;
1150 QList<int> notFilterChannelIndex;
1153 for(qint32 i=0; i<m_matDataRaw.rows(); ++i) {
1154 if(m_filterChannelList.contains(m_pFiffInfo->chs.at(i).ch_name)) {
1155 RowVectorXd datTemp(m_matDataRaw.row(i).cols() + 2 * m_iMaxFilterLength);
1156 datTemp << m_matDataRaw.row(i).head(m_iMaxFilterLength).reverse(), m_matDataRaw.row(i), m_matDataRaw.row(i).tail(m_iMaxFilterLength).reverse();
1157 timeData.append(QPair<QList<FilterKernel>,QPair<int,RowVectorXd> >(tempFilterList,QPair<int,RowVectorXd>(i,datTemp)));
1159 notFilterChannelIndex.append(i);
1164 if(!timeData.isEmpty()) {
1165 QFuture<void> future = QtConcurrent::map(timeData,
1166 doFilterPerChannelRTMSA);
1168 future.waitForFinished();
1170 for(
int r = 0; r < timeData.size(); ++r) {
1171 m_matDataFiltered.row(timeData.at(r).second.first) = timeData.at(r).second.second.segment(m_iMaxFilterLength+m_iMaxFilterLength/2, m_matDataRaw.cols());
1172 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1177 for(
int i = 0; i < notFilterChannelIndex.size(); ++i) {
1178 m_matDataFiltered.row(notFilterChannelIndex.at(i)) = m_matDataRaw.row(notFilterChannelIndex.at(i));
1182 m_vecLastBlockFirstValuesFiltered = m_matDataFiltered.col(0);
1190void RtFiffRawViewModel::filterDataBlock(
const MatrixXd &data,
int iDataIndex)
1194 if(iDataIndex >= m_matDataFiltered.cols() ||
data.cols() < m_iMaxFilterLength) {
1199 QList<QPair<QList<FilterKernel>,QPair<int,RowVectorXd> > > timeData;
1200 QList<int> notFilterChannelIndex;
1202 for(qint32 i = 0; i <
data.rows(); ++i) {
1203 if(m_filterChannelList.contains(m_pFiffInfo->chs.at(i).ch_name)) {
1204 timeData.append(QPair<QList<FilterKernel>,QPair<int,RowVectorXd> >(m_filterKernel,QPair<int,RowVectorXd>(i,
data.row(i))));
1206 notFilterChannelIndex.append(i);
1211 if(!timeData.isEmpty()) {
1212 QFuture<void> future = QtConcurrent::map(timeData,
1213 doFilterPerChannelRTMSA);
1215 future.waitForFinished();
1218 int iFilterDelay = m_iMaxFilterLength/2;
1219 int iFilteredNumberCols = timeData.at(0).second.second.cols();
1221 for(
int r = 0; r<timeData.size(); ++r) {
1222 if(iDataIndex+2*
data.cols() > m_matDataRaw.cols()) {
1226 if(m_bDrawFilterFront) {
1228 RowVectorXd tempData = timeData.at(r).second.second;
1231 tempData.head(m_iMaxFilterLength) += m_matOverlap.row(timeData.at(r).second.first);
1234 int start = iDataIndex-iFilterDelay < 0 ? 0 : iDataIndex-iFilterDelay;
1235 m_matDataFiltered.row(timeData.at(r).second.first).segment(start,iFilteredNumberCols-m_iMaxFilterLength) = tempData.head(iFilteredNumberCols-m_iMaxFilterLength);
1238 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex-iFilterDelay,m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,m_iMaxFilterLength);
1239 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex+iFilterDelay,iFilteredNumberCols-2*m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,iFilteredNumberCols-2*m_iMaxFilterLength);
1243 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1244 }
else if(iDataIndex == 0) {
1248 if(m_bDrawFilterFront) {
1250 RowVectorXd tempData = timeData.at(r).second.second;
1253 m_matDataFiltered.row(timeData.at(r).second.first).segment(m_matDataFiltered.cols()-iFilterDelay-m_iResidual, iFilterDelay) = tempData.head(iFilterDelay) + m_matOverlap.row(timeData.at(r).second.first).head(iFilterDelay);
1256 tempData.head(m_iMaxFilterLength) += m_matOverlap.row(timeData.at(r).second.first);
1257 m_matDataFiltered.row(timeData.at(r).second.first).head(iFilteredNumberCols-m_iMaxFilterLength-iFilterDelay) = tempData.segment(iFilterDelay,iFilteredNumberCols-m_iMaxFilterLength-iFilterDelay);
1260 m_matDataFiltered.row(timeData.at(r).second.first).tail(m_iResidual) = m_matDataFiltered.row(timeData.at(r).second.first).head(m_iResidual);
1263 m_matDataFiltered.row(timeData.at(r).second.first).head(m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,m_iMaxFilterLength);
1264 m_matDataFiltered.row(timeData.at(r).second.first).segment(iFilterDelay,iFilteredNumberCols-2*m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,iFilteredNumberCols-2*m_iMaxFilterLength);
1268 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1273 if(m_bDrawFilterFront) {
1275 RowVectorXd tempData = timeData.at(r).second.second;
1278 tempData.head(m_iMaxFilterLength) += m_matOverlap.row(timeData.at(r).second.first);
1281 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex-iFilterDelay,iFilteredNumberCols-m_iMaxFilterLength) = tempData.head(iFilteredNumberCols-m_iMaxFilterLength);
1284 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex-iFilterDelay,m_iMaxFilterLength).setZero();
1285 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex+iFilterDelay,iFilteredNumberCols-2*m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,iFilteredNumberCols-2*m_iMaxFilterLength);
1289 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1294 m_bDrawFilterFront =
true;
1297 for(
int i = 0; i < notFilterChannelIndex.size(); ++i) {
1298 m_matDataFiltered.row(notFilterChannelIndex.at(i)).segment(iDataIndex,
data.row(notFilterChannelIndex.at(i)).cols()) =
data.row(notFilterChannelIndex.at(i));
1306void RtFiffRawViewModel::clearModel()
1310 m_matDataRaw.setZero();
1311 m_matDataFiltered.setZero();
1312 m_matDataRawFreeze.setZero();
1313 m_matDataFilteredFreeze.setZero();
1314 m_vecLastBlockFirstValuesFiltered.setZero();
1315 m_vecLastBlockFirstValuesRaw.setZero();
1316 m_matOverlap.setZero();
1389 m_fnAddEvent(iSample);
1397 if (m_fnGetEventSamples) {
1398 return m_fnGetEventSamples(iBegin, iEnd);
1406 std::function<std::vector<int>(
int,
int)> getFn)
1408 m_fnAddEvent = std::move(addFn);
1409 m_fnGetEventSamples = std::move(getFn);
Declaration of the RtFiffRawViewModel Class.
FiffInfo class declaration.
Old fiff_type declarations - replace them.
Declaration of SPHARA projector construction.
IOUtils class declaration.
Numerics class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
2-D display widgets and visualisation helpers (charts, topography, colour maps).
QPair< const double *, qint32 > RowVectorPair
DSPSHARED_EXPORT QMap< int, QList< QPair< int, double > > > detectTriggerFlanksMax(const Eigen::MatrixXd &data, const QList< int > &lTriggerChannels, int iOffsetIndex, double dThreshold, bool bRemoveOffset, int iBurstLengthSamp=100)
DSPSHARED_EXPORT Eigen::MatrixXd filterData(const Eigen::MatrixXd &matData, int type, double dCenterfreq, double dBandwidth, double dTransition, double dSFreq, int iOrder=1024, int designMethod=UTILSLIB::FilterKernel::m_designMethods.indexOf(UTILSLIB::FilterParameter("Cosine")), const Eigen::RowVectorXi &vecPicks=Eigen::RowVectorXi(), bool bUseThreads=true, bool bKeepOverhead=false)
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
DSPSHARED_EXPORT Eigen::MatrixXd makeSpharaProjector(const Eigen::MatrixXd &matBaseFct, const Eigen::VectorXi &vecIndices, int iOperatorDim, int iNBaseFct, int iSkip=0)
void updateSpharaActivation(bool state)
void addEvent(int iSample)
const QMap< qint32, float > & getScaling() const
void setBackgroundColor(const QColor &color)
void distanceTimeSpacerChanged(int value)
void setFilter(QList< UTILSLIB::FilterKernel > filterData)
void selectRows(const QList< qint32 > &selection)
void newSelection(const QList< qint32 > &selection)
FIFFLIB::fiff_int_t getKind(qint32 row) const
QSharedPointer< RtFiffRawViewModel > SPtr
void setSamplingInfo(float sps, int T, bool bSetZero=false)
void markChBad(QModelIndex ch, bool status)
RtFiffRawViewModel(QObject *parent=0)
void createFilterChannelList(QStringList channelNames)
void setFilterChannelType(const QString &channelType)
Eigen::MatrixXd getLastBlock()
void setFiffInfo(QSharedPointer< FIFFLIB::FiffInfo > &p_pFiffInfo)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void toggleFreeze(const QModelIndex &index)
void hideRows(const QList< qint32 > &selection)
void setEventCallbacks(std::function< void(int)> addFn, std::function< std::vector< int >(int, int)> getFn)
void updateSpharaOptions(const QString &sSytemType, int nBaseFctsFirst, int nBaseFctsSecond)
void setScaling(const QMap< qint32, float > &p_qMapChScaling)
void setFilterActive(bool state)
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
FIFFLIB::fiff_int_t getCoil(qint32 row) const
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
void updateCompensator(int to)
void triggerDetected(int numberDetectedTriggers, const QMap< int, QList< QPair< int, double > > > &mapDetectedTriggers)
FIFFLIB::fiff_int_t getUnit(qint32 row) const
std::vector< int > getEventsToDisplay(int iBegin, int iEnd) const
void triggerInfoChanged(const QMap< double, QColor > &colorMap, bool active, QString triggerCh, double threshold)
void resetTriggerCounter()
void updateProjection(const QList< FIFFLIB::FiffProj > &projs)
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
void addData(const QList< Eigen::MatrixXd > &data)
double getMaxValueFromRawViewModel(int row) const
static QVector< FilterParameter > m_designMethods
static QVector< FilterParameter > m_filterTypes
CTF software compensation data.
FiffNamedMatrix::SDPtr data
FIFF measurement file information.
static Eigen::RowVectorXi pick_channels(const QStringList &ch_names, const QStringList &include=defaultQStringList, const QStringList &exclude=defaultQStringList)
static double log2(const T d)
static bool read_eigen_matrix(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &out, const QString &path)