50void EpochExtractor::applyBaseline(MatrixXd& matEpoch,
int iBase0,
int iBase1)
52 if (iBase0 > iBase1 || iBase0 < 0 || iBase1 >= matEpoch.cols())
54 const int nBaseSamp = iBase1 - iBase0 + 1;
56 VectorXd baseline = matEpoch.block(0, iBase0, matEpoch.rows(), nBaseSamp).rowwise().mean();
57 matEpoch.colwise() -= baseline;
65 const QVector<int>& eventSamples,
68 const QVector<int>& eventCodes)
70 QVector<MNEEpochData> epochs;
72 if (matData.size() == 0 || eventSamples.isEmpty())
75 qWarning() <<
"EpochExtractor::extract: invalid sampling frequency.";
79 const int nSamp =
static_cast<int>(matData.cols());
80 const int nCh =
static_cast<int>(matData.rows());
83 const int iOffset0 =
static_cast<int>(std::round(params.
dTmin * dSFreq));
84 const int iOffset1 =
static_cast<int>(std::round(params.
dTmax * dSFreq));
85 const int epochLen = iOffset1 - iOffset0 + 1;
88 qWarning() <<
"EpochExtractor::extract: tmax must be > tmin.";
93 const int iBase0 =
static_cast<int>(std::round((params.
dBaseMin - params.
dTmin) * dSFreq));
94 const int iBase1 =
static_cast<int>(std::round((params.
dBaseMax - params.
dTmin) * dSFreq));
96 const bool bHaveCodes = (eventCodes.size() == eventSamples.size());
98 for (
int ev = 0; ev < eventSamples.size(); ++ev) {
99 const int evSamp = eventSamples[ev];
100 const int s0 = evSamp + iOffset0;
101 const int s1 = evSamp + iOffset1;
104 if (s0 < 0 || s1 >= nSamp)
108 epoch.
epoch = matData.block(0, s0, nCh, epochLen);
109 epoch.
tmin =
static_cast<float>(params.
dTmin);
110 epoch.
tmax =
static_cast<float>(params.
dTmax);
111 epoch.
event = bHaveCodes ? eventCodes[ev] : 1;
116 applyBaseline(epoch.
epoch, iBase0, iBase1);
121 for (
int ch = 0; ch < nCh; ++ch) {
122 const RowVectorXd row = epoch.
epoch.row(ch);
123 double ptp = row.maxCoeff() - row.minCoeff();
131 epochs.append(epoch);
147 if (result.size() == 0) {
150 if (ep.epoch.rows() != result.rows() || ep.epoch.cols() != result.cols()) {
151 qWarning() <<
"EpochExtractor::average: epoch dimension mismatch, skipping.";
160 result /=
static_cast<double>(nGood);
168 QVector<MNEEpochData> good;
169 good.reserve(epochs.size());
Declaration of EpochExtractor — segments continuous MEG/EEG data into trials.
Core MNE data structures (source spaces, source estimates, hemispheres).
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
static QVector< MNELIB::MNEEpochData > rejectMarked(const QVector< MNELIB::MNEEpochData > &epochs)
static QVector< MNELIB::MNEEpochData > extract(const Eigen::MatrixXd &matData, const QVector< int > &eventSamples, double dSFreq, const Params ¶ms=Params(), const QVector< int > &eventCodes=QVector< int >())
EpochExtractorParams Params
static Eigen::MatrixXd average(const QVector< MNELIB::MNEEpochData > &epochs)
Single epoch (trial slice) of sensor data with timing and rejection metadata.
FIFFLIB::fiff_int_t event