MNE-CPP  0.1.9
A Framework for Electrophysiology
hpifit.h
Go to the documentation of this file.
1 //=============================================================================================================
37 #ifndef HPIFIT_H
38 #define HPIFIT_H
39 
40 //=============================================================================================================
41 // INCLUDES
42 //=============================================================================================================
43 
44 #include "../inverse_global.h"
45 #include "fiff/fiff_ch_info.h"
46 #include "sensorset.h"
47 #include "signalmodel.h"
49 #include <fiff/fiff_dig_point.h>
50 #include <fiff/fiff_coord_trans.h>
51 
52 //=============================================================================================================
53 // EIGEN INCLUDES
54 //=============================================================================================================
55 
56 #include <Eigen/Core>
57 
58 //=============================================================================================================
59 // QT INCLUDES
60 //=============================================================================================================
61 
62 #include <QSharedPointer>
63 
64 //=============================================================================================================
65 // FORWARD DECLARATIONS
66 //=============================================================================================================
67 
68 namespace FWDLIB{
69  class FwdCoil;
70  class FwdCoilSet;
71 }
72 
73 namespace FIFFLIB{
74  class FiffInfo;
75  class FiffCoordTrans;
76  class FiffDigPointSet;
77 }
78 
79 //=============================================================================================================
80 // DEFINE NAMESPACE INVERSELIB
81 //=============================================================================================================
82 
83 namespace INVERSELIB
84 {
85  class SensorSet;
86  class SignalModel;
87  class HpiModelParameters;
88 //=============================================================================================================
89 // Declare all structures to be used
90 //=============================================================================================================
91 
95 struct CoilParam {
96  Eigen::MatrixXd pos;
97  Eigen::MatrixXd mom;
98  Eigen::VectorXd dpfiterror;
99  Eigen::VectorXd dpfitnumitr;
100 
101  CoilParam(int iNumCoils)
102  : pos(Eigen::MatrixXd(iNumCoils,3)),
103  mom(Eigen::MatrixXd::Zero(iNumCoils,3)),
104  dpfiterror(Eigen::VectorXd::Zero(iNumCoils)),
105  dpfitnumitr(Eigen::VectorXd::Zero(iNumCoils))
106  {}
107 };
108 
112 struct HpiFitResult {
113  QVector<int> hpiFreqs;
114  FIFFLIB::FiffDigPointSet fittedCoils;
115  FIFFLIB::FiffCoordTrans devHeadTrans;
116  QVector<double> errorDistances;
117  Eigen::VectorXd GoF;
118  QString sFilePathDigitzers;
119  bool bIsLargeHeadMovement;
120  float fHeadMovementDistance;
121  float fHeadMovementAngle;
122 };
123 
124 //=============================================================================================================
125 // INVERSELIB FORWARD DECLARATIONS
126 //=============================================================================================================
127 
128 //=============================================================================================================
135 {
136 
137 public:
138  typedef QSharedPointer<HPIFit> SPtr;
139  typedef QSharedPointer<const HPIFit> ConstSPtr;
141  //=========================================================================================================
146  explicit HPIFit();
147 
148  //=========================================================================================================
154  explicit HPIFit(const SensorSet& sensorSet);
155 
156  //=========================================================================================================
162  void checkForUpdate(const SensorSet& sensorSet);
163 
164  //=========================================================================================================
175  void fit(const Eigen::MatrixXd& matProjectedData,
176  const Eigen::MatrixXd& matProjectors,
177  const HpiModelParameters& hpiModelParameters,
178  const Eigen::MatrixXd& matCoilsHead,
179  HpiFitResult& hpiFitResult);
180 
181  void fit(const Eigen::MatrixXd& matProjectedData,
182  const Eigen::MatrixXd& matProjectors,
183  const HpiModelParameters& hpiModelParameters,
184  const Eigen::MatrixXd& matCoilsHead,
185  const bool bOrderFrequencies,
186  HpiFitResult& hpiFitResult);
187 
188  //=========================================================================================================
202  static void storeHeadPosition(float fTime,
203  const Eigen::MatrixXf& matTransDevHead,
204  Eigen::MatrixXd& matPosition,
205  const Eigen::VectorXd& vecGoF,
206  const QVector<double>& vecError);
207 
208 private:
209 
210  //=========================================================================================================
219  Eigen::MatrixXd computeAmplitudes(const Eigen::MatrixXd& matProjectedData,
220  const HpiModelParameters& hpiModelParameters);
221 
222  //=========================================================================================================
232  Eigen::MatrixXd computeSeedPoints(const Eigen::MatrixXd& matAmplitudes,
233  const FIFFLIB::FiffCoordTrans& transDevHead,
234  const QVector<double>& vecError,
235  const Eigen::MatrixXd& matCoilsHead);
236 
237  //=========================================================================================================
251  CoilParam dipfit(const Eigen::MatrixXd matCoilsSeed,
252  const SensorSet& sensors,
253  const Eigen::MatrixXd &matData,
254  const int iNumCoils,
255  const Eigen::MatrixXd &t_matProjectors,
256  const int iMaxIterations,
257  const float fAbortError);
258 
259  //=========================================================================================================
266  Eigen::VectorXd computeGoF(const Eigen::VectorXd& vecDipFitError);
267 
268  //=========================================================================================================
279  FIFFLIB::FiffCoordTrans computeDeviceHeadTransformation(const Eigen::MatrixXd& matCoilsDev,
280  const Eigen::MatrixXd& matCoilsHead);
281 
282  //=========================================================================================================
291  QVector<double> computeEstimationError(const Eigen::MatrixXd& matCoilsDev,
292  const Eigen::MatrixXd& matCoilsHead,
293  const FIFFLIB::FiffCoordTrans& transDevHead);
294 
295  //=========================================================================================================
303  FIFFLIB::FiffDigPointSet getFittedPointSet(const Eigen::MatrixXd& matCoilsDev);
304 
305  //=========================================================================================================
314  Eigen::Matrix4d computeTransformation(Eigen::MatrixXd matNH,
315  Eigen::MatrixXd matBT);
316 
317  //=========================================================================================================
326  std::vector<int> findCoilOrder(const Eigen::MatrixXd& matCoilsDev,
327  const Eigen::MatrixXd& matCoilsHead);
328 
329  //=========================================================================================================
338  Eigen::MatrixXd order(const std::vector<int>& vecOrder,
339  const Eigen::MatrixXd& matToOrder);
340 
341  QVector<int> order(const std::vector<int>& vecOrder,
342  const QVector<int>& vecToOrder);
343 
344  //=========================================================================================================
354  double objectTrans(const Eigen::MatrixXd& matHeadCoil,
355  const Eigen::MatrixXd& matCoilsDev,
356  const Eigen::MatrixXd& matTrans);
357 
358  SensorSet m_sensors;
359  SignalModel m_signalModel;
361 };
362 
363 //=============================================================================================================
364 // INLINE DEFINITIONS
365 //=============================================================================================================
366 
367 } //NAMESPACE
368 
369 #ifndef metatype_HpiFitResult
370 #define metatype_HpiFitResult
372 #endif
373 
374 #endif // HPIFIT_H
INVERSESHARED_EXPORT
#define INVERSESHARED_EXPORT
Definition: inverse_global.h:56
Q_DECLARE_METATYPE
Q_DECLARE_METATYPE(Eigen::MatrixXf)
INVERSELIB::CoilParam
Definition: hpifit.h:95
INVERSELIB::SignalModel
Brief description of this class.
Definition: signalmodel.h:73
INVERSELIB::HpiModelParameters
Brief description of this class.
Definition: hpimodelparameters.h:75
INVERSELIB::HPIFit::ConstSPtr
QSharedPointer< const HPIFit > ConstSPtr
Definition: hpifit.h:139
INVERSELIB::HPIFit::SPtr
QSharedPointer< HPIFit > SPtr
Definition: hpifit.h:138
fiff_coord_trans.h
FiffCoordTrans class declaration.
fiff_ch_info.h
FiffChInfo class declaration.
INVERSELIB::HpiFitResult
Definition: hpifit.h:112
fiff_dig_point.h
FiffDigPoint class declaration.
fiff_dig_point_set.h
FiffDigPointSet class declaration.
FIFFLIB::FiffCoordTrans
Coordinate transformation description.
Definition: fiff_coord_trans.h:74
sensorset.h
SensorSet class declaration.
INVERSELIB::SensorSet
Definition: sensorset.h:80
signalmodel.h
SignalModel class declaration.
INVERSELIB::HPIFit
HPI Fit algorithms.
Definition: hpifit.h:134
FIFFLIB::FiffDigPointSet
Holds a set of digitizer points.
Definition: fiff_dig_point_set.h:83