diff --git a/config.json b/config.json deleted file mode 100644 index 3d18623..0000000 --- a/config.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singularity_path": ".", - "singularity_name": "voxsim_singularity_latest.sif" -} - diff --git a/config.py b/config.py deleted file mode 100644 index 232a35c..0000000 --- a/config.py +++ /dev/null @@ -1,13 +0,0 @@ -import json -from os.path import dirname, join, realpath - - -def get_config(path=dirname(realpath(__file__))): - with open(join(path, "config.json")) as f: - return json.load(f) - - -def override_global_config(config): - print(config) - with open(join(dirname(realpath(__file__)), "config.json"), "w+") as f: - json.dump(config, f) diff --git a/setup.py b/setup.py index 19e4249..8825144 100644 --- a/setup.py +++ b/setup.py @@ -3,18 +3,16 @@ from simulator.utils.setup.documentation import DocCommand - if __name__ == "__main__": setup( name="simulation_generator", - version="1.0.0", + version="1.0.3", packages=find_packages(exclude=("tests", "tests.*")), url="", license="", author="avcaron", author_email="", description="", - data_files=[(".", ["config.py", "config.json"])], scripts=list( filter(lambda s: "init" not in s, glob.glob("scripts/*.py")) ), diff --git a/simulator/default.py b/simulator/default.py new file mode 100644 index 0000000..3a170b7 --- /dev/null +++ b/simulator/default.py @@ -0,0 +1,7 @@ +import typing +import pathlib + +SINGULARITY_PATH: typing.Final[pathlib.PurePath] = pathlib.PurePath() +SINGULARITY_NAME: typing.Final[str] = "voxsim_singularity_latest.sif" +SINGULARITY: typing.Final[pathlib.PurePath] = SINGULARITY_PATH / SINGULARITY_NAME +SINGULARITY_EXEC: typing.Final[str] = "singularity" diff --git a/simulator/factory/common/__init__.py b/simulator/factory/common/__init__.py index fd9d22f..8e48e44 100755 --- a/simulator/factory/common/__init__.py +++ b/simulator/factory/common/__init__.py @@ -1 +1 @@ -from .common import AttributeAsDictClass +from ._common import AttributeAsDictClass diff --git a/simulator/factory/common/common.py b/simulator/factory/common/_common.py old mode 100755 new mode 100644 similarity index 100% rename from simulator/factory/common/common.py rename to simulator/factory/common/_common.py diff --git a/simulator/factory/geometry_factory/__init__.py b/simulator/factory/geometry_factory/__init__.py index b69e045..6cbe349 100755 --- a/simulator/factory/geometry_factory/__init__.py +++ b/simulator/factory/geometry_factory/__init__.py @@ -1,3 +1,3 @@ -from .geometry_factory import GeometryFactory +from ._geometry_factory import GeometryFactory from simulator.factory.geometry_factory.utils.plane import Plane from simulator.factory.geometry_factory.utils.rotation import Rotation diff --git a/simulator/factory/geometry_factory/geometry_factory.py b/simulator/factory/geometry_factory/_geometry_factory.py old mode 100755 new mode 100644 similarity index 100% rename from simulator/factory/geometry_factory/geometry_factory.py rename to simulator/factory/geometry_factory/_geometry_factory.py diff --git a/simulator/factory/simulation_factory/__init__.py b/simulator/factory/simulation_factory/__init__.py index 1cb8895..fe0c0a9 100755 --- a/simulator/factory/simulation_factory/__init__.py +++ b/simulator/factory/simulation_factory/__init__.py @@ -1 +1 @@ -from .simulation_factory import SimulationFactory +from ._simulation_factory import SimulationFactory diff --git a/simulator/factory/simulation_factory/simulation_factory.py b/simulator/factory/simulation_factory/_simulation_factory.py old mode 100755 new mode 100644 similarity index 100% rename from simulator/factory/simulation_factory/simulation_factory.py rename to simulator/factory/simulation_factory/_simulation_factory.py diff --git a/simulator/runner/__init__.py b/simulator/runner/__init__.py index 119609b..49dc376 100755 --- a/simulator/runner/__init__.py +++ b/simulator/runner/__init__.py @@ -1 +1,2 @@ +from .config import SingularityConfig from .simulation_runner import SimulationRunner diff --git a/simulator/runner/config.py b/simulator/runner/config.py new file mode 100644 index 0000000..1667208 --- /dev/null +++ b/simulator/runner/config.py @@ -0,0 +1,10 @@ +import dataclasses +import pathlib + +import simulator.default as default + + +@dataclasses.dataclass +class SingularityConfig: + singularity: pathlib.PurePath = default.SINGULARITY + singularity_exec: str = default.SINGULARITY_EXEC diff --git a/simulator/runner/legacy.py b/simulator/runner/legacy.py index 463b321..a56e9ad 100644 --- a/simulator/runner/legacy.py +++ b/simulator/runner/legacy.py @@ -10,21 +10,21 @@ from numpy import ones_like, sum import nrrd -from config import get_config +from .config import SingularityConfig from ..exceptions import SimulationRunnerException from ..utils.logging import RTLogging - logger = logging.getLogger(basename(__file__).split(".")[0]) class SimulationRunner: + def __init__( self, base_naming, geometry_infos, simulation_infos=None, - singularity_conf=get_config(), + singularity_conf=SingularityConfig(), output_nifti=False, ): self._geometry_path = geometry_infos["file_path"] @@ -40,17 +40,10 @@ def __init__( self._compartment_ids = simulation_infos["compartment_ids"] singularity_conf = ( - singularity_conf if singularity_conf else get_config() - ) - self._singularity = path.join( - singularity_conf["singularity_path"], - singularity_conf["singularity_name"], - ) - self._singularity_exec = ( - singularity_conf["singularity_exec"] - if "singularity_exec" in singularity_conf - else "singularity" + singularity_conf if singularity_conf else SingularityConfig() ) + self._singularity = singularity_conf.singularity + self._singularity_exec = singularity_conf.singularity_exec self._run_simulation = True if simulation_infos else False self._extension = "nii.gz" if output_nifti else "nrrd" @@ -80,7 +73,7 @@ def run_simulation_dwimage( "{} run -B {} --app launch_mitk {} -p {} -i {} -o {} {}".format( self._singularity_exec, ",".join( - [simulation_infos["file_path"], simulation_output_folder] + [str(simulation_infos["file_path"]), str(simulation_output_folder)] ), self._singularity, path.join( @@ -156,9 +149,9 @@ def run_simulation_standalone( self._singularity_exec, ",".join( [ - geometry_folder, - simulation_infos["file_path"], - simulation_output_folder, + str(geometry_folder), + str(simulation_infos["file_path"]), + str(simulation_output_folder), ] ), self._singularity, @@ -238,7 +231,7 @@ def run( geometry_command = ( "singularity run -B {} --app launch_voxsim {} -f {} -r {} " "-s {} -o {} --comp-map {} --quiet{}".format( - ",".join([self._geometry_path, geometry_output_folder]), + ",".join([str(self._geometry_path), str(geometry_output_folder)]), self._singularity, path.join(self._geometry_path, self._geometry_base_file), ",".join([str(r) for r in self._geometry_resolution]), @@ -255,9 +248,9 @@ def run( "-p {} -i {} -o {} {}".format( ",".join( [ - self._simulation_path, - geometry_output_folder, - simulation_output_folder, + str(self._simulation_path), + str(geometry_output_folder), + str(simulation_output_folder), ] ), self._singularity, diff --git a/simulator/runner/simulation_runner.py b/simulator/runner/simulation_runner.py index 1857cc1..3b1be6e 100755 --- a/simulator/runner/simulation_runner.py +++ b/simulator/runner/simulation_runner.py @@ -1,19 +1,19 @@ import logging from asyncio import get_event_loop, new_event_loop, set_event_loop -from os import makedirs, path -from os.path import basename +from os import makedirs +import os from subprocess import PIPE, Popen -from config import get_config +from .config import SingularityConfig from .datastore import Datastore from ..utils.logging import RTLogging - -logger = logging.getLogger(basename(__file__).split(".")[0]) +logger = logging.getLogger(os.path.basename(__file__).split(".")[0]) class AsyncRunner: + def __init__(self): self._event_loop = new_event_loop() @@ -49,16 +49,11 @@ async def _run_async(self, command, log_file, log_tag): class SimulationRunner(AsyncRunner): _apps = {"phantom": "launch_voxsim", "diffusion mri": "launch_mitk"} - def __init__(self, singularity_conf=get_config()): - self._singularity = path.join( - singularity_conf["singularity_path"], - singularity_conf["singularity_name"], - ) + def __init__(self, singularity_conf=SingularityConfig()): + self._singularity = singularity_conf.singularity super().__init__() - self._singularity_exec = "singularity" - if "singularity_exec" in singularity_conf: - self._singularity_exec = singularity_conf["singularity_exec"] + self._singularity_exec = singularity_conf.singularity_exec def _bind_singularity(self, step, paths, arguments): return "{} run -B {} --app {} {} {}".format( @@ -69,8 +64,9 @@ def _bind_singularity(self, step, paths, arguments): arguments, ) - def _create_outputs(self, path): - if not path.exists(path): + @staticmethod + def _create_outputs(path): + if not os.path.exists(path): makedirs(path, exist_ok=True) return path @@ -97,8 +93,8 @@ def run( ) datastore = Datastore( - path.join(output_folder, "simulation"), - path.join( + os.path.join(output_folder, "simulation"), + os.path.join( output_folder, "phantom", "{}_phantom_merged_bundles.fib".format(run_name), @@ -108,7 +104,7 @@ def run( ) datastore.load_compartments( - path.join(output_folder, "phantom"), run_name, output_nifti + os.path.join(output_folder, "phantom"), run_name, output_nifti ) datastore.stage_compartments(run_name) @@ -140,17 +136,17 @@ def generate_phantom( base_output_folder = output_folder output_folder = self._create_outputs( - path.join(output_folder, "phantom") + os.path.join(output_folder, "phantom") ) - phantom_def = path.join( + phantom_def = os.path.join( phantom_infos["file_path"], phantom_infos["base_file"] ) resolution = ",".join([str(r) for r in phantom_infos["resolution"]]) spacing = ",".join([str(s) for s in phantom_infos["spacing"]]) fiber_fraction = "rel" if relative_fiber_fraction else "abs" - out_name = path.join( + out_name = os.path.join( output_folder, "phantom, " "{}_phantom".format(run_name) ) @@ -161,9 +157,9 @@ def generate_phantom( if output_nifti: arguments += " --nii" - bind_paths = ",".join([phantom_infos["file_path"], output_folder]) + bind_paths = ",".join([str(phantom_infos["file_path"]), str(output_folder)]) command = self._bind_singularity("phantom", bind_paths, arguments) - log_file = path.join(base_output_folder, "{}.log".format(run_name)) + log_file = os.path.join(base_output_folder, "{}.log".format(run_name)) self._run_command(command, log_file, "[PHANTOM]") loop_managed or self.stop() @@ -185,18 +181,18 @@ def simulate_diffusion_mri( bind_paths = [] if bind_paths is None else bind_paths base_output_folder = output_folder output_folder = self._create_outputs( - path.join(output_folder, "simulation") + os.path.join(output_folder, "simulation") ) name = "{}_simulation".format(run_name) - bind_paths += [simulation_infos["file_path"], output_folder] + bind_paths += [str(simulation_infos["file_path"]), str(output_folder)] bind_paths = ",".join(bind_paths) - ffp_file = path.join( + ffp_file = os.path.join( simulation_infos["file_path"], simulation_infos["param_file"] ) extension = "nii.gz" if output_nifti else "nrrd" - out_name = path.join(output_folder, "{}.{}".format(name, extension)) + out_name = os.path.join(output_folder, "{}.{}".format(name, extension)) if not compartments_staged and compartment_maps is not None: datastore = Datastore( @@ -211,7 +207,7 @@ def simulate_diffusion_mri( arguments = "-p {} -i {} -o {}".format(ffp_file, fibers_file, out_name) command = self._bind_singularity("diffusion mri", bind_paths, arguments) - log_file = path.join(base_output_folder, "{}.log".format(run_name)) + log_file = os.path.join(base_output_folder, "{}.log".format(run_name)) self._run_command(command, log_file, "[DIFFUSION MRI]") loop_managed or self.stop()