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.");
411 this_samples =
reinterpret_cast<fiff_short_t*
>(t_pTag->data());
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;
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);
641 if (sameLayout && !mne_compare_filters(newFilter, *
filter))
643 filter = std::make_unique<MNEFilterDef>(newFilter);
647 int highpass_effective;
663 qCritical(
"Cannot load a skip");
666 if (buf->
vals.size() == 0) {
674 qDebug(
"Read buffer %d .. %d\n", buf->
firsts, buf->
lasts);
705 if (buf->
vals.size() == 0)
711 Eigen::MatrixXf dataMat = buf->
vals;
714 std::swap(
comp->current,
comp->undo);
718 if (
comp->apply_transpose(
false, dataMat) !=
OK) {
719 std::swap(
comp->current,
comp->undo);
722 std::swap(
comp->current,
comp->undo);
728 if (
comp->apply_transpose(
true, dataMat) !=
OK)
747 int k, s, p, start, c, fills;
757 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
759 for (c = 0; c < sel->
nchan; c++)
762 for (c = 0; c <
info->nchan; c++)
773 for (c = 0, need_some =
false; c < sel->
nchan; c++) {
786 for (k = 0, this_buf =
bufs.data(); k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
787 if (this_buf->
lasts >= firsts) {
788 start = firsts - this_buf->
firsts;
792 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
794 for (c = 0; c < sel->
nchan; c++)
795 if (sel->
pick[c] >= 0)
798 for (c = 0; c <
info->nchan; c++)
819 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
822 deriv_ns = this_buf->
ns;
828 for (c = 0; c < sel->
nchan; c++) {
832 if (sel->
pick[c] >= 0) {
833 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
834 picked[c][s2] = this_buf->
vals(sel->
pick[c], p);
840 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
841 picked[c][s2] = deriv_vals(sel->
pick_deriv[c], p);
845 for (c = 0; c <
info->nchan; c++)
846 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
847 picked[c][s2] = this_buf->
vals(c, p);
861 for (; ns > 0; ns--, s++) {
863 for (c = 0; c < sel->
nchan; c++)
864 picked[c][s] = picked[c][fills];
866 for (c = 0; c <
info->nchan; c++)
867 picked[c][s] = picked[c][fills];
870 for (; ns > 0; ns--, s++) {
872 for (c = 0; c < sel->
nchan; c++)
875 for (c = 0; c <
info->nchan; c++)
889 int k, s, p, start, c, fills;
892 Eigen::VectorXf deriv_pvalues_vec;
895 return pick_data(sel, firsts, ns, picked);
898 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
900 for (c = 0; c < sel->
nchan; c++)
903 for (c = 0; c <
info->nchan; c++)
910 Eigen::VectorXf pvalues(
info->nchan);
911 for (k = 0, this_buf =
bufs.data(); k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
912 if (this_buf->
lasts >= firsts) {
913 start = firsts - this_buf->
firsts;
917 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
919 for (c = 0; c < sel->
nchan; c++)
920 if (sel->
pick[c] >= 0)
923 for (c = 0; c <
info->nchan; c++)
941 values = &this_buf->
vals;
945 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
946 for (c = 0; c <
info->nchan; c++)
947 pvalues[c] = (*values)(c, p);
948 if (
proj->project_vector(pvalues,
true) !=
OK)
949 qWarning() <<
"Error";
955 for (c = 0; c < sel->
nchan; c++) {
959 if (sel->
pick[c] >= 0)
960 picked[c][s] = pvalues[sel->
pick[c]];
965 picked[c][s] = deriv_pvalues_vec[sel->
pick_deriv[c]];
968 for (c = 0; c <
info->nchan; c++) {
969 picked[c][s] = pvalues[c];
984 for (; ns > 0; ns--, s++) {
986 for (c = 0; c < sel->
nchan; c++)
987 picked[c][s] = picked[c][fills];
989 for (c = 0; c <
info->nchan; c++)
990 picked[c][s] = picked[c][fills];
993 for (; ns > 0; ns--, s++) {
995 for (c = 0; c < sel->
nchan; c++)
998 for (c = 0; c <
info->nchan; c++)
1015 if (buf->
vals.size() == 0) {
1022 std::vector<float*> vals_storage(buf->
nchan);
1023 float** vals = vals_storage.data();
1024 for (k = 0; k < buf->
nchan; k++) {
1026 vals[k] = buf->
vals.row(k).data() +
filter->taper_size;
1033 qDebug(
"Loaded filtered buffer %d...%d %d %d last = %d\n",
1048 int bs1, s1, s2, lasts;
1049 [[maybe_unused]]
int bs2;
1063 for (s = 0; s < ns; s++)
1064 for (c = 0; c < sel->
nchan; c++)
1067 for (s = 0; s < ns; s++)
1068 for (c = 0; c <
info->nchan; c++)
1071 lasts = firsts + ns - 1;
1081 if (
comp->apply(
true, dc) !=
OK)
1084 if (
proj->project_vector(dc,
true) !=
OK)
1087 filter_was =
filter->filter_on;
1091 for (k = 0, this_buf =
filt_bufs.data(); k <
static_cast<int>(
filt_bufs.size()); k++, this_buf++) {
1092 if (this_buf->
lasts >= firsts)
1095 for (; k < static_cast<int>(
filt_bufs.size()) && this_buf->
firsts <= lasts; k++, this_buf++) {
1097 qDebug(
"this_buf (%d): %d..%d\n", k, this_buf->
firsts, this_buf->
lasts);
1108 for (c = 0; c < sel->
nchan; c++) {
1109 if (sel->
pick[c] >= 0) {
1116 filter->filter_on =
false;
1117 else if (dc.size() > 0)
1118 dc_offset = dc[sel->
pick[c]];
1120 dc_offset,
info->chInfo[sel->
pick[c]].kind) !=
OK) {
1121 filter->filter_on = filter_was;
1125 filter->filter_on = filter_was;
1134 for (c = 0; c < der->
deriv_data->ncol; c++) {
1135 if (der->
in_use[c] > 0 &&
1142 filter->filter_on =
false;
1143 else if (dc.size() > 0)
1146 dc_offset,
info->chInfo[c].kind) !=
OK) {
1147 filter->filter_on = filter_was;
1151 filter->filter_on = filter_was;
1159 for (c = 0; c <
info->nchan; c++) {
1166 filter->filter_on =
false;
1167 else if (dc.size() > 0)
1170 dc_offset,
info->chInfo[c].kind) !=
OK) {
1171 filter->filter_on = filter_was;
1175 filter->filter_on = filter_was;
1182 if (firsts >= this_buf->
firsts) {
1183 bs1 = firsts - this_buf->
firsts;
1187 s1 = this_buf->
firsts - firsts;
1189 if (lasts >= this_buf->
lasts) {
1191 s2 = this_buf->
lasts - lasts + ns;
1193 bs2 = lasts - this_buf->
lasts + this_buf->
ns;
1197 qDebug(
"buf : %d..%d %d\n", bs1, bs2, bs2 - bs1);
1198 qDebug(
"dest : %d..%d %d\n", s1, s2, s2 - s1);
1208 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
1211 deriv_ns = this_buf->
ns;
1216 for (c = 0; c < sel->
nchan; c++) {
1220 if (sel->
pick[c] >= 0) {
1221 values = this_buf->
vals.row(sel->
pick[c]).data();
1222 for (s = s1, bs = bs1; s < s2; s++, bs++)
1223 picked[c][s] += values[bs];
1225 for (s = s1, bs = bs1; s < s2; s++, bs++)
1226 picked[c][s] += deriv_vals(sel->
pick_deriv[c], bs);
1230 for (c = 0; c <
info->nchan; c++) {
1231 values = this_buf->
vals.row(c).data();
1232 for (s = s1, bs = bs1; s < s2; s++, bs++)
1233 picked[c][s] += values[bs];
1244 int allow_maxshield,
1251 std::unique_ptr<MNERawInfo>
info;
1252 std::unique_ptr<MNERawData> data;
1254 auto filePtr = std::make_unique<QFile>(name);
1259 QList<FiffDirEntry::SPtr> dir0;
1262 int k, b, nbuf, ndir;
1263 int current_dir0 = 0;
1270 for (k = 0; k <
info->nchan; k++) {
1274 if (std::fabs(1.0 - ch.
range) > 1e-5) {
1284 qInfo(
"Ch %s unit multiplier %d -> 0\n", ch.
ch_name.toLatin1().data(), ch.
unit_mul);
1293 data = std::make_unique<MNERawData>();
1294 data->filename = name;
1295 data->file = std::move(filePtr);
1297 data->info = std::move(
info);
1301 data->ch_names.clear();
1302 for (
int i = 0; i < data->info->nchan; i++)
1303 data->ch_names.append(data->info->chInfo[i].ch_name);
1304 if (data->ch_names.size() != data->info->nchan) {
1305 qCritical(
"Channel names were not translated correctly into a name list");
1313 if (data->comp->ncomp > 0)
1314 qInfo(
"Read %d compensation data sets from %s\n", data->comp->ncomp, data->filename.toUtf8().constData());
1316 qInfo(
"No compensation data in %s\n", data->filename.toUtf8().constData());
1318 qWarning() <<
"err_print_error()";
1323 data->comp_now = data->comp_file;
1325 data->comp_now = comp_set;
1329 qCritical(
"Cannot do compensation because compensation data are missing");
1332 }
else if (data->comp->set_compensation(data->comp_now,
1335 QList<FIFFLIB::FiffChInfo>(),
1343 qInfo(
"SSS data read from %s :\n", data->filename.toUtf8().constData());
1344 QTextStream errStream(stderr);
1345 data->sss->print(errStream);
1347 qInfo(
"No SSS data in %s\n", data->filename.toUtf8().constData());
1353 dir0 = data->info->rawDir;
1354 ndir = data->info->ndir;
1361 if (!
stream->read_tag(t_pTag, dir0[current_dir0]->pos))
1363 data->first_samp = *t_pTag->toInt();
1371 if (!
stream->read_tag(t_pTag, dir0[current_dir0]->pos))
1373 nsamp_skip = data->info->buf_size * (*t_pTag->toInt());
1374 qInfo(
"Data skip of %d samples in the beginning\n", nsamp_skip);
1380 if (!
stream->read_tag(t_pTag, dir0[current_dir0]->pos))
1382 data->first_samp += *t_pTag->toInt();
1387 data->omit_samp = data->first_samp + nsamp_skip;
1388 data->omit_samp_old = nsamp_skip;
1389 data->first_samp = 0;
1391 data->first_samp = data->first_samp + nsamp_skip;
1393 }
else if (omit_skip) {
1394 data->omit_samp = data->first_samp;
1395 data->first_samp = 0;
1398 qInfo(
"data->first_samp = %d\n", data->first_samp);
1404 for (k = current_dir0, nbuf = 0; k < current_dir0 + ndir; k++)
1408 data->bufs.resize(nbuf);
1410 for (k = current_dir0, nbuf = 0; k < current_dir0 + ndir; k++)
1413 data->bufs[nbuf].ns = 0;
1414 data->bufs[nbuf].ent = dir0[k];
1415 data->bufs[nbuf].nchan = data->info->nchan;
1417 data->bufs[nbuf].valid =
false;
1418 data->bufs[nbuf].comp_status = data->comp_file;
1422 for (k = 0; k < nbuf; k++) {
1423 dir = data->bufs[k].ent;
1428 data->bufs[k].ns = dir->size / (data->info->nchan *
sizeof(
fiff_float_t));
1430 data->bufs[k].ns = dir->size / (data->info->nchan *
sizeof(
fiff_int_t));
1432 data->bufs[k].ns = dir->size / (data->info->nchan *
sizeof(double));
1434 qCritical(
"We are not prepared to handle raw data type: %d", dir->type);
1440 if (!
stream->read_tag(t_pTag, dir->pos))
1442 data->bufs[k].ns = data->info->buf_size * (*t_pTag->toInt());
1444 data->bufs[k].firsts = k == 0 ? data->first_samp : data->bufs[k - 1].lasts + 1;
1445 data->bufs[k].lasts = data->bufs[k].firsts + data->bufs[k].ns - 1;
1446 data->nsamp += data->bufs[k].ns;
1452 data->bad = Eigen::VectorXi::Zero(data->info->nchan);
1453 data->offsets = Eigen::VectorXf::Zero(data->info->nchan);
1459 for (b = 0; b < data->nbad; b++) {
1460 for (k = 0; k < data->info->nchan; k++) {
1461 if (QString::compare(data->info->chInfo[k].ch_name, data->badlist[b], Qt::CaseInsensitive) == 0) {
1467 qInfo(
"%d bad channels read from %s%s", data->nbad, name.toUtf8().constData(), data->nbad > 0 ?
":\n" :
"\n");
1468 if (data->nbad > 0) {
1470 for (k = 0; k < data->nbad; k++)
1471 qInfo(
"%s%c", data->badlist[k].toUtf8().constData(), k < data->
nbad - 1 ?
' ' :
'\n');
1478 nbuf = approx_ring_buf_size / (data->info->buf_size *
static_cast<std::size_t
>(data->info->nchan) *
sizeof(float));
1479 data->ring = std::make_unique<RingBuffer>(nbuf);
1483 data->filter = std::make_unique<MNEFilterDef>(
filter);
1484 data->setup_filter_bufs();
1487 std::vector<float> vals_storage(data->info->nchan, 0.0f);
1488 std::vector<float*> vals_rows(data->info->nchan);
1489 for (
int i = 0; i < data->info->nchan; i++)
1490 vals_rows[i] = &vals_storage[i];
1491 float** vals = vals_rows.data();
1493 if (data->pick_data(
nullptr, data->first_samp, 1, vals) ==
FAIL)
1495 data->first_sample_val.resize(data->info->nchan);
1496 for (k = 0; k < data->info->nchan; k++)
1497 data->first_sample_val[k] = vals[k][0];
1498 qInfo(
"Initial dc offsets determined\n");
1500 qInfo(
"Raw data file %s:\n", name.toUtf8().constData());
1501 qInfo(
"\tnchan = %d\n", data->info->nchan);
1502 qInfo(
"\tnsamp = %d\n", data->nsamp);
1503 qInfo(
"\tsfreq = %-8.3f Hz\n", data->info->sfreq);
1504 qInfo(
"\tlength = %-8.3f sec\n", data->nsamp / data->info->sfreq);
1506 return data.release();
1523 if (!keepPrevious || !
deriv) {
1524 deriv = std::make_unique<MNEDerivSet>();
1526 deriv->append(derivations);
1529 qInfo(
"No derivations are valid for these raw data.");
1533 qInfo(
"%d of %d of the matched derivations are valid for these raw data.", nvalid,
deriv_matched->deriv_data->nrow);
constexpr auto FIFF_MNE_CH_NAME_LIST
constexpr auto FIFFV_STIM_CH
constexpr auto FIFFB_MNE_BAD_CHANNELS
constexpr auto FIFFV_EOG_CH
constexpr auto FIFF_DATA_SKIP
constexpr auto FIFF_DATA_BUFFER
constexpr auto FIFFT_DOUBLE
constexpr auto FIFFV_SSS_JOB_NOTHING
constexpr auto FIFFT_DAU_PACK16
constexpr auto FIFF_FIRST_SAMPLE
constexpr auto FIFFT_SHORT
constexpr auto FIFFT_FLOAT
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)
constexpr auto APPROX_RING_BUF_SIZE
int mne_read_bad_channel_list_from_node(FiffStream::SPtr &stream, const FiffDirNode::SPtr &pNode, QStringList &listp, int &nlistp)
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
constexpr auto MNE_CTFV_NOGRAD
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
bool setFilter(const MNEFilterDef &newFilter)
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)