Scripting
The TI-Toolbox allows Python scripting: Import tit modules directly and build custom pipelines with full API access
Python Scripting API
All tools can be used as a Python library by importing tit modules directly. Example scripts for each module are available in the scripts/ directory. A complete end-to-end pipeline is in scripts/pipeline.py.
Setup
Just import – logging and path resolution are automatic. No initialization call is needed.
from tit.sim import SimulationConfig, run_simulation
Preprocessing
from tit.pre import run_pipeline
run_pipeline(
subject_ids=["101", "102"],
convert_dicom=True,
run_recon=True,
create_m2m=True,
parallel_recon=True,
run_subcortical_segmentations=True,
)
See also: scripts/preprocess.py
Leadfield Generation
from tit.opt.leadfield import LeadfieldGenerator
lfg = LeadfieldGenerator(subject_id="101", electrode_cap="EEG10-20_Okamoto_2004")
lf_path = lfg.generate()
See also: scripts/leadfield.py
Flex Search (Differential Evolution Optimization)
from tit.opt import FlexConfig, FlexElectrodeConfig, SphericalROI, run_flex_search
from tit.opt.config import OptGoal, FieldPostproc
config = FlexConfig(
subject_id="101",
goal=OptGoal.MEAN, # "mean", "max", or "focality"
postproc=FieldPostproc.MAX_TI, # "max_TI", "dir_TI_normal", or "dir_TI_tangential"
current_mA=8.0,
electrode=FlexElectrodeConfig(shape="ellipse", dimensions=[8.0, 8.0]),
roi=SphericalROI(x=-31.3, y=24.0, z=-37.0, radius=10.0, use_mni=True),
anisotropy_type="scalar", # "scalar", "vn", "dir", or "mc"
n_multistart=3,
)
result = run_flex_search(config)
print(result.success, result.best_value, result.output_folder)
FlexConfig validates parameters in __post_init__, including automatic string-to-enum coercion for goal, postproc, and non_roi_method, and validation that focality goal with specific non-ROI method requires a non_roi specification.
Ex-Search (Exhaustive Leadfield Optimization)
from tit.opt import ExConfig, ExCurrentConfig, PoolElectrodes, BucketElectrodes
from tit.opt.ex import run_ex_search
# Pooled mode: all electrodes can go to any channel
config = ExConfig(
subject_id="101",
leadfield_hdf="/path/to/leadfield.hdf5",
roi_name="target_roi",
electrodes=PoolElectrodes(electrodes=["Fp1", "Fp2", "C3", "C4", "Pz", "Oz"]),
currents=ExCurrentConfig(total_current=2.0, current_step=0.5),
roi_radius=3.0,
eeg_net="EGI10-20_Okamoto_2004",
)
# Bucketed mode: electrodes pre-assigned to channels
config = ExConfig(
subject_id="101",
leadfield_hdf="/path/to/leadfield.hdf5",
roi_name="target_roi",
electrodes=BucketElectrodes(
e1_plus=["Fp1", "Fp2"],
e1_minus=["Pz", "Oz"],
e2_plus=["C3", "F3"],
e2_minus=["C4", "F4"],
),
currents=ExCurrentConfig(total_current=2.0, current_step=0.5),
roi_radius=3.0,
eeg_net="EGI10-20_Okamoto_2004",
)
result = run_ex_search(config)
print(result.success, result.n_combinations, result.results_csv)
See also: scripts/optimizer.py
Simulation
from tit.sim import (
SimulationConfig, Montage, Montage.Mode,
run_simulation, load_montages,
)
# Load pre-defined montages from the project's montage file
montages = load_montages(
montage_names=["L_Insula"],
eeg_net="GSN-HydroCel-185.csv",
)
# Or define montages manually
montages = [
Montage(
name="montage1",
mode=Montage.Mode.NET,
electrode_pairs=[("E1", "E2"), ("E3", "E4")],
eeg_net="GSN-HydroCel-256",
),
]
config = SimulationConfig(
subject_id="101",
montages=montages,
conductivity="scalar",
intensities=[1.0, 1.0],
electrode_shape="ellipse",
electrode_dimensions=[8.0, 8.0],
gel_thickness=4.0,
rubber_thickness=2.0,
)
run_simulation(config)
See also: scripts/simulator.py
Analyzer
from tit.analyzer import Analyzer, run_group_analysis
# Single-subject analysis
analyzer = Analyzer(subject_id="101", simulation="montage1", space="mesh")
# Spherical ROI analysis
result = analyzer.analyze_sphere(
center=(-31.3, 24.0, -37.0),
radius=10.0,
coordinate_space="subject", # or "MNI"
visualize=True,
)
# Cortical atlas ROI analysis
result = analyzer.analyze_cortex(
atlas="DK40",
region="lh.insula",
visualize=True,
)
# Access typed result fields
print(result.roi_mean, result.roi_max, result.roi_focality)
Group Analysis
result = run_group_analysis(
subject_ids=["101", "102", "103"],
simulation="montage1",
space="mesh",
analysis_type="spherical",
center=(10, 20, 30),
radius=5.0,
coordinate_space="MNI",
output_dir="/path/to/group/output",
)
See also: scripts/analyzer.py
Cluster-Based Permutation Testing
from tit.stats import (
run_group_comparison,
run_correlation,
GroupComparisonConfig,
CorrelationConfig,
load_group_subjects,
load_correlation_subjects,
)
# Group comparison
subjects = load_group_subjects("subjects_classification.csv")
config = GroupComparisonConfig(
analysis_name="responders_vs_nonresponders",
subjects=subjects,
n_permutations=1000,
)
result = run_group_comparison(config)
# Correlation analysis
subjects = load_correlation_subjects("subjects_correlation.csv")
config = CorrelationConfig(
analysis_name="dose_response",
subjects=subjects,
correlation_type="pearson",
n_permutations=1000,
)
result = run_correlation(config)
See also: scripts/cluster_permutation.py