Skip to content

base

tit.sim.base

Base simulation class with shared logic for TI and mTI simulations.

BaseSimulation factors out the identical code shared by TISimulation and mTISimulation: - init (config, montage, logger, path manager, m2m_dir) - _apply_tissue_conductivities (env-var overrides) - run() template method (setup dirs, viz, build session, post-process) - _init_session() (common SESSION setup: subpath, tensor, eeg_cap, flags) - _add_electrode_pair() (electrode creation on a TDCS list)

Subclasses implement
  • _simulation_mode (property returning SimulationMode.TI or .MTI)
  • _montage_type_label (property returning "TI" or "mTI")
  • _montage_imgs_key (property returning dirs key for montage images)
  • _build_session() (electrode-pair-specific session construction)
  • _post_process() (field computation and file organization)

BaseSimulation

BaseSimulation(config: SimulationConfig, montage: Montage, logger)

Bases: ABC

Abstract base class for TI/mTI simulations.

Subclasses must implement :pyattr:_simulation_mode, :pyattr:_montage_type_label, :pyattr:_montage_imgs_key, :meth:_build_session, and :meth:_post_process.

Source code in tit/sim/base.py
def __init__(self, config: SimulationConfig, montage: Montage, logger):
    self.config = config
    self.montage = montage
    self.logger = logger
    self.pm = get_path_manager()
    self.m2m_dir = self.pm.m2m(config.subject_id)

run

run(simulation_dir: str) -> dict

Execute the full simulation pipeline. Returns a result dict.

Source code in tit/sim/base.py
def run(self, simulation_dir: str) -> dict:
    """Execute the full simulation pipeline. Returns a result dict."""
    montage_dir = self.pm.simulation(
        self.config.subject_id,
        self.montage.name,
    )
    dirs = setup_montage_directories(montage_dir, self._simulation_mode)
    create_simulation_config_file(
        self.config, self.montage, dirs["documentation"], self.logger
    )

    viz_pairs = None if self.montage.is_xyz else self.montage.electrode_pairs

    run_montage_visualization(
        montage_name=self.montage.name,
        simulation_mode=self._simulation_mode,
        eeg_net=self.montage.eeg_net,
        output_dir=dirs[self._montage_imgs_key],
        project_dir=self.config.project_dir,
        logger=self.logger,
        electrode_pairs=viz_pairs,
    )

    self.logger.info("SimNIBS simulation: Started")
    run_simnibs(self._build_session(dirs["hf_dir"]))
    self.logger.info("SimNIBS simulation: \u2713 Complete")

    output_mesh = self._post_process(dirs)
    self.logger.info(f"\u2713 {self.montage.name} complete")

    return {
        "montage_name": self.montage.name,
        "montage_type": self._montage_type_label,
        "status": "completed",
        "output_mesh": output_mesh,
    }