v2.0.0
Loading...
Searching...
No Matches
rt_hpis.cpp
Go to the documentation of this file.
1//=============================================================================================================
12
13//=============================================================================================================
14// INCLUDES
15//=============================================================================================================
16
17#include "rt_hpis.h"
18
19#include <inv/hpi/inv_hpi_fit.h>
21#include <fiff/fiff_info.h>
22
23//=============================================================================================================
24// EIGEN INCLUDES
25//=============================================================================================================
26
27//=============================================================================================================
28// QT INCLUDES
29//=============================================================================================================
30
31#include <QElapsedTimer>
32
33//=============================================================================================================
34// USED NAMESPACES
35//=============================================================================================================
36
37using namespace RTPROCESSINGLIB;
38using namespace FIFFLIB;
39using namespace Eigen;
40using namespace INVLIB;
41
42//=============================================================================================================
43// DEFINE MEMBER METHODS RtHpiWorker
44//=============================================================================================================
45
47{
48 m_pHpiFit = QSharedPointer<INVLIB::InvHpiFit>(new InvHpiFit(sensorSet));
49}
50
51void RtHpiWorker::doWork(const Eigen::MatrixXd& matData,
52 const Eigen::MatrixXd& matProjectors,
53 const InvHpiModelParameters& hpiModelParameters,
54 const Eigen::MatrixXd& matCoilsHead)
55{
56 if(this->thread()->isInterruptionRequested()) {
57 return;
58 }
59
60 //Perform actual fitting
61 HpiFitResult fitResult;
62 fitResult.devHeadTrans.from = 1;
63 fitResult.devHeadTrans.to = 4;
64
65 m_pHpiFit->fit(matData,
66 matProjectors,
67 hpiModelParameters,
68 matCoilsHead,
69 fitResult);
70
71 emit resultReady(fitResult);
72}
73
74//=============================================================================================================
75// DEFINE MEMBER METHODS RtHpi
76//=============================================================================================================
77
78RtHpi::RtHpi(const InvSensorSet sensorSet, QObject *parent)
79: QObject(parent),
80 m_sensorSet(sensorSet)
81{
82 qRegisterMetaType<INVLIB::HpiFitResult>("INVLIB::HpiFitResult");
83 qRegisterMetaType<QVector<int> >("QVector<int>");
84 qRegisterMetaType<QSharedPointer<FIFFLIB::FiffInfo> >("QSharedPointer<FIFFLIB::FiffInfo>");
85 qRegisterMetaType<Eigen::MatrixXd>("Eigen::MatrixXd");
86
87 RtHpiWorker *worker = new RtHpiWorker(m_sensorSet);
88 worker->moveToThread(&m_workerThread);
89
90 connect(&m_workerThread, &QThread::finished,
91 worker, &QObject::deleteLater);
92
93 connect(this, &RtHpi::operate,
94 worker, &RtHpiWorker::doWork);
95
96 connect(worker, &RtHpiWorker::resultReady,
98
99 m_workerThread.start();
100}
101
102//=============================================================================================================
103
105{
106 stop();
107}
108
109//=============================================================================================================
110
111void RtHpi::append(const MatrixXd &data)
112{
113 if(m_modelParameters.iNHpiCoils() >= 3) {
114 emit operate(data,
118 } else {
119 qWarning() << "[RtHpi::append] Not enough coil frequencies set. At least three frequencies are needed.";
120 }
121}
122
123//=============================================================================================================
124
126{
127 m_modelParameters = hpiModelParameters;
128}
129
130//=============================================================================================================
131
132void RtHpi::setProjectionMatrix(const Eigen::MatrixXd& matProjectors)
133{
134 m_matProjectors = matProjectors;
135}
136
137//=============================================================================================================
138
139void RtHpi::setHpiDigitizer(const Eigen::MatrixXd& matCoilsHead)
140{
141 m_matCoilsHead = matCoilsHead;
142}
143
144//=============================================================================================================
145
147{
148 emit newHpiFitResultAvailable(fitResult);
149}
150
151//=============================================================================================================
152
154{
155 stop();
156
157 RtHpiWorker *worker = new RtHpiWorker(m_sensorSet);
158 worker->moveToThread(&m_workerThread);
159
160 connect(&m_workerThread, &QThread::finished,
161 worker, &QObject::deleteLater);
162
163 connect(this, &RtHpi::operate,
164 worker, &RtHpiWorker::doWork);
165
166 connect(worker, &RtHpiWorker::resultReady,
167 this, &RtHpi::handleResults);
168
169 m_workerThread.start();
170}
171
172//=============================================================================================================
173
175{
176 m_workerThread.requestInterruption();
177 m_workerThread.quit();
178 m_workerThread.wait();
179}
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
HPI (Head Position Indicator) fitting — estimates the MEG dewar-to-head transform from coil-current s...
Compact MEG sensor-geometry container (positions, orientations, integration weights) used by the HPI ...
Real-time continuous Head-Position-Indicator (cHPI) coil-localisation worker.
FIFF file I/O, in-memory data structures and high-level readers/writers.
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
Background worker thread that runs continuous HPI coil localization.
Definition rt_hpis.h:82
RtHpiWorker(const INVLIB::InvSensorSet sensorSet)
Definition rt_hpis.cpp:46
void doWork(const Eigen::MatrixXd &matData, const Eigen::MatrixXd &matProjectors, const INVLIB::InvHpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matCoilsHead)
Definition rt_hpis.cpp:51
void resultReady(const INVLIB::HpiFitResult &fitResult)
QSharedPointer< INVLIB::InvHpiFit > m_pHpiFit
Definition rt_hpis.h:111
INVLIB::InvSensorSet m_sensorSet
Definition rt_hpis.h:201
void newHpiFitResultAvailable(const INVLIB::HpiFitResult &fitResult)
INVLIB::InvHpiModelParameters m_modelParameters
Definition rt_hpis.h:202
Eigen::MatrixXd m_matCoilsHead
Definition rt_hpis.h:199
void setHpiDigitizer(const Eigen::MatrixXd &matCoilsHead)
Definition rt_hpis.cpp:139
void append(const Eigen::MatrixXd &data)
Definition rt_hpis.cpp:111
RtHpi(const INVLIB::InvSensorSet sensorSet, QObject *parent=0)
Definition rt_hpis.cpp:78
void setProjectionMatrix(const Eigen::MatrixXd &matProjectors)
Definition rt_hpis.cpp:132
Eigen::MatrixXd m_matProjectors
Definition rt_hpis.h:200
void setModelParameters(INVLIB::InvHpiModelParameters hpiModelParameters)
Definition rt_hpis.cpp:125
void handleResults(const INVLIB::HpiFitResult &fitResult)
Definition rt_hpis.cpp:146
void operate(const Eigen::MatrixXd &matData, const Eigen::MatrixXd &matProjectors, const INVLIB::InvHpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matCoilsHead)
Complete HPI fit output: per-coil dipole parameters, head-to-device transform, fit error,...
FIFFLIB::FiffCoordTrans devHeadTrans
Drives one HPI fit (per-coil dipole localisation, coil ordering, dewar-to-head transform).
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.