43 #include "FormFiles/averagingsettingswidget.h"
54 #include <QtCore/QtPlugin>
55 #include <QMutexLocker>
77 : m_pAveragingInput(NULL)
81 , m_bProcessData(false)
82 , m_iPreStimSamples(400)
83 , m_iPostStimSamples(750)
87 , m_pActionShowAdjustment(Q_NULLPTR)
88 #ifdef DEBUG_AVERAGING
93 m_pActionShowAdjustment =
new QAction(QIcon(
":/images/averagingadjustments.png"), tr(
"Averaging Adjustments"),
this);
95 m_pActionShowAdjustment->setStatusTip(tr(
"Averaging Adjustments"));
96 connect(m_pActionShowAdjustment, &QAction::triggered,
this, &Averaging::showAveragingWidget);
99 m_pActionShowAdjustment->setVisible(
false);
107 if(this->isRunning())
116 QSharedPointer<Averaging> pAveragingClone(
new Averaging);
117 return pAveragingClone;
132 m_iPreStimSamples = settings.value(QString(
"Plugin/%1/preStimSamples").arg(this->
getName()), 400).toInt();
133 m_iPostStimSamples = settings.value(QString(
"Plugin/%1/postStimSamples").arg(this->
getName()), 750).toInt();
134 m_iNumAverages = settings.value(QString(
"Plugin/%1/numAverages").arg(this->
getName()), 10).toInt();
135 m_iStimChan = settings.value(QString(
"Plugin/%1/stimChannel").arg(this->
getName()), 0).toInt();
139 connect(m_pAveragingInput.data(), &PluginInputConnector::notify,
this, &Averaging::update, Qt::DirectConnection);
144 m_pAveragingOutput->data()->setName(this->
getName());
151 if(!m_pAveragingBuffer.isNull())
164 settings.setValue(QString(
"Plugin/%1/preStimSamples").arg(this->
getName()), m_iPreStimSamples);
165 settings.setValue(QString(
"Plugin/%1/postStimSamples").arg(this->
getName()), m_iPostStimSamples);
166 settings.setValue(QString(
"Plugin/%1/numAverages").arg(this->
getName()), m_iNumAverages);
167 settings.setValue(QString(
"Plugin/%1/stimChannel").arg(this->
getName()), m_iStimChan);
175 QMutexLocker locker(&m_qMutex);
176 m_iNumAverages = numAve;
178 m_pRtAve->setAverages(numAve);
184 void Averaging::initConnector()
198 if(this->isRunning())
218 m_bIsRunning =
false;
226 m_pAveragingBuffer->
clear();
254 void Averaging::changeStimChannel(qint32 index)
257 QMutexLocker locker(&m_qMutex);
258 m_iStimChan = m_pAveragingWidget->m_pComboBoxChSelection->currentData().toInt();
264 void Averaging::changePreStim(qint32 samples)
266 QMutexLocker locker(&m_qMutex);
267 m_iPreStimSamples = samples;
269 m_pRtAve->setPreStim(m_iPreStimSamples);
276 void Averaging::changePostStim(qint32 samples)
278 QMutexLocker locker(&m_qMutex);
279 m_iPostStimSamples = samples;
281 m_pRtAve->setPostStim(m_iPostStimSamples);
296 void Averaging::showAveragingWidget()
298 QMutexLocker locker(&m_qMutex);
300 m_pAveragingWidget->show();
313 if(!m_pAveragingBuffer)
319 m_pFiffInfo = pRTMSA->info();
322 #ifdef DEBUG_AVERAGING
323 for(qint32 i = 0; i < m_pFiffInfo->nchan; ++i)
325 if(m_pFiffInfo->chs[i].kind == FIFFV_STIM_CH)
337 for(qint32 i = 0; i < pRTMSA->getMultiSampleArray().size(); ++i)
339 MatrixXd t_mat = pRTMSA->getMultiSampleArray()[i];
341 #ifdef DEBUG_AVERAGING
342 qsrand(time(NULL)+m_iTestCount);
344 t_mat = MatrixXd::Zero(t_mat.rows(), t_mat.cols());
346 if(m_iTestCount%10 == 0)
348 qint32 samp = (qrand() % (t_mat.cols()/8))+1;
349 if(m_iTestCount2 % 5 == 0)
351 RowVectorXd stim = RowVectorXd::Ones(8)*5;
352 t_mat.block(m_iTestStimCh,samp,1,8) = stim;
354 t_mat.block(0,samp+1,m_iTestStimCh, t_mat.cols()-(samp+1)) = MatrixXd::Ones(m_iTestStimCh, t_mat.cols()-(samp+1));
356 qDebug() <<
"Pos:" << samp;
361 m_pAveragingBuffer->
push(&t_mat);
374 QString t_sStimulusChannel = m_pFiffInfo->chs[m_qListStimChs[m_iStimChan]].ch_name;
376 if(p_pEvoked->comment == t_sStimulusChannel)
380 m_qVecEvokedData.push_back(p_pEvoked);
391 qDebug() <<
"START void Averaging::run()";
398 m_pActionShowAdjustment->setVisible(
true);
400 for(qint32 i = 0; i < m_pFiffInfo->chs.size(); ++i)
402 if(m_pFiffInfo->chs[i].kind == FIFFV_STIM_CH)
404 qDebug() <<
"Stim" << i <<
"Name" << m_pFiffInfo->chs[i].ch_name;
405 m_qListStimChs.append(i);
410 m_bProcessData =
true;
416 m_pRtAve =
RtAve::SPtr(
new RtAve(m_iNumAverages, m_iPreStimSamples, m_iPostStimSamples, m_pFiffInfo));
424 QMutexLocker locker(&m_qMutex);
429 bool doProcessing =
false;
431 QMutexLocker locker(&m_qMutex);
432 doProcessing = m_bProcessData;
438 MatrixXd rawSegment = m_pAveragingBuffer->
pop();
440 m_pRtAve->append(rawSegment);
443 if(m_qVecEvokedData.size() > 0)
445 FiffEvoked t_fiffEvoked = *m_qVecEvokedData[0].data();
447 #ifdef DEBUG_AVERAGING
448 std::cout <<
"EVK:" << t_fiffEvoked.
data.row(0) << std::endl;
450 m_pAveragingOutput->data()->setValue(t_fiffEvoked);
452 m_qVecEvokedData.pop_front();
460 m_pActionShowAdjustment->setVisible(
false);
QSharedPointer< IAlgorithm > SPtr
virtual QWidget * setupWidget()
OutputConnectorList m_outputConnectors
void evokedStim(FIFFLIB::FiffEvoked::SPtr p_pEvokedStim)
The Averaging class provides a Averaging algorithm structure.
virtual IPlugin::PluginType getType() const
QSharedPointer< CircularMatrixBuffer > SPtr
void addPluginAction(QAction *pAction)
virtual QSharedPointer< IPlugin > clone() const
virtual QString getName() const
The circular matrix buffer.
void push(const Matrix< _Tp, Dynamic, Dynamic > *pMatrix)
Real-time averaging helper.
QSharedPointer< FiffEvoked > SPtr
Matrix< _Tp, Dynamic, Dynamic > pop()
QSharedPointer< NewMeasurement > SPtr
Contains the declaration of the Averaging class.
static QSharedPointer< PluginOutputData< T > > create(IPlugin *parent, const QString &name, const QString &descr)
void changeNumAverages(qint32 numAve)
InputConnectorList m_inputConnectors
QSharedPointer< RtAve > SPtr
The RealTimeMultiSampleArrayNew class is the base class of every RealTimeMultiSampleArrayNew Measurem...