v2.0.0
Loading...
Searching...
No Matches
connectivitysettings.cpp
Go to the documentation of this file.
1//=============================================================================================================
20
21//=============================================================================================================
22// INCLUDES
23//=============================================================================================================
24
26
28#include <fs/fs_surfaceset.h>
29#include <fiff/fiff_info.h>
30
31//=============================================================================================================
32// QT INCLUDES
33//=============================================================================================================
34
35#include <QCommandLineParser>
36#include <QElapsedTimer>
37#include <QDebug>
38
39//=============================================================================================================
40// EIGEN INCLUDES
41//=============================================================================================================
42
43//=============================================================================================================
44// USED NAMESPACES
45//=============================================================================================================
46
47using namespace CONNECTIVITYLIB;
48using namespace MNELIB;
49using namespace Eigen;
50using namespace FIFFLIB;
51using namespace FSLIB;
52
53//=============================================================================================================
54// DEFINE GLOBAL METHODS
55//=============================================================================================================
56
57//=============================================================================================================
58// DEFINE MEMBER METHODS
59//=============================================================================================================
60
63, m_fSFreq(1000.0f)
64, m_sWindowType("hanning")
65{
67 qRegisterMetaType<CONNECTIVITYLIB::ConnectivitySettings>("CONNECTIVITYLIB::ConnectivitySettings");
68}
69
70//*******************************************************************************************************
71
78
79//*******************************************************************************************************
80
82{
83 for (int i = 0; i < m_trialData.size(); ++i) {
84 m_trialData[i].matPsd.resize(0,0);
85 m_trialData[i].vecPairCsd.clear();
86 m_trialData[i].vecTapSpectra.clear();
87 m_trialData[i].vecPairCsdNormalized.clear();
88 m_trialData[i].vecPairCsdImagSign.clear();
89 m_trialData[i].vecPairCsdImagAbs.clear();
90 m_trialData[i].vecPairCsdImagSqrd.clear();
91 }
92
93 m_intermediateSumData.matPsdSum.resize(0,0);
94 m_intermediateSumData.vecPairCsdSum.clear();
95 m_intermediateSumData.vecPairCsdNormalizedSum.clear();
96 m_intermediateSumData.vecPairCsdImagSignSum.clear();
97 m_intermediateSumData.vecPairCsdImagAbsSum.clear();
98 m_intermediateSumData.vecPairCsdImagSqrdSum.clear();
99}
100
101//*******************************************************************************************************
102
103void ConnectivitySettings::append(const QList<MatrixXd>& matInputData)
104{
105 for(int i = 0; i < matInputData.size(); ++i) {
106 this->append(matInputData.at(i));
107 }
108}
109
110//*******************************************************************************************************
111
112void ConnectivitySettings::append(const MatrixXd& matInputData)
113{
114 ConnectivitySettings::IntermediateTrialData tempData;
115 tempData.matData = matInputData;
116
117 m_trialData.append(tempData);
118}
119
120//*******************************************************************************************************
121
123{
124 m_trialData.append(inputData);
125}
126
127//*******************************************************************************************************
128
133
134//*******************************************************************************************************
135
137{
138 return m_trialData.size();
139}
140
141//*******************************************************************************************************
142
144{
145 return m_trialData.isEmpty();
146}
147
148//*******************************************************************************************************
149
151{
152// QElapsedTimer timer;
153// qint64 iTime = 0;
154// timer.start();
155
156 if(m_trialData.isEmpty()) {
157 qDebug() << "ConnectivitySettings::removeFirst - No elements to delete. Returning.";
158 return;
159 }
160
161 if(m_trialData.size() < iAmount) {
162 qDebug() << "ConnectivitySettings::removeFirst - Not enough elements stored in list in order to delete them. Returning.";
163 return;
164 }
165
166 // Substract influence of trials from overall summed up intermediate data and remove from data list
167 for (int j = 0; j < iAmount; ++j) {
168 for (int i = 0; i < m_trialData.first().matData.rows(); ++i) {
169 if(i < m_intermediateSumData.vecPairCsdSum.size() && (m_intermediateSumData.vecPairCsdSum.size() == m_trialData.first().vecPairCsd.size())) {
170 m_intermediateSumData.vecPairCsdSum[i].second -= m_trialData.first().vecPairCsd.at(i).second;
171 }
172 if(i < m_intermediateSumData.vecPairCsdNormalizedSum.size() && (m_intermediateSumData.vecPairCsdNormalizedSum.size() == m_trialData.first().vecPairCsdNormalized.size())) {
173 m_intermediateSumData.vecPairCsdNormalizedSum[i].second -= m_trialData.first().vecPairCsdNormalized.at(i).second;
174 }
175 if(i < m_intermediateSumData.vecPairCsdImagSignSum.size() && (m_intermediateSumData.vecPairCsdImagSignSum.size() == m_trialData.first().vecPairCsdImagSign.size())) {
176 m_intermediateSumData.vecPairCsdImagSignSum[i].second -= m_trialData.first().vecPairCsdImagSign.at(i).second;
177 }
178 if(i < m_intermediateSumData.vecPairCsdImagAbsSum.size() && (m_intermediateSumData.vecPairCsdImagAbsSum.size() == m_trialData.first().vecPairCsdImagAbs.size())) {
179 m_intermediateSumData.vecPairCsdImagAbsSum[i].second -= m_trialData.first().vecPairCsdImagAbs.at(i).second;
180 }
181 if(i < m_intermediateSumData.vecPairCsdImagSqrdSum.size() && (m_intermediateSumData.vecPairCsdImagSqrdSum.size() == m_trialData.first().vecPairCsdImagSqrd.size())) {
182 m_intermediateSumData.vecPairCsdImagSqrdSum[i].second -= m_trialData.first().vecPairCsdImagSqrd.at(i).second;
183 }
184 }
185
186 if(m_intermediateSumData.matPsdSum.rows() == m_trialData.first().matPsd.rows() &&
187 m_intermediateSumData.matPsdSum.cols() == m_trialData.first().matPsd.cols() ) {
188 m_intermediateSumData.matPsdSum -= m_trialData.first().matPsd;
189 }
190
191 m_trialData.removeFirst();
192 }
193
194// iTime = timer.elapsed();
195// qDebug() << "ConnectivitySettings::removeFirst" << iTime;
196// timer.restart();
197}
198
199//*******************************************************************************************************
200
202{
203// QElapsedTimer timer;
204// qint64 iTime = 0;
205// timer.start();
206
207 if(m_trialData.isEmpty()) {
208 qDebug() << "ConnectivitySettings::removeLast - No elements to delete. Returning.";
209 return;
210 }
211
212 if(m_trialData.size() < iAmount) {
213 qDebug() << "ConnectivitySettings::removeLast - Not enough elements stored in list in order to delete them. Returning.";
214 return;
215 }
216
217 // Substract influence of trials from overall summed up intermediate data and remove from data list
218 for (int j = 0; j < iAmount; ++j) {
219 for (int i = 0; i < m_trialData.last().matData.rows(); ++i) {
220 if(i < m_intermediateSumData.vecPairCsdSum.size() && (m_intermediateSumData.vecPairCsdSum.size() == m_trialData.last().vecPairCsd.size())) {
221 m_intermediateSumData.vecPairCsdSum[i].second -= m_trialData.last().vecPairCsd.at(i).second;
222 }
223 if(i < m_intermediateSumData.vecPairCsdNormalizedSum.size() && (m_intermediateSumData.vecPairCsdNormalizedSum.size() == m_trialData.last().vecPairCsdNormalized.size())) {
224 m_intermediateSumData.vecPairCsdNormalizedSum[i].second -= m_trialData.last().vecPairCsdNormalized.at(i).second;
225 }
226 if(i < m_intermediateSumData.vecPairCsdImagSignSum.size() && (m_intermediateSumData.vecPairCsdImagSignSum.size() == m_trialData.last().vecPairCsdImagSign.size())) {
227 m_intermediateSumData.vecPairCsdImagSignSum[i].second -= m_trialData.last().vecPairCsdImagSign.at(i).second;
228 }
229 if(i < m_intermediateSumData.vecPairCsdImagAbsSum.size() && (m_intermediateSumData.vecPairCsdImagAbsSum.size() == m_trialData.last().vecPairCsdImagAbs.size())) {
230 m_intermediateSumData.vecPairCsdImagAbsSum[i].second -= m_trialData.last().vecPairCsdImagAbs.at(i).second;
231 }
232 if(i < m_intermediateSumData.vecPairCsdImagSqrdSum.size() && (m_intermediateSumData.vecPairCsdImagSqrdSum.size() == m_trialData.last().vecPairCsdImagSqrd.size())) {
233 m_intermediateSumData.vecPairCsdImagSqrdSum[i].second -= m_trialData.last().vecPairCsdImagSqrd.at(i).second;
234 }
235 }
236
237 if(m_intermediateSumData.matPsdSum.rows() == m_trialData.last().matPsd.rows() &&
238 m_intermediateSumData.matPsdSum.cols() == m_trialData.last().matPsd.cols() ) {
239 m_intermediateSumData.matPsdSum -= m_trialData.last().matPsd;
240 }
241
242 m_trialData.removeLast();
243 }
244
245// iTime = timer.elapsed();
246// qDebug() << "ConnectivitySettings::removeLast" << iTime;
247// timer.restart();
248}
249
250//*******************************************************************************************************
251
252void ConnectivitySettings::setConnectivityMethods(const QStringList& sConnectivityMethods)
253{
254 m_sConnectivityMethods = sConnectivityMethods;
255}
256
257//*******************************************************************************************************
258
260{
262}
263
264//*******************************************************************************************************
265
267{
268 if(m_fSFreq == iSFreq) {
269 return;
270 }
271
273
274 m_fSFreq = iSFreq;
275
276 if(m_fFreqResolution != 0.0f) {
278 }
279}
280
281//*******************************************************************************************************
282
284{
285 return m_fSFreq;
286}
287
288//*******************************************************************************************************
289
291{
292 if(iNfft == 0) {
293 return;
294 }
295
297
298 m_iNfft = iNfft;
300}
301
302//*******************************************************************************************************
303
305{
306 return m_iNfft;
307}
308
309//*******************************************************************************************************
310
311void ConnectivitySettings::setWindowType(const QString& sWindowType)
312{
313 // Clear all intermediate data since this will have an effect on the frequency calculation
315
316 m_sWindowType = sWindowType;
317}
318
319//*******************************************************************************************************
320
322{
323 return m_sWindowType;
324}
325
326//*******************************************************************************************************
327
329 const RowVectorXi& picks)
330{
331 m_matNodePositions.resize(picks.cols(),3);
332
333 qint32 kind;
334 for(int i = 0; i < picks.cols(); ++i) {
335 kind = fiffInfo.chs.at(i).kind;
336 if(kind == FIFFV_EEG_CH ||
337 kind == FIFFV_MEG_CH) {
338 m_matNodePositions(i,0) = fiffInfo.chs.at(picks(i)).chpos.r0(0);
339 m_matNodePositions(i,1) = fiffInfo.chs.at(picks(i)).chpos.r0(1);
340 m_matNodePositions(i,2) = fiffInfo.chs.at(picks(i)).chpos.r0(2);
341 }
342 }
343}
344
345//*******************************************************************************************************
346
348{
349 //Generate node vertices
350 MatrixX3f matNodeVertLeft, matNodeVertRight;
351
352 if(forwardSolution.isClustered()) {
353 auto* lhHemi = forwardSolution.src.hemisphereAt(0);
354 auto* rhHemi = forwardSolution.src.hemisphereAt(1);
355 matNodeVertLeft.resize(lhHemi->cluster_info.centroidVertno.size(),3);
356 for(int j = 0; j < matNodeVertLeft.rows(); ++j) {
357 matNodeVertLeft.row(j) = surfSet[0].rr().row(lhHemi->cluster_info.centroidVertno.at(j)) - surfSet[0].offset().transpose();
358 }
359
360 matNodeVertRight.resize(rhHemi->cluster_info.centroidVertno.size(),3);
361 for(int j = 0; j < matNodeVertRight.rows(); ++j) {
362 matNodeVertRight.row(j) = surfSet[1].rr().row(rhHemi->cluster_info.centroidVertno.at(j)) - surfSet[1].offset().transpose();
363 }
364 } else {
365 matNodeVertLeft.resize(forwardSolution.src[0].vertno.rows(),3);
366 for(int j = 0; j < matNodeVertLeft.rows(); ++j) {
367 matNodeVertLeft.row(j) = surfSet[0].rr().row(forwardSolution.src[0].vertno(j)) - surfSet[0].offset().transpose();
368 }
369
370 matNodeVertRight.resize(forwardSolution.src[1].vertno.rows(),3);
371 for(int j = 0; j < matNodeVertRight.rows(); ++j) {
372 matNodeVertRight.row(j) = surfSet[1].rr().row(forwardSolution.src[1].vertno(j)) - surfSet[1].offset().transpose();
373 }
374 }
375
376 m_matNodePositions.resize(matNodeVertLeft.rows()+matNodeVertRight.rows(),3);
377 m_matNodePositions << matNodeVertLeft, matNodeVertRight;
378}
379
380//*******************************************************************************************************
381
382void ConnectivitySettings::setNodePositions(const MatrixX3f& matNodePositions)
383{
384 m_matNodePositions = matNodePositions;
385}
386
387//*******************************************************************************************************
388
390{
391 return m_matNodePositions;
392}
393
394//*******************************************************************************************************
395
396QList<ConnectivitySettings::IntermediateTrialData>& ConnectivitySettings::getTrialData()
397{
398 return m_trialData;
399}
400
401//*******************************************************************************************************
402
Bi-hemispheric grouping of FreeSurfer surfaces (lh + rh) loaded as a single object.
Forward solution (gain matrix mapping source dipoles to sensor measurements).
Input-data and parameter container shared by every functional-connectivity metric in CONNECTIVITYLIB.
#define FIFFV_EEG_CH
#define FIFFV_MEG_CH
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
Functional connectivity metrics (coherence, PLV, cross-correlation, etc.).
Core MNE data structures (source spaces, source estimates, hemispheres).
FreeSurfer surface, annotation and parcellation I/O for mne-cpp.
FIFF file I/O, in-memory data structures and high-level readers/writers.
QList< IntermediateTrialData > & getTrialData()
void setConnectivityMethods(const QStringList &sConnectivityMethods)
const QStringList & getConnectivityMethods() const
const IntermediateTrialData & at(int i) const
void setWindowType(const QString &sWindowType)
void setNodePositions(const FIFFLIB::FiffInfo &fiffInfo, const Eigen::RowVectorXi &picks)
void append(const QList< Eigen::MatrixXd > &matInputData)
QList< IntermediateTrialData > m_trialData
const Eigen::MatrixX3f & getNodePositions() const
Per-trial intermediate frequency-domain data used during connectivity computation.
Accumulated cross-spectral and auto-spectral sums across trials for final metric normalization.
Full FIFF measurement info: per-channel descriptors, sampling and filter setup, projectors,...
Definition fiff_info.h:88
QList< FiffChInfo > chs
Container holding the lh and/or rh FsSurface for one subject and one surface kind.
In-memory representation of an -fwd.fif forward solution.
MNELIB::MNESourceSpaces src
MNEHemisphere * hemisphereAt(qint32 idx)