MNE-CPP  0.1.9
A Framework for Electrophysiology
rthpis.cpp
Go to the documentation of this file.
1 //=============================================================================================================
35 //=============================================================================================================
36 // INCLUDES
37 //=============================================================================================================
38 
39 #include "rthpis.h"
40 
41 #include <inverse/hpiFit/hpifit.h>
43 #include <fiff/fiff_info.h>
44 
45 //=============================================================================================================
46 // EIGEN INCLUDES
47 //=============================================================================================================
48 
49 //=============================================================================================================
50 // QT INCLUDES
51 //=============================================================================================================
52 
53 #include <QElapsedTimer>
54 
55 //=============================================================================================================
56 // USED NAMESPACES
57 //=============================================================================================================
58 
59 using namespace RTPROCESSINGLIB;
60 using namespace FIFFLIB;
61 using namespace Eigen;
62 using namespace INVERSELIB;
63 
64 //=============================================================================================================
65 // DEFINE MEMBER METHODS RtHpiWorker
66 //=============================================================================================================
67 
69 {
70  m_pHpiFit = QSharedPointer<INVERSELIB::HPIFit>(new HPIFit(sensorSet));
71 }
72 
73 void RtHpiWorker::doWork(const Eigen::MatrixXd& matData,
74  const Eigen::MatrixXd& matProjectors,
75  const HpiModelParameters& hpiModelParameters,
76  const Eigen::MatrixXd& matCoilsHead)
77 {
78  if(this->thread()->isInterruptionRequested()) {
79  return;
80  }
81 
82  //Perform actual fitting
83  HpiFitResult fitResult;
84  fitResult.devHeadTrans.from = 1;
85  fitResult.devHeadTrans.to = 4;
86 
87 
88  m_pHpiFit->fit(matData,
89  matProjectors,
90  hpiModelParameters,
91  matCoilsHead,
92  fitResult);
93 
94  emit resultReady(fitResult);
95 }
96 
97 //=============================================================================================================
98 // DEFINE MEMBER METHODS RtHpi
99 //=============================================================================================================
100 
101 RtHpi::RtHpi(const SensorSet sensorSet, QObject *parent)
102 : QObject(parent),
103  m_sensorSet(sensorSet)
104 {
105  qRegisterMetaType<INVERSELIB::HpiFitResult>("INVERSELIB::HpiFitResult");
106  qRegisterMetaType<QVector<int> >("QVector<int>");
107  qRegisterMetaType<QSharedPointer<FIFFLIB::FiffInfo> >("QSharedPointer<FIFFLIB::FiffInfo>");
108  qRegisterMetaType<Eigen::MatrixXd>("Eigen::MatrixXd");
109 
110  RtHpiWorker *worker = new RtHpiWorker(m_sensorSet);
111  worker->moveToThread(&m_workerThread);
112 
113  connect(&m_workerThread, &QThread::finished,
114  worker, &QObject::deleteLater);
115 
116  connect(this, &RtHpi::operate,
117  worker, &RtHpiWorker::doWork);
118 
119  connect(worker, &RtHpiWorker::resultReady,
120  this, &RtHpi::handleResults);
121 
122  m_workerThread.start();
123 }
124 
125 //=============================================================================================================
126 
128 {
129  stop();
130 }
131 
132 //=============================================================================================================
133 
134 void RtHpi::append(const MatrixXd &data)
135 {
136  if(m_modelParameters.iNHpiCoils() >= 3) {
137  emit operate(data,
139  m_modelParameters,
141  } else {
142  qWarning() << "[RtHpi::append] Not enough coil frequencies set. At least three frequencies are needed.";
143  }
144 }
145 
146 //=============================================================================================================
147 
149 {
150  m_modelParameters = hpiModelParameters;
151 }
152 
153 //=============================================================================================================
154 
155 void RtHpi::setProjectionMatrix(const Eigen::MatrixXd& matProjectors)
156 {
157  m_matProjectors = matProjectors;
158 }
159 
160 //=============================================================================================================
161 
162 void RtHpi::setHpiDigitizer(const Eigen::MatrixXd& matCoilsHead)
163 {
164  m_matCoilsHead = matCoilsHead;
165 }
166 
167 //=============================================================================================================
168 
170 {
171  emit newHpiFitResultAvailable(fitResult);
172 }
173 
174 //=============================================================================================================
175 
177 {
178  stop();
179 
180  RtHpiWorker *worker = new RtHpiWorker(m_sensorSet);
181  worker->moveToThread(&m_workerThread);
182 
183  connect(&m_workerThread, &QThread::finished,
184  worker, &QObject::deleteLater);
185 
186  connect(this, &RtHpi::operate,
187  worker, &RtHpiWorker::doWork);
188 
189  connect(worker, &RtHpiWorker::resultReady,
190  this, &RtHpi::handleResults);
191 
192  m_workerThread.start();
193 }
194 
195 //=============================================================================================================
196 
198 {
199  m_workerThread.requestInterruption();
200  m_workerThread.quit();
201  m_workerThread.wait();
202 }
RtHpi class declaration.
void doWork(const Eigen::MatrixXd &matData, const Eigen::MatrixXd &matProjectors, const INVERSELIB::HpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matCoilsHead)
Definition: rthpis.cpp:73
Real-time HPI worker.
Definition: rthpis.h:89
void append(const Eigen::MatrixXd &data)
Definition: rthpis.cpp:134
HPI Fit algorithms.
Definition: hpifit.h:134
RtHpi(const INVERSELIB::SensorSet sensorSet, QObject *parent=0)
Definition: rthpis.cpp:101
HPIFit class declaration.
QThread m_workerThread
Definition: rthpis.h:206
Eigen::MatrixXd m_matProjectors
Definition: rthpis.h:208
Brief description of this class.
void handleResults(const INVERSELIB::HpiFitResult &fitResult)
Definition: rthpis.cpp:169
SensorSet class declaration.
Eigen::MatrixXd m_matCoilsHead
Definition: rthpis.h:207
void setModelParameters(INVERSELIB::HpiModelParameters hpiModelParameters)
Definition: rthpis.cpp:148
RtHpiWorker(const INVERSELIB::SensorSet sensorSet)
Definition: rthpis.cpp:68
void setHpiDigitizer(const Eigen::MatrixXd &matCoilsHead)
Definition: rthpis.cpp:162
FiffInfo class declaration.
void setProjectionMatrix(const Eigen::MatrixXd &matProjectors)
Definition: rthpis.cpp:155