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  m_pHpiFit->fit(matData,
88  matProjectors,
89  hpiModelParameters,
90  matCoilsHead,
91  fitResult);
92 
93  emit resultReady(fitResult);
94 }
95 
96 //=============================================================================================================
97 // DEFINE MEMBER METHODS RtHpi
98 //=============================================================================================================
99 
100 RtHpi::RtHpi(const SensorSet sensorSet, QObject *parent)
101 : QObject(parent),
102  m_sensorSet(sensorSet)
103 {
104  qRegisterMetaType<INVERSELIB::HpiFitResult>("INVERSELIB::HpiFitResult");
105  qRegisterMetaType<QVector<int> >("QVector<int>");
106  qRegisterMetaType<QSharedPointer<FIFFLIB::FiffInfo> >("QSharedPointer<FIFFLIB::FiffInfo>");
107  qRegisterMetaType<Eigen::MatrixXd>("Eigen::MatrixXd");
108 
109  RtHpiWorker *worker = new RtHpiWorker(m_sensorSet);
110  worker->moveToThread(&m_workerThread);
111 
112  connect(&m_workerThread, &QThread::finished,
113  worker, &QObject::deleteLater);
114 
115  connect(this, &RtHpi::operate,
116  worker, &RtHpiWorker::doWork);
117 
118  connect(worker, &RtHpiWorker::resultReady,
119  this, &RtHpi::handleResults);
120 
121  m_workerThread.start();
122 }
123 
124 //=============================================================================================================
125 
127 {
128  stop();
129 }
130 
131 //=============================================================================================================
132 
133 void RtHpi::append(const MatrixXd &data)
134 {
135  if(m_modelParameters.iNHpiCoils() >= 3) {
136  emit operate(data,
138  m_modelParameters,
140  } else {
141  qWarning() << "[RtHpi::append] Not enough coil frequencies set. At least three frequencies are needed.";
142  }
143 }
144 
145 //=============================================================================================================
146 
148 {
149  m_modelParameters = hpiModelParameters;
150 }
151 
152 //=============================================================================================================
153 
154 void RtHpi::setProjectionMatrix(const Eigen::MatrixXd& matProjectors)
155 {
156  m_matProjectors = matProjectors;
157 }
158 
159 //=============================================================================================================
160 
161 void RtHpi::setHpiDigitizer(const Eigen::MatrixXd& matCoilsHead)
162 {
163  m_matCoilsHead = matCoilsHead;
164 }
165 
166 //=============================================================================================================
167 
169 {
170  emit newHpiFitResultAvailable(fitResult);
171 }
172 
173 //=============================================================================================================
174 
176 {
177  stop();
178 
179  RtHpiWorker *worker = new RtHpiWorker(m_sensorSet);
180  worker->moveToThread(&m_workerThread);
181 
182  connect(&m_workerThread, &QThread::finished,
183  worker, &QObject::deleteLater);
184 
185  connect(this, &RtHpi::operate,
186  worker, &RtHpiWorker::doWork);
187 
188  connect(worker, &RtHpiWorker::resultReady,
189  this, &RtHpi::handleResults);
190 
191  m_workerThread.start();
192 }
193 
194 //=============================================================================================================
195 
197 {
198  m_workerThread.requestInterruption();
199  m_workerThread.quit();
200  m_workerThread.wait();
201 }
RTPROCESSINGLIB::RtHpi::m_matCoilsHead
Eigen::MatrixXd m_matCoilsHead
Definition: rthpis.h:207
RTPROCESSINGLIB::RtHpi::setHpiDigitizer
void setHpiDigitizer(const Eigen::MatrixXd &matCoilsHead)
Definition: rthpis.cpp:161
INVERSELIB::HpiModelParameters
Brief description of this class.
Definition: hpimodelparameters.h:75
RTPROCESSINGLIB::RtHpiWorker::RtHpiWorker
RtHpiWorker(const INVERSELIB::SensorSet sensorSet)
Definition: rthpis.cpp:68
RTPROCESSINGLIB::RtHpi::stop
void stop()
Definition: rthpis.cpp:196
hpifit.h
HPIFit class declaration.
RTPROCESSINGLIB::RtHpi::setProjectionMatrix
void setProjectionMatrix(const Eigen::MatrixXd &matProjectors)
Definition: rthpis.cpp:154
RTPROCESSINGLIB::RtHpi::RtHpi
RtHpi(const INVERSELIB::SensorSet sensorSet, QObject *parent=0)
Definition: rthpis.cpp:100
RTPROCESSINGLIB::RtHpi::m_matProjectors
Eigen::MatrixXd m_matProjectors
Definition: rthpis.h:208
RTPROCESSINGLIB::RtHpi::append
void append(const Eigen::MatrixXd &data)
Definition: rthpis.cpp:133
INVERSELIB::HpiFitResult
Definition: hpifit.h:112
fiff_info.h
FiffInfo class declaration.
RTPROCESSINGLIB::RtHpi::m_workerThread
QThread m_workerThread
Definition: rthpis.h:206
FIFFLIB::FiffCoordTrans::from
fiff_int_t from
Definition: fiff_coord_trans.h:295
rthpis.h
RtHpi class declaration.
RTPROCESSINGLIB::RtHpiWorker::doWork
void doWork(const Eigen::MatrixXd &matData, const Eigen::MatrixXd &matProjectors, const INVERSELIB::HpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matCoilsHead)
Definition: rthpis.cpp:73
RTPROCESSINGLIB::RtHpi::setModelParameters
void setModelParameters(INVERSELIB::HpiModelParameters hpiModelParameters)
Definition: rthpis.cpp:147
RTPROCESSINGLIB::RtHpi::restart
void restart()
Definition: rthpis.cpp:175
RTPROCESSINGLIB::RtHpiWorker
Real-time HPI worker.
Definition: rthpis.h:89
FIFFLIB::FiffCoordTrans::to
fiff_int_t to
Definition: fiff_coord_trans.h:296
RTPROCESSINGLIB::RtHpi::~RtHpi
~RtHpi()
Definition: rthpis.cpp:126
sensorset.h
SensorSet class declaration.
INVERSELIB::SensorSet
Definition: sensorset.h:80
RTPROCESSINGLIB::RtHpi::handleResults
void handleResults(const INVERSELIB::HpiFitResult &fitResult)
Definition: rthpis.cpp:168
INVERSELIB::HPIFit
HPI Fit algorithms.
Definition: hpifit.h:134