v2.0.0
Loading...
Searching...
No Matches
inv_rap_music.h
Go to the documentation of this file.
1//=============================================================================================================
23
24#ifndef INV_RAP_MUSIC_H
25#define INV_RAP_MUSIC_H
26
27//=============================================================================================================
28// INCLUDES
29//=============================================================================================================
30
31#include "../inv_global.h"
32
33#include "inv_dipole.h"
34
37#include <time.h>
38
39#include <QVector>
40
41#include <vector>
42
43//=============================================================================================================
44// EIGEN INCLUDES
45//=============================================================================================================
46
47#include <Eigen/Core>
48#include <Eigen/SVD>
49#include <Eigen/LU>
50
51//=============================================================================================================
52// DEFINE NAMESPACE INVLIB
53//=============================================================================================================
54
55namespace INVLIB
56{
57
58//=============================================================================================================
59// SOME DEFINES
60//=============================================================================================================
61
62#define NOT_TRANSPOSED 0
63#define IS_TRANSPOSED 1
64
65//=============================================================================================================
71struct Pair
72{
73 int x1;
74 int x2;
75};
76
77//=============================================================================================================
90{
91public:
92 typedef QSharedPointer<InvRapMusic> SPtr;
93 typedef QSharedPointer<const InvRapMusic> ConstSPtr;
94
95 //*********************************************************************************************************
96 //=========================================================================================================
97 // TYPEDEFS
98 //=========================================================================================================
99
100 typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> MatrixXT;
102 typedef Eigen::Matrix<double, Eigen::Dynamic, 6> MatrixX6T;
104 typedef Eigen::Matrix<double, 6, Eigen::Dynamic> Matrix6XT;
106 typedef Eigen::Matrix<double, 6, 6> Matrix6T;
108 typedef Eigen::Matrix<double, Eigen::Dynamic, 1> VectorXT;
110 typedef Eigen::Matrix<double, 6, 1> Vector6T;
112
113 //=========================================================================================================
117 InvRapMusic();
118
119 //=========================================================================================================
129 InvRapMusic(MNELIB::MNEForwardSolution& p_pFwd, bool p_bSparsed, int p_iN = 2, double p_dThr = 0.5);
130
131 virtual ~InvRapMusic();
132
133 //=========================================================================================================
144 bool init(MNELIB::MNEForwardSolution& p_pFwd, bool p_bSparsed = false, int p_iN = 2, double p_dThr = 0.5);
145
146 virtual InvSourceEstimate calculateInverse(const FIFFLIB::FiffEvoked &p_fiffEvoked, bool pick_normal = false);
147
148 virtual InvSourceEstimate calculateInverse(const Eigen::MatrixXd &data, float tmin, float tstep, bool pick_normal = false) const;
149
150 virtual InvSourceEstimate calculateInverse(const Eigen::MatrixXd& p_matMeasurement, QList< InvDipolePair<double> > &p_RapDipoles) const;
151
152 virtual const char* getName() const;
153
154 virtual const MNELIB::MNESourceSpaces& getSourceSpace() const;
155
156 //=========================================================================================================
163 void setStcAttr(int p_iSampStcWin, float p_fStcOverlap);
164
165protected:
166 //=========================================================================================================
175 int calcPhi_s(const MatrixXT& p_matMeasurement, MatrixXT* &p_pMatPhi_s) const;
176
177 //=========================================================================================================
190 static double subcorr(MatrixX6T& p_matProj_G, const MatrixXT& p_pMatU_B);
191
192 //=========================================================================================================
208 static double subcorr(MatrixX6T& p_matProj_G, const MatrixXT& p_matU_B, Vector6T& p_vec_phi_k_1);
209
210 //=========================================================================================================
220 static void calcA_k_1( const MatrixX6T& p_matG_k_1,
221 const Vector6T& p_matPhi_k_1,
222 const int p_iIdxk_1,
223 MatrixXT& p_matA_k_1);
224
225 //=========================================================================================================
232 void calcOrthProj(const MatrixXT& p_matA_k_1, MatrixXT& p_matOrthProj) const;
233
234 //=========================================================================================================
245 void calcPairCombinations( const int p_iNumPoints,
246 const int p_iNumCombinations,
247 std::vector<Pair>& p_pairIdxCombinations) const;
248
249 //=========================================================================================================
265 static void getPointPair(const int p_iPoints, const int p_iCurIdx, int &p_iIdx1, int &p_iIdx2);
266
267 //=========================================================================================================
276 static void getGainMatrixPair( const MatrixXT& p_matGainMarix,
277 MatrixX6T& p_matGainMarix_Pair,
278 int p_iIdx1, int p_iIdx2);
279
280 //=========================================================================================================
290 static void insertSource( int p_iDipoleIdx1, int p_iDipoleIdx2,
291 const Vector6T &p_vec_phi_k_1,
292 double p_valCor,
293 QList< InvDipolePair<double> > &p_RapDipoles);
294
296
297 int m_iN;
301
305
306 std::vector<Pair> m_ppPairIdxCombinations;
307
309
311
312 //Stc stuff
315
316 //=========================================================================================================
324 static inline int getRank(const MatrixXT& p_matSigma);
325
326 //=========================================================================================================
336 static inline int useFullRank( const MatrixXT& p_Mat,
337 const MatrixXT& p_matSigma_src,
338 MatrixXT& p_matFull_Rank,
339 int type = NOT_TRANSPOSED);
340
341 //=========================================================================================================
348 static inline MatrixXT makeSquareMat(const MatrixXT& p_matF);
349};
350
351//=============================================================================================================
352// INLINE DEFINITIONS
353//=============================================================================================================
354
355inline int InvRapMusic::getRank(const MatrixXT& p_matSigma)
356{
357 int t_iRank;
358 //if once a singularvalue is smaller than epsilon = 10^-5 the following values are also smaller
359 // -> because Singular values are ordered
360 for(t_iRank = p_matSigma.rows()-1; t_iRank > 0; t_iRank--)
361 if (p_matSigma(t_iRank, t_iRank) > 0.00001)
362 break;
363
364 t_iRank++;//rank corresponding to epsilon
365
366 return t_iRank;
367}
368
369//=============================================================================================================
370
371inline int InvRapMusic::useFullRank( const MatrixXT& p_Mat,
372 const MatrixXT& p_matSigma_src,
373 MatrixXT& p_matFull_Rank,
374 int type)
375{
376 int rank = getRank(p_matSigma_src);
377
378 if (type == NOT_TRANSPOSED)
379 p_matFull_Rank = p_Mat.block(0,0,p_Mat.rows(),rank);
380 else
381 p_matFull_Rank = p_Mat.block(0,0,rank,p_Mat.cols());
382
383 return rank;
384}
385
386//=============================================================================================================
387
389{
390 //Make rectangular - p_matF*p_matF^T
391 //MatrixXT FFT = p_matF*p_matF.transpose();
392
393 MatrixXT mat = p_matF.transpose();
394
395 return p_matF*mat;
396}
397} //NAMESPACE
398
399#endif // INV_RAP_MUSIC_H
Forward solution (gain matrix mapping source dipoles to sensor measurements).
InvSourceEstimate value type — central source-space data container produced by every INVLIB inverse s...
INVLIB library export/import macros, build-info accessors, and namespace docstring for the inverse-so...
#define INVSHARED_EXPORT
Definition inv_global.h:38
#define NOT_TRANSPOSED
Templated dipole and dipole-pair value types used by the RAP-MUSIC scanning algorithm.
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
Single averaged evoked response: time axis, data, baseline, channel info and averaging metadata.
Definition fiff_evoked.h:75
Source-space inverse-solution container with dense grid plus optional focal-dipole,...
Pair of correlated dipole indices and orientations found by the RAP MUSIC scanning step.
Definition inv_dipole.h:60
Index pair representing two grid points evaluated together in the RAP MUSIC subspace scan.
Eigen::Matrix< double, 6, 1 > Vector6T
void calcPairCombinations(const int p_iNumPoints, const int p_iNumCombinations, std::vector< Pair > &p_pairIdxCombinations) const
static void calcA_k_1(const MatrixX6T &p_matG_k_1, const Vector6T &p_matPhi_k_1, const int p_iIdxk_1, MatrixXT &p_matA_k_1)
static void getPointPair(const int p_iPoints, const int p_iCurIdx, int &p_iIdx1, int &p_iIdx2)
virtual InvSourceEstimate calculateInverse(const FIFFLIB::FiffEvoked &p_fiffEvoked, bool pick_normal=false)
static int getRank(const MatrixXT &p_matSigma)
virtual const char * getName() const
static MatrixXT makeSquareMat(const MatrixXT &p_matF)
static void insertSource(int p_iDipoleIdx1, int p_iDipoleIdx2, const Vector6T &p_vec_phi_k_1, double p_valCor, QList< InvDipolePair< double > > &p_RapDipoles)
void setStcAttr(int p_iSampStcWin, float p_fStcOverlap)
bool init(MNELIB::MNEForwardSolution &p_pFwd, bool p_bSparsed=false, int p_iN=2, double p_dThr=0.5)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixXT
Eigen::Matrix< double, 6, 6 > Matrix6T
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorXT
QSharedPointer< InvRapMusic > SPtr
virtual InvSourceEstimate calculateInverse(const Eigen::MatrixXd &p_matMeasurement, QList< InvDipolePair< double > > &p_RapDipoles) const
void calcOrthProj(const MatrixXT &p_matA_k_1, MatrixXT &p_matOrthProj) const
int calcPhi_s(const MatrixXT &p_matMeasurement, MatrixXT *&p_pMatPhi_s) const
static int useFullRank(const MatrixXT &p_Mat, const MatrixXT &p_matSigma_src, MatrixXT &p_matFull_Rank, int type=NOT_TRANSPOSED)
Eigen::Matrix< double, Eigen::Dynamic, 6 > MatrixX6T
MNELIB::MNEForwardSolution m_ForwardSolution
virtual const MNELIB::MNESourceSpaces & getSourceSpace() const
std::vector< Pair > m_ppPairIdxCombinations
Eigen::Matrix< double, 6, Eigen::Dynamic > Matrix6XT
virtual InvSourceEstimate calculateInverse(const Eigen::MatrixXd &data, float tmin, float tstep, bool pick_normal=false) const
static void getGainMatrixPair(const MatrixXT &p_matGainMarix, MatrixX6T &p_matGainMarix_Pair, int p_iIdx1, int p_iIdx2)
static double subcorr(MatrixX6T &p_matProj_G, const MatrixXT &p_pMatU_B)
QSharedPointer< const InvRapMusic > ConstSPtr
In-memory representation of an -fwd.fif forward solution.
List of MNESourceSpace objects forming a subject source space.