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