MNE-CPP  0.1.9
A Framework for Electrophysiology
ioutils.cpp
Go to the documentation of this file.
1 //=============================================================================================================
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
41 #include "ioutils.h"
42 #include <algorithm>
43 #include <regex>
44 
45 //=============================================================================================================
46 // QT INCLUDES
47 //=============================================================================================================
48 
49 #include <QDataStream>
50 
51 //=============================================================================================================
52 // EIGEN INCLUDES
53 //=============================================================================================================
54 
55 #include <Eigen/Core>
56 
57 //=============================================================================================================
58 // USED NAMESPACES
59 //=============================================================================================================
60 
61 using namespace Eigen;
62 using namespace UTILSLIB;
63 
64 //=============================================================================================================
65 // DEFINE MEMBER METHODS
66 //=============================================================================================================
67 
68 qint32 IOUtils::fread3(QDataStream &p_qStream)
69 {
70  char* bytes = new char[3];
71  p_qStream.readRawData(bytes, 3);
72  qint32 int3 = (((unsigned char) bytes[0]) << 16) + (((unsigned char) bytes[1]) << 8) + ((unsigned char) bytes[2]);
73  delete[] bytes;
74  return int3;
75 }
76 
77 //=============================================================================================================
78 
79 qint32 IOUtils::fread3(std::iostream& stream)
80 {
81  char* bytes = new char[3];
82  stream.read(bytes, 3);
83  qint32 int3 = (((unsigned char) bytes[0]) << 16) + (((unsigned char) bytes[1]) << 8) + ((unsigned char) bytes[2]);
84  delete[] bytes;
85  return int3;
86 }
87 
88 //=============================================================================================================
89 
90 VectorXi IOUtils::fread3_many(QDataStream &p_qStream, qint32 count)
91 {
92  VectorXi res(count);
93 
94  for(qint32 i = 0; i < count; ++i)
95  res[i] = IOUtils::fread3(p_qStream);
96 
97  return res;
98 }
99 
100 //=============================================================================================================
101 
102 VectorXi IOUtils::fread3_many(std::iostream& stream, qint32 count)
103 {
104  VectorXi res(count);
105 
106  for(qint32 i = 0; i < count; ++i)
107  res[i] = IOUtils::fread3(stream);
108 
109  return res;
110 }
111 
112 //=============================================================================================================
113 //fiff_combat
114 qint16 IOUtils::swap_short(qint16 source)
115 {
116  unsigned char *csource = (unsigned char *)(&source);
117  qint16 result;
118  unsigned char *cresult = (unsigned char *)(&result);
119 
120  cresult[0] = csource[1];
121  cresult[1] = csource[0];
122  return (result);
123 }
124 
125 //=============================================================================================================
126 
127 qint32 IOUtils::swap_int(qint32 source)
128 {
129  unsigned char *csource = (unsigned char *)(&source);
130  qint32 result;
131  unsigned char *cresult = (unsigned char *)(&result);
132 
133  cresult[0] = csource[3];
134  cresult[1] = csource[2];
135  cresult[2] = csource[1];
136  cresult[3] = csource[0];
137  return (result);
138 }
139 
140 //=============================================================================================================
141 
142 void IOUtils::swap_intp(qint32 *source)
143 
144 {
145  unsigned char *csource = (unsigned char *)(source);
146 
147  unsigned char c;
148 
149  c = csource[3];
150  csource[3] = csource[0];
151  csource[0] = c;
152  c = csource[2];
153  csource[2] = csource[1];
154  csource[1] = c;
155 
156  return;
157 }
158 
159 //=============================================================================================================
160 
161 qint64 IOUtils::swap_long(qint64 source)
162 {
163  unsigned char *csource = (unsigned char *)(&source);
164  qint64 result;
165  unsigned char *cresult = (unsigned char *)(&result);
166 
167  cresult[0] = csource[7];
168  cresult[1] = csource[6];
169  cresult[2] = csource[5];
170  cresult[3] = csource[4];
171  cresult[4] = csource[3];
172  cresult[5] = csource[2];
173  cresult[6] = csource[1];
174  cresult[7] = csource[0];
175  return (result);
176 }
177 
178 //=============================================================================================================
179 
180 void IOUtils::swap_longp(qint64 *source)
181 {
182  unsigned char *csource = (unsigned char *)(source);
183  unsigned char c;
184 
185  c = csource[0];
186  csource[0] = csource[7];
187  csource[7] = c;
188 
189  c = csource[1];
190  csource[1] = csource[6];
191  csource[6] = c;
192 
193  c = csource[2];
194  csource[2] = csource[5];
195  csource[5] = c;
196 
197  c = csource[3];
198  csource[3] = csource[4];
199  csource[4] = c;
200 
201  return;
202 }
203 
204 //=============================================================================================================
205 
206 float IOUtils::swap_float(float source)
207 {
208  unsigned char *csource = (unsigned char *)(&source);
209  float result;
210  unsigned char *cresult = (unsigned char *)(&result);
211 
212  cresult[0] = csource[3];
213  cresult[1] = csource[2];
214  cresult[2] = csource[1];
215  cresult[3] = csource[0];
216  return (result);
217 }
218 
219 //=============================================================================================================
220 
221 void IOUtils::swap_floatp(float *source)
222 
223 {
224  unsigned char *csource = (unsigned char *)(source);
225  unsigned char c;
226 
227  c = csource[3];
228  csource[3] = csource[0];
229  csource[0] = c;
230  c = csource[2];
231  csource[2] = csource[1];
232  csource[1] = c;
233 
234  return;
235 }
236 
237 //=============================================================================================================
238 
239 void IOUtils::swap_doublep(double *source)
240 
241 {
242  unsigned char *csource = (unsigned char *)(source);
243  unsigned char c;
244 
245  c = csource[7];
246  csource[7] = csource[0];
247  csource[0] = c;
248 
249  c = csource[6];
250  csource[6] = csource[1];
251  csource[1] = c;
252 
253  c = csource[5];
254  csource[5] = csource[2];
255  csource[2] = c;
256 
257  c = csource[4];
258  csource[4] = csource[3];
259  csource[3] = c;
260 
261  return;
262 }
263 
264 //=============================================================================================================
265 
266 QStringList IOUtils::get_new_chnames_conventions(const QStringList& chNames)
267 {
268  QStringList result;
269  QString replaceString;
270 
271  for(int i = 0; i < chNames.size(); ++i) {
272  replaceString = chNames.at(i);
273  replaceString.replace(" ","");
274  result.append(replaceString);
275  }
276 
277  return result;
278 }
279 
280 //=============================================================================================================
281 
282 std::vector<std::string> IOUtils::get_new_chnames_conventions(const std::vector<std::string>& chNames)
283 {
284  std::vector<std::string> result;
285 
286  for(auto channelName : chNames){
287  std::remove(channelName.begin(), channelName.end(), ' ');
288  result.push_back(std::move(channelName));
289  }
290 
291  return result;
292 }
293 
294 //=============================================================================================================
295 
296 QStringList IOUtils::get_old_chnames_conventions(const QStringList& chNames)
297 {
298  QStringList result, xList;
299  QString replaceString;
300  QRegExp xRegExp;
301 
302  for(int i = 0; i < chNames.size(); ++i) {
303  xRegExp = QRegExp("[0-9]{1,100}");
304  xRegExp.indexIn(chNames.at(i));
305  xList = xRegExp.capturedTexts();
306 
307  for(int k = 0; k < xList.size(); ++k) {
308  replaceString = chNames.at(i);
309  replaceString.replace(xList.at(k),QString("%1%2").arg(" ").arg(xList.at(k)));
310  result.append(replaceString);
311  }
312  }
313 
314  return result;
315 }
316 
317 //=============================================================================================================
318 
319 std::vector<std::string> IOUtils::get_old_chnames_conventions(const std::vector<std::string>& chNames)
320 {
321  std::vector<std::string> result;
322 
323  for(auto channelName : chNames){
324  std::regex_replace(channelName, std::regex("[0-9]{1,100}"), " $&");
325  result.push_back(std::move(channelName));
326  }
327 
328  return result;
329 }
330 
331 //=============================================================================================================
332 
333 bool IOUtils::check_matching_chnames_conventions(const QStringList& chNamesA, const QStringList& chNamesB, bool bCheckForNewNamingConvention)
334 {
335  bool bMatching = false;
336 
337  if(chNamesA.isEmpty()) {
338  qWarning("Warning in IOUtils::check_matching_chnames_conventions - chNamesA list is empty. Nothing to compare");
339  }
340 
341  if(chNamesB.isEmpty()) {
342  qWarning("Warning in IOUtils::check_matching_chnames_conventions - chNamesB list is empty. Nothing to compare");
343  }
344 
345  QString replaceStringOldConv, replaceStringNewConv;
346 
347  for(int i = 0; i < chNamesA.size(); ++i) {
348  if(chNamesB.contains(chNamesA.at(i))) {
349  bMatching = true;
350  } else if(bCheckForNewNamingConvention) {
351  //Create new convention
352  replaceStringNewConv = chNamesA.at(i);
353  replaceStringNewConv.replace(" ","");
354 
355  if(chNamesB.contains(replaceStringNewConv)) {
356  bMatching = true;
357  } else {
358  //Create old convention
359  QRegExp xRegExp("[0-9]{1,100}");
360  xRegExp.indexIn(chNamesA.at(i));
361  QStringList xList = xRegExp.capturedTexts();
362 
363  for(int k = 0; k < xList.size(); ++k) {
364  replaceStringOldConv = chNamesA.at(i);
365  replaceStringOldConv.replace(xList.at(k),QString("%1%2").arg(" ").arg(xList.at(k)));
366 
367  if(chNamesB.contains(replaceStringNewConv) || chNamesB.contains(replaceStringOldConv) ) {
368  bMatching = true;
369  } else {
370  bMatching = false;
371  }
372  }
373  }
374  }
375  }
376 
377  return bMatching;
378 }
379 
380 //=============================================================================================================
381 
382 bool IOUtils::check_matching_chnames_conventions(const std::vector<std::string>& chNamesA, const std::vector<std::string>& chNamesB, bool bCheckForNewNamingConvention)
383 {
384  if(chNamesA.empty()){
385  qWarning("Warning in IOUtils::check_matching_chnames_conventions - chNamesA list is empty. Nothing to compare");
386  }
387  if(chNamesB.empty()){
388  qWarning("Warning in IOUtils::check_matching_chnames_conventions - chNamesB list is empty. Nothing to compare");
389  }
390 
391  bool bMatching = false;
392 
393  for(size_t i = 0 ; i < chNamesA.size(); ++i){
394  if (std::find(chNamesB.begin(), chNamesB.end(), chNamesA.at(i)) != chNamesB.end()){
395  bMatching = true;
396  } else if(bCheckForNewNamingConvention){
397  std::string replaceStringNewConv{chNamesA.at(i)};
398  std::remove(replaceStringNewConv.begin(), replaceStringNewConv.end(), ' ');
399 
400  if(std::find(chNamesB.begin(), chNamesB.end(), replaceStringNewConv) != chNamesB.end()){
401  bMatching = true;
402  } else {
403  std::string replaceStringOldConv{chNamesA.at(i)};
404  std::regex_replace(replaceStringOldConv, std::regex("[0-9]{1,100}"), " $&");
405  if(std::find(chNamesB.begin(), chNamesB.end(), replaceStringNewConv) != chNamesB.end() || std::find(chNamesB.begin(), chNamesB.end(), replaceStringOldConv) != chNamesB.end()){
406  bMatching = true;
407  } else {
408  bMatching = false;
409  }
410  }
411  }
412  }
413  return bMatching;
414 }
IOUtils class declaration.