70 ClustStcModel::ClustStcModel(QObject *parent)
71 : QAbstractTableModel(parent)
76 , m_bIntervallSet(false)
80 qRegisterMetaType<MatrixXd>(
"MatrixXd");
81 qRegisterMetaType<VectorXd>(
"VectorXd");
82 qRegisterMetaType<Matrix3Xf>(
"Matrix3Xf");
84 connect(m_pWorker.data(), &ClustStcWorker::stcSample,
this, &ClustStcModel::setStcSample);
94 ClustStcModel::~ClustStcModel()
101 int ClustStcModel::rowCount(
const QModelIndex & )
const
103 if(!m_qListLabels.empty())
104 return m_qListLabels.size();
112 int ClustStcModel::columnCount(
const QModelIndex & )
const
122 if(role != Qt::DisplayRole && role != Qt::BackgroundRole)
125 if (index.isValid()) {
126 qint32 row = index.row();
128 switch(index.column()) {
130 if(role == Qt::DisplayRole)
131 return QVariant(row);
135 if(m_bDataInit && role == Qt::DisplayRole)
136 return QVariant(m_qListLabels[row].label_id);
142 if(m_bDataInit && role == Qt::DisplayRole)
144 QList<qint32> selVec;
147 selVec = m_qMapLabelIdChannelLH.values(m_qListLabels[row].label_id);
149 selVec = m_qMapLabelIdChannelRH.values(m_qListLabels[row].label_id);
151 VectorXd valVec(selVec.size());
153 if(index.column() == 2)
154 for(qint32 i = 0; i < selVec.size(); ++i)
155 valVec(i) = m_vecCurStc(selVec[i]);
157 for(qint32 i = 0; i < selVec.size(); ++i)
158 valVec(i) = m_vecCurRelStc(selVec[i]);
165 if(role == Qt::DisplayRole)
168 v.setValue(m_qListLabels[row]);
174 if(role == Qt::DisplayRole)
175 return QVariant(QColor(m_qListRGBAs[row](0),m_qListRGBAs[row](1),m_qListRGBAs[row](2),255));
179 if(role == Qt::DisplayRole)
182 v.setValue(m_qListTriRRs[row]);
196 QVariant ClustStcModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
198 if(role != Qt::DisplayRole)
201 if(orientation == Qt::Horizontal) {
204 return QVariant(
"Index");
206 return QVariant(
"Vertex/Label ID");
208 return QVariant(
"STC");
210 return QVariant(
"Relative STC");
212 return QVariant(
"Label");
214 return QVariant(
"Color");
216 return QVariant(
"Tri Coords");
219 else if(orientation == Qt::Vertical) {
220 QModelIndex mdlIdx = createIndex(section,0);
222 case Qt::DisplayRole:
223 return QVariant(
data(mdlIdx).toString());
235 if(!m_bModelInit || stc.
isEmpty())
238 if(m_vertLabelIds.size() != stc.
data.rows())
246 QList<VectorXd>
data;
247 for(qint32 i = 0; i < stc.
data.cols(); ++i)
248 data.append(stc.
data.col(i));
252 int usec = floor(stc.
tstep*1000000);
255 m_pWorker->setInterval(usec);
256 m_bIntervallSet =
true;
259 m_pWorker->addData(data);
268 m_annotationSet = annotationSet;
270 m_annotationSet.
toLabels(m_surfSet, m_qListLabels, m_qListRGBAs);
275 for(qint32 h = 0; h < m_annotationSet.
size(); ++h)
279 if(QString::compare(surfSet.
surf(),
"inflated") == 0)
280 lhOffset = m_surfSet[h].rr().col(0).maxCoeff();
282 m_vecMinRR.setX(m_surfSet[h].rr().col(0).minCoeff()-lhOffset);
283 m_vecMinRR.setY(m_surfSet[h].rr().col(1).minCoeff());
284 m_vecMinRR.setZ(m_surfSet[h].rr().col(2).minCoeff());
285 m_vecMaxRR.setX(m_surfSet[h].rr().col(0).maxCoeff()-lhOffset);
286 m_vecMaxRR.setY(m_surfSet[h].rr().col(1).maxCoeff());
287 m_vecMaxRR.setZ(m_surfSet[h].rr().col(2).maxCoeff());
291 if(QString::compare(surfSet.
surf(),
"inflated") == 0)
292 rhOffset = m_surfSet[h].rr().col(0).maxCoeff();
294 m_vecMinRR.setX(m_vecMinRR.x() < m_surfSet[h].rr().col(0).minCoeff()+rhOffset ? m_vecMinRR.x() : m_surfSet[h].rr().col(0).minCoeff()+rhOffset);
295 m_vecMinRR.setY(m_vecMinRR.y() < m_surfSet[h].rr().col(1).minCoeff() ? m_vecMinRR.y() : m_surfSet[h].rr().col(1).minCoeff());
296 m_vecMinRR.setZ(m_vecMinRR.z() < m_surfSet[h].rr().col(2).minCoeff() ? m_vecMinRR.z() : m_surfSet[h].rr().col(2).minCoeff());
297 m_vecMaxRR.setX(m_vecMaxRR.x() > m_surfSet[h].rr().col(0).maxCoeff()+rhOffset ? m_vecMaxRR.x() : m_surfSet[h].rr().col(0).maxCoeff()+rhOffset);
298 m_vecMaxRR.setY(m_vecMaxRR.y() > m_surfSet[h].rr().col(1).maxCoeff() ? m_vecMaxRR.y() : m_surfSet[h].rr().col(1).maxCoeff());
299 m_vecMaxRR.setZ(m_vecMaxRR.z() > m_surfSet[h].rr().col(2).maxCoeff() ? m_vecMaxRR.z() : m_surfSet[h].rr().col(2).maxCoeff());
303 QVector3D vecCenterRR;
304 vecCenterRR.setX((m_vecMinRR.x()+m_vecMaxRR.x())/2.0f);
305 vecCenterRR.setY((m_vecMinRR.y()+m_vecMaxRR.y())/2.0f);
306 vecCenterRR.setZ((m_vecMinRR.z()+m_vecMaxRR.z())/2.0f);
310 for(qint32 h = 0; h < m_annotationSet.
size(); ++h)
313 MatrixX3f rr = m_surfSet[h].rr();
316 if(QString::compare(surfSet.
surf(),
"inflated") == 0)
319 rr.col(0) = (rr.col(0).array() - lhOffset) - vecCenterRR.x();
321 rr.col(0) = (rr.col(0).array() + rhOffset) - vecCenterRR.x();
324 rr.col(0) = rr.col(0).array() - vecCenterRR.x();
326 rr.col(1) = rr.col(1).array() - vecCenterRR.y();
327 rr.col(2) = rr.col(2).array() - vecCenterRR.z();
333 for(qint32 k = 0; k < m_qListLabels.size(); ++k)
336 if(m_qListLabels[k].hemi != h)
340 tris = m_qListLabels[k].selectTris(m_surfSet[h]);
343 Matrix3Xf triCoords(3,3*tris.rows());
345 for(qint32 i = 0; i < tris.rows(); ++i)
347 triCoords.col(i*3) = rr.row( tris(i,0) ).transpose();
348 triCoords.col(i*3+1) = rr.row( tris(i,1) ).transpose();
349 triCoords.col(i*3+2) = rr.row( tris(i,2) ).transpose();
352 m_qListTriRRs.append(triCoords);
358 for(qint32 k = 0; k < m_qListLabels.size(); ++k)
359 if(m_qListLabels[k].hemi == 0)
362 m_vecCurStc = VectorXd::Zero(416);
363 m_vecCurRelStc = VectorXd::Zero(416);
371 void ClustStcModel::setAverage(qint32 samples)
373 m_pWorker->setAverage(samples);
379 void ClustStcModel::setLoop(
bool looping)
381 m_pWorker->setLoop(looping);
387 void ClustStcModel::setNormalization(qint32 fraction)
389 m_dStcNorm = (m_dStcNormMax/100.0) * (double)fraction;
395 void ClustStcModel::setStcSample(
const VectorXd &sample)
397 m_vecCurStc = sample;
399 m_vecCurRelStc = sample/m_dStcNorm;
402 QModelIndex topLeft = this->index(0,2);
403 QModelIndex bottomRight = this->index(m_qListLabels.size()-1,3);
404 QVector<int> roles; roles << Qt::DisplayRole;
405 emit dataChanged(topLeft, bottomRight, roles);
424 void ClustStcModel::setVertLabelIDs(
const VectorXi &vertLabelIDs)
426 QMap<qint32, qint32> t_qMapLabelIdChannel;
427 for(qint32 i = 0; i < vertLabelIDs.size(); ++i)
428 t_qMapLabelIdChannel.insertMulti(vertLabelIDs(i),i);
431 QList<qint32> qListLastIdcs = t_qMapLabelIdChannel.values(vertLabelIDs(vertLabelIDs.size() - 1));
434 qint32 maxIdx = qListLastIdcs[0];
435 qint32 minIdx = qListLastIdcs[0];
437 for(qint32 i = 0; i < qListLastIdcs.size(); ++i)
439 if(maxIdx < qListLastIdcs[i])
440 maxIdx = qListLastIdcs[i];
441 if(minIdx > qListLastIdcs[i])
442 minIdx = qListLastIdcs[i];
445 qint32 upperBound = maxIdx - (maxIdx*0.25);
446 for(qint32 i = 0; i < qListLastIdcs.size(); ++i)
448 if(lhIdx < qListLastIdcs[i] && qListLastIdcs[i] < upperBound)
449 lhIdx = qListLastIdcs[i];
452 m_qMapLabelIdChannelLH.clear();
453 m_qMapLabelIdChannelRH.clear();
456 QMap<qint32, qint32>::iterator it;
457 for (it = t_qMapLabelIdChannel.begin(); it != t_qMapLabelIdChannel.end(); ++it)
459 if(it.value() <= lhIdx)
460 m_qMapLabelIdChannelLH.insertMulti(it.key(),it.value());
462 m_qMapLabelIdChannelRH.insertMulti(it.key(),it.value());
465 m_vertLabelIds = vertLabelIDs;
QVariant data(int row, int column, int role=Qt::DisplayRole) const
ClustStcModel class declaration.
bool toLabels(const SurfaceSet &p_surfSet, QList< Label > &p_qListLabels, QList< RowVector4i > &p_qListLabelRGBAs) const
MNESourceEstimate class declaration.
A hemisphere set of surfaces.