MNE-CPP  0.1.9
A Framework for Electrophysiology
mne_inverse_operator.h
Go to the documentation of this file.
1 //=============================================================================================================
38 #ifndef MNE_INVERSE_OPERATOR_H
39 #define MNE_INVERSE_OPERATOR_H
40 
41 //=============================================================================================================
42 // INCLUDES
43 //=============================================================================================================
44 
45 #include "mne_global.h"
46 #include "mne_sourcespace.h"
47 #include "mne_forwardsolution.h"
48 
49 #include <fiff/fiff_types.h>
50 #include <fiff/fiff_named_matrix.h>
51 #include <fiff/fiff_proj.h>
52 #include <fiff/fiff_cov.h>
53 #include <fiff/fiff_info.h>
54 
55 #include <utils/mnemath.h>
56 
57 //=============================================================================================================
58 // EIGEN INCLUDES
59 //=============================================================================================================
60 
61 #include <Eigen/Core>
62 
63 //=============================================================================================================
64 // QT INCLUDES
65 //=============================================================================================================
66 
67 #include <QList>
68 
69 //=============================================================================================================
70 // FORWARD DECLARATIONS
71 //=============================================================================================================
72 
73 namespace FSLIB
74 {
75  class Label;
76 }
77 
78 //=============================================================================================================
79 // DEFINE NAMESPACE MNELIB
80 //=============================================================================================================
81 
82 namespace MNELIB
83 {
84 
85 //=========================================================================================================
90 {
91  Eigen::VectorXi roiIdx;
92  Eigen::MatrixXd ctrs;
93  Eigen::VectorXd sumd;
94  Eigen::MatrixXd D;
96  qint32 iLabelIdxOut;
97 };
98 
99 //=========================================================================================================
103 struct RegionMT
104 {
105  Eigen::MatrixXd matRoiMT;
106  Eigen::MatrixXd matRoiMTOrig;
108  qint32 nClusters;
109  Eigen::VectorXi idcs;
110  qint32 iLabelIdxIn;
112  QString sDistMeasure;
114  RegionMTOut cluster() const
115  {
116  QString t_sDistMeasure;
117  if(sDistMeasure.isEmpty())
118  t_sDistMeasure = QString("cityblock");
119  else
120  t_sDistMeasure = sDistMeasure;
121 
122  // Kmeans Reduction
123  RegionMTOut p_RegionMTOut;
124 
125  UTILSLIB::KMeans t_kMeans(t_sDistMeasure, QString("sample"), 5);
126 
127  t_kMeans.calculate(this->matRoiMT, this->nClusters, p_RegionMTOut.roiIdx, p_RegionMTOut.ctrs, p_RegionMTOut.sumd, p_RegionMTOut.D);
128 
129  p_RegionMTOut.iLabelIdxOut = this->iLabelIdxIn;
130 
131  return p_RegionMTOut;
132  }
133 };
134 
135 //=============================================================================================================
142 {
143 public:
144  typedef QSharedPointer<MNEInverseOperator> SPtr;
145  typedef QSharedPointer<const MNEInverseOperator> ConstSPtr;
147  //=========================================================================================================
152 
153  //=========================================================================================================
159  MNEInverseOperator(QIODevice& p_IODevice);
160 
161  //=========================================================================================================
174  const MNEForwardSolution& forward,
175  const FIFFLIB::FiffCov& p_noise_cov,
176  float loose = 0.2f,
177  float depth = 0.8f,
178  bool fixed = false,
179  bool limit_depth_chs = true);
180 
181  //=========================================================================================================
187  MNEInverseOperator(const MNEInverseOperator &p_MNEInverseOperator);
188 
189  //=========================================================================================================
194 
195  //=========================================================================================================
212  bool assemble_kernel(const FSLIB::Label &label,
213  QString method,
214  bool pick_normal,
215  Eigen::MatrixXd &K,
216  Eigen::SparseMatrix<double> &noise_norm,
217  QList<Eigen::VectorXi> &vertno);
218 
219  //=========================================================================================================
227  bool check_ch_names(const FIFFLIB::FiffInfo &info) const;
228 
229  //=========================================================================================================
240  Eigen::MatrixXd cluster_kernel(const FSLIB::AnnotationSet &p_AnnotationSet,
241  qint32 p_iClusterSize,
242  Eigen::MatrixXd& p_D,
243  QString p_sMethod = "cityblock") const;
244 
245  //=========================================================================================================
251  inline Eigen::MatrixXd& getKernel();
252 
253  //=========================================================================================================
259  inline Eigen::MatrixXd getKernel() const;
260 
261  //=========================================================================================================
267  inline bool isFixedOrient() const;
268 
269  //=========================================================================================================
283  static MNEInverseOperator make_inverse_operator(const FIFFLIB::FiffInfo &info,
284  MNEForwardSolution forward,
285  const FIFFLIB::FiffCov& p_noise_cov,
286  float loose = 0.2f,
287  float depth = 0.8f,
288  bool fixed = false,
289  bool limit_depth_chs = true);
290 
291  //=========================================================================================================
306  MNEInverseOperator prepare_inverse_operator(qint32 nave,
307  float lambda2,
308  bool dSPM,
309  bool sLORETA = false) const;
310 
311  //=========================================================================================================
324  static bool read_inverse_operator(QIODevice &p_IODevice, MNEInverseOperator& inv);
325 
326  //=========================================================================================================
334  void write(QIODevice &p_IODevice);
335 
336  //=========================================================================================================
342  void writeToStream(FIFFLIB::FiffStream* p_pStream);
343 
344  //=========================================================================================================
353  friend std::ostream& operator<<(std::ostream& out, const MNELIB::MNEInverseOperator &p_MNEInverseOperator);
354 
355 public:
357  FIFFLIB::fiff_int_t methods;
358  FIFFLIB::fiff_int_t source_ori;
359  FIFFLIB::fiff_int_t nsource;
360  FIFFLIB::fiff_int_t nchan;
361  FIFFLIB::fiff_int_t coord_frame;
362  Eigen::MatrixXf source_nn;
363  Eigen::VectorXd sing;
374  FIFFLIB::fiff_int_t nave;
375  QList<FIFFLIB::FiffProj> projs;
376  Eigen::MatrixXd proj;
377  Eigen::MatrixXd whitener;
378  Eigen::VectorXd reginv;
379  Eigen::SparseMatrix<double> noisenorm;
381 private:
382  Eigen::MatrixXd m_K;
383 };
384 
385 //=============================================================================================================
386 // INLINE DEFINITIONS
387 //=============================================================================================================
388 
389 inline Eigen::MatrixXd& MNEInverseOperator::getKernel()
390 {
391  return m_K;
392 }
393 
394 //=============================================================================================================
395 
396 inline Eigen::MatrixXd MNEInverseOperator::getKernel() const
397 {
398  return m_K;
399 }
400 
401 //=============================================================================================================
402 
404 {
405  return this->source_ori == FIFFV_MNE_FIXED_ORI;
406 }
407 
408 //=============================================================================================================
409 
410 inline std::ostream& operator<<(std::ostream& out, const MNELIB::MNEInverseOperator &p_MNEInverseOperator)
411 {
412  out << "#### MNE Inverse Operator ####\n";
413 
414  out << "\n methods: " << p_MNEInverseOperator.methods << std::endl;
415  out << "\n source_ori: " << p_MNEInverseOperator.source_ori << std::endl;
416  out << "\n nsource: " << p_MNEInverseOperator.nsource << std::endl;
417  out << "\n nchan: " << p_MNEInverseOperator.nchan << std::endl;
418  out << "\n coord_frame:\n\t" << p_MNEInverseOperator.coord_frame << std::endl;
419 
420  out << "\n eigen_leads: " << *(p_MNEInverseOperator.eigen_leads) << std::endl;
421  out << "\n eigen_fields:\n\t" << *(p_MNEInverseOperator.eigen_fields) << std::endl;
422 
423  return out;
424 }
425 } // NAMESPACE
426 
427 #ifndef metatype_mneinverseoperatorsptr
428 #define metatype_mneinverseoperatorsptr
429 Q_DECLARE_METATYPE(QSharedPointer<MNELIB::MNEInverseOperator>);
430 #endif
431 
432 #ifndef metatype_mneinverseoperators
433 #define metatype_mneinverseoperators
435 #endif
436 
437 #endif // MNE_INVERSE_OPERATOR_H
fiff_proj.h
FiffProj class declaration.
Q_DECLARE_METATYPE
Q_DECLARE_METATYPE(QSharedPointer< MNELIB::MNEInverseOperator >)
fiff_named_matrix.h
FiffNamedMatrix class declaration.
MNELIB::RegionMT::matRoiMTOrig
Eigen::MatrixXd matRoiMTOrig
Definition: mne_inverse_operator.h:106
MNELIB::MNEInverseOperator::nave
FIFFLIB::fiff_int_t nave
Definition: mne_inverse_operator.h:374
FIFFLIB::FiffInfo
FIFF measurement file information.
Definition: fiff_info.h:84
MNELIB::MNEInverseOperator::info
FIFFLIB::FiffInfoBase info
Definition: mne_inverse_operator.h:356
MNELIB::MNEInverseOperator::eigen_fields
FIFFLIB::FiffNamedMatrix::SDPtr eigen_fields
Definition: mne_inverse_operator.h:366
MNESHARED_EXPORT
#define MNESHARED_EXPORT
Definition: mne_global.h:56
FSLIB::AnnotationSet
Annotation set.
Definition: annotationset.h:80
MNELIB::RegionMTOut::sumd
Eigen::VectorXd sumd
Definition: mne_inverse_operator.h:93
MNELIB::MNEInverseOperator::projs
QList< FIFFLIB::FiffProj > projs
Definition: mne_inverse_operator.h:375
MNELIB::MNEForwardSolution
Forward operator.
Definition: mne_forwardsolution.h:170
fiff_cov.h
FiffCov class declaration.
MNELIB::MNEInverseOperator::mri_head_t
FIFFLIB::FiffCoordTrans mri_head_t
Definition: mne_inverse_operator.h:373
MNELIB::MNEInverseOperator::src
MNESourceSpace src
Definition: mne_inverse_operator.h:372
MNELIB::MNESourceSpace
Source Space descritpion.
Definition: mne_sourcespace.h:92
MNELIB::RegionMTOut::roiIdx
Eigen::VectorXi roiIdx
Definition: mne_inverse_operator.h:91
MNELIB::RegionMTOut::iLabelIdxOut
qint32 iLabelIdxOut
Definition: mne_inverse_operator.h:96
MNELIB::MNEInverseOperator::nsource
FIFFLIB::fiff_int_t nsource
Definition: mne_inverse_operator.h:359
MNELIB::MNEInverseOperator::orient_prior
FIFFLIB::FiffCov::SDPtr orient_prior
Definition: mne_inverse_operator.h:369
FSLIB::Label
Freesurfer/MNE label.
Definition: label.h:80
MNELIB::RegionMTOut
Definition: mne_inverse_operator.h:89
MNELIB::MNEInverseOperator::fmri_prior
FIFFLIB::FiffCov::SDPtr fmri_prior
Definition: mne_inverse_operator.h:371
MNELIB::MNEInverseOperator::eigen_leads
FIFFLIB::FiffNamedMatrix::SDPtr eigen_leads
Definition: mne_inverse_operator.h:365
FIFFLIB::FiffNamedMatrix::SDPtr
QSharedDataPointer< FiffNamedMatrix > SDPtr
Definition: fiff_named_matrix.h:81
MNELIB::RegionMT::matRoiMT
Eigen::MatrixXd matRoiMT
Definition: mne_inverse_operator.h:105
MNELIB::MNEInverseOperator::eigen_leads_weighted
bool eigen_leads_weighted
Definition: mne_inverse_operator.h:364
FIFFLIB::FiffCov::SDPtr
QSharedDataPointer< FiffCov > SDPtr
Definition: fiff_cov.h:82
MNELIB::MNEInverseOperator::SPtr
QSharedPointer< MNEInverseOperator > SPtr
Definition: mne_inverse_operator.h:144
MNELIB::MNEInverseOperator::depth_prior
FIFFLIB::FiffCov::SDPtr depth_prior
Definition: mne_inverse_operator.h:370
MNELIB::MNEInverseOperator::source_nn
Eigen::MatrixXf source_nn
Definition: mne_inverse_operator.h:362
MNELIB::MNEInverseOperator::sing
Eigen::VectorXd sing
Definition: mne_inverse_operator.h:363
fiff_info.h
FiffInfo class declaration.
MNELIB::RegionMTOut::ctrs
Eigen::MatrixXd ctrs
Definition: mne_inverse_operator.h:92
FIFFLIB::FiffCov
covariance data
Definition: fiff_cov.h:77
mne_global.h
mne library export/import macros.
MNELIB::MNEInverseOperator::noisenorm
Eigen::SparseMatrix< double > noisenorm
Definition: mne_inverse_operator.h:379
MNELIB::MNEInverseOperator
Inverse operator.
Definition: mne_inverse_operator.h:141
MNELIB::RegionMT::iLabelIdxIn
qint32 iLabelIdxIn
Definition: mne_inverse_operator.h:110
FIFFLIB::FiffInfoBase
light measurement info
Definition: fiff_info_base.h:74
MNELIB::RegionMTOut::D
Eigen::MatrixXd D
Definition: mne_inverse_operator.h:94
MNELIB::MNEInverseOperator::isFixedOrient
bool isFixedOrient() const
Definition: mne_inverse_operator.h:403
UTILSLIB::KMeans::calculate
bool calculate(Eigen::MatrixXd X, qint32 kClusters, Eigen::VectorXi &idx, Eigen::MatrixXd &C, Eigen::VectorXd &sumD, Eigen::MatrixXd &D)
Definition: kmeans.cpp:120
mne_forwardsolution.h
MNEForwardSolution class declaration, which provides the forward solution including the source space ...
MNELIB::MNEInverseOperator::methods
FIFFLIB::fiff_int_t methods
Definition: mne_inverse_operator.h:357
mne_sourcespace.h
MNESourceSpace class declaration.
MNELIB::MNEInverseOperator::getKernel
Eigen::MatrixXd & getKernel()
Definition: mne_inverse_operator.h:389
MNELIB::MNEInverseOperator::source_ori
FIFFLIB::fiff_int_t source_ori
Definition: mne_inverse_operator.h:358
MNELIB::MNEInverseOperator::nchan
FIFFLIB::fiff_int_t nchan
Definition: mne_inverse_operator.h:360
MNELIB::RegionMT::sDistMeasure
QString sDistMeasure
Definition: mne_inverse_operator.h:112
FIFFLIB::FiffStream
FIFF File I/O routines.
Definition: fiff_stream.h:104
FIFFLIB::FiffCoordTrans
Coordinate transformation description.
Definition: fiff_coord_trans.h:74
MNELIB::MNEInverseOperator::coord_frame
FIFFLIB::fiff_int_t coord_frame
Definition: mne_inverse_operator.h:361
fiff_types.h
Definitions for describing the objects in a FIFF file.
MNELIB::RegionMT
Definition: mne_inverse_operator.h:103
MNELIB::RegionMT::idcs
Eigen::VectorXi idcs
Definition: mne_inverse_operator.h:109
MNELIB::RegionMT::nClusters
qint32 nClusters
Definition: mne_inverse_operator.h:108
MNELIB::MNEInverseOperator::whitener
Eigen::MatrixXd whitener
Definition: mne_inverse_operator.h:377
MNELIB::MNEInverseOperator::proj
Eigen::MatrixXd proj
Definition: mne_inverse_operator.h:376
MNELIB::MNEInverseOperator::ConstSPtr
QSharedPointer< const MNEInverseOperator > ConstSPtr
Definition: mne_inverse_operator.h:145
UTILSLIB::KMeans
K-Means Clustering.
Definition: kmeans.h:72
mnemath.h
MNEMath class declaration.
MNELIB::MNEInverseOperator::source_cov
FIFFLIB::FiffCov::SDPtr source_cov
Definition: mne_inverse_operator.h:368
MNELIB::MNEInverseOperator::reginv
Eigen::VectorXd reginv
Definition: mne_inverse_operator.h:378
MNELIB::MNEInverseOperator::noise_cov
FIFFLIB::FiffCov::SDPtr noise_cov
Definition: mne_inverse_operator.h:367