Skip to main content

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​

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​