@@ -885,6 +885,7 @@ def save_converted_files(
885
885
886
886
bids_outfiles : list [str ] = []
887
887
res_files = res .outputs .converted_files
888
+ bids_files = res .outputs .bids
888
889
889
890
if not len (res_files ):
890
891
lgr .debug ("DICOMs {} were not converted" .format (item_dicoms ))
@@ -925,6 +926,42 @@ def rename_files() -> None:
925
926
# we should provide specific handling for fmap,
926
927
# dwi etc which might spit out multiple files
927
928
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 ):
928
965
suffixes = (
929
966
[str (i + 1 ) for i in range (len (res_files ))]
930
967
if (bids_options is not None )
@@ -941,16 +978,6 @@ def rename_files() -> None:
941
978
)
942
979
suffixes = [str (- i - 1 ) for i in range (len (res_files ))]
943
980
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
-
954
981
### Do we have a multi-echo series? ###
955
982
# Some Siemens sequences (e.g. CMRR's MB-EPI) set the label 'TE1',
956
983
# 'TE2', etc. in the 'ImageType' field. However, other seqs do not
@@ -1043,7 +1070,7 @@ def rename_files() -> None:
1043
1070
safe_movefile (res_files , outname , overwrite )
1044
1071
if isdefined (res .outputs .bids ):
1045
1072
try :
1046
- safe_movefile (res . outputs . bids , outname_bids , overwrite )
1073
+ safe_movefile (bids_files , outname_bids , overwrite )
1047
1074
bids_outfiles .append (outname_bids )
1048
1075
except TypeError : ##catch lists
1049
1076
raise TypeError ("Multiple BIDS sidecars detected." )
0 commit comments