v2.0.0
Loading...
Searching...
No Matches
inv_hpi_fit.h
Go to the documentation of this file.
1//=============================================================================================================
23
24#ifndef INV_HPI_FIT_H
25#define INV_HPI_FIT_H
26
27//=============================================================================================================
28// INCLUDES
29//=============================================================================================================
30
31#include "../inv_global.h"
32#include <fiff/fiff_ch_info.h>
33#include "inv_sensor_set.h"
34#include "inv_signal_model.h"
36#include <fiff/fiff_dig_point.h>
38
39//=============================================================================================================
40// EIGEN INCLUDES
41//=============================================================================================================
42
43#include <Eigen/Core>
44#include <Eigen/Geometry>
45
46//=============================================================================================================
47// QT INCLUDES
48//=============================================================================================================
49
50#include <QSharedPointer>
51
52//=============================================================================================================
53// FORWARD DECLARATIONS
54//=============================================================================================================
55
56namespace FWDLIB
57{
58class FwdCoil;
59class FwdCoilSet;
60}
61
62namespace FIFFLIB
63{
64class FiffInfo;
65class FiffCoordTrans;
66class FiffDigPointSet;
67}
68
69//=============================================================================================================
70// DEFINE NAMESPACE HPILIB
71//=============================================================================================================
72
73namespace INVLIB
74{
75class InvSensorSet;
76class InvSignalModel;
78//=============================================================================================================
79// Declare all structures to be used
80//=============================================================================================================
81
88{
89 Eigen::MatrixXd pos;
90 Eigen::MatrixXd mom;
91 Eigen::VectorXd dpfiterror;
92 Eigen::VectorXd dpfitnumitr;
93
94 CoilParam(int iNumCoils)
95 : pos(Eigen::MatrixXd(iNumCoils, 3))
96 , mom(Eigen::MatrixXd::Zero(iNumCoils, 3))
97 , dpfiterror(Eigen::VectorXd::Zero(iNumCoils))
98 , dpfitnumitr(Eigen::VectorXd::Zero(iNumCoils))
99 {
100 }
101};
102
122
123//=============================================================================================================
124// HPILIB FORWARD DECLARATIONS
125//=============================================================================================================
126
127//=============================================================================================================
140{
141public:
142 typedef QSharedPointer<InvHpiFit> SPtr;
143 typedef QSharedPointer<const InvHpiFit> ConstSPtr;
144
145 //=========================================================================================================
150 explicit InvHpiFit();
151
152 //=========================================================================================================
158 explicit InvHpiFit(const InvSensorSet& sensorSet);
159
160 //=========================================================================================================
166 void checkForUpdate(const InvSensorSet& sensorSet);
167
168 //=========================================================================================================
178 void fit(const Eigen::MatrixXd& matProjectedData,
179 const Eigen::MatrixXd& matProjectors,
180 const InvHpiModelParameters& hpiModelParameters,
181 const Eigen::MatrixXd& matCoilsHead,
182 HpiFitResult& hpiFitResult);
183
184 void fit(const Eigen::MatrixXd& matProjectedData,
185 const Eigen::MatrixXd& matProjectors,
186 const InvHpiModelParameters& hpiModelParameters,
187 const Eigen::MatrixXd& matCoilsHead,
188 const bool bOrderFrequencies,
189 HpiFitResult& hpiFitResult);
190
191 //=========================================================================================================
203 static void storeHeadPosition(float fTime,
204 const Eigen::MatrixXf& matTransDevHead,
205 Eigen::MatrixXd& matPosition,
206 const Eigen::VectorXd& vecGoF,
207 const QVector<double>& vecError);
208
209 //=========================================================================================================
221 static bool compareTransformation(const Eigen::MatrixX4f& mDevHeadT,
222 const Eigen::MatrixX4f& mDevHeadDest,
223 const float& fThreshRot,
224 const float& fThreshTrans);
225
226private:
227 //=========================================================================================================
236 Eigen::MatrixXd computeAmplitudes(const Eigen::MatrixXd& matProjectedData,
237 const InvHpiModelParameters& hpiModelParameters);
238
239 //=========================================================================================================
249 Eigen::MatrixXd computeSeedPoints(const Eigen::MatrixXd& matAmplitudes,
250 const FIFFLIB::FiffCoordTrans& transDevHead,
251 const QVector<double>& vecError,
252 const Eigen::MatrixXd& matCoilsHead);
253
254 //=========================================================================================================
268 CoilParam dipfit(const Eigen::MatrixXd matCoilsSeed,
269 const InvSensorSet& sensors,
270 const Eigen::MatrixXd& matData,
271 const int iNumCoils,
272 const Eigen::MatrixXd& t_matProjectors,
273 const int iMaxIterations,
274 const float fAbortError);
275
276 //=========================================================================================================
283 Eigen::VectorXd computeGoF(const Eigen::VectorXd& vecDipFitError);
284
285 //=========================================================================================================
294 FIFFLIB::FiffCoordTrans computeDeviceHeadTransformation(const Eigen::MatrixXd& matCoilsDev,
295 const Eigen::MatrixXd& matCoilsHead);
296
297 //=========================================================================================================
306 QVector<double> computeEstimationError(const Eigen::MatrixXd& matCoilsDev,
307 const Eigen::MatrixXd& matCoilsHead,
308 const FIFFLIB::FiffCoordTrans& transDevHead);
309
310 //=========================================================================================================
318 FIFFLIB::FiffDigPointSet getFittedPointSet(const Eigen::MatrixXd& matCoilsDev);
319
320 //=========================================================================================================
329 Eigen::Matrix4d computeTransformation(Eigen::MatrixXd matNH,
330 Eigen::MatrixXd matBT);
331
332 //=========================================================================================================
341 std::vector<int> findCoilOrder(const Eigen::MatrixXd& matCoilsDev,
342 const Eigen::MatrixXd& matCoilsHead);
343
344 //=========================================================================================================
353 Eigen::MatrixXd order(const std::vector<int>& vecOrder,
354 const Eigen::MatrixXd& matToOrder);
355
356 QVector<int> order(const std::vector<int>& vecOrder,
357 const QVector<int>& vecToOrder);
358
359 //=========================================================================================================
369 double objectTrans(const Eigen::MatrixXd& matHeadCoil,
370 const Eigen::MatrixXd& matCoilsDev,
371 const Eigen::MatrixXd& matTrans);
372
373 InvSensorSet m_sensors;
374 InvSignalModel m_signalModel;
375};
376
377//=============================================================================================================
378// INLINE DEFINITIONS
379//=============================================================================================================
380
381} //NAMESPACE
382
383#ifndef metatype_HpiFitResult
384#define metatype_HpiFitResult
386#endif
387
388#endif // INV_HPI_FIT_H
Q_DECLARE_METATYPE(Eigen::MatrixXf)
FIFF channel descriptor record (FIFF_CH_INFO): per-channel logical/scanner numbers,...
4x4 affine FIFF coordinate transform (FIFF_COORD_TRANS) annotated with source/destination coordinate-...
Container for the FIFF_DIG_POINT records of a measurement (a parsed FIFFB_ISOTRAK block).
Single digitization point (FIFF_DIG_POINT) with kind (cardinal/HPI/EEG/extra), identifier and 3D coor...
Sinusoidal HPI signal model — builds and inverts the regressor matrix that extracts coil amplitudes f...
Compact MEG sensor-geometry container (positions, orientations, integration weights) used by the HPI ...
INVLIB library export/import macros, build-info accessors, and namespace docstring for the inverse-so...
#define INVSHARED_EXPORT
Definition inv_global.h:38
FIFF file I/O, in-memory data structures and high-level readers/writers.
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
Forward modelling — BEM solver, spherical models, sensor/coil definitions and the lead-field assembly...
Definition compute_fwd.h:85
Labelled 4x4 FIFF affine: source frame, destination frame, rotation, translation and cached inverse.
Collection of FiffDigPoint records as parsed from a FIFFB_ISOTRAK block.
Full FIFF measurement info: per-channel descriptors, sampling and filter setup, projectors,...
Definition fiff_info.h:90
Single MEG sensor coil or EEG electrode — stores the coil-local frame and the (r_mag,...
Definition fwd_coil.h:93
Container of FwdCoil instances acting both as the in-memory image of the coil_def....
Estimated dipole parameters (position, moment, goodness-of-fit) for a single HPI coil.
Definition inv_hpi_fit.h:88
Eigen::MatrixXd pos
Definition inv_hpi_fit.h:89
Eigen::VectorXd dpfiterror
Definition inv_hpi_fit.h:91
Eigen::VectorXd dpfitnumitr
Definition inv_hpi_fit.h:92
CoilParam(int iNumCoils)
Definition inv_hpi_fit.h:94
Eigen::MatrixXd mom
Definition inv_hpi_fit.h:90
Complete HPI fit output: per-coil dipole parameters, head-to-device transform, fit error,...
FIFFLIB::FiffCoordTrans devHeadTrans
QVector< int > hpiFreqs
QVector< double > errorDistances
Eigen::VectorXd GoF
FIFFLIB::FiffDigPointSet fittedCoils
static bool compareTransformation(const Eigen::MatrixX4f &mDevHeadT, const Eigen::MatrixX4f &mDevHeadDest, const float &fThreshRot, const float &fThreshTrans)
QSharedPointer< InvHpiFit > SPtr
void fit(const Eigen::MatrixXd &matProjectedData, const Eigen::MatrixXd &matProjectors, const InvHpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matCoilsHead, HpiFitResult &hpiFitResult)
QSharedPointer< const InvHpiFit > ConstSPtr
void fit(const Eigen::MatrixXd &matProjectedData, const Eigen::MatrixXd &matProjectors, const InvHpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matCoilsHead, const bool bOrderFrequencies, HpiFitResult &hpiFitResult)
void checkForUpdate(const InvSensorSet &sensorSet)
static void storeHeadPosition(float fTime, const Eigen::MatrixXf &matTransDevHead, Eigen::MatrixXd &matPosition, const Eigen::VectorXd &vecGoF, const QVector< double > &vecError)
Configuration parameters for the HPI signal model (line frequency, coil frequencies,...
Stores MEG sensor geometry (positions, orientations, weights, coil count) for a single sensor type.
Generates the forward sinusoidal model matrix for HPI coil signals at known drive frequencies.