MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
connectivitysettings.cpp
Go to the documentation of this file.
1//=============================================================================================================
35//=============================================================================================================
36// INCLUDES
37//=============================================================================================================
38
40
42#include <fs/surfaceset.h>
43#include <fiff/fiff_info.h>
44
45//=============================================================================================================
46// QT INCLUDES
47//=============================================================================================================
48
49#include <QCommandLineParser>
50#include <QElapsedTimer>
51#include <QDebug>
52
53//=============================================================================================================
54// EIGEN INCLUDES
55//=============================================================================================================
56
57//=============================================================================================================
58// USED NAMESPACES
59//=============================================================================================================
60
61using namespace CONNECTIVITYLIB;
62using namespace MNELIB;
63using namespace Eigen;
64using namespace FIFFLIB;
65using namespace FSLIB;
66
67//=============================================================================================================
68// DEFINE GLOBAL METHODS
69//=============================================================================================================
70
71//=============================================================================================================
72// DEFINE MEMBER METHODS
73//=============================================================================================================
74
76: m_fFreqResolution(1.0f)
77, m_fSFreq(1000.0f)
78, m_sWindowType("hanning")
79{
81 qRegisterMetaType<CONNECTIVITYLIB::ConnectivitySettings>("CONNECTIVITYLIB::ConnectivitySettings");
82}
83
84//*******************************************************************************************************
85
86void ConnectivitySettings::clearAllData()
87{
88 m_trialData.clear();
89
90 clearIntermediateData();
91}
92
93//*******************************************************************************************************
94
95void ConnectivitySettings::clearIntermediateData()
96{
97 for (int i = 0; i < m_trialData.size(); ++i) {
98 m_trialData[i].matPsd.resize(0,0);
99 m_trialData[i].vecPairCsd.clear();
100 m_trialData[i].vecTapSpectra.clear();
101 m_trialData[i].vecPairCsdNormalized.clear();
102 m_trialData[i].vecPairCsdImagSign.clear();
103 m_trialData[i].vecPairCsdImagAbs.clear();
104 m_trialData[i].vecPairCsdImagSqrd.clear();
105 }
106
107 m_intermediateSumData.matPsdSum.resize(0,0);
108 m_intermediateSumData.vecPairCsdSum.clear();
109 m_intermediateSumData.vecPairCsdNormalizedSum.clear();
110 m_intermediateSumData.vecPairCsdImagSignSum.clear();
111 m_intermediateSumData.vecPairCsdImagAbsSum.clear();
112 m_intermediateSumData.vecPairCsdImagSqrdSum.clear();
113}
114
115//*******************************************************************************************************
116
117void ConnectivitySettings::append(const QList<MatrixXd>& matInputData)
118{
119 for(int i = 0; i < matInputData.size(); ++i) {
120 this->append(matInputData.at(i));
121 }
122}
123
124//*******************************************************************************************************
125
126void ConnectivitySettings::append(const MatrixXd& matInputData)
127{
129 tempData.matData = matInputData;
130
131 m_trialData.append(tempData);
132}
133
134//*******************************************************************************************************
135
136void ConnectivitySettings::append(const ConnectivitySettings::IntermediateTrialData& inputData)
137{
138 m_trialData.append(inputData);
139}
140
141//*******************************************************************************************************
142
143const ConnectivitySettings::IntermediateTrialData& ConnectivitySettings::at(int i) const
144{
145 return m_trialData.at(i);
146}
147
148//*******************************************************************************************************
149
150int ConnectivitySettings::size() const
151{
152 return m_trialData.size();
153}
154
155//*******************************************************************************************************
156
157bool ConnectivitySettings::isEmpty() const
158{
159 return m_trialData.isEmpty();
160}
161
162//*******************************************************************************************************
163
164void ConnectivitySettings::removeFirst(int iAmount)
165{
166// QElapsedTimer timer;
167// qint64 iTime = 0;
168// timer.start();
169
170 if(m_trialData.isEmpty()) {
171 qDebug() << "ConnectivitySettings::removeFirst - No elements to delete. Returning.";
172 return;
173 }
174
175 if(m_trialData.size() < iAmount) {
176 qDebug() << "ConnectivitySettings::removeFirst - Not enough elements stored in list in order to delete them. Returning.";
177 return;
178 }
179
180 // Substract influence of trials from overall summed up intermediate data and remove from data list
181 for (int j = 0; j < iAmount; ++j) {
182 for (int i = 0; i < m_trialData.first().matData.rows(); ++i) {
183 if(i < m_intermediateSumData.vecPairCsdSum.size() && (m_intermediateSumData.vecPairCsdSum.size() == m_trialData.first().vecPairCsd.size())) {
184 m_intermediateSumData.vecPairCsdSum[i].second -= m_trialData.first().vecPairCsd.at(i).second;
185 }
186 if(i < m_intermediateSumData.vecPairCsdNormalizedSum.size() && (m_intermediateSumData.vecPairCsdNormalizedSum.size() == m_trialData.first().vecPairCsdNormalized.size())) {
187 m_intermediateSumData.vecPairCsdNormalizedSum[i].second -= m_trialData.first().vecPairCsdNormalized.at(i).second;
188 }
189 if(i < m_intermediateSumData.vecPairCsdImagSignSum.size() && (m_intermediateSumData.vecPairCsdImagSignSum.size() == m_trialData.first().vecPairCsdImagSign.size())) {
190 m_intermediateSumData.vecPairCsdImagSignSum[i].second -= m_trialData.first().vecPairCsdImagSign.at(i).second;
191 }
192 if(i < m_intermediateSumData.vecPairCsdImagAbsSum.size() && (m_intermediateSumData.vecPairCsdImagAbsSum.size() == m_trialData.first().vecPairCsdImagAbs.size())) {
193 m_intermediateSumData.vecPairCsdImagAbsSum[i].second -= m_trialData.first().vecPairCsdImagAbs.at(i).second;
194 }
195 if(i < m_intermediateSumData.vecPairCsdImagSqrdSum.size() && (m_intermediateSumData.vecPairCsdImagSqrdSum.size() == m_trialData.first().vecPairCsdImagSqrd.size())) {
196 m_intermediateSumData.vecPairCsdImagSqrdSum[i].second -= m_trialData.first().vecPairCsdImagSqrd.at(i).second;
197 }
198 }
199
200 if(m_intermediateSumData.matPsdSum.rows() == m_trialData.first().matPsd.rows() &&
201 m_intermediateSumData.matPsdSum.cols() == m_trialData.first().matPsd.cols() ) {
202 m_intermediateSumData.matPsdSum -= m_trialData.first().matPsd;
203 }
204
205 m_trialData.removeFirst();
206 }
207
208// iTime = timer.elapsed();
209// qDebug() << "ConnectivitySettings::removeFirst" << iTime;
210// timer.restart();
211}
212
213//*******************************************************************************************************
214
215void ConnectivitySettings::removeLast(int iAmount)
216{
217// QElapsedTimer timer;
218// qint64 iTime = 0;
219// timer.start();
220
221 if(m_trialData.isEmpty()) {
222 qDebug() << "ConnectivitySettings::removeLast - No elements to delete. Returning.";
223 return;
224 }
225
226 if(m_trialData.size() < iAmount) {
227 qDebug() << "ConnectivitySettings::removeLast - Not enough elements stored in list in order to delete them. Returning.";
228 return;
229 }
230
231 // Substract influence of trials from overall summed up intermediate data and remove from data list
232 for (int j = 0; j < iAmount; ++j) {
233 for (int i = 0; i < m_trialData.last().matData.rows(); ++i) {
234 if(i < m_intermediateSumData.vecPairCsdSum.size() && (m_intermediateSumData.vecPairCsdSum.size() == m_trialData.last().vecPairCsd.size())) {
235 m_intermediateSumData.vecPairCsdSum[i].second -= m_trialData.last().vecPairCsd.at(i).second;
236 }
237 if(i < m_intermediateSumData.vecPairCsdNormalizedSum.size() && (m_intermediateSumData.vecPairCsdNormalizedSum.size() == m_trialData.last().vecPairCsdNormalized.size())) {
238 m_intermediateSumData.vecPairCsdNormalizedSum[i].second -= m_trialData.last().vecPairCsdNormalized.at(i).second;
239 }
240 if(i < m_intermediateSumData.vecPairCsdImagSignSum.size() && (m_intermediateSumData.vecPairCsdImagSignSum.size() == m_trialData.last().vecPairCsdImagSign.size())) {
241 m_intermediateSumData.vecPairCsdImagSignSum[i].second -= m_trialData.last().vecPairCsdImagSign.at(i).second;
242 }
243 if(i < m_intermediateSumData.vecPairCsdImagAbsSum.size() && (m_intermediateSumData.vecPairCsdImagAbsSum.size() == m_trialData.last().vecPairCsdImagAbs.size())) {
244 m_intermediateSumData.vecPairCsdImagAbsSum[i].second -= m_trialData.last().vecPairCsdImagAbs.at(i).second;
245 }
246 if(i < m_intermediateSumData.vecPairCsdImagSqrdSum.size() && (m_intermediateSumData.vecPairCsdImagSqrdSum.size() == m_trialData.last().vecPairCsdImagSqrd.size())) {
247 m_intermediateSumData.vecPairCsdImagSqrdSum[i].second -= m_trialData.last().vecPairCsdImagSqrd.at(i).second;
248 }
249 }
250
251 if(m_intermediateSumData.matPsdSum.rows() == m_trialData.last().matPsd.rows() &&
252 m_intermediateSumData.matPsdSum.cols() == m_trialData.last().matPsd.cols() ) {
253 m_intermediateSumData.matPsdSum -= m_trialData.last().matPsd;
254 }
255
256 m_trialData.removeLast();
257 }
258
259// iTime = timer.elapsed();
260// qDebug() << "ConnectivitySettings::removeLast" << iTime;
261// timer.restart();
262}
263
264//*******************************************************************************************************
265
266void ConnectivitySettings::setConnectivityMethods(const QStringList& sConnectivityMethods)
267{
268 m_sConnectivityMethods = sConnectivityMethods;
269}
270
271//*******************************************************************************************************
272
273const QStringList& ConnectivitySettings::getConnectivityMethods() const
274{
276}
277
278//*******************************************************************************************************
279
280void ConnectivitySettings::setSamplingFrequency(int iSFreq)
281{
282 if(m_fSFreq == iSFreq) {
283 return;
284 }
285
286 clearIntermediateData();
287
288 m_fSFreq = iSFreq;
289
290 if(m_fFreqResolution != 0.0f) {
292 }
293}
294
295//*******************************************************************************************************
296
297int ConnectivitySettings::getSamplingFrequency() const
298{
299 return m_fSFreq;
300}
301
302//*******************************************************************************************************
303
304void ConnectivitySettings::setFFTSize(int iNfft)
305{
306 if(iNfft == 0) {
307 return;
308 }
309
310 clearIntermediateData();
311
312 m_iNfft = iNfft;
314}
315
316//*******************************************************************************************************
317
318int ConnectivitySettings::getFFTSize() const
319{
320 return m_iNfft;
321}
322
323//*******************************************************************************************************
324
325void ConnectivitySettings::setWindowType(const QString& sWindowType)
326{
327 // Clear all intermediate data since this will have an effect on the frequency calculation
328 clearIntermediateData();
329
330 m_sWindowType = sWindowType;
331}
332
333//*******************************************************************************************************
334
335const QString& ConnectivitySettings::getWindowType() const
336{
337 return m_sWindowType;
338}
339
340//*******************************************************************************************************
341
342void ConnectivitySettings::setNodePositions(const FiffInfo& fiffInfo,
343 const RowVectorXi& picks)
344{
345 m_matNodePositions.resize(picks.cols(),3);
346
347 qint32 kind;
348 for(int i = 0; i < picks.cols(); ++i) {
349 kind = fiffInfo.chs.at(i).kind;
350 if(kind == FIFFV_EEG_CH ||
351 kind == FIFFV_MEG_CH) {
352 m_matNodePositions(i,0) = fiffInfo.chs.at(picks(i)).chpos.r0(0);
353 m_matNodePositions(i,1) = fiffInfo.chs.at(picks(i)).chpos.r0(1);
354 m_matNodePositions(i,2) = fiffInfo.chs.at(picks(i)).chpos.r0(2);
355 }
356 }
357}
358
359//*******************************************************************************************************
360
361void ConnectivitySettings::setNodePositions(const MNEForwardSolution& forwardSolution, const SurfaceSet& surfSet)
362{
363 //Generate node vertices
364 MatrixX3f matNodeVertLeft, matNodeVertRight;
365
366 if(forwardSolution.isClustered()) {
367 matNodeVertLeft.resize(forwardSolution.src[0].cluster_info.centroidVertno.size(),3);
368 for(int j = 0; j < matNodeVertLeft.rows(); ++j) {
369 matNodeVertLeft.row(j) = surfSet[0].rr().row(forwardSolution.src[0].cluster_info.centroidVertno.at(j)) - surfSet[0].offset().transpose();
370 }
371
372 matNodeVertRight.resize(forwardSolution.src[1].cluster_info.centroidVertno.size(),3);
373 for(int j = 0; j < matNodeVertRight.rows(); ++j) {
374 matNodeVertRight.row(j) = surfSet[1].rr().row(forwardSolution.src[1].cluster_info.centroidVertno.at(j)) - surfSet[1].offset().transpose();
375 }
376 } else {
377 matNodeVertLeft.resize(forwardSolution.src[0].vertno.rows(),3);
378 for(int j = 0; j < matNodeVertLeft.rows(); ++j) {
379 matNodeVertLeft.row(j) = surfSet[0].rr().row(forwardSolution.src[0].vertno(j)) - surfSet[0].offset().transpose();
380 }
381
382 matNodeVertRight.resize(forwardSolution.src[1].vertno.rows(),3);
383 for(int j = 0; j < matNodeVertRight.rows(); ++j) {
384 matNodeVertRight.row(j) = surfSet[1].rr().row(forwardSolution.src[1].vertno(j)) - surfSet[1].offset().transpose();
385 }
386 }
387
388 m_matNodePositions.resize(matNodeVertLeft.rows()+matNodeVertRight.rows(),3);
389 m_matNodePositions << matNodeVertLeft, matNodeVertRight;
390}
391
392//*******************************************************************************************************
393
394void ConnectivitySettings::setNodePositions(const MatrixX3f& matNodePositions)
395{
396 m_matNodePositions = matNodePositions;
397}
398
399//*******************************************************************************************************
400
401const MatrixX3f& ConnectivitySettings::getNodePositions() const
402{
403 return m_matNodePositions;
404}
405
406//*******************************************************************************************************
407
408QList<ConnectivitySettings::IntermediateTrialData>& ConnectivitySettings::getTrialData()
409{
410 return m_trialData;
411}
412
413//*******************************************************************************************************
414
415ConnectivitySettings::IntermediateSumData& ConnectivitySettings::getIntermediateSumData()
416{
418}
FiffInfo class declaration.
ConnectivitySettings class declaration.
MNEForwardSolution class declaration, which provides the forward solution including the source space ...
SurfaceSet class declaration.
QList< IntermediateTrialData > m_trialData
FIFF measurement file information.
Definition fiff_info.h:85
QList< FiffChInfo > chs
A hemisphere set of surfaces.
Definition surfaceset.h:72