@@ -42,7 +42,7 @@ from datetime import datetime
42
42
from os .path import isdir
43
43
from os .path import basename
44
44
from os .path import dirname
45
- from os .path import exists
45
+ from os .path import lexists , exists
46
46
from os .path import join as pjoin
47
47
48
48
from random import sample
@@ -946,7 +946,18 @@ def convert(items, symlink=True, converter=None,
946
946
shutil .rmtree (tmpdir )
947
947
948
948
949
- def get_formatted_scans_key_row (item , outname_bids_files ):
949
+ def get_formatted_scans_key_row (item ):
950
+ """
951
+ Parameters
952
+ ----------
953
+ item
954
+
955
+ Returns
956
+ -------
957
+ row: list
958
+ [ISO acquisition time, performing physician name, random string]
959
+
960
+ """
950
961
dcm_fn = item [- 1 ][0 ]
951
962
mw = ds .wrapper_from_data (dcm .read_file (dcm_fn , stop_before_pixels = True ))
952
963
# we need to store filenames and acquisition times
@@ -961,16 +972,60 @@ def get_formatted_scans_key_row(item, outname_bids_files):
961
972
return row
962
973
963
974
975
+ def add_rows_to_scans_keys_file (fn , newrows ):
976
+ """
977
+ Add new rows to file fn for scans key filename
978
+
979
+ Parameters
980
+ ----------
981
+ fn: filename
982
+ newrows: extra rows to add
983
+ dict fn: [acquisition time, referring physician, random string]
984
+ """
985
+ if lexists (fn ):
986
+ with open (fn , 'r' ) as csvfile :
987
+ reader = csv .reader (csvfile , delimiter = '\t ' )
988
+ existing_rows = [row [0 ] for row in reader ]
989
+ # skip header
990
+ fnames2info = {row [0 ]: row [1 :] for row in existing_rows [1 :]}
991
+
992
+ newrows_key = newrows .key ()
993
+ newrows_toadd = list (set (newrows_key ) - set (fnames2info .keys ()))
994
+ for key_toadd in newrows_toadd :
995
+ fnames2info [key_toadd ] = newrows [key_toadd ]
996
+ header = []
997
+ # remove
998
+ os .unlink (fn )
999
+ else :
1000
+ header = ['filename' , 'acq_time' , 'operator' , 'randstr' ]
1001
+ fnames2info = newrows
1002
+
1003
+ # save
1004
+ with open (fn , 'a' ) as csvfile :
1005
+ writer = csv .writer (csvfile , delimiter = '\t ' )
1006
+ if header :
1007
+ writer .writerow (header )
1008
+ for key in sorted (fnames2info .keys ()):
1009
+ writer .writerow ([key ] + fnames2info [key ])
1010
+
1011
+
964
1012
def save_scans_key (items , outname_bids_files ):
965
- header = ['filename' , 'acq_time' , 'operator' , 'randstr' ]
966
- rows = []
1013
+ """
1014
+ Parameters
1015
+ ----------
1016
+ items:
1017
+ outname_bids_files:
1018
+
1019
+ Returns
1020
+ -------
1021
+
1022
+ """
1023
+ rows = dict ()
967
1024
for item , outname_bids_file in zip (items , outname_bids_files ):
968
1025
# get filenames
969
1026
f_name = '/' .join (outname_bids_file .split ('/' )[- 2 :])
970
1027
f_name = f_name .replace ('json' , 'nii.gz' )
971
- rows .append (
972
- [f_name ] + get_formatted_scans_key_row (item , outname_bids_file )
973
- )
1028
+ rows [f_name ] = get_formatted_scans_key_row (item )
974
1029
# where should we store it?
975
1030
output_dir = dirname (dirname (outname_bids_file ))
976
1031
# get subject info
@@ -980,10 +1035,9 @@ def save_scans_key(items, outname_bids_files):
980
1035
subj = subj [0 ]
981
1036
982
1037
# save
983
- with open (pjoin (output_dir , '{0}_scans.tsv' .format (subj )), 'w' ) as csvfile :
984
- writer = csv .writer (csvfile , delimiter = '\t ' )
985
- writer .writerow (header )
986
- writer .writerows (rows )
1038
+ add_rows_to_scans_keys_file (
1039
+ pjoin (output_dir , '{0}_scans.tsv' .format (subj )),
1040
+ rows )
987
1041
988
1042
989
1043
def tuneup_bids_json_files (json_files ):
0 commit comments