def test__combine_t2s(): """ Test tedana.combine._combine_t2s """ np.random.seed(0) n_voxels, n_echos, n_trs = 20, 3, 10 data = np.random.random((n_voxels, n_echos, n_trs)) tes = np.array([[10, 20, 30]]) # 1 x E # Voxel- and volume-wise T2* estimates t2s = np.random.random((n_voxels, n_trs, 1)) # M x T x 1 comb = combine._combine_t2s(data, tes, t2s) assert comb.shape == (n_voxels, n_trs) # Voxel-wise T2* estimates t2s = np.random.random((n_voxels, 1)) # M x 1 comb = combine._combine_t2s(data, tes, t2s) assert comb.shape == (n_voxels, n_trs)
def test__apply_t2s_floor(): """ _apply_t2s_floor applies a floor to T2* values to prevent a ZeroDivisionError during optimal combination. """ n_voxels, n_echos, n_trs = 100, 5, 25 echo_times = np.array([2, 23, 54, 75, 96]) me_data = np.random.random((n_voxels, n_echos, n_trs)) t2s = np.random.random((n_voxels)) * 1000 t2s[t2s < 1] = 1 # Crop at 1 ms to be safe t2s[0] = 0.001 # First establish a failure with pytest.raises(ZeroDivisionError): _ = combine._combine_t2s(me_data, echo_times[None, :], t2s[:, None]) # Now correct the T2* map and get a successful result. t2s_corrected = me._apply_t2s_floor(t2s, echo_times) assert t2s_corrected[0] != t2s[0] # First value should be corrected assert np.array_equal(t2s_corrected[1:], t2s[1:]) # No other values should be corrected combined = combine._combine_t2s(me_data, echo_times[None, :], t2s_corrected[:, None]) assert np.all(combined != 0)