All notable changes to MNE-CPP will be documented in this file.
- MNA graph-execution library (
mne_mna): New library for the.mnaanalysis node-graph format with YAML-based operator definitions, topological execution, andMnaOpRegistryfor built-in and user-registered operators - Machine-learning library (
mne_ml): New library withMlTrainerfor sklearn-compatible model training via embedded Python, supporting SVM, Random Forest, Logistic Regression, and custom estimators - STS covariance estimators: Added Ledoit-Wolf and Oracle Approximating Shrinkage (OAS) estimators to the
stslibrary with cross-validation support against scikit-learn - CMNE sparse inverse: Added Cascaded MNE (
InvCMNE) solver to the inverse library for spatially sparse source estimation - DSP Infomax ICA: Extended the
dsplibrary with an Infomax-based ICA decomposition algorithm - BIDS coordinate system: Added
BidsCoordinateSystemclass for round-trip parsing and writing ofcoordinatesystem.json, andBidsElectrode::toFiffDigPoints()for converting BIDS electrodes to FIFF digitizer point sets - FreeSurfer atlas lookup: Added
FsAtlasLookupfor Desikan-Killiany / Destrieux atlas region querying - MRI slicer: Added
MriSlicerclass for extracting orthogonal slices (Axial/Sagittal/Coronal) from NIfTI volumes - 3D electrode visualization:
ElectrodeObjectnow includes QRhi GPU buffer management (updateBuffers,vertexBuffer,indexBuffer,instanceBuffer) following the BrainSurface pattern; newelectrode.vert/electrode.fragshaders with instanced contact spheres and Blinn-Phong lighting - 3D MRI slice visualization: New
SliceObjectrenderable for textured MRI volume slices with voxel-to-world transforms and intensity windowing; newslice.vert/slice.fragshaders - FiffAnnotations integration:
AnnotationModelrefactored to useFiffAnnotationsas backing store instead of internalQVector<AnnotationEntry>, withfiffAnnotations()/setFiffAnnotations()public accessors - Python cross-validation tests: Added
GUARD_PYTHON/GUARD_PYTHON_PACKAGEmacros ensuring Python-dependent tests fail in CI (MNE_REQUIRE_PYTHON=true) instead of silently skipping - PythonTestHelper extensions: Added
writeMatrix(),readMatrix(), andevalMatrixViaFile()convenience methods for Eigen↔NumPy round-trip validation - MNA Scan plugin registry: Added
scan-plugins.jsonschema andMnaScanTypesclass for declaring MNE Scan plugins as MNA operator schemas - W-file I/O: Added
read_wandwrite_wmethods toFiffStreamfor FreeSurfer.wformat surface data - Cortical surface mapping: New
MNECorticalMapclass withicoDownsample()for icosahedral downsampling,smoothOperator()for nearest-neighbor surface smoothing, andcomputeMorphMaps()for cross-subject cortical morphing - Scalp surface generation: Added
makeScalpSurfaces()toMNEBemSurfacefor creating decimated scalp meshes at multiple resolutions - Processing history: Added
copyProcessingHistory()toFiffStreamfor transferring processing provenance between FIFF files
- Inverse tools (7 new):
mne_compute_cmne(CMNE source estimation via ONNX Runtime),mne_inverse_pipeline(MNA graph-based inverse pipeline),mne_label_ssp(SSP projectors from cortical ROIs),mne_average_estimates(weighted STC averaging),mne_process_stc(STC scale/export/copy),mne_make_uniform_stc(uniform STC for testing),mne_map_data(evoked data remapping between sensor arrays) - Preprocessing tools (7 new):
mne_add_triggers(insert trigger events),mne_change_baselines(modify evoked baselines),mne_change_nave(modify n_ave field),mne_copy_processing_history(copy processing provenance),mne_fix_stim14(reconstruct STI 014 from STI 001–006),mne_make_derivations(text derivation to FIFF),mne_toggle_skips(toggle raw skip tags) - Info tools (6 new):
mne_check_eeg_locations(validate EEG positions),mne_evoked_data_summary(print evoked summaries),mne_list_coil_def(list coil definitions),mne_list_proj(list SSP projectors),mne_sensor_locations(export sensor locations to text),mne_show_mna(display MNA project contents) - Forward tools (3 new):
mne_fit_sphere_to_surf(fit sphere to surface points),mne_make_scalp_surfaces(generate decimated scalp meshes),mne_transform_points(transform 3D points between coordinate frames) - Conversion tools (3 new):
mne_convert_ctf_markers(CTF markers to FIFF events),mne_epochs2mat(epochs to MATLAB .mat),mne_mna_bids_converter(MNA ↔ BIDS conversion)
- Upgraded
codecov/codecov-actionfrom v5 to v6 to resolve Node.js 20 deprecation warnings - Added
MNE_REQUIRE_PYTHON: 'true'environment variable to all platform test steps - Added
scikit-learnto Python test dependencies - Updated lodash from 4.17.23 to 4.18.1 (Dependabot security fix)
- Fixed potential silent test skips — Python-dependent tests now respect
MNE_REQUIRE_PYTHONenforcement - Fixed deprecated
qWarncalls intest_mne_source_analysis(replaced withqWarning()) - Fixed unused
[[nodiscard]]return values intest_tool_inverse_computation
- Added 26 new command-line tool documentation pages
- Rewrote MNA format manual page (
mna-format.mdx) as comprehensive reference (73 → 476 lines) - Rewrote MNA API reference page (
api-mna.mdx) with full class inventory (63 → 572 lines) - Added ML library API reference page (
api-ml.mdx) - Added Statistics library API reference page (
api-sts.mdx) - Updated tools overview with all 26 new tools and new "Inspection and Information" section
- Updated overview and API pages with Mna, Ml, Sts library entries
- Expanded glossary with 14 new terms (CMNE, DICS, LCMV, MNA, MxNE, ONNX, etc.) and 3 file format entries (
.mna,.mnx,.onnx) - Fixed orphaned pages (
mna-format,api-mna) by adding to sidebar navigation - Added zero-tolerance warning policy to development conventions
-
MNE Browse overhaul
- QRhi-based 2D channel rendering for Metal/Vulkan/D3D12 performance
- ICA browser with component visualization, rejection, and original-data reset
- Epoch review workflow with evoked computation and histogram view
- Annotation workflow with FIF interoperability and auto-merge
- Virtual channel derivations with weighted reference workflows
- Covariance matrix heatmap visualization and whitening controls (W key)
- Projector dialog (J/Shift+J) and SSP toggle
- 2D layout view with mouse-wheel zoom, auto-scale, and channel scaling spinboxes
- Dark mode, drag-and-drop file open, recent files list
- GPU clipping/z-score shaders, fullscreen (F11), zen mode (F)
- Linear detrending (D key cycles None/DC/Linear)
- GFP overlay on butterfly view
- Interactive ruler tool with amplitude snap and semi-transparent overlay
- Double-click bad-channel marking, click-to-toggle bad channels
- Stimulus lane above time ruler with event markers
- Per-description event/annotation filtering and visibility toggles
- Channel sort by type, epoch grid lines (G), overview bar toggle (O), scroll speed control
- Source-estimate export workflow
- Session filtering workflow
- Settings persistence across sessions via QSettings
- Event file saving to FIF and ASCII formats
- WASM loading screen and optimized WebAssembly build
-
MNE Analyze Studio
- Agent-based workflow engine with grounded LLM safety
- Multi-provider planner profiles (OpenAI Responses API)
- Reusable inspect 3D surface views
- Extension-based view architecture with hosted view tooling
- VS Code chat UX integration and
.mnaproject format
-
BIDS library (
mne_bids): New library for reading and writing BIDS-formatted datasets with testframe -
Beamformers: Added beamformer classes to the
invlibrary with testframes -
DSP library enhancements
WelchPsd: Welch power spectral density estimationMorletTfr: Morlet wavelet time-frequency representationxDAWN: xDAWN spatial filtering for ERP denoising- KMeans: Cosine and correlation distance normalization implemented
- Real-time covariance: Channel picks applied (MEG/EEG only)
-
Logging: Renamed
ApplicationLoggertoMNELoggerwithMNE_LOG_LEVELandMNE_LOG_MODEenvironment variables
- Qt 6.11 support with auto-detection in
init.sh - Build Qt Installer Framework 4.11.0 toolchains from source
- Offline self-contained installers (.run, .dmg, .exe)
- Nightly WASM builds deployed alongside stable releases
- Reusable Qt toolchain assets consumed by CI workflows
- Eigen downloaded at configure time (no longer bundled)
- Fixed Metal/QRhi rendering on macOS: native window, infinite repaint loop
- Fixed butterfly whitening scale and circular channel arrangement
- Fixed 2D layout channel filtering, scale persistence, and item sizing
- Fixed crosshair repaint cascade, split MEG grad/mag scale labels
- Fixed DSP SSS and bad-channel regressions
- Fixed DSP pi constants on Windows, params defaults on Clang/GCC
- Fixed Windows linker error for nested
Paramsstruct exports - Fixed macOS test flakiness and WASM build errors
- Fixed
mne_anonymizeunique_ptr usage - Fixed ruler amplitude precision (1 → 3 decimal places)
- Fixed stim chip overlap, event line z-order, and resize resampling
- Fixed scroll pan boundary and smooth inertial scroll
- Updated website to reflect renamed/split libraries
- Updated build guide paths (
tools/→scripts/) - Fixed release download page for installers and WebAssembly
- Updated Zenodo DOI to 19139238
- MNE-CPP libraries: Version 2.0.0
- CLI tools (51 ported MNE-C tools,
mne_dipole_fit,mne_inspect): Derive version from the MNE-CPP project version (2.0.0) via CMake compile definition - MNE Scan: Version 1.0.0 (first stable release as a standalone application)
- MNE Analyze: Version 1.0.0 (first stable release as a standalone application)
- IConnector plugin interface: Bumped to
mne_rt_server/2.0
- Library renames:
connectivity→conn,communication→com,rtprocessing→dsp,inverse→inv,disp3D_rhi→disp3D - Class renames: Inverse library classes now use
Invprefix (InvRapMusic,InvMinimumNorm,InvSourceEstimate,InvHpiFit, …) - Moved classes:
InvInverseOperator,InvMeasData,InvMeasDataSetmoved frominvtomnelibrary (asMNEInverseOperator,MNEMeasData,MNEMeasDataSet); backward-compatible forwarding headers provided - Moved classes:
FwdForwardSolutionmoved toMNEForwardSolutionin themnelibrary; forwarding header infwd/for backward compatibility - Removed:
InvCorSourceEstimateclass (superseded by unifiedInvSourceEstimate) - Split:
MNEMathsplit intoLinalgandNumericsin themathlibrary - Moved:
eventslibrary moved intomne_analyzeapplication (no longer a standalone library) - Qt requirement: Qt 6.10.0 minimum (Qt 5 no longer supported)
- Eigen upgrade: Eigen 5.0.1
- 51 CLI tools: Ported all MNE-C command-line tools to modern C++ with
QCommandLineParserandApplicationLogger- Conversion:
mne_edf2fiff,mne_ctf2fiff,mne_kit2fiff,mne_brain_vision2fiff, and more - Forward modeling:
mne_forward_solution,mne_setup_forward_model,mne_prepare_bem_model,mne_make_source_space,mne_make_sphere_bem,mne_average_forward_solutions - Inverse:
mne_compute_raw_inverse,mne_compute_mne,mne_inverse_operator - Preprocessing:
mne_anonymize,mne_process_raw,mne_compensate_data - Surface:
mne_surf2bem,mne_check_surface,mne_watershed_bem,mne_flash_bem - Info:
mne_show_fiff,mne_compare_fif_files,mne_list_source_space,mne_list_bem - Server:
mne_rt_server - Simulation:
mne_simulate_data
- Conversion:
- Unified InvSourceEstimate: Single class with composition layers for grid data, focal dipoles, couplings, connectivity, positions, and metadata; includes tokenization support for streaming
- RHI-based 3D rendering: Migrated from Qt3D to QRhi pipeline with holographic rendering mode, Fresnel effects, dipole overlay, and async STC loading
- Flexible clustering: Variable cluster sizes in source space computation
- MNE Scan improvements: Plugin loading progress on splash screen, macOS app bundle icons
- LSL library modernized: Added
lsl_prefix, comprehensive tests, updated to LSL 1.17.5
- Forward library (fwd): Removed ~700 lines of dead code; replaced
printf→qInfo/qWarning; replacedgoto→ early return/lambdas; replaced C macros (ARSINH,EPS) →constexpr/inline; modernizedFwdBemModelmembers from raw pointers to Eigen types andstd::shared_ptr - FIFF I/O consolidation: Moved duplicated FIFF reading functions to library classes (
FiffStream::read_bad_channels,MNECovMatrix::read,MNERawInfo::find_meas_info) - Thread safety: Fixed thread-unsafe
static float*inMNEProjOp::project_vectorusingthread_local - Network input validation: Added bounds checking in BabyMEG client byte conversion functions
- Sparse matrix crash fix: Guarded
MNEHemisphere::operator==against segfault on default-constructed sparse matrices - Copyright: Updated to 2026 across all library headers
- Qt6 serialization: Updated
QDataStreamversion fromQt_5_1toQt_6_0in rt_server - Centralized CLI versioning: All 51 CLI tools now derive their
PROGRAM_VERSIONfrom the CMake project version (MNE_CPP_VERSION) instead of hardcoded strings - Format specifier fix: Fixed
%d→%lldforqsizetypein BabyMEG client warnings
- Restructured to Main-Staging-Feature branch model
- Build matrix: Ubuntu 24.04, macOS 26, Windows 2025 with Qt 6.10.0 and Qt 6.10.2
- CodeQL and Coverity static analysis (weekly)
- Code coverage tracking with 35% library threshold
- CPackIFW-based installer generation (.run, .dmg, .exe)
- WebAssembly build support
- Docusaurus-based documentation site
- Organized CLI tools by domain category in sidebar
- Added MNE handbook reference pages (cookbook, FIFF format, sample dataset, data conversion)
- Completed Doxygen documentation for
InvRapMusic,InvMinimumNorm,InvDipole
- Fixed crash in
make_inverse_operatorwith non-surface-oriented forward solutions - Fixed segfault in forward computation
- Fixed FIFF double I/O,
make_dirEOF,write_covpacking, andsource_covkind - Fixed
MNECTFCompDataSetcopy constructor member initialization - Fixed coordinate transformation handling in 3D visualization
- Fixed inflated brain alignment and surface projection tolerances
- Fixed floating-point comparison tolerances in forward solution tests
- Fixed sphere simplex test convergence