Skip to content

Commit c448df8

Browse files
committed
ENH: rolling queue of data comined into single matrix for processing
1 parent 9b2b9df commit c448df8

File tree

7 files changed

+186
-11
lines changed

7 files changed

+186
-11
lines changed

applications/mne_scan/libs/scMeas/realtimetimefrequency.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,20 @@
5050
// EIGEN INCLUDES
5151
//=============================================================================================================
5252

53+
#include <Eigen/Core>
54+
5355
//=============================================================================================================
5456
// FORWARD DECLARATIONS
5557
//=============================================================================================================
5658

59+
namespace FIFFLIB {
60+
class FiffInfo;
61+
}
62+
63+
//=============================================================================================================
64+
// DEFINE NAMESPACE SCMEASLIB
65+
//=============================================================================================================
66+
5767
namespace SCMEASLIB
5868
{
5969

@@ -62,6 +72,11 @@ class SCMEASSHARED_EXPORT RealTimeTimeFrequency : public Measurement
6272
Q_OBJECT
6373
public:
6474
RealTimeTimeFrequency();
75+
76+
Eigen::MatrixXcd m_matData;
77+
QSharedPointer<FIFFLIB::FiffInfo> m_pFiffInfo; /**< Fiff info */
78+
79+
6580
};
6681
}//namespace
6782
#endif // REALTIMETIMEFREQUENCY_H

applications/mne_scan/libs/scShared/Management/displaymanager.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,15 @@ QWidget* DisplayManager::show(AbstractPlugin::OutputConnectorList &outputConnect
185185
vboxLayout->addWidget(fsWidget);
186186
fsWidget->init();
187187
} else if (pPluginOutputConnector.dynamicCast< PluginOutputData<RealTimeTimeFrequency> >()) {
188-
RealTimeTimeFrequencyWidget* tfWidget = new RealTimeTimeFrequencyWidget(pRealTimeFrequency, pT, newDisp);
188+
RealTimeTimeFrequencyWidget* tfWidget = new RealTimeTimeFrequencyWidget(pT, newDisp);
189189

190+
qListActions.append(tfWidget->getDisplayActions());
191+
192+
connect(pPluginOutputConnector.data(), &PluginOutputConnector::notify,
193+
tfWidget, &RealTimeTimeFrequencyWidget::update, Qt::BlockingQueuedConnection);
194+
195+
vboxLayout->addWidget(tfWidget);
196+
tfWidget->init();
190197
}
191198
}
192199

applications/mne_scan/plugins/timefrequency/timefrequency.cpp

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343

4444
#include <scMeas/realtimeevokedset.h>
4545
#include <scMeas/realtimetimefrequency.h>
46+
#include <scMeas/realtimemultisamplearray.h>
47+
48+
#include <iostream>
4649

4750
//=============================================================================================================
4851
// QT INCLUDES
@@ -69,6 +72,7 @@ using namespace UTILSLIB;
6972

7073
TimeFrequency::TimeFrequency()
7174
: m_pCircularEvokedBuffer(CircularBuffer<FIFFLIB::FiffEvoked>::SPtr::create(40))
75+
, m_iDataQueueBlockSize(25)
7276
{
7377
}
7478

@@ -142,6 +146,10 @@ QWidget* TimeFrequency::setupWidget()
142146
void TimeFrequency::update(SCMEASLIB::Measurement::SPtr pMeasurement)
143147
{
144148
if(QSharedPointer<RealTimeEvokedSet> pRTES = pMeasurement.dynamicCast<RealTimeEvokedSet>()) {
149+
if(!m_pFiffInfo) {
150+
m_pFiffInfo = pRTES->info();
151+
}
152+
145153
FIFFLIB::FiffEvokedSet::SPtr pFiffEvokedSet = pRTES->getValue();
146154

147155
if(this->isRunning()) {
@@ -152,17 +160,44 @@ void TimeFrequency::update(SCMEASLIB::Measurement::SPtr pMeasurement)
152160
}
153161
}
154162
}
163+
if(QSharedPointer<RealTimeMultiSampleArray> pRTMSA = pMeasurement.dynamicCast<RealTimeMultiSampleArray>()) {
164+
//Fiff information
165+
if(!m_pFiffInfo) {
166+
m_pFiffInfo = pRTMSA->info();
167+
}
168+
169+
// if (!m_pRTTF){
170+
// }
171+
172+
if (m_pFiffInfo){
173+
QMutexLocker locker(&m_qMutex);
174+
for(unsigned char i = 0; i < pRTMSA->getMultiSampleArray().size(); ++i) {
175+
// Please note that we do not need a copy here since this function will block until
176+
// the buffer accepts new data again. Hence, the data is not deleted in the actual
177+
// Measurement function after it emitted the notify signal.
178+
m_DataQueue.push_back(pRTMSA->getMultiSampleArray()[i]);
179+
// while(!m_pCircularTimeSeriesBuffer->push(pRTMSA->getMultiSampleArray()[i])) {
180+
// //Do nothing until the circular buffer is ready to accept new data again
181+
// }
182+
}
183+
}
184+
}
155185
}
156186

