v2.0.0
Loading...
Searching...
No Matches
inv_dipole_fit_data.h
Go to the documentation of this file.
1//=============================================================================================================
23
24#ifndef INV_DIPOLE_FIT_DATA_H
25#define INV_DIPOLE_FIT_DATA_H
26
27//=============================================================================================================
28// INCLUDES
29//=============================================================================================================
30
31#include "../inv_global.h"
32
33#include <fiff/fiff_types.h>
34#include <fwd/fwd_types.h>
36#include <fwd/fwd_bem_model.h>
37#include "inv_dipole_forward.h"
38
39//=============================================================================================================
40// EIGEN INCLUDES
41//=============================================================================================================
42
43#include <Eigen/Core>
44
45//=============================================================================================================
46// QT INCLUDES
47//=============================================================================================================
48
49#include <QSharedPointer>
50#include <QTextStream>
51
52#include <memory>
53
54namespace FIFFLIB
55{
56class FiffCoordTrans;
57}
58namespace MNELIB
59{
60class MNEMeasData;
61}
62
63constexpr int COLUMN_NORM_NONE = 0;
64constexpr int COLUMN_NORM_COMP = 1;
65constexpr int COLUMN_NORM_LOC = 2;
66
67//=============================================================================================================
68// DEFINE NAMESPACE INVLIB
69//=============================================================================================================
70
71namespace INVLIB
72{
73
74// (Replaces *dipoleFitFuncs,dipoleFitFuncsRec struct of MNE-C fit_types.h).
75
98
103
108{
109 float limit;
111 float* B;
112 double B2;
114};
115
116//=============================================================================================================
117// FORWARD DECLARATIONS
118//=============================================================================================================
119
120class InvGuessData;
121class InvEcd;
122
123//=============================================================================================================
140{
141public:
142 typedef QSharedPointer<InvDipoleFitData> SPtr;
143 typedef QSharedPointer<const InvDipoleFitData> ConstSPtr;
144
145 //=========================================================================================================
149 explicit InvDipoleFitData();
150
151 //=========================================================================================================
156 virtual ~InvDipoleFitData();
157
158 //=========================================================================================================
174
175 //=========================================================================================================
192 static std::unique_ptr<MNELIB::MNECovMatrix> ad_hoc_noise(FWDLIB::FwdCoilSet* meg,
194 float grad_std,
195 float mag_std,
196 float eeg_std);
197
198 //=========================================================================================================
211 static int scale_noise_cov(InvDipoleFitData* f, int nave);
212
213 //=========================================================================================================
227
228 //=========================================================================================================
250 int nave,
251 const int* sels);
252
253 //=========================================================================================================
284 const QString& mriname,
285 const QString& measname,
286 const QString& bemname,
287 Eigen::Vector3f* r0,
289 int accurate_coils,
290 const QString& badname,
291 const QString& noisename,
292 float grad_std,
293 float mag_std,
294 float eeg_std,
295 float mag_reg,
296 float grad_reg,
297 float eeg_reg,
298 int diagnoise,
299 const QList<QString>& projnames,
300 int include_meg,
301 int include_eeg);
302
303 //=========================================================================================================
318 static bool fit_one(InvDipoleFitData* fit, InvGuessData* guess, float time, Eigen::Ref<Eigen::VectorXf> B, int verbose, InvEcd& res);
319
320 //=========================================================================================================
336 static int compute_dipole_field(InvDipoleFitData& d, const Eigen::Vector3f& rd, int whiten, Eigen::Ref<Eigen::MatrixXf> fwd);
337
338 //=========================================================================================================
357 static bool print_fields(const Eigen::Vector3f& rd,
358 const Eigen::Vector3f& Q,
359 float time,
360 float integ,
361 InvDipoleFitData& fit,
362 const MNELIB::MNEMeasData& data,
363 QTextStream& out);
364
365 //=========================================================================================================
382 const Eigen::Vector3f& rd,
383 InvDipoleForward* old);
384
385public:
386 std::unique_ptr<FIFFLIB::FiffCoordTrans> mri_head_t;
387 std::unique_ptr<FIFFLIB::FiffCoordTrans> meg_head_t;
389 QList<FIFFLIB::FiffChInfo> chs;
390 int nmeg;
391 int neeg;
392 QStringList ch_names;
393 std::unique_ptr<FIFFLIB::FiffSparseMatrix> pick;
394 std::unique_ptr<FWDLIB::FwdCoilSet> meg_coils;
395 std::unique_ptr<FWDLIB::FwdCoilSet> eeg_els;
396 Eigen::Vector3f r0;
397 QString bemname;
398
399 std::unique_ptr<FWDLIB::FwdEegSphereModel> eeg_model;
400 std::unique_ptr<FWDLIB::FwdBemModel> bem_model;
401
402 std::unique_ptr<dipoleFitFuncsRec> sphere_funcs;
403 std::unique_ptr<dipoleFitFuncsRec> bem_funcs;
405 std::unique_ptr<dipoleFitFuncsRec> mag_dipole_funcs;
406
408 std::unique_ptr<MNELIB::MNECovMatrix> noise_orig;
409 std::unique_ptr<MNELIB::MNECovMatrix> noise;
410 int nave;
411 std::unique_ptr<MNELIB::MNEProjOp> proj;
415};
416
417//=============================================================================================================
418// INLINE DEFINITIONS
419//=============================================================================================================
420} //NAMESPACE
421
422#endif // INV_DIPOLE_FIT_DATA_H
Primitive scalar typedefs and forward-compatible aliases backing the FIFF type system.
Multi-shell spherical head model with Berg-Scherg equivalent-source approximation for fast EEG forwar...
Boundary Element Method (BEM) volume-conductor model — layered triangulated surfaces,...
std::function aliases for the generic dipole field / potential / field-gradient callbacks driving the...
std::function< int(const Eigen::Vector3f &rd, FWDLIB::FwdCoilSet &coils, Eigen::Ref< Eigen::MatrixXf > res, void *client)> fwdVecFieldFunc
Definition fwd_types.h:49
std::function< int(const Eigen::Vector3f &rd, const Eigen::Vector3f &Q, FWDLIB::FwdCoilSet &coils, Eigen::Ref< Eigen::VectorXf > res, void *client)> fwdFieldFunc
Definition fwd_types.h:47
Per-iteration forward-field cache (forward matrix, SVD, column normalisation) used by the dipole-fit ...
constexpr int COLUMN_NORM_NONE
constexpr int COLUMN_NORM_COMP
constexpr int COLUMN_NORM_LOC
INVLIB library export/import macros, build-info accessors, and namespace docstring for the inverse-so...
#define INVSHARED_EXPORT
Definition inv_global.h:38
Core MNE data structures (source spaces, source estimates, hemispheres).
void(* mneUserFreeFunc)(void *)
Generic destructor callback for user-attached data.
Definition mne_types.h:69
FIFF file I/O, in-memory data structures and high-level readers/writers.
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
dipoleFitFuncsRec * dipoleFitFuncs
Pointer alias for dipoleFitFuncsRec, used throughout the dipole fitting module.
Labelled 4x4 FIFF affine: source frame, destination frame, rotation, translation and cached inverse.
Container of FwdCoil instances acting both as the in-memory image of the coil_def....
Multi-shell concentric-sphere head model holding the Berg-Scherg equivalent-source parameters that ac...
Forward field computation function pointers and client data for MEG and EEG dipole fitting.
MNELIB::mneUserFreeFunc eeg_client_free
MNELIB::mneUserFreeFunc meg_client_free
Workspace for the dipole fitting objective function, holding forward model, measured field,...
std::unique_ptr< FWDLIB::FwdEegSphereModel > eeg_model
QSharedPointer< const InvDipoleFitData > ConstSPtr
std::unique_ptr< FWDLIB::FwdCoilSet > meg_coils
static InvDipoleFitData * setup_dipole_fit_data(const QString &mriname, const QString &measname, const QString &bemname, Eigen::Vector3f *r0, FWDLIB::FwdEegSphereModel *eeg_model, int accurate_coils, const QString &badname, const QString &noisename, float grad_std, float mag_std, float eeg_std, float mag_reg, float grad_reg, float eeg_reg, int diagnoise, const QList< QString > &projnames, int include_meg, int include_eeg)
Master setup: read all inputs and build a ready-to-use fit workspace.
std::unique_ptr< FIFFLIB::FiffCoordTrans > mri_head_t
static int scale_dipole_fit_noise_cov(InvDipoleFitData *f, int nave)
Scale dipole-fit noise covariance for a given number of averages.
std::unique_ptr< MNELIB::MNEProjOp > proj
static bool print_fields(const Eigen::Vector3f &rd, const Eigen::Vector3f &Q, float time, float integ, InvDipoleFitData &fit, const MNELIB::MNEMeasData &data, QTextStream &out)
Write the measured and the predicted field of a dipole, channel by channel.
static InvDipoleForward * dipole_forward_one(InvDipoleFitData *d, const Eigen::Vector3f &rd, InvDipoleForward *old)
Compute the forward solution for a single dipole position.
QSharedPointer< InvDipoleFitData > SPtr
std::unique_ptr< MNELIB::MNECovMatrix > noise
std::unique_ptr< dipoleFitFuncsRec > bem_funcs
static int scale_noise_cov(InvDipoleFitData *f, int nave)
Scale the noise-covariance matrix for a given number of averages.
std::unique_ptr< FIFFLIB::FiffSparseMatrix > pick
std::unique_ptr< dipoleFitFuncsRec > sphere_funcs
static bool fit_one(InvDipoleFitData *fit, InvGuessData *guess, float time, Eigen::Ref< Eigen::VectorXf > B, int verbose, InvEcd &res)
Fit a single dipole to the given data.
static int compute_dipole_field(InvDipoleFitData &d, const Eigen::Vector3f &rd, int whiten, Eigen::Ref< Eigen::MatrixXf > fwd)
Compute the forward field for a dipole at the given location.
static int setup_forward_model(InvDipoleFitData *d, MNELIB::MNECTFCompDataSet *comp_data, FWDLIB::FwdCoilSet *comp_coils)
Set up the sphere-model and (optionally) BEM forward functions.
QList< FIFFLIB::FiffChInfo > chs
std::unique_ptr< FWDLIB::FwdBemModel > bem_model
static int select_dipole_fit_noise_cov(InvDipoleFitData *f, MNELIB::MNEMeasData *meas, int nave, const int *sels)
Select and weight the noise-covariance for the active channel set.
std::unique_ptr< FWDLIB::FwdCoilSet > eeg_els
std::unique_ptr< dipoleFitFuncsRec > mag_dipole_funcs
static std::unique_ptr< MNELIB::MNECovMatrix > ad_hoc_noise(FWDLIB::FwdCoilSet *meg, FWDLIB::FwdCoilSet *eeg, float grad_std, float mag_std, float eeg_std)
Create an ad-hoc diagonal noise-covariance matrix.
std::unique_ptr< MNELIB::MNECovMatrix > noise_orig
std::unique_ptr< FIFFLIB::FiffCoordTrans > meg_head_t
Stores forward field matrices and SVD decomposition for magnetic dipole fitting.
Single equivalent current dipole with position, orientation, amplitude, and goodness-of-fit.
Definition inv_ecd.h:58
Precomputed guess point grid with forward fields for initial dipole position candidates.
Collection of CTF third-order gradient compensation operators.
Measurement data container for MNE inverse and dipole-fit computations.