From 26acae054a26241929ca2459f1f7e4c6b237fe72 Mon Sep 17 00:00:00 2001 From: Joey Scanga Date: Mon, 2 Mar 2026 07:51:16 -0600 Subject: [PATCH 1/2] skipping dcm2niix shouldn't allow collisions ran into an issue where, when running dcm2bids on multiple NIFTI-only directories with similar naming structures (i.e. series 1 named '1.nii.gz', series 2 named '2.nii.gz', etc.) would collide names when using shutil.copytree(). the solution here is to add a prefix to each file that's the base path of the dicom directory --- dcm2bids/dcm2niix_gen.py | 10 +++++++--- dcm2bids/sidecar.py | 12 ++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/dcm2bids/dcm2niix_gen.py b/dcm2bids/dcm2niix_gen.py index d43e81fe..435aef3c 100644 --- a/dcm2bids/dcm2niix_gen.py +++ b/dcm2bids/dcm2niix_gen.py @@ -9,6 +9,7 @@ import tarfile import zipfile from glob import glob +from pathlib import Path from dcm2bids.utils.io import valid_path from dcm2bids.utils.utils import DEFAULT, run_shell_command @@ -153,8 +154,11 @@ def execute(self): self.logger.info("Check log file for dcm2niix output\n") else: for dicomDir in self.dicom_dirs: - shutil.copytree(dicomDir, self.output_dir, dirs_exist_ok=True) - cmd = ['cp', '-r', dicomDir, self.output_dir] - self.logger.info("Running: %s", " ".join(str(item) for item in cmd)) + for filepath in Path(dicomDir).rglob("*"): + if filepath.is_file(): + shutil.copy(filepath, Path(self.output_dir / f"{Path(dicomDir).name}_{filepath.name}"), follow_symlinks=True) + # shutil.copytree(dicomDir, self.output_dir, dirs_exist_ok=True) + # cmd = ['cp', '-r', dicomDir, self.output_dir] + # self.logger.info("Running: %s", " ".join(str(item) for item in cmd)) self.logger.info("Not running dcm2niix\n") diff --git a/dcm2bids/sidecar.py b/dcm2bids/sidecar.py index 6b21ada1..e0579d66 100644 --- a/dcm2bids/sidecar.py +++ b/dcm2bids/sidecar.py @@ -302,9 +302,9 @@ def compare(name, pattern): def compare_list(name, pattern): try: subResult = [ - len(name) == len(pattern), - isinstance(pattern, list), - ] + len(name) == len(pattern), + isinstance(pattern, list), + ] for subName, subPattern in zip(name, pattern): subResult.append(compare(subName, subPattern)) except Exception: @@ -436,8 +436,8 @@ def build_acquisitions(self, participant): acquisitions.append(acq) self.logger.info( - f"{acq.dstFile.replace(f'{acq.participant.prefix}-', '')}" - f" <- {sidecarName}") + f"{acq.dstFile.replace(f'{acq.participant.prefix}-', '')}" + f" <- {sidecarName}") elif len(valid_descriptions) == 0: self.logger.info(f"No Pairing <- {sidecarName}") @@ -578,6 +578,6 @@ def duplicates(seq): dup = dup[0:-1] for runNum, acqInd in enumerate(dup): - runStr = templateDup.format(runNum+1) + runStr = templateDup.format(runNum + 1) self.acquisitions[acqInd].custom_entities += runStr self.acquisitions[acqInd].setDstFile() From 9dbb618a2d58fa631730e5ddcb0eccc4dd287d65 Mon Sep 17 00:00:00 2001 From: Joey Scanga <62576716+joey-scanga@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:04:35 -0600 Subject: [PATCH 2/2] added log back in --- dcm2bids/dcm2niix_gen.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dcm2bids/dcm2niix_gen.py b/dcm2bids/dcm2niix_gen.py index 435aef3c..1e1280e6 100644 --- a/dcm2bids/dcm2niix_gen.py +++ b/dcm2bids/dcm2niix_gen.py @@ -157,8 +157,6 @@ def execute(self): for filepath in Path(dicomDir).rglob("*"): if filepath.is_file(): shutil.copy(filepath, Path(self.output_dir / f"{Path(dicomDir).name}_{filepath.name}"), follow_symlinks=True) - # shutil.copytree(dicomDir, self.output_dir, dirs_exist_ok=True) - # cmd = ['cp', '-r', dicomDir, self.output_dir] - # self.logger.info("Running: %s", " ".join(str(item) for item in cmd)) + self.logger.info("Copying NIFTI files/sidecars from: %s", dicomDir) self.logger.info("Not running dcm2niix\n")