v2.0.0
Loading...
Searching...
No Matches
rt_cov.cpp
Go to the documentation of this file.
1//=============================================================================================================
12
13//=============================================================================================================
14// INCLUDES
15//=============================================================================================================
16
17#include "rt_cov.h"
18
19//=============================================================================================================
20// QT INCLUDES
21//=============================================================================================================
22
23#include <QDebug>
24#include <QtConcurrent>
25
26//=============================================================================================================
27// STL INCLUDES
28//=============================================================================================================
29
30#include <iostream>
31
32//=============================================================================================================
33// USED NAMESPACES
34//=============================================================================================================
35
36using namespace RTPROCESSINGLIB;
37using namespace FIFFLIB;
38using namespace Eigen;
39
40//=============================================================================================================
41// DEFINE MEMBER METHODS
42//=============================================================================================================
43
44RtCov::RtCov(QSharedPointer<FIFFLIB::FiffInfo> pFiffInfo)
45: m_fiffInfo(*pFiffInfo)
46, m_iSamples(0)
47, m_bPicksReady(false)
48{
49}
50
51//=============================================================================================================
52
53FiffCov RtCov::estimateCovariance(const Eigen::MatrixXd& matData,
54 int iNewMaxSamples)
55{
56 if(m_fiffInfo.chs.isEmpty()) {
57 qWarning() << "[RtCov::estimateCovariance] FiffInfo was not set. Returning empty covariance estimation.";
58 return FiffCov();
59 }
60
61 // Compute picks once: select only MEG and EEG channels
62 if(!m_bPicksReady) {
63 m_picks.clear();
64 for(int i = 0; i < m_fiffInfo.chs.size(); i++) {
65 if(m_fiffInfo.chs.at(i).kind == FIFFV_MEG_CH ||
66 m_fiffInfo.chs.at(i).kind == FIFFV_EEG_CH) {
67 m_picks.append(i);
68 }
69 }
70 m_bPicksReady = true;
71 }
72
73 // Apply picks: extract only MEG/EEG channel rows
74 if(!m_picks.isEmpty() && m_picks.size() < matData.rows()) {
75 MatrixXd matPicked(m_picks.size(), matData.cols());
76 for(int i = 0; i < m_picks.size(); i++) {
77 matPicked.row(i) = matData.row(m_picks[i]);
78 }
79 m_lData.append(matPicked);
80 } else {
81 m_lData.append(matData);
82 }
83 m_iSamples += matData.cols();
84
85 if(m_iSamples < iNewMaxSamples) {
86 return FiffCov();
87 }
88
89 QFuture<RtCovComputeResult> result = QtConcurrent::mappedReduced(m_lData,
90 compute,
91 reduce);
92
93 result.waitForFinished();
94
95 RtCovComputeResult finalResult = result.result();
96
97 //Final computation
98 FiffCov computedCov;
99 computedCov.data = finalResult.matData;
100
101 bool doProj = true;
102
103 if(m_iSamples > 0) {
104 finalResult.mu /= (float)m_iSamples;
105 computedCov.data.array() -= m_iSamples * (finalResult.mu * finalResult.mu.transpose()).array();
106 computedCov.data.array() /= (m_iSamples - 1);
107
108 computedCov.kind = FIFFV_MNE_NOISE_COV;
109 computedCov.diag = false;
110 computedCov.dim = computedCov.data.rows();
111
112 // Set names to picked channels only
113 QStringList pickedNames;
114 if(!m_picks.isEmpty() && m_picks.size() < m_fiffInfo.ch_names.size()) {
115 for(int i = 0; i < m_picks.size(); i++) {
116 pickedNames << m_fiffInfo.ch_names.at(m_picks[i]);
117 }
118 } else {
119 pickedNames = m_fiffInfo.ch_names;
120 }
121 computedCov.names = pickedNames;
122 computedCov.projs = m_fiffInfo.projs;
123 computedCov.bads = m_fiffInfo.bads;
124 computedCov.nfree = m_iSamples;
125
126 // regularize noise covariance
127 computedCov = computedCov.regularize(m_fiffInfo, 0.05, 0.05, 0.1, doProj, QStringList());
128
129// qint32 samples = rawSegment.cols();
130// VectorXf mu = rawSegment.rowwise().sum().array() / (float)samples;
131
132// MatrixXf noise_covariance = rawSegment * rawSegment.transpose();// noise_covariance == raw_covariance
133// noise_covariance.array() -= samples * (mu * mu.transpose()).array();
134// noise_covariance.array() /= (samples - 1);
135
136// std::cout << "Noise Covariance:\n" << noise_covariance.block(0,0,10,10) << std::endl;
137
138// printf("%d raw buffer (%d x %d) generated\r\n", count, tmp.rows(), tmp.cols());
139
140 m_lData.clear();
141 m_iSamples = 0;
142
143 return computedCov;
144 } else {
145 qWarning() << "[RtCov::estimateCovariance] Number of samples equals zero. Regularization not possible. Returning empty covariance estimation.";
146 return FiffCov();
147 }
148
149}
150
151//=============================================================================================================
152
153RtCovComputeResult RtCov::compute(const MatrixXd &matData)
154{
155 RtCovComputeResult result;
156 result.mu = matData.rowwise().sum();
157 result.matData = matData * matData.transpose();
158 return result;
159}
160
161//=============================================================================================================
162
163void RtCov::reduce(RtCovComputeResult& finalResult, const RtCovComputeResult &tempResult)
164{
165 if(finalResult.matData.size() == 0 || finalResult.mu.size() == 0) {
166 finalResult.mu = tempResult.mu;
167 finalResult.matData = tempResult.matData;
168 } else {
169 finalResult.mu += tempResult.mu;
170 finalResult.matData += tempResult.matData;
171 }
172}
#define FIFFV_EEG_CH
#define FIFFV_MNE_NOISE_COV
#define FIFFV_MEG_CH
Real-time noise covariance estimation from streaming MEG / EEG data blocks.
FIFF file I/O, in-memory data structures and high-level readers/writers.
Bundled output of a real-time covariance computation step containing the covariance matrix and sample...
Definition rt_cov.h:73
QList< Eigen::MatrixXd > m_lData
Definition rt_cov.h:122
RtCov(QSharedPointer< FIFFLIB::FiffInfo > pFiffInfo)
Definition rt_cov.cpp:44
FIFFLIB::FiffCov estimateCovariance(const Eigen::MatrixXd &matData, int iNewMaxSamples)
Definition rt_cov.cpp:53
FIFFLIB::FiffInfo m_fiffInfo
Definition rt_cov.h:124
static void reduce(RtCovComputeResult &finalResult, const RtCovComputeResult &tempResult)
Definition rt_cov.cpp:163
static RtCovComputeResult compute(const Eigen::MatrixXd &matData)
Definition rt_cov.cpp:153
QVector< int > m_picks
Definition rt_cov.h:126
FIFF noise / data covariance: matrix, channel names, kind, applied projectors, bads,...
Definition fiff_cov.h:79
QList< FiffProj > projs
Definition fiff_cov.h:249
fiff_int_t nfree
Definition fiff_cov.h:251
fiff_int_t dim
Definition fiff_cov.h:246
FiffCov regularize(const FiffInfo &p_info, double p_fMag=0.1, double p_fGrad=0.1, double p_fEeg=0.1, bool p_bProj=true, QStringList p_exclude=defaultQStringList) const
Definition fiff_cov.cpp:311
fiff_int_t kind
Definition fiff_cov.h:243
QStringList bads
Definition fiff_cov.h:250
QStringList names
Definition fiff_cov.h:247
Eigen::MatrixXd data
Definition fiff_cov.h:248