73 quint32 iPreStimSamples,
74 quint32 iPostStimSamples,
75 quint32 iBaselineFromMSecs,
76 quint32 iBaselineToMSecs,
77 quint32 iTriggerIndex,
99 qDebug() <<
"RtAveragingWorker::RtAveragingWorker - Number of averages <= 0. Setting to 1 as default.";
108 if(this->thread()->isInterruptionRequested()) {
124 qDebug() <<
"[RtAveragingWorker::setAverageNumber] Number of averages <= 0 are not allowed. Returning.";
132 QMutableMapIterator<double,QList<Eigen::MatrixXd> > idx(
m_mapStimAve);
134 while(idx.hasNext()) {
137 if(idx.value().size() > iDiff) {
139 for(
int i = 0; i < iDiff; ++i) {
140 idx.value().pop_front();
178 if(mapThresholds[
"Active"] == 0.0) {
238 for(
int i = 0; i < lDetectedTriggers.size(); ++i) {
240 double dTriggerType = lDetectedTriggers.at(i).second;
258 QStringList lResponsibleTriggerTypes;
260 while(idx.hasNext()) {
263 double dTriggerType = idx.key();
266 if(lDetectedTriggers.isEmpty()) {
279 emitEvoked(dTriggerType, lResponsibleTriggerTypes);
282 if(lDetectedTriggers.isEmpty()) {
286 for(
int i = 0; i < lDetectedTriggers.size(); ++i) {
287 if(dTriggerType == lDetectedTriggers.at(i).second) {
288 int iTriggerPos = lDetectedTriggers.at(i).first;
294 tempMat = rawSegment.block(0,
299 tempMat = rawSegment.block(0,
308 if(rawSegment.cols() - iTriggerPos >=
m_mapDataPost[dTriggerType].cols()) {
313 emitEvoked(dTriggerType, lResponsibleTriggerTypes);
320 rawSegment.cols() - iTriggerPos) = rawSegment.block(0,
323 rawSegment.cols() - iTriggerPos);
349 if(!lResponsibleTriggerTypes.contains(QString::number(dTriggerType))) {
350 lResponsibleTriggerTypes << QString::number(dTriggerType);
365 int iResidualCols = data.cols();
382 if(dTriggerType != -1.0) {
398 int residual =
m_mapDataPre[dTriggerType].cols() - data.cols();
422 qDebug() <<
"[RtAveragingWorker::mergeData] Rows of m_mapDataPre (" <<
m_mapDataPre[dTriggerType].rows() <<
") and m_mapDataPost (" <<
m_mapDataPost[dTriggerType].rows() <<
") are not the same. Returning.";
431 bool bArtifactDetected =
false;
434 qDebug() <<
"[RtAveragingWorker::mergeData] Doing artifact reduction for" <<
m_mapThresholds;
441 if(!bArtifactDetected) {
448 for(
int i = 0; i < iDiff; ++i) {
460 qDebug() <<
"[RtAveragingWorker::generateEvoked] m_mapStimAve is empty for type" << dTriggerType <<
"Returning.";
471 if(
m_stimEvokedSet.evoked.at(i).comment == QString::number(dTriggerType)) {
479 if(iEvokedIdx == -1) {
488 evoked.
comment = QString::number(dTriggerType);
494 for(
int i = 0; i <
m_mapStimAve[dTriggerType].size(); ++i) {
499 finalAverage = finalAverage/
m_mapStimAve[dTriggerType].size();
506 evoked.
data = finalAverage;
511 if(iEvokedIdx != -1) {
546 quint32 iPreStimSamples,
547 quint32 iPostStimSamples,
548 quint32 iBaselineFromSecs,
549 quint32 iBaselineToSecs,
550 quint32 iTriggerIndex,
555 qRegisterMetaType<Eigen::MatrixXd>(
"Eigen::MatrixXd");
567 worker, &QObject::deleteLater);
614 const QStringList &lResponsibleTriggerTypes)
617 lResponsibleTriggerTypes);
623 quint32 iPreStimSamples,
624 quint32 iPostStimSamples,
625 quint32 iBaselineFromSecs,
626 quint32 iBaselineToSecs,
627 quint32 iTriggerIndex,
642 worker, &QObject::deleteLater);
Declaration of the RtAveraging and RtAveragingWorker classes.
DetectTrigger declarations.
IOUtils class declaration.
MNEMath class declaration.
MNEEpochDataList class declaration.
Core MNE data structures (source spaces, source estimates, hemispheres).
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
Real-time signal processing (filtering, averaging, HPI fitting, noise reduction).
QMap< int, QList< QPair< int, double > > > detectTriggerFlanksMax(const Eigen::MatrixXd &data, const QList< int > &lTriggerChannels, int iOffsetIndex, double dThreshold, bool bRemoveOffset, int iBurstLengthSamp=100)
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
void setInfo(const FiffInfo &p_info, bool proj=true)
QPair< float, float > baseline
QSharedPointer< FiffInfo > SPtr
static bool checkForArtifact(const Eigen::MatrixXd &data, const FIFFLIB::FiffInfo &pFiffInfo, const QMap< QString, double > &mapReject, const QStringList &lExcludeChs=QStringList())
Background worker thread that accumulates and averages epochs in real time.
bool controlValuesChanged()
void emitEvoked(double dTriggerType, QStringList &lResponsibleTriggerTypes)
void setArtifactReduction(const QMap< QString, double > &mapThresholds)
void fillFrontBuffer(const Eigen::MatrixXd &data, double dTriggerType)
qint32 m_iNewTriggerIndex
qint32 m_iPostStimSamples
FIFFLIB::FiffInfo::SPtr m_pFiffInfo
qint32 m_iNewPreStimSamples
QPair< float, float > m_pairBaselineSec
void setAverageNumber(qint32 numAve)
QMap< double, bool > m_mapFillingBackBuffer
void setTriggerChIndx(qint32 idx)
RtAveragingWorker(quint32 numAverages, quint32 iPreStimSamples, quint32 iPostStimSamples, quint32 iBaselineFromMSecs, quint32 iBaselineToMSecs, quint32 iTriggerIndex, FIFFLIB::FiffInfo::SPtr pFiffInfo)
QPair< float, float > m_pairBaselineSamp
void setBaselineTo(int toSamp, int toMSec)
bool m_bActivateThreshold
FIFFLIB::FiffEvokedSet m_stimEvokedSet
void doAveraging(const Eigen::MatrixXd &rawSegment)
qint32 m_iNewPostStimSamples
QMap< double, Eigen::MatrixXd > m_mapDataPre
QMap< double, QList< Eigen::MatrixXd > > m_mapStimAve
QMap< double, qint32 > m_mapMatDataPostIdx
void setBaselineActive(bool activate)
void doWork(const Eigen::MatrixXd &matData)
QMap< double, Eigen::MatrixXd > m_mapDataPost
void setPostStim(qint32 samples, qint32 secs)
float m_fTriggerThreshold
QMap< QString, double > m_mapThresholds
void resultReady(const FIFFLIB::FiffEvokedSet &evokedStimSet, const QStringList &lResponsibleTriggerTypes)
void fillBackBuffer(const Eigen::MatrixXd &data, double dTriggerType)
void setBaselineFrom(int fromSamp, int fromMSec)
void setPreStim(qint32 samples, qint32 secs)
bool m_bDoBaselineCorrection
void mergeData(double dTriggerType)
void generateEvoked(double dTriggerType)
void averageBaselineToChanged(int toSamp, int toMSec)
void setBaselineFrom(int fromSamp, int fromMSec)
void averageBaselineActiveChanged(bool activate)
RtAveraging(quint32 numAverages, quint32 iPreStimSamples, quint32 iPostStimSamples, quint32 iBaselineFromSecs, quint32 iBaselineToSecs, quint32 iTriggerIndex, FIFFLIB::FiffInfo::SPtr pFiffInfo, QObject *parent=0)
void setPreStim(qint32 samples, qint32 secs)
void averagePostStimChanged(qint32 samples, qint32 secs)
void setBaselineTo(int toSamp, int toMSec)
void averageNumberChanged(qint32 numAve)
void averagePreStimChanged(qint32 samples, qint32 secs)
void setAverageNumber(qint32 numAve)
void append(const Eigen::MatrixXd &data)
void averageArtifactReductionChanged(const QMap< QString, double > &mapThresholds)
void handleResults(const FIFFLIB::FiffEvokedSet &evokedStimSet, const QStringList &lResponsibleTriggerTypes)
void setPostStim(qint32 samples, qint32 secs)
void setTriggerChIndx(qint32 idx)
void setBaselineActive(bool activate)
void setArtifactReduction(const QMap< QString, double > &mapThresholds)
void evokedStim(const FIFFLIB::FiffEvokedSet &evokedStimSet, const QStringList &lResponsibleTriggerTypes)
void averageBaselineFromChanged(int fromSamp, int fromMSec)
void averageTriggerChIdxChanged(qint32 idx)
void restart(quint32 numAverages, quint32 iPreStimSamples, quint32 iPostStimSamples, quint32 iBaselineFromSecs, quint32 iBaselineToSecs, quint32 iTriggerIndex, FIFFLIB::FiffInfo::SPtr pFiffInfo)
void averageResetRequested()
void operate(const Eigen::MatrixXd &matData)
static Eigen::MatrixXd rescale(const Eigen::MatrixXd &data, const Eigen::RowVectorXf ×, const QPair< float, float > &baseline, QString mode)