51 #include <QtCore/QtPlugin>
52 #include <QtConcurrent>
61 using namespace SourceLabPlugin;
62 using namespace FIFFLIB;
63 using namespace XMEASLIB;
73 , m_bReceiveData(false)
74 , m_bProcessData(false)
75 , m_bFinishedClustering(false)
76 , m_qFileFwdSolution(
"./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif")
77 , m_sAtlasDir(
"./MNE-sample-data/subjects/sample/label")
78 , m_sSurfaceDir(
"./MNE-sample-data/subjects/sample/surf")
80 , m_bSingleTrial(false)
101 QSharedPointer<SourceLab> pSourceLabClone(
new SourceLab());
102 return pSourceLabClone;
119 if(!m_pSourceLabBuffer.isNull())
124 connect(m_pRTMSAInput.data(), &PluginInputConnector::notify,
this, &SourceLab::update, Qt::DirectConnection);
130 m_pRTSEOutput->data()->setName(
"Real-Time Source Estimate");
131 m_pRTSEOutput->data()->setAnnotSet(m_pAnnotationSet);
132 m_pRTSEOutput->data()->setSurfSet(m_pSurfaceSet);
133 m_pRTSEOutput->data()->setSamplingRate(600/m_iDownSample);
136 QFuture<void> future = QtConcurrent::run(
this, &SourceLab::doClustering);
143 void SourceLab::doClustering()
146 m_bFinishedClustering =
false;
149 finishedClustering();
155 void SourceLab::finishedClustering()
157 m_pRTSEOutput->data()->setSrc(m_pClusteredFwd->src);
159 m_bFinishedClustering =
true;
169 if(this->isRunning())
172 if(m_bFinishedClustering)
188 if(this->isRunning())
191 m_bIsRunning =
false;
200 m_bProcessData =
false;
202 if(m_pRtCov->isRunning())
205 if(m_pRtInvOp->isRunning())
208 if(m_pSourceLabBuffer)
209 m_pSourceLabBuffer->
clear();
211 m_bReceiveData =
false;
239 if(!m_bFinishedClustering)
256 if(pRTMSA && m_bReceiveData)
259 if(!m_pSourceLabBuffer)
264 m_pFiffInfo = pRTMSA->getFiffInfo();
268 MatrixXd t_mat(pRTMSA->getNumChannels(), pRTMSA->getMultiArraySize());
270 for(
unsigned char i = 0; i < pRTMSA->getMultiArraySize(); ++i)
271 t_mat.col(i) = pRTMSA->getMultiSampleArray()[i];
273 m_pSourceLabBuffer->
push(&t_mat);
283 if(p_pEvoked->comment == QString(
"Stim %1").arg(m_iStimChan))
285 std::cout << p_pEvoked->comment.toLatin1().constData() <<
" append" << std::endl;
288 m_qVecEvokedData.push_back(p_pEvoked);
298 m_pFiffCov = p_pFiffCov;
301 m_pRtInvOp->appendNoiseCov(m_pFiffCov);
312 double lambda2 = 1.0 / pow(snr, 2);
314 QString method(
"dSPM");
321 m_pMinimumNorm->doInverseSetup(m_iNumAverages,
false);
348 m_bReceiveData =
true;
388 m_bProcessData =
true;
390 qint32 skip_count = 0;
394 qint32 nrows = m_pSourceLabBuffer->
rows();
399 MatrixXd t_mat = m_pSourceLabBuffer->
pop();
401 qDebug() <<
"received data" << t_mat.rows();
404 m_pRtCov->append(t_mat);
410 if(m_pMinimumNorm && t_mat.cols() > 0)
415 MNESourceEstimate sourceEstimate = m_pMinimumNorm->calculateInverse(t_mat, 0, 1/m_pFiffInfo->sfreq);
417 std::cout <<
"Source Estimated" << std::endl;
424 m_pRtAve->append(t_mat);
427 if(m_pMinimumNorm && m_qVecEvokedData.size() > 0 && skip_count > 2)
429 FiffEvoked t_fiffEvoked = *m_qVecEvokedData[0].data();
431 float tmin = ((float)t_fiffEvoked.
first) / t_fiffEvoked.
info.
sfreq;
436 std::cout <<
"SourceEstimated:\n" << std::endl;
440 for(qint32 i = 0; i < sourceEstimate.
data.cols(); i += m_iDownSample)
441 m_pRTSEOutput->data()->setValue(sourceEstimate.
data.col(i));
443 m_qVecEvokedData.pop_front();
virtual IPlugin::PluginType getType() const
void appendEvoked(FiffEvoked::SPtr p_pEvoked)
OutputConnectorList m_outputConnectors
void updateFiffCov(FiffCov::SPtr p_pFiffCov)
QSharedPointer< FiffCov > SPtr
Real-time inverse operator estimation.
QSharedPointer< MinimumNorm > SPtr
void evokedStim(FIFFLIB::FiffEvoked::SPtr p_pEvokedStim)
void invOperatorCalculated(MNELIB::MNEInverseOperator::SPtr p_pInvOp)
virtual QSharedPointer< IPlugin > clone() const
Real-time covariance estimation.
QSharedPointer< MNEForwardSolution > SPtr
QSharedPointer< CircularMatrixBuffer > SPtr
The circular matrix buffer.
void covCalculated(FIFFLIB::FiffCov::SPtr p_pCov)
void push(const Matrix< _Tp, Dynamic, Dynamic > *pMatrix)
Real-time averaging helper.
QSharedPointer< FiffEvoked > SPtr
virtual QString getName() const
QSharedPointer< SurfaceSet > SPtr
void updateInvOp(MNEInverseOperator::SPtr p_pInvOp)
Matrix< _Tp, Dynamic, Dynamic > pop()
Contains the declaration of the SourceLab class.
QSharedPointer< NewMeasurement > SPtr
QSharedPointer< AnnotationSet > SPtr
static QSharedPointer< PluginOutputData< T > > create(IPlugin *parent, const QString &name, const QString &descr)
QSharedPointer< RtCov > SPtr
virtual QWidget * setupWidget()
InputConnectorList m_inputConnectors
A hemisphere set of surfaces.
QSharedPointer< RtAve > SPtr
QSharedPointer< MNEInverseOperator > SPtr
void clusteringFinished()
The RealTimeMultiSampleArrayNew class is the base class of every RealTimeMultiSampleArrayNew Measurem...
QSharedPointer< RtInvOp > SPtr