Skip to content

Commit 463d902

Browse files
committed
Reload scans keys if existing, start adding tests
1 parent 079e63d commit 463d902

File tree

2 files changed

+80
-13
lines changed

2 files changed

+80
-13
lines changed

bin/heudiconv

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ from datetime import datetime
4242
from os.path import isdir
4343
from os.path import basename
4444
from os.path import dirname
45-
from os.path import exists
45+
from os.path import lexists, exists
4646
from os.path import join as pjoin
4747

4848
from random import sample
@@ -946,7 +946,18 @@ def convert(items, symlink=True, converter=None,
946946
shutil.rmtree(tmpdir)
947947

948948

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+
"""
950961
dcm_fn = item[-1][0]
951962
mw = ds.wrapper_from_data(dcm.read_file(dcm_fn, stop_before_pixels=True))
952963
# we need to store filenames and acquisition times
@@ -961,16 +972,60 @@ def get_formatted_scans_key_row(item, outname_bids_files):
961972
return row
962973

963974

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+
9641012
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()
9671024
for item, outname_bids_file in zip(items, outname_bids_files):
9681025
# get filenames
9691026
f_name = '/'.join(outname_bids_file.split('/')[-2:])
9701027
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)
9741029
# where should we store it?
9751030
output_dir = dirname(dirname(outname_bids_file))
9761031
# get subject info
@@ -980,10 +1035,9 @@ def save_scans_key(items, outname_bids_files):
9801035
subj = subj[0]
9811036

9821037
# 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)
9871041

9881042

9891043
def tuneup_bids_json_files(json_files):

tests/test_main.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,24 @@ def test_get_formatted_scans_key_row():
115115
]
116116
outname_bids_file = '/a/path/Halchenko/Yarik/950_bids_test4/sub-phantom1sid1/fmap/sub-phantom1sid1_acq-3mm_phasediff.json'
117117

118-
row = heudiconv.get_formatted_scans_key_row(item, outname_bids_file)
118+
row = heudiconv.get_formatted_scans_key_row(item)
119119
assert(len(row) == 3)
120120
assert(row[0] == '2016-10-14T09:26:34')
121121
assert(row[1] == '')
122122
randstr1 = row[2]
123-
row = heudiconv.get_formatted_scans_key_row(item, outname_bids_file)
123+
row = heudiconv.get_formatted_scans_key_row(item)
124124
randstr2 = row[2]
125125
assert(randstr1 != randstr2)
126+
127+
128+
# TODO: finish this
129+
def test_add_rows_to_scans_keys_file(tmpdir):
130+
fn = opj(tmpdir.strpath, 'file.tsv')
131+
rows = {
132+
'my_file.nii.gz': ['2016adsfasd', '', 'fasadfasdf'],
133+
'another_file.nii.gz': ['2018xxxxx', '', 'fasadfasdf']
134+
}
135+
heudiconv.add_rows_to_scans_keys_file(fn, rows)
136+
137+
#with open(fn, 'r') as csvfile:
138+

0 commit comments

Comments
 (0)