157187
//=============================================================================================================
158188

159189
void TimeFrequency::init()
160190
{
161191
// Input
162-
m_pTimeFrequencyInput = PluginInputData<RealTimeEvokedSet>::create(this, "TfIn", "Time frequency input data");
192+
m_pTimeFrequencyEvokedInput = PluginInputData<RealTimeEvokedSet>::create(this, "TfEvokedIn", "Time frequency input data");
193+
connect(m_pTimeFrequencyEvokedInput.data(), &PluginInputConnector::notify,
194+
this, &TimeFrequency::update, Qt::DirectConnection);
195+
m_inputConnectors.append(m_pTimeFrequencyEvokedInput);
163196

164-
connect(m_pTimeFrequencyInput.data(), &PluginInputConnector::notify,
197+
m_pTimeFrequencyTimeSeriesInput = PluginInputData<RealTimeMultiSampleArray>::create(this, "TfTimeSeiresIn", "Time frequency input data");
198+
connect(m_pTimeFrequencyTimeSeriesInput.data(), &PluginInputConnector::notify,
165199
this, &TimeFrequency::update, Qt::DirectConnection);
200+
m_inputConnectors.append(m_pTimeFrequencyTimeSeriesInput);
166201

167202
//Output
168203
m_pTimeFrequencyOutput = PluginOutputData<RealTimeTimeFrequency>::create(this, "TfOut", "Time frequency output data");
@@ -187,14 +222,46 @@ void TimeFrequency::run()
187222
QStringList lResponsibleTriggerTypes;
188223

189224
while(!isInterruptionRequested()){
190-
if(m_pCircularEvokedBuffer->pop(evoked)) {
225+
if(m_DataQueue.size() > m_iDataQueueBlockSize){
226+
QMutexLocker locker(&m_qMutex);
227+
228+
computeTimeFrequency();
229+
230+
while(m_DataQueue.size() > m_iDataQueueBlockSize){
231+
m_DataQueue.pop_front();
232+
}
233+
}
234+
// if(m_pCircularEvokedBuffer->pop(evoked)) {
191235
// m_qMutex.lock();
192236
// lResponsibleTriggerTypes = m_lResponsibleTriggerTypes;
193237
// m_qMutex.unlock();
194238

195239
// m_pTimeFrequencyOutput->measurementData()->setValue(evokedSet,
196240
// m_pFiffInfo,
197241
// lResponsibleTriggerTypes);
198-
}
242+
// }
199243
}
200244
}
245+
246+
//=============================================================================================================
247+
248+
void TimeFrequency::computeTimeFrequency()
249+
{
250+
int iCols = 0;
251+
252+
std::cout<< "First matrix r:" << m_DataQueue.front().rows() << " | c: " << m_DataQueue.front().cols() << std::endl;
253+
254+
for (auto mat : m_DataQueue){
255+
iCols += mat.cols();
256+
}
257+
258+
std::cout << "COLS: " << iCols << std::endl;
259+
260+
Eigen::MatrixXd dataMat(m_DataQueue.front().rows(), iCols);
261+
262+
for (auto mat : m_DataQueue){
263+
dataMat << mat;
264+
}
265+
266+
std::cout << "New Matrix - r: " << dataMat.rows() << " | c: " << dataMat.cols() << std::endl;
267+
}

applications/mne_scan/plugins/timefrequency/timefrequency.h

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,33 @@
4646

4747
#include <fiff/fiff_evoked_set.h>
4848

49+
#include <deque>
50+
4951
//=============================================================================================================
5052
// QT INCLUDES
5153
//=============================================================================================================
5254

55+
#include <QFuture>
56+
#include <QFutureWatcher>
57+
58+
//=============================================================================================================
59+
// EIGEN INCLUDES
60+
//=============================================================================================================
61+
62+
#include <Eigen/Core>
63+
5364
//=============================================================================================================
5465
// FORWARD DECLARATIONS
5566
//=============================================================================================================
5667

5768
namespace SCMEASLIB{
5869
class RealTimeEvokedSet;
5970
class RealTimeTimeFrequency;
71+
class RealTimeMultiSampleArray;
72+
}
73+
74+
namespace RTPROCESSINGLIB{
75+
class RtTimeFrequency;
6076
}
6177

6278
//=============================================================================================================
@@ -126,17 +142,29 @@ class TIMEFREQUENCYSHARED_EXPORT TimeFrequency : public SCSHAREDLIB::AbstractAlg
126142
private:
127143
virtual void run();
128144

129-
SCSHAREDLIB::PluginInputData<SCMEASLIB::RealTimeEvokedSet>::SPtr m_pTimeFrequencyInput; /**< The RealTimeSampleArray of the TimeFrequency input.*/
130-
SCSHAREDLIB::PluginOutputData<SCMEASLIB::RealTimeTimeFrequency>::SPtr m_pTimeFrequencyOutput; /**< The RealTimeEvoked of the TimeFrequency output.*/
145+
void computeTimeFrequency();
146+
147+
SCSHAREDLIB::PluginInputData<SCMEASLIB::RealTimeMultiSampleArray>::SPtr m_pTimeFrequencyTimeSeriesInput; /**< The RealTimeMultiSampleArray of the NoiseReduction input.*/
148+
SCSHAREDLIB::PluginInputData<SCMEASLIB::RealTimeEvokedSet>::SPtr m_pTimeFrequencyEvokedInput; /**< The RealTimeSampleArray of the TimeFrequency input.*/
149+
SCSHAREDLIB::PluginOutputData<SCMEASLIB::RealTimeTimeFrequency>::SPtr m_pTimeFrequencyOutput; /**< The RealTimeEvoked of the TimeFrequency output.*/
150+
151+
QSharedPointer<UTILSLIB::CircularBuffer<FIFFLIB::FiffEvoked>> m_pCircularEvokedBuffer; /**< Holds incoming RealTimeMultiSampleArray data.*/
152+
QSharedPointer<UTILSLIB::CircularBuffer_Matrix_double> m_pCircularTimeSeriesBuffer; /**< Holds incoming raw data. */
153+
154+
QSharedPointer<RTPROCESSINGLIB::RtTimeFrequency> m_pRTTF;
155+
156+
QMutex m_qMutex; /**< Provides access serialization between threads. */
131157

132-
QSharedPointer<UTILSLIB::CircularBuffer<FIFFLIB::FiffEvoked>> m_pCircularEvokedBuffer; /**< Holds incoming RealTimeMultiSampleArray data.*/
158+
FIFFLIB::FiffInfo::SPtr m_pFiffInfo; /**< Fiff measurement info.*/
133159

134-
QMutex m_qMutex; /**< Provides access serialization between threads. */
160+
std::deque<Eigen::MatrixXd> m_DataQueue;
135161

136-
FIFFLIB::FiffInfo::SPtr m_pFiffInfo; /**< Fiff measurement info.*/
162+
QMap<QString,int> m_mapStimChsIndexNames; /**< The currently available stim channels and their corresponding index in the data. */
137163

138-
QMap<QString,int> m_mapStimChsIndexNames; /**< The currently available stim channels and their corresponding index in the data. */
164+
QFuture<Eigen::MatrixXcd> m_Future;
165+
QFutureWatcher<Eigen::MatrixXcd> m_FutureWatcher;
139166

167+
int m_iDataQueueBlockSize;
140168
signals:
141169

142170
};

