Analysis Suite
Every step in the BCILattice Analysis workspace: what it does, what it accepts, what it writes, and every method and setting available inside it.
About the Analysis Suite
Analysis is the module between Preprocessing and ML Suite. Preprocessing conditions the raw recording; the Analysis Suite turns that conditioned signal into the thing a decoder is actually trained on, one reviewable step at a time. Eleven steps run in it, grouped into two sections in the module sidebar: Prepare, which cleans the recording and cuts it into trials, and Reduce & Extract, which narrows those trials down to a labelled design matrix.
Nothing here is a black box and nothing here is destructive. Each step reads a named stage, writes a named stage, and records the parameters it ran with. Your original recording is never modified, and every intermediate result stays inspectable, exportable, and re-runnable.
| # | Step | Section | What it is for |
|---|---|---|---|
| 1 | ICA Review | Prepare | Decompose the recording into independent components, label the artifactual ones, reconstruct without them. |
| 2 | Channel Quality | Prepare | Score every channel, flag dead or noisy sensors, drop the ones you confirm. |
| 3 | Epoching | Prepare | Cut the continuous recording into labelled trials around events, with baseline correction and rejection. |
| 4 | Normalization | Prepare | Rescale the signal with a scaler fitted once over the whole recording. |
| 5 | Augmentation | Prepare | Synthesise additional trials, with a report on what the synthesis did to the data. |
| 6 | Activation Maps | Prepare | 2D topographies and a 3D cortical surface rendered from epoched data. View-only. |
| 7 | Time-Frequency | Prepare | ERSP / ITC decomposition with seven derived views over one cached computation. |
| 8 | Channels Selection | Reduce & Extract | Rank and keep the channels that carry class information, by any of 20 criteria. |
| 9 | Dimensionality Reducer | Reduce & Extract | Project the channel space onto fewer components, with variance and separability reporting. |
| 10 | Feature Extraction | Reduce & Extract | Turn trials into a named, ranked design matrix across five feature domains. |
| 11 | Data Projection | Reduce & Extract | Encode a 1-D time course as a 2-D image for vision models. |
View and Apply
Every step opens as two tabs. View is the interactive workspace: pick one file, set the parameters, run it, and read the result. Apply is the batch tab: take exactly the settings currently in View and run them across many files at once. The two produce identical outputs, because Apply calls the same code path with the same payload, not a parallel implementation.
The working habit the suite is built around is preview on one file, then batch the rest. Ten of the eleven steps have a working Apply tab; Activation Maps is view-only because it renders figures rather than writing a stage.
Step Order & Reordering
The sidebar order shown above is the conventional BCI preparation order, but it is a default, not a constraint. The seven Prepare steps can be dragged into a different order and the app remembers it across restarts, which matters because there is no single correct sequence: some labs screen channels before ICA, others after; some normalise before epoching, others after.
Reordering is presentational only. Nothing about a step's identity, output name, or dependency rules moves with it, so a reordered sidebar cannot cause one step's result to be written under another step's name. Draggable steps show an open-hand cursor on hover; fixed steps do not.
Stages & Dependencies
A processed result in BCILattice is a stage, not a loose file. Every stage for one subject and one experiment lives inside that subject's .bltdcontainer, alongside the raw recording and the parameters, timestamp, and input hash of the run that produced it. You will see filename-shaped handles likesub01_filtered_epochs_exp2.csv in pickers and logs. Those are readablekeys, not paths, nothing is written at that location.
An experiment holds exactly one live output per stage. Re-running a step overwrites its stage, which is what branching an experiment is for, so there is no _v2 ladder to keep track of. Stage resolution is experiment-aware: a step loads the active experiment's stage, or the parent it inherits from, never a sibling experiment's.
What Each Step Writes
| Step | Stage written | Handle suffix |
|---|---|---|
| ICA Review | ica_cleaned | _ica_cleaned |
| Channel Quality | channel_quality | _channel_quality |
| Epoching | epochs | _filtered_epochs |
| Normalization | normalized | _normalized |
| Augmentation | augmented | _filtered_augmented |
| Activation Maps | none, view-only | — |
| Time-Frequency | time_frequency | _tf |
| Channels Selection | channel_selected | _channel_selected |
| Dimensionality Reducer | dim_reduced | _dim_reduced |
| Feature Extraction | features | _features |
| Data Projection | projection | _projection |
The method you chose is recorded in the stage's parameters, never in its name. One Channel Selection stage exists per experiment whether you ran Fisher Score or CSP, so trying a second method does not litter the container with a file per attempt.
Which Input Each Step Accepts
Each step's Source dropdown lists only the stages that operation is allowed to consume. These rules are enforced centrally rather than being a per-page convention, so the dropdown and the engine can never disagree about what is legal.
| Step | Accepts as input |
|---|---|
| ICA Review | Filtered, Channel Quality |
| Channel Quality | Filtered, ICA Cleaned |
| Epoching | Filtered, ICA Cleaned, Channel Quality, Normalized |
| Normalization | Filtered, ICA Cleaned, Channel Quality, Epochs, Augmented |
| Augmentation | Epochs, Normalized |
| Activation Maps | Epochs, Normalized, Augmented |
| Time-Frequency | Epochs, Augmented, Normalized |
| Channels Selection | Filtered, ICA Cleaned, Channel Quality, Normalized, Epochs, Augmented |
| Dimensionality Reducer | the above, plus Channel Selected |
| Feature Extraction | the above, plus Dim Reduced |
| Data Projection | Filtered, ICA Cleaned, Channel Quality, Normalized, Augmented, Channel Selected, Dim Reduced |
The absences in that table are deliberate, and each has a reason:
- Augmentation, Time-Frequency and Activation Maps refuse continuous stages. There are no trials in a continuous recording to augment, to average an ERSP over, or to draw a per-condition topography from.
- Channel Quality refuses normalized input. Bad-channel detection is amplitude and variance based, and normalisation removes exactly the scale those metrics read. Offering it would produce a confident, meaningless verdict.
- Data Projection refuses a feature table. GAF, MTF and recurrence plots all assume temporal ordering; a feature table's columns are unordered summary statistics.
Controls Every Step Shares
| Control | What it does |
|---|---|
| Modality / Session / File | Picks the recording, from the same records Data Manager holds. Analysis never reads raw, unprocessed data. |
| Source | Which upstream stage to consume, limited to the legal inputs listed above. |
| Chromophore | fNIRS only: All, HbO, or HbR. An fNIRS file holds two channels per source-detector pair, and they are different physiological signals. Hidden for EEG, EMG and EOG. |
| Run button | Loads the selected file and runs the step. There is no separate load step, the file selected when you press Run is the file that gets analysed. |
| Methods | Drafts a publication Methods paragraph from what this recording has actually had done to it. See Provenance. |
| Last run card | States the parameters of the run that produced the stage currently on disk, read from the container rather than from the controls on screen. |
| Export | Every figure exports as an image; result tables export as CSV. |
The distinction between the last-run card and the on-screen controls matters. A control can be nudged after a run without re-running, at which point it no longer describes the output in the container. The card always describes what actually executed.
Part 1, Prepare
Seven steps that take a filtered recording and produce clean, labelled trials. This section is user-reorderable; the order below is the default.
1. ICA Review
Independent Component Analysis separates the recording into statistically independent sources. Blinks, muscle tension, and heartbeat tend to concentrate into their own components, so zeroing those and reconstructing gives you the neural signal without them. The point of this page is that the decision stays yours: nothing is rejected until you label it and apply.
| Setting | Options |
|---|---|
| Source | Clean Data (filtered), or Channel Quality Checked |
| Method | FastICA (scikit-learn), or Picard (MNE) |
| Components | 2 to 64, default 20 (capped at the channel count) |
| Sample rate | 1 to 20000 Hz, read from the file where recorded |
Results arrive as a card per component, showing a waveform snippet, its power spectrum, and its spatial weights. Each card carries a label dropdown: Keep,Eye, Muscle, Cardiac, orOther. Running counts per category sit above the grid.
Suggest Labels
A heuristic classifier proposes a label for every component from its spectral shape, beat regularity, kurtosis and topographic focality. It is a proposal you review, not an action, and each suggestion carries the reason it was made. Applying rejection is always a separate, explicit click.
Diagnostics tab
The numbers behind the cards, one row per component:
| Column | Meaning |
|---|---|
| Var % | Share of total sensor-space variance the component carries. |
| Kurtosis | Excess kurtosis of the activation. Large positive values mean sharp transients, blinks, pops, QRS complexes. |
| Skew | Asymmetry of the activation. Blink components deflect one way. |
| Peak Hz | Frequency of maximum power spectral density, DC excluded. |
| 1/f slope | Log-log PSD slope over 2–45 Hz. Cortical background is around −1; flat or positive indicates broadband muscle. |
| Delta % / Alpha % | Share of 0.5–65 Hz power below 4 Hz, and in 8–13 Hz. |
| EMG % | Share of power in 20–45 Hz, where surface EMG dominates. |
| Mains % | Share of power in 45–65 Hz, line-noise pickup. |
| Beat reg. / BPM | Largest normalised autocorrelation peak at a 40–150 bpm lag, and the implied rate. Near 1 is the cardiac signature. |
| Focality | Peak topography weight divided by its RMS. 1 is diffuse across all sensors; large values mean the component loads on a few. |
| Peak ch. | Sensor carrying the largest absolute topography weight. |
Apply Rejection zeroes the labelled components, reconstructs the signal, and writes the ica_cleaned stage. The rejected component indices are recorded with it.
2. Channel Quality
Scores every channel against the rest of the montage and flags the ones that look dead, railing, or noise-dominated. Screening channels before ICA is standard practice, a dead or railing channel otherwise consumes a whole component on its own.
| Method | What it measures |
|---|---|
| Variance + Noise (default) | Variance against the montage median, combined with a high-frequency noise ratio (RMS of the first difference relative to the channel's own RMS). Line noise and electrode pops inflate sample-to-sample jumps disproportionately. |
| Kurtosis + Variance | Peaked, non-Gaussian channels are usually artifact-dominated. Same scoring ICA auto-rejection uses. |
| Correlation (inter-channel) | A channel poorly correlated with every other channel is often noisy or disconnected. Needs at least 2 channels. |
| Peak-to-Peak Amplitude | Peak-to-peak over the whole recording, per channel. |
Every method produces one composite robust z-score per channel (median + MAD scoring, so a few extreme channels cannot drag the threshold with them). A channel is flaggedBad when its score reaches the sensitivity threshold k (1.0–10.0, default 3.5), Warn above 60% of k, and Good below that. A flat-line channel is force-flagged Bad under every method regardless of what its chosen metric says.
Three result tabs: Overview (per-channel score bars), Channels(the scored table, with a Keep/Drop checkbox per channel that defaults to the automatic flag and is yours to override), and Waveforms (what the flagged channels actually look like). Apply Channel Drop removes the unchecked channels and writes thechannel_quality stage.
3. Epoching
Turns a continuous recording into a trial tensor: one labelled epoch per event. Everything downstream that talks about trials, ERSP, CSP, per-trial features, depends on this step.
Event detection
Three event sources:
- Label column, an event/label/class column already in the file.
- MNE stim channel, a hardware trigger channel.
- NeuralFlow, the compiled paradigm you designed in the Neural Flow module.
Sync pulls events from the selected source so you can sanity-check the count and onset times before extracting. Extraction runs detection automatically if you skip it.
Window, baseline and rejection
| Setting | Range / options |
|---|---|
| Epoch window | tmin −10 to 0 s, tmax 0 to 30 s, relative to the event |
| Baseline correction | None, Mean subtraction, Percent change, z-score |
| Baseline window | −10 to 10 s, within the epoch |
| Rejection mode | Automatic (robust), or Peak-to-peak threshold. Off by default. |
| Sensitivity k | 1.0 to 10.0, default 3.5. Rejects epochs whose peak-to-peak exceeds median + k × MAD across trials. |
| Peak-to-peak threshold | Fixed limit in the signal's native units, auto-suggested from your data when a file loads. |
Automatic rejection adapts to the recording; the fixed threshold is for when you have a lab convention to hold to. Both drop trials contaminated by motion or artifact so a handful of bad epochs cannot skew the average.
Result tabs
- Preview, the epoched signal per channel, with export.
- Rejection, which trials were dropped and why.
- Statistics, trial counts and per-class balance.
- Artifacts, what the rejection criterion actually caught.
- Quality, an overall read on the epoch set.
Compare Runs puts two epoching attempts side by side, which is the fastest way to see what a window or rejection change actually cost you in trials.
4. Normalization
Rescales the signal. Eight scalers, each mirroring its scikit-learn counterpart:
| Method | Equivalent | Notes |
|---|---|---|
| Z-score (Standard) | StandardScaler | Zero mean, unit variance. The default. |
| Min-Max [0, 1] | MinMaxScaler | Bounded range; sensitive to outliers. |
| Max-Abs [−1, 1] | MaxAbsScaler | Preserves sign and sparsity. |
| Robust (median / IQR) | RobustScaler | Outlier-resistant. |
| Power Transform (Yeo-Johnson) | PowerTransformer | Distributional reshaping toward Gaussian. |
| Quantile (Uniform) | QuantileTransformer | Ranks mapped to a uniform distribution. |
| Quantile (Normal) | QuantileTransformer | Ranks mapped to a normal distribution. |
| Unit Norm (L2, per-sample) | Normalizer | Each sample scaled to unit length. |
Scope is either Per-channel (each channel gets its own statistics) orWhole recording (one set of statistics for everything).
Three result tabs: Preview (before and after), Scale Factors(the offsets and scales actually applied, per channel), and Distribution (what the transform did to the amplitude distribution). Writes the normalized stage.
5. Augmentation
Synthesises additional trials from the ones you have. Sources are Epochs orNormalized (normalisation preserves its input's shape, so normalised epochs are still epochs). Nine augmentations, chainable into a pipeline, with a fixed random seed for reproducibility:
| Augmentation | What it does | Key parameters |
|---|---|---|
| GaussianNoise | Adds white noise scaled to reach a target SNR. | snr_db, −20 to 60 dB |
| TimeShift | Random circular shift along the time axis. | max_shift_ms, sfreq |
| FrequencyShift | Translates the spectrum by a random Hz offset via the analytic signal. | max_shift_hz, sfreq |
| ChannelDropout | Zeroes random channels, so a decoder cannot depend on one electrode. | p_drop, 0 to 1 |
| TimeReverse | Flips the time axis. | — |
| AmplitudeScale | Random per-epoch gain, modelling session-to-session impedance differences. | scale_min, scale_max |
| SlidingWindow | Produces overlapping windows from each epoch. | window_size, stride |
| MixUp | Convex combination of two epochs of the same class. | alpha, n_synthetic per class |
| SMOTE | Interpolates between same-class nearest neighbours to rebalance under-represented classes. | k_neighbors, target_ratio |
Every parameter carries its real range and unit rather than a generic numeric field, so an SNR cannot be set to a value that means nothing and a probability cannot go negative.
6. Activation Maps
Where the activity is, drawn from epoched data. This step renders figures and writes no stage, so it has no Apply tab.
Activation Maps tab (2D)
| Control | Meaning |
|---|---|
| Activity Filter | All Activities, or one class. |
| Data Type | The modality, or HbO / HbR for fNIRS. |
| Topomaps | How many topographies to lay out across the window. |
| Time Window | Start and End in seconds. |
| Overlay | The time point superimposed on the sensor map. |
The sensor map above the generated topographies shows electrode or optode positions with mean activation, so you can confirm the montage is right before reading anything into the maps.
3D Brain tab
Projects the same data onto a cortical surface. Requires the Researcher plan or above.
- BCI Metric: Mean (abs), Std Dev, RMS, Peak-to-Peak, Max (abs), SNR (dB), or band power for Alpha (8–12 Hz), Beta (13–30 Hz), Theta (4–7 Hz), Delta (0.5–3.5 Hz), Gamma (30–80 Hz).
- Hemisphere: Left, Right, Both.
- View: Lateral, Medial, Dorsal, Ventral, Frontal, Posterior.
- Colormap: plasma, viridis, inferno, magma, RdBu_r, YlOrRd, cool, hot, jet.
- Show Names toggles channel labels; Screenshot saves the viewport.
The 3D view renders only when you press Apply / Refresh. Every control on the sidebar is read at that moment, so working down the sidebar does not trigger a surface projection per change.
7. Time-Frequency
Event-related spectral perturbation (ERSP) and inter-trial coherence (ITC): how power and phase consistency change over time, per frequency, relative to baseline. This is the step that tells you whether your paradigm produces the effect you designed it to produce.
| Setting | Range / options |
|---|---|
| Method | Morlet Wavelet, STFT, Multitaper |
| Sampling frequency | 1 to 10000 Hz, default read from the stage |
| Frequency range | Freq min 0.5–200 Hz (default 1), Freq max 1–500 Hz (default 40) |
| Steps | 5 to 200 frequency bins, default 40 |
| Baseline | On by default |
The decomposition is computed once and cached. Channel, class, band preset, response window, and significance masking are view controls: changing them redraws from the cache without recomputing, and only the visible tab draws.
The seven views
| Tab | Answers |
|---|---|
| Overview | ERSP and ITC for one channel on a shared time axis, with frequency marginals and per-band time courses underneath. |
| Band Dynamics | ERD/ERS per band, one line per class. The plot that tells you whether the paradigm works. |
| Spectra | Average power change across the response window, per class, bands shaded. Where an SSVEP peak or mu suppression shows up. |
| Class Contrast | The difference map between two classes you choose: the time-frequency regions a decoder can actually separate. |
| Channel Grid | Every channel's ERSP on one shared colour scale, the spatial layout of the effect. |
| Topography | Scalp maps of band-power change across the response window, over a montage you select. |
| Summary | Peak ERD/ERS (dB), peak time, peak frequency, mean dB, mean and peak ITC, per class and band. The numbers you quote in a paper. Exports as CSV. |
Mask non-significant outlines the time-frequency bins belonging to a significant cluster (one-sample cluster-permutation test against 0 dB, p < 0.05), computed on demand on a background thread.
Band presets are shared with Feature Extraction, so "alpha" means the same range on both pages. Available montages for the topography view include standard_1020, standard_1005, biosemi16/32/64, easycap-M1, GSN-HydroCel-32 and -64, mgh60, and the fNIRS artinis-octamon and artinis-brite23 layouts. If your channel names do not match the montage, the map falls back to a labelled ring, which is a signal that the montage is wrong, not a scalp map.
The saved time_frequency stage holds the per-trial ERSP tensor as its primary data, with grand and per-class averages beside it, so the result is trainable rather than being only a picture.
Part 2, Reduce & Extract
Four steps that narrow a clean, trial-structured recording down to something a model can train on. The heavy computation for these runs in the local service on your machine; the pages resolve and read the source file themselves before sending anything, so the step you selected is the step that gets analysed.
8. Channels Selection
Ranks every channel by how much class information it carries and keeps the top fraction. Set the Top Percent (1–100, default 50) and, optionally, classes to ignore (for example rest, entered as 0 or 0,1,2). Twenty criteria are available:
| Family | Methods |
|---|---|
| Statistical tests | t-Value Method, z-Score Method, ANOVA F-value, Wilcoxon Signed-Rank Test, Permutation Test-based Selection |
| Information / correlation | Mutual Information Feature Selection, Pearson's Correlation Coefficient (PCC), Cross-Correlation Based Discriminant Criterion (XCDC), R_Squared_method |
| Discriminant scores | Fisher Score, Contrast-to-Noise Ratio (CNR), Peak Amplitude Selection, PSD-based Selection |
| Spatial filters | Common Spatial Pattern (CSP), Sparse CSP, Regularized CSP |
| Model-based | Stepwise Regression, Stepwise LDA, Sequential Based Algorithm, LASSO |
Reading the scores
A raw score is not interpretable on its own, the methods return t-values, mutual information, F-statistics and correlation coefficients, all on different scales. Every score is therefore shown next to scale-free rank statistics:
| Column | Meaning |
|---|---|
| Score | The method's own criterion value. Compare channels by rank, not by absolute value. |
| Rank | Position in the descending score order, 1 = best. |
| Pctile | Percentage of channels this one outranks. |
| z | Distance from the montage's mean score, in standard deviations. |
| Margin | Distance to the selection cut point in the score's own units. Positive means selected; a margin near zero flags a channel whose fate would flip under a slightly different Top Percent. |
| Status | Selected or dropped. |
The LASSO and Sparse CSP methods standardise the data and choose their penalty by cross-validation rather than using a fixed default. On signals in physical units, a fixed penalty shrinks every coefficient to zero, which silently presents the first N channels as "the top N" on every dataset.
9. Dimensionality Reducer
Projects the channel space onto fewer components. The method list is the full Dimensionality Reduction category of the ML component catalogue, so anything you can wire into an MLFlow graph is available here as a one-shot fit, PCA, Kernel PCA, TruncatedSVD, FactorAnalysis, FastICA, NMF, t-SNE, UMAP, Isomap, Locally Linear Embedding, MDS, Spectral Embedding, Dictionary Learning, and the rest. Each method exposes its own parameters, built from the catalogue schema rather than hard-coded here.
| Setting | Range / options |
|---|---|
| Components | 1 to 10000, default 2 |
| Channel scope | Full Data, or Selected Channels (the result of step 8) |
| Method parameters | Per-method, generated from the component catalogue |
Reading the components
The components table separates variance accounting from class discriminability, because a projection can explain a great deal of variance while separating nothing a decoder cares about:
| Column | Meaning |
|---|---|
| Variance % | Share of variance the component accounts for. Reported by the reducer itself for the linear family (PCA, TruncatedSVD, FactorAnalysis); for manifold methods (t-SNE, UMAP, Isomap) no such decomposition exists, so this is the share of the embedding's own variance and the summary says so. |
| Cumulative % | Running total of the column to its left. |
| Std Dev / Range | Spread of the samples along this component. |
| Class F, p | One-way ANOVA across the label classes. High F means this axis separates the conditions. |
| Eta² | Share of the component's variance attributable to class membership (0–1). The practical measure of decoding signal, it does not grow with sample count the way F does. |
10. Feature Extraction
This is the step that produces the labelled design matrix ML Suite trains on: one row per trial, one named column per feature. It sits after dimensionality reduction on purpose, by the time you reach it the channels are clean, selected and optionally projected, so what is extracted comes from the data you actually intend to decode.
Columns are named {unit}_{band}_{family}_{suffix} and each carries its domain, family, channel, band, unit and slot as metadata, so a ranked feature can always be traced back to a channel and a frequency band.
Feature Catalogue
Seventy-one feature families across five domains.
Time Domain, 27 families
Mean, Variance, Standard Deviation, Skewness, Kurtosis, Minimum, Maximum, Peak-to-Peak, Median, Interquartile Range, Root Mean Square, Signal Energy, Mean Absolute Value, Waveform Length, Zero Crossing Rate, Slope Sign Changes, Willison Amplitude, Nonlinear Energy, Hjorth Parameters (Activity / Mobility / Complexity), Shannon Entropy, Permutation Entropy, Sample Entropy, Approximate Entropy, Higuchi Fractal Dimension, Petrosian Fractal Dimension, Katz Fractal Dimension, Autoregressive Coefficients.
Frequency Domain, 18 families
Absolute Band Power, Relative Band Power, Log Band Power, Band Peak Frequency, Total Power, Peak Frequency, Mean Frequency, Median Frequency, Spectral Edge Frequency, Spectral Entropy, Spectral Centroid, Spectral Bandwidth, Spectral Skewness, Spectral Kurtosis, Spectral Rolloff, Spectral Flatness, Spectral Slope, Band Power Ratios (theta/beta, alpha/beta, engagement index).
Time-Frequency Domain, 9 families
Wavelet Sub-band Energy, Wavelet Sub-band Entropy, Wavelet Coefficient Statistics, Wavelet Band Energy, ERD/ERS, Windowed Band Power, Hilbert Envelope Statistics, Instantaneous Frequency, Time-Frequency Entropy.
Spatial Features, 8 families
Common Spatial Patterns (CSP), Covariance Matrix, Riemannian Tangent Space, Global Field Power, Laplacian Variance, CAR Variance, Channel Power Ratio, Region Band Power (frontal, central, parietal, occipital and temporal ROIs derived from 10-20 electrode names).
Connectivity Features, 9 families
Correlation, Cross-Correlation Lag, Coherence, Imaginary Coherence, Phase Locking Value (PLV), Phase Lag Index (PLI), Weighted Phase Lag Index (wPLI), Mutual Information, Graph Metrics (degree, clustering coefficient, efficiency, density).
Extraction settings
| Setting | Options | What it changes |
|---|---|---|
| Feature axis | Spatial (per channel) / Temporal (per time window) | A trial is channels × time, and a feature is a reduction. Spatial averages over time, one value per channel, the classical BCI layout (C3 versus C4 mu power). Temporal averages over channels and cuts the trial into windows, one value per window, keeping when the response happened. |
| Output | All trials (2-D matrix) / Each trial (3-D tensor) | The 2-D matrix is always produced, it is what LDA, SVM, random forests and gradient boosting train on. Asking for 3-D additionally stores a (trials × units × features) tensor for CNN, LSTM and EEGNet-style models, beside the matrix rather than replacing it. |
| Bands | EEG Standard, EEG Extended, fNIRS, EMG | Frequency bands every band-dependent family uses. |
| Sampling rate | From file, or explicit | Only needed when a stage carries no recorded rate. Getting it wrong shifts every band edge. |
| Channels | Per Channel / Channel Average / Both | Per Channel keeps the spatial pattern; Channel Average collapses the montage to one column per family, for recordings with few trials. |
| Time windows | 2 to 64, default 4 | The unit count on the temporal axis; also used by Windowed Band Power on the spatial axis. |
| ERD baseline | −60 to 60 s, default −0.2 to 0 s | The pre-stimulus window ERD/ERS is measured against. Defaults to what Epoching recorded. |
| CSP pairs | 1 to 32, default 4 | Filter pairs kept per class contrast. |
| Connectivity mode | Node Strength / All Pairs / Graph Summary | Node Strength gives one column per channel; All Pairs keeps every channel pair and gets wide fast; Graph Summary reduces the network to five descriptors. |
| Max pairs | 1 to 5000, default 120 | Ceiling on pairwise families. |
| Window / Overlap | 0.1–60 s, 0–95% | Pseudo-trial windowing when the source is continuous rather than epoched. |
| Priority top | 1 to 100%, default 40% | Top fraction marked Priority in the table. A ranking hint, every extracted column is saved either way. |
| Column limit | 50 to 50000, default 4000 | Hard ceiling on matrix width. Extraction stops here and says so rather than producing an unusable matrix. |
Channel-defined families (CSP, connectivity, covariance, ROI, Global Field Power) only exist on the spatial axis, the channels have been averaged away on the temporal axis. They are skipped with a note rather than quietly computed over window indices, because "covariance between time windows" is a different quantity wearing the same name.
Bands above the recording's Nyquist limit are dropped or clamped, and the run reports which. An EEG gamma band on a 10 Hz fNIRS recording is not a small error, it is an empty integration window that would otherwise yield a column of zeros.
Reading the result
The feature picker shows a live estimate of how wide the resulting matrix will be, so a careless selection is priced before it runs rather than after. Extracted features are ranked four ways at once, in one table: Score (the test statistic), p,Effect (effect size), and MI (mutual information), alongside the feature's domain, band, channel, and mean.
| Chart tab | Answers |
|---|---|
| Ranking | Best-scoring features, coloured by domain. |
| Domains | How much each feature domain contributes. |
| Distributions | Per-class spread of the top features. |
| Separability | Class scatter over the two best features, and an effect-size volcano plot. |
| Redundancy | Correlation between the top features, near-duplicates carry no extra information. |
| Channels | Which channels the class information sits on. |
11. Data Projection
Encodes one channel's 1-D time course as a 2-D image, so computer-vision architectures can be applied to a signal. Three encodings:
| Method | What it encodes |
|---|---|
| Gramian Angular Field (GAF) | Temporal correlations as angular differences on a polar-encoded series. |
| Markov Transition Field (MTF) | Transition probabilities between quantile bins over time. |
| Recurrence Plot (RP) | When the trajectory revisits a previous state. |
| Setting | Range |
|---|---|
| Sample windows | 1 to 12, default 4, how many windows to visualise |
| Window length | 16 to 512 samples, default 64, which is also the image resolution |
| Colormap | viridis, plasma, inferno, hot, coolwarm, RdBu_r, magma |
Each projected window is described twice: what the source segment was (RMS, peak-to-peak, kurtosis, zero crossings, dominant frequency, spectral entropy, Hjorth mobility and complexity) and what the encoding turned it into (image statistics and recurrence quantification). Both matter, an image looks different either because the encoding highlighted something or simply because that window happened to hold a burst.
Batch Apply
The Apply tab on each step takes the settings currently in View and runs them across a selection of files.
- Set up and run the step on one file in View until the result is what you want.
- Switch to Apply. Files are listed under modality tabs (fNIRS, EEG, EMG, EOG) with a checkbox each.
- Select the files, or use Select All, and press Apply.
- Progress reports per file as it goes; Cancel stops cleanly after the current file rather than mid-write.
Batch runs record their own stage artifacts exactly as a View run does, so a batched output is indistinguishable from one you produced interactively, and equally discoverable downstream. Batch runs also carry the same paradigm identity as the View run, so labels resolve against this study's paradigm only.
Files that cannot be processed, for example a subject with no filtered stage yet, are skipped with a logged reason rather than aborting the whole batch.
Provenance & Reproducibility
Analysis is not write-only. Three mechanisms make a study reopenable and a result defensible.
Recorded parameters
Every run writes its real parameters into the stage it produces, with a timestamp, the input hash, and the output handle. The Last run card on each page reads that back and states it plainly, which is a stronger record than the state of the controls: a control can fail to restore, and a control can be changed after a run without re-running.
Methods drafts
The Methods button assembles a publication Methods paragraph from what this recording has actually had done to it, in pipeline order: filtering, ICA, channel screening, epoching, normalisation, augmentation, time-frequency, channel selection, dimensionality reduction, features, projection. It is a first draft built from recorded provenance rather than from memory, and it is yours to edit.
Reopenable pages
Each page captures three layers of state into the study document: the controls you set, the rendered surfaces (tables and summary text), and the run payload itself. When the payload is present, reopening re-renders live plots you can theme, zoom and export, rather than a picture of a plot. Figures are stored as reusable assets inside the subject's container, so an exported study carries publication-ready images without re-rendering them.
Handing Off to ML Suite
Every stage the Analysis Suite writes is selectable as a data source in the Workflow designer, so what you built here binds directly to a training graph. Two handoffs are worth calling out:
- Feature Extraction → classical models. The 2-D design matrix is one row per trial with named columns, which is what LDA, SVM, random forests and gradient boosting expect.
- Feature Extraction (3-D tensor) or Time-Frequency → deep models. The tensor keeps the unit axis for CNN, LSTM and EEGNet-style architectures, and the time-frequency stage stores the per-trial ERSP tensor rather than only an average.
fNIRS & EMG Notes
- Chromophore separation. An fNIRS file holds an HbO and an HbR channel per source-detector pair. Decomposing, ranking, or reducing both together mixes two different physiological signals, so every fNIRS-capable step exposes a Chromophore control (All, HbO, HbR). Activation Maps offers HbO or HbR only, because a topomap draws one value per optode position and both at once would overplot the same sensors.
- fNIRS bands. The fNIRS band preset covers vlf (0.005–0.02 Hz), hemodynamic (0.01–0.08), mayer (0.08–0.12), respiratory (0.2–0.4), and cardiac (0.8–1.5). The higher bands are the physiological confounds you want to be able to measure rather than assume away.
- fNIRS time-frequency resolution. The haemodynamic response lives below about 0.1 Hz. At fNIRS sampling rates a wavelet decomposition has limited resolution in that band, so time-frequency peaks read low. That is a resolution limit of the method, not a defect in the recording.
- EMG bands. The EMG preset covers low (20–50 Hz), mid (50–100), high (100–250) and very_high (250–450). Several time-domain families, RMS, Mean Absolute Value, Waveform Length, Slope Sign Changes, Willison Amplitude, are the standard EMG activation measures.
- Sampling rate is read from the file. Steps derive it from the loaded recording's own metadata rather than assuming an EEG-style rate, which matters for a roughly 10 Hz fNIRS recording.
Troubleshooting
| What you see | What it means |
|---|---|
| "No filtered file for this experiment" | The subject has not been through Preprocessing in this experiment, and does not inherit a filtered stage from a parent. Run filtering first. |
| "Not epoched data. Missing epoch_idx" | A trial-level step (Augmentation, Time-Frequency, Activation Maps) was pointed at a continuous stage. Run Epoching first, or pick an epoched source. |
| "No events detected" | Epoching found no usable transitions in the selected event source. Check the label column, the stim channel, or that the NeuralFlow paradigm is compiled. |
| A band was dropped or clamped | The band sits at or above the recording's Nyquist limit. Expected on fNIRS with EEG band presets, switch the preset. |
| Topography drew a labelled ring instead of a scalp | Your channel names do not match the selected montage. Pick the right montage, or fix the channel names in Data Manager. |
| A step waits on the local service | The Reduce & Extract steps run their computation in the local FastAPI service. If it is still starting, give it a moment; if it does not come up, restart the app and check the logs before changing study data. |
| A batch timed out | Most likely Feature Extraction with a wide selection, All Pairs connectivity on a full montage is the usual cause. Narrow the selection, or switch the connectivity mode. |