58#include <QCoreApplication>
59#include <QtConcurrent>
90: QAbstractTableModel(parent)
91, m_bProjActivated(false)
92, m_bCompActivated(false)
93, m_bSpharaActivated(false)
95, m_bDrawFilterFront(true)
96, m_bPerformFiltering(false)
97, m_bTriggerDetectionActive(false)
99, m_dTriggerThreshold(0.01)
104, m_iCurrentStartingSample(0)
105, m_iCurrentSampleFreeze(0)
106, m_iMaxFilterLength(128)
107, m_iCurrentBlockSize(1024)
109, m_iCurrentTriggerChIndex(0)
110, m_iDistanceTimerSpacer(1000)
111, m_iDetectedTriggers(0)
112, m_sFilterChannelType(
"MEG")
114, m_colBackground(Qt::white)
123 m_EventManager.stopSharedMemory();
130 if(!m_pFiffInfo->chs.isEmpty()) {
131 return m_pFiffInfo->chs.size();
148 if(role != Qt::DisplayRole && role != Qt::BackgroundRole) {
152 if (role == Qt::BackgroundRole) {
153 return QVariant(QBrush(m_colBackground));
156 if (index.isValid()) {
157 qint32 row = m_qMapIdxRowSelection.value(index.row(),0);
160 if(index.column() == 0 && role == Qt::DisplayRole)
161 return QVariant(m_pFiffInfo->ch_names[row]);
164 if(index.column() == 1) {
169 case Qt::DisplayRole: {
172 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
173 rowVectorPair.first = m_matDataFilteredFreeze.data() + row*m_matDataFilteredFreeze.cols();
174 rowVectorPair.second = m_matDataFilteredFreeze.cols();
175 v.setValue(rowVectorPair);
177 rowVectorPair.first = m_matDataRawFreeze.data() + row*m_matDataRawFreeze.cols();
178 rowVectorPair.second = m_matDataRawFreeze.cols();
179 v.setValue(rowVectorPair);
184 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
185 rowVectorPair.first = m_matDataFiltered.data() + row*m_matDataFiltered.cols();
186 rowVectorPair.second = m_matDataFiltered.cols();
187 v.setValue(rowVectorPair);
189 rowVectorPair.first = m_matDataRaw.data() + row*m_matDataRaw.cols();
190 rowVectorPair.second = m_matDataRaw.cols();
191 v.setValue(rowVectorPair);
201 if(index.column() == 2 && role == Qt::DisplayRole) {
202 return QVariant(m_pFiffInfo->bads.contains(m_pFiffInfo->ch_names[row]));
214 if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole)
217 if(orientation == Qt::Horizontal) {
223 case Qt::DisplayRole:
224 return QVariant(
"data plot");
225 case Qt::TextAlignmentRole:
226 return QVariant(Qt::AlignLeft);
228 return QVariant(
"data plot");
231 else if(orientation == Qt::Vertical) {
232 QModelIndex chname = createIndex(section,0);
234 case Qt::DisplayRole:
235 return QVariant(
data(chname).toString());
244void RtFiffRawViewModel::initSphara()
247 IOUtils::read_eigen_matrix(m_matSpharaVVGradLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/Vectorview_SPHARA_InvEuclidean_Grad.txt"));
248 IOUtils::read_eigen_matrix(m_matSpharaVVMagLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/Vectorview_SPHARA_InvEuclidean_Mag.txt"));
250 IOUtils::read_eigen_matrix(m_matSpharaBabyMEGInnerLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/BabyMEG_SPHARA_InvEuclidean_Inner.txt"));
251 IOUtils::read_eigen_matrix(m_matSpharaBabyMEGOuterLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/BabyMEG_SPHARA_InvEuclidean_Outer.txt"));
253 IOUtils::read_eigen_matrix(m_matSpharaEEGLoaded, QCoreApplication::applicationDirPath() + QString(
"/../resources/mne_scan/plugins/noisereduction/SPHARA/Current_SPHARA_EEG.txt"));
256 m_vecIndicesFirstVV.resize(0);
257 m_vecIndicesSecondVV.resize(0);
259 for(
int r = 0; r < m_pFiffInfo->chs.size(); ++r) {
261 if(m_pFiffInfo->chs.at(r).chpos.coil_type == 3012) {
262 m_vecIndicesFirstVV.conservativeResize(m_vecIndicesFirstVV.rows()+1);
263 m_vecIndicesFirstVV(m_vecIndicesFirstVV.rows()-1) = r;
267 if(m_pFiffInfo->chs.at(r).chpos.coil_type == 3024) {
268 m_vecIndicesSecondVV.conservativeResize(m_vecIndicesSecondVV.rows()+1);
269 m_vecIndicesSecondVV(m_vecIndicesSecondVV.rows()-1) = r;
274 m_vecIndicesFirstBabyMEG.resize(0);
275 for(
int r = 0; r < m_pFiffInfo->chs.size(); ++r) {
277 if(m_pFiffInfo->chs.at(r).chpos.coil_type == 7002) {
278 m_vecIndicesFirstBabyMEG.conservativeResize(m_vecIndicesFirstBabyMEG.rows()+1);
279 m_vecIndicesFirstBabyMEG(m_vecIndicesFirstBabyMEG.rows()-1) = r;
286 m_vecIndicesFirstEEG.resize(0);
287 for(
int r = 0; r < m_pFiffInfo->chs.size(); ++r) {
290 m_vecIndicesFirstEEG.conservativeResize(m_vecIndicesFirstEEG.rows()+1);
291 m_vecIndicesFirstEEG(m_vecIndicesFirstEEG.rows()-1) = r;
298 qDebug()<<
"RtFiffRawViewModel::initSphara - Read VectorView mag matrix "<<m_matSpharaVVMagLoaded.rows()<<m_matSpharaVVMagLoaded.cols()<<
"and grad matrix"<<m_matSpharaVVGradLoaded.rows()<<m_matSpharaVVGradLoaded.cols();
299 qDebug()<<
"RtFiffRawViewModel::initSphara - Read BabyMEG inner layer matrix "<<m_matSpharaBabyMEGInnerLoaded.rows()<<m_matSpharaBabyMEGInnerLoaded.cols()<<
"and outer layer matrix"<<m_matSpharaBabyMEGOuterLoaded.rows()<<m_matSpharaBabyMEGOuterLoaded.cols();
308 QStringList emptyExclude;
310 if(p_pFiffInfo->bads.size() > 0) {
316 m_pFiffInfo = p_pFiffInfo;
321 m_matDataRaw.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
322 m_matDataRaw.setZero();
324 m_matDataFiltered.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
325 m_matDataFiltered.setZero();
327 m_vecLastBlockFirstValuesFiltered.conservativeResize(m_pFiffInfo->chs.size());
328 m_vecLastBlockFirstValuesFiltered.setZero();
330 m_vecLastBlockFirstValuesRaw.conservativeResize(m_pFiffInfo->chs.size());
331 m_vecLastBlockFirstValuesRaw.setZero();
333 m_matOverlap.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxFilterLength);
335 m_matSparseProjMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
336 m_matSparseCompMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
337 m_matSparseSpharaMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
338 m_matSparseProjCompMult = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
340 m_matSparseProjMult.setIdentity();
341 m_matSparseCompMult.setIdentity();
342 m_matSparseSpharaMult.setIdentity();
343 m_matSparseProjCompMult.setIdentity();
349 int visibleInit = 20;
350 QStringList filterChannels;
352 if(visibleInit > m_pFiffInfo->chs.size()) {
353 while(visibleInit>m_pFiffInfo->chs.size()) {
358 for(qint32 b = 0; b < visibleInit; ++b) {
359 filterChannels.append(m_pFiffInfo->ch_names.at(b));
373 m_vecBadIdcs = RowVectorXi(0,0);
374 m_matProj = MatrixXd(0,0);
375 m_matComp = MatrixXd(0,0);
387 m_iMaxSamples = (qint32) ceil(sps * T);
390 m_matDataRaw.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
391 m_matDataFiltered.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxSamples);
392 m_vecLastBlockFirstValuesRaw.conservativeResize(m_pFiffInfo->chs.size());
393 m_vecLastBlockFirstValuesFiltered.conservativeResize(m_pFiffInfo->chs.size());
396 m_matDataRaw.setZero();
397 m_matDataFiltered.setZero();
398 m_vecLastBlockFirstValuesRaw.setZero();
399 m_vecLastBlockFirstValuesFiltered.setZero();
402 if(m_iCurrentSample>m_iMaxSamples) {
403 m_iCurrentStartingSample += m_iCurrentSample;
404 m_iCurrentSample = 0;
414 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
415 return m_matDataFiltered.block(0, m_iCurrentSample-m_iCurrentBlockSize, m_matDataFiltered.rows(), m_iCurrentBlockSize);
418 return m_matDataRaw.block(0, m_iCurrentSample-m_iCurrentBlockSize, m_matDataRaw.rows(), m_iCurrentBlockSize);
426 bool doProj = m_bProjActivated && m_matDataRaw.cols() > 0 && m_matDataRaw.rows() == m_matProj.cols() ? true :
false;
429 bool doComp = m_bCompActivated && m_matDataRaw.cols() > 0 && m_matDataRaw.rows() == m_matComp.cols() ? true :
false;
432 bool doSphara = m_bSpharaActivated && m_matSparseSpharaMult.cols() > 0 && m_matDataRaw.rows() == m_matSparseSpharaMult.cols() ? true :
false;
435 for(qint32 b = 0; b <
data.size(); ++b) {
436 int nCol =
data.at(b).cols();
437 int nRow =
data.at(b).rows();
439 if(nRow != m_matDataRaw.rows()) {
440 qDebug()<<
"incoming data does not match internal data row size. Returning...";
445 if(m_iCurrentSample+nCol > m_matDataRaw.cols()) {
446 m_iResidual = nCol - ((m_iCurrentSample+nCol) % m_matDataRaw.cols());
448 if(m_iResidual == nCol) {
460 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) = m_matSparseProjCompMult *
data.at(b).block(0,0,nRow,m_iResidual);
463 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) = m_matSparseCompMult *
data.at(b).block(0,0,nRow,m_iResidual);
469 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) = m_matSparseProjMult *
data.at(b).block(0,0,nRow,m_iResidual);
472 m_matDataRaw.block(0, m_iCurrentSample, nRow, m_iResidual) =
data.at(b).block(0,0,nRow,m_iResidual);
476 m_iCurrentStartingSample += m_iCurrentSample;
477 m_iCurrentStartingSample += m_iResidual;
479 m_iCurrentSample = 0;
482 m_vecLastBlockFirstValuesFiltered = m_matDataFiltered.col(0);
483 m_vecLastBlockFirstValuesRaw = m_matDataRaw.col(0);
487 m_qMapDetectedTriggerOld = m_qMapDetectedTrigger;
490 if(m_bTriggerDetectionActive) {
491 QMutableMapIterator<int,QList<QPair<int,double> > > i(m_qMapDetectedTrigger);
492 while (i.hasNext()) {
506 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseProjCompMult *
data.at(b);
509 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseCompMult *
data.at(b);
514 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseProjMult *
data.at(b);
517 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) =
data.at(b);
522 if(!m_filterKernel.isEmpty() && m_bPerformFiltering) {
523 filterDataBlock(m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol), m_iCurrentSample);
527 if(m_iCurrentSample-m_iMaxFilterLength/2 >= 0) {
528 m_matDataFiltered.block(0, m_iCurrentSample-m_iMaxFilterLength/2, nRow, nCol) = m_matSparseSpharaMult * m_matDataFiltered.block(0, m_iCurrentSample-m_iMaxFilterLength/2, nRow, nCol);
531 if(m_iCurrentSample-m_iMaxFilterLength/2 < 0) {
532 m_matDataFiltered.block(0, 0, nRow, nCol) = m_matSparseSpharaMult * m_matDataFiltered.block(0, 0, nRow, nCol);
533 int iResidual = m_iResidual+m_iMaxFilterLength/2;
534 m_matDataFiltered.block(0, m_matDataFiltered.cols()-iResidual, nRow, iResidual) = m_matSparseSpharaMult * m_matDataFiltered.block(0, m_matDataFiltered.cols()-iResidual, nRow, iResidual);
539 m_matDataFiltered.block(0, m_iCurrentSample, nRow, nCol).setZero();
543 m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol) = m_matSparseSpharaMult * m_matDataRaw.block(0, m_iCurrentSample, nRow, nCol);
547 m_iCurrentSample += nCol;
548 m_iCurrentBlockSize = nCol;
551 if(m_bTriggerDetectionActive) {
552 int iOldDetectedTriggers = m_qMapDetectedTrigger[m_iCurrentTriggerChIndex].size();
558 m_qMapDetectedTrigger[m_iCurrentTriggerChIndex].append(qMapDetectedTrigger);
561 int newTriggers = m_qMapDetectedTrigger[m_iCurrentTriggerChIndex].size() - iOldDetectedTriggers;
564 m_iDetectedTriggers += newTriggers;
571 QModelIndex topLeft = this->index(0,1);
572 QModelIndex bottomRight = this->index(m_pFiffInfo->ch_names.size()-1,1);
573 QVector<int> roles; roles << Qt::DisplayRole;
575 emit dataChanged(topLeft, bottomRight, roles);
582 if(row < m_qMapIdxRowSelection.size()) {
583 qint32 chRow = m_qMapIdxRowSelection[row];
584 return m_pFiffInfo->chs.at(chRow).kind;
594 if(row < m_qMapIdxRowSelection.size()) {
595 qint32 chRow = m_qMapIdxRowSelection[row];
596 return m_pFiffInfo->chs.at(chRow).unit;
606 if(row < m_qMapIdxRowSelection.size()) {
607 qint32 chRow = m_qMapIdxRowSelection[row];
608 return m_pFiffInfo->chs.at(chRow).chpos.coil_type;
620 m_qMapIdxRowSelection.clear();
623 for(qint32 i = 0; i < selection.size(); ++i) {
624 if(selection[i] < m_pFiffInfo->chs.size()) {
625 m_qMapIdxRowSelection.insert(count,selection[i]);
641 for(qint32 i = 0; i < selection.size(); ++i) {
642 if(m_qMapIdxRowSelection.contains(selection.at(i))) {
643 m_qMapIdxRowSelection.remove(selection.at(i));
658 m_qMapIdxRowSelection.clear();
660 for(qint32 i = 0; i < m_pFiffInfo->chs.size(); ++i) {
661 m_qMapIdxRowSelection.insert(i,i);
671 m_bIsFreezed = !m_bIsFreezed;
674 m_matDataRawFreeze = m_matDataRaw;
675 m_matDataFilteredFreeze = m_matDataFiltered;
676 m_qMapDetectedTriggerFreeze = m_qMapDetectedTrigger;
677 m_qMapDetectedTriggerOldFreeze = m_qMapDetectedTriggerOld;
679 m_iCurrentSampleFreeze = m_iCurrentSample;
683 QModelIndex topLeft = this->index(0,1);
684 QModelIndex bottomRight = this->index(m_pFiffInfo->chs.size()-1,1);
685 QVector<int> roles; roles << Qt::DisplayRole;
687 emit dataChanged(topLeft, bottomRight, roles);
695 m_qMapChScaling = p_qMapChScaling;
706 m_bProjActivated =
false;
707 m_pFiffInfo->projs = projs;
709 for(qint32 i = 0; i < this->m_pFiffInfo->projs.size(); ++i) {
710 if(this->m_pFiffInfo->projs[i].active) {
711 m_bProjActivated =
true;
716 this->m_pFiffInfo->make_projector(m_matProj);
718 qDebug() <<
"RtFiffRawViewModel::updateProjection - New projection calculated.";
721 for(qint32 j = 0; j < m_vecBadIdcs.cols(); ++j) {
722 m_matProj.col(m_vecBadIdcs[j]).setZero();
732 qint32 nchan = this->m_pFiffInfo->nchan;
735 typedef Eigen::Triplet<double> T;
736 std::vector<T> tripletList;
737 tripletList.reserve(nchan);
740 tripletList.reserve(m_matProj.rows()*m_matProj.cols());
741 for(i = 0; i < m_matProj.rows(); ++i) {
742 for(k = 0; k < m_matProj.cols(); ++k) {
743 if(m_matProj(i,k) != 0) {
744 tripletList.push_back(T(i, k, m_matProj(i,k)));
749 m_matSparseProjMult = SparseMatrix<double>(m_matProj.rows(),m_matProj.cols());
750 if(tripletList.size() > 0) {
751 m_matSparseProjMult.setFromTriplets(tripletList.begin(), tripletList.end());
755 m_matSparseProjCompMult = m_matSparseProjMult * m_matSparseCompMult;
766 m_bCompActivated =
false;
768 m_bCompActivated =
true;
776 this->m_pFiffInfo->make_compensator(0, to, newComp);
781 m_matComp = newComp.
data->data;
786 qint32 nchan = this->m_pFiffInfo->nchan;
789 typedef Eigen::Triplet<double> T;
790 std::vector<T> tripletList;
791 tripletList.reserve(nchan);
794 tripletList.reserve(m_matComp.rows()*m_matComp.cols());
795 for(i = 0; i < m_matComp.rows(); ++i) {
796 for(k = 0; k < m_matComp.cols(); ++k) {
797 if(m_matComp(i,k) != 0) {
798 tripletList.push_back(T(i, k, m_matComp(i,k)));
803 m_matSparseCompMult = SparseMatrix<double>(m_matComp.rows(),m_matComp.cols());
804 if(tripletList.size() > 0) {
805 m_matSparseCompMult.setFromTriplets(tripletList.begin(), tripletList.end());
809 m_matSparseProjCompMult = m_matSparseProjMult * m_matSparseCompMult;
817 m_bSpharaActivated = state;
825 qDebug()<<
"RtFiffRawViewModel::updateSpharaOptions - Creating SPHARA operator for"<<sSytemType;
827 MatrixXd matSpharaMultFirst = MatrixXd::Identity(m_pFiffInfo->chs.size(), m_pFiffInfo->chs.size());
828 MatrixXd matSpharaMultSecond = MatrixXd::Identity(m_pFiffInfo->chs.size(), m_pFiffInfo->chs.size());
830 if(sSytemType ==
"VectorView" && m_matSpharaVVGradLoaded.size() != 0 && m_matSpharaVVMagLoaded.size() != 0) {
835 if(sSytemType ==
"BabyMEG" && m_matSpharaBabyMEGInnerLoaded.size() != 0) {
839 if(sSytemType ==
"EEG" && m_matSpharaEEGLoaded.size() != 0) {
851 qint32 nchan = this->m_pFiffInfo->nchan;
854 typedef Eigen::Triplet<double> T;
855 std::vector<T> tripletList;
856 tripletList.reserve(nchan);
860 tripletList.reserve(matSpharaMultFirst.rows()*matSpharaMultFirst.cols());
861 for(i = 0; i < matSpharaMultFirst.rows(); ++i) {
862 for(k = 0; k < matSpharaMultFirst.cols(); ++k) {
863 if(matSpharaMultFirst(i,k) != 0) {
864 tripletList.push_back(T(i, k, matSpharaMultFirst(i,k)));
869 Eigen::SparseMatrix<double> matSparseSpharaMultFirst = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
871 matSparseSpharaMultFirst = SparseMatrix<double>(matSpharaMultFirst.rows(),matSpharaMultFirst.cols());
872 if(tripletList.size() > 0) {
873 matSparseSpharaMultFirst.setFromTriplets(tripletList.begin(), tripletList.end());
878 tripletList.reserve(matSpharaMultSecond.rows()*matSpharaMultSecond.cols());
880 for(i = 0; i < matSpharaMultSecond.rows(); ++i) {
881 for(k = 0; k < matSpharaMultSecond.cols(); ++k) {
882 if(matSpharaMultSecond(i,k) != 0) {
883 tripletList.push_back(T(i, k, matSpharaMultSecond(i,k)));
888 Eigen::SparseMatrix<double>matSparseSpharaMultSecond = SparseMatrix<double>(m_pFiffInfo->chs.size(),m_pFiffInfo->chs.size());
890 if(tripletList.size() > 0) {
891 matSparseSpharaMultSecond.setFromTriplets(tripletList.begin(), tripletList.end());
895 m_matSparseSpharaMult = matSparseSpharaMultFirst * matSparseSpharaMultSecond;
905 m_iMaxFilterLength = 1;
907 if(m_iMaxFilterLength<
filterData.at(i).getFilterOrder()) {
908 m_iMaxFilterLength =
filterData.at(i).getFilterOrder();
912 m_matOverlap.conservativeResize(m_pFiffInfo->chs.size(), m_iMaxFilterLength);
913 m_matOverlap.setZero();
915 m_bDrawFilterFront =
false;
925 m_bPerformFiltering = state;
932 m_colBackground = color;
939 m_sFilterChannelType = channelType;
940 m_filterChannelList = m_visibleChannelList;
944 m_filterChannelList.clear();
946 for(
int i = 0; i<m_pFiffInfo->chs.size(); ++i) {
950 if(m_sFilterChannelType ==
"All") {
951 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
952 }
else if(m_pFiffInfo->chs.at(i).ch_name.contains(m_sFilterChannelType)) {
953 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
978 m_filterChannelList.clear();
979 m_visibleChannelList = channelNames;
994 for(
int i = 0; i < m_pFiffInfo->chs.size(); ++i) {
998 if(m_sFilterChannelType ==
"All") {
999 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
1000 }
else if(m_pFiffInfo->chs.at(i).ch_name.contains(m_sFilterChannelType)) {
1001 m_filterChannelList << m_pFiffInfo->chs.at(i).ch_name;
1019 QList<FiffChInfo> chInfolist = m_pFiffInfo->chs;
1022 if(!m_pFiffInfo->bads.contains(chInfolist[ch.row()].ch_name))
1023 m_pFiffInfo->bads.append(chInfolist[ch.row()].ch_name);
1024 qDebug() <<
"RawModel:" << chInfolist[ch.row()].ch_name <<
"marked as bad.";
1025 }
else if(m_pFiffInfo->bads.contains(chInfolist[ch.row()].ch_name)) {
1026 int index = m_pFiffInfo->bads.indexOf(chInfolist[ch.row()].ch_name);
1027 m_pFiffInfo->bads.removeAt(index);
1028 qDebug() <<
"RawModel:" << chInfolist[ch.row()].ch_name <<
"marked as good.";
1032 QStringList channelNames;
1036 QStringList emptyExclude;
1039 emit dataChanged(ch,ch);
1046 m_qMapTriggerColor = colorMap;
1047 m_bTriggerDetectionActive = active;
1048 m_dTriggerThreshold = threshold;
1051 if(m_sCurrentTriggerCh != triggerCh) {
1052 m_sCurrentTriggerCh = triggerCh;
1054 QList<QPair<int,double> > temp;
1055 m_qMapDetectedTrigger.clear();
1057 for(
int i = 0; i < m_pFiffInfo->chs.size(); ++i) {
1058 if(m_pFiffInfo->chs[i].ch_name == m_sCurrentTriggerCh) {
1059 m_iCurrentTriggerChIndex = i;
1060 m_qMapDetectedTrigger.insert(i, temp);
1066 m_sCurrentTriggerCh = triggerCh;
1074 m_iDistanceTimerSpacer = 1000;
1076 m_iDistanceTimerSpacer = value;
1084 m_iDetectedTriggers = 0;
1091 QList<FiffChInfo> chInfolist = m_pFiffInfo->chs;
1093 for(
int i = 0; i < chlist.size(); ++i) {
1095 if(!m_pFiffInfo->bads.contains(chInfolist[chlist[i].row()].ch_name))
1096 m_pFiffInfo->bads.append(chInfolist[chlist[i].row()].ch_name);
1098 if(m_pFiffInfo->bads.contains(chInfolist[chlist[i].row()].ch_name)) {
1099 int index = m_pFiffInfo->bads.indexOf(chInfolist[chlist[i].row()].ch_name);
1100 m_pFiffInfo->bads.removeAt(index);
1104 emit dataChanged(chlist[i],chlist[i]);
1108 QStringList emptyExclude;
1114void RtFiffRawViewModel::doFilterPerChannelRTMSA(QPair<QList<FilterKernel>,QPair<int,RowVectorXd> > &channelDataTime)
1116 for(
int i = 0; i < channelDataTime.first.size(); ++i) {
1118 channelDataTime.first[i].applyFftFilter(channelDataTime.second.second,
true);
1124void RtFiffRawViewModel::filterDataBlock()
1128 if(m_filterKernel.isEmpty() || !m_bPerformFiltering) {
1133 QList<FilterKernel> tempFilterList;
1135 int fftLength = m_matDataRaw.row(0).cols() + 4 * m_iMaxFilterLength;
1137 fftLength = pow(2, exp) < 512 ? 512 : pow(2, exp);
1139 for(
int i = 0; i<m_filterKernel.size(); ++i) {
1140 FilterKernel tempFilter(m_filterKernel.at(i).getName(),
1142 m_filterKernel.at(i).getFilterOrder(),
1143 m_filterKernel.at(i).getCenterFrequency(),
1144 m_filterKernel.at(i).getBandwidth(),
1145 m_filterKernel.at(i).getParksWidth(),
1146 m_filterKernel.at(i).getSamplingFrequency(),
1149 tempFilterList.append(tempFilter);
1153 QList<QPair<QList<FilterKernel>,QPair<int,RowVectorXd> > > timeData;
1154 QList<int> notFilterChannelIndex;
1157 for(qint32 i=0; i<m_matDataRaw.rows(); ++i) {
1158 if(m_filterChannelList.contains(m_pFiffInfo->chs.at(i).ch_name)) {
1159 RowVectorXd datTemp(m_matDataRaw.row(i).cols() + 2 * m_iMaxFilterLength);
1160 datTemp << m_matDataRaw.row(i).head(m_iMaxFilterLength).reverse(), m_matDataRaw.row(i), m_matDataRaw.row(i).tail(m_iMaxFilterLength).reverse();
1161 timeData.append(QPair<QList<FilterKernel>,QPair<int,RowVectorXd> >(tempFilterList,QPair<int,RowVectorXd>(i,datTemp)));
1163 notFilterChannelIndex.append(i);
1168 if(!timeData.isEmpty()) {
1169 QFuture<void> future = QtConcurrent::map(timeData,
1170 doFilterPerChannelRTMSA);
1172 future.waitForFinished();
1174 for(
int r = 0; r < timeData.size(); ++r) {
1175 m_matDataFiltered.row(timeData.at(r).second.first) = timeData.at(r).second.second.segment(m_iMaxFilterLength+m_iMaxFilterLength/2, m_matDataRaw.cols());
1176 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1181 for(
int i = 0; i < notFilterChannelIndex.size(); ++i) {
1182 m_matDataFiltered.row(notFilterChannelIndex.at(i)) = m_matDataRaw.row(notFilterChannelIndex.at(i));
1186 m_vecLastBlockFirstValuesFiltered = m_matDataFiltered.col(0);
1194void RtFiffRawViewModel::filterDataBlock(
const MatrixXd &data,
int iDataIndex)
1198 if(iDataIndex >= m_matDataFiltered.cols() ||
data.cols() < m_iMaxFilterLength) {
1203 QList<QPair<QList<FilterKernel>,QPair<int,RowVectorXd> > > timeData;
1204 QList<int> notFilterChannelIndex;
1206 for(qint32 i = 0; i <
data.rows(); ++i) {
1207 if(m_filterChannelList.contains(m_pFiffInfo->chs.at(i).ch_name)) {
1208 timeData.append(QPair<QList<FilterKernel>,QPair<int,RowVectorXd> >(m_filterKernel,QPair<int,RowVectorXd>(i,
data.row(i))));
1210 notFilterChannelIndex.append(i);
1215 if(!timeData.isEmpty()) {
1216 QFuture<void> future = QtConcurrent::map(timeData,
1217 doFilterPerChannelRTMSA);
1219 future.waitForFinished();
1222 int iFilterDelay = m_iMaxFilterLength/2;
1223 int iFilteredNumberCols = timeData.at(0).second.second.cols();
1225 for(
int r = 0; r<timeData.size(); ++r) {
1226 if(iDataIndex+2*
data.cols() > m_matDataRaw.cols()) {
1230 if(m_bDrawFilterFront) {
1232 RowVectorXd tempData = timeData.at(r).second.second;
1235 tempData.head(m_iMaxFilterLength) += m_matOverlap.row(timeData.at(r).second.first);
1238 int start = iDataIndex-iFilterDelay < 0 ? 0 : iDataIndex-iFilterDelay;
1239 m_matDataFiltered.row(timeData.at(r).second.first).segment(start,iFilteredNumberCols-m_iMaxFilterLength) = tempData.head(iFilteredNumberCols-m_iMaxFilterLength);
1242 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex-iFilterDelay,m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,m_iMaxFilterLength);
1243 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);
1247 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1248 }
else if(iDataIndex == 0) {
1252 if(m_bDrawFilterFront) {
1254 RowVectorXd tempData = timeData.at(r).second.second;
1257 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);
1260 tempData.head(m_iMaxFilterLength) += m_matOverlap.row(timeData.at(r).second.first);
1261 m_matDataFiltered.row(timeData.at(r).second.first).head(iFilteredNumberCols-m_iMaxFilterLength-iFilterDelay) = tempData.segment(iFilterDelay,iFilteredNumberCols-m_iMaxFilterLength-iFilterDelay);
1264 m_matDataFiltered.row(timeData.at(r).second.first).tail(m_iResidual) = m_matDataFiltered.row(timeData.at(r).second.first).head(m_iResidual);
1267 m_matDataFiltered.row(timeData.at(r).second.first).head(m_iMaxFilterLength) = timeData.at(r).second.second.segment(m_iMaxFilterLength,m_iMaxFilterLength);
1268 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);
1272 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1277 if(m_bDrawFilterFront) {
1279 RowVectorXd tempData = timeData.at(r).second.second;
1282 tempData.head(m_iMaxFilterLength) += m_matOverlap.row(timeData.at(r).second.first);
1285 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex-iFilterDelay,iFilteredNumberCols-m_iMaxFilterLength) = tempData.head(iFilteredNumberCols-m_iMaxFilterLength);
1288 m_matDataFiltered.row(timeData.at(r).second.first).segment(iDataIndex-iFilterDelay,m_iMaxFilterLength).setZero();
1289 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);
1293 m_matOverlap.row(timeData.at(r).second.first) = timeData.at(r).second.second.tail(m_iMaxFilterLength);
1298 m_bDrawFilterFront =
true;
1301 for(
int i = 0; i < notFilterChannelIndex.size(); ++i) {
1302 m_matDataFiltered.row(notFilterChannelIndex.at(i)).segment(iDataIndex,
data.row(notFilterChannelIndex.at(i)).cols()) =
data.row(notFilterChannelIndex.at(i));
1310void RtFiffRawViewModel::clearModel()
1314 m_matDataRaw.setZero();
1315 m_matDataFiltered.setZero();
1316 m_matDataRawFreeze.setZero();
1317 m_matDataFilteredFreeze.setZero();
1318 m_vecLastBlockFirstValuesFiltered.setZero();
1319 m_vecLastBlockFirstValuesRaw.setZero();
1320 m_matOverlap.setZero();
1392 m_EventManager.addEvent(iSample);
1399 return m_EventManager.getEventsBetween(iBegin, iEnd);
Declaration of the Sphara class.
DetectTrigger declarations.
Declaration of the RtFiffRawViewModel Class.
FiffInfo class declaration.
Old fiff_type declarations - replace them.
IOUtils class declaration.
MNEMath 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
Real-time signal processing (filtering, averaging, HPI fitting, noise reduction).
Eigen::MatrixXd filterData(const Eigen::MatrixXd &matData, int type, double dCenterfreq, double dBandwidth, double dTransition, double dSFreq, int iOrder=1024, int designMethod=FilterKernel::m_designMethods.indexOf(FilterParameter("Cosine")), const Eigen::RowVectorXi &vecPicks=Eigen::RowVectorXi(), bool bUseThreads=true, bool bKeepOverhead=false)
QMap< int, QList< QPair< int, double > > > detectTriggerFlanksMax(const Eigen::MatrixXd &data, const QList< int > &lTriggerChannels, int iOffsetIndex, double dThreshold, bool bRemoveOffset, int iBurstLengthSamp=100)
Eigen::MatrixXd makeSpharaProjector(const Eigen::MatrixXd &matBaseFct, const Eigen::VectorXi &vecIndices, int iOperatorDim, int iNBaseFct, int iSkip=0)
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
void updateSpharaActivation(bool state)
void addEvent(int iSample)
const QMap< qint32, float > & getScaling() const
void setBackgroundColor(const QColor &color)
void distanceTimeSpacerChanged(int value)
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)
std::unique_ptr< std::vector< EVENTSLIB::Event > > getEventsToDisplay(int iBegin, int iEnd) const
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 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
void triggerInfoChanged(const QMap< double, QColor > &colorMap, bool active, QString triggerCh, double threshold)
void resetTriggerCounter()
void setFilter(QList< RTPROCESSINGLIB::FilterKernel > filterData)
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
Central registry that creates, stores, queries, and groups Event objects across one or more data file...
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 QVector< FilterParameter > m_designMethods
static QVector< FilterParameter > m_filterTypes
static bool read_eigen_matrix(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &out, const QString &path)
static double log2(const T d)