layout: releases title: “” nav_title: “Release v2.3.0” permalink: /releases/v2.3.0/ nav_exclude: true sitemap: false —
Release v2.3.0
Release Date: March 17, 2026
This is a major release that introduces a number of new features, but mainly a massive change to internal modernization of the codebase. Plus, we are now wrapping SimNIBS 4.6.0.
New Features
- Combined ROI Analysis: You can now select multiple atlas regions to analyze as a single combined ROI. Pass a list of region names (e.g.,
["precentral", "postcentral"]) and they are unioned before analysis. Output directories and file names use a+-joined convention (e.g.,precentral+postcentral/). - Anisotropy Support in Flex-Search: The flex-search optimizer now supports all 4 SimNIBS conductivity models: isotropic (scalar), volume-normalized (vn), direct (dir), and multi-conductivity (mc). A dropdown in the GUI and
FlexConfig.anisotropy_typeparameter in the API control this. - Anisotropy Tuning Parameters: New
aniso_maxratioandaniso_maxcondparameters on simulation and optimization configs let you control eigenvalue clamping for anisotropic simulations (defaults match SimNIBS: 10.0 and 2.0 S/m respectively). - Optimization Output Manifest: Every flex-search run now writes a
flex_meta.jsonmanifest alongside its results, recording the full configuration, best result, multi-start history, and a human-readable label. The simulator reads this manifest directly instead of parsing folder names. - Comprehensive Test Suite: 545 pytest tests running in 0.55 seconds, covering all core modules. Key coverage: calc 100%, paths 98%, sim/TI 87%, sim/mTI 90%, analyzer 82%, stats/config 95%, pre/structural 99%, opt/config 99%.
- JSON Config Entry Points: All modules support
simnibs_python -m tit.<module> config.jsonfor programmatic and GUI-driven invocation. Newtit/config_io.pyhandles typed serialization with_typediscriminators.
Refactors & Improvements
- Logger Simplification: Removed ~750 lines of custom handler/wrapper code. Two functions:
setup_logging()andadd_file_handler(). File-only logging with Qt bridge for GUI. Debug-mode checkboxes removed from all GUI tabs. - Module Reorganization: Dissolved
tit/core/– modules moved totit/paths,tit/constants,tit/calc. NIfTI utilities moved totit/stats/nifti. Mesh utilities moved totit/tools/gmsh_opt. - Unified Analyzer: Single
Analyzerclass replaces the oldMeshAnalyzer/VoxelAnalyzersplit. Sphere and cortex ROI handling are unified. Newrun_group_analysis()function for multi-subject comparisons. - Simplified Python API: All modules now support clean one-liner imports:
from tit.sim import SimulationConfig, Montage, MontageMode, run_simulationfrom tit.opt import FlexConfig, run_flex_searchfrom tit.opt import ExConfig, run_ex_searchfrom tit.analyzer import Analyzer, run_group_analysisfrom tit.stats import run_group_comparison, GroupComparisonConfig
- Flat Simulation Config: The simulation API was simplified from 5+ wrapper classes to 2 dataclasses.
LabelMontage/XYZMontagereplaced by a singleMontageclass with aMontageModeenum.ElectrodeConfig,IntensityConfig, andConductivityTypefields inlined directly intoSimulationConfig. - Flat Optimization Configs: Flex-search ROI types, enums, and electrode config are now nested inside
FlexConfig(e.g.,FlexConfig.SphericalROI,FlexConfig.OptGoal). Ex-search current parameters inlined intoExConfig. Electrode classes accessed asExConfig.PoolElectrodesandExConfig.BucketElectrodes. - PathManager Rewrite: Replaced 930-line template engine with 180-line direct-method API (
pm.m2m(sid),pm.simulation(sid, sim)). IDE autocompletion now works; typos caught at import time. - GUI Threading: Eliminated all blocking
.wait()calls. Signal-based completion. Consistent subprocess pattern (config -> JSON -> subprocess) across all tabs. - Statistics Engine Refactor: Introduced
PermutationEngineclass that absorbs all control parameters, cutting internal function signatures from 16-17 arguments to 5-7. Dead code removed from I/O utilities. Public API (run_group_comparison,run_correlation) unchanged. - Blender Module Modernization: Typed config dataclasses (
MontagePublicationConfig,VectorFieldConfig,RegionExportConfig), consolidated I/O utilities,__main__.pyentry point, and deduplicated STL/PLY code. - Codebase Modernization: 657 type hint replacements across 55 files (modern
list[X],X | Nonesyntax). 27 dead constants removed. 16 overly broad exception handlers tightened. GUI color constants centralized instyle.py. - CI/CD Improvements: Fixed Codecov upload in CircleCI. Added GitHub Actions workflow for MkDocs auto-deployment. Docker layer caching enabled. Codecov CLI cached between runs.
- Reusable GUI Components: Extracted
ROIPickerWidget,ElectrodeConfigWidget,SolverParamsWidgetfor cross-tab reuse. Three identical floating window classes consolidated into one generic class.
Fixes
- Python 3.9 syntax errors fixed (
str | Pathwithoutfrom __future__ import annotations). - SimNIBS
S.fname_tensornow set correctly (wasS.dti_nii– silently ignored by SimNIBS). - SimNIBS
S.map_to_MNIcapitalized correctly (wasS.map_to_mni– MNI mapping was silently broken). - Dead
S.anisotropy_typeassignment on SESSION object removed (was no-op; correctly set on TDCSLIST).
Breaking Changes
tit.core.*imports removed – usetit.paths,tit.constants,tit.calcdirectly.PathManager.path("key")template API removed – use direct methods (e.g.,pm.m2m(sid)).list_subjects()renamed tolist_simnibs_subjects().list_all_subjects()removed entirely.MeshAnalyzerandVoxelAnalyzerdeleted – use unifiedAnalyzerclass.run_analysis()removed – useAnalyzer.run()orrun_group_analysis().LabelMontageandXYZMontagedeleted – useMontagewithMontageModeenum.ElectrodeConfig,IntensityConfig,ConductivityTypedeleted – fields inlined intoSimulationConfig.IntensityConfig(pair1=, pair2=)constructor removed – useintensities=[1.0, 1.0]list.- Standalone
SphericalROI,AtlasROI,SubcorticalROIremoved fromtit.opt– access viaFlexConfig.SphericalROI, etc. OptGoal,FieldPostproc,NonROIMethodenums removed fromtit.opt– access viaFlexConfig.OptGoal, etc.ExCurrentConfigdeleted – current parameters inlined intoExConfig.BucketElectrodesandPoolElectrodesstandalone imports removed – access viaExConfig.BucketElectrodes, etc.config.eeg_netremoved fromExConfig– replaced withconfig.run_name(defaults to datetime).generate_current_ratios()return type changed – now returnslistinstead of(list, bool).- Ex-search output JSON changed –
analysis_results.jsonreplaced withrun_config.json.n_elementscolumn removed from CSV. - Logger functions
get_logger(),build_logger(),build_opt_logger()deleted – uselogging.getLogger(__name__). BenchmarkLoggerandOptimizationLoggerwrapper classes deleted – use standardloggingmodule.- Flex-search output folders now use datetime naming (e.g.,
20260307_143022/) instead of encoded ROI names. Theflex_meta.jsonmanifest replaces folder-name parsing. mesh_utils.pyrenamed togmsh_opt.pyintit/tools/.
Download Links
Desktop App (v2.3.0): macOS Intel · macOS Apple Silicon · Windows · Linux AppImage · Linux deb
Other:
- Docker Image:
docker pull idossha/simnibs:v2.3.0 - Source Code: GitHub Repository
For installation instructions, see the Installation Guide.
Getting Help
If you encounter issues with this release:
- Check the Installation Guide for setup instructions
- Review the Troubleshooting section
- Search existing issues
- Ask in GitHub Discussions