def test_screen(): img = ni.load_image(funcfile) res = screen(img) assert_equal(res['mean'].ndim, 3) assert_equal(res['pca'].ndim, 4) assert_equal(sorted(res.keys()), ['max', 'mean', 'min', 'pca', 'pca_res', 'std', 'ts_res']) data = img.get_data() # Check summary images assert_array_equal(np.max(data, axis=-1), res['max'].get_data()) assert_array_equal(np.mean(data, axis=-1), res['mean'].get_data()) assert_array_equal(np.min(data, axis=-1), res['min'].get_data()) assert_array_equal(np.std(data, axis=-1), res['std'].get_data()) pca_res = pca(data, axis=-1, standardize=False, ncomp=10) # On windows, there seems to be some randomness in the PCA output vector # signs; this routine sets the basis vectors to have first value positive, # and therefore standardizes the signs pca_res = res2pos1(pca_res) _check_pca(res, pca_res) _check_ts(res, data, 3, 2) # Test that screens accepts and uses time axis data_mean = data.mean(axis=-1) res = screen(img, time_axis='t') assert_array_equal(data_mean, res['mean'].get_data()) _check_pca(res, pca_res) _check_ts(res, data, 3, 2) res = screen(img, time_axis=-1) assert_array_equal(data_mean, res['mean'].get_data()) _check_pca(res, pca_res) _check_ts(res, data, 3, 2) t0_img = rollimg(img, 't') t0_data = np.rollaxis(data, -1) res = screen(t0_img, time_axis='t') t0_pca_res = pca(t0_data, axis=0, standardize=False, ncomp=10) t0_pca_res = res2pos1(t0_pca_res) assert_array_equal(data_mean, res['mean'].get_data()) _check_pca(res, t0_pca_res) _check_ts(res, t0_data, 0, 3) res = screen(t0_img, time_axis=0) assert_array_equal(data_mean, res['mean'].get_data()) _check_pca(res, t0_pca_res) _check_ts(res, t0_data, 0, 3) # Check screens uses slice axis s0_img = rollimg(img, 2, 0) s0_data = np.rollaxis(data, 2, 0) res = screen(s0_img, slice_axis=0) _check_ts(res, s0_data, 3, 0) # And defaults to named slice axis # First re-show that when we don't specify, we get the default res = screen(img) _check_ts(res, data, 3, 2) assert_raises(AssertionError, _check_ts, res, data, 3, 0) # Then specify, get non-default slicey_img = img.renamed_axes(i='slice') res = screen(slicey_img) _check_ts(res, data, 3, 0) assert_raises(AssertionError, _check_ts, res, data, 3, 2)
def test_nipy_diagnose(): # Test nipy diagnose script fimg = load_image(funcfile) ncomps = 12 with InTemporaryDirectory() as tmpdir: cmd = ['nipy_diagnose', funcfile, '--ncomponents={0}'.format(ncomps), '--out-path=' + tmpdir] run_command(cmd) for out_fname in ('components_functional.png', 'pcnt_var_functional.png', 'tsdiff_functional.png', 'vectors_components_functional.npz'): assert_true(isfile(out_fname)) for out_img in ('max_functional.nii.gz', 'mean_functional.nii.gz', 'min_functional.nii.gz', 'std_functional.nii.gz'): img = load_image(out_img) assert_equal(img.shape, fimg.shape[:-1]) del img pca_img = load_image('pca_functional.nii.gz') assert_equal(pca_img.shape, fimg.shape[:-1] + (ncomps,)) vecs_comps = np.load('vectors_components_functional.npz') vec_diff = vecs_comps['slice_mean_diff2'].copy()# just in case assert_equal(vec_diff.shape, (fimg.shape[-1]-1, fimg.shape[2])) del pca_img, vecs_comps with InTemporaryDirectory() as tmpdir: # Check we can pass in slice and time flags s0_img = rollimg(fimg, 'k') save_image(s0_img, 'slice0.nii') cmd = ['nipy_diagnose', 'slice0.nii', '--ncomponents={0}'.format(ncomps), '--out-path=' + tmpdir, '--time-axis=t', '--slice-axis=0'] run_command(cmd) pca_img = load_image('pca_slice0.nii') assert_equal(pca_img.shape, s0_img.shape[:-1] + (ncomps,)) vecs_comps = np.load('vectors_components_slice0.npz') assert_almost_equal(vecs_comps['slice_mean_diff2'], vec_diff) del pca_img, vecs_comps