v2.0.0
Loading...
Searching...
No Matches
mri_cor_fif_io.cpp
Go to the documentation of this file.
1//=============================================================================================================
38
39//=============================================================================================================
40// INCLUDES
41//=============================================================================================================
42
43#include "mri_cor_fif_io.h"
44
45#include <fiff/fiff_stream.h>
46#include <fiff/fiff_tag.h>
48#include <fiff/fiff_file.h>
49#include <fiff/fiff_constants.h>
50
51//=============================================================================================================
52// QT INCLUDES
53//=============================================================================================================
54
55#include <QFile>
56#include <QDebug>
57
58//=============================================================================================================
59// EIGEN INCLUDES
60//=============================================================================================================
61
62#include <Eigen/Core>
63
64//=============================================================================================================
65// USED NAMESPACES
66//=============================================================================================================
67
68using namespace MRILIB;
69using namespace FIFFLIB;
70using namespace Eigen;
71
72//=============================================================================================================
73// DEFINE MEMBER METHODS
74//=============================================================================================================
75
76bool MriCorFifIO::write(const QString& fileName,
77 const QVector<MriSlice>& slices,
78 const QVector<FiffCoordTrans>& additionalTrans)
79{
80 //
81 // File structure (ported from save_slices() / write_slice() in write_mri_set.c):
82 //
83 // FIFFB_MRI
84 // FIFF_BLOCK_ID
85 // FIFFB_MRI_SET
86 // HEAD -> MRI identity transform
87 // Additional transforms (Talairach etc.)
88 // For each slice:
89 // FIFFB_MRI_SLICE
90 // FIFF_MRI_WIDTH
91 // FIFF_MRI_WIDTH_M
92 // FIFF_MRI_HEIGHT
93 // FIFF_MRI_HEIGHT_M
94 // CoordTrans (slice -> MRI)
95 // FIFF_MRI_PIXEL_ENCODING
96 // FIFF_MRI_PIXEL_DATA
97 // /FIFFB_MRI_SLICE
98 // /FIFFB_MRI_SET
99 // /FIFFB_MRI
100 //
101
102 QFile file(fileName);
104
105 if (!stream) {
106 qCritical() << "MriCorFifIO::write - Could not open file for writing:" << fileName;
107 return false;
108 }
109
110 // Start MRI block
111 stream->start_block(FIFFB_MRI);
112 stream->write_id(FIFF_BLOCK_ID);
113
114 // Start MRI set block
115 stream->start_block(FIFFB_MRI_SET);
116
117 // Write identity HEAD -> MRI transform
118 // Ported from write_mri_set.c: identity rotation, zero translation
119 Matrix3f identityRot = Matrix3f::Identity();
120 Vector3f zeroMove = Vector3f::Zero();
121 FiffCoordTrans headMriT(
122 FIFFV_COORD_HEAD, FIFFV_COORD_MRI, identityRot, zeroMove);
123 stream->write_coord_trans(headMriT);
124
125 // Write additional transforms (Talairach etc.)
126 for (const FiffCoordTrans& t : additionalTrans) {
127 stream->write_coord_trans(t);
128 }
129
130 // Write each slice
131 for (int k = 0; k < slices.size(); ++k) {
132 const MriSlice& slice = slices[k];
133
134 stream->start_block(FIFFB_MRI_SLICE);
135
136 // Width and height in pixels
137 fiff_int_t w = slice.width;
138 fiff_int_t h = slice.height;
139 stream->write_int(FIFF_MRI_WIDTH, &w);
140
141 float wm = static_cast<float>(slice.width) * slice.dimx;
142 stream->write_float(FIFF_MRI_WIDTH_M, &wm);
143
144 stream->write_int(FIFF_MRI_HEIGHT, &h);
145
146 float hm = static_cast<float>(slice.height) * slice.dimy;
147 stream->write_float(FIFF_MRI_HEIGHT_M, &hm);
148
149 // Coordinate transform
150 stream->write_coord_trans(slice.trans);
151
152 // Pixel encoding
153 fiff_int_t encoding = slice.pixelFormat;
154 stream->write_int(FIFF_MRI_PIXEL_ENCODING, &encoding);
155
156 // Pixel data
157 QSharedPointer<FiffTag> pixelTag(new FiffTag());
158 pixelTag->kind = FIFF_MRI_PIXEL_DATA;
159
160 int nPixels = slice.width * slice.height;
161 switch (slice.pixelFormat) {
163 pixelTag->type = FIFFT_BYTE;
164 pixelTag->resize(nPixels);
165 memcpy(pixelTag->data(), slice.pixels.constData(), nPixels);
166 break;
167 }
169 pixelTag->type = FIFFT_USHORT;
170 pixelTag->resize(nPixels * 2);
171 memcpy(pixelTag->data(), slice.pixelsWord.constData(), nPixels * 2);
172 break;
173 }
175 pixelTag->type = FIFFT_FLOAT;
176 pixelTag->resize(nPixels * 4);
177 memcpy(pixelTag->data(), slice.pixelsFloat.constData(), nPixels * 4);
178 break;
179 }
180 }
181
182 stream->write_tag(pixelTag);
183
184 stream->end_block(FIFFB_MRI_SLICE);
185 }
186
187 // End blocks
188 stream->end_block(FIFFB_MRI_SET);
189 stream->end_block(FIFFB_MRI);
190 stream->end_file();
191
192 return true;
193}
FiffTag class declaration, which provides fiff tag I/O and processing methods.
Fiff constants.
#define FIFFV_COORD_HEAD
#define FIFFV_COORD_MRI
FiffStream class declaration.
Header file describing the numerical values used in fif files.
#define FIFF_MRI_HEIGHT_M
Definition fiff_file.h:656
#define FIFF_MRI_PIXEL_DATA
Definition fiff_file.h:648
#define FIFF_MRI_WIDTH_M
Definition fiff_file.h:654
#define FIFF_MRI_HEIGHT
Definition fiff_file.h:655
#define FIFFV_MRI_PIXEL_BYTE
Definition fiff_file.h:702
#define FIFFB_MRI_SLICE
Definition fiff_file.h:392
#define FIFFT_BYTE
Definition fiff_file.h:229
#define FIFF_BLOCK_ID
Definition fiff_file.h:326
#define FIFFB_MRI_SET
Definition fiff_file.h:391
#define FIFFT_USHORT
Definition fiff_file.h:235
#define FIFFT_FLOAT
Definition fiff_file.h:232
#define FIFF_MRI_PIXEL_ENCODING
Definition fiff_file.h:645
#define FIFFV_MRI_PIXEL_FLOAT
Definition fiff_file.h:705
#define FIFFB_MRI
Definition fiff_file.h:390
#define FIFF_MRI_WIDTH
Definition fiff_file.h:653
#define FIFFV_MRI_PIXEL_WORD
Definition fiff_file.h:703
FiffCoordTrans class declaration.
MriCorFifIO class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
qint32 fiff_int_t
Definition fiff_types.h:89
MRI volume and coordinate-system I/O (volumes, voxel geometry, transforms).
Coordinate transformation description.
static FiffStream::SPtr start_file(QIODevice &p_IODevice)
QSharedPointer< FiffStream > SPtr
FIFF data tag.
Definition fiff_tag.h:152
static bool write(const QString &fileName, const QVector< MriSlice > &slices, const QVector< FIFFLIB::FiffCoordTrans > &additionalTrans)
Single MRI slice data.
QVector< unsigned char > pixels
FIFFLIB::FiffCoordTrans trans
QVector< unsigned short > pixelsWord
QVector< float > pixelsFloat