diff --git a/src/eddymotion/cli/run.py b/src/eddymotion/cli/run.py index b181e72b..ccb35e45 100644 --- a/src/eddymotion/cli/run.py +++ b/src/eddymotion/cli/run.py @@ -29,7 +29,7 @@ from eddymotion.estimator import EddyMotionEstimator -def main() -> None: +def main(argv=None) -> None: """ Entry point. @@ -37,7 +37,7 @@ def main() -> None: ------- None """ - args = parse_args() + args = parse_args(argv) # Open the data with the given file path dwi_dataset: DWI = DWI.from_filename(args.input_file) diff --git a/src/eddymotion/estimator.py b/src/eddymotion/estimator.py index 1423414c..89a77ef3 100644 --- a/src/eddymotion/estimator.py +++ b/src/eddymotion/estimator.py @@ -220,8 +220,8 @@ def _advanced_clip(data, p_min=35, p_max=99.98, nonnegative=True, dtype="int16", # Calculate stats on denoised version, to preempt outliers from biasing denoised = ndimage.median_filter(data, footprint=ball(3)) - a_min = np.percentile(denoised[denoised > 0] if nonnegative else denoised, p_min) - a_max = np.percentile(denoised[denoised > 0] if nonnegative else denoised, p_max) + a_min = np.percentile(denoised[denoised >= 0] if nonnegative else denoised, p_min) + a_max = np.percentile(denoised[denoised >= 0] if nonnegative else denoised, p_max) # Clip and cast data = np.clip(data, a_min=a_min, a_max=a_max) diff --git a/test/test_main.py b/test/test_main.py new file mode 100644 index 00000000..daffe19a --- /dev/null +++ b/test/test_main.py @@ -0,0 +1,69 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +# +# Copyright 2024 The NiPreps Developers +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# We support and encourage derived works from this project, please read +# about our expectations at +# +# https://www.nipreps.org/community/licensing/ +# + +import sys + +import pytest + +from eddymotion.__main__ import main + + +@pytest.fixture(autouse=True) +def set_command(monkeypatch): + with monkeypatch.context() as m: + m.setattr(sys, "argv", ["eddymotion"]) + yield + + +def test_help(capsys): + with pytest.raises(SystemExit): + main(["--help"]) + captured = capsys.readouterr() + assert captured.out.startswith("usage: eddymotion [-h]") + + +def test_main(tmp_path, datadir): + input_file = datadir / "dwi.h5" + + with pytest.raises(SystemExit): + main([str(input_file), str(tmp_path)]) + + with pytest.raises(SystemExit): + main( + [ + str(input_file), + "--models", + "b0", + "--omp_nthreads", + "1", + "--n_jobs", + "1", + "--seed", + "1234", + "--output_dir", + str(tmp_path), + ] + ) + # assert Path(output_dir).joinpath("dwi.h5").exists() # Empty + + # Also, call python -m eddymotion or eddymotion from CircleCI ??