@@ -1015,6 +1015,15 @@ def add_rows_to_scans_keys_file(fn, newrows):
1015
1015
writer .writerow ([key ] + fnames2info [key ])
1016
1016
1017
1017
1018
+ def _find_subj_ses (f_name ):
1019
+ """Given a path to the bids formatted filename parse out subject/session"""
1020
+ # we will allow the match at either directories or within filename
1021
+ # assuming that bids layout is "correct"
1022
+ regex = re .compile ('sub-(?P<subj>[a-zA-Z0-9]*)([/_]ses-(?P<ses>[a-zA-Z0-9]*))?' )
1023
+ res = regex .search (f_name ).groupdict ()
1024
+ return res .get ('subj' ), res .get ('ses' , None )
1025
+
1026
+
1018
1027
def save_scans_key (items , outname_bids_files ):
1019
1028
"""
1020
1029
Parameters
@@ -1027,23 +1036,38 @@ def save_scans_key(items, outname_bids_files):
1027
1036
1028
1037
"""
1029
1038
rows = dict ()
1039
+ # we will need to deduce subject and session from the bids_filename
1040
+ # and if there is a conflict, we would just blow since this function
1041
+ # should be invoked only on a result of a single item conversion as far
1042
+ # as I see it, so should have the same subject/session
1043
+ subj , ses = None , None
1044
+
1030
1045
for item , outname_bids_file in zip (items , outname_bids_files ):
1031
1046
# get filenames
1032
1047
f_name = '/' .join (outname_bids_file .split ('/' )[- 2 :])
1033
1048
f_name = f_name .replace ('json' , 'nii.gz' )
1034
1049
rows [f_name ] = get_formatted_scans_key_row (item )
1050
+ subj_ , ses_ = _find_subj_ses (f_name )
1051
+ if subj and subj_ != subj :
1052
+ raise ValueError (
1053
+ "We found before subject %s but now deduced %s from %s"
1054
+ % (subj , subj_ , f_name )
1055
+ )
1056
+ subj = subj_
1057
+ if ses and ses_ != ses :
1058
+ raise ValueError (
1059
+ "We found before session %s but now deduced %s from %s"
1060
+ % (ses , ses_ , f_name )
1061
+ )
1062
+ ses = ses_
1035
1063
# where should we store it?
1036
1064
output_dir = dirname (dirname (outname_bids_file ))
1037
- # get subject info
1038
- subj_pattern = re .compile ('(sub-[a-zA-Z0-9]*)' )
1039
- subj = subj_pattern .findall (f_name )
1040
- assert (len (subj ) >= 1 )
1041
- subj = subj [0 ]
1042
-
1043
1065
# save
1066
+ ses = '_ses-%s' % ses if ses else ''
1044
1067
add_rows_to_scans_keys_file (
1045
- pjoin (output_dir , '{0}_scans.tsv' .format (subj )),
1046
- rows )
1068
+ pjoin (output_dir , '{0}{1}_scans.tsv' .format (subj , ses )),
1069
+ rows
1070
+ )
1047
1071
1048
1072
1049
1073
def tuneup_bids_json_files (json_files ):
0 commit comments