From 0d2cf01d16d7987cf93605ef72a4823941fec950 Mon Sep 17 00:00:00 2001 From: Tom Close Date: Tue, 19 Aug 2025 12:53:17 +1000 Subject: [PATCH 1/8] [skip ci] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index aeb7a9ca..7bc57ed0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# pydra-freesurfer +# pydra-tasks-freesurfer [![PyPI - Version][pypi-version]][pypi-project] [![PyPI - Python Version][pypi-pyversions]][pypi-project] @@ -40,7 +40,7 @@ to facilitate their integration into more advanced processing workflows. ## Installation ```console -pip install pydra-freesurfer +pip install pydra-tasks-freesurfer ``` A separate installation of FreeSurfer is required to use this package. @@ -181,18 +181,18 @@ This project is distributed under the terms of the [Apache License, Version 2.0] [pydra]: https://nipype.github.io/pydra -[pypi-downloads]: https://static.pepy.tech/badge/pydra-freesurfer +[pypi-downloads]: https://static.pepy.tech/badge/pydra-tasks-freesurfer -[pypi-project]: https://pypi.org/project/pydra-freesurfer +[pypi-project]: https://pypi.org/project/pydra-tasks-freesurfer -[pypi-pyversions]: https://img.shields.io/pypi/pyversions/pydra-freesurfer.svg +[pypi-pyversions]: https://img.shields.io/pypi/pyversions/pydra-tasks-freesurfer.svg -[pypi-version]: https://img.shields.io/pypi/v/pydra-freesurfer.svg +[pypi-version]: https://img.shields.io/pypi/v/pydra-tasks-freesurfer.svg [status-docs-badge]: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat -[status-cicd-badge]: https://github.com/nipype/pydra-freesurfer/actions/workflows/ci-cd.yaml/badge.svg +[status-cicd-badge]: https://github.com/nipype/pydra-tasks-freesurfer/actions/workflows/ci-cd.yaml/badge.svg -[status-docs-link]: https://nipype.github.io/pydra-freesurfer/ +[status-docs-link]: https://nipype.github.io/pydra-tasks-freesurfer/ -[status-cicd-link]: https://github.com/nipype/pydra-freesurfer/actions/workflows/ci-cd.yaml \ No newline at end of file +[status-cicd-link]: https://github.com/nipype/pydra-tasks-freesurfer/actions/workflows/ci-cd.yaml From 733e816892f85bab5f4dd2d8db115f1218a1d9b6 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Wed, 20 Aug 2025 12:04:33 +1000 Subject: [PATCH 2/8] cleaned up __init__ and added fileformats freesurfer as a dependency --- pydra/tasks/freesurfer/__init__.py | 16 ---------------- pyproject.toml | 4 ++++ 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/pydra/tasks/freesurfer/__init__.py b/pydra/tasks/freesurfer/__init__.py index 979e4e1c..3117bb39 100644 --- a/pydra/tasks/freesurfer/__init__.py +++ b/pydra/tasks/freesurfer/__init__.py @@ -18,21 +18,5 @@ "pydra-freesurfer has not been properly installed, please run " f"`pip install -e {str(pkg_path)}` to install a development version" ) -if "nipype" not in __version__: - try: - from .auto._version import nipype_version, nipype2pydra_version - except ImportError: - warn( - "Nipype interfaces haven't been automatically converted from their specs in " - f"`nipype-auto-conv`. Please run `{str(pkg_path / 'nipype-auto-conv' / 'generate')}` " - "to generated the converted Nipype interfaces in pydra.tasks.freesurfer.v7_4.auto" - ) - else: - n_ver = nipype_version.replace(".", "_") - n2p_ver = nipype2pydra_version.replace(".", "_") - __version__ += ( - "_" if "+" in __version__ else "+" - ) + f"nipype{n_ver}_nipype2pydra{n2p_ver}" - __all__ = ["__version__"] diff --git a/pyproject.toml b/pyproject.toml index 79f909cc..61a45488 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ dependencies = [ "fileformats >=0.15.4", "fileformats-datascience >=0.3.2", "fileformats-medimage >=0.10.5", + "fileformats-medimage_freesurfer", ] license = { file = "LICENSE" } authors = [{ name = "Nipype developers", email = "neuroimaging@python.org" }] @@ -119,3 +120,6 @@ ignore = ["FBT001", "FA"] [tool.ruff.lint.extend-per-file-ignores] "docs/conf.py" = ["INP001", "A001"] + +[tool.pyright] +reportAssignmentType = false From f895aa402826336779adacde82fd1098651d4530 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Fri, 22 Aug 2025 12:18:32 +1000 Subject: [PATCH 3/8] updated auto-conv generate --- nipype-auto-conv/generate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype-auto-conv/generate b/nipype-auto-conv/generate index d0be32c4..0b710bd3 100755 --- a/nipype-auto-conv/generate +++ b/nipype-auto-conv/generate @@ -25,7 +25,7 @@ echo "Running nipype2pydra conversion..." nipype2pydra convert $conv_dir/specs $conv_dir/.. echo "Committing converted tasks to ${CURRENT_BRANCH}-auto-conv..." -git add pydra/tasks/ants +git add pydra/tasks/freesurfer git commit -m "Auto-converted Nipype tasks to Pydra tasks" || echo true echo "Rebasing '$CURRENT_BRANCH' to apply changes..." From cac8f05742b79b51ac0f91346416dd771affe074 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Wed, 3 Sep 2025 10:59:46 +1000 Subject: [PATCH 4/8] added looseversion as a dep --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 61a45488..9743e9ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "fileformats-datascience >=0.3.2", "fileformats-medimage >=0.10.5", "fileformats-medimage_freesurfer", + "looseversion>=1.3.0", ] license = { file = "LICENSE" } authors = [{ name = "Nipype developers", email = "neuroimaging@python.org" }] From 1d238f7e8bbe18223bc4e06532ee0f663fe0d075 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Wed, 3 Sep 2025 11:12:02 +1000 Subject: [PATCH 5/8] Auto-converted Nipype tasks to Pydra tasks --- pydra/tasks/freesurfer/v8/__init__.py | 1 + pydra/tasks/freesurfer/v8/_post_release.py | 9 +- .../v8/longitudinal/fuse_segmentations.py | 8 +- .../v8/longitudinal/robust_template.py | 24 +- .../v8/longitudinal/tests/conftest.py | 3 +- pydra/tasks/freesurfer/v8/model/binarize.py | 14 +- .../tasks/freesurfer/v8/model/concatenate.py | 10 +- pydra/tasks/freesurfer/v8/model/glm_fit.py | 38 +-- .../freesurfer/v8/model/label_2_annot.py | 12 +- .../freesurfer/v8/model/label_2_label.py | 16 +- .../tasks/freesurfer/v8/model/label_2_vol.py | 34 +-- .../tasks/freesurfer/v8/model/mris_preproc.py | 18 +- .../v8/model/mris_preproc_recon_all.py | 30 +- pydra/tasks/freesurfer/v8/model/ms__lda.py | 20 +- .../freesurfer/v8/model/one_sample_t_test.py | 18 +- pydra/tasks/freesurfer/v8/model/seg_stats.py | 30 +- .../v8/model/seg_stats_recon_all.py | 60 ++-- .../freesurfer/v8/model/spherical_average.py | 18 +- .../freesurfer/v8/model/tests/conftest.py | 3 +- .../freesurfer/v8/nipype_ports/__init__.py | 3 + .../v8/nipype_ports/interfaces/io.py | 273 +++--------------- .../v8/nipype_ports/utils/filemanip.py | 1 + .../tasks/freesurfer/v8/petsurfer/gtm_seg.py | 6 +- pydra/tasks/freesurfer/v8/petsurfer/gtmpvc.py | 40 +-- pydra/tasks/freesurfer/v8/petsurfer/logan.py | 40 +-- pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py | 40 +-- pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py | 40 +-- .../freesurfer/v8/petsurfer/tests/conftest.py | 3 +- .../v8/preprocess/apply_vol_transform.py | 40 +-- .../freesurfer/v8/preprocess/bb_register.py | 16 +- .../freesurfer/v8/preprocess/ca_label.py | 16 +- .../freesurfer/v8/preprocess/ca_normalize.py | 12 +- .../freesurfer/v8/preprocess/ca_register.py | 10 +- .../v8/preprocess/concatenate_lta.py | 34 +-- .../v8/preprocess/edit_w_mwith_aseg.py | 10 +- .../freesurfer/v8/preprocess/fit_ms_params.py | 8 +- .../v8/preprocess/mni_bias_correction.py | 10 +- .../v8/preprocess/mr_is_ca_label.py | 18 +- .../freesurfer/v8/preprocess/mri_convert.py | 28 +- .../freesurfer/v8/preprocess/normalize.py | 10 +- .../v8/preprocess/parse_dicom_dir.py | 6 +- .../freesurfer/v8/preprocess/recon_all.py | 120 ++++---- .../freesurfer/v8/preprocess/resample.py | 6 +- .../v8/preprocess/robust_register.py | 16 +- .../freesurfer/v8/preprocess/segment_cc.py | 14 +- .../freesurfer/v8/preprocess/segment_wm.py | 4 +- .../tasks/freesurfer/v8/preprocess/smooth.py | 18 +- .../v8/preprocess/synthesize_flash.py | 14 +- .../v8/preprocess/tests/conftest.py | 3 +- .../v8/preprocess/unpack_sdicom_dir.py | 18 +- .../v8/preprocess/watershed_skull_strip.py | 8 +- .../freesurfer/v8/registration/em_register.py | 14 +- .../v8/registration/mp_rto_mni305.py | 14 +- .../freesurfer/v8/registration/mri_coreg.py | 34 +-- .../tasks/freesurfer/v8/registration/paint.py | 8 +- .../freesurfer/v8/registration/register.py | 16 +- .../registration/register_av_ito_talairach.py | 8 +- .../v8/registration/tests/conftest.py | 3 +- .../v8/utils/add_x_form_to_header.py | 14 +- .../tasks/freesurfer/v8/utils/aparc_2_aseg.py | 28 +- .../tasks/freesurfer/v8/utils/apas_2_aseg.py | 4 +- .../v8/utils/check_talairach_alignment.py | 6 +- pydra/tasks/freesurfer/v8/utils/contrast.py | 16 +- pydra/tasks/freesurfer/v8/utils/curvature.py | 4 +- .../freesurfer/v8/utils/curvature_stats.py | 14 +- .../tasks/freesurfer/v8/utils/euler_number.py | 4 +- .../v8/utils/extract_main_component.py | 2 +- .../tasks/freesurfer/v8/utils/fix_topology.py | 16 +- pydra/tasks/freesurfer/v8/utils/image_info.py | 20 +- pydra/tasks/freesurfer/v8/utils/jacobian.py | 6 +- .../tasks/freesurfer/v8/utils/lta_convert.py | 2 +- .../v8/utils/make_average_subject.py | 4 +- .../freesurfer/v8/utils/make_surfaces.py | 26 +- pydra/tasks/freesurfer/v8/utils/mr_is_calc.py | 10 +- .../freesurfer/v8/utils/mr_is_combine.py | 4 +- .../freesurfer/v8/utils/mr_is_convert.py | 32 +- .../tasks/freesurfer/v8/utils/mr_is_expand.py | 16 +- .../freesurfer/v8/utils/mr_is_inflate.py | 6 +- pydra/tasks/freesurfer/v8/utils/mri_fill.py | 8 +- .../freesurfer/v8/utils/mri_marching_cubes.py | 14 +- .../tasks/freesurfer/v8/utils/mri_pretess.py | 8 +- .../freesurfer/v8/utils/mri_tessellate.py | 14 +- .../freesurfer/v8/utils/parcellation_stats.py | 64 ++-- .../v8/utils/relabel_hypointensities.py | 10 +- .../v8/utils/remove_intersection.py | 4 +- .../tasks/freesurfer/v8/utils/remove_neck.py | 8 +- .../freesurfer/v8/utils/sample_to_surface.py | 36 +-- .../v8/utils/smooth_tessellation.py | 6 +- pydra/tasks/freesurfer/v8/utils/sphere.py | 6 +- .../v8/utils/surface_2_vol_transform.py | 12 +- .../freesurfer/v8/utils/surface_smooth.py | 14 +- .../freesurfer/v8/utils/surface_snapshots.py | 16 +- .../freesurfer/v8/utils/surface_transform.py | 18 +- .../freesurfer/v8/utils/talairach_avi.py | 4 +- .../tasks/freesurfer/v8/utils/talairach_qc.py | 4 +- .../freesurfer/v8/utils/tests/conftest.py | 3 +- .../tasks/freesurfer/v8/utils/tkregister_2.py | 34 +-- .../tasks/freesurfer/v8/utils/volume_mask.py | 22 +- 98 files changed, 854 insertions(+), 1033 deletions(-) diff --git a/pydra/tasks/freesurfer/v8/__init__.py b/pydra/tasks/freesurfer/v8/__init__.py index f4d5a17d..bab42270 100644 --- a/pydra/tasks/freesurfer/v8/__init__.py +++ b/pydra/tasks/freesurfer/v8/__init__.py @@ -19,6 +19,7 @@ _cifs_table, _generate_cifs_table, _parse_mount_table, + config, copyfile, ensure_list, fmlogger, diff --git a/pydra/tasks/freesurfer/v8/_post_release.py b/pydra/tasks/freesurfer/v8/_post_release.py index c03671d5..a2a66c9f 100644 --- a/pydra/tasks/freesurfer/v8/_post_release.py +++ b/pydra/tasks/freesurfer/v8/_post_release.py @@ -1,6 +1,5 @@ -# Auto-generated by /Users/tclo7153/.pyenv/versions/pydra-tasks-freesurfer/lib/python3.13/site-packages/nipype2pydra/package.py, do not edit as it will be overwritten +# Auto-generated by /Users/tclo7153/git/workflows/nipype2pydra/nipype2pydra/package.py, do not edit as it will be overwritten -src_pkg_version = "1.10.0" -nipype2pydra_version = "0.5.0" -post_release = "1100050" - \ No newline at end of file +src_pkg_version = "1.11.0" +nipype2pydra_version = "0.5.1" +post_release = "1110051" diff --git a/pydra/tasks/freesurfer/v8/longitudinal/fuse_segmentations.py b/pydra/tasks/freesurfer/v8/longitudinal/fuse_segmentations.py index 1713a35c..9bfc996b 100644 --- a/pydra/tasks/freesurfer/v8/longitudinal/fuse_segmentations.py +++ b/pydra/tasks/freesurfer/v8/longitudinal/fuse_segmentations.py @@ -52,10 +52,10 @@ class FuseSegmentations(shell.Task["FuseSegmentations.Outputs"]): >>> from pydra.utils.typing import MultiInputObj >>> task = FuseSegmentations() - >>> task.inputs.subject_id = "tp.long.A.template" - >>> task.inputs.out_file = "aseg.fused.mgz" - >>> task.inputs.in_segmentations_noCC = [MghGz.mock("aseg.mgz"), MghGz.mock("aseg.mgz")] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.subject_id = "tp.long.A.template" + >>> task.out_file = "aseg.fused.mgz" + >>> task.in_segmentations_noCC = [MghGz.mock("aseg.mgz"), MghGz.mock("aseg.mgz")] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/longitudinal/robust_template.py b/pydra/tasks/freesurfer/v8/longitudinal/robust_template.py index 3084f574..86c5c211 100644 --- a/pydra/tasks/freesurfer/v8/longitudinal/robust_template.py +++ b/pydra/tasks/freesurfer/v8/longitudinal/robust_template.py @@ -22,10 +22,10 @@ def _format_arg(name, value, inputs, argstr): return argstr.format(**{name: {"mean": 0, "median": 1}[value]}) if name in ("transform_outputs", "scaled_intensity_outputs"): value = _list_outputs( - scaled_intensity_outputs=inputs["scaled_intensity_outputs"], in_files=inputs["in_files"], - transform_outputs=inputs["transform_outputs"], out_file=inputs["out_file"], + scaled_intensity_outputs=inputs["scaled_intensity_outputs"], + transform_outputs=inputs["transform_outputs"], )[name] return argstr.format(**inputs) @@ -91,26 +91,26 @@ class RobustTemplate(shell.Task["RobustTemplate.Outputs"]): >>> from pydra.tasks.freesurfer.v8.longitudinal.robust_template import RobustTemplate >>> task = RobustTemplate() - >>> task.inputs.in_files = [Nifti1.mock("structural.nii"), Nifti1.mock("functional.nii")] - >>> task.inputs.out_file = "T1.nii" - >>> task.inputs.subsample_threshold = 200 - >>> task.inputs.average_metric = "mean" - >>> task.inputs.fixed_timepoint = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_files = [Nifti1.mock("structural.nii"), Nifti1.mock("functional.nii")] + >>> task.out_file = "T1.nii" + >>> task.subsample_threshold = 200 + >>> task.average_metric = "mean" + >>> task.fixed_timepoint = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' >>> task = RobustTemplate() - >>> task.inputs.transform_outputs = ["structural.lta", "functional.lta"] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.transform_outputs = ["structural.lta", "functional.lta"] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' >>> task = RobustTemplate() - >>> task.inputs.transform_outputs = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.transform_outputs = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/longitudinal/tests/conftest.py b/pydra/tasks/freesurfer/v8/longitudinal/tests/conftest.py index 751042d7..8c8af146 100644 --- a/pydra/tasks/freesurfer/v8/longitudinal/tests/conftest.py +++ b/pydra/tasks/freesurfer/v8/longitudinal/tests/conftest.py @@ -1,4 +1,3 @@ - # For debugging in IDE's don't catch raised exceptions and let the IDE # break at it import os @@ -16,7 +15,7 @@ def pytest_internalerror(excinfo): raise excinfo.value # raise internal errors instead of capturing them def pytest_configure(config): - config.option.capture = 'no' # allow print statements to show up in the console + config.option.capture = "no" # allow print statements to show up in the console config.option.log_cli = True # show log messages in the console config.option.log_level = "INFO" # set the log level to INFO diff --git a/pydra/tasks/freesurfer/v8/model/binarize.py b/pydra/tasks/freesurfer/v8/model/binarize.py index 3fc2e819..f498870f 100644 --- a/pydra/tasks/freesurfer/v8/model/binarize.py +++ b/pydra/tasks/freesurfer/v8/model/binarize.py @@ -98,7 +98,7 @@ def binary_file_default(inputs): @shell.define( - xor=[["wm_ven_csf", "max"], ["min", "max", "wm_ven_csf"], ["min", "wm_ven_csf"]] + xor=[["max", "min", "wm_ven_csf"], ["max", "wm_ven_csf"], ["min", "wm_ven_csf"]] ) class Binarize(shell.Task["Binarize.Outputs"]): """ @@ -111,12 +111,12 @@ class Binarize(shell.Task["Binarize.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.binarize import Binarize >>> task = Binarize() - >>> task.inputs.in_file = Nifti1.mock("structural.nii") - >>> task.inputs.min = 10 - >>> task.inputs.binary_file = "foo_out.nii" - >>> task.inputs.merge_file = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Nifti1.mock("structural.nii") + >>> task.min = 10 + >>> task.binary_file = "foo_out.nii" + >>> task.merge_file = File.mock() + >>> task.mask_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/concatenate.py b/pydra/tasks/freesurfer/v8/model/concatenate.py index 4261b1bb..a861a897 100644 --- a/pydra/tasks/freesurfer/v8/model/concatenate.py +++ b/pydra/tasks/freesurfer/v8/model/concatenate.py @@ -34,10 +34,10 @@ class Concatenate(shell.Task["Concatenate.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.concatenate import Concatenate >>> task = Concatenate() - >>> task.inputs.in_files = [Nifti1.mock("cont1.nii"), Nifti1.mock("cont2.nii")] - >>> task.inputs.multiply_matrix_file = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_files = [Nifti1.mock("cont1.nii"), Nifti1.mock("cont2.nii")] + >>> task.multiply_matrix_file = File.mock() + >>> task.mask_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_concat --o bar.nii --i cont1.nii --i cont2.nii' @@ -75,7 +75,7 @@ class Concatenate(shell.Task["Concatenate.Outputs"]): help="Multiply input by an ascii matrix in file", argstr="--mtx {multiply_matrix_file}", ) - combine_: bool = shell.arg( + combine: bool = shell.arg( help="Combine non-zero values into single frame volume", argstr="--combine" ) keep_dtype: bool = shell.arg( diff --git a/pydra/tasks/freesurfer/v8/model/glm_fit.py b/pydra/tasks/freesurfer/v8/model/glm_fit.py index 98bc824f..4ae473e1 100644 --- a/pydra/tasks/freesurfer/v8/model/glm_fit.py +++ b/pydra/tasks/freesurfer/v8/model/glm_fit.py @@ -229,17 +229,17 @@ def glm_dir_default(inputs): @shell.define( xor=[ - ["weight_inv", "weighted_ls"], - ["weighted_ls", "weight_sqrt"], - ["design", "one_sample", "contrast", "fsgd"], - ["nii", "nii_gz"], + ["contrast", "design", "fsgd", "one_sample"], + ["cortex", "label_file"], ["design", "fsgd", "one_sample"], - ["weight_inv", "weighted_ls", "weight_file", "weight_sqrt"], - ["prune_thresh", "no_prune"], + ["fixed_fx_dof", "fixed_fx_dof_file"], + ["nii", "nii_gz"], + ["no_prune", "prunethresh"], + ["noprune", "prune_thresh"], + ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], - ["fixed_fx_dof_file", "fixed_fx_dof"], - ["no_prune", "prune_thresh"], - ["cortex", "label_file"], + ["weight_inv", "weighted_ls"], + ["weight_sqrt", "weighted_ls"], ] ) class GLMFit(shell.Task["GLMFit.Outputs"]): @@ -253,16 +253,16 @@ class GLMFit(shell.Task["GLMFit.Outputs"]): >>> from pydra.utils.typing import MultiOutputType >>> task = GLMFit() - >>> task.inputs.in_file = Nifti1.mock("functional.nii") - >>> task.inputs.design = File.mock() - >>> task.inputs.weighted_ls = File.mock() - >>> task.inputs.fixed_fx_var = File.mock() - >>> task.inputs.fixed_fx_dof_file = File.mock() - >>> task.inputs.weight_file = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.label_file = File.mock() - >>> task.inputs.sim_done_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Nifti1.mock("functional.nii") + >>> task.design = File.mock() + >>> task.weighted_ls = File.mock() + >>> task.fixed_fx_var = File.mock() + >>> task.fixed_fx_dof_file = File.mock() + >>> task.weight_file = File.mock() + >>> task.mask_file = File.mock() + >>> task.label_file = File.mock() + >>> task.sim_done_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/label_2_annot.py b/pydra/tasks/freesurfer/v8/model/label_2_annot.py index a1f5d6a7..f72c4dc5 100644 --- a/pydra/tasks/freesurfer/v8/model/label_2_annot.py +++ b/pydra/tasks/freesurfer/v8/model/label_2_annot.py @@ -39,12 +39,12 @@ class Label2Annot(shell.Task["Label2Annot.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.label_2_annot import Label2Annot >>> task = Label2Annot() - >>> task.inputs.hemisphere = "lh" - >>> task.inputs.in_labels = ["lh.aparc.label"] - >>> task.inputs.out_annot = "test" - >>> task.inputs.orig = File.mock() - >>> task.inputs.color_table = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.hemisphere = "lh" + >>> task.in_labels = ["lh.aparc.label"] + >>> task.out_annot = "test" + >>> task.orig = File.mock() + >>> task.color_table = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/label_2_label.py b/pydra/tasks/freesurfer/v8/model/label_2_label.py index 020cb118..ed00f932 100644 --- a/pydra/tasks/freesurfer/v8/model/label_2_label.py +++ b/pydra/tasks/freesurfer/v8/model/label_2_label.py @@ -22,14 +22,14 @@ class Label2Label(shell.Task["Label2Label.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.label_2_label import Label2Label >>> task = Label2Label() - >>> task.inputs.hemisphere = "lh" - >>> task.inputs.sphere_reg = Pial.mock("lh.pial") - >>> task.inputs.white = File.mock() - >>> task.inputs.source_sphere_reg = File.mock() - >>> task.inputs.source_white = Pial.mock("lh.pial") - >>> task.inputs.source_label = File.mock() - >>> task.inputs.source_subject = "fsaverage" - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.hemisphere = "lh" + >>> task.sphere_reg = Pial.mock("lh.pial") + >>> task.white = File.mock() + >>> task.source_sphere_reg = File.mock() + >>> task.source_white = Pial.mock("lh.pial") + >>> task.source_label = File.mock() + >>> task.source_subject = "fsaverage" + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/label_2_vol.py b/pydra/tasks/freesurfer/v8/model/label_2_vol.py index 5ffc49ba..c304168d 100644 --- a/pydra/tasks/freesurfer/v8/model/label_2_vol.py +++ b/pydra/tasks/freesurfer/v8/model/label_2_vol.py @@ -17,7 +17,7 @@ def _gen_filename(name, inputs): if name == "vol_label_file": return _list_outputs( - vol_label_file=inputs["vol_label_file"], aparc_aseg=inputs["aparc_aseg"] + aparc_aseg=inputs["aparc_aseg"], vol_label_file=inputs["vol_label_file"] )[name] return None @@ -28,8 +28,8 @@ def vol_label_file_default(inputs): @shell.define( xor=[ - ["aparc_aseg", "label_file", "annot_file", "seg_file"], - ["reg_header", "identity", "reg_file"], + ["annot_file", "aparc_aseg", "label_file", "seg_file"], + ["identity", "reg_file", "reg_header"], ] ) class Label2Vol(shell.Task["Label2Vol.Outputs"]): @@ -44,17 +44,17 @@ class Label2Vol(shell.Task["Label2Vol.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.label_2_vol import Label2Vol >>> task = Label2Vol() - >>> task.inputs.label_file = [Label.mock("c"), Label.mock("o"), Label.mock("r"), Label.mock("t"), Label.mock("e"), Label.mock("x"), Label.mock("."), Label.mock("l"), Label.mock("a"), Label.mock("b"), Label.mock("e"), Label.mock("l")] - >>> task.inputs.annot_file = File.mock() - >>> task.inputs.seg_file = File.mock() - >>> task.inputs.template_file = Nifti1.mock("structural.nii") - >>> task.inputs.reg_file = Dat.mock("register.dat") - >>> task.inputs.reg_header = File.mock() - >>> task.inputs.fill_thresh = 0.5 - >>> task.inputs.vol_label_file = "foo_out.nii" - >>> task.inputs.label_hit_file = File.mock() - >>> task.inputs.map_label_stat = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.label_file = [Label.mock("c"), Label.mock("o"), Label.mock("r"), Label.mock("t"), Label.mock("e"), Label.mock("x"), Label.mock("."), Label.mock("l"), Label.mock("a"), Label.mock("b"), Label.mock("e"), Label.mock("l")] + >>> task.annot_file = File.mock() + >>> task.seg_file = File.mock() + >>> task.template_file = Nifti1.mock("structural.nii") + >>> task.reg_file = Dat.mock("register.dat") + >>> task.reg_header = File.mock() + >>> task.fill_thresh = 0.5 + >>> task.vol_label_file = "foo_out.nii" + >>> task.label_hit_file = File.mock() + >>> task.map_label_stat = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -68,7 +68,7 @@ class Label2Vol(shell.Task["Label2Vol.Outputs"]): annot_file: File | None = shell.arg( help="surface annotation file", argstr="--annot {annot_file}", - requires=["subject_id", "hemi"], + requires=("subject_id", "hemi"), ) seg_file: File | None = shell.arg( help="segmentation file", argstr="--seg {seg_file}" @@ -99,7 +99,7 @@ class Label2Vol(shell.Task["Label2Vol.Outputs"]): proj: ty.Any = shell.arg( help="project along surface normal", argstr="--proj {proj[0]} {proj[1]} {proj[2]} {proj[3]}", - requires=["subject_id", "hemi"], + requires=("subject_id", "hemi"), ) subject_id: str = shell.arg(help="subject id", argstr="--subject {subject_id}") hemi: ty.Any = shell.arg(help="hemisphere to use lh or rh", argstr="--hemi {hemi}") @@ -128,7 +128,7 @@ class Outputs(shell.Outputs): ) -def _list_outputs(vol_label_file=None, aparc_aseg=None): +def _list_outputs(aparc_aseg=None, vol_label_file=None): self_dict = {} outputs = {} outfile = vol_label_file diff --git a/pydra/tasks/freesurfer/v8/model/mris_preproc.py b/pydra/tasks/freesurfer/v8/model/mris_preproc.py index 3e523e6e..024d03cd 100644 --- a/pydra/tasks/freesurfer/v8/model/mris_preproc.py +++ b/pydra/tasks/freesurfer/v8/model/mris_preproc.py @@ -15,7 +15,7 @@ def _gen_filename(name, inputs): if name == "out_file": return _list_outputs( - hemi=inputs["hemi"], target=inputs["target"], out_file=inputs["out_file"] + hemi=inputs["hemi"], out_file=inputs["out_file"], target=inputs["target"] )[name] return None @@ -26,10 +26,10 @@ def out_file_default(inputs): @shell.define( xor=[ + ["fsgd_file", "subject_file", "subjects"], + ["fwhm", "num_iters"], ["fwhm_source", "num_iters_source"], ["surf_area", "surf_measure", "surf_measure_file"], - ["fwhm", "num_iters"], - ["fsgd_file", "subject_file", "subjects"], ] ) class MRISPreproc(shell.Task["MRISPreproc.Outputs"]): @@ -43,11 +43,11 @@ class MRISPreproc(shell.Task["MRISPreproc.Outputs"]): >>> from pydra.utils.typing import MultiInputObj >>> task = MRISPreproc() - >>> task.inputs.target = "fsaverage" - >>> task.inputs.fsgd_file = File.mock() - >>> task.inputs.subject_file = File.mock() - >>> task.inputs.vol_measure_file = [("cont1.nii", "register.dat"), ("cont1a.nii", "register.dat")] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.target = "fsaverage" + >>> task.fsgd_file = File.mock() + >>> task.subject_file = File.mock() + >>> task.vol_measure_file = [("cont1.nii", "register.dat"), ("cont1a.nii", "register.dat")] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -121,7 +121,7 @@ class Outputs(shell.Outputs): ) -def _list_outputs(hemi=None, target=None, out_file=None): +def _list_outputs(hemi=None, out_file=None, target=None): outputs = {} outfile = out_file outputs["out_file"] = outfile diff --git a/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py b/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py index a97d39e3..40331ac9 100644 --- a/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py +++ b/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py @@ -41,7 +41,7 @@ def surf_measure_file_formatter(field, inputs): def _gen_filename(name, inputs): if name == "out_file": return _list_outputs( - hemi=inputs["hemi"], target=inputs["target"], out_file=inputs["out_file"] + hemi=inputs["hemi"], out_file=inputs["out_file"], target=inputs["target"] )[name] return None @@ -52,11 +52,11 @@ def out_file_default(inputs): @shell.define( xor=[ - ["fwhm", "num_iters"], + ["fsgd_file", "subject_file", "subject_id", "subjects"], ["fsgd_file", "subject_file", "subjects"], - ["surf_area", "surf_measure", "surf_measure_file"], + ["fwhm", "num_iters"], ["fwhm_source", "num_iters_source"], - ["fsgd_file", "subject_file", "subjects", "subject_id"], + ["surf_area", "surf_measure", "surf_measure_file"], ] ) class MRISPreprocReconAll(shell.Task["MRISPreprocReconAll.Outputs"]): @@ -70,14 +70,14 @@ class MRISPreprocReconAll(shell.Task["MRISPreprocReconAll.Outputs"]): >>> from pydra.utils.typing import MultiInputObj >>> task = MRISPreprocReconAll() - >>> task.inputs.surf_measure_file = File.mock() - >>> task.inputs.lh_surfreg_target = File.mock() - >>> task.inputs.rh_surfreg_target = File.mock() - >>> task.inputs.target = "fsaverage" - >>> task.inputs.fsgd_file = File.mock() - >>> task.inputs.subject_file = File.mock() - >>> task.inputs.vol_measure_file = [("cont1.nii", "register.dat"), ("cont1a.nii", "register.dat")] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.surf_measure_file = File.mock() + >>> task.lh_surfreg_target = File.mock() + >>> task.rh_surfreg_target = File.mock() + >>> task.target = "fsaverage" + >>> task.fsgd_file = File.mock() + >>> task.subject_file = File.mock() + >>> task.vol_measure_file = [("cont1.nii", "register.dat"), ("cont1a.nii", "register.dat")] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -93,10 +93,10 @@ class MRISPreprocReconAll(shell.Task["MRISPreprocReconAll.Outputs"]): requires=["lh_surfreg_target", "rh_surfreg_target"], formatter="surfreg_files_formatter", ) - lh_surfreg_target: File | None = shell.arg( + lh_surfreg_target: File = shell.arg( help="Implicit target surface registration file", requires=["surfreg_files"] ) - rh_surfreg_target: File | None = shell.arg( + rh_surfreg_target: File = shell.arg( help="Implicit target surface registration file", requires=["surfreg_files"] ) subject_id: ty.Any | None = shell.arg( @@ -169,7 +169,7 @@ class Outputs(shell.Outputs): ) -def _list_outputs(hemi=None, target=None, out_file=None): +def _list_outputs(hemi=None, out_file=None, target=None): outputs = {} outfile = out_file outputs["out_file"] = outfile diff --git a/pydra/tasks/freesurfer/v8/model/ms__lda.py b/pydra/tasks/freesurfer/v8/model/ms__lda.py index 4a39a413..e5253113 100644 --- a/pydra/tasks/freesurfer/v8/model/ms__lda.py +++ b/pydra/tasks/freesurfer/v8/model/ms__lda.py @@ -73,16 +73,16 @@ class MS_LDA(shell.Task["MS_LDA.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.ms__lda import MS_LDA >>> task = MS_LDA() - >>> task.inputs.lda_labels = [grey_label, white_label] - >>> task.inputs.weight_file = "weights.txt" - >>> task.inputs.vol_synth_file = "synth_out.mgz" - >>> task.inputs.label_file = MghGz.mock("label.mgz") - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.shift = zero_value - >>> task.inputs.conform = True - >>> task.inputs.use_weights = True - >>> task.inputs.images = [MghGz.mock("FLASH1.mgz"), MghGz.mock("FLASH2.mgz"), MghGz.mock("FLASH3.mgz")] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.lda_labels = [grey_label, white_label] + >>> task.weight_file = "weights.txt" + >>> task.vol_synth_file = "synth_out.mgz" + >>> task.label_file = MghGz.mock("label.mgz") + >>> task.mask_file = File.mock() + >>> task.shift = zero_value + >>> task.conform = True + >>> task.use_weights = True + >>> task.images = [MghGz.mock("FLASH1.mgz"), MghGz.mock("FLASH2.mgz"), MghGz.mock("FLASH3.mgz")] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py b/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py index 4ad45381..41f97d1c 100644 --- a/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py +++ b/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py @@ -228,17 +228,17 @@ def glm_dir_default(inputs): @shell.define( xor=[ - ["weight_inv", "weighted_ls"], - ["weighted_ls", "weight_sqrt"], - ["design", "one_sample", "contrast", "fsgd"], - ["nii", "nii_gz"], + ["contrast", "design", "fsgd", "one_sample"], + ["cortex", "label_file"], ["design", "fsgd", "one_sample"], - ["weight_inv", "weighted_ls", "weight_file", "weight_sqrt"], - ["prune_thresh", "no_prune"], + ["fixed_fx_dof", "fixed_fx_dof_file"], + ["nii", "nii_gz"], + ["no_prune", "prunethresh"], + ["noprune", "prune_thresh"], + ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], - ["fixed_fx_dof_file", "fixed_fx_dof"], - ["no_prune", "prune_thresh"], - ["cortex", "label_file"], + ["weight_inv", "weighted_ls"], + ["weight_sqrt", "weighted_ls"], ] ) class OneSampleTTest(shell.Task["OneSampleTTest.Outputs"]): diff --git a/pydra/tasks/freesurfer/v8/model/seg_stats.py b/pydra/tasks/freesurfer/v8/model/seg_stats.py index f1af3cb5..ac414af9 100644 --- a/pydra/tasks/freesurfer/v8/model/seg_stats.py +++ b/pydra/tasks/freesurfer/v8/model/seg_stats.py @@ -25,8 +25,8 @@ def _format_arg(name, value, inputs, argstr): fname = _list_outputs( annot=inputs["annot"], segmentation_file=inputs["segmentation_file"], - surf_label=inputs["surf_label"], summary_file=inputs["summary_file"], + surf_label=inputs["surf_label"], )[name] else: fname = value @@ -105,8 +105,8 @@ def _gen_filename(name, inputs): return _list_outputs( annot=inputs["annot"], segmentation_file=inputs["segmentation_file"], - surf_label=inputs["surf_label"], summary_file=inputs["summary_file"], + surf_label=inputs["surf_label"], )[name] return None @@ -117,8 +117,8 @@ def summary_file_default(inputs): @shell.define( xor=[ - ["segmentation_file", "surf_label", "annot"], - ["default_color_table", "color_table_file", "gca_color_table"], + ["annot", "segmentation_file", "surf_label"], + ["color_table_file", "default_color_table", "gca_color_table"], ] ) class SegStats(shell.Task["SegStats.Outputs"]): @@ -131,17 +131,17 @@ class SegStats(shell.Task["SegStats.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.seg_stats import SegStats >>> task = SegStats() - >>> task.inputs.segmentation_file = File.mock() - >>> task.inputs.annot = ("PWS04", "lh", "aparc") - >>> task.inputs.summary_file = "summary.stats" - >>> task.inputs.partial_volume_file = File.mock() - >>> task.inputs.in_file = File.mock() - >>> task.inputs.color_table_file = File.mock() - >>> task.inputs.gca_color_table = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.brainmask_file = File.mock() - >>> task.inputs.in_intensity = File.mock() - >>> task.inputs.subjects_dir = Directory.mock(".") + >>> task.segmentation_file = File.mock() + >>> task.annot = ("PWS04", "lh", "aparc") + >>> task.summary_file = "summary.stats" + >>> task.partial_volume_file = File.mock() + >>> task.in_file = File.mock() + >>> task.color_table_file = File.mock() + >>> task.gca_color_table = File.mock() + >>> task.mask_file = File.mock() + >>> task.brainmask_file = File.mock() + >>> task.in_intensity = File.mock() + >>> task.subjects_dir = Directory.mock(".") >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/seg_stats_recon_all.py b/pydra/tasks/freesurfer/v8/model/seg_stats_recon_all.py index b899a97f..6e7f92b3 100644 --- a/pydra/tasks/freesurfer/v8/model/seg_stats_recon_all.py +++ b/pydra/tasks/freesurfer/v8/model/seg_stats_recon_all.py @@ -29,8 +29,8 @@ def _format_arg(name, value, inputs, argstr): fname = _list_outputs( annot=inputs["annot"], segmentation_file=inputs["segmentation_file"], - surf_label=inputs["surf_label"], summary_file=inputs["summary_file"], + surf_label=inputs["surf_label"], )[name] else: fname = value @@ -114,8 +114,8 @@ def _gen_filename(name, inputs): return _list_outputs( annot=inputs["annot"], segmentation_file=inputs["segmentation_file"], - surf_label=inputs["surf_label"], summary_file=inputs["summary_file"], + surf_label=inputs["surf_label"], )[name] return None @@ -126,8 +126,8 @@ def summary_file_default(inputs): @shell.define( xor=[ - ["segmentation_file", "surf_label", "annot"], - ["default_color_table", "color_table_file", "gca_color_table"], + ["annot", "segmentation_file", "surf_label"], + ["color_table_file", "default_color_table", "gca_color_table"], ] ) class SegStatsReconAll(shell.Task["SegStatsReconAll.Outputs"]): @@ -142,32 +142,32 @@ class SegStatsReconAll(shell.Task["SegStatsReconAll.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.seg_stats_recon_all import SegStatsReconAll >>> task = SegStatsReconAll() - >>> task.inputs.ribbon = MghGz.mock("wm.mgz") - >>> task.inputs.presurf_seg = MghGz.mock("wm.mgz") - >>> task.inputs.transform = File.mock() - >>> task.inputs.lh_orig_nofix = File.mock() - >>> task.inputs.rh_orig_nofix = Pial.mock("lh.pial") - >>> task.inputs.lh_white = File.mock() - >>> task.inputs.rh_white = Pial.mock("lh.pial") - >>> task.inputs.lh_pial = File.mock() - >>> task.inputs.rh_pial = Pial.mock("lh.pial") - >>> task.inputs.aseg = File.mock() - >>> task.inputs.segmentation_file = File.mock() - >>> task.inputs.annot = ("PWS04", "lh", "aparc") - >>> task.inputs.summary_file = "summary.stats" - >>> task.inputs.partial_volume_file = File.mock() - >>> task.inputs.in_file = File.mock() - >>> task.inputs.color_table_file = File.mock() - >>> task.inputs.gca_color_table = File.mock() - >>> task.inputs.cortex_vol_from_surf = True - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.brain_vol = "brain-vol-from-seg" - >>> task.inputs.brainmask_file = File.mock() - >>> task.inputs.etiv = True - >>> task.inputs.supratent = True - >>> task.inputs.euler = True - >>> task.inputs.in_intensity = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.ribbon = MghGz.mock("wm.mgz") + >>> task.presurf_seg = MghGz.mock("wm.mgz") + >>> task.transform = File.mock() + >>> task.lh_orig_nofix = File.mock() + >>> task.rh_orig_nofix = Pial.mock("lh.pial") + >>> task.lh_white = File.mock() + >>> task.rh_white = Pial.mock("lh.pial") + >>> task.lh_pial = File.mock() + >>> task.rh_pial = Pial.mock("lh.pial") + >>> task.aseg = File.mock() + >>> task.segmentation_file = File.mock() + >>> task.annot = ("PWS04", "lh", "aparc") + >>> task.summary_file = "summary.stats" + >>> task.partial_volume_file = File.mock() + >>> task.in_file = File.mock() + >>> task.color_table_file = File.mock() + >>> task.gca_color_table = File.mock() + >>> task.cortex_vol_from_surf = True + >>> task.mask_file = File.mock() + >>> task.brain_vol = "brain-vol-from-seg" + >>> task.brainmask_file = File.mock() + >>> task.etiv = True + >>> task.supratent = True + >>> task.euler = True + >>> task.in_intensity = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/model/spherical_average.py b/pydra/tasks/freesurfer/v8/model/spherical_average.py index a9cab247..08d0f4a9 100644 --- a/pydra/tasks/freesurfer/v8/model/spherical_average.py +++ b/pydra/tasks/freesurfer/v8/model/spherical_average.py @@ -42,11 +42,11 @@ def _gen_filename(name, inputs): return avg_subject elif name == "out_file": return _list_outputs( + hemisphere=inputs["hemisphere"], in_average=inputs["in_average"], out_file=inputs["out_file"], subject_id=inputs["subject_id"], subjects_dir=inputs["subjects_dir"], - hemisphere=inputs["hemisphere"], )[name] else: return None @@ -72,13 +72,13 @@ class SphericalAverage(shell.Task["SphericalAverage.Outputs"]): >>> from pydra.tasks.freesurfer.v8.model.spherical_average import SphericalAverage >>> task = SphericalAverage() - >>> task.inputs.out_file = "test.out" - >>> task.inputs.in_surf = Pial.mock("lh.pial") - >>> task.inputs.fname = "lh.entorhinal" - >>> task.inputs.subject_id = "10335" - >>> task.inputs.in_orig = File.mock() - >>> task.inputs.threshold = 5 - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.out_file = "test.out" + >>> task.in_surf = Pial.mock("lh.pial") + >>> task.fname = "lh.entorhinal" + >>> task.subject_id = "10335" + >>> task.in_orig = File.mock() + >>> task.threshold = 5 + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -119,7 +119,7 @@ class Outputs(shell.Outputs): def _list_outputs( - in_average=None, out_file=None, subject_id=None, subjects_dir=None, hemisphere=None + hemisphere=None, in_average=None, out_file=None, subject_id=None, subjects_dir=None ): outputs = {} if out_file is not attrs.NOTHING: diff --git a/pydra/tasks/freesurfer/v8/model/tests/conftest.py b/pydra/tasks/freesurfer/v8/model/tests/conftest.py index 751042d7..8c8af146 100644 --- a/pydra/tasks/freesurfer/v8/model/tests/conftest.py +++ b/pydra/tasks/freesurfer/v8/model/tests/conftest.py @@ -1,4 +1,3 @@ - # For debugging in IDE's don't catch raised exceptions and let the IDE # break at it import os @@ -16,7 +15,7 @@ def pytest_internalerror(excinfo): raise excinfo.value # raise internal errors instead of capturing them def pytest_configure(config): - config.option.capture = 'no' # allow print statements to show up in the console + config.option.capture = "no" # allow print statements to show up in the console config.option.log_cli = True # show log messages in the console config.option.log_level = "INFO" # set the log level to INFO diff --git a/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py b/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py index 8ceafd36..e1c6e97b 100644 --- a/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py +++ b/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py @@ -28,3 +28,6 @@ logger = logging.getLogger(__name__) + + +config = NipypeConfig() diff --git a/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py b/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py index 6ea4b9e8..27f27366 100644 --- a/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py +++ b/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py @@ -5,60 +5,12 @@ simplify_list, ) import os -from pydra.compose import python -from pydra.utils.typing import MultiOutputFile -from fileformats.generic import Directory, File logger = logging.getLogger(__name__) -def _get_files(inputs, path, key, dirval, altkey=None): - - globsuffix = "" - if dirval == "mri": - globsuffix = ".mgz" - elif dirval == "stats": - globsuffix = ".stats" - globprefix = "" - if dirval in ("surf", "label", "stats"): - if inputs["hemi"] != "both": - globprefix: inputs = python.arg["hemi"] + "." - else: - globprefix = "?h." - if key in ("aseg_stats", "wmparc_stats"): - globprefix = "" - elif key == "ribbon": - if inputs["hemi"] != "both": - globprefix: inputs = python.arg["hemi"] + "." - else: - globprefix = "*" - keys = ensure_list(altkey) if altkey else [key] - globfmt = os.path.join(path, dirval, f"{globprefix}{{}}{globsuffix}") - return [os.path.abspath(f) for key in keys for f in glob.glob(globfmt.format(key))] - - -def _list_outputs(inputs): - - subjects_dir = inputs["subjects_dir"] - subject_path = os.path.join(subjects_dir, inputs["subject_id"]) - output_traits = {} - outputs = output_traits.get() - for k in list(outputs.keys()): - val: _get_files = python.arg( - inputs, - subject_path, - k, - output_traits.traits()[k].loc, - output_traits.traits()[k].altkey, - ) - if val: - outputs[k] = simplify_list(val) - return outputs - - -@python.define -class FreeSurferSource(python.Task["FreeSurferSource.Outputs"]): +class FreeSurferSource(IOBase): """Generates freesurfer subject info from their directories. Examples @@ -74,179 +26,50 @@ class FreeSurferSource(python.Task["FreeSurferSource.Outputs"]): """ - subjects_dir: Directory = python.arg(help="Freesurfer subjects directory.") - subject_id: str = python.arg(help="Subject name for whom to retrieve data") - hemi: str = python.arg( - allowed_values=["both", "lh", "rh"], help="Selects hemisphere specific outputs" - ) - - class Outputs(python.Outputs): - T1: File = python.arg( - help="Intensity normalized whole-head volume", - # loc="mri" - ) - aseg: File = python.arg( - # loc=(.*) - help="Volumetric map of regions from automatic segmentation", - ) - brain: File = python.arg( - help="Intensity normalized brain-only volume", - # loc="mri" - ) - brainmask: File = python.arg( - help="Skull-stripped (brain-only) volume", - # loc="mri" - ) - filled: File = python.arg( - help="Subcortical mass volume", - # loc="mri" - ) - norm: File = python.arg( - help="Normalized skull-stripped volume", - # loc="mri" - ) - nu: File = python.arg( - help="Non-uniformity corrected whole-head volume", - # loc="mri" - ) - orig: File = python.arg( - help="Base image conformed to Freesurfer space", - # loc="mri" - ) - rawavg: File = python.arg( - help="Volume formed by averaging input images", - # loc="mri" - ) - ribbon: MultiOutputFile = python.arg( - help="Volumetric maps of cortical ribbons", - # loc=(.*) - # altkey="*ribbon", - ) - wm: File = python.arg( - help="Segmented white-matter volume", - # loc="mri" - ) - wmparc: File = python.arg( - # loc=(.*) - help="Aparc parcellation projected into subcortical white matter", - ) - curv: MultiOutputFile = python.arg( - help="Maps of surface curvature", - # loc="surf" - ) - avg_curv: MultiOutputFile = python.arg( - help="Average atlas curvature, sampled to subject", - # loc=(.*) - ) - inflated: MultiOutputFile = python.arg( - help="Inflated surface meshes", - # loc="surf" - ) - pial: MultiOutputFile = python.arg( - help="Gray matter/pia matter surface meshes", - # loc="surf" - ) - area_pial: MultiOutputFile = python.arg( - help="Mean area of triangles each vertex on the pial surface is " - "associated with", - # loc=(.*) - # altkey="area.pial", - ) - curv_pial: MultiOutputFile = python.arg( - help="Curvature of pial surface", - # loc=(.*) - # altkey="curv.pial", - ) - smoothwm: MultiOutputFile = python.arg( - # loc=(.*) - ) - sphere: MultiOutputFile = python.arg( - help="Spherical surface meshes", - # loc="surf" - ) - sulc: MultiOutputFile = python.arg( - help="Surface maps of sulcal depth", - # loc="surf" - ) - thickness: MultiOutputFile = python.arg( - # loc=(.*) - ) - volume: MultiOutputFile = python.arg( - help="Surface maps of cortical volume", - # loc="surf" - ) - white: MultiOutputFile = python.arg( - help="White/gray matter surface meshes", - # loc="surf" - ) - jacobian_white: MultiOutputFile = python.arg( - help="Distortion required to register to spherical atlas", - # loc=(.*) - ) - graymid: MultiOutputFile = python.arg( - help="Graymid/midthickness surface meshes", - # loc=(.*) - # altkey=["graymid", "midthickness"], - ) - label: MultiOutputFile = python.arg( - help="Volume and surface label files", - # loc=(.*) - # altkey="*label", - ) - annot: MultiOutputFile = python.arg( - help="Surface annotation files", - # loc=(.*) - # altkey="*annot", - ) - aparc_aseg: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="aparc*aseg", - help="Aparc parcellation projected into aseg volume", - ) - sphere_reg: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="sphere.reg", - help="Spherical registration file", - ) - aseg_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="aseg", - help="Automated segmentation statistics file", - ) - wmparc_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="wmparc", - help="White matter parcellation statistics file", - ) - aparc_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="aparc", - help="Aparc parcellation statistics files", - ) - BA_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="BA", - help="Brodmann Area statistics files", - ) - aparc_a2009s_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="aparc.a2009s", - help="Aparc a2009s parcellation statistics files", - ) - curv_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="curv", - help="Curvature statistics files", - ) - entorhinal_exvivo_stats: MultiOutputFile = python.arg( - # loc=(.*) - # altkey="entorhinal_exvivo", - help="Entorhinal exvivo statistics files", - ) - - @staticmethod - def function(): - raise NotImplementedError( - "FreeSurferSource does not implement a function, " - "it is used to generate outputs from the subject directory." - ) + input_spec = FSSourceInputSpec + output_spec = FSSourceOutputSpec + _always_run = True + _additional_metadata = ["loc", "altkey"] + + def _get_files(self, path, key, dirval, altkey=None): + + globsuffix = "" + if dirval == "mri": + globsuffix = ".mgz" + elif dirval == "stats": + globsuffix = ".stats" + globprefix = "" + if dirval in ("surf", "label", "stats"): + if self.inputs.hemi != "both": + globprefix = self.inputs.hemi + "." + else: + globprefix = "?h." + if key in ("aseg_stats", "wmparc_stats"): + globprefix = "" + elif key == "ribbon": + if self.inputs.hemi != "both": + globprefix = self.inputs.hemi + "." + else: + globprefix = "*" + keys = ensure_list(altkey) if altkey else [key] + globfmt = os.path.join(path, dirval, f"{globprefix}{{}}{globsuffix}") + return [ + os.path.abspath(f) for key in keys for f in glob.glob(globfmt.format(key)) + ] + + def _list_outputs(self): + + subjects_dir = self.inputs.subjects_dir + subject_path = os.path.join(subjects_dir, self.inputs.subject_id) + output_traits = self._outputs() + outputs = output_traits.get() + for k in list(outputs.keys()): + val = self._get_files( + subject_path, + k, + output_traits.traits()[k].loc, + output_traits.traits()[k].altkey, + ) + if val: + outputs[k] = simplify_list(val) + return outputs diff --git a/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py b/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py index 77113d79..c99739a3 100644 --- a/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py +++ b/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py @@ -2,6 +2,7 @@ from hashlib import md5 import hashlib import logging +from .. import config from pydra.tasks.freesurfer.v8.nipype_ports.utils.misc import is_container import os import os.path as op diff --git a/pydra/tasks/freesurfer/v8/petsurfer/gtm_seg.py b/pydra/tasks/freesurfer/v8/petsurfer/gtm_seg.py index 9949ad2b..bbe65db0 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/gtm_seg.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/gtm_seg.py @@ -42,9 +42,9 @@ class GTMSeg(shell.Task["GTMSeg.Outputs"]): >>> from pydra.tasks.freesurfer.v8.petsurfer.gtm_seg import GTMSeg >>> task = GTMSeg() - >>> task.inputs.subject_id = "subject_id" - >>> task.inputs.colortable = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.subject_id = "subject_id" + >>> task.colortable = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/petsurfer/gtmpvc.py b/pydra/tasks/freesurfer/v8/petsurfer/gtmpvc.py index 61406599..8649716a 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/gtmpvc.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/gtmpvc.py @@ -263,8 +263,8 @@ def seg_ctab_callable(output_dir, inputs, stdout, stderr): @shell.define( xor=[ - ["reg_identity", "regheader", "reg_file"], - ["default_color_table", "color_table_file"], + ["color_table_file", "default_color_table"], + ["reg_file", "reg_identity", "regheader"], ["save_yhat", "save_yhat_with_noise"], ] ) @@ -279,29 +279,29 @@ class GTMPVC(shell.Task["GTMPVC.Outputs"]): >>> from pydra.tasks.freesurfer.v8.petsurfer.gtmpvc import GTMPVC >>> task = GTMPVC() - >>> task.inputs.in_file = NiftiGz.mock("sub-01_ses-baseline_pet.nii.gz") - >>> task.inputs.psf = 4 - >>> task.inputs.segmentation = File.mock() - >>> task.inputs.reg_file = Lta.mock("sub-01_ses-baseline_pet_mean_reg.lta") - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.auto_mask = (1, 0.1) - >>> task.inputs.color_table_file = File.mock() - >>> task.inputs.km_hb = ["11 12 50 51"] - >>> task.inputs.save_input = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = NiftiGz.mock("sub-01_ses-baseline_pet.nii.gz") + >>> task.psf = 4 + >>> task.segmentation = File.mock() + >>> task.reg_file = Lta.mock("sub-01_ses-baseline_pet_mean_reg.lta") + >>> task.mask_file = File.mock() + >>> task.auto_mask = (1, 0.1) + >>> task.color_table_file = File.mock() + >>> task.km_hb = ["11 12 50 51"] + >>> task.save_input = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' >>> task = GTMPVC() - >>> task.inputs.in_file = NiftiGz.mock("sub-01_ses-baseline_pet.nii.gz") - >>> task.inputs.segmentation = File.mock() - >>> task.inputs.reg_file = Lta.mock() - >>> task.inputs.regheader = True - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.color_table_file = File.mock() - >>> task.inputs.mg = (0.5, ["ROI1", "ROI2"]) - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = NiftiGz.mock("sub-01_ses-baseline_pet.nii.gz") + >>> task.segmentation = File.mock() + >>> task.reg_file = Lta.mock() + >>> task.regheader = True + >>> task.mask_file = File.mock() + >>> task.color_table_file = File.mock() + >>> task.mg = (0.5, ["ROI1", "ROI2"]) + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_gtmpvc --i sub-01_ses-baseline_pet.nii.gz --mg 0.5 ROI1 ROI2 --o pvc --regheader --seg gtmseg.mgz' diff --git a/pydra/tasks/freesurfer/v8/petsurfer/logan.py b/pydra/tasks/freesurfer/v8/petsurfer/logan.py index 72d4824b..df5b1d2f 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/logan.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/logan.py @@ -229,17 +229,17 @@ def glm_dir_default(inputs): @shell.define( xor=[ - ["weight_inv", "weighted_ls"], - ["weighted_ls", "weight_sqrt"], - ["design", "one_sample", "contrast", "fsgd"], - ["nii", "nii_gz"], + ["contrast", "design", "fsgd", "one_sample"], + ["cortex", "label_file"], ["design", "fsgd", "one_sample"], - ["weight_inv", "weighted_ls", "weight_file", "weight_sqrt"], - ["prune_thresh", "no_prune"], + ["fixed_fx_dof", "fixed_fx_dof_file"], + ["nii", "nii_gz"], + ["no_prune", "prunethresh"], + ["noprune", "prune_thresh"], + ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], - ["fixed_fx_dof_file", "fixed_fx_dof"], - ["no_prune", "prune_thresh"], - ["cortex", "label_file"], + ["weight_inv", "weighted_ls"], + ["weight_sqrt", "weighted_ls"], ] ) class Logan(shell.Task["Logan.Outputs"]): @@ -253,17 +253,17 @@ class Logan(shell.Task["Logan.Outputs"]): >>> from pydra.utils.typing import MultiOutputType >>> task = Logan() - >>> task.inputs.glm_dir = "logan" - >>> task.inputs.in_file = Nifti1.mock("tac.nii") - >>> task.inputs.design = File.mock() - >>> task.inputs.weighted_ls = File.mock() - >>> task.inputs.fixed_fx_var = File.mock() - >>> task.inputs.fixed_fx_dof_file = File.mock() - >>> task.inputs.weight_file = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.label_file = File.mock() - >>> task.inputs.sim_done_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.glm_dir = "logan" + >>> task.in_file = Nifti1.mock("tac.nii") + >>> task.design = File.mock() + >>> task.weighted_ls = File.mock() + >>> task.fixed_fx_var = File.mock() + >>> task.fixed_fx_dof_file = File.mock() + >>> task.weight_file = File.mock() + >>> task.mask_file = File.mock() + >>> task.label_file = File.mock() + >>> task.sim_done_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py b/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py index 1229a3a7..c1c531b7 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py @@ -229,17 +229,17 @@ def glm_dir_default(inputs): @shell.define( xor=[ - ["weight_inv", "weighted_ls"], - ["weighted_ls", "weight_sqrt"], - ["design", "one_sample", "contrast", "fsgd"], - ["nii", "nii_gz"], + ["contrast", "design", "fsgd", "one_sample"], + ["cortex", "label_file"], ["design", "fsgd", "one_sample"], - ["weight_inv", "weighted_ls", "weight_file", "weight_sqrt"], - ["prune_thresh", "no_prune"], + ["fixed_fx_dof", "fixed_fx_dof_file"], + ["nii", "nii_gz"], + ["no_prune", "prunethresh"], + ["noprune", "prune_thresh"], + ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], - ["fixed_fx_dof_file", "fixed_fx_dof"], - ["no_prune", "prune_thresh"], - ["cortex", "label_file"], + ["weight_inv", "weighted_ls"], + ["weight_sqrt", "weighted_ls"], ] ) class MRTM1(shell.Task["MRTM1.Outputs"]): @@ -253,17 +253,17 @@ class MRTM1(shell.Task["MRTM1.Outputs"]): >>> from pydra.utils.typing import MultiOutputType >>> task = MRTM1() - >>> task.inputs.glm_dir = "mrtm" - >>> task.inputs.in_file = Nifti1.mock("tac.nii") - >>> task.inputs.design = File.mock() - >>> task.inputs.weighted_ls = File.mock() - >>> task.inputs.fixed_fx_var = File.mock() - >>> task.inputs.fixed_fx_dof_file = File.mock() - >>> task.inputs.weight_file = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.label_file = File.mock() - >>> task.inputs.sim_done_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.glm_dir = "mrtm" + >>> task.in_file = Nifti1.mock("tac.nii") + >>> task.design = File.mock() + >>> task.weighted_ls = File.mock() + >>> task.fixed_fx_var = File.mock() + >>> task.fixed_fx_dof_file = File.mock() + >>> task.weight_file = File.mock() + >>> task.mask_file = File.mock() + >>> task.label_file = File.mock() + >>> task.sim_done_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py b/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py index 3335fb22..7262a5f9 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py @@ -229,17 +229,17 @@ def glm_dir_default(inputs): @shell.define( xor=[ - ["weight_inv", "weighted_ls"], - ["weighted_ls", "weight_sqrt"], - ["design", "one_sample", "contrast", "fsgd"], - ["nii", "nii_gz"], + ["contrast", "design", "fsgd", "one_sample"], + ["cortex", "label_file"], ["design", "fsgd", "one_sample"], - ["weight_inv", "weighted_ls", "weight_file", "weight_sqrt"], - ["prune_thresh", "no_prune"], + ["fixed_fx_dof", "fixed_fx_dof_file"], + ["nii", "nii_gz"], + ["no_prune", "prunethresh"], + ["noprune", "prune_thresh"], + ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], - ["fixed_fx_dof_file", "fixed_fx_dof"], - ["no_prune", "prune_thresh"], - ["cortex", "label_file"], + ["weight_inv", "weighted_ls"], + ["weight_sqrt", "weighted_ls"], ] ) class MRTM2(shell.Task["MRTM2.Outputs"]): @@ -253,17 +253,17 @@ class MRTM2(shell.Task["MRTM2.Outputs"]): >>> from pydra.utils.typing import MultiOutputType >>> task = MRTM2() - >>> task.inputs.glm_dir = "mrtm2" - >>> task.inputs.in_file = Nifti1.mock("tac.nii") - >>> task.inputs.design = File.mock() - >>> task.inputs.weighted_ls = File.mock() - >>> task.inputs.fixed_fx_var = File.mock() - >>> task.inputs.fixed_fx_dof_file = File.mock() - >>> task.inputs.weight_file = File.mock() - >>> task.inputs.mask_file = File.mock() - >>> task.inputs.label_file = File.mock() - >>> task.inputs.sim_done_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.glm_dir = "mrtm2" + >>> task.in_file = Nifti1.mock("tac.nii") + >>> task.design = File.mock() + >>> task.weighted_ls = File.mock() + >>> task.fixed_fx_var = File.mock() + >>> task.fixed_fx_dof_file = File.mock() + >>> task.weight_file = File.mock() + >>> task.mask_file = File.mock() + >>> task.label_file = File.mock() + >>> task.sim_done_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/petsurfer/tests/conftest.py b/pydra/tasks/freesurfer/v8/petsurfer/tests/conftest.py index 751042d7..8c8af146 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/tests/conftest.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/tests/conftest.py @@ -1,4 +1,3 @@ - # For debugging in IDE's don't catch raised exceptions and let the IDE # break at it import os @@ -16,7 +15,7 @@ def pytest_internalerror(excinfo): raise excinfo.value # raise internal errors instead of capturing them def pytest_configure(config): - config.option.capture = 'no' # allow print statements to show up in the console + config.option.capture = "no" # allow print statements to show up in the console config.option.log_cli = True # show log messages in the console config.option.log_level = "INFO" # set the log level to INFO diff --git a/pydra/tasks/freesurfer/v8/preprocess/apply_vol_transform.py b/pydra/tasks/freesurfer/v8/preprocess/apply_vol_transform.py index c42e39a0..7be9d885 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/apply_vol_transform.py +++ b/pydra/tasks/freesurfer/v8/preprocess/apply_vol_transform.py @@ -15,11 +15,11 @@ def _gen_filename(name, inputs): if name == "transformed_file": return _get_outfile( - target_file=inputs["target_file"], - transformed_file=inputs["transformed_file"], fs_target=inputs["fs_target"], inverse=inputs["inverse"], source_file=inputs["source_file"], + target_file=inputs["target_file"], + transformed_file=inputs["transformed_file"], ) return None @@ -30,17 +30,17 @@ def transformed_file_default(inputs): @shell.define( xor=[ + ["fs_target", "tal", "target_file"], [ - "subject", - "reg_file", + "fsl_reg_file", "lta_file", - "reg_header", + "lta_inv_file", "mni_152_reg", + "reg_file", + "reg_header", + "subject", "xfm_reg_file", - "lta_inv_file", - "fsl_reg_file", ], - ["fs_target", "target_file", "tal"], ] ) class ApplyVolTransform(shell.Task["ApplyVolTransform.Outputs"]): @@ -54,16 +54,16 @@ class ApplyVolTransform(shell.Task["ApplyVolTransform.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.apply_vol_transform import ApplyVolTransform >>> task = ApplyVolTransform() - >>> task.inputs.source_file = Nifti1.mock("structural.nii") - >>> task.inputs.transformed_file = "struct_warped.nii" - >>> task.inputs.target_file = File.mock() - >>> task.inputs.reg_file = File.mock() - >>> task.inputs.lta_file = File.mock() - >>> task.inputs.lta_inv_file = File.mock() - >>> task.inputs.fsl_reg_file = File.mock() - >>> task.inputs.xfm_reg_file = File.mock() - >>> task.inputs.m3z_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.source_file = Nifti1.mock("structural.nii") + >>> task.transformed_file = "struct_warped.nii" + >>> task.target_file = File.mock() + >>> task.reg_file = File.mock() + >>> task.lta_file = File.mock() + >>> task.lta_inv_file = File.mock() + >>> task.fsl_reg_file = File.mock() + >>> task.xfm_reg_file = File.mock() + >>> task.m3z_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_vol2vol --fstarg --reg register.dat --mov structural.nii --o struct_warped.nii' @@ -145,11 +145,11 @@ class Outputs(shell.Outputs): def _get_outfile( - target_file=None, - transformed_file=None, fs_target=None, inverse=None, source_file=None, + target_file=None, + transformed_file=None, ): outfile = transformed_file if outfile is attrs.NOTHING: diff --git a/pydra/tasks/freesurfer/v8/preprocess/bb_register.py b/pydra/tasks/freesurfer/v8/preprocess/bb_register.py index a3d9b018..c70dffd4 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/bb_register.py +++ b/pydra/tasks/freesurfer/v8/preprocess/bb_register.py @@ -126,7 +126,7 @@ def out_reg_file_default(inputs): return _gen_filename("out_reg_file", inputs=inputs) -@shell.define(xor=[["reg_middle_frame", "reg_frame"], ["init_reg_file", "init"]]) +@shell.define(xor=[["init", "init_reg_file"], ["reg_frame", "reg_middle_frame"]]) class BBRegister(shell.Task["BBRegister.Outputs"]): """ Examples @@ -138,13 +138,13 @@ class BBRegister(shell.Task["BBRegister.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.bb_register import BBRegister >>> task = BBRegister() - >>> task.inputs.init = "header" - >>> task.inputs.init_reg_file = File.mock() - >>> task.inputs.subject_id = "me" - >>> task.inputs.source_file = Nifti1.mock("structural.nii") - >>> task.inputs.contrast_type = "t2" - >>> task.inputs.intermediate_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.init = "header" + >>> task.init_reg_file = File.mock() + >>> task.subject_id = "me" + >>> task.source_file = Nifti1.mock("structural.nii") + >>> task.contrast_type = "t2" + >>> task.intermediate_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'bbregister --t2 --init-header --reg structural_bbreg_me.dat --mov structural.nii --s me' diff --git a/pydra/tasks/freesurfer/v8/preprocess/ca_label.py b/pydra/tasks/freesurfer/v8/preprocess/ca_label.py index ef273cb2..a285b7a1 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/ca_label.py +++ b/pydra/tasks/freesurfer/v8/preprocess/ca_label.py @@ -41,14 +41,14 @@ class CALabel(shell.Task["CALabel.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.ca_label import CALabel >>> task = CALabel() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.transform = TextMatrix.mock("trans.mat") - >>> task.inputs.template = File.mock() - >>> task.inputs.in_vol = File.mock() - >>> task.inputs.intensities = File.mock() - >>> task.inputs.label = File.mock() - >>> task.inputs.aseg = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.transform = TextMatrix.mock("trans.mat") + >>> task.template = File.mock() + >>> task.in_vol = File.mock() + >>> task.intensities = File.mock() + >>> task.label = File.mock() + >>> task.aseg = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/ca_normalize.py b/pydra/tasks/freesurfer/v8/preprocess/ca_normalize.py index b5926865..9a549f25 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/ca_normalize.py +++ b/pydra/tasks/freesurfer/v8/preprocess/ca_normalize.py @@ -41,12 +41,12 @@ class CANormalize(shell.Task["CANormalize.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.ca_normalize import CANormalize >>> task = CANormalize() - >>> task.inputs.in_file = MghGz.mock("T1.mgz") - >>> task.inputs.atlas = File.mock() - >>> task.inputs.transform = TextMatrix.mock("trans.mat" # in practice use .lta transforms) - >>> task.inputs.mask = File.mock() - >>> task.inputs.long_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("T1.mgz") + >>> task.atlas = File.mock() + >>> task.transform = TextMatrix.mock("trans.mat" # in practice use .lta transforms) + >>> task.mask = File.mock() + >>> task.long_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/ca_register.py b/pydra/tasks/freesurfer/v8/preprocess/ca_register.py index 52cc3c57..d006a7cd 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/ca_register.py +++ b/pydra/tasks/freesurfer/v8/preprocess/ca_register.py @@ -36,11 +36,11 @@ class CARegister(shell.Task["CARegister.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.ca_register import CARegister >>> task = CARegister() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.template = File.mock() - >>> task.inputs.mask = File.mock() - >>> task.inputs.transform = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.template = File.mock() + >>> task.mask = File.mock() + >>> task.transform = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py b/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py index 32230499..47a1c848 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py +++ b/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py @@ -36,31 +36,31 @@ class ConcatenateLTA(shell.Task["ConcatenateLTA.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.concatenate_lta import ConcatenateLTA >>> task = ConcatenateLTA() - >>> task.inputs.in_lta1 = Lta.mock("lta1.lta") - >>> task.inputs.tal_source_file = File.mock() - >>> task.inputs.tal_template_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_lta1 = Lta.mock("lta1.lta") + >>> task.tal_source_file = File.mock() + >>> task.tal_template_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' >>> task = ConcatenateLTA() - >>> task.inputs.in_lta1 = Lta.mock() - >>> task.inputs.in_lta2 = "identity.nofile" - >>> task.inputs.out_file = "inv1.lta" - >>> task.inputs.tal_source_file = File.mock() - >>> task.inputs.tal_template_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_lta1 = Lta.mock() + >>> task.in_lta2 = "identity.nofile" + >>> task.out_file = "inv1.lta" + >>> task.tal_source_file = File.mock() + >>> task.tal_template_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_concatenate_lta -invert1 lta1.lta identity.nofile inv1.lta' >>> task = ConcatenateLTA() - >>> task.inputs.in_lta1 = Lta.mock() - >>> task.inputs.out_type = "RAS2RAS" - >>> task.inputs.tal_source_file = File.mock() - >>> task.inputs.tal_template_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_lta1 = Lta.mock() + >>> task.out_type = "RAS2RAS" + >>> task.tal_source_file = File.mock() + >>> task.tal_template_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_concatenate_lta -invert1 -out_type 1 lta1.lta identity.nofile inv1.lta' @@ -84,13 +84,13 @@ class ConcatenateLTA(shell.Task["ConcatenateLTA.Outputs"]): out_type: ty.Any = shell.arg( help="set final LTA type", formatter="out_type_formatter" ) - tal_source_file: File | None = shell.arg( + tal_source_file: File = shell.arg( help="if in_lta2 is talairach.xfm, specify source for talairach", argstr="-tal {tal_source_file}", position=-5, requires=["tal_template_file"], ) - tal_template_file: File | None = shell.arg( + tal_template_file: File = shell.arg( help="if in_lta2 is talairach.xfm, specify template for talairach", argstr="{tal_template_file}", position=-4, diff --git a/pydra/tasks/freesurfer/v8/preprocess/edit_w_mwith_aseg.py b/pydra/tasks/freesurfer/v8/preprocess/edit_w_mwith_aseg.py index 6307e03d..e3e10168 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/edit_w_mwith_aseg.py +++ b/pydra/tasks/freesurfer/v8/preprocess/edit_w_mwith_aseg.py @@ -38,11 +38,11 @@ class EditWMwithAseg(shell.Task["EditWMwithAseg.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.edit_w_mwith_aseg import EditWMwithAseg >>> task = EditWMwithAseg() - >>> task.inputs.in_file = MghGz.mock("T1.mgz") - >>> task.inputs.brain_file = File.mock() - >>> task.inputs.seg_file = MghGz.mock("aseg.mgz") - >>> task.inputs.keep_in = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("T1.mgz") + >>> task.brain_file = File.mock() + >>> task.seg_file = MghGz.mock("aseg.mgz") + >>> task.keep_in = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/fit_ms_params.py b/pydra/tasks/freesurfer/v8/preprocess/fit_ms_params.py index 54fd384c..640693e2 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/fit_ms_params.py +++ b/pydra/tasks/freesurfer/v8/preprocess/fit_ms_params.py @@ -43,9 +43,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): out_dir = _gen_filename( "out_dir", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) else: out_dir = inputs["out_dir"] @@ -97,8 +97,8 @@ class FitMSParams(shell.Task["FitMSParams.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.fit_ms_params import FitMSParams >>> task = FitMSParams() - >>> task.inputs.in_files = [MghGz.mock("flash_05.mgz"), MghGz.mock("flash_30.mgz")] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_files = [MghGz.mock("flash_05.mgz"), MghGz.mock("flash_30.mgz")] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/mni_bias_correction.py b/pydra/tasks/freesurfer/v8/preprocess/mni_bias_correction.py index 8234c933..49f35625 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/mni_bias_correction.py +++ b/pydra/tasks/freesurfer/v8/preprocess/mni_bias_correction.py @@ -21,11 +21,11 @@ class MNIBiasCorrection(shell.Task["MNIBiasCorrection.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.mni_bias_correction import MNIBiasCorrection >>> task = MNIBiasCorrection() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.protocol_iterations = 1000 - >>> task.inputs.mask = File.mock() - >>> task.inputs.transform = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.protocol_iterations = 1000 + >>> task.mask = File.mock() + >>> task.transform = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/mr_is_ca_label.py b/pydra/tasks/freesurfer/v8/preprocess/mr_is_ca_label.py index 0aa87aff..d0c29530 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/mr_is_ca_label.py +++ b/pydra/tasks/freesurfer/v8/preprocess/mr_is_ca_label.py @@ -22,15 +22,15 @@ class MRIsCALabel(shell.Task["MRIsCALabel.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.mr_is_ca_label import MRIsCALabel >>> task = MRIsCALabel() - >>> task.inputs.subject_id = "test" - >>> task.inputs.canonsurf = Pial.mock("lh.pial") - >>> task.inputs.classifier = File.mock() - >>> task.inputs.smoothwm = Pial.mock("lh.pial") - >>> task.inputs.curv = File.mock() - >>> task.inputs.sulc = Pial.mock("lh.pial") - >>> task.inputs.label = File.mock() - >>> task.inputs.aseg = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.subject_id = "test" + >>> task.canonsurf = Pial.mock("lh.pial") + >>> task.classifier = File.mock() + >>> task.smoothwm = Pial.mock("lh.pial") + >>> task.curv = File.mock() + >>> task.sulc = Pial.mock("lh.pial") + >>> task.label = File.mock() + >>> task.aseg = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mris_ca_label test lh lh.pial im1.nii lh.aparc.annot' diff --git a/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py b/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py index 4570ceb3..c244aa61 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py +++ b/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py @@ -27,9 +27,9 @@ def _format_arg(name, value, inputs, argstr): def _gen_filename(name, inputs): if name == "out_file": return _get_outfilename( - out_type=inputs["out_type"], in_file=inputs["in_file"], out_file=inputs["out_file"], + out_type=inputs["out_type"], ) return None @@ -50,17 +50,17 @@ class MRIConvert(shell.Task["MRIConvert.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.mri_convert import MRIConvert >>> task = MRIConvert() - >>> task.inputs.autoalign_matrix = File.mock() - >>> task.inputs.apply_transform = File.mock() - >>> task.inputs.apply_inv_transform = File.mock() - >>> task.inputs.out_type = "mgz" - >>> task.inputs.in_file = Nifti1.mock("structural.nii") - >>> task.inputs.reslice_like = File.mock() - >>> task.inputs.in_like = File.mock() - >>> task.inputs.color_file = File.mock() - >>> task.inputs.status_file = File.mock() - >>> task.inputs.sdcm_list = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.autoalign_matrix = File.mock() + >>> task.apply_transform = File.mock() + >>> task.apply_inv_transform = File.mock() + >>> task.out_type = "mgz" + >>> task.in_file = Nifti1.mock("structural.nii") + >>> task.reslice_like = File.mock() + >>> task.in_like = File.mock() + >>> task.color_file = File.mock() + >>> task.status_file = File.mock() + >>> task.sdcm_list = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_convert --out_type mgz --input_volume structural.nii --output_volume outfile.mgz' @@ -242,7 +242,7 @@ class MRIConvert(shell.Task["MRIConvert.Outputs"]): template_type: ty.Any = shell.arg( help="template file type", argstr="--template_type {template_type}" ) - split_: bool = shell.arg( + split: bool = shell.arg( help="split output frames into separate output files.", argstr="--split" ) frame: int = shell.arg( @@ -295,7 +295,7 @@ class Outputs(shell.Outputs): ) -def _get_outfilename(out_type=None, in_file=None, out_file=None): +def _get_outfilename(in_file=None, out_file=None, out_type=None): self_dict = {} outfile = out_file if outfile is attrs.NOTHING: diff --git a/pydra/tasks/freesurfer/v8/preprocess/normalize.py b/pydra/tasks/freesurfer/v8/preprocess/normalize.py index 25e28886..7f55a4b9 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/normalize.py +++ b/pydra/tasks/freesurfer/v8/preprocess/normalize.py @@ -21,11 +21,11 @@ class Normalize(shell.Task["Normalize.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.normalize import Normalize >>> task = Normalize() - >>> task.inputs.in_file = MghGz.mock("T1.mgz") - >>> task.inputs.mask = File.mock() - >>> task.inputs.segmentation = File.mock() - >>> task.inputs.transform = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("T1.mgz") + >>> task.mask = File.mock() + >>> task.segmentation = File.mock() + >>> task.transform = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/parse_dicom_dir.py b/pydra/tasks/freesurfer/v8/preprocess/parse_dicom_dir.py index 6095bfe7..42f28eef 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/parse_dicom_dir.py +++ b/pydra/tasks/freesurfer/v8/preprocess/parse_dicom_dir.py @@ -39,9 +39,9 @@ class ParseDICOMDir(shell.Task["ParseDICOMDir.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.parse_dicom_dir import ParseDICOMDir >>> task = ParseDICOMDir() - >>> task.inputs.dicom_dir = Directory.mock(".") - >>> task.inputs.summarize = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.dicom_dir = Directory.mock(".") + >>> task.summarize = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_parse_sdcmdir --d . --o dicominfo.txt --sortbyrun --summarize' diff --git a/pydra/tasks/freesurfer/v8/preprocess/recon_all.py b/pydra/tasks/freesurfer/v8/preprocess/recon_all.py index e8aa077e..90e5eb43 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/recon_all.py +++ b/pydra/tasks/freesurfer/v8/preprocess/recon_all.py @@ -1,7 +1,7 @@ import attrs from fileformats.generic import File import logging -from pydra.tasks.freesurfer.v8.nipype_ports import FreeSurferSource +from pydra.tasks.io.v8 import FreeSurferSource import os from pydra.compose import shell from pydra.utils.typing import MultiInputObj @@ -88,9 +88,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): else: subjects_dir = _gen_subjects_dir( inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) if inputs["hemi"] is not attrs.NOTHING: @@ -409,34 +409,34 @@ def subjects_dir_default(inputs): @shell.define( xor=[ - ["mri_pretess", "expert"], - ["mri_mask", "expert"], - ["mri_em_register", "expert"], + ["base_template_id", "longitudinal_timepoint_id", "subject_id"], + ["expert", "mri_aparc2aseg"], + ["expert", "mri_ca_label"], + ["expert", "mri_ca_normalize"], + ["expert", "mri_ca_register"], + ["expert", "mri_edit_wm_with_aseg"], + ["expert", "mri_em_register"], + ["expert", "mri_fill"], + ["expert", "mri_mask"], + ["expert", "mri_normalize"], + ["expert", "mri_pretess"], ["expert", "mri_remove_neck"], - ["mri_fill", "expert"], - ["mris_make_surfaces", "expert"], - ["mri_ca_register", "expert"], - ["mri_normalize", "expert"], + ["expert", "mri_segment"], + ["expert", "mri_segstats"], + ["expert", "mri_tessellate"], + ["expert", "mri_watershed"], ["expert", "mris_anatomical_stats"], + ["expert", "mris_ca_label"], + ["expert", "mris_fix_topology"], ["expert", "mris_inflate"], - ["expert", "mri_tessellate"], + ["expert", "mris_make_surfaces"], + ["expert", "mris_register"], + ["expert", "mris_smooth"], ["expert", "mris_sphere"], - ["mri_segment", "expert"], - ["expert", "mri_segstats"], - ["mri_watershed", "expert"], - ["expert", "mri_edit_wm_with_aseg"], - ["mris_surf2vol", "expert"], - ["mri_ca_normalize", "expert"], - ["mris_fix_topology", "expert"], - ["mris_smooth", "expert"], + ["expert", "mris_surf2vol"], + ["expert", "mrisp_paint"], ["expert", "talairach"], - ["longitudinal_timepoint_id", "base_template_id", "subject_id"], - ["expert", "mris_register"], - ["mrisp_paint", "expert"], - ["mri_aparc2aseg", "expert"], - ["expert", "mri_ca_label"], - ["mris_ca_label", "expert"], - ["use_T2", "use_FLAIR"], + ["use_FLAIR", "use_T2"], ] ) class ReconAll(shell.Task["ReconAll.Outputs"]): @@ -449,62 +449,62 @@ class ReconAll(shell.Task["ReconAll.Outputs"]): >>> from pydra.utils.typing import MultiInputObj >>> task = ReconAll() - >>> task.inputs.subject_id = "foo" - >>> task.inputs.T2_file = File.mock() - >>> task.inputs.FLAIR_file = File.mock() - >>> task.inputs.expert = File.mock() - >>> task.inputs.subjects_dir = "." - >>> task.inputs.flags = ["-cw256", "-qcache"] + >>> task.subject_id = "foo" + >>> task.T2_file = File.mock() + >>> task.FLAIR_file = File.mock() + >>> task.expert = File.mock() + >>> task.subjects_dir = "." + >>> task.flags = ["-cw256", "-qcache"] >>> task.cmdline 'recon-all -all -i structural.nii -cw256 -qcache -subjid foo -sd .' >>> task = ReconAll() - >>> task.inputs.T2_file = File.mock() - >>> task.inputs.FLAIR_file = File.mock() - >>> task.inputs.expert = File.mock() - >>> task.inputs.flags = [] + >>> task.T2_file = File.mock() + >>> task.FLAIR_file = File.mock() + >>> task.expert = File.mock() + >>> task.flags = [] >>> task.cmdline 'recon-all -all -i structural.nii -hemi lh -subjid foo -sd .' >>> task = ReconAll() - >>> task.inputs.directive = "autorecon-hemi" - >>> task.inputs.T2_file = File.mock() - >>> task.inputs.FLAIR_file = File.mock() - >>> task.inputs.expert = File.mock() + >>> task.directive = "autorecon-hemi" + >>> task.T2_file = File.mock() + >>> task.FLAIR_file = File.mock() + >>> task.expert = File.mock() >>> task.cmdline 'recon-all -autorecon-hemi lh -i structural.nii -subjid foo -sd .' >>> task = ReconAll() - >>> task.inputs.subject_id = "foo" - >>> task.inputs.T2_file = File.mock() - >>> task.inputs.FLAIR_file = File.mock() - >>> task.inputs.hippocampal_subfields_T1 = False - >>> task.inputs.hippocampal_subfields_T2 = ( "structural.nii", "test") - >>> task.inputs.expert = File.mock() - >>> task.inputs.subjects_dir = "." + >>> task.subject_id = "foo" + >>> task.T2_file = File.mock() + >>> task.FLAIR_file = File.mock() + >>> task.hippocampal_subfields_T1 = False + >>> task.hippocampal_subfields_T2 = ( "structural.nii", "test") + >>> task.expert = File.mock() + >>> task.subjects_dir = "." >>> task.cmdline 'recon-all -all -i structural.nii -hippocampal-subfields-T2 structural.nii test -subjid foo -sd .' >>> task = ReconAll() - >>> task.inputs.directive = "all" - >>> task.inputs.T2_file = File.mock() - >>> task.inputs.FLAIR_file = File.mock() - >>> task.inputs.expert = File.mock() - >>> task.inputs.base_template_id = "sub-template" + >>> task.directive = "all" + >>> task.T2_file = File.mock() + >>> task.FLAIR_file = File.mock() + >>> task.expert = File.mock() + >>> task.base_template_id = "sub-template" >>> task.cmdline 'None' >>> task = ReconAll() - >>> task.inputs.directive = "all" - >>> task.inputs.T2_file = File.mock() - >>> task.inputs.FLAIR_file = File.mock() - >>> task.inputs.expert = File.mock() - >>> task.inputs.longitudinal_timepoint_id = "ses-1" + >>> task.directive = "all" + >>> task.T2_file = File.mock() + >>> task.FLAIR_file = File.mock() + >>> task.expert = File.mock() + >>> task.longitudinal_timepoint_id = "ses-1" >>> task.cmdline 'None' @@ -529,12 +529,12 @@ class ReconAll(shell.Task["ReconAll.Outputs"]): requires=["subject_id"], formatter="T1_files_formatter", ) - T2_file: File | None = shell.arg( + T2_file: File = shell.arg( help="Convert T2 image to orig directory", argstr="-T2 {T2_file}", requires=["subject_id"], ) - FLAIR_file: File | None = shell.arg( + FLAIR_file: File = shell.arg( help="Convert FLAIR image to orig directory", argstr="-FLAIR {FLAIR_file}", requires=["subject_id"], @@ -769,7 +769,7 @@ class Outputs(shell.Outputs): ) -def _gen_subjects_dir(inputs=None, stdout=None, stderr=None, output_dir=None): +def _gen_subjects_dir(inputs=None, output_dir=None, stderr=None, stdout=None): return output_dir diff --git a/pydra/tasks/freesurfer/v8/preprocess/resample.py b/pydra/tasks/freesurfer/v8/preprocess/resample.py index 330fc76a..a9a10e8b 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/resample.py +++ b/pydra/tasks/freesurfer/v8/preprocess/resample.py @@ -36,9 +36,9 @@ class Resample(shell.Task["Resample.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.resample import Resample >>> task = Resample() - >>> task.inputs.in_file = Nifti1.mock("structural.nii") - >>> task.inputs.voxel_size = (2.1, 2.1, 2.1) - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Nifti1.mock("structural.nii") + >>> task.voxel_size = (2.1, 2.1, 2.1) + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_convert -vs 2.10 2.10 2.10 -i structural.nii -o resampled.nii' diff --git a/pydra/tasks/freesurfer/v8/preprocess/robust_register.py b/pydra/tasks/freesurfer/v8/preprocess/robust_register.py index 0222bd9b..3ac5714a 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/robust_register.py +++ b/pydra/tasks/freesurfer/v8/preprocess/robust_register.py @@ -27,7 +27,7 @@ def _format_arg(name, value, inputs, argstr): ) if name in options and isinstance(value, bool): value = _list_outputs( - target_file=inputs["target_file"], source_file=inputs["source_file"] + source_file=inputs["source_file"], target_file=inputs["target_file"] )[name] return argstr.format(**inputs) @@ -132,13 +132,13 @@ class RobustRegister(shell.Task["RobustRegister.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.robust_register import RobustRegister >>> task = RobustRegister() - >>> task.inputs.source_file = Nifti1.mock("structural.nii") - >>> task.inputs.target_file = File.mock() - >>> task.inputs.in_xfm_file = File.mock() - >>> task.inputs.auto_sens = True - >>> task.inputs.mask_source = File.mock() - >>> task.inputs.mask_target = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.source_file = Nifti1.mock("structural.nii") + >>> task.target_file = File.mock() + >>> task.in_xfm_file = File.mock() + >>> task.auto_sens = True + >>> task.mask_source = File.mock() + >>> task.mask_target = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/segment_cc.py b/pydra/tasks/freesurfer/v8/preprocess/segment_cc.py index b7a084db..d73404bf 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/segment_cc.py +++ b/pydra/tasks/freesurfer/v8/preprocess/segment_cc.py @@ -31,12 +31,12 @@ def aggregate_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): needed_outputs = ["out_rotation"] predicted_outputs = _list_outputs( - out_rotation=inputs["out_rotation"], out_file=inputs["out_file"], + out_rotation=inputs["out_rotation"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) for name in ["out_file", "out_rotation"]: out_file = predicted_outputs[name] @@ -87,10 +87,10 @@ class SegmentCC(shell.Task["SegmentCC.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.segment_cc import SegmentCC >>> task = SegmentCC() - >>> task.inputs.in_file = MghGz.mock("aseg.mgz") - >>> task.inputs.in_norm = File.mock() - >>> task.inputs.out_rotation = "cc.lta" - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("aseg.mgz") + >>> task.in_norm = File.mock() + >>> task.out_rotation = "cc.lta" + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/segment_wm.py b/pydra/tasks/freesurfer/v8/preprocess/segment_wm.py index b4577bad..f7d384cc 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/segment_wm.py +++ b/pydra/tasks/freesurfer/v8/preprocess/segment_wm.py @@ -38,8 +38,8 @@ class SegmentWM(shell.Task["SegmentWM.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.segment_wm import SegmentWM >>> task = SegmentWM() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/smooth.py b/pydra/tasks/freesurfer/v8/preprocess/smooth.py index 34b7af60..c125f0ae 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/smooth.py +++ b/pydra/tasks/freesurfer/v8/preprocess/smooth.py @@ -16,7 +16,7 @@ def _gen_filename(name, inputs): if name == "smoothed_file": return _list_outputs( - smoothed_file=inputs["smoothed_file"], in_file=inputs["in_file"] + in_file=inputs["in_file"], smoothed_file=inputs["smoothed_file"] )[name] return None @@ -25,7 +25,7 @@ def smoothed_file_default(inputs): return _gen_filename("smoothed_file", inputs=inputs) -@shell.define(xor=[["surface_fwhm", "num_iters"], ["proj_frac", "proj_frac_avg"]]) +@shell.define(xor=[["num_iters", "surface_fwhm"], ["proj_frac", "proj_frac_avg"]]) class Smooth(shell.Task["Smooth.Outputs"]): """ Examples @@ -38,12 +38,12 @@ class Smooth(shell.Task["Smooth.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.smooth import Smooth >>> task = Smooth() - >>> task.inputs.in_file = Nifti1.mock("functional.nii") - >>> task.inputs.reg_file = Dat.mock("register.dat") - >>> task.inputs.smoothed_file = "foo_out.nii" - >>> task.inputs.surface_fwhm = 10 - >>> task.inputs.vol_fwhm = 6 - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Nifti1.mock("functional.nii") + >>> task.reg_file = Dat.mock("register.dat") + >>> task.smoothed_file = "foo_out.nii" + >>> task.surface_fwhm = 10 + >>> task.vol_fwhm = 6 + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mris_volsmooth --i functional.nii --reg register.dat --o foo_out.nii --fwhm 10.000000 --vol-fwhm 6.000000' @@ -108,7 +108,7 @@ def _gen_fname(basename, fname=None, cwd=None, suffix="_fs", use_ext=True): return fname -def _list_outputs(smoothed_file=None, in_file=None): +def _list_outputs(in_file=None, smoothed_file=None): outputs = {} outfile = smoothed_file if outfile is attrs.NOTHING: diff --git a/pydra/tasks/freesurfer/v8/preprocess/synthesize_flash.py b/pydra/tasks/freesurfer/v8/preprocess/synthesize_flash.py index fea82c2b..0ecf08b4 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/synthesize_flash.py +++ b/pydra/tasks/freesurfer/v8/preprocess/synthesize_flash.py @@ -35,13 +35,13 @@ class SynthesizeFLASH(shell.Task["SynthesizeFLASH.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.synthesize_flash import SynthesizeFLASH >>> task = SynthesizeFLASH() - >>> task.inputs.tr = 20 - >>> task.inputs.flip_angle = 30 - >>> task.inputs.te = 3 - >>> task.inputs.t1_image = MghGz.mock("T1.mgz") - >>> task.inputs.pd_image = File.mock() - >>> task.inputs.out_file = "flash_30syn.mgz" - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.tr = 20 + >>> task.flip_angle = 30 + >>> task.te = 3 + >>> task.t1_image = MghGz.mock("T1.mgz") + >>> task.pd_image = File.mock() + >>> task.out_file = "flash_30syn.mgz" + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/preprocess/tests/conftest.py b/pydra/tasks/freesurfer/v8/preprocess/tests/conftest.py index 751042d7..8c8af146 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/tests/conftest.py +++ b/pydra/tasks/freesurfer/v8/preprocess/tests/conftest.py @@ -1,4 +1,3 @@ - # For debugging in IDE's don't catch raised exceptions and let the IDE # break at it import os @@ -16,7 +15,7 @@ def pytest_internalerror(excinfo): raise excinfo.value # raise internal errors instead of capturing them def pytest_configure(config): - config.option.capture = 'no' # allow print statements to show up in the console + config.option.capture = "no" # allow print statements to show up in the console config.option.log_cli = True # show log messages in the console config.option.log_level = "INFO" # set the log level to INFO diff --git a/pydra/tasks/freesurfer/v8/preprocess/unpack_sdicom_dir.py b/pydra/tasks/freesurfer/v8/preprocess/unpack_sdicom_dir.py index 9ac2f2a5..ea037985 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/unpack_sdicom_dir.py +++ b/pydra/tasks/freesurfer/v8/preprocess/unpack_sdicom_dir.py @@ -7,7 +7,7 @@ logger = logging.getLogger(__name__) -@shell.define(xor=[["seq_config", "run_info", "config"]]) +@shell.define(xor=[["config", "run_info", "seq_config"]]) class UnpackSDICOMDir(shell.Task["UnpackSDICOMDir.Outputs"]): """ Examples @@ -17,14 +17,14 @@ class UnpackSDICOMDir(shell.Task["UnpackSDICOMDir.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.unpack_sdicom_dir import UnpackSDICOMDir >>> task = UnpackSDICOMDir() - >>> task.inputs.source_dir = Directory.mock(".") - >>> task.inputs.output_dir = Directory.mock() - >>> task.inputs.run_info = (5, "mprage", "nii", "struct") - >>> task.inputs.config = File.mock() - >>> task.inputs.seq_config = File.mock() - >>> task.inputs.scan_only = File.mock() - >>> task.inputs.log_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.source_dir = Directory.mock(".") + >>> task.output_dir = Directory.mock() + >>> task.run_info = (5, "mprage", "nii", "struct") + >>> task.config = File.mock() + >>> task.seq_config = File.mock() + >>> task.scan_only = File.mock() + >>> task.log_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'unpacksdcmdir -generic -targ . -run 5 mprage nii struct -src .' diff --git a/pydra/tasks/freesurfer/v8/preprocess/watershed_skull_strip.py b/pydra/tasks/freesurfer/v8/preprocess/watershed_skull_strip.py index b7f223ad..5f096b89 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/watershed_skull_strip.py +++ b/pydra/tasks/freesurfer/v8/preprocess/watershed_skull_strip.py @@ -40,10 +40,10 @@ class WatershedSkullStrip(shell.Task["WatershedSkullStrip.Outputs"]): >>> from pydra.tasks.freesurfer.v8.preprocess.watershed_skull_strip import WatershedSkullStrip >>> task = WatershedSkullStrip() - >>> task.inputs.in_file = MghGz.mock("T1.mgz") - >>> task.inputs.brain_atlas = File.mock() - >>> task.inputs.transform = Lta.mock("transforms/talairach_with_skull.lta") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("T1.mgz") + >>> task.brain_atlas = File.mock() + >>> task.transform = Lta.mock("transforms/talairach_with_skull.lta") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/registration/em_register.py b/pydra/tasks/freesurfer/v8/registration/em_register.py index 5c168b34..170f9d38 100644 --- a/pydra/tasks/freesurfer/v8/registration/em_register.py +++ b/pydra/tasks/freesurfer/v8/registration/em_register.py @@ -21,13 +21,13 @@ class EMRegister(shell.Task["EMRegister.Outputs"]): >>> from pydra.tasks.freesurfer.v8.registration.em_register import EMRegister >>> task = EMRegister() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.template = File.mock() - >>> task.inputs.out_file = "norm_transform.lta" - >>> task.inputs.mask = File.mock() - >>> task.inputs.nbrspacing = 9 - >>> task.inputs.transform = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.template = File.mock() + >>> task.out_file = "norm_transform.lta" + >>> task.mask = File.mock() + >>> task.nbrspacing = 9 + >>> task.transform = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/registration/mp_rto_mni305.py b/pydra/tasks/freesurfer/v8/registration/mp_rto_mni305.py index ef2208d7..db5f8c58 100644 --- a/pydra/tasks/freesurfer/v8/registration/mp_rto_mni305.py +++ b/pydra/tasks/freesurfer/v8/registration/mp_rto_mni305.py @@ -43,9 +43,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): _get_fname( inputs["in_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ), "to", inputs["target"], @@ -81,10 +81,10 @@ class MPRtoMNI305(shell.Task["MPRtoMNI305.Outputs"]): >>> from pydra.tasks.freesurfer.v8.registration.mp_rto_mni305 import MPRtoMNI305 >>> task = MPRtoMNI305() - >>> task.inputs.reference_dir = Directory.mock() - >>> task.inputs.target = "structural.nii" - >>> task.inputs.in_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.reference_dir = Directory.mock() + >>> task.target = "structural.nii" + >>> task.in_file = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -109,5 +109,5 @@ class Outputs(shell.Outputs): ) -def _get_fname(fname, inputs=None, stdout=None, stderr=None, output_dir=None): +def _get_fname(fname, inputs=None, output_dir=None, stderr=None, stdout=None): return split_filename(fname)[1] diff --git a/pydra/tasks/freesurfer/v8/registration/mri_coreg.py b/pydra/tasks/freesurfer/v8/registration/mri_coreg.py index 79793838..a82bce29 100644 --- a/pydra/tasks/freesurfer/v8/registration/mri_coreg.py +++ b/pydra/tasks/freesurfer/v8/registration/mri_coreg.py @@ -17,9 +17,9 @@ def _format_arg(opt, val, inputs, argstr): if opt in ("out_reg_file", "out_lta_file", "out_params_file") and val is True: val = _list_outputs( + out_lta_file=inputs["out_lta_file"], out_params_file=inputs["out_params_file"], out_reg_file=inputs["out_reg_file"], - out_lta_file=inputs["out_lta_file"], )[opt] elif opt == "reference_mask" and val is False: return "--no-ref-mask" @@ -83,8 +83,8 @@ def out_params_file_callable(output_dir, inputs, stdout, stderr): @shell.define( xor=[ ["brute_force_limit", "no_brute_force"], - ["reference_file", "subject_id"], ["brute_force_samples", "no_brute_force"], + ["reference_file", "subject_id"], ] ) class MRICoreg(shell.Task["MRICoreg.Outputs"]): @@ -97,36 +97,36 @@ class MRICoreg(shell.Task["MRICoreg.Outputs"]): >>> from pydra.tasks.freesurfer.v8.registration.mri_coreg import MRICoreg >>> task = MRICoreg() - >>> task.inputs.source_file = Nifti1.mock("moving1.nii") - >>> task.inputs.reference_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock(".") + >>> task.source_file = Nifti1.mock("moving1.nii") + >>> task.reference_file = File.mock() + >>> task.subjects_dir = Directory.mock(".") >>> task.cmdline 'None' >>> task = MRICoreg() - >>> task.inputs.source_file = Nifti1.mock("moving1.nii") - >>> task.inputs.reference_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() - >>> task.inputs.subject_id = "fsaverage" + >>> task.source_file = Nifti1.mock("moving1.nii") + >>> task.reference_file = File.mock() + >>> task.subjects_dir = Directory.mock() + >>> task.subject_id = "fsaverage" >>> task.cmdline 'mri_coreg --s fsaverage --no-ref-mask --lta .../registration.lta --mov moving1.nii --sd .' >>> task = MRICoreg() - >>> task.inputs.source_file = Nifti1.mock() - >>> task.inputs.reference_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() - >>> task.inputs.sep = [4] + >>> task.source_file = Nifti1.mock() + >>> task.reference_file = File.mock() + >>> task.subjects_dir = Directory.mock() + >>> task.sep = [4] >>> task.cmdline 'mri_coreg --s fsaverage --no-ref-mask --lta .../registration.lta --sep 4 --mov moving1.nii --sd .' >>> task = MRICoreg() - >>> task.inputs.source_file = Nifti1.mock() - >>> task.inputs.reference_file = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() - >>> task.inputs.sep = [4, 5] + >>> task.source_file = Nifti1.mock() + >>> task.reference_file = File.mock() + >>> task.subjects_dir = Directory.mock() + >>> task.sep = [4, 5] >>> task.cmdline 'mri_coreg --s fsaverage --no-ref-mask --lta .../registration.lta --sep 4 --sep 5 --mov moving1.nii --sd .' diff --git a/pydra/tasks/freesurfer/v8/registration/paint.py b/pydra/tasks/freesurfer/v8/registration/paint.py index 664368bd..40aa7d6a 100644 --- a/pydra/tasks/freesurfer/v8/registration/paint.py +++ b/pydra/tasks/freesurfer/v8/registration/paint.py @@ -37,10 +37,10 @@ class Paint(shell.Task["Paint.Outputs"]): >>> from pydra.tasks.freesurfer.v8.registration.paint import Paint >>> task = Paint() - >>> task.inputs.in_surf = Pial.mock("lh.pial") - >>> task.inputs.template = File.mock() - >>> task.inputs.averages = 5 - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_surf = Pial.mock("lh.pial") + >>> task.template = File.mock() + >>> task.averages = 5 + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/registration/register.py b/pydra/tasks/freesurfer/v8/registration/register.py index 9a95b423..aa685e14 100644 --- a/pydra/tasks/freesurfer/v8/registration/register.py +++ b/pydra/tasks/freesurfer/v8/registration/register.py @@ -28,7 +28,7 @@ def curv_formatter(field, inputs): def _gen_filename(name, inputs): if name == "out_file": - return _list_outputs(out_file=inputs["out_file"], in_surf=inputs["in_surf"])[ + return _list_outputs(in_surf=inputs["in_surf"], out_file=inputs["out_file"])[ name ] return None @@ -50,12 +50,12 @@ class Register(shell.Task["Register.Outputs"]): >>> from pydra.tasks.freesurfer.v8.registration.register import Register >>> task = Register() - >>> task.inputs.in_surf = Pial.mock("lh.pial") - >>> task.inputs.target = File.mock() - >>> task.inputs.in_sulc = Pial.mock("lh.pial") - >>> task.inputs.out_file = "lh.pial.reg" - >>> task.inputs.in_smoothwm = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_surf = Pial.mock("lh.pial") + >>> task.target = File.mock() + >>> task.in_sulc = Pial.mock("lh.pial") + >>> task.out_file = "lh.pial.reg" + >>> task.in_smoothwm = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -98,7 +98,7 @@ class Outputs(shell.Outputs): ) -def _list_outputs(out_file=None, in_surf=None): +def _list_outputs(in_surf=None, out_file=None): outputs = {} if out_file is not attrs.NOTHING: outputs["out_file"] = os.path.abspath(out_file) diff --git a/pydra/tasks/freesurfer/v8/registration/register_av_ito_talairach.py b/pydra/tasks/freesurfer/v8/registration/register_av_ito_talairach.py index 147a1d14..c11be58a 100644 --- a/pydra/tasks/freesurfer/v8/registration/register_av_ito_talairach.py +++ b/pydra/tasks/freesurfer/v8/registration/register_av_ito_talairach.py @@ -48,10 +48,10 @@ class RegisterAVItoTalairach(shell.Task["RegisterAVItoTalairach.Outputs"]): >>> from pydra.tasks.freesurfer.v8.registration.register_av_ito_talairach import RegisterAVItoTalairach >>> task = RegisterAVItoTalairach() - >>> task.inputs.in_file = MghGz.mock("structural.mgz" # doctest: +SKIP) - >>> task.inputs.target = File.mock() - >>> task.inputs.vox2vox = TextFile.mock("talsrcimg_to_structural_t4_vox2vox.txt" # doctest: +SKIP) - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("structural.mgz" # doctest: +SKIP) + >>> task.target = File.mock() + >>> task.vox2vox = TextFile.mock("talsrcimg_to_structural_t4_vox2vox.txt" # doctest: +SKIP) + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'avi2talxfm structural.mgz mni305.cor.mgz talsrcimg_to_structural_t4_vox2vox.txt talairach.auto.xfm' diff --git a/pydra/tasks/freesurfer/v8/registration/tests/conftest.py b/pydra/tasks/freesurfer/v8/registration/tests/conftest.py index 751042d7..8c8af146 100644 --- a/pydra/tasks/freesurfer/v8/registration/tests/conftest.py +++ b/pydra/tasks/freesurfer/v8/registration/tests/conftest.py @@ -1,4 +1,3 @@ - # For debugging in IDE's don't catch raised exceptions and let the IDE # break at it import os @@ -16,7 +15,7 @@ def pytest_internalerror(excinfo): raise excinfo.value # raise internal errors instead of capturing them def pytest_configure(config): - config.option.capture = 'no' # allow print statements to show up in the console + config.option.capture = "no" # allow print statements to show up in the console config.option.log_cli = True # show log messages in the console config.option.log_level = "INFO" # set the log level to INFO diff --git a/pydra/tasks/freesurfer/v8/utils/add_x_form_to_header.py b/pydra/tasks/freesurfer/v8/utils/add_x_form_to_header.py index b0cf56bc..1133da9e 100644 --- a/pydra/tasks/freesurfer/v8/utils/add_x_form_to_header.py +++ b/pydra/tasks/freesurfer/v8/utils/add_x_form_to_header.py @@ -52,18 +52,18 @@ class AddXFormToHeader(shell.Task["AddXFormToHeader.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.add_x_form_to_header import AddXFormToHeader >>> task = AddXFormToHeader() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.transform = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.transform = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' >>> task = AddXFormToHeader() - >>> task.inputs.in_file = MghGz.mock() - >>> task.inputs.transform = File.mock() - >>> task.inputs.copy_name = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock() + >>> task.transform = File.mock() + >>> task.copy_name = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_add_xform_to_header -c trans.mat norm.mgz output.mgz' diff --git a/pydra/tasks/freesurfer/v8/utils/aparc_2_aseg.py b/pydra/tasks/freesurfer/v8/utils/aparc_2_aseg.py index 07bf0e19..e8b8c2b2 100644 --- a/pydra/tasks/freesurfer/v8/utils/aparc_2_aseg.py +++ b/pydra/tasks/freesurfer/v8/utils/aparc_2_aseg.py @@ -63,20 +63,20 @@ class Aparc2Aseg(shell.Task["Aparc2Aseg.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.aparc_2_aseg import Aparc2Aseg >>> task = Aparc2Aseg() - >>> task.inputs.lh_white = Pial.mock("lh.pial") - >>> task.inputs.rh_white = File.mock() - >>> task.inputs.lh_pial = Pial.mock("lh.pial") - >>> task.inputs.rh_pial = File.mock() - >>> task.inputs.lh_ribbon = MghGz.mock("label.mgz") - >>> task.inputs.rh_ribbon = File.mock() - >>> task.inputs.ribbon = MghGz.mock("label.mgz") - >>> task.inputs.lh_annotation = File.mock() - >>> task.inputs.rh_annotation = Pial.mock("lh.pial") - >>> task.inputs.filled = File.mock() - >>> task.inputs.aseg = File.mock() - >>> task.inputs.ctxseg = File.mock() - >>> task.inputs.label_wm = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.lh_white = Pial.mock("lh.pial") + >>> task.rh_white = File.mock() + >>> task.lh_pial = Pial.mock("lh.pial") + >>> task.rh_pial = File.mock() + >>> task.lh_ribbon = MghGz.mock("label.mgz") + >>> task.rh_ribbon = File.mock() + >>> task.ribbon = MghGz.mock("label.mgz") + >>> task.lh_annotation = File.mock() + >>> task.rh_annotation = Pial.mock("lh.pial") + >>> task.filled = File.mock() + >>> task.aseg = File.mock() + >>> task.ctxseg = File.mock() + >>> task.label_wm = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/apas_2_aseg.py b/pydra/tasks/freesurfer/v8/utils/apas_2_aseg.py index 54abe080..f127e70c 100644 --- a/pydra/tasks/freesurfer/v8/utils/apas_2_aseg.py +++ b/pydra/tasks/freesurfer/v8/utils/apas_2_aseg.py @@ -38,8 +38,8 @@ class Apas2Aseg(shell.Task["Apas2Aseg.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.apas_2_aseg import Apas2Aseg >>> task = Apas2Aseg() - >>> task.inputs.in_file = MghGz.mock("aseg.mgz") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("aseg.mgz") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/check_talairach_alignment.py b/pydra/tasks/freesurfer/v8/utils/check_talairach_alignment.py index 0e9ffb75..dab4e4a3 100644 --- a/pydra/tasks/freesurfer/v8/utils/check_talairach_alignment.py +++ b/pydra/tasks/freesurfer/v8/utils/check_talairach_alignment.py @@ -24,7 +24,7 @@ def out_file_callable(output_dir, inputs, stdout, stderr): return outputs.get("out_file") -@shell.define(xor=[["subject", "in_file"]]) +@shell.define(xor=[["in_file", "subject"]]) class CheckTalairachAlignment(shell.Task["CheckTalairachAlignment.Outputs"]): """ Examples @@ -35,8 +35,8 @@ class CheckTalairachAlignment(shell.Task["CheckTalairachAlignment.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.check_talairach_alignment import CheckTalairachAlignment >>> task = CheckTalairachAlignment() - >>> task.inputs.in_file = TextMatrix.mock("trans.mat") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = TextMatrix.mock("trans.mat") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'talairach_afd -T 0.005 -xfm trans.mat' diff --git a/pydra/tasks/freesurfer/v8/utils/contrast.py b/pydra/tasks/freesurfer/v8/utils/contrast.py index cbf0d9bb..999b1562 100644 --- a/pydra/tasks/freesurfer/v8/utils/contrast.py +++ b/pydra/tasks/freesurfer/v8/utils/contrast.py @@ -59,14 +59,14 @@ class Contrast(shell.Task["Contrast.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.contrast import Contrast >>> task = Contrast() - >>> task.inputs.subject_id = "10335" - >>> task.inputs.thickness = File.mock() - >>> task.inputs.white = White.mock("lh.white" # doctest: +SKIP) - >>> task.inputs.annotation = Annot.mock("../label/lh.aparc.annot" # doctest: +SKIP) - >>> task.inputs.cortex = File.mock() - >>> task.inputs.orig = File.mock() - >>> task.inputs.rawavg = MghGz.mock("../mri/rawavg.mgz" # doctest: +SKIP) - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.subject_id = "10335" + >>> task.thickness = File.mock() + >>> task.white = White.mock("lh.white" # doctest: +SKIP) + >>> task.annotation = Annot.mock("../label/lh.aparc.annot" # doctest: +SKIP) + >>> task.cortex = File.mock() + >>> task.orig = File.mock() + >>> task.rawavg = MghGz.mock("../mri/rawavg.mgz" # doctest: +SKIP) + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/curvature.py b/pydra/tasks/freesurfer/v8/utils/curvature.py index 84401e7a..5a023512 100644 --- a/pydra/tasks/freesurfer/v8/utils/curvature.py +++ b/pydra/tasks/freesurfer/v8/utils/curvature.py @@ -64,8 +64,8 @@ class Curvature(shell.Task["Curvature.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.curvature import Curvature >>> task = Curvature() - >>> task.inputs.in_file = Pial.mock("lh.pial") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Pial.mock("lh.pial") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/curvature_stats.py b/pydra/tasks/freesurfer/v8/utils/curvature_stats.py index dcd5c4ee..f3dd0815 100644 --- a/pydra/tasks/freesurfer/v8/utils/curvature_stats.py +++ b/pydra/tasks/freesurfer/v8/utils/curvature_stats.py @@ -34,13 +34,13 @@ class CurvatureStats(shell.Task["CurvatureStats.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.curvature_stats import CurvatureStats >>> task = CurvatureStats() - >>> task.inputs.surface = File.mock() - >>> task.inputs.curvfile1 = File.mock() - >>> task.inputs.curvfile2 = Pial.mock("lh.pial") - >>> task.inputs.hemisphere = "lh" - >>> task.inputs.out_file = "lh.curv.stats" - >>> task.inputs.min_max = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.surface = File.mock() + >>> task.curvfile1 = File.mock() + >>> task.curvfile2 = Pial.mock("lh.pial") + >>> task.hemisphere = "lh" + >>> task.out_file = "lh.curv.stats" + >>> task.min_max = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/euler_number.py b/pydra/tasks/freesurfer/v8/utils/euler_number.py index 4f882066..9ed15a55 100644 --- a/pydra/tasks/freesurfer/v8/utils/euler_number.py +++ b/pydra/tasks/freesurfer/v8/utils/euler_number.py @@ -42,8 +42,8 @@ class EulerNumber(shell.Task["EulerNumber.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.euler_number import EulerNumber >>> task = EulerNumber() - >>> task.inputs.in_file = Pial.mock("lh.pial") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Pial.mock("lh.pial") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/extract_main_component.py b/pydra/tasks/freesurfer/v8/utils/extract_main_component.py index a0988754..fe08bb78 100644 --- a/pydra/tasks/freesurfer/v8/utils/extract_main_component.py +++ b/pydra/tasks/freesurfer/v8/utils/extract_main_component.py @@ -19,7 +19,7 @@ class ExtractMainComponent(shell.Task["ExtractMainComponent.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.extract_main_component import ExtractMainComponent >>> task = ExtractMainComponent() - >>> task.inputs.in_file = Pial.mock("lh.pial") + >>> task.in_file = Pial.mock("lh.pial") >>> task.cmdline 'mris_extract_main_component lh.pial lh.maincmp' diff --git a/pydra/tasks/freesurfer/v8/utils/fix_topology.py b/pydra/tasks/freesurfer/v8/utils/fix_topology.py index 24a59dfc..274efa78 100644 --- a/pydra/tasks/freesurfer/v8/utils/fix_topology.py +++ b/pydra/tasks/freesurfer/v8/utils/fix_topology.py @@ -52,14 +52,14 @@ class FixTopology(shell.Task["FixTopology.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.fix_topology import FixTopology >>> task = FixTopology() - >>> task.inputs.in_orig = Orig.mock("lh.orig" # doctest: +SKIP) - >>> task.inputs.in_inflated = File.mock() - >>> task.inputs.in_brain = File.mock() - >>> task.inputs.in_wm = File.mock() - >>> task.inputs.subject_id = "10335" - >>> task.inputs.ga = True - >>> task.inputs.sphere = Nofix.mock("lh.qsphere.nofix" # doctest: +SKIP) - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_orig = Orig.mock("lh.orig" # doctest: +SKIP) + >>> task.in_inflated = File.mock() + >>> task.in_brain = File.mock() + >>> task.in_wm = File.mock() + >>> task.subject_id = "10335" + >>> task.ga = True + >>> task.sphere = Nofix.mock("lh.qsphere.nofix" # doctest: +SKIP) + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/image_info.py b/pydra/tasks/freesurfer/v8/utils/image_info.py index 30c381db..b8039a2a 100644 --- a/pydra/tasks/freesurfer/v8/utils/image_info.py +++ b/pydra/tasks/freesurfer/v8/utils/image_info.py @@ -35,9 +35,9 @@ def aggregate_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): field, ", ", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) if fieldval.endswith(" msec"): fieldval = fieldval[:-5] @@ -47,9 +47,9 @@ def aggregate_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): info, "voxel sizes", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) vox = tuple(vox.split(", ")) outputs["vox_sizes"] = vox @@ -57,9 +57,9 @@ def aggregate_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): info, "dimensions", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) dim = tuple(int(d) for d in dim.split(" x ")) outputs["dimensions"] = dim @@ -68,17 +68,17 @@ def aggregate_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): info, "Orientation", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) outputs["ph_enc_dir"] = info_regexp( info, "PhEncDir", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) ftype, dtype = re.findall(r"%s\s*:\s+(.+?)\n" % "type", info) diff --git a/pydra/tasks/freesurfer/v8/utils/jacobian.py b/pydra/tasks/freesurfer/v8/utils/jacobian.py index 9f0c59da..8d104f86 100644 --- a/pydra/tasks/freesurfer/v8/utils/jacobian.py +++ b/pydra/tasks/freesurfer/v8/utils/jacobian.py @@ -21,9 +21,9 @@ class Jacobian(shell.Task["Jacobian.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.jacobian import Jacobian >>> task = Jacobian() - >>> task.inputs.in_origsurf = Pial.mock("lh.pial") - >>> task.inputs.in_mappedsurf = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_origsurf = Pial.mock("lh.pial") + >>> task.in_mappedsurf = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/lta_convert.py b/pydra/tasks/freesurfer/v8/utils/lta_convert.py index c1dd5cc3..4303dfc0 100644 --- a/pydra/tasks/freesurfer/v8/utils/lta_convert.py +++ b/pydra/tasks/freesurfer/v8/utils/lta_convert.py @@ -74,7 +74,7 @@ def out_itk_callable(output_dir, inputs, stdout, stderr): return outputs.get("out_itk") -@shell.define(xor=[["in_reg", "in_itk", "in_mni", "in_fsl", "in_niftyreg", "in_lta"]]) +@shell.define(xor=[["in_fsl", "in_itk", "in_lta", "in_mni", "in_niftyreg", "in_reg"]]) class LTAConvert(shell.Task["LTAConvert.Outputs"]): """ Examples diff --git a/pydra/tasks/freesurfer/v8/utils/make_average_subject.py b/pydra/tasks/freesurfer/v8/utils/make_average_subject.py index 9677e9a5..915def46 100644 --- a/pydra/tasks/freesurfer/v8/utils/make_average_subject.py +++ b/pydra/tasks/freesurfer/v8/utils/make_average_subject.py @@ -35,8 +35,8 @@ class MakeAverageSubject(shell.Task["MakeAverageSubject.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.make_average_subject import MakeAverageSubject >>> task = MakeAverageSubject() - >>> task.inputs.subjects_ids = ["s1", "s2"] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.subjects_ids = ["s1", "s2"] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'make_average_subject --out average --subjects s1 s2' diff --git a/pydra/tasks/freesurfer/v8/utils/make_surfaces.py b/pydra/tasks/freesurfer/v8/utils/make_surfaces.py index 4f94d406..7dd66e38 100644 --- a/pydra/tasks/freesurfer/v8/utils/make_surfaces.py +++ b/pydra/tasks/freesurfer/v8/utils/make_surfaces.py @@ -123,7 +123,7 @@ def out_thickness_callable(output_dir, inputs, stdout, stderr): return outputs.get("out_thickness") -@shell.define(xor=[["noaparc", "in_label"]]) +@shell.define(xor=[["in_label", "noaparc"]]) class MakeSurfaces(shell.Task["MakeSurfaces.Outputs"]): """ Examples @@ -135,17 +135,17 @@ class MakeSurfaces(shell.Task["MakeSurfaces.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.make_surfaces import MakeSurfaces >>> task = MakeSurfaces() - >>> task.inputs.hemisphere = "lh" - >>> task.inputs.in_orig = Pial.mock("lh.pial") - >>> task.inputs.in_wm = File.mock() - >>> task.inputs.in_filled = MghGz.mock("norm.mgz") - >>> task.inputs.in_white = File.mock() - >>> task.inputs.in_label = File.mock() - >>> task.inputs.orig_white = File.mock() - >>> task.inputs.orig_pial = File.mock() - >>> task.inputs.in_aseg = File.mock() - >>> task.inputs.in_T1 = MghGz.mock("T1.mgz") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.hemisphere = "lh" + >>> task.in_orig = Pial.mock("lh.pial") + >>> task.in_wm = File.mock() + >>> task.in_filled = MghGz.mock("norm.mgz") + >>> task.in_white = File.mock() + >>> task.in_label = File.mock() + >>> task.orig_white = File.mock() + >>> task.orig_pial = File.mock() + >>> task.in_aseg = File.mock() + >>> task.in_T1 = MghGz.mock("T1.mgz") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -174,7 +174,7 @@ class MakeSurfaces(shell.Task["MakeSurfaces.Outputs"]): orig_white: File = shell.arg( help="Specify a white surface to start with", argstr="-orig_white {orig_white}" ) - orig_pial: File | None = shell.arg( + orig_pial: File = shell.arg( help="Specify a pial surface to start with", argstr="-orig_pial {orig_pial}", requires=["in_label"], diff --git a/pydra/tasks/freesurfer/v8/utils/mr_is_calc.py b/pydra/tasks/freesurfer/v8/utils/mr_is_calc.py index cd6c4f9d..fea7dcd2 100644 --- a/pydra/tasks/freesurfer/v8/utils/mr_is_calc.py +++ b/pydra/tasks/freesurfer/v8/utils/mr_is_calc.py @@ -27,7 +27,7 @@ def out_file_callable(output_dir, inputs, stdout, stderr): return outputs.get("out_file") -@shell.define(xor=[["in_float", "in_int", "in_file2"]]) +@shell.define(xor=[["in_file2", "in_float", "in_int"]]) class MRIsCalc(shell.Task["MRIsCalc.Outputs"]): """ Examples @@ -39,10 +39,10 @@ class MRIsCalc(shell.Task["MRIsCalc.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.mr_is_calc import MRIsCalc >>> task = MRIsCalc() - >>> task.inputs.in_file1 = Area.mock("lh.area" # doctest: +SKIP) - >>> task.inputs.action = "add" - >>> task.inputs.in_file2 = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file1 = Area.mock("lh.area" # doctest: +SKIP) + >>> task.action = "add" + >>> task.in_file2 = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/mr_is_combine.py b/pydra/tasks/freesurfer/v8/utils/mr_is_combine.py index 3d365574..c4383934 100644 --- a/pydra/tasks/freesurfer/v8/utils/mr_is_combine.py +++ b/pydra/tasks/freesurfer/v8/utils/mr_is_combine.py @@ -21,8 +21,8 @@ class MRIsCombine(shell.Task["MRIsCombine.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.mr_is_combine import MRIsCombine >>> task = MRIsCombine() - >>> task.inputs.in_files = [Pial.mock("lh.pial"), Pial.mock("rh.pial")] - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_files = [Pial.mock("lh.pial"), Pial.mock("rh.pial")] + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mris_convert --combinesurfs lh.pial rh.pial bh.pial' diff --git a/pydra/tasks/freesurfer/v8/utils/mr_is_convert.py b/pydra/tasks/freesurfer/v8/utils/mr_is_convert.py index 7013f2e5..9dc2f6b1 100644 --- a/pydra/tasks/freesurfer/v8/utils/mr_is_convert.py +++ b/pydra/tasks/freesurfer/v8/utils/mr_is_convert.py @@ -32,18 +32,18 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): outputs = {} outputs["converted"] = os.path.abspath( _gen_outfilename( - out_file=inputs["out_file"], - parcstats_file=inputs["parcstats_file"], - scalarcurv_file=inputs["scalarcurv_file"], - out_datatype=inputs["out_datatype"], annot_file=inputs["annot_file"], functional_file=inputs["functional_file"], in_file=inputs["in_file"], label_file=inputs["label_file"], + out_datatype=inputs["out_datatype"], + out_file=inputs["out_file"], + parcstats_file=inputs["parcstats_file"], + scalarcurv_file=inputs["scalarcurv_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) ) return outputs @@ -60,14 +60,14 @@ def _gen_filename(name, inputs): if name == "out_file": return os.path.abspath( _gen_outfilename( - out_file=inputs["out_file"], - parcstats_file=inputs["parcstats_file"], - scalarcurv_file=inputs["scalarcurv_file"], - out_datatype=inputs["out_datatype"], annot_file=inputs["annot_file"], functional_file=inputs["functional_file"], in_file=inputs["in_file"], label_file=inputs["label_file"], + out_datatype=inputs["out_datatype"], + out_file=inputs["out_file"], + parcstats_file=inputs["parcstats_file"], + scalarcurv_file=inputs["scalarcurv_file"], ) ) else: @@ -165,18 +165,18 @@ class Outputs(shell.Outputs): def _gen_outfilename( - out_file=None, - parcstats_file=None, - scalarcurv_file=None, - out_datatype=None, annot_file=None, functional_file=None, in_file=None, label_file=None, + out_datatype=None, + out_file=None, + parcstats_file=None, + scalarcurv_file=None, inputs=None, - stdout=None, - stderr=None, output_dir=None, + stderr=None, + stdout=None, ): if out_file is not attrs.NOTHING: return out_file diff --git a/pydra/tasks/freesurfer/v8/utils/mr_is_expand.py b/pydra/tasks/freesurfer/v8/utils/mr_is_expand.py index 1c6c7c3f..c48d7538 100644 --- a/pydra/tasks/freesurfer/v8/utils/mr_is_expand.py +++ b/pydra/tasks/freesurfer/v8/utils/mr_is_expand.py @@ -17,9 +17,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): inputs["in_file"], inputs["out_name"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) return outputs @@ -42,11 +42,11 @@ class MRIsExpand(shell.Task["MRIsExpand.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.mr_is_expand import MRIsExpand >>> task = MRIsExpand() - >>> task.inputs.in_file = White.mock("lh.white") - >>> task.inputs.distance = 0.5 - >>> task.inputs.out_name = "graymid" - >>> task.inputs.thickness = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = White.mock("lh.white") + >>> task.distance = 0.5 + >>> task.out_name = "graymid" + >>> task.thickness = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -102,7 +102,7 @@ class Outputs(shell.Outputs): def _associated_file( - in_file, out_name, inputs=None, stdout=None, stderr=None, output_dir=None + in_file, out_name, inputs=None, output_dir=None, stderr=None, stdout=None ): """Based on MRIsBuildFileName in freesurfer/utils/mrisurf.c diff --git a/pydra/tasks/freesurfer/v8/utils/mr_is_inflate.py b/pydra/tasks/freesurfer/v8/utils/mr_is_inflate.py index 073422be..3a19f928 100644 --- a/pydra/tasks/freesurfer/v8/utils/mr_is_inflate.py +++ b/pydra/tasks/freesurfer/v8/utils/mr_is_inflate.py @@ -29,7 +29,7 @@ def out_sulc_callable(output_dir, inputs, stdout, stderr): return outputs.get("out_sulc") -@shell.define(xor=[["out_sulc", "no_save_sulc"]]) +@shell.define(xor=[["no_save_sulc", "out_sulc"]]) class MRIsInflate(shell.Task["MRIsInflate.Outputs"]): """ Examples @@ -41,8 +41,8 @@ class MRIsInflate(shell.Task["MRIsInflate.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.mr_is_inflate import MRIsInflate >>> task = MRIsInflate() - >>> task.inputs.in_file = Pial.mock("lh.pial") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Pial.mock("lh.pial") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/mri_fill.py b/pydra/tasks/freesurfer/v8/utils/mri_fill.py index 34e88ef7..bcaf79f7 100644 --- a/pydra/tasks/freesurfer/v8/utils/mri_fill.py +++ b/pydra/tasks/freesurfer/v8/utils/mri_fill.py @@ -47,10 +47,10 @@ class MRIFill(shell.Task["MRIFill.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.mri_fill import MRIFill >>> task = MRIFill() - >>> task.inputs.in_file = MghGz.mock("wm.mgz" # doctest: +SKIP) - >>> task.inputs.segmentation = File.mock() - >>> task.inputs.transform = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("wm.mgz" # doctest: +SKIP) + >>> task.segmentation = File.mock() + >>> task.transform = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/mri_marching_cubes.py b/pydra/tasks/freesurfer/v8/utils/mri_marching_cubes.py index fee7b057..2b47503a 100644 --- a/pydra/tasks/freesurfer/v8/utils/mri_marching_cubes.py +++ b/pydra/tasks/freesurfer/v8/utils/mri_marching_cubes.py @@ -16,13 +16,13 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): outputs = {} outputs["surface"] = _gen_outfilename( - label_value=inputs["label_value"], in_file=inputs["in_file"], + label_value=inputs["label_value"], out_file=inputs["out_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) return outputs @@ -37,8 +37,8 @@ def surface_callable(output_dir, inputs, stdout, stderr): def _gen_filename(name, inputs): if name == "out_file": return _gen_outfilename( - label_value=inputs["label_value"], in_file=inputs["in_file"], + label_value=inputs["label_value"], out_file=inputs["out_file"], ) else: @@ -90,13 +90,13 @@ class Outputs(shell.Outputs): def _gen_outfilename( - label_value=None, in_file=None, + label_value=None, out_file=None, inputs=None, - stdout=None, - stderr=None, output_dir=None, + stderr=None, + stdout=None, ): if out_file is not attrs.NOTHING: return os.path.abspath(out_file) diff --git a/pydra/tasks/freesurfer/v8/utils/mri_pretess.py b/pydra/tasks/freesurfer/v8/utils/mri_pretess.py index 8c6dac9a..f8c39276 100644 --- a/pydra/tasks/freesurfer/v8/utils/mri_pretess.py +++ b/pydra/tasks/freesurfer/v8/utils/mri_pretess.py @@ -22,10 +22,10 @@ class MRIPretess(shell.Task["MRIPretess.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.mri_pretess import MRIPretess >>> task = MRIPretess() - >>> task.inputs.in_filled = MghGz.mock("wm.mgz") - >>> task.inputs.in_norm = File.mock() - >>> task.inputs.nocorners = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_filled = MghGz.mock("wm.mgz") + >>> task.in_norm = File.mock() + >>> task.nocorners = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/mri_tessellate.py b/pydra/tasks/freesurfer/v8/utils/mri_tessellate.py index 95ea9aab..3f69feb8 100644 --- a/pydra/tasks/freesurfer/v8/utils/mri_tessellate.py +++ b/pydra/tasks/freesurfer/v8/utils/mri_tessellate.py @@ -17,13 +17,13 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): outputs = {} outputs["surface"] = os.path.abspath( _gen_outfilename( - label_value=inputs["label_value"], in_file=inputs["in_file"], + label_value=inputs["label_value"], out_file=inputs["out_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) ) return outputs @@ -39,8 +39,8 @@ def surface_callable(output_dir, inputs, stdout, stderr): def _gen_filename(name, inputs): if name == "out_file": return _gen_outfilename( - label_value=inputs["label_value"], in_file=inputs["in_file"], + label_value=inputs["label_value"], out_file=inputs["out_file"], ) else: @@ -90,13 +90,13 @@ class Outputs(shell.Outputs): def _gen_outfilename( - label_value=None, in_file=None, + label_value=None, out_file=None, inputs=None, - stdout=None, - stderr=None, output_dir=None, + stderr=None, + stdout=None, ): if out_file is not attrs.NOTHING: return out_file diff --git a/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py b/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py index 5855335d..b93bd8cd 100644 --- a/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py +++ b/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py @@ -16,14 +16,14 @@ def _gen_filename(name, inputs): if name in ["out_table", "out_color"]: return _list_outputs( - out_table=inputs["out_table"], - subject_id=inputs["subject_id"], - surface=inputs["surface"], + hemisphere=inputs["hemisphere"], + in_annotation=inputs["in_annotation"], in_label=inputs["in_label"], out_color=inputs["out_color"], - in_annotation=inputs["in_annotation"], + out_table=inputs["out_table"], + subject_id=inputs["subject_id"], subjects_dir=inputs["subjects_dir"], - hemisphere=inputs["hemisphere"], + surface=inputs["surface"], )[name] return None @@ -38,9 +38,9 @@ def out_table_default(inputs): @shell.define( xor=[ - ["out_color", "in_annotation", "in_label"], ["in_annotation", "in_label"], - ["out_color", "in_label"], + ["in_annotatoin", "in_label", "out_color"], + ["in_label", "out_color"], ] ) class ParcellationStats(shell.Task["ParcellationStats.Outputs"]): @@ -56,24 +56,24 @@ class ParcellationStats(shell.Task["ParcellationStats.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.parcellation_stats import ParcellationStats >>> task = ParcellationStats() - >>> task.inputs.subject_id = "10335" - >>> task.inputs.wm = MghGz.mock("./../mri/wm.mgz" # doctest: +SKIP) - >>> task.inputs.lh_white = File.mock() - >>> task.inputs.rh_white = White.mock("rh.white" # doctest: +SKIP) - >>> task.inputs.lh_pial = File.mock() - >>> task.inputs.rh_pial = Pial.mock("lh.pial" # doctest: +SKIP) - >>> task.inputs.transform = File.mock() - >>> task.inputs.thickness = File.mock() - >>> task.inputs.brainmask = MghGz.mock("./../mri/brainmask.mgz" # doctest: +SKIP) - >>> task.inputs.aseg = File.mock() - >>> task.inputs.ribbon = MghGz.mock("./../mri/ribbon.mgz" # doctest: +SKIP) - >>> task.inputs.cortex_label = File.mock() - >>> task.inputs.surface = "white" - >>> task.inputs.in_cortex = File.mock() - >>> task.inputs.in_annotation = File.mock() - >>> task.inputs.in_label = File.mock() - >>> task.inputs.out_color = "test.ctab" - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.subject_id = "10335" + >>> task.wm = MghGz.mock("./../mri/wm.mgz" # doctest: +SKIP) + >>> task.lh_white = File.mock() + >>> task.rh_white = White.mock("rh.white" # doctest: +SKIP) + >>> task.lh_pial = File.mock() + >>> task.rh_pial = Pial.mock("lh.pial" # doctest: +SKIP) + >>> task.transform = File.mock() + >>> task.thickness = File.mock() + >>> task.brainmask = MghGz.mock("./../mri/brainmask.mgz" # doctest: +SKIP) + >>> task.aseg = File.mock() + >>> task.ribbon = MghGz.mock("./../mri/ribbon.mgz" # doctest: +SKIP) + >>> task.cortex_label = File.mock() + >>> task.surface = "white" + >>> task.in_cortex = File.mock() + >>> task.in_annotation = File.mock() + >>> task.in_label = File.mock() + >>> task.out_color = "test.ctab" + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -131,13 +131,13 @@ class ParcellationStats(shell.Task["ParcellationStats.Outputs"]): subjects_dir: Directory = shell.arg(help="subjects directory") class Outputs(shell.Outputs): - out_table: File | None = shell.outarg( + out_table: Path = shell.outarg( help="Table output to tablefile", argstr="-f {out_table}", requires=["tabular_output"], path_template="out_table", ) - out_color: File | None = shell.outarg( + out_color: Path | None = shell.outarg( help="Output annotation files's colortable to text file", argstr="-c {out_color}", path_template='"test.ctab"', @@ -145,14 +145,14 @@ class Outputs(shell.Outputs): def _list_outputs( - out_table=None, - subject_id=None, - surface=None, + hemisphere=None, + in_annotation=None, in_label=None, out_color=None, - in_annotation=None, + out_table=None, + subject_id=None, subjects_dir=None, - hemisphere=None, + surface=None, ): outputs = {} if out_table is not attrs.NOTHING: diff --git a/pydra/tasks/freesurfer/v8/utils/relabel_hypointensities.py b/pydra/tasks/freesurfer/v8/utils/relabel_hypointensities.py index a11ef47d..dc309069 100644 --- a/pydra/tasks/freesurfer/v8/utils/relabel_hypointensities.py +++ b/pydra/tasks/freesurfer/v8/utils/relabel_hypointensities.py @@ -21,11 +21,11 @@ class RelabelHypointensities(shell.Task["RelabelHypointensities.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.relabel_hypointensities import RelabelHypointensities >>> task = RelabelHypointensities() - >>> task.inputs.lh_white = Pial.mock("lh.pial") - >>> task.inputs.rh_white = File.mock() - >>> task.inputs.aseg = File.mock() - >>> task.inputs.surf_directory = Directory.mock(".") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.lh_white = Pial.mock("lh.pial") + >>> task.rh_white = File.mock() + >>> task.aseg = File.mock() + >>> task.surf_directory = Directory.mock(".") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/remove_intersection.py b/pydra/tasks/freesurfer/v8/utils/remove_intersection.py index 67b535fe..b004a036 100644 --- a/pydra/tasks/freesurfer/v8/utils/remove_intersection.py +++ b/pydra/tasks/freesurfer/v8/utils/remove_intersection.py @@ -21,8 +21,8 @@ class RemoveIntersection(shell.Task["RemoveIntersection.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.remove_intersection import RemoveIntersection >>> task = RemoveIntersection() - >>> task.inputs.in_file = Pial.mock("lh.pial") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Pial.mock("lh.pial") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/remove_neck.py b/pydra/tasks/freesurfer/v8/utils/remove_neck.py index 3fd62e91..a2197faf 100644 --- a/pydra/tasks/freesurfer/v8/utils/remove_neck.py +++ b/pydra/tasks/freesurfer/v8/utils/remove_neck.py @@ -23,10 +23,10 @@ class RemoveNeck(shell.Task["RemoveNeck.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.remove_neck import RemoveNeck >>> task = RemoveNeck() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.transform = File.mock() - >>> task.inputs.template = TextMatrix.mock("trans.mat") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.transform = File.mock() + >>> task.template = TextMatrix.mock("trans.mat") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_remove_neck norm.mgz trans.mat trans.mat norm_noneck.mgz' diff --git a/pydra/tasks/freesurfer/v8/utils/sample_to_surface.py b/pydra/tasks/freesurfer/v8/utils/sample_to_surface.py index 1c29d8dd..9bc5a3ed 100644 --- a/pydra/tasks/freesurfer/v8/utils/sample_to_surface.py +++ b/pydra/tasks/freesurfer/v8/utils/sample_to_surface.py @@ -111,9 +111,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): out_type=inputs["out_type"], source_file=inputs["source_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) ) hitsfile = inputs["hits_file"] @@ -126,9 +126,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): out_type=inputs["out_type"], source_file=inputs["source_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) voxfile = inputs["vox_file"] if voxfile is not attrs.NOTHING: @@ -161,11 +161,11 @@ def vox_file_callable(output_dir, inputs, stdout, stderr): def _gen_filename(name, inputs): if name == "out_file": return _list_outputs( + hemi=inputs["hemi"], hits_file=inputs["hits_file"], out_type=inputs["out_type"], - vox_file=inputs["vox_file"], - hemi=inputs["hemi"], source_file=inputs["source_file"], + vox_file=inputs["vox_file"], )[name] return None @@ -176,9 +176,9 @@ def out_file_default(inputs): @shell.define( xor=[ - ["reg_header", "reg_file", "mni152reg"], - ["reshape", "no_reshape"], ["cortex_mask", "mask_label"], + ["mni152reg", "reg_file", "reg_header"], + ["no_reshape", "reshape"], ["projection_stem", "sampling_method"], ] ) @@ -193,14 +193,14 @@ class SampleToSurface(shell.Task["SampleToSurface.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.sample_to_surface import SampleToSurface >>> task = SampleToSurface() - >>> task.inputs.source_file = NiftiGz.mock("cope1.nii.gz") - >>> task.inputs.reference_file = File.mock() - >>> task.inputs.hemi = "lh" - >>> task.inputs.reg_file = File.mock() - >>> task.inputs.sampling_method = "average" - >>> task.inputs.sampling_units = "frac" - >>> task.inputs.mask_label = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.source_file = NiftiGz.mock("cope1.nii.gz") + >>> task.reference_file = File.mock() + >>> task.hemi = "lh" + >>> task.reg_file = File.mock() + >>> task.sampling_method = "average" + >>> task.sampling_units = "frac" + >>> task.mask_label = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'mri_vol2surf --hemi lh --o ...lh.cope1.mgz --reg register.dat --projfrac-avg 1.000 --mov cope1.nii.gz' @@ -344,9 +344,9 @@ def _get_outfilename( out_type=None, source_file=None, inputs=None, - stdout=None, - stderr=None, output_dir=None, + stderr=None, + stdout=None, ): self_dict = {} outfile = getattr(self_dict["inputs"], opt) diff --git a/pydra/tasks/freesurfer/v8/utils/smooth_tessellation.py b/pydra/tasks/freesurfer/v8/utils/smooth_tessellation.py index b6670cb0..9d9a9be8 100644 --- a/pydra/tasks/freesurfer/v8/utils/smooth_tessellation.py +++ b/pydra/tasks/freesurfer/v8/utils/smooth_tessellation.py @@ -19,9 +19,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): in_file=inputs["in_file"], out_file=inputs["out_file"], inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) return outputs @@ -116,7 +116,7 @@ class Outputs(shell.Outputs): def _gen_outfilename( - in_file=None, out_file=None, inputs=None, stdout=None, stderr=None, output_dir=None + in_file=None, out_file=None, inputs=None, output_dir=None, stderr=None, stdout=None ): if out_file is not attrs.NOTHING: return os.path.abspath(out_file) diff --git a/pydra/tasks/freesurfer/v8/utils/sphere.py b/pydra/tasks/freesurfer/v8/utils/sphere.py index 2c275437..fdc48d42 100644 --- a/pydra/tasks/freesurfer/v8/utils/sphere.py +++ b/pydra/tasks/freesurfer/v8/utils/sphere.py @@ -21,9 +21,9 @@ class Sphere(shell.Task["Sphere.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.sphere import Sphere >>> task = Sphere() - >>> task.inputs.in_file = Pial.mock("lh.pial") - >>> task.inputs.in_smoothwm = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = Pial.mock("lh.pial") + >>> task.in_smoothwm = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' diff --git a/pydra/tasks/freesurfer/v8/utils/surface_2_vol_transform.py b/pydra/tasks/freesurfer/v8/utils/surface_2_vol_transform.py index 5d32c714..e8828600 100644 --- a/pydra/tasks/freesurfer/v8/utils/surface_2_vol_transform.py +++ b/pydra/tasks/freesurfer/v8/utils/surface_2_vol_transform.py @@ -9,7 +9,7 @@ logger = logging.getLogger(__name__) -@shell.define(xor=[["subject_id", "reg_file"], ["mkmask", "source_file"]]) +@shell.define(xor=[["mkmask", "source_file"], ["reg_file", "subject_id"]]) class Surface2VolTransform(shell.Task["Surface2VolTransform.Outputs"]): """ Examples @@ -21,11 +21,11 @@ class Surface2VolTransform(shell.Task["Surface2VolTransform.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.surface_2_vol_transform import Surface2VolTransform >>> task = Surface2VolTransform() - >>> task.inputs.source_file = MghGz.mock("lh.cope1.mgz") - >>> task.inputs.hemi = "lh" - >>> task.inputs.reg_file = File.mock() - >>> task.inputs.template_file = File.mock() - >>> task.inputs.subjects_dir = "." + >>> task.source_file = MghGz.mock("lh.cope1.mgz") + >>> task.hemi = "lh" + >>> task.reg_file = File.mock() + >>> task.template_file = File.mock() + >>> task.subjects_dir = "." >>> task.cmdline 'mri_surf2vol --hemi lh --volreg register.mat --surfval lh.cope1.mgz --sd . --template cope1.nii.gz --outvol lh.cope1_asVol.nii --vtxvol lh.cope1_asVol_vertex.nii' diff --git a/pydra/tasks/freesurfer/v8/utils/surface_smooth.py b/pydra/tasks/freesurfer/v8/utils/surface_smooth.py index 19751018..31d1d519 100644 --- a/pydra/tasks/freesurfer/v8/utils/surface_smooth.py +++ b/pydra/tasks/freesurfer/v8/utils/surface_smooth.py @@ -15,10 +15,10 @@ def _gen_filename(name, inputs): if name == "out_file": return _list_outputs( - in_file=inputs["in_file"], fwhm=inputs["fwhm"], - smooth_iters=inputs["smooth_iters"], + in_file=inputs["in_file"], out_file=inputs["out_file"], + smooth_iters=inputs["smooth_iters"], )[name] return None @@ -27,7 +27,7 @@ def out_file_default(inputs): return _gen_filename("out_file", inputs=inputs) -@shell.define(xor=[["smooth_iters", "fwhm"]]) +@shell.define(xor=[["fwhm", "smooth_iters"]]) class SurfaceSmooth(shell.Task["SurfaceSmooth.Outputs"]): """ Examples @@ -39,9 +39,9 @@ class SurfaceSmooth(shell.Task["SurfaceSmooth.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.surface_smooth import SurfaceSmooth >>> task = SurfaceSmooth() - >>> task.inputs.in_file = MghGz.mock("lh.cope1.mgz") - >>> task.inputs.hemi = "lh" - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("lh.cope1.mgz") + >>> task.hemi = "lh" + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' @@ -78,7 +78,7 @@ class Outputs(shell.Outputs): ) -def _list_outputs(in_file=None, fwhm=None, smooth_iters=None, out_file=None): +def _list_outputs(fwhm=None, in_file=None, out_file=None, smooth_iters=None): outputs = {} outputs["out_file"] = out_file if outputs["out_file"] is attrs.NOTHING: diff --git a/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py b/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py index 7759dc8c..56fda878 100644 --- a/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py +++ b/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py @@ -79,9 +79,9 @@ def _list_outputs(inputs=None, stdout=None, stderr=None, output_dir=None): f % stem, suffix="", inputs=inputs["inputs"], - stdout=inputs["stdout"], - stderr=inputs["stderr"], output_dir=inputs["output_dir"], + stderr=inputs["stderr"], + stdout=inputs["stdout"], ) for f in snapshots ] @@ -108,10 +108,10 @@ def tcl_script_default(inputs): @shell.define( xor=[ - ["label_file", "label_name"], - ["show_gray_curv", "show_curv"], + ["annot_file", "annot_name"], ["identity_reg", "mni152_reg", "overlay_reg"], - ["annot_name", "annot_file"], + ["label_file", "label_name"], + ["show_curv", "show_gray_curv"], ] ) class SurfaceSnapshots(shell.Task["SurfaceSnapshots.Outputs"]): @@ -136,7 +136,7 @@ class SurfaceSnapshots(shell.Task["SurfaceSnapshots.Outputs"]): ) show_curv: bool = shell.arg(help="show curvature", argstr="-curv") show_gray_curv: bool = shell.arg(help="show curvature in gray", argstr="-gray") - overlay: File | None = shell.arg( + overlay: File = shell.arg( help="load an overlay volume/surface", argstr="-overlay {overlay}", requires=["overlay_range"], @@ -232,9 +232,9 @@ def _gen_fname( suffix="_fs", use_ext=True, inputs=None, - stdout=None, - stderr=None, output_dir=None, + stderr=None, + stdout=None, ): """Define a generic mapping for a single outfile diff --git a/pydra/tasks/freesurfer/v8/utils/surface_transform.py b/pydra/tasks/freesurfer/v8/utils/surface_transform.py index bd1828e9..a24e95b6 100644 --- a/pydra/tasks/freesurfer/v8/utils/surface_transform.py +++ b/pydra/tasks/freesurfer/v8/utils/surface_transform.py @@ -23,11 +23,11 @@ def _format_arg(name, value, inputs, argstr): if inputs["out_file"] is not attrs.NOTHING: _, base, ext = split_filename( _list_outputs( - target_type=inputs["target_type"], - source_annot_file=inputs["source_annot_file"], out_file=inputs["out_file"], - target_subject=inputs["target_subject"], + source_annot_file=inputs["source_annot_file"], source_file=inputs["source_file"], + target_subject=inputs["target_subject"], + target_type=inputs["target_type"], )["out_file"] ) if ext != filemap[value]: @@ -56,11 +56,11 @@ def target_type_formatter(field, inputs): def _gen_filename(name, inputs): if name == "out_file": return _list_outputs( - target_type=inputs["target_type"], - source_annot_file=inputs["source_annot_file"], out_file=inputs["out_file"], - target_subject=inputs["target_subject"], + source_annot_file=inputs["source_annot_file"], source_file=inputs["source_file"], + target_subject=inputs["target_subject"], + target_type=inputs["target_type"], )[name] return None @@ -124,11 +124,11 @@ class Outputs(shell.Outputs): def _list_outputs( - target_type=None, - source_annot_file=None, out_file=None, - target_subject=None, + source_annot_file=None, source_file=None, + target_subject=None, + target_type=None, ): outputs = {} outputs["out_file"] = out_file diff --git a/pydra/tasks/freesurfer/v8/utils/talairach_avi.py b/pydra/tasks/freesurfer/v8/utils/talairach_avi.py index 3b90f242..5ec9d067 100644 --- a/pydra/tasks/freesurfer/v8/utils/talairach_avi.py +++ b/pydra/tasks/freesurfer/v8/utils/talairach_avi.py @@ -58,8 +58,8 @@ class TalairachAVI(shell.Task["TalairachAVI.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.talairach_avi import TalairachAVI >>> task = TalairachAVI() - >>> task.inputs.in_file = MghGz.mock("norm.mgz") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.in_file = MghGz.mock("norm.mgz") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'talairach_avi --i norm.mgz --xfm trans.mat' diff --git a/pydra/tasks/freesurfer/v8/utils/talairach_qc.py b/pydra/tasks/freesurfer/v8/utils/talairach_qc.py index 12ead6b5..ef769bd6 100644 --- a/pydra/tasks/freesurfer/v8/utils/talairach_qc.py +++ b/pydra/tasks/freesurfer/v8/utils/talairach_qc.py @@ -35,8 +35,8 @@ class TalairachQC(shell.Task["TalairachQC.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.talairach_qc import TalairachQC >>> task = TalairachQC() - >>> task.inputs.log_file = File.mock("dirs.txt") - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.log_file = File.mock("dirs.txt") + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'tal_QC_AZS dirs.txt' diff --git a/pydra/tasks/freesurfer/v8/utils/tests/conftest.py b/pydra/tasks/freesurfer/v8/utils/tests/conftest.py index 751042d7..8c8af146 100644 --- a/pydra/tasks/freesurfer/v8/utils/tests/conftest.py +++ b/pydra/tasks/freesurfer/v8/utils/tests/conftest.py @@ -1,4 +1,3 @@ - # For debugging in IDE's don't catch raised exceptions and let the IDE # break at it import os @@ -16,7 +15,7 @@ def pytest_internalerror(excinfo): raise excinfo.value # raise internal errors instead of capturing them def pytest_configure(config): - config.option.capture = 'no' # allow print statements to show up in the console + config.option.capture = "no" # allow print statements to show up in the console config.option.log_cli = True # show log messages in the console config.option.log_level = "INFO" # set the log level to INFO diff --git a/pydra/tasks/freesurfer/v8/utils/tkregister_2.py b/pydra/tasks/freesurfer/v8/utils/tkregister_2.py index 0467f9b0..73d54acf 100644 --- a/pydra/tasks/freesurfer/v8/utils/tkregister_2.py +++ b/pydra/tasks/freesurfer/v8/utils/tkregister_2.py @@ -23,8 +23,8 @@ def _format_arg(name, value, inputs, argstr): if name in ("fsl_out", "lta_out") and value is True: value = _list_outputs( fsl_out=inputs["fsl_out"], - reg_file=inputs["reg_file"], lta_out=inputs["lta_out"], + reg_file=inputs["reg_file"], )[f"{name[:3]}_file"] return argstr.format(**inputs) @@ -85,8 +85,8 @@ def lta_file_callable(output_dir, inputs, stdout, stderr): @shell.define( xor=[ - ["fstarg", "target_image"], ["fstal", "moving_image", "reg_file", "target_image"], + ["fstarg", "target_image"], ] ) class Tkregister2(shell.Task["Tkregister2.Outputs"]): @@ -101,25 +101,25 @@ class Tkregister2(shell.Task["Tkregister2.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.tkregister_2 import Tkregister2 >>> task = Tkregister2() - >>> task.inputs.target_image = File.mock() - >>> task.inputs.moving_image = "T1.mgz" - >>> task.inputs.fsl_in_matrix = File.mock() - >>> task.inputs.xfm = File.mock() - >>> task.inputs.lta_in = File.mock() - >>> task.inputs.reg_file = "T1_to_native.dat" - >>> task.inputs.reg_header = True - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.target_image = File.mock() + >>> task.moving_image = "T1.mgz" + >>> task.fsl_in_matrix = File.mock() + >>> task.xfm = File.mock() + >>> task.lta_in = File.mock() + >>> task.reg_file = "T1_to_native.dat" + >>> task.reg_header = True + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'tkregister2 --mov T1.mgz --noedit --reg T1_to_native.dat --regheader --targ structural.nii' >>> task = Tkregister2() - >>> task.inputs.target_image = File.mock() - >>> task.inputs.moving_image = "epi.nii" - >>> task.inputs.fsl_in_matrix = File.mock() - >>> task.inputs.xfm = File.mock() - >>> task.inputs.lta_in = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.target_image = File.mock() + >>> task.moving_image = "epi.nii" + >>> task.fsl_in_matrix = File.mock() + >>> task.xfm = File.mock() + >>> task.lta_in = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'tkregister2 --fsl flirt.mat --mov epi.nii --noedit --reg register.dat' @@ -131,7 +131,7 @@ class Tkregister2(shell.Task["Tkregister2.Outputs"]): help="target volume", argstr="--targ {target_image}" ) fstarg: bool = shell.arg(help="use subject's T1 as reference", argstr="--fstarg") - moving_image: Nifti1 | MghGz | None = shell.arg( + moving_image: Nifti1 | MghGz = shell.arg( help="moving volume", argstr="--mov {moving_image}" ) fsl_in_matrix: File = shell.arg( diff --git a/pydra/tasks/freesurfer/v8/utils/volume_mask.py b/pydra/tasks/freesurfer/v8/utils/volume_mask.py index caea196a..0621a051 100644 --- a/pydra/tasks/freesurfer/v8/utils/volume_mask.py +++ b/pydra/tasks/freesurfer/v8/utils/volume_mask.py @@ -57,7 +57,7 @@ def rh_ribbon_callable(output_dir, inputs, stdout, stderr): return outputs.get("rh_ribbon") -@shell.define(xor=[["in_aseg", "aseg"]]) +@shell.define(xor=[["aseg", "in_aseg"]]) class VolumeMask(shell.Task["VolumeMask.Outputs"]): """ Examples @@ -68,16 +68,16 @@ class VolumeMask(shell.Task["VolumeMask.Outputs"]): >>> from pydra.tasks.freesurfer.v8.utils.volume_mask import VolumeMask >>> task = VolumeMask() - >>> task.inputs.left_whitelabel = 2 - >>> task.inputs.right_whitelabel = 41 - >>> task.inputs.lh_pial = Pial.mock("lh.pial") - >>> task.inputs.rh_pial = File.mock() - >>> task.inputs.lh_white = Pial.mock("lh.pial") - >>> task.inputs.rh_white = File.mock() - >>> task.inputs.aseg = File.mock() - >>> task.inputs.subject_id = "10335" - >>> task.inputs.in_aseg = File.mock() - >>> task.inputs.subjects_dir = Directory.mock() + >>> task.left_whitelabel = 2 + >>> task.right_whitelabel = 41 + >>> task.lh_pial = Pial.mock("lh.pial") + >>> task.rh_pial = File.mock() + >>> task.lh_white = Pial.mock("lh.pial") + >>> task.rh_white = File.mock() + >>> task.aseg = File.mock() + >>> task.subject_id = "10335" + >>> task.in_aseg = File.mock() + >>> task.subjects_dir = Directory.mock() >>> task.cmdline 'None' From cd702c1cfb45831f22f75d001f3f1c2cb417ac31 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Wed, 3 Sep 2025 11:14:56 +1000 Subject: [PATCH 6/8] unquoted formatter function in SurfaceTransform --- pydra/tasks/freesurfer/v8/utils/surface_transform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydra/tasks/freesurfer/v8/utils/surface_transform.py b/pydra/tasks/freesurfer/v8/utils/surface_transform.py index a24e95b6..3c85b3a0 100644 --- a/pydra/tasks/freesurfer/v8/utils/surface_transform.py +++ b/pydra/tasks/freesurfer/v8/utils/surface_transform.py @@ -105,7 +105,7 @@ class SurfaceTransform(shell.Task["SurfaceTransform.Outputs"]): requires=["source_file"], ) target_type: ty.Any = shell.arg( - help="output format", formatter="target_type_formatter" + help="output format", formatter=target_type_formatter ) reshape: bool = shell.arg( help="reshape output surface to conform with Nifti", argstr="--reshape" From f7d1e22d03373decfb2b96bfad5cf8a2dc6f4758 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Wed, 3 Sep 2025 12:15:03 +1000 Subject: [PATCH 7/8] renamed prunethresh to prune_thresh in xors --- pydra/tasks/freesurfer/v8/model/concatenate.py | 2 +- pydra/tasks/freesurfer/v8/model/glm_fit.py | 3 +-- pydra/tasks/freesurfer/v8/model/one_sample_t_test.py | 3 +-- pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py | 1 - pydra/tasks/freesurfer/v8/petsurfer/logan.py | 3 +-- pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py | 3 +-- pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py | 3 +-- 7 files changed, 6 insertions(+), 12 deletions(-) diff --git a/pydra/tasks/freesurfer/v8/model/concatenate.py b/pydra/tasks/freesurfer/v8/model/concatenate.py index a861a897..46687a92 100644 --- a/pydra/tasks/freesurfer/v8/model/concatenate.py +++ b/pydra/tasks/freesurfer/v8/model/concatenate.py @@ -75,7 +75,7 @@ class Concatenate(shell.Task["Concatenate.Outputs"]): help="Multiply input by an ascii matrix in file", argstr="--mtx {multiply_matrix_file}", ) - combine: bool = shell.arg( + combine_: bool = shell.arg( help="Combine non-zero values into single frame volume", argstr="--combine" ) keep_dtype: bool = shell.arg( diff --git a/pydra/tasks/freesurfer/v8/model/glm_fit.py b/pydra/tasks/freesurfer/v8/model/glm_fit.py index 4ae473e1..7153c936 100644 --- a/pydra/tasks/freesurfer/v8/model/glm_fit.py +++ b/pydra/tasks/freesurfer/v8/model/glm_fit.py @@ -234,8 +234,7 @@ def glm_dir_default(inputs): ["design", "fsgd", "one_sample"], ["fixed_fx_dof", "fixed_fx_dof_file"], ["nii", "nii_gz"], - ["no_prune", "prunethresh"], - ["noprune", "prune_thresh"], + ["no_prune", "prune_thresh"], ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], ["weight_inv", "weighted_ls"], diff --git a/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py b/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py index 41f97d1c..7a6fff0f 100644 --- a/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py +++ b/pydra/tasks/freesurfer/v8/model/one_sample_t_test.py @@ -233,8 +233,7 @@ def glm_dir_default(inputs): ["design", "fsgd", "one_sample"], ["fixed_fx_dof", "fixed_fx_dof_file"], ["nii", "nii_gz"], - ["no_prune", "prunethresh"], - ["noprune", "prune_thresh"], + ["no_prune", "prune_thresh"], ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], ["weight_inv", "weighted_ls"], diff --git a/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py b/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py index c99739a3..77113d79 100644 --- a/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py +++ b/pydra/tasks/freesurfer/v8/nipype_ports/utils/filemanip.py @@ -2,7 +2,6 @@ from hashlib import md5 import hashlib import logging -from .. import config from pydra.tasks.freesurfer.v8.nipype_ports.utils.misc import is_container import os import os.path as op diff --git a/pydra/tasks/freesurfer/v8/petsurfer/logan.py b/pydra/tasks/freesurfer/v8/petsurfer/logan.py index df5b1d2f..66f259cc 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/logan.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/logan.py @@ -234,8 +234,7 @@ def glm_dir_default(inputs): ["design", "fsgd", "one_sample"], ["fixed_fx_dof", "fixed_fx_dof_file"], ["nii", "nii_gz"], - ["no_prune", "prunethresh"], - ["noprune", "prune_thresh"], + ["no_prune", "prune_thresh"], ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], ["weight_inv", "weighted_ls"], diff --git a/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py b/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py index c1c531b7..f4ac3e11 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/mrtm1.py @@ -234,8 +234,7 @@ def glm_dir_default(inputs): ["design", "fsgd", "one_sample"], ["fixed_fx_dof", "fixed_fx_dof_file"], ["nii", "nii_gz"], - ["no_prune", "prunethresh"], - ["noprune", "prune_thresh"], + ["no_prune", "prune_thresh"], ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], ["weight_inv", "weighted_ls"], diff --git a/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py b/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py index 7262a5f9..73055584 100644 --- a/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py +++ b/pydra/tasks/freesurfer/v8/petsurfer/mrtm2.py @@ -234,8 +234,7 @@ def glm_dir_default(inputs): ["design", "fsgd", "one_sample"], ["fixed_fx_dof", "fixed_fx_dof_file"], ["nii", "nii_gz"], - ["no_prune", "prunethresh"], - ["noprune", "prune_thresh"], + ["no_prune", "prune_thresh"], ["weight_file", "weight_inv", "weight_sqrt", "weighted_ls"], ["weight_file", "weighted_ls"], ["weight_inv", "weighted_ls"], From c8fc2942bdcbb46920336eceeba3699fee338227 Mon Sep 17 00:00:00 2001 From: "Thomas G. Close" Date: Wed, 3 Sep 2025 14:48:32 +1000 Subject: [PATCH 8/8] manually cleaned up errors after conversion process --- pydra/tasks/freesurfer/v8/__init__.py | 1 - .../tasks/freesurfer/v8/model/label_2_vol.py | 4 +- .../v8/model/mris_preproc_recon_all.py | 4 +- .../freesurfer/v8/nipype_ports/__init__.py | 3 - .../v8/nipype_ports/interfaces/io.py | 273 +++++++++++++++--- .../v8/preprocess/concatenate_lta.py | 4 +- .../freesurfer/v8/preprocess/mri_convert.py | 2 +- .../freesurfer/v8/preprocess/recon_all.py | 6 +- .../freesurfer/v8/utils/make_surfaces.py | 2 +- .../freesurfer/v8/utils/parcellation_stats.py | 6 +- .../freesurfer/v8/utils/surface_snapshots.py | 2 +- .../tasks/freesurfer/v8/utils/tkregister_2.py | 2 +- 12 files changed, 241 insertions(+), 68 deletions(-) diff --git a/pydra/tasks/freesurfer/v8/__init__.py b/pydra/tasks/freesurfer/v8/__init__.py index bab42270..f4d5a17d 100644 --- a/pydra/tasks/freesurfer/v8/__init__.py +++ b/pydra/tasks/freesurfer/v8/__init__.py @@ -19,7 +19,6 @@ _cifs_table, _generate_cifs_table, _parse_mount_table, - config, copyfile, ensure_list, fmlogger, diff --git a/pydra/tasks/freesurfer/v8/model/label_2_vol.py b/pydra/tasks/freesurfer/v8/model/label_2_vol.py index c304168d..fe7cc3c5 100644 --- a/pydra/tasks/freesurfer/v8/model/label_2_vol.py +++ b/pydra/tasks/freesurfer/v8/model/label_2_vol.py @@ -68,7 +68,7 @@ class Label2Vol(shell.Task["Label2Vol.Outputs"]): annot_file: File | None = shell.arg( help="surface annotation file", argstr="--annot {annot_file}", - requires=("subject_id", "hemi"), + requires=["subject_id", "hemi"], ) seg_file: File | None = shell.arg( help="segmentation file", argstr="--seg {seg_file}" @@ -99,7 +99,7 @@ class Label2Vol(shell.Task["Label2Vol.Outputs"]): proj: ty.Any = shell.arg( help="project along surface normal", argstr="--proj {proj[0]} {proj[1]} {proj[2]} {proj[3]}", - requires=("subject_id", "hemi"), + requires=["subject_id", "hemi"], ) subject_id: str = shell.arg(help="subject id", argstr="--subject {subject_id}") hemi: ty.Any = shell.arg(help="hemisphere to use lh or rh", argstr="--hemi {hemi}") diff --git a/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py b/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py index 40331ac9..66d079d0 100644 --- a/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py +++ b/pydra/tasks/freesurfer/v8/model/mris_preproc_recon_all.py @@ -93,10 +93,10 @@ class MRISPreprocReconAll(shell.Task["MRISPreprocReconAll.Outputs"]): requires=["lh_surfreg_target", "rh_surfreg_target"], formatter="surfreg_files_formatter", ) - lh_surfreg_target: File = shell.arg( + lh_surfreg_target: File | None = shell.arg( help="Implicit target surface registration file", requires=["surfreg_files"] ) - rh_surfreg_target: File = shell.arg( + rh_surfreg_target: File | None = shell.arg( help="Implicit target surface registration file", requires=["surfreg_files"] ) subject_id: ty.Any | None = shell.arg( diff --git a/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py b/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py index e1c6e97b..8ceafd36 100644 --- a/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py +++ b/pydra/tasks/freesurfer/v8/nipype_ports/__init__.py @@ -28,6 +28,3 @@ logger = logging.getLogger(__name__) - - -config = NipypeConfig() diff --git a/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py b/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py index 27f27366..6ea4b9e8 100644 --- a/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py +++ b/pydra/tasks/freesurfer/v8/nipype_ports/interfaces/io.py @@ -5,12 +5,60 @@ simplify_list, ) import os +from pydra.compose import python +from pydra.utils.typing import MultiOutputFile +from fileformats.generic import Directory, File logger = logging.getLogger(__name__) -class FreeSurferSource(IOBase): +def _get_files(inputs, path, key, dirval, altkey=None): + + globsuffix = "" + if dirval == "mri": + globsuffix = ".mgz" + elif dirval == "stats": + globsuffix = ".stats" + globprefix = "" + if dirval in ("surf", "label", "stats"): + if inputs["hemi"] != "both": + globprefix: inputs = python.arg["hemi"] + "." + else: + globprefix = "?h." + if key in ("aseg_stats", "wmparc_stats"): + globprefix = "" + elif key == "ribbon": + if inputs["hemi"] != "both": + globprefix: inputs = python.arg["hemi"] + "." + else: + globprefix = "*" + keys = ensure_list(altkey) if altkey else [key] + globfmt = os.path.join(path, dirval, f"{globprefix}{{}}{globsuffix}") + return [os.path.abspath(f) for key in keys for f in glob.glob(globfmt.format(key))] + + +def _list_outputs(inputs): + + subjects_dir = inputs["subjects_dir"] + subject_path = os.path.join(subjects_dir, inputs["subject_id"]) + output_traits = {} + outputs = output_traits.get() + for k in list(outputs.keys()): + val: _get_files = python.arg( + inputs, + subject_path, + k, + output_traits.traits()[k].loc, + output_traits.traits()[k].altkey, + ) + if val: + outputs[k] = simplify_list(val) + return outputs + + +@python.define +class FreeSurferSource(python.Task["FreeSurferSource.Outputs"]): """Generates freesurfer subject info from their directories. Examples @@ -26,50 +74,179 @@ class FreeSurferSource(IOBase): """ - input_spec = FSSourceInputSpec - output_spec = FSSourceOutputSpec - _always_run = True - _additional_metadata = ["loc", "altkey"] - - def _get_files(self, path, key, dirval, altkey=None): - - globsuffix = "" - if dirval == "mri": - globsuffix = ".mgz" - elif dirval == "stats": - globsuffix = ".stats" - globprefix = "" - if dirval in ("surf", "label", "stats"): - if self.inputs.hemi != "both": - globprefix = self.inputs.hemi + "." - else: - globprefix = "?h." - if key in ("aseg_stats", "wmparc_stats"): - globprefix = "" - elif key == "ribbon": - if self.inputs.hemi != "both": - globprefix = self.inputs.hemi + "." - else: - globprefix = "*" - keys = ensure_list(altkey) if altkey else [key] - globfmt = os.path.join(path, dirval, f"{globprefix}{{}}{globsuffix}") - return [ - os.path.abspath(f) for key in keys for f in glob.glob(globfmt.format(key)) - ] - - def _list_outputs(self): - - subjects_dir = self.inputs.subjects_dir - subject_path = os.path.join(subjects_dir, self.inputs.subject_id) - output_traits = self._outputs() - outputs = output_traits.get() - for k in list(outputs.keys()): - val = self._get_files( - subject_path, - k, - output_traits.traits()[k].loc, - output_traits.traits()[k].altkey, - ) - if val: - outputs[k] = simplify_list(val) - return outputs + subjects_dir: Directory = python.arg(help="Freesurfer subjects directory.") + subject_id: str = python.arg(help="Subject name for whom to retrieve data") + hemi: str = python.arg( + allowed_values=["both", "lh", "rh"], help="Selects hemisphere specific outputs" + ) + + class Outputs(python.Outputs): + T1: File = python.arg( + help="Intensity normalized whole-head volume", + # loc="mri" + ) + aseg: File = python.arg( + # loc=(.*) + help="Volumetric map of regions from automatic segmentation", + ) + brain: File = python.arg( + help="Intensity normalized brain-only volume", + # loc="mri" + ) + brainmask: File = python.arg( + help="Skull-stripped (brain-only) volume", + # loc="mri" + ) + filled: File = python.arg( + help="Subcortical mass volume", + # loc="mri" + ) + norm: File = python.arg( + help="Normalized skull-stripped volume", + # loc="mri" + ) + nu: File = python.arg( + help="Non-uniformity corrected whole-head volume", + # loc="mri" + ) + orig: File = python.arg( + help="Base image conformed to Freesurfer space", + # loc="mri" + ) + rawavg: File = python.arg( + help="Volume formed by averaging input images", + # loc="mri" + ) + ribbon: MultiOutputFile = python.arg( + help="Volumetric maps of cortical ribbons", + # loc=(.*) + # altkey="*ribbon", + ) + wm: File = python.arg( + help="Segmented white-matter volume", + # loc="mri" + ) + wmparc: File = python.arg( + # loc=(.*) + help="Aparc parcellation projected into subcortical white matter", + ) + curv: MultiOutputFile = python.arg( + help="Maps of surface curvature", + # loc="surf" + ) + avg_curv: MultiOutputFile = python.arg( + help="Average atlas curvature, sampled to subject", + # loc=(.*) + ) + inflated: MultiOutputFile = python.arg( + help="Inflated surface meshes", + # loc="surf" + ) + pial: MultiOutputFile = python.arg( + help="Gray matter/pia matter surface meshes", + # loc="surf" + ) + area_pial: MultiOutputFile = python.arg( + help="Mean area of triangles each vertex on the pial surface is " + "associated with", + # loc=(.*) + # altkey="area.pial", + ) + curv_pial: MultiOutputFile = python.arg( + help="Curvature of pial surface", + # loc=(.*) + # altkey="curv.pial", + ) + smoothwm: MultiOutputFile = python.arg( + # loc=(.*) + ) + sphere: MultiOutputFile = python.arg( + help="Spherical surface meshes", + # loc="surf" + ) + sulc: MultiOutputFile = python.arg( + help="Surface maps of sulcal depth", + # loc="surf" + ) + thickness: MultiOutputFile = python.arg( + # loc=(.*) + ) + volume: MultiOutputFile = python.arg( + help="Surface maps of cortical volume", + # loc="surf" + ) + white: MultiOutputFile = python.arg( + help="White/gray matter surface meshes", + # loc="surf" + ) + jacobian_white: MultiOutputFile = python.arg( + help="Distortion required to register to spherical atlas", + # loc=(.*) + ) + graymid: MultiOutputFile = python.arg( + help="Graymid/midthickness surface meshes", + # loc=(.*) + # altkey=["graymid", "midthickness"], + ) + label: MultiOutputFile = python.arg( + help="Volume and surface label files", + # loc=(.*) + # altkey="*label", + ) + annot: MultiOutputFile = python.arg( + help="Surface annotation files", + # loc=(.*) + # altkey="*annot", + ) + aparc_aseg: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="aparc*aseg", + help="Aparc parcellation projected into aseg volume", + ) + sphere_reg: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="sphere.reg", + help="Spherical registration file", + ) + aseg_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="aseg", + help="Automated segmentation statistics file", + ) + wmparc_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="wmparc", + help="White matter parcellation statistics file", + ) + aparc_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="aparc", + help="Aparc parcellation statistics files", + ) + BA_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="BA", + help="Brodmann Area statistics files", + ) + aparc_a2009s_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="aparc.a2009s", + help="Aparc a2009s parcellation statistics files", + ) + curv_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="curv", + help="Curvature statistics files", + ) + entorhinal_exvivo_stats: MultiOutputFile = python.arg( + # loc=(.*) + # altkey="entorhinal_exvivo", + help="Entorhinal exvivo statistics files", + ) + + @staticmethod + def function(): + raise NotImplementedError( + "FreeSurferSource does not implement a function, " + "it is used to generate outputs from the subject directory." + ) diff --git a/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py b/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py index 47a1c848..15b4d790 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py +++ b/pydra/tasks/freesurfer/v8/preprocess/concatenate_lta.py @@ -84,13 +84,13 @@ class ConcatenateLTA(shell.Task["ConcatenateLTA.Outputs"]): out_type: ty.Any = shell.arg( help="set final LTA type", formatter="out_type_formatter" ) - tal_source_file: File = shell.arg( + tal_source_file: File | None = shell.arg( help="if in_lta2 is talairach.xfm, specify source for talairach", argstr="-tal {tal_source_file}", position=-5, requires=["tal_template_file"], ) - tal_template_file: File = shell.arg( + tal_template_file: File | None = shell.arg( help="if in_lta2 is talairach.xfm, specify template for talairach", argstr="{tal_template_file}", position=-4, diff --git a/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py b/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py index c244aa61..3eb4d4e2 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py +++ b/pydra/tasks/freesurfer/v8/preprocess/mri_convert.py @@ -242,7 +242,7 @@ class MRIConvert(shell.Task["MRIConvert.Outputs"]): template_type: ty.Any = shell.arg( help="template file type", argstr="--template_type {template_type}" ) - split: bool = shell.arg( + split_: bool = shell.arg( help="split output frames into separate output files.", argstr="--split" ) frame: int = shell.arg( diff --git a/pydra/tasks/freesurfer/v8/preprocess/recon_all.py b/pydra/tasks/freesurfer/v8/preprocess/recon_all.py index 90e5eb43..57ba13f0 100644 --- a/pydra/tasks/freesurfer/v8/preprocess/recon_all.py +++ b/pydra/tasks/freesurfer/v8/preprocess/recon_all.py @@ -1,7 +1,7 @@ import attrs from fileformats.generic import File import logging -from pydra.tasks.io.v8 import FreeSurferSource +from pydra.tasks.freesurfer.v8.nipype_ports.interfaces.io import FreeSurferSource import os from pydra.compose import shell from pydra.utils.typing import MultiInputObj @@ -529,12 +529,12 @@ class ReconAll(shell.Task["ReconAll.Outputs"]): requires=["subject_id"], formatter="T1_files_formatter", ) - T2_file: File = shell.arg( + T2_file: File | None = shell.arg( help="Convert T2 image to orig directory", argstr="-T2 {T2_file}", requires=["subject_id"], ) - FLAIR_file: File = shell.arg( + FLAIR_file: File | None = shell.arg( help="Convert FLAIR image to orig directory", argstr="-FLAIR {FLAIR_file}", requires=["subject_id"], diff --git a/pydra/tasks/freesurfer/v8/utils/make_surfaces.py b/pydra/tasks/freesurfer/v8/utils/make_surfaces.py index 7dd66e38..c5a85f85 100644 --- a/pydra/tasks/freesurfer/v8/utils/make_surfaces.py +++ b/pydra/tasks/freesurfer/v8/utils/make_surfaces.py @@ -174,7 +174,7 @@ class MakeSurfaces(shell.Task["MakeSurfaces.Outputs"]): orig_white: File = shell.arg( help="Specify a white surface to start with", argstr="-orig_white {orig_white}" ) - orig_pial: File = shell.arg( + orig_pial: File | None = shell.arg( help="Specify a pial surface to start with", argstr="-orig_pial {orig_pial}", requires=["in_label"], diff --git a/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py b/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py index b93bd8cd..7d786bf2 100644 --- a/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py +++ b/pydra/tasks/freesurfer/v8/utils/parcellation_stats.py @@ -39,7 +39,7 @@ def out_table_default(inputs): @shell.define( xor=[ ["in_annotation", "in_label"], - ["in_annotatoin", "in_label", "out_color"], + ["in_annotation", "in_label", "out_color"], ["in_label", "out_color"], ] ) @@ -131,13 +131,13 @@ class ParcellationStats(shell.Task["ParcellationStats.Outputs"]): subjects_dir: Directory = shell.arg(help="subjects directory") class Outputs(shell.Outputs): - out_table: Path = shell.outarg( + out_table: File | None = shell.outarg( help="Table output to tablefile", argstr="-f {out_table}", requires=["tabular_output"], path_template="out_table", ) - out_color: Path | None = shell.outarg( + out_color: File | None = shell.outarg( help="Output annotation files's colortable to text file", argstr="-c {out_color}", path_template='"test.ctab"', diff --git a/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py b/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py index 56fda878..bc4d2618 100644 --- a/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py +++ b/pydra/tasks/freesurfer/v8/utils/surface_snapshots.py @@ -136,7 +136,7 @@ class SurfaceSnapshots(shell.Task["SurfaceSnapshots.Outputs"]): ) show_curv: bool = shell.arg(help="show curvature", argstr="-curv") show_gray_curv: bool = shell.arg(help="show curvature in gray", argstr="-gray") - overlay: File = shell.arg( + overlay: File | None = shell.arg( help="load an overlay volume/surface", argstr="-overlay {overlay}", requires=["overlay_range"], diff --git a/pydra/tasks/freesurfer/v8/utils/tkregister_2.py b/pydra/tasks/freesurfer/v8/utils/tkregister_2.py index 73d54acf..57b52cff 100644 --- a/pydra/tasks/freesurfer/v8/utils/tkregister_2.py +++ b/pydra/tasks/freesurfer/v8/utils/tkregister_2.py @@ -131,7 +131,7 @@ class Tkregister2(shell.Task["Tkregister2.Outputs"]): help="target volume", argstr="--targ {target_image}" ) fstarg: bool = shell.arg(help="use subject's T1 as reference", argstr="--fstarg") - moving_image: Nifti1 | MghGz = shell.arg( + moving_image: Nifti1 | MghGz | None = shell.arg( help="moving volume", argstr="--mov {moving_image}" ) fsl_in_matrix: File = shell.arg(