68 StcDataModel::StcDataModel(QObject *parent)
69 : QAbstractTableModel(parent)
74 , m_bIntervallSet(false)
78 qRegisterMetaType<MatrixXd>(
"MatrixXd");
79 qRegisterMetaType<VectorXd>(
"VectorXd");
80 qRegisterMetaType<Matrix3Xf>(
"Matrix3Xf");
82 connect(m_pWorker.data(), &StcDataWorker::stcSample,
this, &StcDataModel::setStcSample);
91 StcDataModel::~StcDataModel()
98 int StcDataModel::rowCount(
const QModelIndex & )
const
100 if(m_vecCurStc.rows() != 0)
101 return m_vecCurStc.rows();
109 int StcDataModel::columnCount(
const QModelIndex & )
const
122 if (index.isValid()) {
123 qint32 row = index.row();
125 switch(index.column()) {
127 if(role == Qt::DisplayRole)
128 return QVariant(row);
135 if(m_bDataInit && role == StcDataModelRoles::GetIndexLH)
136 return QVariant(m_forwardSolution.
src[0].vertno(row));
139 if(m_bDataInit && role == StcDataModelRoles::GetIndexRH)
140 return QVariant(m_forwardSolution.
src[1].vertno(row));
146 int numDipolesLH = m_forwardSolution.
src[0].vertno.rows();
147 int numDipolesRH = m_forwardSolution.
src[1].vertno.rows();
153 if(m_bDataInit && role == StcDataModelRoles::GetStcValLH) {
154 VectorXd valVec(numDipolesLH);
156 for(qint32 i = 0; i < valVec.rows(); ++i)
157 valVec(i) = m_vecCurStc(i);
162 if(m_bDataInit && role == StcDataModelRoles::GetStcValRH) {
163 VectorXd valVec(numDipolesRH);
165 for(qint32 i = numDipolesLH; i < numDipolesLH+numDipolesRH; ++i)
166 valVec(i-numDipolesLH) = m_vecCurStc(i);
177 if(m_bDataInit && role == StcDataModelRoles::GetSmoothedStcValLH) {
178 v.setValue(smoothEstimates(1, 0));
181 if(m_bDataInit && role == StcDataModelRoles::GetSmoothedStcValRH) {
182 v.setValue(smoothEstimates(1, 1));
191 if(role == Qt::DisplayRole)
194 v.setValue(m_qListLabels[row]);
201 if(role == Qt::DisplayRole)
202 return QVariant(QColor(m_qListRGBAs[row](0),m_qListRGBAs[row](1),m_qListRGBAs[row](2),255));
206 if(role == Qt::DisplayRole)
209 v.setValue(m_qListTriRRs[row]);
223 QVariant StcDataModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
225 if(role != Qt::DisplayRole)
228 if(orientation == Qt::Horizontal) {
231 return QVariant(
"Index");
233 return QVariant(
"Vertex/Label ID");
235 return QVariant(
"STC");
237 return QVariant(
"Relative STC");
239 return QVariant(
"Smoothed STC");
241 return QVariant(
"Label");
243 return QVariant(
"Color");
245 return QVariant(
"Tri Coords");
248 else if(orientation == Qt::Vertical) {
249 QModelIndex mdlIdx = createIndex(section,0);
251 case Qt::DisplayRole:
252 return QVariant(
data(mdlIdx).toString());
266 if(!m_bModelInit || stc.
isEmpty()) {
267 std::cout<<
"stc is empty or model was not correctly initialized"<<std::endl;
271 if(m_vertLabelIds.size() != stc.
data.rows())
278 QList<VectorXd>
data;
279 for(qint32 i = 0; i < stc.
data.cols(); ++i)
280 data.append(stc.
data.col(i));
282 m_pWorker->addData(data);
292 void StcDataModel::init(
const QString &subject_id, qint32 hemi,
const QString &surf,
const QString &subjects_dir,
const QString &atlas,
const MNEForwardSolution &forwardSolution)
295 m_forwardSolution = forwardSolution;
308 void StcDataModel::setAverage(qint32 samples)
310 m_pWorker->setAverage(samples);
316 void StcDataModel::setLoop(
bool looping)
318 m_pWorker->setLoop(looping);
324 void StcDataModel::setNormalization(qint32 fraction)
326 m_dStcNorm = (m_dStcNormMax/100.0) * (double)fraction;
332 void StcDataModel::setStcSample(
const VectorXd &sample)
335 m_vecCurStc = sample;
337 m_vecCurRelStc = sample/m_dStcNorm;
343 QModelIndex topLeft = this->index(0,2);
344 QModelIndex bottomRight = this->index(this->rowCount()-1,3);
345 QVector<int> roles; roles << Qt::DisplayRole;
346 emit dataChanged(topLeft, bottomRight, roles);
352 void StcDataModel::setVertLabelIDs(
const VectorXi &vertLabelIDs)
354 QMap<qint32, qint32> t_qMapLabelIdChannel;
355 for(qint32 i = 0; i < vertLabelIDs.size(); ++i)
356 t_qMapLabelIdChannel.insertMulti(vertLabelIDs(i),i);
358 QList<qint32> qListLastIdcs = t_qMapLabelIdChannel.values(vertLabelIDs(vertLabelIDs.size() - 1));
361 qint32 maxIdx = qListLastIdcs[0];
362 qint32 minIdx = qListLastIdcs[0];
364 for(qint32 i = 0; i < qListLastIdcs.size(); ++i)
366 if(maxIdx < qListLastIdcs[i])
367 maxIdx = qListLastIdcs[i];
368 if(minIdx > qListLastIdcs[i])
369 minIdx = qListLastIdcs[i];
372 qint32 upperBound = maxIdx - (maxIdx*0.25);
373 for(qint32 i = 0; i < qListLastIdcs.size(); ++i)
375 if(lhIdx < qListLastIdcs[i] && qListLastIdcs[i] < upperBound)
376 lhIdx = qListLastIdcs[i];
379 m_qMapLabelIdChannelLH.clear();
380 m_qMapLabelIdChannelRH.clear();
382 QMap<qint32, qint32>::iterator it;
383 for (it = t_qMapLabelIdChannel.begin(); it != t_qMapLabelIdChannel.end(); ++it)
385 if(it.value() <= lhIdx)
386 m_qMapLabelIdChannelLH.insertMulti(it.key(),it.value());
388 m_qMapLabelIdChannelRH.insertMulti(it.key(),it.value());
391 m_vertLabelIds = vertLabelIDs;
397 VectorXd StcDataModel::smoothEstimates(
int niter,
int hemi)
const
399 std::cout<<
"START - StcDataModel::smoothEstimates()"<<std::endl;
403 VectorXi vertno = sp.
vertno;
404 int nvert = sp.
vertno.rows();
406 VectorXi undef = VectorXi::Ones(sp.
np);
407 VectorXi prev_undef(sp.
np);
408 VectorXd prev_val(sp.
np);
410 VectorXd vecCurSmoothedStc = VectorXd::Zero(sp.
np);
416 for (k = 0; k < nvert; k++) {
417 undef[vertno[k]] = 0;
418 vecCurSmoothedStc[vertno[k]] = m_vecCurRelStc[k];
422 for (k = 0 ; k < nvert; k++) {
423 undef[vertno[k]] = 0;
424 vecCurSmoothedStc[vertno[k]] = m_vecCurRelStc[m_forwardSolution.
src[0].nuse+k];
428 for (it = 0; it < niter; it++) {
430 prev_val = vecCurSmoothedStc;
432 for (k = 0; k < sp.
np; k++) {
436 if (prev_undef[k] == 1) {
437 sum = vecCurSmoothedStc[k];
444 if (prev_undef[nv] == 0) {
451 vecCurSmoothedStc[k] = sum/n;
457 std::cout<<
"END - StcDataModel::smoothEstimates()"<<std::endl;
459 return vecCurSmoothedStc;
QVariant data(int row, int column, int role=Qt::DisplayRole) const
StcDataModel class declaration.
QMap< int, QVector< int > > neighbor_vert
Hemisphere provides geometry information.
MNESourceEstimate class declaration.