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