59 : QAbstractTableModel(parent)
60 , m_bProjActivated(false)
75 if(!m_qMapIdxRowSelection.empty())
76 return m_qMapIdxRowSelection.size();
94 if(role != Qt::DisplayRole && role != Qt::BackgroundRole)
97 if (index.isValid()) {
98 qint32 row = m_qMapIdxRowSelection[index.row()];
101 if(index.column() == 0 && role == Qt::DisplayRole)
102 return QVariant(m_qListChInfo[row].getChannelName());
105 if(index.column()==1) {
109 case Qt::DisplayRole: {
111 QList< QVector<float> > qListVector;
117 for(qint32 i = 0; i < m_dataCurrentFreeze.size(); ++i)
118 data.append(m_dataCurrentFreeze[i](row));
119 qListVector.append(data);
122 QVector<float> lastData;
123 for(qint32 i=0; i < m_dataLastFreeze.size(); ++i)
124 lastData.append(m_dataLastFreeze[i](row));
125 qListVector.append(lastData);
127 v.setValue(qListVector);
133 for(qint32 i = 0; i < m_dataCurrent.size(); ++i)
134 data.append(m_dataCurrent[i](row));
135 qListVector.append(data);
138 QVector<float> lastData;
139 for(qint32 i=0; i < m_dataLast.size(); ++i)
140 lastData.append(m_dataLast[i](row));
141 qListVector.append(lastData);
143 v.setValue(qListVector);
148 case Qt::BackgroundRole: {
174 if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole)
177 if(orientation == Qt::Horizontal) {
182 return QVariant(
"data plot");
184 case Qt::DisplayRole:
185 return QVariant(
"data plot");
186 case Qt::TextAlignmentRole:
187 return QVariant(Qt::AlignLeft);
191 else if(orientation == Qt::Vertical) {
192 QModelIndex chname = createIndex(section,0);
194 case Qt::DisplayRole:
195 return QVariant(
data(chname).toString());
208 m_qListChInfo = chInfo;
222 QStringList emptyExclude;
224 if(p_pFiffInfo->bads.size() > 0)
229 this->m_pFiffInfo = p_pFiffInfo;
238 m_vecBadIdcs = RowVectorXi(0,0);
239 m_matProj = MatrixXd(0,0);
251 m_iDownsampling = (qint32)ceil(sps/dest_sps);
257 float maxSamples = sps * T;
258 m_iMaxSamples = (qint32)ceil(maxSamples/(sps/dest_sps));
270 for(qint32 b = 0; b < data.size(); ++b)
275 for(i = m_iCurrentSample; i < data[b].cols(); i += m_iDownsampling)
278 MatrixXd dsData(data[b].rows(),count);
281 for(i = m_iCurrentSample; i < data[b].cols(); i += m_iDownsampling)
283 dsData.col(count) = data[b].col(i);
292 m_iCurrentSample = i - data[b].cols();
298 if(m_bProjActivated && dsData.cols() > 0 && dsData.rows() == m_matProj.cols())
305 for(qint32 j = 0; j < m_vecBadIdcs.cols(); ++j)
306 dsData.row(m_vecBadIdcs[j]).setZero();
309 MatrixXd projDsData = m_matSparseProj * dsData;
310 for(i = 0; i < projDsData.cols(); ++i)
311 m_dataCurrent.append(projDsData.col(i));
316 for(i = 0; i < dsData.cols(); ++i)
317 m_dataCurrent.append(dsData.col(i));
339 if(m_dataCurrent.size() > m_iMaxSamples)
341 m_dataLast = m_dataCurrent.mid(0,m_iMaxSamples);
342 m_dataCurrent.remove(0, m_iMaxSamples);
346 QModelIndex topLeft = this->index(0,1);
347 QModelIndex bottomRight = this->index(m_qListChInfo.size()-1,1);
348 QVector<int> roles; roles << Qt::DisplayRole;
349 emit dataChanged(topLeft, bottomRight, roles);
357 if(row < m_qMapIdxRowSelection.size())
359 qint32 chRow = m_qMapIdxRowSelection[row];
360 return m_qListChInfo[chRow].getKind();;
372 if(row < m_qMapIdxRowSelection.size())
374 qint32 chRow = m_qMapIdxRowSelection[row];
375 return m_qListChInfo[chRow].getUnit();;
378 return FIFF_UNIT_NONE;
386 if(row < m_qMapIdxRowSelection.size())
388 qint32 chRow = m_qMapIdxRowSelection[row];
389 return m_qListChInfo[chRow].getCoil();;
402 m_qMapIdxRowSelection.clear();
405 for(qint32 i = 0; i < selection.size(); ++i)
407 if(selection[i] < m_qListChInfo.size())
409 m_qMapIdxRowSelection.insert(count,selection[i]);
426 m_qMapIdxRowSelection.clear();
428 for(qint32 i = 0; i < m_qListChInfo.size(); ++i)
429 m_qMapIdxRowSelection.insert(i,i);
439 m_bIsFreezed = !m_bIsFreezed;
443 m_dataCurrentFreeze = m_dataCurrent;
444 m_dataLastFreeze = m_dataLast;
448 QModelIndex topLeft = this->index(0,1);
449 QModelIndex bottomRight = this->index(m_qListChInfo.size()-1,1);
450 QVector<int> roles; roles << Qt::DisplayRole;
451 emit dataChanged(topLeft, bottomRight, roles);
460 m_qMapChScaling = p_qMapChScaling;
474 m_bProjActivated =
false;
475 for(qint32 i = 0; i < this->m_pFiffInfo->projs.size(); ++i)
476 if(this->m_pFiffInfo->projs[i].active)
477 m_bProjActivated =
true;
479 this->m_pFiffInfo->make_projector(m_matProj);
480 qDebug() <<
"updateProjection :: New projection calculated.";
486 qint32 nchan = this->m_pFiffInfo->nchan;
489 typedef Eigen::Triplet<double> T;
490 std::vector<T> tripletList;
491 tripletList.reserve(nchan);
497 tripletList.reserve(m_matProj.rows()*m_matProj.cols());
498 for(i = 0; i < m_matProj.rows(); ++i)
499 for(k = 0; k < m_matProj.cols(); ++k)
500 if(m_matProj(i,k) != 0)
501 tripletList.push_back(T(i, k, m_matProj(i,k)));
503 m_matSparseProj = SparseMatrix<double>(m_matProj.rows(),m_matProj.cols());
504 if(tripletList.size() > 0)
505 m_matSparseProj.setFromTriplets(tripletList.begin(), tripletList.end());
void addData(const QList< MatrixXd > &data)
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
fiff_int_t getUnit(qint32 row) const
void setSamplingInfo(float sps, int T, float dest_sps=128.0f)
void setFiffInfo(FIFFLIB::FiffInfo::SPtr &p_pFiffInfo)
fiff_int_t getKind(qint32 row) const
RealTimeMultiSampleArrayModel(QObject *parent=0)
QSharedPointer< FiffInfo > SPtr
void newSelection(QList< qint32 > selection)
Declaration of the RealTimeMultiSampleArrayModel Class.
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
void setScaling(const QMap< qint32, float > &p_qMapChScaling)
void toggleFreeze(const QModelIndex &index)
void setChannelInfo(QList< RealTimeSampleArrayChInfo > &chInfo)
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
void selectRows(const QList< qint32 > &selection)
static RowVectorXi pick_channels(const QStringList &ch_names, const QStringList &include=defaultQStringList, const QStringList &exclude=defaultQStringList)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
fiff_int_t getCoil(qint32 row) const