InvHpiFitData
Namespace: INVLIB · Library: Inverse Library
#include <inv/inv_hpi_fit_data.h>
class INVLIB::InvHpiFitData
Per-coil magnetic-dipole fitter: computes the infinite-medium leadfield for a candidate coil position, evaluates the residual against the projected MEG sample and refines the position with a Nelder-Mead simplex search.
Routines are validated against FieldTrip's magnetic_dipole and ft_compute_leadfield reference implementations.
Per-coil magnetic-dipole fitter (leadfield, residual, Nelder-Mead refinement) for the HPI pipeline.
src/examples/ex_inv_hpi/main.cpp
// One coil's magnetic-dipole fit, as InvHpiFit runs it per coil: seeded 5 mm off the fitted position.
const MatrixXd coilsDevice = fit.devHeadTrans.apply_inverse_trans(updater.getHpiDigitizer().cast<float>()).cast<double>();
InvHpiFitData coilFit;
coilFit.m_coilPos = coilsDevice.row(0) + RowVector3d(0.005, 0.0, 0.0);
const int strongest = amplitudes.row(0).squaredNorm() >= amplitudes.row(4).squaredNorm() ? 0 : 4;
coilFit.m_sensorData = amplitudes.row(strongest).transpose();
coilFit.m_sensors = updater.getSensors();
coilFit.m_matProjector = updater.getProjectors();
coilFit.m_iMaxIterations = 500;
coilFit.m_fAbortError = 1e-9f;
coilFit.doDipfitConcurrent();
Public Methods
InvHpiFitData()
Default constructor.
doDipfitConcurrent()
dipfit function is adapted from Fieldtrip Software.
Example
- Full source:
src/examples/ex_inv_hpi/main.cpp - Build target:
ex_inv_hpi(runs under CTest) - Data: mne-cpp-test-data
Used in examples
ex_inv_hpi
Inverse library: continuous head position (HPI) fitting.
src/examples/ex_inv_hpi/main.cpp, line 134
// One coil's magnetic-dipole fit, as InvHpiFit runs it per coil: seeded 5 mm off the fitted position.
const MatrixXd coilsDevice = fit.devHeadTrans.apply_inverse_trans(updater.getHpiDigitizer().cast<float>()).cast<double>();
InvHpiFitData coilFit;
coilFit.m_coilPos = coilsDevice.row(0) + RowVector3d(0.005, 0.0, 0.0);
const int strongest = amplitudes.row(0).squaredNorm() >= amplitudes.row(4).squaredNorm() ? 0 : 4;
coilFit.m_sensorData = amplitudes.row(strongest).transpose();
coilFit.m_sensors = updater.getSensors();
coilFit.m_matProjector = updater.getProjectors();
coilFit.m_iMaxIterations = 500;
coilFit.m_fAbortError = 1e-9f;
coilFit.doDipfitConcurrent();
ok &= expect((coilFit.m_coilPos - coilsDevice.row(0)).norm() < 0.002 && coilFit.m_errorInfo.error < 0.05,
QString("InvHpiFitData: the single-coil fit returns to within %1 mm of the full fit").arg(1e3 * (coilFit.m_coilPos - coilsDevice.row(0)).norm(), 0, 'f', 2));
Authors of this file
- Christoph Dinh <christoph.dinh@mne-cpp.org>