v2.0.0
Loading...
Searching...
No Matches
rt_cov.cpp
Go to the documentation of this file.
1//=============================================================================================================
36
37//=============================================================================================================
38// INCLUDES
39//=============================================================================================================
40
41#include "rt_cov.h"
42
43//=============================================================================================================
44// QT INCLUDES
45//=============================================================================================================
46
47#include <QDebug>
48#include <QtConcurrent>
49
50//=============================================================================================================
51// STL INCLUDES
52//=============================================================================================================
53
54#include <iostream>
55
56//=============================================================================================================
57// USED NAMESPACES
58//=============================================================================================================
59
60using namespace RTPROCESSINGLIB;
61using namespace FIFFLIB;
62using namespace Eigen;
63
64//=============================================================================================================
65// DEFINE MEMBER METHODS
66//=============================================================================================================
67
68RtCov::RtCov(QSharedPointer<FIFFLIB::FiffInfo> pFiffInfo)
69: m_fiffInfo(*pFiffInfo)
70, m_iSamples(0)
71, m_bPicksReady(false)
72{
73}
74
75//=============================================================================================================
76
77FiffCov RtCov::estimateCovariance(const Eigen::MatrixXd& matData,
78 int iNewMaxSamples)
79{
80 if(m_fiffInfo.chs.isEmpty()) {
81 qWarning() << "[RtCov::estimateCovariance] FiffInfo was not set. Returning empty covariance estimation.";
82 return FiffCov();
83 }
84
85 // Compute picks once: select only MEG and EEG channels
86 if(!m_bPicksReady) {
87 m_picks.clear();
88 for(int i = 0; i < m_fiffInfo.chs.size(); i++) {
89 if(m_fiffInfo.chs.at(i).kind == FIFFV_MEG_CH ||
90 m_fiffInfo.chs.at(i).kind == FIFFV_EEG_CH) {
91 m_picks.append(i);
92 }
93 }
94 m_bPicksReady = true;
95 }
96
97 // Apply picks: extract only MEG/EEG channel rows
98 if(!m_picks.isEmpty() && m_picks.size() < matData.rows()) {
99 MatrixXd matPicked(m_picks.size(), matData.cols());
100 for(int i = 0; i < m_picks.size(); i++) {
101 matPicked.row(i) = matData.row(m_picks[i]);
102 }
103 m_lData.append(matPicked);
104 } else {
105 m_lData.append(matData);
106 }
107 m_iSamples += matData.cols();
108
109 if(m_iSamples < iNewMaxSamples) {
110 return FiffCov();
111 }
112
113 QFuture<RtCovComputeResult> result = QtConcurrent::mappedReduced(m_lData,
114 compute,
115 reduce);
116
117 result.waitForFinished();
118
119 RtCovComputeResult finalResult = result.result();
120
121 //Final computation
122 FiffCov computedCov;
123 computedCov.data = finalResult.matData;
124
125 bool doProj = true;
126
127 if(m_iSamples > 0) {
128 finalResult.mu /= (float)m_iSamples;
129 computedCov.data.array() -= m_iSamples * (finalResult.mu * finalResult.mu.transpose()).array();
130 computedCov.data.array() /= (m_iSamples - 1);
131
132 computedCov.kind = FIFFV_MNE_NOISE_COV;
133 computedCov.diag = false;
134 computedCov.dim = computedCov.data.rows();
135
136 // Set names to picked channels only
137 QStringList pickedNames;
138 if(!m_picks.isEmpty() && m_picks.size() < m_fiffInfo.ch_names.size()) {
139 for(int i = 0; i < m_picks.size(); i++) {
140 pickedNames << m_fiffInfo.ch_names.at(m_picks[i]);
141 }
142 } else {
143 pickedNames = m_fiffInfo.ch_names;
144 }
145 computedCov.names = pickedNames;
146 computedCov.projs = m_fiffInfo.projs;
147 computedCov.bads = m_fiffInfo.bads;
148 computedCov.nfree = m_iSamples;
149
150 // regularize noise covariance
151 computedCov = computedCov.regularize(m_fiffInfo, 0.05, 0.05, 0.1, doProj, QStringList());
152
153// qint32 samples = rawSegment.cols();
154// VectorXf mu = rawSegment.rowwise().sum().array() / (float)samples;
155
156// MatrixXf noise_covariance = rawSegment * rawSegment.transpose();// noise_covariance == raw_covariance
157// noise_covariance.array() -= samples * (mu * mu.transpose()).array();
158// noise_covariance.array() /= (samples - 1);
159
160// std::cout << "Noise Covariance:\n" << noise_covariance.block(0,0,10,10) << std::endl;
161
162// printf("%d raw buffer (%d x %d) generated\r\n", count, tmp.rows(), tmp.cols());
163
164 m_lData.clear();
165 m_iSamples = 0;
166
167 return computedCov;
168 } else {
169 qWarning() << "[RtCov::estimateCovariance] Number of samples equals zero. Regularization not possible. Returning empty covariance estimation.";
170 return FiffCov();
171 }
172
173}
174
175//=============================================================================================================
176
177RtCovComputeResult RtCov::compute(const MatrixXd &matData)
178{
179 RtCovComputeResult result;
180 result.mu = matData.rowwise().sum();
181 result.matData = matData * matData.transpose();
182 return result;
183}
184
185//=============================================================================================================
186
187void RtCov::reduce(RtCovComputeResult& finalResult, const RtCovComputeResult &tempResult)
188{
189 if(finalResult.matData.size() == 0 || finalResult.mu.size() == 0) {
190 finalResult.mu = tempResult.mu;
191 finalResult.matData = tempResult.matData;
192 } else {
193 finalResult.mu += tempResult.mu;
194 finalResult.matData += tempResult.matData;
195 }
196}
#define FIFFV_EEG_CH
#define FIFFV_MNE_NOISE_COV
#define FIFFV_MEG_CH
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
Bundled output of a real-time covariance computation step containing the covariance matrix and sample...
Definition rt_cov.h:83
QList< Eigen::MatrixXd > m_lData
Definition rt_cov.h:132
RtCov(QSharedPointer< FIFFLIB::FiffInfo > pFiffInfo)
Definition rt_cov.cpp:68
FIFFLIB::FiffCov estimateCovariance(const Eigen::MatrixXd &matData, int iNewMaxSamples)
Definition rt_cov.cpp:77
FIFFLIB::FiffInfo m_fiffInfo
Definition rt_cov.h:134
static void reduce(RtCovComputeResult &finalResult, const RtCovComputeResult &tempResult)
Definition rt_cov.cpp:187
static RtCovComputeResult compute(const Eigen::MatrixXd &matData)
Definition rt_cov.cpp:177
QVector< int > m_picks
Definition rt_cov.h:136
covariance data
Definition fiff_cov.h:85
QList< FiffProj > projs
Definition fiff_cov.h:255
fiff_int_t nfree
Definition fiff_cov.h:257
fiff_int_t dim
Definition fiff_cov.h:252
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:327
fiff_int_t kind
Definition fiff_cov.h:249
QStringList bads
Definition fiff_cov.h:256
QStringList names
Definition fiff_cov.h:253
Eigen::MatrixXd data
Definition fiff_cov.h:254