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