Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ba3d2e6
Remove data_files entry
benoit-dubreuil Jun 29, 2022
3bc144e
Added default util
benoit-dubreuil Jun 29, 2022
e260acc
Added SingularityConfig class
benoit-dubreuil Jun 29, 2022
d7d6966
Format
benoit-dubreuil Jun 29, 2022
d6cf37f
Integrated SingularityConfig into legacy runner
benoit-dubreuil Jun 29, 2022
49d6d9f
Format
benoit-dubreuil Jun 29, 2022
14481bd
Format
benoit-dubreuil Jun 29, 2022
0bde314
Added singularity exec attribute to config
benoit-dubreuil Jun 29, 2022
8714a5e
Typo
benoit-dubreuil Jun 29, 2022
45247c0
Refactored config to include singularity attr
benoit-dubreuil Jun 29, 2022
825e4dc
Final integration of config in legacy runner
benoit-dubreuil Jun 29, 2022
2240b49
Final integration of config in new runner
benoit-dubreuil Jun 29, 2022
53b84fa
Removed deprecated config files
benoit-dubreuil Jun 29, 2022
19ef8c8
Import SingularityConfig when importing runner pkg
benoit-dubreuil Jun 29, 2022
d0bb89a
Bumped version
benoit-dubreuil Jun 29, 2022
f5b1a30
Merge pull request #1 from benoit-dubreuil/improv/remove-top-level-co…
benoit-dubreuil Jun 29, 2022
5839e78
Prefixed module with `_` so it has a different name than its pkg
benoit-dubreuil Jul 1, 2022
59019ef
Prefixed module with `_` so it has a different name than its pkg
benoit-dubreuil Jul 1, 2022
73b58f8
Prefixed module with `_` so it has a different name than its pkg
benoit-dubreuil Jul 1, 2022
54fe017
Merge pull request #2 from benoit-dubreuil/fix/modules-same-name-as-pkg
benoit-dubreuil Jul 1, 2022
bd10859
Bumped version
benoit-dubreuil Jul 1, 2022
109f4b4
Fragment os imports
benoit-dubreuil Jul 3, 2022
ec44af8
Use import instead of import-from for os.path.basename
benoit-dubreuil Jul 3, 2022
60960b1
Use import instead of import-from for os.path
benoit-dubreuil Jul 3, 2022
ed2d7b6
Fixed `_create_outputs` name shadowing of `os.path` due to param `path`
benoit-dubreuil Jul 3, 2022
9db96aa
Followed recommendation to make `_create_outputs` static
benoit-dubreuil Jul 3, 2022
b112af3
Merge pull request #3 from benoit-dubreuil/fix/param-import-same-names
benoit-dubreuil Jul 3, 2022
bcf88b5
Bumped version
benoit-dubreuil Jul 3, 2022
b786c19
Fixed str.join of Path results in an error
benoit-dubreuil Jul 4, 2022
26edbb5
Fixed str.join of Path results in an error
benoit-dubreuil Jul 4, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions config.json

This file was deleted.

13 changes: 0 additions & 13 deletions config.py

This file was deleted.

4 changes: 1 addition & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
),
Expand Down
7 changes: 7 additions & 0 deletions simulator/default.py
Original file line number Diff line number Diff line change
@@ -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"
2 changes: 1 addition & 1 deletion simulator/factory/common/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .common import AttributeAsDictClass
from ._common import AttributeAsDictClass
File renamed without changes.
2 changes: 1 addition & 1 deletion simulator/factory/geometry_factory/__init__.py
Original file line number Diff line number Diff line change
@@ -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
File renamed without changes.
2 changes: 1 addition & 1 deletion simulator/factory/simulation_factory/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .simulation_factory import SimulationFactory
from ._simulation_factory import SimulationFactory
File renamed without changes.
1 change: 1 addition & 0 deletions simulator/runner/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from .config import SingularityConfig
from .simulation_runner import SimulationRunner
10 changes: 10 additions & 0 deletions simulator/runner/config.py
Original file line number Diff line number Diff line change
@@ -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
35 changes: 14 additions & 21 deletions simulator/runner/legacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand All @@ -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"
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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]),
Expand All @@ -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,
Expand Down
52 changes: 24 additions & 28 deletions simulator/runner/simulation_runner.py
Original file line number Diff line number Diff line change
@@ -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()

Expand Down Expand Up @@ -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(
Expand All @@ -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
Expand All @@ -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),
Expand All @@ -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)

Expand Down Expand Up @@ -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)
)

Expand All @@ -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()
Expand All @@ -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(
Expand All @@ -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()