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//=============================================================================================================
61// USED NAMESPACES
62//=============================================================================================================
63
64using namespace FIFFLIB;
65using namespace Eigen;
66
67//=============================================================================================================
68// DEFINE GLOBAL METHODS
69//=============================================================================================================
70
71//=============================================================================================================
72// DEFINE MEMBER METHODS
73//=============================================================================================================
74
76 :m_qListDigPoint()
77{
78}
79
80//=============================================================================================================
81
83: m_qListDigPoint(p_FiffDigPointSet.m_qListDigPoint)
84{
85}
86
87//=============================================================================================================
88
89FiffDigPointSet::FiffDigPointSet(QList<FIFFLIB::FiffDigPoint> pointList)
90: m_qListDigPoint(pointList)
91{
92}
93
94//=============================================================================================================
95
96FiffDigPointSet::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
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 qInfo("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::UPtr 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
199void 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 qInfo("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 qInfo("\t%lld 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
257FiffDigPointSet 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
288void 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
309QList<FiffDigPoint> FiffDigPointSet::getList()
310{
311 return m_qListDigPoint;
312}
FiffTag class declaration, which provides fiff tag I/O and processing methods.
#define FIFF_MNE_COORD_FRAME
#define FIFFV_COORD_HEAD
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
Old fiff_type declarations - replace them.
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