From 21c0566d1aafd2c8d79b4ae4855f7159965e8fac Mon Sep 17 00:00:00 2001 From: Oscar Esteban Date: Thu, 13 May 2021 06:51:16 -0700 Subject: [PATCH] MAINT: Update tests after changes in ds001771's structure The new tests also exercise the problems being addressed in #197. --- .circleci/config.yml | 1 + .github/workflows/travis.yml | 3 +- sdcflows/utils/wrangler.py | 63 ++++++++------------ sdcflows/workflows/fit/tests/test_pepolar.py | 37 ++++-------- sdcflows/workflows/fit/tests/test_phdiff.py | 4 +- 5 files changed, 42 insertions(+), 66 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7b4102a4e3..7a051d36e6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -103,6 +103,7 @@ jobs: datalad install -r https://github.com/nipreps-data/ds001771.git datalad update -r --merge -d ds001771/ datalad get -r -d ds001771/ ds001771/sub-36/* + datalad get -r -d ds001771/derivatives ds001771/derivatives/openneuro/sub-36/* - run: name: Install ds000206 diff --git a/.github/workflows/travis.yml b/.github/workflows/travis.yml index 78d9f24592..94343a7fd9 100644 --- a/.github/workflows/travis.yml +++ b/.github/workflows/travis.yml @@ -134,8 +134,9 @@ jobs: # ds001771 datalad install -r https://github.com/nipreps-data/ds001771.git - datalad update --merge -d ds001771/ + datalad update -r --merge -d ds001771/ datalad get -r -d ds001771/ ds001771/sub-36/* + datalad get -r -d ds001771/derivatives ds001771/derivatives/openneuro/sub-36/* # ds000054 datalad install -r https://github.com/nipreps-data/ds000054.git diff --git a/sdcflows/utils/wrangler.py b/sdcflows/utils/wrangler.py index 943a80212d..52dda2f1aa 100644 --- a/sdcflows/utils/wrangler.py +++ b/sdcflows/utils/wrangler.py @@ -51,20 +51,15 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): [FieldmapEstimation(sources=<3 files>, method=, bids_id='auto_00000')] - OpenNeuro's dataset with fake :math:`B_0` maps derived from two *PEPOLAR* acquisitions - has a total of 4 possible estimations: the two original *PEPOLAR* acquisitions and the - corresponding two that are just renamed versions of the former: + OpenNeuro's dataset with four *PEPOLAR* EPI files, two runs per phase-encoding direction + (AP, PA): >>> find_estimators( ... layout=layouts['ds001771'], ... subject="36", ... ) # doctest: +ELLIPSIS - [FieldmapEstimation(sources=<2 files>, method=, bids_id='auto_00001'), - FieldmapEstimation(sources=<2 files>, method=, bids_id='auto_00002'), - FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00003'), - FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00004')] + [FieldmapEstimation(sources=<4 files>, method=, + bids_id='auto_00001')] OpenNeuro's ``ds001600`` is an SDC test-dataset containing many different possibilities for fieldmap estimation: @@ -74,13 +69,13 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): ... subject="1", ... ) # doctest: +ELLIPSIS [FieldmapEstimation(sources=<4 files>, method=, - bids_id='auto_00005'), + bids_id='auto_00002'), FieldmapEstimation(sources=<4 files>, method=, - bids_id='auto_00006'), + bids_id='auto_00003'), FieldmapEstimation(sources=<3 files>, method=, - bids_id='auto_00007'), + bids_id='auto_00004'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00008')] + bids_id='auto_00005')] We can also pick one (simplified) HCP subject for testing purposes: @@ -89,9 +84,9 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): ... subject="101006", ... ) # doctest: +ELLIPSIS [FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00009'), + bids_id='auto_00006'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00010')] + bids_id='auto_00007')] Finally, *SDCFlows*' "*dataset A*" contains a BIDS structure with zero-bytes NIfTI files and some corresponding metadata: @@ -101,15 +96,15 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): ... subject="01", ... ) # doctest: +ELLIPSIS [FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00011'), + bids_id='auto_00008'), FieldmapEstimation(sources=<4 files>, method=, - bids_id='auto_00012'), + bids_id='auto_00009'), FieldmapEstimation(sources=<3 files>, method=, - bids_id='auto_00013'), + bids_id='auto_00010'), FieldmapEstimation(sources=<4 files>, method=, - bids_id='auto_00014'), + bids_id='auto_00011'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00015')] + bids_id='auto_00012')] After cleaning the registry, we can see how the "*fieldmap-less*" estimation can be forced: @@ -134,20 +129,14 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): ... subject="36", ... force_fmapless=True, ... ) # doctest: +ELLIPSIS - [FieldmapEstimation(sources=<2 files>, method=, + [FieldmapEstimation(sources=<4 files>, method=, bids_id='auto_00002'), - FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00003'), - FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00004'), - FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00005'), FieldmapEstimation(sources=<7 files>, method=, - bids_id='auto_00006'), + bids_id='auto_00003'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00007'), + bids_id='auto_00004'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00008')] + bids_id='auto_00005')] Because "*dataset A*" contains very few metadata fields available, "*fieldmap-less*" heuristics come back empty (BOLD and DWI files are missing @@ -159,15 +148,15 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): ... force_fmapless=True, ... ) # doctest: +ELLIPSIS [FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00009'), + bids_id='auto_00006'), FieldmapEstimation(sources=<4 files>, method=, - bids_id='auto_00010'), + bids_id='auto_00007'), FieldmapEstimation(sources=<3 files>, method=, - bids_id='auto_00011'), + bids_id='auto_00008'), FieldmapEstimation(sources=<4 files>, method=, - bids_id='auto_00012'), + bids_id='auto_00009'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00013')] + bids_id='auto_00010')] This function should also correctly investigate multi-session datasets: @@ -186,9 +175,9 @@ def find_estimators(*, layout, subject, fmapless=True, force_fmapless=False): ... force_fmapless=False, ... ) # doctest: +ELLIPSIS [FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00014'), + bids_id='auto_00011'), FieldmapEstimation(sources=<2 files>, method=, - bids_id='auto_00015')] + bids_id='auto_00012')] """ from .. import fieldmaps as fm diff --git a/sdcflows/workflows/fit/tests/test_pepolar.py b/sdcflows/workflows/fit/tests/test_pepolar.py index 3770569d24..f7de5edaa0 100644 --- a/sdcflows/workflows/fit/tests/test_pepolar.py +++ b/sdcflows/workflows/fit/tests/test_pepolar.py @@ -10,43 +10,26 @@ @pytest.mark.skipif(os.getenv("TRAVIS") == "true", reason="this is TravisCI") @pytest.mark.skipif(os.getenv("GITHUB_ACTIONS") == "true", reason="this is GH Actions") -@pytest.mark.parametrize( - "epi_file", - [ - ( - "ds001771/sub-36/fmap/sub-36_acq-topup1_dir-01_epi.nii.gz", - "ds001771/sub-36/fmap/sub-36_acq-topup1_dir-02_epi.nii.gz", - ), - ( - "ds001771/sub-36/fmap/sub-36_acq-topup2_dir-01_epi.nii.gz", - "ds001771/sub-36/fmap/sub-36_acq-topup2_dir-02_epi.nii.gz", - ), - ( - "HCP101006/sub-101006/fmap/sub-101006_dir-LR_epi.nii.gz", - "HCP101006/sub-101006/fmap/sub-101006_dir-RL_epi.nii.gz", - ), - ], -) -def test_topup_wf(tmpdir, datadir, workdir, outdir, epi_file): +@pytest.mark.parametrize("ds", ("ds001771", "HCP101006")) +def test_topup_wf(tmpdir, bids_layouts, workdir, outdir, ds): """Test preparation workflow.""" - epi_path = [datadir / f for f in epi_file] - in_data = [str(f.absolute()) for f in epi_path] - - wf = pe.Workflow( - name=f"topup_{epi_path[0].name.replace('.nii.gz', '').replace('-', '_')}" + layout = bids_layouts[ds] + epi_path = sorted( + layout.get(suffix="epi", extension=["nii", "nii.gz"]), key=lambda k: k.path ) + in_data = [f.path for f in epi_path] + wf = pe.Workflow(name=f"topup_{ds}") topup_wf = init_topup_wf(omp_nthreads=2, debug=True, sloppy=True) - metadata = [ - loads(Path(str(f).replace(".nii.gz", ".json")).read_text()) for f in in_data - ] + metadata = [layout.get_metadata(f.path) for f in epi_path] + topup_wf.inputs.inputnode.in_data = in_data topup_wf.inputs.inputnode.metadata = metadata if outdir: from ...outputs import init_fmap_derivatives_wf, init_fmap_reports_wf - outdir = outdir / "unittests" / epi_file[0].split("/")[0] + outdir = outdir / "unittests" / f"topup_{ds}" fmap_derivatives_wf = init_fmap_derivatives_wf( output_dir=str(outdir), write_coeff=True, diff --git a/sdcflows/workflows/fit/tests/test_phdiff.py b/sdcflows/workflows/fit/tests/test_phdiff.py index 2f15566d62..d42a351178 100644 --- a/sdcflows/workflows/fit/tests/test_phdiff.py +++ b/sdcflows/workflows/fit/tests/test_phdiff.py @@ -18,7 +18,9 @@ "ds001600/sub-1/fmap/sub-1_acq-v2_phase1.nii.gz", "ds001600/sub-1/fmap/sub-1_acq-v2_phase2.nii.gz", ), - ("ds001771/sub-36/fmap/sub-36_acq-topup1_fieldmap.nii.gz",), + ( + "ds001771/derivatives/openneuro/sub-36/fmap/sub-36_acq-topup1_fieldmap.nii.gz", + ), ("HCP101006/sub-101006/fmap/sub-101006_phasediff.nii.gz",), ], )