30#define _USE_MATH_DEFINES
44#if defined(_WIN32) || defined(_WIN64)
45#define snprintf _snprintf
46#define vsnprintf _vsnprintf
47#define strcasecmp _stricmp
48#define strncasecmp _strnicmp
55using RowMajorMatrixXf = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
74 :
entries(static_cast<size_t>(nslots))
86 res->resize(nrow, ncol);
113 :
freq_resp(static_cast<size_t>(resp_size), 1.0f)
149 qCritical(
"##################### DEBUG Error: FFT analysis needs to be implemented");
160 qCritical(
"##################### DEBUG Error: FFT synthesis needs to be implemented");
173 qCritical(
"Incorrect data length in apply_filter");
190 if (dc_offset != 0.0) {
192 data[k] = data[k] - dc_offset;
206 n = ns % 2 == 0 ? ns/2 : (ns+1)/2;
215 data[p] = data[p]*freq_resp[0]; p++;
219 for (k = 1 ; k < n ; k++) {
220 data[p] = data[p]*freq_resp[k]; p++;
221 data[p] = data[p]*freq_resp[k]; p++;
227 data[p] = data[p]*freq_resp[k];
236 int *highpass_effective)
243 int highpasss,lowpasss;
244 int highpass_widths,lowpass_widths;
245 float lowpass,highpass,lowpass_width,highpass_width;
247 float pi4 =
M_PI/4.0;
252 auto filter_data = std::make_unique<FilterData>(resp_size);
253 *highpass_effective =
false;
255 for (f = 0; f < 2; f++) {
260 freq_resp = f == 0 ? filter_data->freq_resp.data() : filter_data->eog_freq_resp.data();
264 highpasss = ((resp_size-1)*highpass)/(0.5*sfreq);
265 lowpasss = ((resp_size-1)*lowpass)/(0.5*sfreq);
267 lowpass_widths = ((resp_size-1)*lowpass_width)/(0.5*sfreq);
268 lowpass_widths = (lowpass_widths+1)/2;
271 highpass_widths = ((resp_size-1)*highpass_width)/(0.5*sfreq);
272 highpass_widths = (highpass_widths+1)/2;
278 qInfo(
"filter : %7.3f ... %6.1f Hz bins : %d ... %d of %d hpw : %d lpw : %d\n",
287 if (highpasss > highpass_widths + 1) {
291 for (k = 0; k < highpasss-w+1; k++)
293 for (k = -w+1, s = highpasss-w+1; k < w; k++, s++) {
294 if (s >= 0 && s < resp_size) {
295 c = cos(pi4*(k*mult+add));
296 freq_resp[s] = freq_resp[s]*c*c;
299 *highpass_effective =
true;
302 *highpass_effective = *highpass_effective || (filter.
highpass == 0.0);
304 if (lowpass_widths > 0) {
308 for (k = -w+1, s = lowpasss-w+1; k < w; k++, s++) {
309 if (s >= 0 && s < resp_size) {
310 c = cos(pi4*(k*mult+add));
311 freq_resp[s] = freq_resp[s]*c*c;
314 for (k = s; k < resp_size; k++)
318 for (k = lowpasss; k < resp_size; k++)
322 if (*highpass_effective)
323 qInfo(
"Highpass filter will work as specified.\n");
325 qWarning(
"NOTE: Highpass filter omitted due to a too low corner frequency.\n");
328 qWarning(
"NOTE: Filter is presently switched off.\n");
341 const QList<FIFFLIB::FiffChInfo>& chs,
348 fiff_short_t *this_samples;
349 const fiff_float_t *this_samplef;
350 fiff_int_t *this_sample;
357 Eigen::VectorXi pickno_vec;
359 pickno_vec = Eigen::VectorXi::LinSpaced(nchan, 0, nchan - 1);
360 pickno = pickno_vec.data();
367 Eigen::VectorXf mult(npick);
368 for (c = 0; c < npick; c++)
369 mult[c] = chs[pickno[c]].cal*chs[pickno[c]].range;
373 if (!stream->read_tag(t_pTag,ent->pos))
377 if (
static_cast<int>(t_pTag->size()/(
sizeof(fiff_float_t)*nchan)) != nsamp) {
378 qCritical(
"Incorrect number of samples in buffer.");
381 qDebug() <<
"ToDo: Check whether this_samplef contains the right stuff!!! - use VectorXf instead";
382 this_samplef = t_pTag->toFloat();
383 for (s = 0; s < nsamp; s++, this_samplef += nchan) {
384 for (c = 0; c < npick; c++)
385 data(c,s) = mult[c]*this_samplef[pickno[c]];
389 if (
static_cast<int>(t_pTag->size()/(
sizeof(fiff_short_t)*nchan)) != nsamp) {
390 qCritical(
"Incorrect number of samples in buffer.");
393 qDebug() <<
"ToDo: Check whether this_samples contains the right stuff!!! - use VectorXi instead";
394 this_samples = (fiff_short_t *)t_pTag->data();
395 for (s = 0; s < nsamp; s++, this_samples += nchan) {
396 for (c = 0; c < npick; c++)
397 data(c,s) = mult[c]*this_samples[pickno[c]];
401 if (
static_cast<int>(t_pTag->size()/(
sizeof(fiff_int_t)*nchan)) != nsamp) {
402 qCritical(
"Incorrect number of samples in buffer.");
405 qDebug() <<
"ToDo: Check whether this_sample contains the right stuff!!! - use VectorXi instead";
406 this_sample = t_pTag->toInt();
407 for (s = 0; s < nsamp; s++, this_sample += nchan) {
408 for (c = 0; c < npick; c++)
409 data(c,s) = mult[c]*this_sample[pickno[c]];
413 qCritical(
"We are not prepared to handle raw data type: %d",ent->type);
425 QList<FiffDirNode::SPtr> temp;
431 if (pNode->isEmpty())
432 node = stream->dirtree();
437 if (temp.size() > 0) {
442 names = t_pTag->toString();
477 Eigen::Map<const Eigen::VectorXf> vecIn(vector, mat->
cols());
478 Eigen::Map<Eigen::VectorXf> vecOut(res, mat->
rows());
479 vecOut = mat->
eigen() * vecIn;
494 res = mat->
eigen() * mult;
498#define APPROX_RING_BUF_SIZE (600*1024*1024)
578 int highpass_effective;
583 if (!this->filter ||
filter->size <= 0)
587 firstsamp < this->
nsamp + this->first_samp;
588 firstsamp = firstsamp +
filter->size)
591 qInfo(
"%d filter buffers needed\n",nfilt_buf);
594 for (k = 0, firstsamp = this->
first_samp-
filter->taper_size; k < nfilt_buf; k++,
595 firstsamp = firstsamp +
filter->size) {
603 filt_bufs[k].ch_filtered = Eigen::VectorXi::Zero(this->
info->nchan);
606 nring_buf = approx_ring_buf_size/((2*
filter->taper_size+
filter->size)*
607 static_cast<std::size_t
>(this->
info->nchan)*
sizeof(float));
608 this->
filt_ring = std::make_unique<RingBuffer>(nring_buf);
622 qCritical(
"Cannot load a skip");
625 if (buf->
vals.size() == 0) {
633 qDebug(
"Read buffer %d .. %d\n",buf->
firsts,buf->
lasts);
665 if (buf->
vals.size() == 0)
671 Eigen::MatrixXf dataMat = buf->
vals;
674 std::swap(
comp->current,
comp->undo);
678 if (
comp->apply_transpose(
false, dataMat) !=
OK) {
679 std::swap(
comp->current,
comp->undo);
682 std::swap(
comp->current,
comp->undo);
688 if (
comp->apply_transpose(
true, dataMat) !=
OK)
707 int k,s,p,start,c,fills;
718 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
720 for (c = 0; c < sel->
nchan; c++)
723 for (c = 0; c <
info->nchan; c++)
735 for (c = 0, need_some =
false; c < sel->
nchan; c++) {
747 for (k = 0, this_buf =
bufs.data(), s = 0; k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
748 if (this_buf->
lasts >= firsts) {
749 start = firsts - this_buf->
firsts;
753 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
755 for (c = 0; c < sel->
nchan; c++)
756 if (sel->
pick[c] >= 0)
760 for (c = 0; c <
info->nchan; c++)
782 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
785 deriv_ns = this_buf->
ns;
791 for (c = 0; c < sel->
nchan; c++) {
795 if (sel->
pick[c] >= 0) {
796 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
797 picked[c][s2] = this_buf->
vals(sel->
pick[c], p);
803 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
804 picked[c][s2] = deriv_vals(sel->
pick_deriv[c], p);
809 for (c = 0; c <
info->nchan; c++)
810 for (p = start, s2 = s, ns2 = ns; p < this_buf->
ns && ns2 > 0; p++, ns2--, s2++)
811 picked[c][s2] = this_buf->
vals(c, p);
825 for (; ns > 0; ns--, s++) {
827 for (c = 0; c < sel->
nchan; c++)
828 picked[c][s] = picked[c][fills];
830 for (c = 0; c <
info->nchan; c++)
831 picked[c][s] = picked[c][fills];
835 for (; ns > 0; ns--, s++) {
837 for (c = 0; c < sel->
nchan; c++)
840 for (c = 0; c <
info->nchan; c++)
854 int k,s,p,start,c,fills;
857 Eigen::VectorXf deriv_pvalues_vec;
863 for (s = 0, p = firsts; p <
first_samp; s++, p++) {
865 for (c = 0; c < sel->
nchan; c++)
868 for (c = 0; c <
info->nchan; c++)
876 Eigen::VectorXf pvalues(
info->nchan);
877 for (k = 0, this_buf =
bufs.data(); k <
static_cast<int>(
bufs.size()); k++, this_buf++) {
878 if (this_buf->
lasts >= firsts) {
879 start = firsts - this_buf->
firsts;
883 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
885 for (c = 0; c < sel->
nchan; c++)
886 if (sel->
pick[c] >= 0)
890 for (c = 0; c <
info->nchan; c++)
909 values = &this_buf->
vals;
913 for (p = start; p < this_buf->
ns && ns > 0; p++, ns--, s++) {
914 for (c = 0; c <
info->nchan; c++)
915 pvalues[c] = (*values)(c,p);
916 if (
proj->project_vector(pvalues,
true) !=
OK)
923 for (c = 0; c < sel->
nchan; c++) {
927 if (sel->
pick[c] >= 0)
928 picked[c][s] = pvalues[sel->
pick[c]];
933 picked[c][s] = deriv_pvalues_vec[sel->
pick_deriv[c]];
937 for (c = 0; c <
info->nchan; c++) {
938 picked[c][s] = pvalues[c];
953 for (; ns > 0; ns--, s++) {
955 for (c = 0; c < sel->
nchan; c++)
956 picked[c][s] = picked[c][fills];
958 for (c = 0; c <
info->nchan; c++)
959 picked[c][s] = picked[c][fills];
963 for (; ns > 0; ns--, s++) {
965 for (c = 0; c < sel->
nchan; c++)
968 for (c = 0; c <
info->nchan; c++)
985 if (buf->
vals.size() == 0) {
992 std::vector<float*> vals_storage(buf->
nchan);
993 float **vals = vals_storage.data();
994 for (k = 0; k < buf->
nchan; k++) {
996 vals[k] = buf->
vals.row(k).data() +
filter->taper_size;
1003 qDebug(
"Loaded filtered buffer %d...%d %d %d last = %d\n",
1018 int bs1,bs2,s1,s2,lasts;
1032 for (s = 0; s < ns; s++)
1033 for (c = 0; c < sel->
nchan; c++)
1037 for (s = 0; s < ns; s++)
1038 for (c = 0; c <
info->nchan; c++)
1041 lasts = firsts + ns - 1;
1051 if (
comp->apply(
true,dc) !=
OK)
1054 if (
proj->project_vector(dc,
true) !=
OK)
1057 filter_was =
filter->filter_on;
1061 for (k = 0, this_buf =
filt_bufs.data(); k <
static_cast<int>(
filt_bufs.size()); k++, this_buf++) {
1062 if (this_buf->
lasts >= firsts)
1065 for (; k < static_cast<int>(
filt_bufs.size()) && this_buf->
firsts <= lasts; k++, this_buf++) {
1067 qDebug(
"this_buf (%d): %d..%d\n",k,this_buf->
firsts,this_buf->
lasts);
1078 for (c = 0; c < sel->
nchan; c++) {
1079 if (sel->
pick[c] >= 0) {
1086 filter->filter_on =
false;
1087 else if (dc.size() > 0)
1088 dc_offset = dc[sel->
pick[c]];
1090 dc_offset,
info->chInfo[sel->
pick[c]].kind) !=
OK) {
1091 filter->filter_on = filter_was;
1095 filter->filter_on = filter_was;
1104 for (c = 0; c < der->
deriv_data->ncol; c++) {
1105 if (der->
in_use[c] > 0 &&
1112 filter->filter_on =
false;
1113 else if (dc.size() > 0)
1116 dc_offset,
info->chInfo[c].kind) !=
OK) {
1117 filter->filter_on = filter_was;
1121 filter->filter_on = filter_was;
1130 for (c = 0; c <
info->nchan; c++) {
1137 filter->filter_on =
false;
1138 else if (dc.size() > 0)
1141 dc_offset,
info->chInfo[c].kind) !=
OK) {
1142 filter->filter_on = filter_was;
1146 filter->filter_on = filter_was;
1153 if (firsts >= this_buf->
firsts) {
1154 bs1 = firsts - this_buf->
firsts;
1159 s1 = this_buf->
firsts - firsts;
1161 if (lasts >= this_buf->
lasts) {
1163 s2 = this_buf->
lasts - lasts + ns;
1166 bs2 = lasts - this_buf->
lasts + this_buf->
ns;
1170 qDebug(
"buf : %d..%d %d\n",bs1,bs2,bs2-bs1);
1171 qDebug(
"dest : %d..%d %d\n",s1,s2,s2-s1);
1181 if (deriv_ns < this_buf->ns || nderiv !=
deriv_matched->deriv_data->nrow) {
1184 deriv_ns = this_buf->
ns;
1189 for (c = 0; c < sel->
nchan; c++) {
1193 if (sel->
pick[c] >= 0) {
1194 values = this_buf->
vals.row(sel->
pick[c]).data();
1195 for (s = s1, bs = bs1; s < s2; s++, bs++)
1196 picked[c][s] += values[bs];
1199 for (s = s1, bs = bs1; s < s2; s++, bs++)
1200 picked[c][s] += deriv_vals(sel->
pick_deriv[c], bs);
1205 for (c = 0; c <
info->nchan; c++) {
1206 values = this_buf->
vals.row(c).data();
1207 for (s = s1, bs = bs1; s < s2; s++, bs++)
1208 picked[c][s] += values[bs];
1220 int allow_maxshield,
1227 std::unique_ptr<MNERawInfo>
info;
1228 std::unique_ptr<MNERawData> data;
1230 auto filePtr = std::make_unique<QFile>(name);
1235 QList<FiffDirEntry::SPtr> dir0;
1239 int k, b, nbuf, ndir;
1240 int current_dir0 = 0;
1247 for (k = 0; k <
info->nchan; k++) {
1248 ch =
info->chInfo.at(k);
1250 if (std::fabs(1.0 - ch.
range) > 1e-5) {
1260 qInfo(
"Ch %s unit multiplier %d -> 0\n",ch.
ch_name.toLatin1().data(),ch.
unit_mul);
1269 data = std::make_unique<MNERawData>();
1270 data->filename = name;
1271 data->file = std::move(filePtr);
1273 data->info = std::move(
info);
1277 data->ch_names.clear();
1278 for (
int i = 0; i < data->info->nchan; i++)
1279 data->ch_names.append(data->info->chInfo[i].ch_name);
1280 if (data->ch_names.size() != data->info->nchan) {
1281 qCritical(
"Channel names were not translated correctly into a name list");
1289 if (data->comp->ncomp > 0)
1290 qInfo(
"Read %d compensation data sets from %s\n",data->comp->ncomp,data->filename.toUtf8().constData());
1292 qInfo(
"No compensation data in %s\n",data->filename.toUtf8().constData());
1295 qWarning() <<
"err_print_error()";
1300 data->comp_now = data->comp_file;
1302 data->comp_now = comp_set;
1306 qCritical(
"Cannot do compensation because compensation data are missing");
1309 }
else if (data->comp->set_compensation(data->comp_now,
1312 QList<FIFFLIB::FiffChInfo>(),
1320 qInfo(
"SSS data read from %s :\n",data->filename.toUtf8().constData());
1321 QTextStream errStream(stderr);
1322 data->sss->print(errStream);
1325 qInfo(
"No SSS data in %s\n",data->filename.toUtf8().constData());
1331 dir0 = data->info->rawDir;
1332 ndir = data->info->ndir;
1339 if (!
stream->read_tag(t_pTag,dir0[current_dir0]->pos))
1341 data->first_samp = *t_pTag->toInt();
1349 if (!
stream->read_tag(t_pTag,dir0[current_dir0]->pos))
1351 nsamp_skip = data->info->buf_size*(*t_pTag->toInt());
1352 qInfo(
"Data skip of %d samples in the beginning\n",nsamp_skip);
1358 if (!
stream->read_tag(t_pTag,dir0[current_dir0]->pos))
1360 data->first_samp += *t_pTag->toInt();
1365 data->omit_samp = data->first_samp + nsamp_skip;
1366 data->omit_samp_old = nsamp_skip;
1367 data->first_samp = 0;
1370 data->first_samp = data->first_samp + nsamp_skip;
1373 else if (omit_skip) {
1374 data->omit_samp = data->first_samp;
1375 data->first_samp = 0;
1378 qInfo(
"data->first_samp = %d\n",data->first_samp);
1384 for (k = 0, nbuf = 0; k < ndir; k++)
1388 data->bufs.resize(nbuf);
1391 for (k = 0, nbuf = 0; k < 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;
1407 data->bufs[k].ns = dir->size/(data->info->nchan*
sizeof(fiff_dau_pack16_t));
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 qCritical(
"We are not prepared to handle raw data type: %d",dir->type);
1420 if (!
stream->read_tag(t_pTag,dir->pos))
1422 data->bufs[k].ns = data->info->buf_size*(*t_pTag->toInt());
1424 data->bufs[k].firsts = k == 0 ? data->first_samp : data->bufs[k-1].lasts + 1;
1425 data->bufs[k].lasts = data->bufs[k].firsts + data->bufs[k].ns - 1;
1426 data->nsamp += data->bufs[k].ns;
1432 data->bad = Eigen::VectorXi::Zero(data->info->nchan);
1433 data->offsets = Eigen::VectorXf::Zero(data->info->nchan);
1439 for (b = 0; b < data->nbad; b++) {
1440 for (k = 0; k < data->info->nchan; k++) {
1441 if (QString::compare(data->info->chInfo[k].ch_name,data->badlist[b],Qt::CaseInsensitive) == 0) {
1447 qInfo(
"%d bad channels read from %s%s",data->nbad,name.toUtf8().constData(),data->nbad > 0 ?
":\n" :
"\n");
1448 if (data->nbad > 0) {
1450 for (k = 0; k < data->nbad; k++)
1451 qInfo(
"%s%c",data->badlist[k].toUtf8().constData(),k < data->
nbad-1 ?
' ' :
'\n');
1458 nbuf = approx_ring_buf_size/(data->info->buf_size*
static_cast<std::size_t
>(data->info->nchan)*
sizeof(float));
1459 data->ring = std::make_unique<RingBuffer>(nbuf);
1463 data->filter = std::make_unique<MNEFilterDef>(
filter);
1464 data->setup_filter_bufs();
1467 std::vector<float> vals_storage(data->info->nchan, 0.0f);
1468 std::vector<float*> vals_rows(data->info->nchan);
1469 for (
int i = 0; i < data->info->nchan; i++)
1470 vals_rows[i] = &vals_storage[i];
1471 float **vals = vals_rows.data();
1473 if (data->pick_data(
nullptr,data->first_samp,1,vals) ==
FAIL)
1475 data->first_sample_val.resize(data->info->nchan);
1476 for (k = 0; k < data->info->nchan; k++)
1477 data->first_sample_val[k] = vals[k][0];
1478 qInfo(
"Initial dc offsets determined\n");
1480 qInfo(
"Raw data file %s:\n",name.toUtf8().constData());
1481 qInfo(
"\tnchan = %d\n",data->info->nchan);
1482 qInfo(
"\tnsamp = %d\n",data->nsamp);
1483 qInfo(
"\tsfreq = %-8.3f Hz\n",data->info->sfreq);
1484 qInfo(
"\tlength = %-8.3f sec\n",data->nsamp/data->info->sfreq);
1486 return data.release();
#define MNE_DEFAULT_TRIGGER_CH
Default digital trigger channel name.
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)
Legacy MNE-C raw-recording container with per-file buffer descriptors.
#define FIFF_MNE_CH_NAME_LIST
#define FIFFB_MNE_BAD_CHANNELS
#define FIFF_FIRST_SAMPLE
#define FIFFV_SSS_JOB_NOTHING
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
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)