v2.0.0
Loading...
Searching...
No Matches
inv_hpi_fit.h
Go to the documentation of this file.
1//=============================================================================================================
37
38#ifndef INV_HPI_FIT_H
39#define INV_HPI_FIT_H
40
41//=============================================================================================================
42// INCLUDES
43//=============================================================================================================
44
45#include "../inv_global.h"
46#include <fiff/fiff_ch_info.h>
47#include "inv_sensor_set.h"
48#include "inv_signal_model.h"
50#include <fiff/fiff_dig_point.h>
52
53//=============================================================================================================
54// EIGEN INCLUDES
55//=============================================================================================================
56
57#include <Eigen/Core>
58#include <Eigen/Geometry>
59
60//=============================================================================================================
61// QT INCLUDES
62//=============================================================================================================
63
64#include <QSharedPointer>
65
66//=============================================================================================================
67// FORWARD DECLARATIONS
68//=============================================================================================================
69
70namespace FWDLIB{
71 class FwdCoil;
72 class FwdCoilSet;
73}
74
75namespace FIFFLIB{
76 class FiffInfo;
77 class FiffCoordTrans;
78 class FiffDigPointSet;
79}
80
81//=============================================================================================================
82// DEFINE NAMESPACE HPILIB
83//=============================================================================================================
84
85namespace INVLIB
86{
87 class InvSensorSet;
88 class InvSignalModel;
90//=============================================================================================================
91// Declare all structures to be used
92//=============================================================================================================
93
99struct CoilParam {
100 Eigen::MatrixXd pos;
101 Eigen::MatrixXd mom;
102 Eigen::VectorXd dpfiterror;
103 Eigen::VectorXd dpfitnumitr;
104
105 CoilParam(int iNumCoils)
106 : pos(Eigen::MatrixXd(iNumCoils,3)),
107 mom(Eigen::MatrixXd::Zero(iNumCoils,3)),
108 dpfiterror(Eigen::VectorXd::Zero(iNumCoils)),
109 dpfitnumitr(Eigen::VectorXd::Zero(iNumCoils))
110 {}
111};
112
129
130//=============================================================================================================
131// HPILIB FORWARD DECLARATIONS
132//=============================================================================================================
133
134//=============================================================================================================
141{
142
143public:
144 typedef QSharedPointer<InvHpiFit> SPtr;
145 typedef QSharedPointer<const InvHpiFit> ConstSPtr;
146
147 //=========================================================================================================
152 explicit InvHpiFit();
153
154 //=========================================================================================================
160 explicit InvHpiFit(const InvSensorSet& sensorSet);
161
162 //=========================================================================================================
168 void checkForUpdate(const InvSensorSet& sensorSet);
169
170 //=========================================================================================================
181 void fit(const Eigen::MatrixXd& matProjectedData,
182 const Eigen::MatrixXd& matProjectors,
183 const InvHpiModelParameters& hpiModelParameters,
184 const Eigen::MatrixXd& matCoilsHead,
185 HpiFitResult& hpiFitResult);
186
187 void fit(const Eigen::MatrixXd& matProjectedData,
188 const Eigen::MatrixXd& matProjectors,
189 const InvHpiModelParameters& hpiModelParameters,
190 const Eigen::MatrixXd& matCoilsHead,
191 const bool bOrderFrequencies,
192 HpiFitResult& hpiFitResult);
193
194 //=========================================================================================================
206 static void storeHeadPosition(float fTime,
207 const Eigen::MatrixXf& matTransDevHead,
208 Eigen::MatrixXd& matPosition,
209 const Eigen::VectorXd& vecGoF,
210 const QVector<double>& vecError);
211
212 //=========================================================================================================
224 static bool compareTransformation(const Eigen::MatrixX4f& mDevHeadT,
225 const Eigen::MatrixX4f& mDevHeadDest,
226 const float& fThreshRot,
227 const float& fThreshTrans);
228
229private:
230
231 //=========================================================================================================
240 Eigen::MatrixXd computeAmplitudes(const Eigen::MatrixXd& matProjectedData,
241 const InvHpiModelParameters& hpiModelParameters);
242
243 //=========================================================================================================
253 Eigen::MatrixXd computeSeedPoints(const Eigen::MatrixXd& matAmplitudes,
254 const FIFFLIB::FiffCoordTrans& transDevHead,
255 const QVector<double>& vecError,
256 const Eigen::MatrixXd& matCoilsHead);
257
258 //=========================================================================================================
272 CoilParam dipfit(const Eigen::MatrixXd matCoilsSeed,
273 const InvSensorSet& sensors,
274 const Eigen::MatrixXd &matData,
275 const int iNumCoils,
276 const Eigen::MatrixXd &t_matProjectors,
277 const int iMaxIterations,
278 const float fAbortError);
279
280 //=========================================================================================================
287 Eigen::VectorXd computeGoF(const Eigen::VectorXd& vecDipFitError);
288
289 //=========================================================================================================
300 FIFFLIB::FiffCoordTrans computeDeviceHeadTransformation(const Eigen::MatrixXd& matCoilsDev,
301 const Eigen::MatrixXd& matCoilsHead);
302
303 //=========================================================================================================
312 QVector<double> computeEstimationError(const Eigen::MatrixXd& matCoilsDev,
313 const Eigen::MatrixXd& matCoilsHead,
314 const FIFFLIB::FiffCoordTrans& transDevHead);
315
316 //=========================================================================================================
324 FIFFLIB::FiffDigPointSet getFittedPointSet(const Eigen::MatrixXd& matCoilsDev);
325
326 //=========================================================================================================
335 Eigen::Matrix4d computeTransformation(Eigen::MatrixXd matNH,
336 Eigen::MatrixXd matBT);
337
338 //=========================================================================================================
347 std::vector<int> findCoilOrder(const Eigen::MatrixXd& matCoilsDev,
348 const Eigen::MatrixXd& matCoilsHead);
349
350 //=========================================================================================================
359 Eigen::MatrixXd order(const std::vector<int>& vecOrder,
360 const Eigen::MatrixXd& matToOrder);
361
362 QVector<int> order(const std::vector<int>& vecOrder,
363 const QVector<int>& vecToOrder);
364
365 //=========================================================================================================
375 double objectTrans(const Eigen::MatrixXd& matHeadCoil,
376 const Eigen::MatrixXd& matCoilsDev,
377 const Eigen::MatrixXd& matTrans);
378
379 InvSensorSet m_sensors;
380 InvSignalModel m_signalModel;
381
382};
383
384//=============================================================================================================
385// INLINE DEFINITIONS
386//=============================================================================================================
387
388} //NAMESPACE
389
390#ifndef metatype_HpiFitResult
391#define metatype_HpiFitResult
393#endif
394
395#endif // INV_HPI_FIT_H
InvSensorSet class declaration.
InvSignalModel class declaration.
inverse library export/import macros.
#define INVSHARED_EXPORT
Definition inv_global.h:52
FiffDigPointSet class declaration.
FiffChInfo class declaration.
FiffCoordTrans class declaration.
FiffDigPoint class declaration.
Q_DECLARE_METATYPE(Eigen::MatrixXf)
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
Forward modelling (BEM, MEG/EEG lead fields).
Definition compute_fwd.h:91
Coordinate transformation description.
Holds a set of digitizer points.
FIFF measurement file information.
Definition fiff_info.h:86
Single MEG or EEG sensor coil with integration points, weights, and coordinate frame.
Definition fwd_coil.h:93
Collection of FwdCoil objects representing a full MEG or EEG sensor array.
Estimated dipole parameters (position, moment, goodness-of-fit) for a single HPI coil.
Definition inv_hpi_fit.h:99
Eigen::MatrixXd pos
Eigen::VectorXd dpfiterror
Eigen::VectorXd dpfitnumitr
CoilParam(int iNumCoils)
Eigen::MatrixXd mom
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.