49#define _USE_MATH_DEFINES
63#if defined(_WIN32) || defined(_WIN64)
64#define snprintf _snprintf
65#define vsnprintf _vsnprintf
66#define strcasecmp _stricmp
67#define strncasecmp _strnicmp
74using RowMajorMatrixXf = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
93 :
entries(static_cast<size_t>(nslots))
104 e.
user->resize(0, 0);
105 res->resize(nrow, ncol);
132 :
freq_resp(static_cast<size_t>(resp_size), 1.0f)
168 qCritical(
"##################### DEBUG Error: FFT analysis needs to be implemented");
179 qCritical(
"##################### DEBUG Error: FFT synthesis needs to be implemented");
192 qCritical(
"Incorrect data length in apply_filter");
209 if (dc_offset != 0.0) {
211 data[k] = data[k] - dc_offset;
225 n = ns % 2 == 0 ? ns/2 : (ns+1)/2;
234 data[p] = data[p]*freq_resp[0]; p++;
238 for (k = 1 ; k < n ; k++) {
239 data[p] = data[p]*freq_resp[k]; p++;
240 data[p] = data[p]*freq_resp[k]; p++;
246 data[p] = data[p]*freq_resp[k];
255 int *highpass_effective)
262 int highpasss,lowpasss;
263 int highpass_widths,lowpass_widths;
264 float lowpass,highpass,lowpass_width,highpass_width;
266 float pi4 =
M_PI/4.0;
271 auto filter_data = std::make_unique<FilterData>(resp_size);
272 *highpass_effective =
false;
274 for (f = 0; f < 2; f++) {
279 freq_resp = f == 0 ? filter_data->freq_resp.data() : filter_data->eog_freq_resp.data();
283 highpasss = ((resp_size-1)*highpass)/(0.5*sfreq);
284 lowpasss = ((resp_size-1)*lowpass)/(0.5*sfreq);
286 lowpass_widths = ((resp_size-1)*lowpass_width)/(0.5*sfreq);
287 lowpass_widths = (lowpass_widths+1)/2;
290 highpass_widths = ((resp_size-1)*highpass_width)/(0.5*sfreq);
291 highpass_widths = (highpass_widths+1)/2;
297 qInfo(
"filter : %7.3f ... %6.1f Hz bins : %d ... %d of %d hpw : %d lpw : %d\n",
306 if (highpasss > highpass_widths + 1) {
310 for (k = 0; k < highpasss-w+1; k++)
312 for (k = -w+1, s = highpasss-w+1; k < w; k++, s++) {
313 if (s >= 0 && s < resp_size) {
314 c = cos(pi4*(k*mult+add));
315 freq_resp[s] = freq_resp[s]*c*c;
318 *highpass_effective =
true;
321 *highpass_effective = *highpass_effective || (filter.
highpass == 0.0);
323 if (lowpass_widths > 0) {
327 for (k = -w+1, s = lowpasss-w+1; k < w; k++, s++) {
328 if (s >= 0 && s < resp_size) {
329 c = cos(pi4*(k*mult+add));
330 freq_resp[s] = freq_resp[s]*c*c;
333 for (k = s; k < resp_size; k++)
337 for (k = lowpasss; k < resp_size; k++)
341 if (*highpass_effective)
342 qInfo(
"Highpass filter will work as specified.\n");
344 qWarning(
"NOTE: Highpass filter omitted due to a too low corner frequency.\n");
347 qWarning(
"NOTE: Filter is presently switched off.\n");
360 const QList<FIFFLIB::FiffChInfo>& chs,
376 Eigen::VectorXi pickno_vec;
378 pickno_vec = Eigen::VectorXi::LinSpaced(nchan, 0, nchan - 1);
379 pickno = pickno_vec.data();
386 Eigen::VectorXf mult(npick);
387 for (c = 0; c < npick; c++)
388 mult[c] = chs[pickno[c]].cal*chs[pickno[c]].range;
392 if (!stream->read_tag(t_pTag,ent->pos))
396 if (
static_cast<int>(t_pTag->size()/(
sizeof(
fiff_float_t)*nchan)) != nsamp) {
397 qCritical(
"Incorrect number of samples in buffer.");
400 qDebug() <<
"ToDo: Check whether this_samplef contains the right stuff!!! - use VectorXf instead";
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]];
408 if (
static_cast<int>(t_pTag->size()/(
sizeof(
fiff_short_t)*nchan)) != nsamp) {
409 qCritical(
"Incorrect number of samples in buffer.");
412 qDebug() <<
"ToDo: Check whether this_samples contains the right stuff!!! - use VectorXi instead";
414 for (s = 0; s < nsamp; s++, this_samples += nchan) {
415 for (c = 0; c < npick; c++)
416 data(c,s) = mult[c]*this_samples[pickno[c]];
420 if (
static_cast<int>(t_pTag->size()/(
sizeof(
fiff_int_t)*nchan)) != nsamp) {
421 qCritical(
"Incorrect number of samples in buffer.");
424 qDebug() <<
"ToDo: Check whether this_sample contains the right stuff!!! - use VectorXi instead";
425 this_sample = t_pTag->toInt();
426 for (s = 0; s < nsamp; s++, this_sample += nchan) {
427 for (c = 0; c < npick; c++)
428 data(c,s) = mult[c]*this_sample[pickno[c]];
432 qCritical(
"We are not prepared to handle raw data type: %d",ent->type);
444 QList<FiffDirNode::SPtr> temp;
450 if (pNode->isEmpty())
451 node = stream->dirtree();
456 if (temp.size() > 0) {
461 names = t_pTag->toString();
496 Eigen::Map<const Eigen::VectorXf> vecIn(vector, mat->
cols());
497 Eigen::Map<Eigen::VectorXf> vecOut(res, mat->
rows());
498 vecOut = mat->
eigen() * vecIn;
513 res = mat->
eigen() * mult;
517#define APPROX_RING_BUF_SIZE (600*1024*1024)
597 int highpass_effective;
602 if (!this->filter ||
filter->size <= 0)
606 firstsamp < this->
nsamp + this->first_samp;
607 firstsamp = firstsamp +
filter->size)
610 qInfo(
"%d filter buffers needed\n",nfilt_buf);
613 for (k = 0, firstsamp = this->
first_samp-
filter->taper_size; k < nfilt_buf; k++,
614 firstsamp = firstsamp +
filter->size) {
622 filt_bufs[k].ch_filtered = Eigen::VectorXi::Zero(this->
info->nchan);
625 nring_buf = approx_ring_buf_size/((2*
filter->taper_size+
filter->size)*
626 this->
info->nchan*
sizeof(float));
627 this->
filt_ring = std::make_unique<RingBuffer>(nring_buf);
641 qCritical(
"Cannot load a skip");
644 if (buf->
vals.size() == 0) {
652 qDebug(
"Read buffer %d .. %d\n",buf->
firsts,buf->
lasts);
684 if (buf->
vals.size() == 0)
690 Eigen::MatrixXf dataMat = buf->
vals;
693 std::swap(
comp->current,
comp->undo);
697 if (
comp->apply_transpose(
false, dataMat) !=
OK) {
698 std::swap(
comp->current,
comp->undo);
701 std::swap(
comp->current,
comp->undo);
707 if (
comp->apply_transpose(
true, dataMat) !=
OK)
726 int k,s,p,start,c,fills;
737 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
739 for (c = 0; c < sel->
nchan; c++)
742 for (c = 0; c <
info->nchan; c++)
754 for (c = 0, need_some =
false; c < sel->
nchan; c++) {
766 for (k = 0, this_buf =
bufs.data(), s = 0; k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
767 if (this_buf->
lasts >= firsts) {
768 start = firsts - this_buf->
firsts;
772 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
774 for (c = 0; c < sel->
nchan; c++)
775 if (sel->
pick[c] >= 0)
779 for (c = 0; c <
info->nchan; c++)
801 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
804 deriv_ns = this_buf->
ns;
810 for (c = 0; c < sel->
nchan; c++) {
814 if (sel->
pick[c] >= 0) {
815 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
816 picked[c][s2] = this_buf->
vals(sel->
pick[c], p);
822 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
823 picked[c][s2] = deriv_vals(sel->
pick_deriv[c], p);
828 for (c = 0; c <
info->nchan; c++)
829 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
830 picked[c][s2] = this_buf->
vals(c, p);
844 for (; ns > 0; ns--, s++) {
846 for (c = 0; c < sel->
nchan; c++)
847 picked[c][s] = picked[c][fills];
849 for (c = 0; c <
info->nchan; c++)
850 picked[c][s] = picked[c][fills];
854 for (; ns > 0; ns--, s++) {
856 for (c = 0; c < sel->
nchan; c++)
859 for (c = 0; c <
info->nchan; c++)
873 int k,s,p,start,c,fills;
876 Eigen::VectorXf deriv_pvalues_vec;
882 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
884 for (c = 0; c < sel->
nchan; c++)
887 for (c = 0; c <
info->nchan; c++)
895 Eigen::VectorXf pvalues(
info->nchan);
896 for (k = 0, this_buf =
bufs.data(); k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
897 if (this_buf->
lasts >= firsts) {
898 start = firsts - this_buf->
firsts;
902 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
904 for (c = 0; c < sel->
nchan; c++)
905 if (sel->
pick[c] >= 0)
909 for (c = 0; c <
info->nchan; c++)
928 values = &this_buf->
vals;
932 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
933 for (c = 0; c <
info->nchan; c++)
934 pvalues[c] = (*values)(c,p);
935 if (
proj->project_vector(pvalues,
true) !=
OK)
942 for (c = 0; c < sel->
nchan; c++) {
946 if (sel->
pick[c] >= 0)
947 picked[c][s] = pvalues[sel->
pick[c]];
952 picked[c][s] = deriv_pvalues_vec[sel->
pick_deriv[c]];
956 for (c = 0; c <
info->nchan; c++) {
957 picked[c][s] = pvalues[c];
972 for (; ns > 0; ns--, s++) {
974 for (c = 0; c < sel->
nchan; c++)
975 picked[c][s] = picked[c][fills];
977 for (c = 0; c <
info->nchan; c++)
978 picked[c][s] = picked[c][fills];
982 for (; ns > 0; ns--, s++) {
984 for (c = 0; c < sel->
nchan; c++)
987 for (c = 0; c <
info->nchan; c++)
1004 if (buf->
vals.size() == 0) {
1011 std::vector<float*> vals_storage(buf->
nchan);
1012 float **vals = vals_storage.data();
1013 for (k = 0; k < buf->
nchan; k++) {
1015 vals[k] = buf->
vals.row(k).data() +
filter->taper_size;
1022 qDebug(
"Loaded filtered buffer %d...%d %d %d last = %d\n",
1037 int bs1,bs2,s1,s2,lasts;
1051 for (s = 0; s < ns; s++)
1052 for (c = 0; c < sel->
nchan; c++)
1056 for (s = 0; s < ns; s++)
1057 for (c = 0; c <
info->nchan; c++)
1060 lasts = firsts + ns - 1;
1070 if (
comp->apply(
true,dc) !=
OK)
1073 if (
proj->project_vector(dc,
true) !=
OK)
1076 filter_was =
filter->filter_on;
1080 for (k = 0, this_buf =
filt_bufs.data(); k <
static_cast<int>(
filt_bufs.size()); k++, this_buf++) {
1081 if (this_buf->
lasts >= firsts)
1084 for (; k < static_cast<int>(
filt_bufs.size()) && this_buf->
firsts <= lasts; k++, this_buf++) {
1086 qDebug(
"this_buf (%d): %d..%d\n",k,this_buf->
firsts,this_buf->
lasts);
1097 for (c = 0; c < sel->
nchan; c++) {
1098 if (sel->
pick[c] >= 0) {
1105 filter->filter_on =
false;
1106 else if (dc.size() > 0)
1107 dc_offset = dc[sel->
pick[c]];
1109 dc_offset,
info->chInfo[sel->
pick[c]].kind) !=
OK) {
1110 filter->filter_on = filter_was;
1114 filter->filter_on = filter_was;
1123 for (c = 0; c < der->
deriv_data->ncol; c++) {
1124 if (der->
in_use[c] > 0 &&
1131 filter->filter_on =
false;
1132 else if (dc.size() > 0)
1135 dc_offset,
info->chInfo[c].kind) !=
OK) {
1136 filter->filter_on = filter_was;
1140 filter->filter_on = filter_was;
1149 for (c = 0; c <
info->nchan; c++) {
1156 filter->filter_on =
false;
1157 else if (dc.size() > 0)
1160 dc_offset,
info->chInfo[c].kind) !=
OK) {
1161 filter->filter_on = filter_was;
1165 filter->filter_on = filter_was;
1172 if (firsts >= this_buf->
firsts) {
1173 bs1 = firsts - this_buf->
firsts;
1178 s1 = this_buf->
firsts - firsts;
1180 if (lasts >= this_buf->
lasts) {
1182 s2 = this_buf->
lasts - lasts + ns;
1185 bs2 = lasts - this_buf->
lasts + this_buf->
ns;
1189 qDebug(
"buf : %d..%d %d\n",bs1,bs2,bs2-bs1);
1190 qDebug(
"dest : %d..%d %d\n",s1,s2,s2-s1);
1200 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
1203 deriv_ns = this_buf->
ns;
1208 for (c = 0; c < sel->
nchan; c++) {
1212 if (sel->
pick[c] >= 0) {
1213 values = this_buf->
vals.row(sel->
pick[c]).data();
1214 for (s = s1, bs = bs1; s < s2; s++, bs++)
1215 picked[c][s] += values[bs];
1218 for (s = s1, bs = bs1; s < s2; s++, bs++)
1219 picked[c][s] += deriv_vals(sel->
pick_deriv[c], bs);
1224 for (c = 0; c <
info->nchan; c++) {
1225 values = this_buf->
vals.row(c).data();
1226 for (s = s1, bs = bs1; s < s2; s++, bs++)
1227 picked[c][s] += values[bs];
1239 int allow_maxshield,
1246 std::unique_ptr<MNERawInfo>
info;
1247 std::unique_ptr<MNERawData> data;
1249 auto filePtr = std::make_unique<QFile>(name);
1254 QList<FiffDirEntry::SPtr> dir0;
1258 int k, b, nbuf, ndir;
1259 int current_dir0 = 0;
1266 for (k = 0; k <
info->nchan; k++) {
1267 ch =
info->chInfo.at(k);
1269 if (std::fabs(1.0 - ch.
range) > 1e-5) {
1279 qInfo(
"Ch %s unit multiplier %d -> 0\n",ch.
ch_name.toLatin1().data(),ch.
unit_mul);
1288 data = std::make_unique<MNERawData>();
1289 data->filename = name;
1290 data->file = std::move(filePtr);
1292 data->info = std::move(
info);
1296 data->ch_names.clear();
1297 for (
int i = 0; i < data->info->nchan; i++)
1298 data->ch_names.append(data->info->chInfo[i].ch_name);
1299 if (data->ch_names.size() != data->info->nchan) {
1300 qCritical(
"Channel names were not translated correctly into a name list");
1308 if (data->comp->ncomp > 0)
1309 qInfo(
"Read %d compensation data sets from %s\n",data->comp->ncomp,data->filename.toUtf8().constData());
1311 qInfo(
"No compensation data in %s\n",data->filename.toUtf8().constData());
1314 qWarning() <<
"err_print_error()";
1319 data->comp_now = data->comp_file;
1321 data->comp_now = comp_set;
1325 qCritical(
"Cannot do compensation because compensation data are missing");
1328 }
else if (data->comp->set_compensation(data->comp_now,
1331 QList<FIFFLIB::FiffChInfo>(),
1339 qInfo(
"SSS data read from %s :\n",data->filename.toUtf8().constData());
1340 QTextStream errStream(stderr);
1341 data->sss->print(errStream);
1344 qInfo(
"No SSS data in %s\n",data->filename.toUtf8().constData());
1350 dir0 = data->info->rawDir;
1351 ndir = data->info->ndir;
1358 if (!
stream->read_tag(t_pTag,dir0[current_dir0]->pos))
1360 data->first_samp = *t_pTag->toInt();
1368 if (!
stream->read_tag(t_pTag,dir0[current_dir0]->pos))
1370 nsamp_skip = data->info->buf_size*(*t_pTag->toInt());
1371 qInfo(
"Data skip of %d samples in the beginning\n",nsamp_skip);
1377 if (!
stream->read_tag(t_pTag,dir0[current_dir0]->pos))
1379 data->first_samp += *t_pTag->toInt();
1384 data->omit_samp = data->first_samp + nsamp_skip;
1385 data->omit_samp_old = nsamp_skip;
1386 data->first_samp = 0;
1389 data->first_samp = data->first_samp + nsamp_skip;
1392 else if (omit_skip) {
1393 data->omit_samp = data->first_samp;
1394 data->first_samp = 0;
1397 qInfo(
"data->first_samp = %d\n",data->first_samp);
1403 for (k = 0, nbuf = 0; k < ndir; k++)
1407 data->bufs.resize(nbuf);
1410 for (k = 0, nbuf = 0; k < 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 qCritical(
"We are not prepared to handle raw data type: %d",dir->type);
1439 if (!
stream->read_tag(t_pTag,dir->pos))
1441 data->bufs[k].ns = data->info->buf_size*(*t_pTag->toInt());
1443 data->bufs[k].firsts = k == 0 ? data->first_samp : data->bufs[k-1].lasts + 1;
1444 data->bufs[k].lasts = data->bufs[k].firsts + data->bufs[k].ns - 1;
1445 data->nsamp += data->bufs[k].ns;
1451 data->bad = Eigen::VectorXi::Zero(data->info->nchan);
1452 data->offsets = Eigen::VectorXf::Zero(data->info->nchan);
1458 for (b = 0; b < data->nbad; b++) {
1459 for (k = 0; k < data->info->nchan; k++) {
1460 if (QString::compare(data->info->chInfo[k].ch_name,data->badlist[b],Qt::CaseInsensitive) == 0) {
1466 qInfo(
"%d bad channels read from %s%s",data->nbad,name.toUtf8().constData(),data->nbad > 0 ?
":\n" :
"\n");
1467 if (data->nbad > 0) {
1469 for (k = 0; k < data->nbad; k++)
1470 qInfo(
"%s%c",data->badlist[k].toUtf8().constData(),k < data->
nbad-1 ?
' ' :
'\n');
1477 nbuf = approx_ring_buf_size/(data->info->buf_size*data->info->nchan*
sizeof(float));
1478 data->ring = std::make_unique<RingBuffer>(nbuf);
1482 data->filter = std::make_unique<MNEFilterDef>(
filter);
1483 data->setup_filter_bufs();
1486 std::vector<float> vals_storage(data->info->nchan, 0.0f);
1487 std::vector<float*> vals_rows(data->info->nchan);
1488 for (
int i = 0; i < data->info->nchan; i++)
1489 vals_rows[i] = &vals_storage[i];
1490 float **vals = vals_rows.data();
1492 if (data->pick_data(
nullptr,data->first_samp,1,vals) ==
FAIL)
1494 data->first_sample_val.resize(data->info->nchan);
1495 for (k = 0; k < data->info->nchan; k++)
1496 data->first_sample_val[k] = vals[k][0];
1497 qInfo(
"Initial dc offsets determined\n");
1499 qInfo(
"Raw data file %s:\n",name.toUtf8().constData());
1500 qInfo(
"\tnchan = %d\n",data->info->nchan);
1501 qInfo(
"\tnsamp = %d\n",data->nsamp);
1502 qInfo(
"\tsfreq = %-8.3f Hz\n",data->info->sfreq);
1503 qInfo(
"\tlength = %-8.3f sec\n",data->nsamp/data->info->sfreq);
1505 return data.release();
#define FIFF_FIRST_SAMPLE
#define FIFFV_SSS_JOB_NOTHING
#define FIFF_MNE_CH_NAME_LIST
#define FIFFB_MNE_BAD_CHANNELS
#define MNE_DEFAULT_TRIGGER_CH
Default digital trigger channel name.
MNERawData class declaration.
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)
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 and data structures (raw, epochs, evoked, covariance, forward).
QSharedPointer< FiffDirEntry > SPtr
QSharedPointer< FiffDirNode > SPtr
FIFF sparse matrix storage backed by Eigen.
Eigen::SparseMatrix< float > & eigen()
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
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
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)