Skip to content

Commit 84f180c

Browse files
committed
remove partial volumes, generated by dcm2niix as derived data
1 parent a1f35d4 commit 84f180c

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

heudiconv/convert.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,7 @@ def save_converted_files(
885885

886886
bids_outfiles: list[str] = []
887887
res_files = res.outputs.converted_files
888+
bids_files = res.outputs.bids
888889

889890
if not len(res_files):
890891
lgr.debug("DICOMs {} were not converted".format(item_dicoms))
@@ -925,6 +926,42 @@ def rename_files() -> None:
925926
# we should provide specific handling for fmap,
926927
# dwi etc which might spit out multiple files
927928

929+
# Also copy BIDS files although they might need to
930+
# be merged/postprocessed later
931+
bids_files = (
932+
sorted(bids_files)
933+
if len(bids_files) == len(res_files)
934+
else [None] * len(res_files)
935+
)
936+
# preload since will be used in multiple spots
937+
bids_metas = [load_json(b) for b in bids_files if b]
938+
939+
# interrupted scans on XA: see dcm2niix #742
940+
partial_volumes = [
941+
bool(metadata.get("RawImage", True)) for metadata in bids_metas
942+
]
943+
has_partial_volumes = any(partial_volumes) and not all(partial_volumes)
944+
945+
if has_partial_volumes:
946+
for fl, bids_meta, bids_file, is_pv in zip(
947+
res_files, bids_metas, bids_files, partial_volumes
948+
):
949+
if is_pv:
950+
# remove partial volume
951+
os.remove(fl)
952+
os.remove(bids_file)
953+
res_files.remove(fl)
954+
bids_files.remove(bids_file)
955+
bids_metas.remove(bids_meta)
956+
lgr.warning(f"dropped {fl} partial volume from interrupted series")
957+
if len(res_files) == 1:
958+
res_files, bids_files, bids_metas = (
959+
res_files[0],
960+
bids_files[0],
961+
bids_metas[0],
962+
)
963+
964+
if isinstance(res_files, list):
928965
suffixes = (
929966
[str(i + 1) for i in range(len(res_files))]
930967
if (bids_options is not None)
@@ -941,16 +978,6 @@ def rename_files() -> None:
941978
)
942979
suffixes = [str(-i - 1) for i in range(len(res_files))]
943980

944-
# Also copy BIDS files although they might need to
945-
# be merged/postprocessed later
946-
bids_files = (
947-
sorted(res.outputs.bids)
948-
if len(res.outputs.bids) == len(res_files)
949-
else [None] * len(res_files)
950-
)
951-
# preload since will be used in multiple spots
952-
bids_metas = [load_json(b) for b in bids_files if b]
953-
954981
### Do we have a multi-echo series? ###
955982
# Some Siemens sequences (e.g. CMRR's MB-EPI) set the label 'TE1',
956983
# 'TE2', etc. in the 'ImageType' field. However, other seqs do not
@@ -1043,7 +1070,7 @@ def rename_files() -> None:
10431070
safe_movefile(res_files, outname, overwrite)
10441071
if isdefined(res.outputs.bids):
10451072
try:
1046-
safe_movefile(res.outputs.bids, outname_bids, overwrite)
1073+
safe_movefile(bids_files, outname_bids, overwrite)
10471074
bids_outfiles.append(outname_bids)
10481075
except TypeError: ##catch lists
10491076
raise TypeError("Multiple BIDS sidecars detected.")

0 commit comments

Comments
 (0)