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
53namespace
54{
55
56// Each pair of a trial is taken out of the matching running sum, as long as both have the same length
57template<typename T>
58void subtractPairs(QVector<QPair<int, T>>& sums, const QVector<QPair<int, T>>& trial, int rows)
59{
60 if (sums.size() != trial.size())
61 return;
62 for (int i = 0; i < rows && i < sums.size(); ++i)
63 sums[i].second -= trial.at(i).second;
64}
65
66// Removes the influence of one trial from the sums over all trials
68{
69 const int rows = static_cast<int>(trial.matData.rows());
70 subtractPairs(sums.vecPairCsdSum, trial.vecPairCsd, rows);
71 subtractPairs(sums.vecPairCsdNormalizedSum, trial.vecPairCsdNormalized, rows);
72 subtractPairs(sums.vecPairCsdImagSignSum, trial.vecPairCsdImagSign, rows);
73 subtractPairs(sums.vecPairCsdImagAbsSum, trial.vecPairCsdImagAbs, rows);
74 subtractPairs(sums.vecPairCsdImagSqrdSum, trial.vecPairCsdImagSqrd, rows);
75
76 if (sums.matPsdSum.rows() == trial.matPsd.rows() && sums.matPsdSum.cols() == trial.matPsd.cols())
77 sums.matPsdSum -= trial.matPsd;
78}
79
80} // namespace
81
82//=============================================================================================================
83// DEFINE GLOBAL METHODS
84//=============================================================================================================
85
86//=============================================================================================================
87// DEFINE MEMBER METHODS
88//=============================================================================================================
89
91: m_sWindowType("hanning")
92, m_fSFreq(1000.0f)
94{
96 qRegisterMetaType<CONNECTIVITYLIB::ConnectivitySettings>("CONNECTIVITYLIB::ConnectivitySettings");
97}
98
99//*******************************************************************************************************
100
107
108//*******************************************************************************************************
109
111{
112 for (int i = 0; i < m_trialData.size(); ++i) {
113 m_trialData[i].matPsd.resize(0, 0);
114 m_trialData[i].vecPairCsd.clear();
115 m_trialData[i].vecTapSpectra.clear();
116 m_trialData[i].vecPairCsdNormalized.clear();
117 m_trialData[i].vecPairCsdImagSign.clear();
118 m_trialData[i].vecPairCsdImagAbs.clear();
119 m_trialData[i].vecPairCsdImagSqrd.clear();
120 }
121
122 m_intermediateSumData.matPsdSum.resize(0, 0);
123 m_intermediateSumData.vecPairCsdSum.clear();
124 m_intermediateSumData.vecPairCsdNormalizedSum.clear();
125 m_intermediateSumData.vecPairCsdImagSignSum.clear();
126 m_intermediateSumData.vecPairCsdImagAbsSum.clear();
127 m_intermediateSumData.vecPairCsdImagSqrdSum.clear();
128}
129
130//*******************************************************************************************************
131
132void ConnectivitySettings::append(const QList<MatrixXd>& matInputData)
133{
134 for (int i = 0; i < matInputData.size(); ++i) {
135 this->append(matInputData.at(i));
136 }
137}
138
139//*******************************************************************************************************
140
141void ConnectivitySettings::append(const MatrixXd& matInputData)
142{
143 ConnectivitySettings::IntermediateTrialData tempData;
144 tempData.matData = matInputData;
145
146 m_trialData.append(tempData);
147}
148
149//*******************************************************************************************************
150
152{
153 m_trialData.append(inputData);
154}
155
156//*******************************************************************************************************
157
162
163//*******************************************************************************************************
164
166{
167 return m_trialData.size();
168}
169
170//*******************************************************************************************************
171
173{
174 return m_trialData.isEmpty();
175}
176
177//*******************************************************************************************************
178
180{
181 if (m_trialData.isEmpty()) {
182 qDebug() << "ConnectivitySettings::removeFirst - No elements to delete. Returning.";
183 return;
184 }
185
186 if (m_trialData.size() < iAmount) {
187 qDebug() << "ConnectivitySettings::removeFirst - Not enough elements stored in list in order to delete them. Returning.";
188 return;
189 }
190
191 for (int j = 0; j < iAmount; ++j) {
192 subtractFromSums(m_intermediateSumData, m_trialData.first());
193 m_trialData.removeFirst();
194 }
195}
196
197//*******************************************************************************************************
198
200{
201 if (m_trialData.isEmpty()) {
202 qDebug() << "ConnectivitySettings::removeLast - No elements to delete. Returning.";
203 return;
204 }
205
206 if (m_trialData.size() < iAmount) {
207 qDebug() << "ConnectivitySettings::removeLast - Not enough elements stored in list in order to delete them. Returning.";
208 return;
209 }
210
211 for (int j = 0; j < iAmount; ++j) {
212 subtractFromSums(m_intermediateSumData, m_trialData.last());
213 m_trialData.removeLast();
214 }
215}
216
217//*******************************************************************************************************
218
219void ConnectivitySettings::setConnectivityMethods(const QStringList& sConnectivityMethods)
220{
221 m_sConnectivityMethods = sConnectivityMethods;
222}
223
224//*******************************************************************************************************
225
227{
229}
230
231//*******************************************************************************************************
232
234{
235 if (m_fSFreq == iSFreq) {
236 return;
237 }
238
240
241 m_fSFreq = iSFreq;
242
243 if (m_fFreqResolution != 0.0f) {
245 }
246}
247
248//*******************************************************************************************************
249
251{
252 return m_fSFreq;
253}
254
255//*******************************************************************************************************
256
258{
259 if (iNfft == 0) {
260 return;
261 }
262
264
265 m_iNfft = iNfft;
267}
268
269//*******************************************************************************************************
270
272{
273 return m_iNfft;
274}
275
276//*******************************************************************************************************
277
278void ConnectivitySettings::setWindowType(const QString& sWindowType)
279{
280 // Clear all intermediate data since this will have an effect on the frequency calculation
282
283 m_sWindowType = sWindowType;
284}
285
286//*******************************************************************************************************
287
289{
290 return m_sWindowType;
291}
292
293//*******************************************************************************************************
294
296 const RowVectorXi& picks)
297{
298 m_matNodePositions = MatrixX3f::Zero(picks.cols(), 3);
299
300 for (int i = 0; i < picks.cols(); ++i) {
301 const FiffChInfo& ch = fiffInfo.chs.at(picks(i));
302 if (ch.kind == FIFFV_EEG_CH || ch.kind == FIFFV_MEG_CH) {
303 m_matNodePositions.row(i) = ch.chpos.r0.transpose();
304 }
305 }
306}
307
308//*******************************************************************************************************
309
311{
312 //Generate node vertices
313 MatrixX3f matNodeVertLeft, matNodeVertRight;
314
315 if (forwardSolution.isClustered()) {
316 auto* lhHemi = forwardSolution.src.hemisphereAt(0);
317 auto* rhHemi = forwardSolution.src.hemisphereAt(1);
318 matNodeVertLeft.resize(lhHemi->cluster_info.centroidVertno.size(), 3);
319 for (int j = 0; j < matNodeVertLeft.rows(); ++j) {
320 matNodeVertLeft.row(j) = surfSet[0].rr().row(lhHemi->cluster_info.centroidVertno.at(j)) - surfSet[0].offset().transpose();
321 }
322
323 matNodeVertRight.resize(rhHemi->cluster_info.centroidVertno.size(), 3);
324 for (int j = 0; j < matNodeVertRight.rows(); ++j) {
325 matNodeVertRight.row(j) = surfSet[1].rr().row(rhHemi->cluster_info.centroidVertno.at(j)) - surfSet[1].offset().transpose();
326 }
327 } else {
328 matNodeVertLeft.resize(forwardSolution.src[0].vertno.rows(), 3);
329 for (int j = 0; j < matNodeVertLeft.rows(); ++j) {
330 matNodeVertLeft.row(j) = surfSet[0].rr().row(forwardSolution.src[0].vertno(j)) - surfSet[0].offset().transpose();
331 }
332
333 matNodeVertRight.resize(forwardSolution.src[1].vertno.rows(), 3);
334 for (int j = 0; j < matNodeVertRight.rows(); ++j) {
335 matNodeVertRight.row(j) = surfSet[1].rr().row(forwardSolution.src[1].vertno(j)) - surfSet[1].offset().transpose();
336 }
337 }
338
339 m_matNodePositions.resize(matNodeVertLeft.rows() + matNodeVertRight.rows(), 3);
340 m_matNodePositions << matNodeVertLeft, matNodeVertRight;
341}
342
343//*******************************************************************************************************
344
345void ConnectivitySettings::setNodePositions(const MatrixX3f& matNodePositions)
346{
347 m_matNodePositions = matNodePositions;
348}
349
350//*******************************************************************************************************
351
353{
354 return m_matNodePositions;
355}
356
357//*******************************************************************************************************
358
359QList<ConnectivitySettings::IntermediateTrialData>& ConnectivitySettings::getTrialData()
360{
361 return m_trialData;
362}
363
364//*******************************************************************************************************
365
#define FIFFV_EEG_CH
#define FIFFV_MEG_CH
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
Input-data and parameter container shared by every functional-connectivity metric in CONNECTIVITYLIB.
Bi-hemispheric grouping of FreeSurfer surfaces (lh + rh) loaded as a single object.
Forward solution (gain matrix mapping source dipoles to sensor measurements).
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.
QVector< QPair< int, Eigen::MatrixXcd > > vecPairCsdNormalized
Accumulated cross-spectral and auto-spectral sums across trials for final metric normalization.
QVector< QPair< int, Eigen::MatrixXcd > > vecPairCsdNormalizedSum
QVector< QPair< int, Eigen::MatrixXcd > > vecPairCsdSum
QVector< QPair< int, Eigen::MatrixXd > > vecPairCsdImagSignSum
QVector< QPair< int, Eigen::MatrixXd > > vecPairCsdImagSqrdSum
QVector< QPair< int, Eigen::MatrixXd > > vecPairCsdImagAbsSum
Per-channel FIFF descriptor: identifiers, kind, calibration, coil type, channel-frame coil position a...
Eigen::Vector3f r0
Full FIFF measurement info: per-channel descriptors, sampling and filter setup, projectors,...
Definition fiff_info.h:90
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)