1
1
"""Test functions in heudiconv.convert module.
2
2
"""
3
3
import pytest
4
-
5
- from heudiconv .convert import (update_complex_name ,
6
- update_multiecho_name ,
7
- update_uncombined_name )
8
4
from heudiconv .bids import BIDSError
5
+ from heudiconv .convert import (
6
+ update_complex_name ,
7
+ update_multiecho_name ,
8
+ update_uncombined_name ,
9
+ )
9
10
10
11
11
12
def test_update_complex_name ():
@@ -19,16 +20,19 @@ def test_update_complex_name():
19
20
out_fn_true = 'sub-X_ses-Y_task-Z_rec-phase_run-01_sbref'
20
21
out_fn_test = update_complex_name (metadata , fn , suffix )
21
22
assert out_fn_test == out_fn_true
23
+
22
24
# Catch an unsupported type and *do not* update
23
25
fn = 'sub-X_ses-Y_task-Z_run-01_phase'
24
26
out_fn_test = update_complex_name (metadata , fn , suffix )
25
27
assert out_fn_test == fn
28
+
26
29
# Data type is missing from metadata so use suffix
27
30
fn = 'sub-X_ses-Y_task-Z_run-01_sbref'
28
31
metadata = {'ImageType' : ['ORIGINAL' , 'PRIMARY' , 'MB' , 'TE3' , 'ND' , 'MOSAIC' ]}
29
32
out_fn_true = 'sub-X_ses-Y_task-Z_rec-3_run-01_sbref'
30
33
out_fn_test = update_complex_name (metadata , fn , suffix )
31
34
assert out_fn_test == out_fn_true
35
+
32
36
# Catch existing field with value that *does not match* metadata
33
37
# and raise Exception
34
38
fn = 'sub-X_ses-Y_task-Z_rec-magnitude_run-01_sbref'
@@ -50,15 +54,37 @@ def test_update_multiecho_name():
50
54
out_fn_true = 'sub-X_ses-Y_task-Z_run-01_echo-1_bold'
51
55
out_fn_test = update_multiecho_name (metadata , fn , echo_times )
52
56
assert out_fn_test == out_fn_true
57
+
53
58
# EchoNumber field is missing from metadata, so use echo_times
54
59
metadata = {'EchoTime' : 0.01 }
55
60
out_fn_test = update_multiecho_name (metadata , fn , echo_times )
56
61
assert out_fn_test == out_fn_true
62
+
57
63
# Catch an unsupported type and *do not* update
58
64
fn = 'sub-X_ses-Y_task-Z_run-01_phasediff'
59
65
out_fn_test = update_multiecho_name (metadata , fn , echo_times )
60
66
assert out_fn_test == fn
61
67
68
+ # EchoTime is missing, but use EchoNumber (which is the first thing it checks)
69
+ fn = 'sub-X_ses-Y_task-Z_run-01_bold'
70
+ out_fn_true = 'sub-X_ses-Y_task-Z_run-01_echo-1_bold'
71
+ metadata = {'EchoNumber' : 1 }
72
+ echo_times = [False , 0.02 , 0.03 ]
73
+ out_fn_test = update_multiecho_name (metadata , fn , echo_times )
74
+ assert out_fn_test == out_fn_true
75
+
76
+ # Both EchoTime and EchoNumber are missing, which raises a KeyError
77
+ fn = 'sub-X_ses-Y_task-Z_run-01_bold'
78
+ metadata = {}
79
+ echo_times = [False , 0.02 , 0.03 ]
80
+ with pytest .raises (KeyError ):
81
+ update_multiecho_name (metadata , fn , echo_times )
82
+
83
+ # Providing echo times as something other than a list should raise a TypeError
84
+ fn = 'sub-X_ses-Y_task-Z_run-01_bold'
85
+ with pytest .raises (TypeError ):
86
+ update_multiecho_name (metadata , fn , set (echo_times ))
87
+
62
88
63
89
def test_update_uncombined_name ():
64
90
"""Unit testing for heudiconv.convert.update_uncombined_name(), which updates
@@ -71,8 +97,29 @@ def test_update_uncombined_name():
71
97
out_fn_true = 'sub-X_ses-Y_task-Z_run-01_ch-01_bold'
72
98
out_fn_test = update_uncombined_name (metadata , fn , channel_names )
73
99
assert out_fn_test == out_fn_true
74
- # CoilString field has no number in it
100
+
101
+ # CoilString field has no number in it, so we index the channel_names list
75
102
metadata = {'CoilString' : 'HEA;HEP' }
76
103
out_fn_true = 'sub-X_ses-Y_task-Z_run-01_ch-04_bold'
77
104
out_fn_test = update_uncombined_name (metadata , fn , channel_names )
78
105
assert out_fn_test == out_fn_true
106
+
107
+ # Extract the number from the CoilString and use that
108
+ channel_names = ['H1' , 'B1' , 'H3' , 'HEA;HEP' ]
109
+ metadata = {'CoilString' : 'H1' }
110
+ out_fn_true = 'sub-X_ses-Y_task-Z_run-01_ch-01_bold'
111
+ out_fn_test = update_uncombined_name (metadata , fn , channel_names )
112
+ assert out_fn_test == out_fn_true
113
+
114
+ # NOTE: Extracting the number does not protect against multiple coils with the same number
115
+ # (but, say, different letters)
116
+ # Note that this is still "ch-01"
117
+ metadata = {'CoilString' : 'B1' }
118
+ out_fn_true = 'sub-X_ses-Y_task-Z_run-01_ch-01_bold'
119
+ out_fn_test = update_uncombined_name (metadata , fn , channel_names )
120
+ assert out_fn_test == out_fn_true
121
+
122
+ # Providing echo times as something other than a list should raise a TypeError
123
+ fn = 'sub-X_ses-Y_task-Z_run-01_bold'
124
+ with pytest .raises (TypeError ):
125
+ update_uncombined_name (metadata , fn , set (channel_names ))
0 commit comments