v2.0.0
Loading...
Searching...
No Matches
fiff_io.cpp
Go to the documentation of this file.
1//=============================================================================================================
36
37//=============================================================================================================
38// INCLUDES
39//=============================================================================================================
40
41#include "fiff_io.h"
42#include "fiff.h"
43#include "fiff_evoked_set.h"
44#include "fiff_stream.h"
45
46//=============================================================================================================
47// STL INCLUDES
48//=============================================================================================================
49
50#include <iostream>
51#include <stdexcept>
52#include <QDebug>
53
54//=============================================================================================================
55// USED NAMESPACES
56//=============================================================================================================
57
58using namespace FIFFLIB;
59using namespace Eigen;
60
61//=============================================================================================================
62// DEFINE MEMBER METHODS
63//=============================================================================================================
64
68
69//=============================================================================================================
70
74
75//=============================================================================================================
76
77FiffIO::FiffIO(QIODevice& pIODevice)
78{
79 // execute read method
80 FiffIO::read(pIODevice);
81}
82
83//=============================================================================================================
84
85FiffIO::FiffIO(QList<QIODevice*>& p_qlistIODevices)
86{
87 QList<QIODevice*>::iterator i;
88 for(i = p_qlistIODevices.begin(); i != p_qlistIODevices.end(); ++i) {
89 FiffIO::read((**i));
90 }
91}
92
93//=============================================================================================================
94
95bool FiffIO::setup_read(QIODevice& pIODevice,
96 FiffInfo& info,
97 FiffDirNode::SPtr& dirTree)
98{
99 //Open the file
100 FiffStream::SPtr p_pStream(new FiffStream(&pIODevice));
101 QString t_sFileName = p_pStream->streamName();
102
103 qInfo("Opening fiff data %s...\n",t_sFileName.toUtf8().constData());
104
105 if(!p_pStream->open())
106 return false;
107
108 //Read the measurement info
109 if(!p_pStream->read_meas_info(p_pStream->dirtree(), info, dirTree))
110 return false;
111
112 return true;
113}
114
115//=============================================================================================================
116
117bool FiffIO::read(QIODevice& pIODevice)
118{
119 //Read dirTree from fiff data (raw,evoked,fwds,cov)
120 FiffInfo t_fiffInfo;
121 FiffDirNode::SPtr t_dirTree;
122 bool hasRaw = false;
123 bool hasEvoked = false; // hasFwds=false;
124
125 FiffIO::setup_read(pIODevice, t_fiffInfo, t_dirTree);
126 pIODevice.close(); //file can be closed, since IODevice is already read
127
128 if(!t_dirTree) {
129 qWarning() << "[FiffIO::read] Dir tree could not be read";
130 return false;
131 }
132
133 //Search dirTree for specific data types
134 if(t_dirTree->has_kind(FIFFB_EVOKED)) {
135 hasEvoked = true;
136 }
137
138 if(t_dirTree->has_kind(FIFFB_RAW_DATA) ||
139 t_dirTree->has_kind(FIFFB_PROCESSED_DATA) ||
140 t_dirTree->has_kind(FIFFB_CONTINUOUS_DATA) ||
141 t_dirTree->has_kind(FIFFB_SMSH_RAW_DATA)) {
142 hasRaw = true;
143 }
144
145 // if(t_Tree.has_kind(FIFFB_MNE_FORWARD_SOLUTION))
146 // hasFwds = true;
147
148 //Read all sort of types
149 //raw data
150 if(hasRaw) {
151 try {
152 QSharedPointer<FiffRawData> p_fiffRawData(new FiffRawData(pIODevice));
153 pIODevice.close();
154
155 //append to corresponding member qlist
156 m_qlistRaw.append(p_fiffRawData);
157
158 qInfo( "Finished reading raw data!\n");
159 } catch (const std::exception& e) {
160 qWarning() << "[FiffIO::read] Could not read raw data:" << e.what();
161 pIODevice.close();
162 }
163 }
164
165 //evoked data + projections
166 if(hasEvoked) {
167 try {
168 FiffEvokedSet p_fiffEvokedSet(pIODevice);
169 pIODevice.close();
170
171 //append to corresponding member qlist
172 for(qint32 i=0; i < p_fiffEvokedSet.evoked.size(); ++i) {
173 m_qlistEvoked.append(QSharedPointer<FiffEvoked>(new FiffEvoked(p_fiffEvokedSet.evoked[i])));
174 }
175 } catch (const std::exception& e) {
176 qWarning() << "[FiffIO::read] Could not read evoked data:" << e.what();
177 pIODevice.close();
178 }
179 }
180
181// //forward solutions
182// if(hasFwds) {
183// MNEForwardSolution p_forwardSolution(pIODevice);
184
185// //append to corresponding member qlist
186// m_qlistFwd.append(QSharedPointer<MNEForwardSolution>(&p_forwardSolution));
187// }
188
189 //print summary
190 //std::cout << *this << std::endl;
191
192 return true;
193}
194
195//=============================================================================================================
196
197bool FiffIO::write(QIODevice& pIODevice,
198 const fiff_int_t type,
199 const fiff_int_t idx) const {
200 switch(type) {
201 case FIFFB_RAW_DATA: {
202 FiffIO::write_raw(pIODevice,idx);
203 qDebug() << "Finished writing single raw data with index" << idx << ".";
204 }
205 case FIFFB_EVOKED:
206 //ToDo: write evoked set to file
207 ;
208 }
209
210 return true;
211}
212
213//=============================================================================================================
214
215bool FiffIO::write(QFile& p_QFile,
216 const fiff_int_t type,
217 const fiff_int_t idx) const {
218 qInfo("------------------------ Writing fiff data ------------------------");
219
220 switch(type) {
221 case FIFFB_RAW_DATA: {
222 QString t_nameoftype = "raw";
223
224 if(idx == -1) {
225 for(qint32 i=0; i < m_qlistRaw.size(); ++i) {
226 QString t_fname;
227 //insert
228 qint32 p = p_QFile.fileName().indexOf(".fif");
229 t_fname = p_QFile.fileName().insert(p,QString("_"+t_nameoftype+"-"+QString::number(i)));
230
231 //assign new file name
232 qInfo("\nWriting set with index %i to file %s ...\n",i,t_fname.toUtf8().constData());
233 QFile t_file(t_fname);
234
235 FiffIO::write_raw(t_file,i);
236 }
237 }
238 else {
239 FiffIO::write_raw(p_QFile,idx);
240 }
241 qInfo("\nFinished Writing %lli raw data sets!\n",m_qlistRaw.size());
242 }
243 case FIFFB_EVOKED:
244
245 //ToDo: write evoked set to file
246 ;
247 }
248
249 return true;
250}
251
252//=============================================================================================================
253
254bool FiffIO::write_raw(QIODevice &pIODevice,
255 const fiff_int_t idx) const
256{
257 RowVectorXd cals;
258 SparseMatrix<double> mult;
259 RowVectorXi sel;
260 FiffStream::SPtr outfid = FiffStream::start_writing_raw(pIODevice, this->m_qlistRaw[idx]->info, cals);
261
262 //Setup reading parameters
263 fiff_int_t from = m_qlistRaw[idx]->first_samp;
264 fiff_int_t to = m_qlistRaw[idx]->last_samp;
265 float quantum_sec = 30.0f;//read and write in 30 sec junks
266 fiff_int_t quantum = ceil(quantum_sec*m_qlistRaw[idx]->info.sfreq);
267
268 // Uncomment to read the whole file at once. Warning Matrix may be none-initialisable because its huge
269 //quantum = to - from + 1;
270
271 // Read and write all the data
272 bool first_buffer = true;
273
274 fiff_int_t first, last;
275 MatrixXd data;
276 MatrixXd times;
277
278 for(first = from; first < to; first+=quantum) {
279 last = first+quantum-1;
280 if (last > to)
281 last = to;
282
283 if (!m_qlistRaw[idx]->read_raw_segment(data, times, mult, first, last, sel)) {
284 qWarning("error during read_raw_segment\n");
285 return false;
286 }
287
288 qInfo("Writing...");
289 if (first_buffer) {
290 if (first > 0)
291 outfid->write_int(FIFF_FIRST_SAMPLE,&first);
292 first_buffer = false;
293 }
294 outfid->write_raw_buffer(data, cals);
295 qInfo("[done]\n");
296 }
297
298 outfid->finish_writing_raw();
299
300 return true;
301}
Definition of a generic Fiff IO interface.
FiffEvokedSet class declaration.
#define FIFF_FIRST_SAMPLE
Definition fiff_file.h:461
#define FIFFB_RAW_DATA
Definition fiff_file.h:364
#define FIFFB_SMSH_RAW_DATA
Definition fiff_file.h:382
#define FIFFB_PROCESSED_DATA
Definition fiff_file.h:365
#define FIFFB_CONTINUOUS_DATA
Definition fiff_file.h:375
#define FIFFB_EVOKED
Definition fiff_file.h:366
FiffStream class declaration.
FIFF class declaration, which provides static wrapper functions to stay consistent with mne matlab to...
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
qint32 fiff_int_t
Definition fiff_types.h:89
QSharedPointer< FiffDirNode > SPtr
QList< FiffEvoked > evoked
FIFF measurement file information.
Definition fiff_info.h:86
QList< QSharedPointer< FiffRawData > > m_qlistRaw
Definition fiff_io.h:215
bool write(QIODevice &pIODevice, const fiff_int_t type, const fiff_int_t idx) const
Definition fiff_io.cpp:197
bool read(QIODevice &pIODevice)
Definition fiff_io.cpp:117
bool write_raw(QIODevice &pIODevice, const fiff_int_t idx) const
Definition fiff_io.cpp:254
QList< QSharedPointer< FiffEvoked > > m_qlistEvoked
Definition fiff_io.h:216
static bool setup_read(QIODevice &pIODevice, FiffInfo &info, FiffDirNode::SPtr &dirTree)
Definition fiff_io.cpp:95
FIFF raw measurement data.
FIFF File I/O routines.
QSharedPointer< FiffStream > SPtr
static FiffStream::SPtr start_writing_raw(QIODevice &p_IODevice, const FiffInfo &info, Eigen::RowVectorXd &cals, Eigen::MatrixXi sel=defaultMatrixXi, bool bResetRange=true)