From 66324d2ab9b325b4cda859bce20bc3755d2a68f1 Mon Sep 17 00:00:00 2001 From: arnaudbore Date: Tue, 24 Oct 2023 23:21:13 -0400 Subject: [PATCH 1/2] add full list of path --- dcm2bids/acquisition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dcm2bids/acquisition.py b/dcm2bids/acquisition.py index b63c8a7a..cba30c76 100644 --- a/dcm2bids/acquisition.py +++ b/dcm2bids/acquisition.py @@ -278,7 +278,7 @@ def dstSidecarData(self, idList): values.append(idList.get(val, val)) if values[-1] != val: if isinstance(values[-1], list): - values[-1] = "bids::" + values[-1][0] + values[-1] = ["bids::" + img_dest for img_dest in values[-1]] else: values[-1] = "bids::" + values[-1] From b455cc445cf2aedc488c7b586573e56e12694feb Mon Sep 17 00:00:00 2001 From: arnaudbore Date: Fri, 17 Nov 2023 12:06:00 -0500 Subject: [PATCH 2/2] add test for multiple intendedFor + pep8 tests --- .../config_test_multiple_intendedfor.json | 33 +++++++ .../001_localizer_20100603125600_i00001.nii | 1 + .../001_localizer_20100603125600_i00002.nii | 1 + .../001_localizer_20100603125600_i00003.nii | 1 + tests/test_dcm2bids.py | 91 +++++++++++++++---- 5 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 tests/data/config_test_multiple_intendedfor.json create mode 100644 tests/data/sidecars/001_localizer_20100603125600_i00001.nii create mode 100644 tests/data/sidecars/001_localizer_20100603125600_i00002.nii create mode 100644 tests/data/sidecars/001_localizer_20100603125600_i00003.nii diff --git a/tests/data/config_test_multiple_intendedfor.json b/tests/data/config_test_multiple_intendedfor.json new file mode 100644 index 00000000..69ee02af --- /dev/null +++ b/tests/data/config_test_multiple_intendedfor.json @@ -0,0 +1,33 @@ +{ + "search_method": "fnmatch", + "extractors": {"SeriesDescription": ["task-(?P[a-zA-Z0-9]+)"]}, + "descriptions": [ + { + "id": "localizer", + "datatype": "localizer", + "suffix": "localizer", + "criteria": { + "SeriesDescription": "locali*" + } + }, + { + "id": "T1", + "datatype": "anat", + "suffix": "T1w", + "criteria": { + "SidecarFilename": "*MPRAGE*" + } + }, + { + "datatype": "fmap", + "suffix": "fmap", + "criteria": { + "EchoNumber": 1, + "EchoTime": 0.00492 + }, + "sidecar_changes": { + "IntendedFor": ["localizer", "T1"] + } + } + ] +} diff --git a/tests/data/sidecars/001_localizer_20100603125600_i00001.nii b/tests/data/sidecars/001_localizer_20100603125600_i00001.nii new file mode 100644 index 00000000..f6a892b5 --- /dev/null +++ b/tests/data/sidecars/001_localizer_20100603125600_i00001.nii @@ -0,0 +1 @@ +DUMMY_FILE_FOR_TEST \ No newline at end of file diff --git a/tests/data/sidecars/001_localizer_20100603125600_i00002.nii b/tests/data/sidecars/001_localizer_20100603125600_i00002.nii new file mode 100644 index 00000000..f6a892b5 --- /dev/null +++ b/tests/data/sidecars/001_localizer_20100603125600_i00002.nii @@ -0,0 +1 @@ +DUMMY_FILE_FOR_TEST \ No newline at end of file diff --git a/tests/data/sidecars/001_localizer_20100603125600_i00003.nii b/tests/data/sidecars/001_localizer_20100603125600_i00003.nii new file mode 100644 index 00000000..f6a892b5 --- /dev/null +++ b/tests/data/sidecars/001_localizer_20100603125600_i00003.nii @@ -0,0 +1 @@ +DUMMY_FILE_FOR_TEST \ No newline at end of file diff --git a/tests/test_dcm2bids.py b/tests/test_dcm2bids.py index 47a05912..17adb36b 100644 --- a/tests/test_dcm2bids.py +++ b/tests/test_dcm2bids.py @@ -95,7 +95,9 @@ def test_dcm2bids(): "sub-01_echo-738_fmap.json") data = load_json(fmapFile) fmapMtime = os.stat(fmapFile).st_mtime - assert data["IntendedFor"] == "bids::" + os.path.join("sub-01", "dwi", "sub-01_dwi.nii.gz") + assert data["IntendedFor"] == "bids::" + os.path.join("sub-01", + "dwi", + "sub-01_dwi.nii.gz") data = load_json( os.path.join( @@ -231,8 +233,12 @@ def test_dcm2bids_case_sensitive(): "fmap", "sub-01_echo-492_fmap.json") data = load_json(fmapFile) - assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", "dwi", "sub-01_dwi.nii.gz"), - "bids::" + os.path.join("sub-01", "anat", "sub-01_T1w.nii")] + assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", + "dwi", + "sub-01_dwi.nii.gz"), + "bids::" + os.path.join("sub-01", + "anat", + "sub-01_T1w.nii")] fmapFile = os.path.join(bids_dir.name, "sub-01", @@ -240,7 +246,9 @@ def test_dcm2bids_case_sensitive(): "sub-01_echo-738_fmap.json") data = load_json(fmapFile) fmapMtime = os.stat(fmapFile).st_mtime - assert data["IntendedFor"] == "bids::" + os.path.join("sub-01", "dwi", "sub-01_dwi.nii.gz") + assert data["IntendedFor"] == "bids::" + os.path.join("sub-01", + "dwi", + "sub-01_dwi.nii.gz") data = load_json( os.path.join( @@ -288,8 +296,12 @@ def test_dcm2bids_auto_extract(): data = load_json(epi_file) assert os.path.exists(epi_file) - assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", "dwi", "sub-01_dwi.nii.gz"), - "bids::" + os.path.join("sub-01", "anat", "sub-01_T1w.nii")] + assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", + "dwi", + "sub-01_dwi.nii.gz"), + "bids::" + os.path.join("sub-01", + "anat", + "sub-01_T1w.nii")] func_task = os.path.join(bids_dir.name, "sub-01", "func", @@ -459,8 +471,6 @@ def test_dcm2bids_sidecar(): session="dev") app.run() - layout = BIDSLayout(bids_dir.name, validate=False) - # existing field data = load_json(os.path.join(bids_dir.name, "sub-01", @@ -483,8 +493,8 @@ def test_dcm2bids_sidecar(): "ses-dev", "fmap", "sub-01_ses-dev_echo-492_fmap.json")) - assert data["MTState"] == True - + assert data["MTState"] + # boolean value if input as a string data = load_json(os.path.join(bids_dir.name, "sub-01", @@ -499,10 +509,22 @@ def test_dcm2bids_sidecar(): "ses-dev", "dwi", "sub-01_ses-dev_desc-fa01_dwi.json")) - assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", "ses-dev", "dwi", "sub-01_ses-dev_dwi.nii.gz"), - "bids::" + os.path.join("sub-01", "ses-dev", "anat", "sub-01_ses-dev_T1w.nii")] - assert data["Sources"] == ["bids::" + os.path.join("sub-01", "ses-dev", "anat", "sub-01_ses-dev_T1w.nii"), - "bids::" + os.path.join("sub-01", "ses-dev", "dwi", "sub-01_ses-dev_dwi.nii.gz")] + assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", + "ses-dev", + "dwi", + "sub-01_ses-dev_dwi.nii.gz"), + "bids::" + os.path.join("sub-01", + "ses-dev", + "anat", + "sub-01_ses-dev_T1w.nii")] + assert data["Sources"] == ["bids::" + os.path.join("sub-01", + "ses-dev", + "anat", + "sub-01_ses-dev_T1w.nii"), + "bids::" + os.path.join("sub-01", + "ses-dev", + "dwi", + "sub-01_ses-dev_dwi.nii.gz")] # list with 1 item data = load_json(os.path.join(bids_dir.name, @@ -510,5 +532,42 @@ def test_dcm2bids_sidecar(): "ses-dev", "dwi", "sub-01_ses-dev_desc-trace_dwi.json")) - assert data["IntendedFor"] == "bids::" + os.path.join("sub-01", "ses-dev", "dwi", "sub-01_ses-dev_dwi.nii.gz") - assert data["Sources"] == "bids::" + os.path.join("sub-01", "ses-dev", "anat", "sub-01_ses-dev_T1w.nii") \ No newline at end of file + assert data["IntendedFor"] == "bids::" + os.path.join("sub-01", + "ses-dev", + "dwi", + "sub-01_ses-dev_dwi.nii.gz") + assert data["Sources"] == "bids::" + os.path.join("sub-01", + "ses-dev", + "anat", + "sub-01_ses-dev_T1w.nii") + + +def test_dcm2bids_multiple_intendedFor(): + bids_dir = TemporaryDirectory() + + tmp_sub_dir = os.path.join(bids_dir.name, DEFAULT.tmp_dir_name, "sub-01") + shutil.copytree(os.path.join(TEST_DATA_DIR, "sidecars"), tmp_sub_dir) + + app = Dcm2BidsGen(TEST_DATA_DIR, "01", + os.path.join(TEST_DATA_DIR, + "config_test_multiple_intendedfor.json"), + bids_dir.name, + auto_extract_entities=True) + app.run() + + epi_file = os.path.join(bids_dir.name, "sub-01", "fmap", "sub-01_fmap.json") + data = load_json(epi_file) + + assert os.path.exists(epi_file) + assert data["IntendedFor"] == ["bids::" + os.path.join("sub-01", + "localizer", + "sub-01_run-01_localizer.nii"), + "bids::" + os.path.join("sub-01", + "localizer", + "sub-01_run-02_localizer.nii"), + "bids::" + os.path.join("sub-01", + "localizer", + "sub-01_run-03_localizer.nii"), + "bids::" + os.path.join("sub-01", + "anat", + "sub-01_T1w.nii")]