def invs(): """Inverses of various amounts of loose.""" fwd = read_forward_solution(fname_fwd) fwd = pick_types_forward(fwd, meg=True, eeg=False) fwd_surf = convert_forward_solution(fwd, surf_ori=True) evoked = read_evokeds(fname_evoked, baseline=(None, 0))[0] noise_cov = read_cov(fname_cov) free = make_inverse_operator(evoked.info, fwd, noise_cov, loose=1.) free_surf = make_inverse_operator(evoked.info, fwd_surf, noise_cov, loose=1.) freeish = make_inverse_operator(evoked.info, fwd, noise_cov, loose=0.9999) fixed = make_inverse_operator(evoked.info, fwd, noise_cov, loose=0.) fixedish = make_inverse_operator(evoked.info, fwd, noise_cov, loose=0.0001) assert_allclose(free['source_nn'], np.kron(np.ones(fwd['nsource']), np.eye(3)).T, atol=1e-7) # This is the one exception: assert not np.allclose(free['source_nn'], free_surf['source_nn']) assert_allclose(free['source_nn'], np.tile(np.eye(3), (free['nsource'], 1)), atol=1e-7) # All others are similar: for other in (freeish, fixedish): assert_allclose(free_surf['source_nn'], other['source_nn'], atol=1e-7) assert_allclose(free_surf['source_nn'][2::3], fixed['source_nn'], atol=1e-7) expected_nn = np.concatenate([_get_src_nn(s) for s in fwd['src']]) assert_allclose(fixed['source_nn'], expected_nn, atol=1e-7) return evoked, free, free_surf, freeish, fixed, fixedish
def test_orientation_prior(bias_params_free, method, looses, vmin, vmax, nmin, nmax): """Test that orientation priors are handled properly.""" evoked, fwd, noise_cov, _, _ = bias_params_free stcs = list() vec_stc = None for loose in looses: inv = make_inverse_operator(evoked.info, fwd, noise_cov, loose=loose) if looses[0] == 0.: pick_ori = None if loose == 0 else 'normal' else: pick_ori = 'vector' stcs.append(apply_inverse( evoked, inv, method=method, pick_ori=pick_ori)) if loose in (1., 0.2): assert vec_stc is None vec_stc = apply_inverse( evoked, inv, method=method, pick_ori='vector') assert vec_stc is not None rot = _normal_orth(np.concatenate( [_get_src_nn(s) for s in inv['src']])) vec_stc_surf = np.matmul(rot, vec_stc.data) if 0. in looses: vec_stc_normal = vec_stc.normal(inv['src']) assert_allclose(stcs[1].data, vec_stc_normal.data) del vec_stc assert_allclose(vec_stc_normal.data, vec_stc_surf[:, 2]) assert_allclose(vec_stc_normal.data, stcs[1].data) # Ensure that our relative strengths are reasonable # (normal should be much larger than tangential) normal = np.linalg.norm(vec_stc_surf[:, 2].ravel()) for ii in range(2): tangential = np.linalg.norm(vec_stc_surf[:, ii].ravel()) ratio = normal / tangential assert nmin < ratio < nmax assert stcs[0].data.shape == stcs[1].data.shape R2 = 1. - ( np.linalg.norm(stcs[0].data.ravel() - stcs[1].data.ravel()) / np.linalg.norm(stcs[0].data.ravel())) assert vmin < R2 < vmax