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 class FwdCoil;
58 class FwdCoilSet;
59}
60
61namespace FIFFLIB{
62 class FiffInfo;
63 class FiffCoordTrans;
64 class FiffDigPointSet;
65}
66
67//=============================================================================================================
68// DEFINE NAMESPACE HPILIB
69//=============================================================================================================
70
71namespace INVLIB
72{
73 class InvSensorSet;
74 class InvSignalModel;
76//=============================================================================================================
77// Declare all structures to be used
78//=============================================================================================================
79
85struct CoilParam {
86 Eigen::MatrixXd pos;
87 Eigen::MatrixXd mom;
88 Eigen::VectorXd dpfiterror;
89 Eigen::VectorXd dpfitnumitr;
90
91 CoilParam(int iNumCoils)
92 : pos(Eigen::MatrixXd(iNumCoils,3)),
93 mom(Eigen::MatrixXd::Zero(iNumCoils,3)),
94 dpfiterror(Eigen::VectorXd::Zero(iNumCoils)),
95 dpfitnumitr(Eigen::VectorXd::Zero(iNumCoils))
96 {}
97};
98
115
116//=============================================================================================================
117// HPILIB FORWARD DECLARATIONS
118//=============================================================================================================
119
120//=============================================================================================================
131{
132
133public:
134 typedef QSharedPointer<InvHpiFit> SPtr;
135 typedef QSharedPointer<const InvHpiFit> ConstSPtr;
136
137 //=========================================================================================================
142 explicit InvHpiFit();
143
144 //=========================================================================================================
150 explicit InvHpiFit(const InvSensorSet& sensorSet);
151
152 //=========================================================================================================
158 void checkForUpdate(const InvSensorSet& sensorSet);
159
160 //=========================================================================================================
171 void fit(const Eigen::MatrixXd& matProjectedData,
172 const Eigen::MatrixXd& matProjectors,
173 const InvHpiModelParameters& hpiModelParameters,
174 const Eigen::MatrixXd& matCoilsHead,
175 HpiFitResult& hpiFitResult);
176
177 void fit(const Eigen::MatrixXd& matProjectedData,
178 const Eigen::MatrixXd& matProjectors,
179 const InvHpiModelParameters& hpiModelParameters,
180 const Eigen::MatrixXd& matCoilsHead,
181 const bool bOrderFrequencies,
182 HpiFitResult& hpiFitResult);
183
184 //=========================================================================================================
196 static void storeHeadPosition(float fTime,
197 const Eigen::MatrixXf& matTransDevHead,
198 Eigen::MatrixXd& matPosition,
199 const Eigen::VectorXd& vecGoF,
200 const QVector<double>& vecError);
201
202 //=========================================================================================================
214 static bool compareTransformation(const Eigen::MatrixX4f& mDevHeadT,
215 const Eigen::MatrixX4f& mDevHeadDest,
216 const float& fThreshRot,
217 const float& fThreshTrans);
218
219private:
220
221 //=========================================================================================================
230 Eigen::MatrixXd computeAmplitudes(const Eigen::MatrixXd& matProjectedData,
231 const InvHpiModelParameters& hpiModelParameters);
232
233 //=========================================================================================================
243 Eigen::MatrixXd computeSeedPoints(const Eigen::MatrixXd& matAmplitudes,
244 const FIFFLIB::FiffCoordTrans& transDevHead,
245 const QVector<double>& vecError,
246 const Eigen::MatrixXd& matCoilsHead);
247
248 //=========================================================================================================
262 CoilParam dipfit(const Eigen::MatrixXd matCoilsSeed,
263 const InvSensorSet& sensors,
264 const Eigen::MatrixXd &matData,
265 const int iNumCoils,
266 const Eigen::MatrixXd &t_matProjectors,
267 const int iMaxIterations,
268 const float fAbortError);
269
270 //=========================================================================================================
277 Eigen::VectorXd computeGoF(const Eigen::VectorXd& vecDipFitError);
278
279 //=========================================================================================================
290 FIFFLIB::FiffCoordTrans computeDeviceHeadTransformation(const Eigen::MatrixXd& matCoilsDev,
291 const Eigen::MatrixXd& matCoilsHead);
292
293 //=========================================================================================================
302 QVector<double> computeEstimationError(const Eigen::MatrixXd& matCoilsDev,
303 const Eigen::MatrixXd& matCoilsHead,
304 const FIFFLIB::FiffCoordTrans& transDevHead);
305
306 //=========================================================================================================
314 FIFFLIB::FiffDigPointSet getFittedPointSet(const Eigen::MatrixXd& matCoilsDev);
315
316 //=========================================================================================================
325 Eigen::Matrix4d computeTransformation(Eigen::MatrixXd matNH,
326 Eigen::MatrixXd matBT);
327
328 //=========================================================================================================
337 std::vector<int> findCoilOrder(const Eigen::MatrixXd& matCoilsDev,
338 const Eigen::MatrixXd& matCoilsHead);
339
340 //=========================================================================================================
349 Eigen::MatrixXd order(const std::vector<int>& vecOrder,
350 const Eigen::MatrixXd& matToOrder);
351
352 QVector<int> order(const std::vector<int>& vecOrder,
353 const QVector<int>& vecToOrder);
354
355 //=========================================================================================================
365 double objectTrans(const Eigen::MatrixXd& matHeadCoil,
366 const Eigen::MatrixXd& matCoilsDev,
367 const Eigen::MatrixXd& matTrans);
368
369 InvSensorSet m_sensors;
370 InvSignalModel m_signalModel;
371
372};
373
374//=============================================================================================================
375// INLINE DEFINITIONS
376//=============================================================================================================
377
378} //NAMESPACE
379
380#ifndef metatype_HpiFitResult
381#define metatype_HpiFitResult
383#endif
384
385#endif // INV_HPI_FIT_H
Q_DECLARE_METATYPE(Eigen::MatrixXf)
Container for the FIFF_DIG_POINT records of a measurement (a parsed FIFFB_ISOTRAK block).
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-...
Single digitization point (FIFF_DIG_POINT) with kind (cardinal/HPI/EEG/extra), identifier and 3D coor...
INVLIB library export/import macros, build-info accessors, and namespace docstring for the inverse-so...
#define INVSHARED_EXPORT
Definition inv_global.h:38
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 ...
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:83
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:88
Single MEG sensor coil or EEG electrode — stores the coil-local frame and the (r_mag,...
Definition fwd_coil.h:88
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:85
Eigen::MatrixXd pos
Definition inv_hpi_fit.h:86
Eigen::VectorXd dpfiterror
Definition inv_hpi_fit.h:88
Eigen::VectorXd dpfitnumitr
Definition inv_hpi_fit.h:89
CoilParam(int iNumCoils)
Definition inv_hpi_fit.h:91
Eigen::MatrixXd mom
Definition inv_hpi_fit.h:87
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.