def test_coreg_gui_automation(): """Test that properties get properly updated.""" from mne.gui._file_traits import DigSource from mne.gui._fiducials_gui import MRIHeadWithFiducialsModel from mne.gui._coreg_gui import CoregModel subject = 'sample' hsp = DigSource() hsp.file = raw_path mri = MRIHeadWithFiducialsModel(subjects_dir=subjects_dir, subject=subject) model = CoregModel(mri=mri, hsp=hsp) # gh-7254 assert not (model.nearest_transformed_high_res_mri_idx_hsp == 0).all() model.fit_fiducials() model.icp_iterations = 2 model.nasion_weight = 2. model.fit_icp() model.omit_hsp_points(distance=5e-3) model.icp_iterations = 2 model.fit_icp() errs_icp = np.median(model._get_point_distance()) assert 2e-3 < errs_icp < 3e-3 info = mne.io.read_info(raw_path) errs_nearest = np.median( dig_mri_distances(info, fname_trans, subject, subjects_dir)) assert 1e-3 < errs_nearest < 2e-3
def coreg_head2mri(subjects_dir, subject, native_fid, raw_path, raw_NosePtsOut, trans_dst, flag_fid=False): import scipy.io import numpy as np from mne.gui._coreg_gui import CoregModel model = CoregModel() model.mri.subjects_dir = subjects_dir model.mri.subject = subject # Remove Polhemus points around the nose (y>0, z<0) model.hsp.file = raw_path head_pts = model.hsp.points raw = read_raw_fif(raw_path, preload=True) pos = np.where((head_pts[:,1] <= 0) | (head_pts[:,2] >= 0)) dig = raw.info['dig'] dig2 = dig[0:8] dig3 = [dig[p+7] for p in pos[0]] dig_yeah = dig2+dig3 raw.info['dig'] = dig_yeah raw.save(raw_NosePtsOut, overwrite=True) model.hsp.file = raw_NosePtsOut # Load CamCAN fiducials from matlab file if flag_fid: fid = scipy.io.loadmat(native_fid, struct_as_record=False, squeeze_me=True) fid = fid['fid'] model.mri.lpa = np.reshape(fid.native.mm.lpa*0.001,(1,3)) model.mri.nasion = np.reshape(fid.native.mm.nas*0.001,(1,3)) model.mri.rpa = np.reshape(fid.native.mm.rpa*0.001,(1,3)) assert (model.mri.fid_ok) lpa_distance = model.lpa_distance nasion_distance = model.nasion_distance rpa_distance = model.rpa_distance model.nasion_weight = 1. model.fit_fiducials(0) old_x = lpa_distance ** 2 + rpa_distance ** 2 + nasion_distance ** 2 new_x = (model.lpa_distance ** 2 + model.rpa_distance ** 2 + model.nasion_distance ** 2) assert new_x < old_x avg_point_distance = np.mean(model.point_distance) while True: model.fit_icp(0) new_dist = np.mean(model.point_distance) assert new_dist < avg_point_distance if model.status_text.endswith('converged)'): break model.save_trans(trans_dst) trans = mne.read_trans(trans_dst) np.testing.assert_allclose(trans['trans'], model.head_mri_t)
def test_coreg_model(): """Test CoregModel.""" from mne.gui._coreg_gui import CoregModel tempdir = _TempDir() trans_dst = op.join(tempdir, 'test-trans.fif') model = CoregModel() pytest.raises(RuntimeError, model.save_trans, 'blah.fif') model.mri.subjects_dir = subjects_dir model.mri.subject = 'sample' assert not model.mri.fid_ok model.mri.lpa = [[-0.06, 0, 0]] model.mri.nasion = [[0, 0.05, 0]] model.mri.rpa = [[0.08, 0, 0]] assert (model.mri.fid_ok) model.hsp.file = raw_path assert_allclose(model.hsp.lpa, [[-7.137e-2, 0, 5.122e-9]], 1e-4) assert_allclose(model.hsp.rpa, [[+7.527e-2, 0, 5.588e-9]], 1e-4) assert_allclose(model.hsp.nasion, [[+3.725e-9, 1.026e-1, 4.191e-9]], 1e-4) assert model.has_lpa_data assert model.has_nasion_data assert model.has_rpa_data assert len(model.hsp.eeg_points) > 1 assert len(model.mri.bem_low_res.surf.rr) == 2562 assert len(model.mri.bem_high_res.surf.rr) == 267122 lpa_distance = model.lpa_distance nasion_distance = model.nasion_distance rpa_distance = model.rpa_distance avg_point_distance = np.mean(model.point_distance) model.nasion_weight = 1. model.fit_fiducials(0) old_x = lpa_distance ** 2 + rpa_distance ** 2 + nasion_distance ** 2 new_x = (model.lpa_distance ** 2 + model.rpa_distance ** 2 + model.nasion_distance ** 2) assert new_x < old_x model.fit_icp(0) new_dist = np.mean(model.point_distance) assert new_dist < avg_point_distance model.save_trans(trans_dst) trans = mne.read_trans(trans_dst) assert_allclose(trans['trans'], model.head_mri_t) # test restoring trans x, y, z = 100, 200, 50 rot_x, rot_y, rot_z = np.rad2deg([1.5, 0.1, -1.2]) model.trans_x = x model.trans_y = y model.trans_z = z model.rot_x = rot_x model.rot_y = rot_y model.rot_z = rot_z trans = model.mri_head_t model.reset_traits(["trans_x", "trans_y", "trans_z", "rot_x", "rot_y", "rot_z"]) assert_equal(model.trans_x, 0) model.set_trans(trans) assert_array_almost_equal(model.trans_x, x) assert_array_almost_equal(model.trans_y, y) assert_array_almost_equal(model.trans_z, z) assert_array_almost_equal(model.rot_x, rot_x) assert_array_almost_equal(model.rot_y, rot_y) assert_array_almost_equal(model.rot_z, rot_z) # info assert (isinstance(model.fid_eval_str, str)) assert (isinstance(model.points_eval_str, str)) # scaling job assert not model.can_prepare_bem_model model.n_scale_params = 1 assert (model.can_prepare_bem_model) model.prepare_bem_model = True sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('sample2', False) assert_equal(sdir, subjects_dir) assert_equal(sfrom, 'sample') assert_equal(sto, 'sample2') assert_allclose(scale, model.parameters[6:9]) assert_equal(skip_fiducials, False) # find BEM files bems = set() for fname in os.listdir(op.join(subjects_dir, 'sample', 'bem')): match = re.match(r'sample-(.+-bem)\.fif', fname) if match: bems.add(match.group(1)) assert_equal(set(bemsol), bems) model.prepare_bem_model = False sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('sample2', True) assert_equal(bemsol, []) assert (skip_fiducials) model.load_trans(fname_trans) model.save_trans(trans_dst) trans = mne.read_trans(trans_dst) assert_allclose(trans['trans'], model.head_mri_t) assert_allclose(invert_transform(trans)['trans'][:3, 3] * 1000., [model.trans_x, model.trans_y, model.trans_z])
def test_coreg_model_with_fsaverage(): """Test CoregModel with the fsaverage brain data.""" tempdir = _TempDir() from mne.gui._coreg_gui import CoregModel mne.create_default_subject(subjects_dir=tempdir, fs_home=op.join(subjects_dir, '..')) model = CoregModel() model.mri.subjects_dir = tempdir model.mri.subject = 'fsaverage' assert (model.mri.fid_ok) model.hsp.file = raw_path lpa_distance = model.lpa_distance nasion_distance = model.nasion_distance rpa_distance = model.rpa_distance avg_point_distance = np.mean(model.point_distance) # test hsp point omission model.nasion_weight = 1. model.trans_y = -0.008 model.fit_fiducials(0) model.omit_hsp_points(0.02) assert model.hsp.n_omitted == 1 model.omit_hsp_points(np.inf) assert model.hsp.n_omitted == 0 model.omit_hsp_points(0.02) assert model.hsp.n_omitted == 1 model.omit_hsp_points(0.01) assert model.hsp.n_omitted == 4 model.omit_hsp_points(0.005) assert model.hsp.n_omitted == 40 model.omit_hsp_points(0.01) assert model.hsp.n_omitted == 4 model.omit_hsp_points(0.02) assert model.hsp.n_omitted == 1 # scale with 1 parameter model.n_scale_params = 1 model.fit_fiducials(1) old_x = lpa_distance ** 2 + rpa_distance ** 2 + nasion_distance ** 2 new_x = (model.lpa_distance ** 2 + model.rpa_distance ** 2 + model.nasion_distance ** 2) assert (new_x < old_x) model.fit_icp(1) avg_point_distance_1param = np.mean(model.point_distance) assert (avg_point_distance_1param < avg_point_distance) # scaling job sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('scaled', False) assert_equal(sdir, tempdir) assert_equal(sfrom, 'fsaverage') assert_equal(sto, 'scaled') assert_allclose(scale, model.parameters[6:9]) assert_equal(set(bemsol), set(('inner_skull-bem',))) model.prepare_bem_model = False sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('scaled', False) assert_equal(bemsol, []) # scale with 3 parameters model.n_scale_params = 3 model.fit_icp(3) assert (np.mean(model.point_distance) < avg_point_distance_1param) # test switching raw disables point omission assert_equal(model.hsp.n_omitted, 1) model.hsp.file = kit_raw_path assert_equal(model.hsp.n_omitted, 0)
def test_coreg_model(): """Test CoregModel.""" from mne.gui._coreg_gui import CoregModel tempdir = _TempDir() trans_dst = op.join(tempdir, 'test-trans.fif') model = CoregModel() pytest.raises(RuntimeError, model.save_trans, 'blah.fif') model.mri.subjects_dir = subjects_dir model.mri.subject = 'sample' assert not model.mri.fid_ok model.mri.lpa = [[-0.06, 0, 0]] model.mri.nasion = [[0, 0.05, 0]] model.mri.rpa = [[0.08, 0, 0]] assert (model.mri.fid_ok) model.hsp.file = raw_path assert_allclose(model.hsp.lpa, [[-7.137e-2, 0, 5.122e-9]], 1e-4) assert_allclose(model.hsp.rpa, [[+7.527e-2, 0, 5.588e-9]], 1e-4) assert_allclose(model.hsp.nasion, [[+3.725e-9, 1.026e-1, 4.191e-9]], 1e-4) assert model.has_lpa_data assert model.has_nasion_data assert model.has_rpa_data assert len(model.hsp.eeg_points) > 1 assert len(model.mri.bem_low_res.surf.rr) == 2562 assert len(model.mri.bem_high_res.surf.rr) == 267122 lpa_distance = model.lpa_distance nasion_distance = model.nasion_distance rpa_distance = model.rpa_distance avg_point_distance = np.mean(model.point_distance) model.nasion_weight = 1. model.fit_fiducials(0) old_x = lpa_distance**2 + rpa_distance**2 + nasion_distance**2 new_x = (model.lpa_distance**2 + model.rpa_distance**2 + model.nasion_distance**2) assert new_x < old_x model.fit_icp(0) new_dist = np.mean(model.point_distance) assert new_dist < avg_point_distance model.save_trans(trans_dst) trans = mne.read_trans(trans_dst) assert_allclose(trans['trans'], model.head_mri_t) # test restoring trans x, y, z = 100, 200, 50 rot_x, rot_y, rot_z = np.rad2deg([1.5, 0.1, -1.2]) model.trans_x = x model.trans_y = y model.trans_z = z model.rot_x = rot_x model.rot_y = rot_y model.rot_z = rot_z trans = model.mri_head_t model.reset_traits( ["trans_x", "trans_y", "trans_z", "rot_x", "rot_y", "rot_z"]) assert_equal(model.trans_x, 0) model.set_trans(trans) assert_array_almost_equal(model.trans_x, x) assert_array_almost_equal(model.trans_y, y) assert_array_almost_equal(model.trans_z, z) assert_array_almost_equal(model.rot_x, rot_x) assert_array_almost_equal(model.rot_y, rot_y) assert_array_almost_equal(model.rot_z, rot_z) # info assert (isinstance(model.fid_eval_str, str)) assert (isinstance(model.points_eval_str, str)) # scaling job assert not model.can_prepare_bem_model model.n_scale_params = 1 assert (model.can_prepare_bem_model) model.prepare_bem_model = True sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('sample2', False) assert_equal(sdir, subjects_dir) assert_equal(sfrom, 'sample') assert_equal(sto, 'sample2') assert_allclose(scale, model.parameters[6:9]) assert_equal(skip_fiducials, False) # find BEM files bems = set() for fname in os.listdir(op.join(subjects_dir, 'sample', 'bem')): match = re.match(r'sample-(.+-bem)\.fif', fname) if match: bems.add(match.group(1)) assert_equal(set(bemsol), bems) model.prepare_bem_model = False sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('sample2', True) assert_equal(bemsol, []) assert (skip_fiducials) model.load_trans(fname_trans) model.save_trans(trans_dst) trans = mne.read_trans(trans_dst) assert_allclose(trans['trans'], model.head_mri_t) assert_allclose( invert_transform(trans)['trans'][:3, 3] * 1000., [model.trans_x, model.trans_y, model.trans_z])
def test_coreg_model_with_fsaverage(): """Test CoregModel with the fsaverage brain data.""" tempdir = _TempDir() from mne.gui._coreg_gui import CoregModel mne.create_default_subject(subjects_dir=tempdir, fs_home=op.join(subjects_dir, '..')) model = CoregModel() model.mri.subjects_dir = tempdir model.mri.subject = 'fsaverage' assert (model.mri.fid_ok) model.hsp.file = raw_path lpa_distance = model.lpa_distance nasion_distance = model.nasion_distance rpa_distance = model.rpa_distance avg_point_distance = np.mean(model.point_distance) # test hsp point omission model.nasion_weight = 1. model.trans_y = -0.008 model.fit_fiducials(0) model.omit_hsp_points(0.02) assert model.hsp.n_omitted == 1 model.omit_hsp_points(np.inf) assert model.hsp.n_omitted == 0 model.omit_hsp_points(0.02) assert model.hsp.n_omitted == 1 model.omit_hsp_points(0.01) assert model.hsp.n_omitted == 4 model.omit_hsp_points(0.005) assert model.hsp.n_omitted == 40 model.omit_hsp_points(0.01) assert model.hsp.n_omitted == 4 model.omit_hsp_points(0.02) assert model.hsp.n_omitted == 1 # scale with 1 parameter model.n_scale_params = 1 model.fit_fiducials(1) old_x = lpa_distance**2 + rpa_distance**2 + nasion_distance**2 new_x = (model.lpa_distance**2 + model.rpa_distance**2 + model.nasion_distance**2) assert (new_x < old_x) model.fit_icp(1) avg_point_distance_1param = np.mean(model.point_distance) assert (avg_point_distance_1param < avg_point_distance) # scaling job sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('scaled', False) assert_equal(sdir, tempdir) assert_equal(sfrom, 'fsaverage') assert_equal(sto, 'scaled') assert_allclose(scale, model.parameters[6:9]) assert_equal(set(bemsol), set(('inner_skull-bem', ))) model.prepare_bem_model = False sdir, sfrom, sto, scale, skip_fiducials, labels, annot, bemsol = \ model.get_scaling_job('scaled', False) assert_equal(bemsol, []) # scale with 3 parameters model.n_scale_params = 3 model.fit_icp(3) assert (np.mean(model.point_distance) < avg_point_distance_1param) # test switching raw disables point omission assert_equal(model.hsp.n_omitted, 1) model.hsp.file = kit_raw_path assert_equal(model.hsp.n_omitted, 0)