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
def test_normal_orth(): """Test _normal_orth.""" nns = np.eye(3) for nn in nns: ori = _normal_orth(nn) assert_allclose(ori[2], nn, atol=1e-12)