47 const QMap<QString, std::shared_ptr<BrainSurface>>& surfaces)
50 qDebug() <<
"RtSensorStreamManager: Real-time sensor streaming already active";
56 qWarning() <<
"RtSensorStreamManager: Cannot start sensor streaming — no evoked data loaded";
61 std::shared_ptr<Eigen::MatrixXf> mappingMat;
65 if (
modality == QStringLiteral(
"MEG")) {
69 }
else if (
modality == QStringLiteral(
"EEG")) {
74 qWarning() <<
"RtSensorStreamManager: Unknown modality:" <<
modality;
78 if (!mappingMat || mappingMat->rows() == 0 || pick.size() == 0) {
79 qWarning() <<
"RtSensorStreamManager: Mapping matrix not built for" <<
modality
80 <<
"— call loadSensorField() first";
84 if (surfaceKey.isEmpty() || !surfaces.contains(surfaceKey)) {
85 qWarning() <<
"RtSensorStreamManager: Target surface not found for" <<
modality
86 <<
"streaming (key:" << surfaceKey <<
")";
94 m_controller = std::make_unique<RtSensorDataController>(
this);
100 m_controller->setMappingMatrix(surfaceKey, mappingMat);
103 m_controller->setColormapType(fieldMapper.
colormap());
106 double sFreq = 1000.0;
112 m_controller->setSFreq(sFreq);
115 const int nTimePoints =
static_cast<int>(fieldMapper.
evoked().times.size());
116 qDebug() <<
"RtSensorStreamManager: Feeding" << nTimePoints <<
modality
117 <<
"sensor time points into real-time queue";
118 m_controller->clearData();
120 for (
int t = 0; t < nTimePoints; ++t) {
121 Eigen::VectorXf meas(pick.size());
122 for (
int i = 0; i < pick.size(); ++i) {
123 meas(i) =
static_cast<float>(fieldMapper.
evoked().data(pick(i), t));
125 m_controller->addData(meas);
129 m_controller->setStreamingState(
true);
130 m_isStreaming =
true;
132 qDebug() <<
"RtSensorStreamManager: Real-time sensor streaming started for" <<
modality;
144 m_controller->setStreamingState(
false);
146 m_isStreaming =
false;
147 qDebug() <<
"RtSensorStreamManager: Real-time sensor streaming stopped";
155 m_controller->addData(data);
163 m_controller->setTimeInterval(msec);
171 m_controller->setLoopState(enabled);
179 m_controller->setNumberAverages(numAvr);
187 m_controller->setColormapType(name);
Real-time MEG / EEG sensor streaming controller that orchestrates the data and field-mapping workers.
Renderable cortical / BEM mesh with interleaved vertex attributes and Qt-RHI buffer management.
Manager that wires real-time sensor data into the scene: owns the data controller,...
Builds the dense sensor-to-surface mapping matrix and the iso-contour overlay for MEG / EEG evoked da...
3-D brain visualisation using the Qt RHI rendering backend.
void setColormap(const QString &name)
RtSensorStreamManager(QObject *parent=nullptr)
~RtSensorStreamManager() override
void colorsAvailable(const QString &surfaceKey, const QVector< uint32_t > &colors)
void setInterval(int msec)
void setAverages(int numAvr)
void pushData(const Eigen::VectorXf &data)
bool startStreaming(const QString &modality, const SensorFieldMapper &fieldMapper, const QMap< QString, std::shared_ptr< BrainSurface > > &surfaces)
void setLooping(bool enabled)
Sensor-to-surface field mapper that interpolates MEG/EEG measurements onto cortical meshes and genera...
const Eigen::VectorXi & megPick() const
const Eigen::VectorXi & eegPick() const
const QString & eegSurfaceKey() const
std::shared_ptr< Eigen::MatrixXf > eegMapping() const
const QString & megSurfaceKey() const
std::shared_ptr< Eigen::MatrixXf > megMapping() const
const FIFFLIB::FiffEvoked & evoked() const
const QString & colormap() const
void newSensorColorsAvailable(const QString &surfaceKey, const QVector< uint32_t > &colors)