29#include <unsupported/Eigen/FFT>
35#ifndef _USE_MATH_DEFINES
36#define _USE_MATH_DEFINES
51#if defined(_WIN32) || defined(_WIN64)
52#define snprintf _snprintf
53#define vsnprintf _vsnprintf
54#define strcasecmp _stricmp
55#define strncasecmp _strnicmp
62using RowMajorMatrixXf = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
82 :
entries(static_cast<size_t>(nslots))
95 res->resize(nrow, ncol);
122 :
freq_resp(static_cast<size_t>(resp_size), 1.0f)
158 Eigen::FFT<float> fft;
159 std::vector<float> in(data, data + np);
160 std::vector<std::complex<float>> spec;
162 data[0] = spec[0].real();
163 for (
int k = 1, p = 1; p < np; ++k) {
164 data[p++] = spec[k].real();
166 data[p++] = spec[k].imag();
175 Eigen::FFT<float> fft;
176 std::vector<std::complex<float>> spec(np);
177 spec[0] = std::complex<float>(data[0], 0.0f);
178 for (
int k = 1, p = 1; p < np; ++k) {
179 const float re = data[p++];
180 const float im = p < np ? data[p++] : 0.0f;
181 spec[k] = std::complex<float>(re, im);
182 spec[np - k] = std::conj(spec[k]);
184 std::vector<float> out;
186 std::copy(out.begin(), out.begin() + np, data);
198 qCritical(
"Incorrect data length in apply_filter");
215 if (dc_offset != 0.0) {
217 data[k] = data[k] - dc_offset;
231 n = ns % 2 == 0 ? ns / 2 : (ns + 1) / 2;
240 data[p] = data[p] * freq_resp[0];
245 for (k = 1; k < n; k++) {
246 data[p] = data[p] * freq_resp[k];
248 data[p] = data[p] * freq_resp[k];
255 data[p] = data[p] * freq_resp[k];
264 int* highpass_effective)
271 int highpasss, lowpasss;
272 int highpass_widths, lowpass_widths;
273 float lowpass, highpass, lowpass_width, highpass_width;
275 float pi4 =
static_cast<float>(
M_PI / 4.0);
280 auto filter_data = std::make_unique<FilterData>(resp_size);
281 *highpass_effective =
false;
283 for (f = 0; f < 2; f++) {
288 freq_resp = f == 0 ? filter_data->freq_resp.data() : filter_data->eog_freq_resp.data();
292 highpasss = ((resp_size - 1) * highpass) / (0.5 * sfreq);
293 lowpasss = ((resp_size - 1) * lowpass) / (0.5 * sfreq);
295 lowpass_widths = ((resp_size - 1) * lowpass_width) / (0.5 * sfreq);
296 lowpass_widths = (lowpass_widths + 1) / 2;
299 highpass_widths = ((resp_size - 1) * highpass_width) / (0.5 * sfreq);
300 highpass_widths = (highpass_widths + 1) / 2;
305 qInfo(
"filter : %7.3f ... %6.1f Hz bins : %d ... %d of %d hpw : %d lpw : %d\n",
314 if (highpasss > highpass_widths + 1) {
318 for (k = 0; k < highpasss - w + 1; k++)
320 for (k = -w + 1, s = highpasss - w + 1; k < w; k++, s++) {
321 if (s >= 0 && s < resp_size) {
322 c = cos(pi4 * (k * mult + add));
323 freq_resp[s] = freq_resp[s] * c * c;
326 *highpass_effective =
true;
328 *highpass_effective = *highpass_effective || (filter.
highpass == 0.0);
330 if (lowpass_widths > 0) {
334 for (k = -w + 1, s = lowpasss - w + 1; k < w; k++, s++) {
335 if (s >= 0 && s < resp_size) {
336 c = cos(pi4 * (k * mult + add));
337 freq_resp[s] = freq_resp[s] * c * c;
340 for (k = s; k < resp_size; k++)
343 for (k = lowpasss; k < resp_size; k++)
347 if (*highpass_effective)
348 qInfo(
"Highpass filter will work as specified.\n");
350 qWarning(
"NOTE: Highpass filter omitted due to a too low corner frequency.\n");
352 qWarning(
"NOTE: Filter is presently switched off.\n");
365 const QList<FIFFLIB::FiffChInfo>& chs,
380 Eigen::VectorXi pickno_vec;
382 pickno_vec = Eigen::VectorXi::LinSpaced(nchan, 0, nchan - 1);
383 pickno = pickno_vec.data();
387 Eigen::VectorXf mult(npick);
388 for (c = 0; c < npick; c++)
389 mult[c] = chs[pickno[c]].cal * chs[pickno[c]].range;
393 if (!stream->read_tag(t_pTag, ent->pos))
397 if (
static_cast<int>(t_pTag->size() / (
sizeof(
fiff_float_t) * nchan)) != nsamp) {
398 qCritical(
"Incorrect number of samples in buffer.");
401 this_samplef = t_pTag->toFloat();
402 for (s = 0; s < nsamp; s++, this_samplef += nchan) {
403 for (c = 0; c < npick; c++)
404 data(c, s) = mult[c] * this_samplef[pickno[c]];
407 if (
static_cast<int>(t_pTag->size() / (
sizeof(
fiff_short_t) * nchan)) != nsamp) {
408 qCritical(
"Incorrect number of samples in buffer.");
412 for (s = 0; s < nsamp; s++, this_samples += nchan) {
413 for (c = 0; c < npick; c++)
414 data(c, s) = mult[c] * this_samples[pickno[c]];
417 if (
static_cast<int>(t_pTag->size() / (
sizeof(
fiff_int_t) * nchan)) != nsamp) {
418 qCritical(
"Incorrect number of samples in buffer.");
421 this_sample = t_pTag->toInt();
422 for (s = 0; s < nsamp; s++, this_sample += nchan) {
423 for (c = 0; c < npick; c++)
424 data(c, s) = mult[c] * this_sample[pickno[c]];
427 if (
static_cast<int>(t_pTag->size() / (
sizeof(
double) * nchan)) != nsamp) {
428 qCritical(
"Incorrect number of samples in buffer.");
431 const double* this_sampled = t_pTag->toDouble();
432 for (s = 0; s < nsamp; s++, this_sampled += nchan) {
433 for (c = 0; c < npick; c++)
434 data(c, s) =
static_cast<float>(mult[c] * this_sampled[pickno[c]]);
437 qCritical(
"We are not prepared to handle raw data type: %d", ent->type);
449 QList<FiffDirNode::SPtr> temp;
455 if (pNode->isEmpty())
456 node = stream->dirtree();
461 if (temp.size() > 0) {
466 names = t_pTag->toString();
501 Eigen::Map<const Eigen::VectorXf> vecIn(vector, mat->
cols());
502 Eigen::Map<Eigen::VectorXf> vecOut(res, mat->
rows());
503 vecOut = mat->
eigen() * vecIn;
518 res = mat->
eigen() * mult;
522#define APPROX_RING_BUF_SIZE (600 * 1024 * 1024)
601 int highpass_effective;
610 firstsamp < this->
nsamp + this->first_samp;
611 firstsamp = firstsamp +
filter->size)
614 qInfo(
"%d filter buffers needed\n", nfilt_buf);
617 for (k = 0, firstsamp = this->
first_samp -
filter->taper_size; k < nfilt_buf; k++,
618 firstsamp = firstsamp +
filter->size) {
626 filt_bufs[k].ch_filtered = Eigen::VectorXi::Zero(this->
info->nchan);
629 nring_buf = approx_ring_buf_size / ((2 *
filter->taper_size +
filter->size) *
static_cast<std::size_t
>(this->
info->nchan) *
sizeof(float));
630 this->
filt_ring = std::make_unique<RingBuffer>(nring_buf);
644 qCritical(
"Cannot load a skip");
647 if (buf->
vals.size() == 0) {
655 qDebug(
"Read buffer %d .. %d\n", buf->
firsts, buf->
lasts);
686 if (buf->
vals.size() == 0)
692 Eigen::MatrixXf dataMat = buf->
vals;
695 std::swap(
comp->current,
comp->undo);
699 if (
comp->apply_transpose(
false, dataMat) !=
OK) {
700 std::swap(
comp->current,
comp->undo);
703 std::swap(
comp->current,
comp->undo);
709 if (
comp->apply_transpose(
true, dataMat) !=
OK)
728 int k, s, p, start, c, fills;
738 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
740 for (c = 0; c < sel->
nchan; c++)
743 for (c = 0; c <
info->nchan; c++)
754 for (c = 0, need_some =
false; c < sel->
nchan; c++) {
767 for (k = 0, this_buf =
bufs.data(); k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
768 if (this_buf->
lasts >= firsts) {
769 start = firsts - this_buf->
firsts;
773 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
775 for (c = 0; c < sel->
nchan; c++)
776 if (sel->
pick[c] >= 0)
779 for (c = 0; c <
info->nchan; c++)
800 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
803 deriv_ns = this_buf->
ns;
809 for (c = 0; c < sel->
nchan; c++) {
813 if (sel->
pick[c] >= 0) {
814 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
815 picked[c][s2] = this_buf->
vals(sel->
pick[c], p);
821 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
822 picked[c][s2] = deriv_vals(sel->
pick_deriv[c], p);
826 for (c = 0; c <
info->nchan; c++)
827 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
828 picked[c][s2] = this_buf->
vals(c, p);
842 for (; ns > 0; ns--, s++) {
844 for (c = 0; c < sel->
nchan; c++)
845 picked[c][s] = picked[c][fills];
847 for (c = 0; c <
info->nchan; c++)
848 picked[c][s] = picked[c][fills];
851 for (; ns > 0; ns--, s++) {
853 for (c = 0; c < sel->
nchan; c++)
856 for (c = 0; c <
info->nchan; c++)
870 int k, s, p, start, c, fills;
873 Eigen::VectorXf deriv_pvalues_vec;
876 return pick_data(sel, firsts, ns, picked);
879 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
881 for (c = 0; c < sel->
nchan; c++)
884 for (c = 0; c <
info->nchan; c++)
891 Eigen::VectorXf pvalues(
info->nchan);
892 for (k = 0, this_buf =
bufs.data(); k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
893 if (this_buf->
lasts >= firsts) {
894 start = firsts - this_buf->
firsts;
898 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
900 for (c = 0; c < sel->
nchan; c++)
901 if (sel->
pick[c] >= 0)
904 for (c = 0; c <
info->nchan; c++)
922 values = &this_buf->
vals;
926 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
927 for (c = 0; c <
info->nchan; c++)
928 pvalues[c] = (*values)(c, p);
929 if (
proj->project_vector(pvalues,
true) !=
OK)
930 qWarning() <<
"Error";
936 for (c = 0; c < sel->
nchan; c++) {
940 if (sel->
pick[c] >= 0)
941 picked[c][s] = pvalues[sel->
pick[c]];
946 picked[c][s] = deriv_pvalues_vec[sel->
pick_deriv[c]];
949 for (c = 0; c <
info->nchan; c++) {
950 picked[c][s] = pvalues[c];
965 for (; ns > 0; ns--, s++) {
967 for (c = 0; c < sel->
nchan; c++)
968 picked[c][s] = picked[c][fills];
970 for (c = 0; c <
info->nchan; c++)
971 picked[c][s] = picked[c][fills];
974 for (; ns > 0; ns--, s++) {
976 for (c = 0; c < sel->
nchan; c++)
979 for (c = 0; c <
info->nchan; c++)
996 if (buf->
vals.size() == 0) {
1003 std::vector<float*> vals_storage(buf->
nchan);
1004 float** vals = vals_storage.data();
1005 for (k = 0; k < buf->
nchan; k++) {
1007 vals[k] = buf->
vals.row(k).data() +
filter->taper_size;
1014 qDebug(
"Loaded filtered buffer %d...%d %d %d last = %d\n",
1029 int bs1, bs2, s1, s2, lasts;
1043 for (s = 0; s < ns; s++)
1044 for (c = 0; c < sel->
nchan; c++)
1047 for (s = 0; s < ns; s++)
1048 for (c = 0; c <
info->nchan; c++)
1051 lasts = firsts + ns - 1;
1061 if (
comp->apply(
true, dc) !=
OK)
1064 if (
proj->project_vector(dc,
true) !=
OK)
1067 filter_was =
filter->filter_on;
1071 for (k = 0, this_buf =
filt_bufs.data(); k <
static_cast<int>(
filt_bufs.size()); k++, this_buf++) {
1072 if (this_buf->
lasts >= firsts)
1075 for (; k < static_cast<int>(
filt_bufs.size()) && this_buf->
firsts <= lasts; k++, this_buf++) {
1077 qDebug(
"this_buf (%d): %d..%d\n", k, this_buf->
firsts, this_buf->
lasts);
1088 for (c = 0; c < sel->
nchan; c++) {
1089 if (sel->
pick[c] >= 0) {
1096 filter->filter_on =
false;
1097 else if (dc.size() > 0)
1098 dc_offset = dc[sel->
pick[c]];
1100 dc_offset,
info->chInfo[sel->
pick[c]].kind) !=
OK) {
1101 filter->filter_on = filter_was;
1105 filter->filter_on = filter_was;
1114 for (c = 0; c < der->
deriv_data->ncol; c++) {
1115 if (der->
in_use[c] > 0 &&
1122 filter->filter_on =
false;
1123 else if (dc.size() > 0)
1126 dc_offset,
info->chInfo[c].kind) !=
OK) {
1127 filter->filter_on = filter_was;
1131 filter->filter_on = filter_was;
1139 for (c = 0; c <
info->nchan; c++) {
1146 filter->filter_on =
false;
1147 else if (dc.size() > 0)
1150 dc_offset,
info->chInfo[c].kind) !=
OK) {
1151 filter->filter_on = filter_was;
1155 filter->filter_on = filter_was;
1162 if (firsts >= this_buf->
firsts) {
1163 bs1 = firsts - this_buf->
firsts;
1167 s1 = this_buf->
firsts - firsts;
1169 if (lasts >= this_buf->
lasts) {
1171 s2 = this_buf->
lasts - lasts + ns;
1173 bs2 = lasts - this_buf->
lasts + this_buf->
ns;
1177 qDebug(
"buf : %d..%d %d\n", bs1, bs2, bs2 - bs1);
1178 qDebug(
"dest : %d..%d %d\n", s1, s2, s2 - s1);
1188 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
1191 deriv_ns = this_buf->
ns;
1196 for (c = 0; c < sel->
nchan; c++) {
1200 if (sel->
pick[c] >= 0) {
1201 values = this_buf->
vals.row(sel->
pick[c]).data();
1202 for (s = s1, bs = bs1; s < s2; s++, bs++)
1203 picked[c][s] += values[bs];
1205 for (s = s1, bs = bs1; s < s2; s++, bs++)
1206 picked[c][s] += deriv_vals(sel->
pick_deriv[c], bs);
1210 for (c = 0; c <
info->nchan; c++) {
1211 values = this_buf->
vals.row(c).data();
1212 for (s = s1, bs = bs1; s < s2; s++, bs++)
1213 picked[c][s] += values[bs];
1225 int allow_maxshield,
1232 std::unique_ptr<MNERawInfo>
info;
1233 std::unique_ptr<MNERawData> data;
1235 auto filePtr = std::make_unique<QFile>(name);
1240 QList<FiffDirEntry::SPtr> dir0;
1243 int k, b, nbuf, ndir;
1244 int current_dir0 = 0;
1251 for (k = 0; k <
info->nchan; k++) {
1255 if (std::fabs(1.0 - ch.
range) > 1e-5) {
1265 qInfo(
"Ch %s unit multiplier %d -> 0\n", ch.
ch_name.toLatin1().data(), ch.
unit_mul);
1274 data = std::make_unique<MNERawData>();
1275 data->filename = name;
1276 data->file = std::move(filePtr);
1278 data->info = std::move(
info);
1282 data->ch_names.clear();
1283 for (
int i = 0; i < data->info->nchan; i++)
1284 data->ch_names.append(data->info->chInfo[i].ch_name);
1285 if (data->ch_names.size() != data->info->nchan) {
1286 qCritical(
"Channel names were not translated correctly into a name list");
1294 if (data->comp->ncomp > 0)
1295 qInfo(
"Read %d compensation data sets from %s\n", data->comp->ncomp, data->filename.toUtf8().constData());
1297 qInfo(
"No compensation data in %s\n", data->filename.toUtf8().constData());
1299 qWarning() <<
"err_print_error()";
1304 data->comp_now = data->comp_file;
1306 data->comp_now = comp_set;
1310 qCritical(
"Cannot do compensation because compensation data are missing");
1313 }
else if (data->comp->set_compensation(data->comp_now,
1316 QList<FIFFLIB::FiffChInfo>(),
1324 qInfo(
"SSS data read from %s :\n", data->filename.toUtf8().constData());
1325 QTextStream errStream(stderr);
1326 data->sss->print(errStream);
1328 qInfo(
"No SSS data in %s\n", data->filename.toUtf8().constData());
1334 dir0 = data->info->rawDir;
1335 ndir = data->info->ndir;
1342 if (!
stream->read_tag(t_pTag, dir0[current_dir0]->pos))
1344 data->first_samp = *t_pTag->toInt();
1352 if (!
stream->read_tag(t_pTag, dir0[current_dir0]->pos))
1354 nsamp_skip = data->info->buf_size * (*t_pTag->toInt());
1355 qInfo(
"Data skip of %d samples in the beginning\n", nsamp_skip);
1361 if (!
stream->read_tag(t_pTag, dir0[current_dir0]->pos))
1363 data->first_samp += *t_pTag->toInt();
1368 data->omit_samp = data->first_samp + nsamp_skip;
1369 data->omit_samp_old = nsamp_skip;
1370 data->first_samp = 0;
1372 data->first_samp = data->first_samp + nsamp_skip;
1374 }
else if (omit_skip) {
1375 data->omit_samp = data->first_samp;
1376 data->first_samp = 0;
1379 qInfo(
"data->first_samp = %d\n", data->first_samp);
1385 for (k = current_dir0, nbuf = 0; k < current_dir0 + ndir; k++)
1389 data->bufs.resize(nbuf);
1391 for (k = current_dir0, nbuf = 0; k < current_dir0 + ndir; k++)
1394 data->bufs[nbuf].ns = 0;
1395 data->bufs[nbuf].ent = dir0[k];
1396 data->bufs[nbuf].nchan = data->info->nchan;
1398 data->bufs[nbuf].valid =
false;
1399 data->bufs[nbuf].comp_status = data->comp_file;
1403 for (k = 0; k < nbuf; k++) {
1404 dir = data->bufs[k].ent;
1409 data->bufs[k].ns = dir->size / (data->info->nchan *
sizeof(
fiff_float_t));
1411 data->bufs[k].ns = dir->size / (data->info->nchan *
sizeof(
fiff_int_t));
1413 data->bufs[k].ns = dir->size / (data->info->nchan *
sizeof(double));
1415 qCritical(
"We are not prepared to handle raw data type: %d", dir->type);
1421 if (!
stream->read_tag(t_pTag, dir->pos))
1423 data->bufs[k].ns = data->info->buf_size * (*t_pTag->toInt());
1425 data->bufs[k].firsts = k == 0 ? data->first_samp : data->bufs[k - 1].lasts + 1;
1426 data->bufs[k].lasts = data->bufs[k].firsts + data->bufs[k].ns - 1;
1427 data->nsamp += data->bufs[k].ns;
1433 data->bad = Eigen::VectorXi::Zero(data->info->nchan);
1434 data->offsets = Eigen::VectorXf::Zero(data->info->nchan);
1440 for (b = 0; b < data->nbad; b++) {
1441 for (k = 0; k < data->info->nchan; k++) {
1442 if (QString::compare(data->info->chInfo[k].ch_name, data->badlist[b], Qt::CaseInsensitive) == 0) {
1448 qInfo(
"%d bad channels read from %s%s", data->nbad, name.toUtf8().constData(), data->nbad > 0 ?
":\n" :
"\n");
1449 if (data->nbad > 0) {
1451 for (k = 0; k < data->nbad; k++)
1452 qInfo(
"%s%c", data->badlist[k].toUtf8().constData(), k < data->
nbad - 1 ?
' ' :
'\n');
1459 nbuf = approx_ring_buf_size / (data->info->buf_size *
static_cast<std::size_t
>(data->info->nchan) *
sizeof(float));
1460 data->ring = std::make_unique<RingBuffer>(nbuf);
1464 data->filter = std::make_unique<MNEFilterDef>(
filter);
1465 data->setup_filter_bufs();
1468 std::vector<float> vals_storage(data->info->nchan, 0.0f);
1469 std::vector<float*> vals_rows(data->info->nchan);
1470 for (
int i = 0; i < data->info->nchan; i++)
1471 vals_rows[i] = &vals_storage[i];
1472 float** vals = vals_rows.data();
1474 if (data->pick_data(
nullptr, data->first_samp, 1, vals) ==
FAIL)
1476 data->first_sample_val.resize(data->info->nchan);
1477 for (k = 0; k < data->info->nchan; k++)
1478 data->first_sample_val[k] = vals[k][0];
1479 qInfo(
"Initial dc offsets determined\n");
1481 qInfo(
"Raw data file %s:\n", name.toUtf8().constData());
1482 qInfo(
"\tnchan = %d\n", data->info->nchan);
1483 qInfo(
"\tnsamp = %d\n", data->nsamp);
1484 qInfo(
"\tsfreq = %-8.3f Hz\n", data->info->sfreq);
1485 qInfo(
"\tlength = %-8.3f sec\n", data->nsamp / data->info->sfreq);
1487 return data.release();
1504 if (!keepPrevious || !
deriv) {
1505 deriv = std::make_unique<MNEDerivSet>();
1507 deriv->append(derivations);
1510 qInfo(
"No derivations are valid for these raw data.");
1514 qInfo(
"%d of %d of the matched derivations are valid for these raw data.", nvalid,
deriv_matched->deriv_data->nrow);
#define FIFF_MNE_CH_NAME_LIST
#define FIFFB_MNE_BAD_CHANNELS
#define FIFF_FIRST_SAMPLE
#define FIFFV_SSS_JOB_NOTHING
void mne_fft_syn(float *data, int np, std::vector< float > &)
int mne_sparse_vec_mult2(FiffSparseMatrix *mat, float *vector, float *res)
int mne_read_raw_buffer_t(FiffStream::SPtr &stream, const FiffDirEntry::SPtr &ent, RowMajorMatrixXf &data, int nchan, int nsamp, const QList< FIFFLIB::FiffChInfo > &chs, int *pickno, int npick)
int mne_sparse_mat_mult2(FiffSparseMatrix *mat, const RowMajorMatrixXf &mult, int ncol, RowMajorMatrixXf &res)
int mne_apply_filter(const MNEFilterDef &filter, FilterData *d, float *data, int ns, int zero_pad, float dc_offset, int kind)
int mne_read_bad_channel_list(const QString &name, QStringList &listp, int &nlistp)
#define APPROX_RING_BUF_SIZE
int mne_read_bad_channel_list_from_node(FiffStream::SPtr &stream, const FiffDirNode::SPtr &pNode, QStringList &listp, int &nlistp)
int mne_compare_filters(const MNEFilterDef &f1, const MNEFilterDef &f2)
void mne_fft_ana(float *data, int np, std::vector< float > &)
std::unique_ptr< FilterData > mne_create_filter_response(const MNEFilterDef &filter, float sfreq, int *highpass_effective)
#define MNE_DEFAULT_TRIGGER_CH
Default digital trigger channel name.
Legacy MNE-C raw-recording container with per-file buffer descriptors.
Core MNE data structures (source spaces, source estimates, hemispheres).
MNEChSelection * mneChSelection
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > RowMajorMatrixXf
FIFF file I/O, in-memory data structures and high-level readers/writers.
Per-channel FIFF descriptor: identifiers, kind, calibration, coil type, channel-frame coil position a...
QSharedPointer< FiffDirEntry > SPtr
QSharedPointer< FiffDirNode > SPtr
Sparse FIFF matrix: CCS or RCS storage with the value / index / pointer triple as written by FiffStre...
Eigen::SparseMatrix< float > & eigen()
FIFF tag-stream reader/writer: wraps a QIODevice and exposes typed read_* / write_* methods for every...
QSharedPointer< FiffStream > SPtr
static QStringList split_name_list(QString p_sNameList)
std::unique_ptr< FiffTag > UPtr
Eigen::VectorXi pick_deriv
QStringList chspick_nospace
static std::unique_ptr< MNECTFCompDataSet > read(const QString &name)
static QString explain_comp(int kind)
static int get_comp(const QList< FIFFLIB::FiffChInfo > &chs, int nch)
static int map_comp_kind(int grad)
One item in a derivation data set.
std::unique_ptr< MNESparseNamedMatrix > deriv_data
Collection of channel derivations.
Definition of one raw data buffer within a FIFF file.
FIFFLIB::FiffDirEntry::SPtr ent
Eigen::VectorXi ch_filtered
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > vals
void allocate(int nrow, int ncol, RowMajorMatrixXf *res)
std::vector< Entry > entries
Pre-computed frequency-domain filter state used for FFT-based raw data filtering.
FilterData(int resp_size)
std::vector< float > eog_freq_resp
std::vector< float > freq_resp
std::vector< float > precalc
int load_one_filt_buf(MNERawBufDef *buf)
std::unique_ptr< MNELIB::MNEProjOp > proj
std::unique_ptr< MNELIB::MNECTFCompDataSet > comp
std::unique_ptr< FilterData > filter_data
void add_filter_response(int *highpass_effective)
int compensate_buffer(MNERawBufDef *buf)
int pick_data_proj(mneChSelection sel, int firsts, int ns, float **picked)
std::unique_ptr< RingBuffer > filt_ring
std::unique_ptr< MNELIB::MNERawInfo > info
std::unique_ptr< MNELIB::MNEDeriv > deriv_matched
unsigned int dig_trigger_mask
std::vector< MNELIB::MNERawBufDef > filt_bufs
static MNERawData * open_file_comp(const QString &name, int omit_skip, int allow_maxshield, const MNEFilterDef &filter, int comp_set)
std::unique_ptr< MNEFilterDef > filter
int load_one_buffer(MNERawBufDef *buf)
Eigen::VectorXf first_sample_val
std::unique_ptr< MNEEventList > event_list
int attachDerivations(const MNEDerivSet &derivations, bool keepPrevious=false)
std::unique_ptr< MNELIB::MNEDerivSet > deriv
std::vector< MNELIB::MNERawBufDef > bufs
int pick_data(mneChSelection sel, int firsts, int ns, float **picked)
FIFFLIB::FiffStream::SPtr stream
std::unique_ptr< MNELIB::MNESssData > sss
static MNERawData * open_file(const QString &name, int omit_skip, int allow_maxshield, const MNEFilterDef &filter)
int pick_data_filt(mneChSelection sel, int firsts, int ns, float **picked)
std::unique_ptr< RingBuffer > ring
static int load(const QString &name, int allow_maxshield, std::unique_ptr< MNERawInfo > &infop)
static std::unique_ptr< MNESssData > read(const QString &name)