MNE-CPP  0.1.9
A Framework for Electrophysiology
fiff_dig_point_set.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "fiff_dig_point_set.h"
41 
42 //=============================================================================================================
43 // INCLUDES
44 //=============================================================================================================
45 
46 #include "fiff_dig_point.h"
47 #include "fiff_dir_node.h"
48 #include "fiff_tag.h"
49 #include "fiff_types.h"
50 
51 //=============================================================================================================
52 // QT INCLUDES
53 //=============================================================================================================
54 
55 //=============================================================================================================
56 // EIGEN INCLUDES
57 //=============================================================================================================
58 
59 //=============================================================================================================
60 // USED NAMESPACES
61 //=============================================================================================================
62 
63 using namespace FIFFLIB;
64 using namespace Eigen;
65 
66 //=============================================================================================================
67 // DEFINE GLOBAL METHODS
68 //=============================================================================================================
69 
70 //=============================================================================================================
71 // DEFINE MEMBER METHODS
72 //=============================================================================================================
73 
75  :m_qListDigPoint()
76 {
77 }
78 
79 //=============================================================================================================
80 
82 : m_qListDigPoint(p_FiffDigPointSet.m_qListDigPoint)
83 {
84 }
85 
86 //=============================================================================================================
87 
88 FiffDigPointSet::FiffDigPointSet(QList<FIFFLIB::FiffDigPoint> pointList)
89 : m_qListDigPoint(pointList)
90 {
91 }
92 
93 
94 //=============================================================================================================
95 
96 FiffDigPointSet::FiffDigPointSet(QIODevice &p_IODevice) //const FiffDigPointSet &p_FiffDigPointSet
97 {
98  //
99  // Open the file
100  //
101  FiffStream::SPtr t_pStream(new FiffStream(&p_IODevice));
102 
103  if(!FiffDigPointSet::readFromStream(t_pStream, *this)) {
104  t_pStream->close();
105  qInfo() << "[FiffDigPointSet::FiffDigPointSet] Could not read the FiffDigPointSet"; // ToDo throw error
106  }
107 
108  qInfo("[FiffDigPointSet::FiffDigPointSet] %i digitizer Points read from file.", this->size());
109 }
110 
111 //=============================================================================================================
112 
114 {
115 }
116 
117 //=============================================================================================================
118 
120 {
121  //
122  // Open the file, create directory
123  //
124  bool open_here = false;
125 
126  if (!p_pStream->device()->isOpen()) {
127  QString t_sFileName = p_pStream->streamName();
128 
129  if(!p_pStream->open())
130  return false;
131 
132  printf("Opening header data %s...\n",t_sFileName.toUtf8().constData());
133 
134  open_here = true;
135  }
136 
137  //
138  // Read the measurement info
139  //
140  //read_hpi_info(p_pStream,p_Tree, info);
141  fiff_int_t kind = -1;
142  fiff_int_t pos = -1;
143  FiffTag::SPtr t_pTag;
144 
145  //
146  // Locate the Electrodes
147  //
148  QList<FiffDirNode::SPtr> isotrak = p_pStream->dirtree()->dir_tree_find(FIFFB_ISOTRAK);
149 
150  fiff_int_t coord_frame = FIFFV_COORD_HEAD;
151  FiffCoordTrans dig_trans;
152  qint32 k = 0;
153 
154  if (isotrak.size() == 1)
155  {
156  for (k = 0; k < isotrak[0]->nent(); ++k)
157  {
158  kind = isotrak[0]->dir[k]->kind;
159  pos = isotrak[0]->dir[k]->pos;
160  if (kind == FIFF_DIG_POINT)
161  {
162  p_pStream->read_tag(t_pTag, pos);
163  p_Dig.m_qListDigPoint.append(t_pTag->toDigPoint());
164  }
165  else
166  {
167  if (kind == FIFF_MNE_COORD_FRAME)
168  {
169  p_pStream->read_tag(t_pTag, pos);
170  qDebug() << "NEEDS To BE DEBBUGED: FIFF_MNE_COORD_FRAME" << t_pTag->getType();
171  coord_frame = *t_pTag->toInt();
172  }
173  else if (kind == FIFF_COORD_TRANS)
174  {
175  p_pStream->read_tag(t_pTag, pos);
176  qDebug() << "NEEDS To BE DEBBUGED: FIFF_COORD_TRANS" << t_pTag->getType();
177  dig_trans = t_pTag->toCoordTrans();
178  }
179  }
180  }
181  }
182  for(k = 0; k < p_Dig.size(); ++k)
183  {
184  p_Dig[k].coord_frame = coord_frame;
185  }
186 
187  //
188  // All kinds of auxliary stuff
189  //
190  if(open_here)
191  {
192  p_pStream->close();
193  }
194  return true;
195 }
196 
197 //=============================================================================================================
198 
199 void FiffDigPointSet::write(QIODevice &p_IODevice)
200 {
201  //
202  // Open the file, create directory
203  //
204 
205  // Create the file and save the essentials
206  FiffStream::SPtr t_pStream = FiffStream::start_file(p_IODevice);
207  printf("Write Digitizer Points in %s...\n", t_pStream->streamName().toUtf8().constData());
208  this->writeToStream(t_pStream.data());
209  t_pStream->end_file();
210 }
211 
212 //=============================================================================================================
213 
215 {
216  p_pStream->start_block(FIFFB_MEAS);
217  p_pStream->start_block(FIFFB_MEAS_INFO);
218  p_pStream->start_block(FIFFB_ISOTRAK);
219 
220  for(qint32 h = 0; h < m_qListDigPoint.size(); ++h)
221  {
222  p_pStream->write_dig_point(m_qListDigPoint[h]);
223  }
224 
225  printf("\t%d digitizer points written\n", m_qListDigPoint.size());
226  p_pStream->end_block(FIFFB_ISOTRAK);
227  p_pStream->end_block(FIFFB_MEAS_INFO);
228  p_pStream->end_block(FIFFB_MEAS);
229 }
230 
231 //=============================================================================================================
232 
234 {
235  if (idx>=m_qListDigPoint.length())
236  {
237  qWarning("Warning: Required DigPoint doesn't exist! Returning DigPoint '0'.");
238  idx=0;
239  }
240  return m_qListDigPoint[idx];
241 }
242 
243 //=============================================================================================================
244 
246 {
247  if (idx >= m_qListDigPoint.length())
248  {
249  qWarning("Warning: Required DigPoint doesn't exist! Returning DigPoint '0'.");
250  idx = 0;
251  }
252  return m_qListDigPoint[idx];
253 }
254 
255 //=============================================================================================================
256 
257 FiffDigPointSet FiffDigPointSet::pickTypes(QList<int> includeTypes) const
258 {
259  FiffDigPointSet pickedSet;
260 
261  for(int i = 0; i < m_qListDigPoint.size(); ++i) {
262  if(includeTypes.contains(m_qListDigPoint[i].kind)) {
263  pickedSet << m_qListDigPoint[i];
264  }
265  }
266 
267  return pickedSet;
268 }
269 
270 //=============================================================================================================
271 
273 {
274  this->m_qListDigPoint.append(dig);
275  return *this;
276 }
277 
278 //=============================================================================================================
279 
281 {
282  this->m_qListDigPoint.append(*dig);
283  return *this;
284 }
285 
286 //=============================================================================================================
287 
288 void FiffDigPointSet::applyTransform(const FiffCoordTrans& coordTrans, bool bApplyInverse)
289 {
290  Vector4f tempvec;
291  for(int i = 0; i < m_qListDigPoint.size(); ++i) {
292  tempvec(0) = m_qListDigPoint.at(i).r[0];
293  tempvec(1) = m_qListDigPoint.at(i).r[1];
294  tempvec(2) = m_qListDigPoint.at(i).r[2];
295  tempvec(3) = 1.0f;
296  if(bApplyInverse) {
297  tempvec = coordTrans.invtrans * tempvec;
298  } else {
299  tempvec = coordTrans.trans * tempvec;
300  }
301  m_qListDigPoint[i].r[0] = tempvec(0);
302  m_qListDigPoint[i].r[1] = tempvec(1);
303  m_qListDigPoint[i].r[2] = tempvec(2);
304  }
305 }
306 
307 //=============================================================================================================
308 
309 QList<FiffDigPoint> FiffDigPointSet::getList()
310 {
311  return m_qListDigPoint;
312 }
void writeToStream(FiffStream *p_pStream)
writeToStream
#define FIFF_DIG_POINT
Definition: fiff_file.h:466
Old fiff_type declarations - replace them.
FiffDigPointSet & operator<<(const FiffDigPoint &dig)
Digitization point description.
Coordinate transformation description.
QList< FiffDigPoint > getList()
fiff_long_t write_dig_point(const FiffDigPoint &dig)
void write(QIODevice &p_IODevice)
write
void applyTransform(const FiffCoordTrans &coordTrans, bool bApplyInverse=false)
fiff_long_t start_block(fiff_int_t kind)
QSharedPointer< FiffTag > SPtr
Definition: fiff_tag.h:152
Holds a set of digitizer points.
FIFF File I/O routines.
Definition: fiff_stream.h:104
static bool readFromStream(FiffStream::SPtr &p_Stream, FiffDigPointSet &p_Dig)
FiffDirNode class declaration, which provides fiff dir tree processing methods.
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > invtrans
FiffDigPointSet class declaration.
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > trans
const FiffDigPoint & operator[](qint32 idx) const
#define FIFF_COORD_TRANS
Definition: fiff_file.h:475
static FiffStream::SPtr start_file(QIODevice &p_IODevice)
FiffDigPoint class declaration.
FiffDigPointSet pickTypes(QList< int > includeTypes) const
QSharedPointer< FiffStream > SPtr
Definition: fiff_stream.h:107
FiffTag class declaration, which provides fiff tag I/O and processing methods.
fiff_long_t end_block(fiff_int_t kind, fiff_int_t next=FIFFV_NEXT_SEQ)
#define FIFF_MNE_COORD_FRAME