From 4a643e67b619a725f66f5367381bd200ca7ff7d1 Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Thu, 6 Mar 2025 15:10:31 -0500 Subject: [PATCH 1/7] use single pybids_inputs instead of two Removes pybids_inputs_dwi. Having two was problematic since the pybids_inputs_dwi wasn't changeable from the CLI options. --- scattr/config/snakebids.yml | 8 +--- scattr/workflow/Snakefile | 20 ++------- scattr/workflow/rules/freesurfer.smk | 12 +++--- scattr/workflow/rules/mrtpipelines.smk | 10 ++--- .../workflow/rules/mrtpipelines/preproc.smk | 42 +++++++++---------- .../rules/mrtpipelines/tractography.smk | 4 +- scattr/workflow/rules/qc.smk | 16 +++---- scattr/workflow/rules/zona_bb_subcortex.smk | 16 +++---- 8 files changed, 55 insertions(+), 73 deletions(-) diff --git a/scattr/config/snakebids.yml b/scattr/config/snakebids.yml index b5b8c802..9c0e0fe3 100644 --- a/scattr/config/snakebids.yml +++ b/scattr/config/snakebids.yml @@ -31,7 +31,6 @@ pybids_inputs: - subject - session - run -pybids_inputs_dwi: dwi: filters: suffix: "dwi" @@ -42,7 +41,7 @@ pybids_inputs_dwi: - subject - session - run - mask: + dwi_mask: filters: suffix: "mask" extension: ".nii.gz" @@ -109,11 +108,6 @@ parse_args: nargs: "?" type: Path - --pybidsdb_dwi_dir: - help: "The path to the pybids database associated with provided dwi_dir" - nargs: "?" - type: Path - --responsemean_dir: help: "The path to the directory containing average response functions. If not provided, one will be computed from the subjects in the input diff --git a/scattr/workflow/Snakefile b/scattr/workflow/Snakefile index 3ba72411..5b7b1f4d 100644 --- a/scattr/workflow/Snakefile +++ b/scattr/workflow/Snakefile @@ -12,7 +12,7 @@ configfile: "config/snakebids.yml" # writes inputs_config.yml and updates config dict -inputs_t1w = generate_inputs( +inputs = generate_inputs( bids_dir=config["bids_dir"], pybids_inputs=config["pybids_inputs"], pybids_config=["bids", "derivatives"], @@ -22,18 +22,6 @@ inputs_t1w = generate_inputs( participant_label=config["participant_label"], exclude_participant_label=config["exclude_participant_label"], ) -inputs_dwi = generate_inputs( - bids_dir=config["dwi_dir"] if config["dwi_dir"] else config["bids_dir"], - pybids_inputs=config["pybids_inputs_dwi"], - pybids_config=["bids", "derivatives"], - pybidsdb_dir=config.get("pybidsdb_dwi_dir") - if config["dwi_dir"] - else config.get("pybidsdb_dir"), - pybidsdb_reset=config.get("pybidsdb_reset"), - derivatives=config["derivatives"], - participant_label=config["participant_label"], - exclude_participant_label=config["exclude_participant_label"], -) # this adds constraints to the bids naming @@ -56,7 +44,7 @@ if config.get("labelmerge_base_dir") or config.get("labelmerge_overlay_dir"): """ ) -if len(inputs_dwi.sessions) > 1 and not config.get("responsemean_ses"): +if len(inputs.sessions) > 1 and not config.get("responsemean_ses"): print( """ WARNING: Multiple sessions detected - average response function will be @@ -75,10 +63,10 @@ include: "rules/qc.smk" rule all: input: - tck_files=inputs_t1w["T1w"].expand( + tck_files=inputs["T1w"].expand( rules.filtered_tck2connectome.output.sl_assignment ), - dti_files=inputs_t1w["T1w"].expand(rules.dwi2tensor.output.dti), + dti_files=inputs["T1w"].expand(rules.dwi2tensor.output.dti), qc_files=rules.gather_qc.input, params: mrtrix_dir=mrtrix_dir, diff --git a/scattr/workflow/rules/freesurfer.smk b/scattr/workflow/rules/freesurfer.smk index 84162863..07d73678 100644 --- a/scattr/workflow/rules/freesurfer.smk +++ b/scattr/workflow/rules/freesurfer.smk @@ -19,13 +19,13 @@ bids_fs_out = partial( bids, root=freesurfer_dir, datatype="anat", - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) bids_log = partial( bids, root=log_dir, - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) """Freesurfer references (with additional in rules as necessary) @@ -73,11 +73,11 @@ rule thalamic_segmentation: freesurfer_dir=freesurfer_dir, params: fs_license=fs_license, - subj_dir=str(Path(bids(**inputs_t1w.subj_wildcards)).parent), + subj_dir=str(Path(bids(**inputs.subj_wildcards)).parent), output: thal_seg=str( Path( - bids(root=freesurfer_dir, **inputs_t1w.subj_wildcards) + bids(root=freesurfer_dir, **inputs.subj_wildcards) ).parent / "mri" / "ThalamicNuclei.v12.T1.mgz" @@ -116,7 +116,7 @@ rule mgz2nii: else [], aparcaseg=str( Path( - bids(root=freesurfer_dir, **inputs_t1w.subj_wildcards) + bids(root=freesurfer_dir, **inputs.subj_wildcards) ).parent / "mri" / "aparc+aseg.mgz" @@ -162,7 +162,7 @@ rule fs_xfm_to_native: input: thal=rules.mgz2nii.output.thal, aparcaseg=rules.mgz2nii.output.aparcaseg, - ref=lambda wildcards: inputs_t1w["T1w"].filter(**wildcards).expand()[0], + ref=lambda wildcards: inputs["T1w"].filter(**wildcards).expand()[0], output: thal=bids_fs_out( space="T1w", diff --git a/scattr/workflow/rules/mrtpipelines.smk b/scattr/workflow/rules/mrtpipelines.smk index 181d34b7..50d1473e 100644 --- a/scattr/workflow/rules/mrtpipelines.smk +++ b/scattr/workflow/rules/mrtpipelines.smk @@ -30,21 +30,21 @@ bids_dti_out = partial( root=mrtrix_dir, datatype="dti", model="dti", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ) bids_tractography_out = partial( bids, root=mrtrix_dir, datatype="tractography", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ) bids_anat_out = partial( bids, root=mrtrix_dir, datatype="anat", - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) bids_labelmerge = partial( @@ -52,13 +52,13 @@ bids_labelmerge = partial( root=str(Path(labelmerge_dir) / "combined") if not config.get("skip_labelmerge") else config.get("labelmerge_base_dir") or zona_dir, - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) bids_log = partial( bids, root=log_dir, - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ) """Mrtrix3 reference (additional citations are included per rule as necessary): diff --git a/scattr/workflow/rules/mrtpipelines/preproc.smk b/scattr/workflow/rules/mrtpipelines/preproc.smk index b0f717d2..b8f4ca5c 100644 --- a/scattr/workflow/rules/mrtpipelines/preproc.smk +++ b/scattr/workflow/rules/mrtpipelines/preproc.smk @@ -1,29 +1,29 @@ rule nii2mif: input: - dwi=inputs_dwi["dwi"].path, - bval=re.sub(".nii.gz", ".bval", inputs_dwi["dwi"].path), - bvec=re.sub(".nii.gz", ".bvec", inputs_dwi["dwi"].path), - mask=inputs_dwi["mask"].path, + dwi=inputs["dwi"].path, + bval=re.sub(".nii.gz", ".bval", inputs["dwi"].path), + bvec=re.sub(".nii.gz", ".bvec", inputs["dwi"].path), + mask=inputs["dwi_mask"].path, output: dwi=bids( root=mrtrix_dir, datatype="dwi", suffix="dwi.mif", - **inputs_dwi.subj_wildcards + **inputs.subj_wildcards ), mask=bids( root=mrtrix_dir, datatype="dwi", desc="brain", suffix="mask.mif", - **inputs_dwi.subj_wildcards + **inputs.subj_wildcards ), threads: 4 resources: mem_mb=16000, time=10, log: - bids_log(suffix="nii2mif.log", **inputs_dwi.subj_wildcards), + bids_log(suffix="nii2mif.log", **inputs.subj_wildcards), group: "dwiproc" container: @@ -56,15 +56,15 @@ rule dwi2response: output: wm_rf=bids_response_out( desc="wm", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), gm_rf=bids_response_out( desc="gm", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), csf_rf=bids_response_out( desc="csf", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), threads: 4 resources: @@ -89,13 +89,13 @@ rule dwi2response: def get_subject_rf(wildcards): """Get appropriate subject response path""" - if not inputs_dwi.sessions: + if not inputs.sessions: return expand( bids_response_out( subject="{subject}", desc="{tissue}", ), - subject=inputs_dwi.subjects, + subject=inputs.subjects, allow_missing=True, ) else: @@ -105,11 +105,11 @@ def get_subject_rf(wildcards): session="{session}", desc="{tissue}", ), - subject=inputs_dwi.subjects, + subject=inputs.subjects, session=( config.get("responsemean_ses") if config.get("responsemean_ses") - else inputs_dwi.sessions + else inputs.sessions ), allow_missing=True, ) @@ -184,19 +184,19 @@ rule dwi2fod: model="csd", desc="wm", suffix="fod.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), gm_fod=bids_response_out( model="csd", desc="gm", suffix="fod.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), csf_fod=bids_response_out( model="csd", desc="csf", suffix="fod.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), threads: 4 resources: @@ -239,19 +239,19 @@ rule mtnormalise: model="csd", desc="wm", suffix="fodNormalized.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), gm_fod=bids_response_out( model="csd", desc="gm", suffix="fodNormalized.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), csf_fod=bids_response_out( model="csd", desc="csf", suffix="fodNormalized.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), threads: 4 resources: @@ -286,7 +286,7 @@ rule dwinormalise: datatype="dwi", desc="normalized", suffix="dwi.mif", - **inputs_dwi.subj_wildcards, + **inputs.subj_wildcards, ), threads: 4 resources: diff --git a/scattr/workflow/rules/mrtpipelines/tractography.smk b/scattr/workflow/rules/mrtpipelines/tractography.smk index 4e6612a7..da99b24e 100644 --- a/scattr/workflow/rules/mrtpipelines/tractography.smk +++ b/scattr/workflow/rules/mrtpipelines/tractography.smk @@ -89,7 +89,7 @@ checkpoint create_roi_mask: num_labels=rules.get_num_nodes.output.num_labels, params: base_dir=mrtrix_dir, - subj_wildcards=inputs_dwi.subj_wildcards, + subj_wildcards=inputs.subj_wildcards, output: out_dir=directory(bids_anat_out(datatype="roi_masks")), threads: 4 @@ -151,7 +151,7 @@ checkpoint create_exclude_mask: mask_dir=bids_anat_out( datatype="roi_masks", ), - subj_wildcards=inputs_dwi.subj_wildcards, + subj_wildcards=inputs.subj_wildcards, output: out_dir=directory(bids_anat_out(datatype="exclude_mask")), threads: 4 diff --git a/scattr/workflow/rules/qc.smk b/scattr/workflow/rules/qc.smk index fd638de6..46feae66 100644 --- a/scattr/workflow/rules/qc.smk +++ b/scattr/workflow/rules/qc.smk @@ -4,7 +4,7 @@ bids_labelmerge = partial( root=str(Path(labelmerge_dir) / "combined") if not config.get("skip_labelmerge") else config.get("labelmerge_base_dir") or zona_dir, - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) bids_qc = partial( @@ -12,7 +12,7 @@ bids_qc = partial( root=str(Path(config["output_dir"]) / "qc"), datatype="anat", space="T1w", - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) @@ -26,7 +26,7 @@ rule segment_qc: else config.get("labelmerge_base_desc"), suffix="dseg.nii.gz", ), - t1w_image=lambda wildcards: inputs_t1w["T1w"] + t1w_image=lambda wildcards: inputs["T1w"] .filter(**wildcards) .expand()[0], output: @@ -66,7 +66,7 @@ rule segment_qc: rule registration_qc: input: moving_nii=rules.reg2native.output.t1w_nativespace, - fixed_nii=lambda wildcards: inputs_t1w["T1w"] + fixed_nii=lambda wildcards: inputs["T1w"] .filter(**wildcards) .expand()[0], params: @@ -103,7 +103,7 @@ rule registration_qc: rule gather_qc: input: - dseg_png=inputs_t1w["T1w"].expand(rules.segment_qc.output.qc_png), - dseg_html=inputs_t1w["T1w"].expand(rules.segment_qc.output.qc_html), - reg_svg=inputs_t1w["T1w"].expand(rules.registration_qc.output.qc_svg), - reg_html=inputs_t1w["T1w"].expand(rules.registration_qc.output.qc_html), + dseg_png=inputs["T1w"].expand(rules.segment_qc.output.qc_png), + dseg_html=inputs["T1w"].expand(rules.segment_qc.output.qc_html), + reg_svg=inputs["T1w"].expand(rules.registration_qc.output.qc_svg), + reg_html=inputs["T1w"].expand(rules.registration_qc.output.qc_html), diff --git a/scattr/workflow/rules/zona_bb_subcortex.smk b/scattr/workflow/rules/zona_bb_subcortex.smk index 681c6d4f..d54cacae 100644 --- a/scattr/workflow/rules/zona_bb_subcortex.smk +++ b/scattr/workflow/rules/zona_bb_subcortex.smk @@ -12,7 +12,7 @@ bids_anat = partial( bids, root=zona_dir, datatype="anat", - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) bids_labelmerge = partial( @@ -20,13 +20,13 @@ bids_labelmerge = partial( root=str(Path(labelmerge_dir) / "combined") if not config.get("skip_labelmerge") else config.get("labelmerge_base_dir") or zona_dir, - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) bids_log = partial( bids, root=log_dir, - **inputs_t1w.subj_wildcards, + **inputs.subj_wildcards, ) """ References: @@ -71,7 +71,7 @@ rule reg2native: / Path(config["zona_bb_subcortex"][config["Space"]]["dir"]) / Path(config["zona_bb_subcortex"][config["Space"]]["T1w"]) ), - target=lambda wildcards: inputs_t1w["T1w"] + target=lambda wildcards: inputs["T1w"] .filter(**wildcards) .expand()[0], params: @@ -155,12 +155,12 @@ rule warp2native: rule labelmerge: input: - zona_seg=inputs_t1w["T1w"].expand( + zona_seg=inputs["T1w"].expand( rules.warp2native.output.nii, allow_missing=True ) if not config.get("labelmerge_base_dir") else [], - fs_seg=inputs_t1w["T1w"].expand( + fs_seg=inputs["T1w"].expand( rules.fs_xfm_to_native.output.thal, allow_missing=True ) if not config.get("labelmerge_overlay_dir") @@ -200,7 +200,7 @@ rule labelmerge: else "" ), output: - seg=inputs_t1w["T1w"].expand( + seg=inputs["T1w"].expand( bids_labelmerge( space="T1w", desc="combined", @@ -208,7 +208,7 @@ rule labelmerge: ), allow_missing=True, ), - tsv=inputs_t1w["T1w"].expand( + tsv=inputs["T1w"].expand( bids_labelmerge( space="T1w", desc="combined", From 267d893f08da89f872734f657c293a978691866e Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Thu, 6 Mar 2025 15:20:03 -0500 Subject: [PATCH 2/7] poe quality --- .github/dependabot.yml | 10 +++++----- scattr/workflow/rules/freesurfer.smk | 8 ++------ scattr/workflow/rules/zona_bb_subcortex.smk | 4 +--- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c8aa6d55..1e868f15 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,15 +1,15 @@ +--- version: 2 updates: - - package-ecosystem: "github-actions" + - package-ecosystem: github-actions # Workflow files stored in the default location of `.github/workflows`. # (You don't need to specify `/.github/workflows` for `directory`. # You can use `directory: "/"`.) - directory: "/" + directory: / # Run on first of each month schedule: - interval: "monthly" + interval: monthly # Group to submit a single PR if possible groups: github-actions: - patterns: - - "*" \ No newline at end of file + patterns: ['*'] diff --git a/scattr/workflow/rules/freesurfer.smk b/scattr/workflow/rules/freesurfer.smk index 07d73678..721ac171 100644 --- a/scattr/workflow/rules/freesurfer.smk +++ b/scattr/workflow/rules/freesurfer.smk @@ -76,9 +76,7 @@ rule thalamic_segmentation: subj_dir=str(Path(bids(**inputs.subj_wildcards)).parent), output: thal_seg=str( - Path( - bids(root=freesurfer_dir, **inputs.subj_wildcards) - ).parent + Path(bids(root=freesurfer_dir, **inputs.subj_wildcards)).parent / "mri" / "ThalamicNuclei.v12.T1.mgz" ), @@ -115,9 +113,7 @@ rule mgz2nii: if not config.get("skip_thal_seg") else [], aparcaseg=str( - Path( - bids(root=freesurfer_dir, **inputs.subj_wildcards) - ).parent + Path(bids(root=freesurfer_dir, **inputs.subj_wildcards)).parent / "mri" / "aparc+aseg.mgz" ), diff --git a/scattr/workflow/rules/zona_bb_subcortex.smk b/scattr/workflow/rules/zona_bb_subcortex.smk index d54cacae..68a7b487 100644 --- a/scattr/workflow/rules/zona_bb_subcortex.smk +++ b/scattr/workflow/rules/zona_bb_subcortex.smk @@ -71,9 +71,7 @@ rule reg2native: / Path(config["zona_bb_subcortex"][config["Space"]]["dir"]) / Path(config["zona_bb_subcortex"][config["Space"]]["T1w"]) ), - target=lambda wildcards: inputs["T1w"] - .filter(**wildcards) - .expand()[0], + target=lambda wildcards: inputs["T1w"].filter(**wildcards).expand()[0], params: out_dir=directory(str(Path(bids_anat()).parent)), out_prefix=bids_anat( From 3115f6d6c8e49405372234abe6647c5c7e4f3af3 Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Thu, 6 Mar 2025 15:33:42 -0500 Subject: [PATCH 3/7] fix tests --- pyproject.toml | 10 ++++++++-- scattr/config/snakebids.yml | 2 +- scattr/workflow/rules/mrtpipelines/preproc.smk | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e544d571..507f1286 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,14 +85,20 @@ python ./scattr/run.py ./test/data/bids test/data/derivatives/ participant \ [tool.poe.tasks.test_dwi] shell = """ python ./scattr/run.py ./test/data/bids_nodwi test/data/derivatives/ \ - participant --dwi_dir ./test/data/derivatives/prepdwi \ + participant --path-dwi \ + ./test/data/derivatives/prepdwi/sub-{subject}/dwi/sub-{subject}_space-T1w_desc-preproc_dwi.nii.gz \ + --path-mask \ + ./test/data/derivatives/prepdwi/sub-{subject}/dwi/sub-{subject}_space-T1w_desc-preproc_mask.nii.gz \ --fs-license ./test/.fs_license -np --force-output """ [tool.poe.tasks.test_snakedwi] shell = """ python ./scattr/run.py ./test/data/bids_nodwi test/data/derivatives/ \ - participant --dwi_dir ./test/data/derivatives/snakedwi \ + participant --path-dwi \ + ./test/data/derivatives/snakedwi/sub-{subject}/dwi/sub-{subject}_space-T1w_desc-eddy_res-orig_dwi.nii.gz \ + --path-dwi-mask \ + ./test/data/derivatives/snakedwi/sub-{subject}/dwi/sub-{subject}_space-T1w_desc-eddy_res-orig_mask.nii.gz \ --fs-license ./test/.fs_license -np --force-output """ diff --git a/scattr/config/snakebids.yml b/scattr/config/snakebids.yml index 9c0e0fe3..f6dcba29 100644 --- a/scattr/config/snakebids.yml +++ b/scattr/config/snakebids.yml @@ -41,7 +41,7 @@ pybids_inputs: - subject - session - run - dwi_mask: + mask: filters: suffix: "mask" extension: ".nii.gz" diff --git a/scattr/workflow/rules/mrtpipelines/preproc.smk b/scattr/workflow/rules/mrtpipelines/preproc.smk index b8f4ca5c..f3da513c 100644 --- a/scattr/workflow/rules/mrtpipelines/preproc.smk +++ b/scattr/workflow/rules/mrtpipelines/preproc.smk @@ -3,7 +3,7 @@ rule nii2mif: dwi=inputs["dwi"].path, bval=re.sub(".nii.gz", ".bval", inputs["dwi"].path), bvec=re.sub(".nii.gz", ".bvec", inputs["dwi"].path), - mask=inputs["dwi_mask"].path, + mask=inputs["mask"].path, output: dwi=bids( root=mrtrix_dir, From 0a2bba897732b19d62be128aa8b742006ccd030c Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Fri, 7 Mar 2025 08:48:57 -0500 Subject: [PATCH 4/7] add pin for docs requirements --- docs/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 34b809cd..2f4e50c8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ docutils<0.18 -sphinx-argparse +sphinx-argparse<0.5.0 sphinx_rtd_theme sphinxcontrib-asciinema -myst-parser \ No newline at end of file +myst-parser From e1aad4869dbb9f5b070abbbce05e39cc3c1b9824 Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Fri, 7 Mar 2025 09:06:57 -0500 Subject: [PATCH 5/7] update documentation accordingly --- docs/getting_started/installation.md | 6 ++++-- docs/outputs/output_files.md | 3 --- docs/usage/faq.md | 2 +- docs/usage/useful_options.md | 16 ++++++++++++---- scattr/config/snakebids.yml | 7 ------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md index a02faf4b..de743247 100644 --- a/docs/getting_started/installation.md +++ b/docs/getting_started/installation.md @@ -12,7 +12,9 @@ supported**. We do not have a Docker arm64 container yet._ ### Notes * Inputs to SCATTR should be a BIDS dataset, including processed Freesurfer -and DWI derivatives (which can be stored separately). +and DWI derivatives. If any BIDS files are stored separately, you can point to these using the +relevant `--path-{component}` CLI option. The Freesurfer folder is specified with a separate +CLI option `--freesurfer-dir`(which can be stored separately). ## Docker on Windows / Mac (Intel) / Linux @@ -49,4 +51,4 @@ Instructions can be found in the [Contributing](https://scattr.readthedocs.io/en * Flexibility to modify code ### Cons -* Only compatible on systems with Singularity for external dependencies \ No newline at end of file +* Only compatible on systems with Singularity for external dependencies diff --git a/docs/outputs/output_files.md b/docs/outputs/output_files.md index e4da6f09..7de8bf90 100644 --- a/docs/outputs/output_files.md +++ b/docs/outputs/output_files.md @@ -126,6 +126,3 @@ Workflow steps that write logs to file are stored in the hidden `.logs` subfolder, with the file names based on the tools used (e.g. `mrtrix`) and rule wildcards (e.g. `subject`). -If the app is run in workflow mode (`--workflow-mode` / `-W`), which enables -direct use of the Snakemake CLI to run scattr, output folders (e.g. `work`) will -be placed in a `results` folder. diff --git a/docs/usage/faq.md b/docs/usage/faq.md index 4d984c0d..ceeae584 100644 --- a/docs/usage/faq.md +++ b/docs/usage/faq.md @@ -21,7 +21,7 @@ the dataset, so we suggest using the your dataset has no errors. If you passed Freesurfer or diffusion derivative locations (`--freesurfer-dir` -or `--dwi-dir`), you may get get this message as the files are a different +or `--path-dwi`), you may get get this message as the files are a different location than in the input directory provided. ### 2. What if I want to use merge two different atlases? diff --git a/docs/usage/useful_options.md b/docs/usage/useful_options.md index 0facdb2c..f533eb41 100644 --- a/docs/usage/useful_options.md +++ b/docs/usage/useful_options.md @@ -44,11 +44,19 @@ Similarly, subjects can be excluded from processing using the ## Alternate Freesurfer / derived-diffusion data locations By default, SCATTR attempts to locate Freesurfer and derived diffusion data -locations. Users can overwrite these options, by passing along the actual -location of each using either `--freesurfer_dir` or `--dwi_dir`, respectively. +locations. Users can overwrite the Freesurfer location by passing `--freesurfer_dir`, +e.g.: ``` ---freesurfer_dir /path/to/fs_dir --dwi_dir /path/to/dwi_dir +--freesurfer_dir /path/to/fs_dir +``` + +The paths to any of the BIDS files (T1w, dwi, dwi mask) can always be customized +using the `--path-T1w`, `--path-dwi`, or `--path-mask` options. Note, you must +include generic wildcards in any path you specify, e.g.: + +``` +--path-T1w /mydata/project1/sub-{subject}/T1.nii.gz` ``` ## Pre-generated average response function @@ -121,4 +129,4 @@ filter out extra files, but for now, if your dataset has these issues, you will need to rename or remove extraneous files. More example of possible BIDS-compliant datasets can be found in -`scattr/test/data`. \ No newline at end of file +`scattr/test/data`. diff --git a/scattr/config/snakebids.yml b/scattr/config/snakebids.yml index f6dcba29..47777f01 100644 --- a/scattr/config/snakebids.yml +++ b/scattr/config/snakebids.yml @@ -101,13 +101,6 @@ parse_args: nargs: "?" type: Path - --dwi_dir: - help: "The path to the directory containing pre-processed dwi data - transformed to subject T1w space. If not provided, workflow assumes - this data exists in //dwi." - nargs: "?" - type: Path - --responsemean_dir: help: "The path to the directory containing average response functions. If not provided, one will be computed from the subjects in the input From 55e7b129b6e37731535ab549c5ba4bdea10e00d3 Mon Sep 17 00:00:00 2001 From: Alaa Taha <46094728+ataha24@users.noreply.github.com> Date: Fri, 7 Mar 2025 13:48:04 -0500 Subject: [PATCH 6/7] remove "part: ["mag", false]" to enable easier use of pybids filtering --- scattr/config/snakebids.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/scattr/config/snakebids.yml b/scattr/config/snakebids.yml index 47777f01..aa36fea9 100644 --- a/scattr/config/snakebids.yml +++ b/scattr/config/snakebids.yml @@ -26,7 +26,6 @@ pybids_inputs: extension: ".nii.gz" datatype: "anat" desc: "brain" # Require a skull-stripped brain - part: ["mag", false] wildcards: - subject - session From f0f4434b500a44a8ecaeca2c3badc77473d59061 Mon Sep 17 00:00:00 2001 From: Dhananjhay Date: Mon, 2 Jun 2025 10:01:42 -0400 Subject: [PATCH 7/7] export fs-license --- scattr/workflow/rules/freesurfer.smk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scattr/workflow/rules/freesurfer.smk b/scattr/workflow/rules/freesurfer.smk index 721ac171..b2fd5961 100644 --- a/scattr/workflow/rules/freesurfer.smk +++ b/scattr/workflow/rules/freesurfer.smk @@ -92,7 +92,7 @@ rule thalamic_segmentation: config["singularity"]["scattr"] shell: """ - FS_LICENSE={params.fs_license} + export FS_LICENSE={params.fs_license} export ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS={threads} export SUBJECTS_DIR={input.freesurfer_dir} @@ -143,7 +143,7 @@ rule mgz2nii: config["singularity"]["scattr"] shell: """ - FS_LICENSE={params.fs_license} + export FS_LICENSE={params.fs_license} export ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS={threads} export SUBJECTS_DIR={params.freesurfer_dir}