libraries/rtprocessing/rtprocessing.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ SOURCES += \
8888
rthpis.cpp \
8989
filter.cpp \
9090
rtconnectivity.cpp \
91+
rttimefrequency.cpp \
9192
sphara.cpp \
9293
detecttrigger.cpp \
9394
helpers/cosinefilter.cpp \
@@ -107,6 +108,7 @@ HEADERS += \
107108
rthpis.h \
108109
filter.h \
109110
detecttrigger.h \
111+
rttimefrequency.h \
110112
sphara.h \
111113
rtconnectivity.h \
112114
helpers/cosinefilter.h \
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include "rttimefrequency.h"
2+
3+
using namespace RTPROCESSINGLIB;
4+
5+
RtTimeFrequency::RtTimeFrequency()
6+
{
7+
8+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#ifndef RTTIMEFREQUENCY_H
2+
#define RTTIMEFREQUENCY_H
3+
4+
//=============================================================================================================
5+
// INCLUDES
6+
//=============================================================================================================
7+
8+
#include "rtprocessing_global.h"
9+
10+
#include <fiff/fiff_evoked_set.h>
11+
#include <fiff/fiff_info.h>
12+
13+
//=============================================================================================================
14+
// QT INCLUDES
15+
//=============================================================================================================
16+
17+
#include <QSharedPointer>
18+
#include <QObject>
19+
20+
//=============================================================================================================
21+
// EIGEN INCLUDES
22+
//=============================================================================================================
23+
24+
#include <Eigen/Core>
25+
26+
//=============================================================================================================
27+
// FORWARD DECLARATIONS
28+
//=============================================================================================================
29+
30+
//=============================================================================================================
31+
// DEFINE NAMESPACE RTPROCESSINGLIB
32+
//=============================================================================================================
33+
34+
namespace RTPROCESSINGLIB
35+
{
36+
37+
//=============================================================================================================
38+
// RTPROCESSINGLIB FORWARD DECLARATIONS
39+
//=============================================================================================================
40+
41+
42+
class RtTimeFrequency : public QObject
43+
{
44+
public:
45+
RtTimeFrequency();
46+
};
47+
}//namespace
48+
#endif // RTTIMEFREQUENCY_H

0 commit comments

Comments
 (0)