v2.0.0
Loading...
Searching...
No Matches
mne_forward_solution.h
Go to the documentation of this file.
1//=============================================================================================================
36
37#ifndef MNE_FORWARD_SOLUTION_H
38#define MNE_FORWARD_SOLUTION_H
39
40//=============================================================================================================
41// INCLUDES
42//=============================================================================================================
43
44#include "mne_global.h"
45
47
48#include <math/kmeans.h>
49
50#include <fs/fs_annotationset.h>
51
52#include <fiff/fiff_constants.h>
54#include <fiff/fiff_types.h>
55#include <fiff/fiff_info_base.h>
56#include <fiff/fiff_cov.h>
57
58#include <math.h>
59#include <memory>
60
61//=============================================================================================================
62// EIGEN INCLUDES
63//=============================================================================================================
64
65#include <Eigen/Core>
66
67//=============================================================================================================
68// QT INCLUDES
69//=============================================================================================================
70
71#include <QSharedPointer>
72
73//=============================================================================================================
74// DEFINE NAMESPACE MNELIB
75//=============================================================================================================
76
77namespace MNELIB
78{
79
80//=========================================================================================================
87{
88 Eigen::VectorXi roiIdx;
89 Eigen::MatrixXd ctrs;
90 Eigen::VectorXd sumd;
91 Eigen::MatrixXd D;
92
93 qint32 iLabelIdxOut;
94};
95
96//=========================================================================================================
103{
104 Eigen::MatrixXd matRoiG;
105 Eigen::MatrixXd matRoiGWhitened;
107
108 Eigen::MatrixXd matRoiGOrig;
109
110 qint32 nClusters;
111
112 Eigen::VectorXi idcs;
113 qint32 iLabelIdxIn;
114 QString sDistMeasure;
115
117 {
118 QString t_sDistMeasure;
119 if(sDistMeasure.isEmpty())
120 t_sDistMeasure = QString("cityblock");
121 else
122 t_sDistMeasure = sDistMeasure;
123
124 // Kmeans Reduction
125 RegionDataOut p_RegionDataOut;
126
127 UTILSLIB::KMeans t_kMeans(t_sDistMeasure, QString("sample"), 5);
128
129 if(bUseWhitened)
130 {
131 t_kMeans.calculate(this->matRoiGWhitened, this->nClusters, p_RegionDataOut.roiIdx, p_RegionDataOut.ctrs, p_RegionDataOut.sumd, p_RegionDataOut.D);
132
133 Eigen::MatrixXd newCtrs = Eigen::MatrixXd::Zero(p_RegionDataOut.ctrs.rows(), p_RegionDataOut.ctrs.cols());
134 for(qint32 c = 0; c < p_RegionDataOut.ctrs.rows(); ++c)
135 {
136 qint32 num = 0;
137
138 for(qint32 idx = 0; idx < p_RegionDataOut.roiIdx.size(); ++idx)
139 {
140 if(c == p_RegionDataOut.roiIdx[idx])
141 {
142 newCtrs.row(c) += this->matRoiG.row(idx); //just take whitened to get indeces calculate centroids using the original matrix
143 ++num;
144 }
145 }
146
147 if(num > 0)
148 newCtrs.row(c) /= num;
149 }
150 p_RegionDataOut.ctrs = newCtrs; //Replace whitened with original
151 }
152 else
153 t_kMeans.calculate(this->matRoiG, this->nClusters, p_RegionDataOut.roiIdx, p_RegionDataOut.ctrs, p_RegionDataOut.sumd, p_RegionDataOut.D);
154
155 p_RegionDataOut.iLabelIdxOut = this->iLabelIdxIn;
156
157 return p_RegionDataOut;
158 }
159};
160
161const static FIFFLIB::FiffCov defaultCov;
162const static FIFFLIB::FiffInfo defaultInfo;
163static Eigen::MatrixXd defaultD;
164
165//=============================================================================================================
172{
173public:
174 typedef QSharedPointer<MNEForwardSolution> SPtr;
175 typedef QSharedPointer<const MNEForwardSolution> ConstSPtr;
176 typedef std::unique_ptr<MNEForwardSolution> UPtr;
177
178 //=========================================================================================================
183
184 //=========================================================================================================
196 MNEForwardSolution(QIODevice &p_IODevice,
197 bool force_fixed = false,
198 bool surf_ori = false,
199 const QStringList& include = FIFFLIB::defaultQStringList,
200 const QStringList& exclude = FIFFLIB::defaultQStringList,
201 bool bExcludeBads = false);
202
203 //=========================================================================================================
209 MNEForwardSolution(const MNEForwardSolution &p_MNEForwardSolution);
210
211 //=========================================================================================================
220
221 //=========================================================================================================
226
227 //=========================================================================================================
232
233 //=========================================================================================================
238
239 //=========================================================================================================
243 void clear();
244
245 //=========================================================================================================
260 qint32 p_iClusterSize,
261 Eigen::MatrixXd& p_D = defaultD,
262 const FIFFLIB::FiffCov &p_pNoise_cov = defaultCov,
263 const FIFFLIB::FiffInfo &p_pInfo = defaultInfo,
264 QString p_sMethod = "cityblock") const;
265
266 //=========================================================================================================
274 FIFFLIB::FiffCov compute_orient_prior(float loose = 0.2);
275
276 //=========================================================================================================
290 static FIFFLIB::FiffCov compute_depth_prior(const Eigen::MatrixXd &Gain,
291 const FIFFLIB::FiffInfo &gain_info,
292 bool is_fixed_ori,
293 double exp = 0.8,
294 double limit = 10.0,
295 const Eigen::MatrixXd &patch_areas = FIFFLIB::defaultConstMatrixXd,
296 bool limit_depth_chs = false);
297
298 //=========================================================================================================
304 bool isClustered() const;
305
306 //=========================================================================================================
312 inline bool isEmpty() const;
313
314 //=========================================================================================================
320 inline bool isFixedOrient() const;
321
322 //=========================================================================================================
333 MNEForwardSolution pick_channels(const QStringList& include = FIFFLIB::defaultQStringList,
334 const QStringList& exclude = FIFFLIB::defaultQStringList) const;
335
336 //=========================================================================================================
344 MNEForwardSolution pick_regions(const QList<FSLIB::FsLabel> &p_qListLabels) const;
345
346 //=========================================================================================================
360 bool eeg,
361 const QStringList& include = FIFFLIB::defaultQStringList,
362 const QStringList& exclude = FIFFLIB::defaultQStringList) const;
363
364 //=========================================================================================================
377 void prepare_forward(const FIFFLIB::FiffInfo &p_info,
378 const FIFFLIB::FiffCov &p_noise_cov,
379 bool p_pca,
380 FIFFLIB::FiffInfo &p_outFwdInfo,
381 Eigen::MatrixXd &gain,
382 FIFFLIB::FiffCov &p_outNoiseCov,
383 Eigen::MatrixXd &p_outWhitener,
384 qint32 &p_outNumNonZero) const;
385
386 //=========================================================================================================
390 Eigen::VectorXi tripletSelection(const Eigen::VectorXi& p_vecIdxSelection) const
391 {
392 Eigen::MatrixXi triSelect = p_vecIdxSelection.transpose().replicate(3,1).array() * 3;//repmat((p_vecIdxSelection - 1) * 3 + 1, 3, 1);
393 triSelect.row(1).array() += 1;
394 triSelect.row(2).array() += 2;
395 Eigen::VectorXi retTriSelect(triSelect.cols()*3);
396 for(int i = 0; i < triSelect.cols(); ++i)
397 retTriSelect.block(i*3,0,3,1) = triSelect.col(i);
398 return retTriSelect;
399 } // tripletSelection
400
401 //=========================================================================================================
417 static bool read(QIODevice& p_IODevice,
419 bool force_fixed = false,
420 bool surf_ori = false,
421 const QStringList& include = FIFFLIB::defaultQStringList,
422 const QStringList& exclude = FIFFLIB::defaultQStringList,
423 bool bExcludeBads = true);
424
425 //=========================================================================================================
439 bool write(QIODevice& p_IODevice) const;
440
441 //=========================================================================================================
450 MNEForwardSolution reduce_forward_solution(qint32 p_iNumDipoles, Eigen::MatrixXd& p_D) const;
451
452 //=========================================================================================================
459 static void restrict_gain_matrix(Eigen::MatrixXd &G, const FIFFLIB::FiffInfo &info);
460
461 //=========================================================================================================
465 void to_fixed_ori();
466
467 //=========================================================================================================
476 friend std::ostream& operator<<(std::ostream& out, const MNELIB::MNEForwardSolution &p_MNEForwardSolution);
477
485 friend bool operator== (const MNEForwardSolution &a, const MNEForwardSolution &b);
486
487 //=========================================================================================================
496 Eigen::MatrixX3f getSourcePositionsByLabel(const QList<FSLIB::FsLabel> &lPickedLabels,
497 const FSLIB::FsSurfaceSet& tSurfSetInflated);
498
499private:
500 //=========================================================================================================
512 static bool read_one(FIFFLIB::FiffStream::SPtr& p_pStream,
513 const FIFFLIB::FiffDirNode::SPtr& p_Node,
514 MNEForwardSolution& one);
515
516public:
519 bool surf_ori;
526 QString mri_filename;
529 Eigen::MatrixX3f source_rr;
530 Eigen::MatrixX3f source_nn;
531};
532
533//=============================================================================================================
534// INLINE DEFINITIONS
535//=============================================================================================================
536
538{
539 return this->nchan <= 0;
540}
541
542//=============================================================================================================
543
545{
546 return this->source_ori == FIFFV_MNE_FIXED_ORI;
547}
548
549//=============================================================================================================
550
551inline std::ostream& operator<<(std::ostream& out, const MNELIB::MNEForwardSolution &p_MNEForwardSolution)
552{
553 out << "#### MNE Forward Solution ####\n";
554
555 out << "\n source_ori: " << p_MNEForwardSolution.source_ori << std::endl;
556 out << "\n coord_frame: " << p_MNEForwardSolution.coord_frame << std::endl;
557 out << "\n nsource: " << p_MNEForwardSolution.nsource << std::endl;
558 out << "\n nchan: " << p_MNEForwardSolution.nchan << std::endl;
559 out << "\n sol:\n\t" << *p_MNEForwardSolution.sol.data() << std::endl;
560 out << "\n sol_grad:\n\t" << *p_MNEForwardSolution.sol_grad.data() << std::endl;
561
562 return out;
563}
564
565//=============================================================================================================
566
567inline bool operator== (const MNEForwardSolution &a, const MNEForwardSolution &b)
568{
569 return (a.info == b.info &&
570 a.source_ori == b.source_ori &&
571 a.surf_ori == b.surf_ori &&
572 a.coord_frame == b.coord_frame &&
573 a.nsource == b.nsource &&
574 a.nchan == b.nchan &&
575 *a.sol == *b.sol &&
576 *a.sol_grad == *b.sol_grad &&
577 a.mri_head_t == b.mri_head_t &&
578 a.src == b.src &&
579 a.source_rr.isApprox(b.source_rr, 0.0001f) &&
580 a.source_nn.isApprox(b.source_nn, 0.0001f));
581}
582} // NAMESPACE
583
584#endif // MNE_FORWARD_SOLUTION_H
Fiff constants.
#define FIFFV_MNE_FIXED_ORI
FiffInfoBase class declaration.
FiffCov class declaration.
Old fiff_type declarations - replace them.
FiffCoordTrans class declaration.
bool operator==(const BIDSPath &a, const BIDSPath &b)
MNESourceSpaces class declaration.
mne library export/import macros.
#define MNESHARED_EXPORT
Definition mne_global.h:52
FsAnnotationSet class declaration.
KMeans class declaration.
Core MNE data structures (source spaces, source estimates, hemispheres).
std::ostream & operator<<(std::ostream &out, const MNELIB::MNEForwardSolution &p_MNEForwardSolution)
bool operator==(const MNEClusterInfo &a, const MNEClusterInfo &b)
qint32 fiff_int_t
Definition fiff_types.h:89
Coordinate transformation description.
covariance data
Definition fiff_cov.h:85
QSharedPointer< FiffDirNode > SPtr
Universally unique identifier.
Definition fiff_id.h:68
FIFF measurement file information.
Definition fiff_info.h:86
light measurement info
QSharedDataPointer< FiffNamedMatrix > SDPtr
QSharedPointer< FiffStream > SPtr
A hemisphere set of surfaces.
K-Means Clustering.
Definition kmeans.h:109
bool calculate(const Eigen::MatrixXd &X, qint32 kClusters, Eigen::VectorXi &idx, Eigen::MatrixXd &C, Eigen::VectorXd &sumD, Eigen::MatrixXd &D)
Definition kmeans.cpp:140
Output of a cluster-based forward solution computation for a single cortical region.
Input parameters for cluster-based forward solution computation on a single cortical region.
Eigen::MatrixXd matRoiGWhitened
Eigen::MatrixXd matRoiGOrig
RegionDataOut cluster() const
static FIFFLIB::FiffCov compute_depth_prior(const Eigen::MatrixXd &Gain, const FIFFLIB::FiffInfo &gain_info, bool is_fixed_ori, double exp=0.8, double limit=10.0, const Eigen::MatrixXd &patch_areas=FIFFLIB::defaultConstMatrixXd, bool limit_depth_chs=false)
MNELIB::MNESourceSpaces src
MNEForwardSolution cluster_forward_solution(const FSLIB::FsAnnotationSet &p_AnnotationSet, qint32 p_iClusterSize, Eigen::MatrixXd &p_D=defaultD, const FIFFLIB::FiffCov &p_pNoise_cov=defaultCov, const FIFFLIB::FiffInfo &p_pInfo=defaultInfo, QString p_sMethod="cityblock") const
MNEForwardSolution & operator=(const MNEForwardSolution &other)
void prepare_forward(const FIFFLIB::FiffInfo &p_info, const FIFFLIB::FiffCov &p_noise_cov, bool p_pca, FIFFLIB::FiffInfo &p_outFwdInfo, Eigen::MatrixXd &gain, FIFFLIB::FiffCov &p_outNoiseCov, Eigen::MatrixXd &p_outWhitener, qint32 &p_outNumNonZero) const
FIFFLIB::FiffCoordTrans mri_head_t
QSharedPointer< MNEForwardSolution > SPtr
MNEForwardSolution pick_channels(const QStringList &include=FIFFLIB::defaultQStringList, const QStringList &exclude=FIFFLIB::defaultQStringList) const
FIFFLIB::FiffNamedMatrix::SDPtr sol_grad
MNEForwardSolution & operator=(MNEForwardSolution &&other)=default
Eigen::VectorXi tripletSelection(const Eigen::VectorXi &p_vecIdxSelection) const
std::unique_ptr< MNEForwardSolution > UPtr
MNEForwardSolution(MNEForwardSolution &&other)=default
QSharedPointer< const MNEForwardSolution > ConstSPtr
FIFFLIB::FiffCov compute_orient_prior(float loose=0.2)
MNEForwardSolution pick_regions(const QList< FSLIB::FsLabel > &p_qListLabels) const
MNEForwardSolution pick_types(bool meg, bool eeg, const QStringList &include=FIFFLIB::defaultQStringList, const QStringList &exclude=FIFFLIB::defaultQStringList) const
FIFFLIB::FiffNamedMatrix::SDPtr sol
Source Space descritpion.