def test_make_dig_points(): """Test application of Polhemus HSP to info.""" extra_points = read_polhemus_fastscan(hsp_fname, on_header_missing='ignore') info = create_info(ch_names=['Test Ch'], sfreq=1000.) assert info['dig'] is None info['dig'] = _make_dig_points(extra_points=extra_points) assert (info['dig']) assert_allclose(info['dig'][0]['r'], [-.10693, .09980, .06881]) elp_points = read_polhemus_fastscan(elp_fname, on_header_missing='ignore') nasion, lpa, rpa = elp_points[:3] info = create_info(ch_names=['Test Ch'], sfreq=1000.) assert info['dig'] is None info['dig'] = _make_dig_points(nasion, lpa, rpa, elp_points[3:], None) assert (info['dig']) idx = [d['ident'] for d in info['dig']].index(FIFF.FIFFV_POINT_NASION) assert_allclose(info['dig'][idx]['r'], [.0013930, .0131613, -.0046967]) pytest.raises(ValueError, _make_dig_points, nasion[:2]) pytest.raises(ValueError, _make_dig_points, None, lpa[:2]) pytest.raises(ValueError, _make_dig_points, None, None, rpa[:2]) pytest.raises(ValueError, _make_dig_points, None, None, None, elp_points[:, :2]) pytest.raises(ValueError, _make_dig_points, None, None, None, None, elp_points[:, :2])
def test_fif_dig_montage(): """Test FIF dig montage support.""" dig_montage = read_dig_fif(fif_dig_montage_fname) # test round-trip IO temp_dir = _TempDir() fname_temp = op.join(temp_dir, 'test.fif') _check_roundtrip(dig_montage, fname_temp) # Make a BrainVision file like the one the user would have had raw_bv = read_raw_brainvision(bv_fname, preload=True) raw_bv_2 = raw_bv.copy() mapping = dict() for ii, ch_name in enumerate(raw_bv.ch_names): mapping[ch_name] = 'EEG%03d' % (ii + 1,) raw_bv.rename_channels(mapping) for ii, ch_name in enumerate(raw_bv_2.ch_names): mapping[ch_name] = 'EEG%03d' % (ii + 33,) raw_bv_2.rename_channels(mapping) raw_bv.add_channels([raw_bv_2]) for ch in raw_bv.info['chs']: ch['kind'] = FIFF.FIFFV_EEG_CH # Set the montage raw_bv.set_montage(dig_montage) # Check the result evoked = read_evokeds(evoked_fname)[0] # check info[chs] matches assert_equal(len(raw_bv.ch_names), len(evoked.ch_names) - 1) for ch_py, ch_c in zip(raw_bv.info['chs'], evoked.info['chs'][:-1]): assert_equal(ch_py['ch_name'], ch_c['ch_name'].replace('EEG ', 'EEG')) # C actually says it's unknown, but it's not (?): # assert_equal(ch_py['coord_frame'], ch_c['coord_frame']) assert_equal(ch_py['coord_frame'], FIFF.FIFFV_COORD_HEAD) c_loc = ch_c['loc'].copy() c_loc[c_loc == 0] = np.nan assert_allclose(ch_py['loc'], c_loc, atol=1e-7) # check info[dig] assert_dig_allclose(raw_bv.info, evoked.info) # Roundtrip of non-FIF start montage = make_dig_montage(hsp=read_polhemus_fastscan(hsp), hpi=read_mrk(hpi)) elp_points = read_polhemus_fastscan(elp) ch_pos = {"EEG%03d" % (k + 1): pos for k, pos in enumerate(elp_points[8:])} montage += make_dig_montage(nasion=elp_points[0], lpa=elp_points[1], rpa=elp_points[2], ch_pos=ch_pos) pytest.raises(RuntimeError, montage.save, fname_temp) # must be head coord montage = transform_to_head(montage) _check_roundtrip(montage, fname_temp)
def test_read_dig_montage_using_polhemus_fastscan_error_handling(tmpdir): """Test reading Polhemus FastSCAN errors.""" with open(op.join(kit_dir, 'test_elp.txt')) as fid: content = fid.read().replace('FastSCAN', 'XxxxXXXX') fname = str(tmpdir.join('faulty_FastSCAN.txt')) with open(fname, 'w') as fid: fid.write(content) with pytest.raises(ValueError, match='not contain Polhemus FastSCAN'): _ = read_polhemus_fastscan(fname) EXPECTED_ERR_MSG = "allowed value is '.txt', but got '.bar' instead" with pytest.raises(ValueError, match=EXPECTED_ERR_MSG): _ = read_polhemus_fastscan(fname=tmpdir.join('foo.bar'))
def test_read_dig_montage_using_polhemus_fastscan(): """Test FastScan.""" N_EEG_CH = 10 my_electrode_positions = read_polhemus_fastscan( op.join(kit_dir, 'test_elp.txt') ) montage = make_dig_montage( # EEG_CH ch_pos=dict(zip(ascii_lowercase[:N_EEG_CH], np.random.RandomState(0).rand(N_EEG_CH, 3))), # NO NAMED points nasion=my_electrode_positions[0], lpa=my_electrode_positions[1], rpa=my_electrode_positions[2], hpi=my_electrode_positions[3:], hsp=read_polhemus_fastscan(op.join(kit_dir, 'test_hsp.txt')), # Other defaults coord_frame='unknown' ) assert repr(montage) == ( '<DigMontage | ' '500 extras (headshape), 5 HPIs, 3 fiducials, 10 channels>' ) # XXX: is this wrong? extra is not in headspace, is it? assert set([d['coord_frame'] for d in montage.dig]) == { FIFF.FIFFV_COORD_UNKNOWN } # XXX: so far we build everything in 'unknown' EXPECTED_FID_IN_POLHEMUS = { 'nasion': [0.001393, 0.0131613, -0.0046967], 'lpa': [-0.0624997, -0.0737271, 0.07996], 'rpa': [-0.0748957, 0.0873785, 0.0811943], } fiducials, fid_coordframe = _get_fid_coords(montage.dig) assert fid_coordframe == FIFF.FIFFV_COORD_UNKNOWN for kk, val in fiducials.items(): assert_allclose(val, EXPECTED_FID_IN_POLHEMUS[kk])
def test_io_dig_points(tmpdir): """Test Writing for dig files.""" points = read_polhemus_fastscan(hsp_fname, on_header_missing='ignore') dest = str(tmpdir.join('test.txt')) dest_bad = str(tmpdir.join('test.mne')) with pytest.raises(ValueError, match='must be of shape'): _write_dig_points(dest, points[:, :2]) with pytest.raises(ValueError, match='extension'): _write_dig_points(dest_bad, points) _write_dig_points(dest, points) points1 = read_polhemus_fastscan( dest, unit='m', on_header_missing='ignore') err = "Dig points diverged after writing and reading." assert_array_equal(points, points1, err) points2 = np.array([[-106.93, 99.80], [99.80, 68.81]]) np.savetxt(dest, points2, delimiter='\t', newline='\n') with pytest.raises(ValueError, match='must be of shape'): with pytest.warns(RuntimeWarning, match='FastSCAN header'): read_polhemus_fastscan(dest, on_header_missing='warn')