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