def test_egi_dig_montage(): """Test EGI MFF XML dig montage support.""" dig_montage = read_dig_montage(egi=egi_dig_montage_fname, unit='m') # # test round-trip IO temp_dir = _TempDir() fname_temp = op.join(temp_dir, 'egi_test.fif') _check_roundtrip(dig_montage, fname_temp) # Test coordinate transform dig_montage.transform_to_head() # nasion assert_almost_equal(dig_montage.nasion[0], 0) assert_almost_equal(dig_montage.nasion[2], 0) # lpa and rpa assert_allclose(dig_montage.lpa[1:], 0, atol=1e-16) assert_allclose(dig_montage.rpa[1:], 0, atol=1e-16) # Test accuracy and embedding within raw object raw_egi = read_raw_egi(egi_raw_fname, channel_naming='EEG %03d') raw_egi.set_montage(dig_montage) test_raw_egi = read_raw_fif(egi_fif_fname) assert_equal(len(raw_egi.ch_names), len(test_raw_egi.ch_names)) for ch_raw, ch_test_raw in zip(raw_egi.info['chs'], test_raw_egi.info['chs']): assert_equal(ch_raw['ch_name'], ch_test_raw['ch_name']) assert_equal(ch_raw['coord_frame'], FIFF.FIFFV_COORD_HEAD) assert_allclose(ch_raw['loc'], ch_test_raw['loc'], atol=1e-7) assert_dig_allclose(raw_egi.info, test_raw_egi.info)
def test_ch_loc(): """Test raw kit loc.""" raw_py = read_raw_kit(sqd_path, mrk_path, elp_txt_path, hsp_txt_path, stim='<') raw_bin = read_raw_fif(op.join(data_dir, 'test_bin_raw.fif')) ch_py = np.array([ch['loc'] for ch in raw_py._raw_extras[0]['channels'][:160]]) # ch locs stored as m, not mm ch_py[:, :3] *= 1e3 ch_sns = read_sns(op.join(data_dir, 'sns.txt')) assert_array_almost_equal(ch_py, ch_sns, 2) assert_array_almost_equal(raw_py.info['dev_head_t']['trans'], raw_bin.info['dev_head_t']['trans'], 4) for py_ch, bin_ch in zip(raw_py.info['chs'], raw_bin.info['chs']): if bin_ch['ch_name'].startswith('MEG'): # the stored ch locs have more precision than the sns.txt assert_array_almost_equal(py_ch['loc'], bin_ch['loc'], decimal=2) # test when more than one marker file provided mrks = [mrk_path, mrk2_path, mrk3_path] read_raw_kit(sqd_path, mrks, elp_txt_path, hsp_txt_path, preload=False) # this dataset does not have the equivalent set of points :( raw_bin.info['dig'] = raw_bin.info['dig'][:8] raw_py.info['dig'] = raw_py.info['dig'][:8] assert_dig_allclose(raw_py.info, raw_bin.info)
def test_raw(): """Test bti conversion to Raw object.""" for pdf, config, hs, exported in zip(pdf_fnames, config_fnames, hs_fnames, exported_fnames): # rx = 2 if 'linux' in pdf else 0 pytest.raises(ValueError, read_raw_bti, pdf, 'eggs', preload=False) pytest.raises(ValueError, read_raw_bti, pdf, config, 'spam', preload=False) if op.exists(tmp_raw_fname): os.remove(tmp_raw_fname) ex = read_raw_fif(exported, preload=True) ra = read_raw_bti(pdf, config, hs, preload=False) assert ('RawBTi' in repr(ra)) assert_equal(ex.ch_names[:NCH], ra.ch_names[:NCH]) assert_array_almost_equal(ex.info['dev_head_t']['trans'], ra.info['dev_head_t']['trans'], 7) assert len(ex.info['dig']) in (3563, 5154) assert_dig_allclose(ex.info, ra.info, limit=100) coil1, coil2 = [ np.concatenate([d['loc'].flatten() for d in r_.info['chs'][:NCH]]) for r_ in (ra, ex) ] assert_array_almost_equal(coil1, coil2, 7) loc1, loc2 = [ np.concatenate([d['loc'].flatten() for d in r_.info['chs'][:NCH]]) for r_ in (ra, ex) ] assert_allclose(loc1, loc2) assert_allclose(ra[:NCH][0], ex[:NCH][0]) assert_array_equal([c['range'] for c in ra.info['chs'][:NCH]], [c['range'] for c in ex.info['chs'][:NCH]]) assert_array_equal([c['cal'] for c in ra.info['chs'][:NCH]], [c['cal'] for c in ex.info['chs'][:NCH]]) assert_array_equal(ra._cals[:NCH], ex._cals[:NCH]) # check our transforms for key in ('dev_head_t', 'dev_ctf_t', 'ctf_head_t'): if ex.info[key] is None: pass else: assert (ra.info[key] is not None) for ent in ('to', 'from', 'trans'): assert_allclose(ex.info[key][ent], ra.info[key][ent]) ra.save(tmp_raw_fname) re = read_raw_fif(tmp_raw_fname) print(re) for key in ('dev_head_t', 'dev_ctf_t', 'ctf_head_t'): assert (isinstance(re.info[key], dict)) this_t = re.info[key]['trans'] assert_equal(this_t.shape, (4, 4)) # check that matrix by is not identity assert (not np.allclose(this_t, np.eye(4))) os.remove(tmp_raw_fname)
def test_fif_dig_montage(): """Test FIF dig montage support""" dig_montage = read_dig_montage(fif=fif_dig_montage_fname) # Make a BrainVision file like the one the user would have had with warnings.catch_warnings(record=True) as w: raw_bv = read_raw_brainvision(bv_fname, preload=True) assert_true(any('will be dropped' in str(ww.message) for ww in w)) raw_bv_2 = raw_bv.copy() mapping = dict() for ii, ch_name in enumerate(raw_bv.ch_names[:-1]): mapping[ch_name] = 'EEG%03d' % (ii + 1,) raw_bv.rename_channels(mapping) for ii, ch_name in enumerate(raw_bv_2.ch_names[:-1]): mapping[ch_name] = 'EEG%03d' % (ii + 33,) raw_bv_2.rename_channels(mapping) raw_bv.drop_channels(['STI 014']) raw_bv.add_channels([raw_bv_2]) # Set the montage raw_bv.set_montage(dig_montage) # Check the result evoked = read_evokeds(evoked_fname)[0] assert_equal(len(raw_bv.ch_names), len(evoked.ch_names)) for ch_py, ch_c in zip(raw_bv.info['chs'], evoked.info['chs']): 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) assert_allclose(ch_py['loc'], ch_c['loc']) assert_dig_allclose(raw_bv.info, evoked.info)
def test_ch_loc(): """Test raw kit loc """ raw_py = read_raw_kit(sqd_path, mrk_path, elp_path, hsp_path, stim='<') raw_bin = Raw(op.join(data_dir, 'test_bin_raw.fif')) ch_py = raw_py._raw_extras[0]['sensor_locs'][:, :5] # ch locs stored as m, not mm ch_py[:, :3] *= 1e3 ch_sns = read_sns(op.join(data_dir, 'sns.txt')) assert_array_almost_equal(ch_py, ch_sns, 2) assert_array_almost_equal(raw_py.info['dev_head_t']['trans'], raw_bin.info['dev_head_t']['trans'], 4) for py_ch, bin_ch in zip(raw_py.info['chs'], raw_bin.info['chs']): if bin_ch['ch_name'].startswith('MEG'): # the stored ch locs have more precision than the sns.txt assert_array_almost_equal(py_ch['loc'], bin_ch['loc'], decimal=2) # test when more than one marker file provided mrks = [mrk_path, mrk2_path, mrk3_path] read_raw_kit(sqd_path, mrks, elp_path, hsp_path, preload=False) # this dataset does not have the equivalent set of points :( raw_bin.info['dig'] = raw_bin.info['dig'][:8] raw_py.info['dig'] = raw_py.info['dig'][:8] assert_dig_allclose(raw_py.info, raw_bin.info)
def test_raw(): """ Test bti conversion to Raw object """ for pdf, config, hs, exported in zip(pdf_fnames, config_fnames, hs_fnames, exported_fnames): # rx = 2 if 'linux' in pdf else 0 assert_raises(ValueError, read_raw_bti, pdf, 'eggs', preload=False) assert_raises(ValueError, read_raw_bti, pdf, config, 'spam', preload=False) if op.exists(tmp_raw_fname): os.remove(tmp_raw_fname) ex = Raw(exported, preload=True) with warnings.catch_warnings(record=True): # weight tables ra = read_raw_bti(pdf, config, hs, preload=False) assert_true('RawBTi' in repr(ra)) assert_equal(ex.ch_names[:NCH], ra.ch_names[:NCH]) assert_array_almost_equal(ex.info['dev_head_t']['trans'], ra.info['dev_head_t']['trans'], 7) with warnings.catch_warnings(record=True): # headshape assert_dig_allclose(ex.info, ra.info) coil1, coil2 = [np.concatenate([d['loc'].flatten() for d in r_.info['chs'][:NCH]]) for r_ in (ra, ex)] assert_array_almost_equal(coil1, coil2, 7) loc1, loc2 = [np.concatenate([d['loc'].flatten() for d in r_.info['chs'][:NCH]]) for r_ in (ra, ex)] assert_allclose(loc1, loc2) assert_allclose(ra[:NCH][0], ex[:NCH][0]) assert_array_equal([c['range'] for c in ra.info['chs'][:NCH]], [c['range'] for c in ex.info['chs'][:NCH]]) assert_array_equal([c['cal'] for c in ra.info['chs'][:NCH]], [c['cal'] for c in ex.info['chs'][:NCH]]) assert_array_equal(ra._cals[:NCH], ex._cals[:NCH]) # check our transforms for key in ('dev_head_t', 'dev_ctf_t', 'ctf_head_t'): if ex.info[key] is None: pass else: assert_true(ra.info[key] is not None) for ent in ('to', 'from', 'trans'): assert_allclose(ex.info[key][ent], ra.info[key][ent]) ra.save(tmp_raw_fname) re = Raw(tmp_raw_fname) print(re) for key in ('dev_head_t', 'dev_ctf_t', 'ctf_head_t'): assert_true(isinstance(re.info[key], dict)) this_t = re.info[key]['trans'] assert_equal(this_t.shape, (4, 4)) # cehck that matrix by is not identity assert_true(not np.allclose(this_t, np.eye(4))) os.remove(tmp_raw_fname)
def test_fif_dig_montage(): """Test FIF dig montage support.""" dig_montage = read_dig_montage(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 with warnings.catch_warnings(record=True) as w: raw_bv = read_raw_brainvision(bv_fname, preload=True) assert_true(any('will be dropped' in str(ww.message) for ww in w)) raw_bv_2 = raw_bv.copy() mapping = dict() for ii, ch_name in enumerate(raw_bv.ch_names[:-1]): mapping[ch_name] = 'EEG%03d' % (ii + 1,) raw_bv.rename_channels(mapping) for ii, ch_name in enumerate(raw_bv_2.ch_names[:-1]): mapping[ch_name] = 'EEG%03d' % (ii + 33,) raw_bv_2.rename_channels(mapping) raw_bv.drop_channels(['STI 014']) raw_bv.add_channels([raw_bv_2]) for ii in range(2): if ii == 1: dig_montage.transform_to_head() # should have no meaningful effect # Set the montage raw_bv.set_montage(dig_montage) # Check the result evoked = read_evokeds(evoked_fname)[0] assert_equal(len(raw_bv.ch_names), len(evoked.ch_names)) for ch_py, ch_c in zip(raw_bv.info['chs'], evoked.info['chs']): 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) assert_dig_allclose(raw_bv.info, evoked.info) # Roundtrip of non-FIF start names = ['nasion', 'lpa', 'rpa', '1', '2', '3', '4', '5'] montage = read_dig_montage(hsp, hpi, elp, names, transform=False) assert_raises(RuntimeError, montage.save, fname_temp) # must be head coord montage = read_dig_montage(hsp, hpi, elp, names) _check_roundtrip(montage, fname_temp)
def test_read_ctf(): """Test CTF reader""" temp_dir = _TempDir() out_fname = op.join(temp_dir, 'test_py_raw.fif') # Create a dummy .eeg file so we can test our reading/application of it os.mkdir(op.join(temp_dir, 'randpos')) ctf_eeg_fname = op.join(temp_dir, 'randpos', ctf_fname_catch) shutil.copytree(op.join(ctf_dir, ctf_fname_catch), ctf_eeg_fname) with warnings.catch_warnings(record=True) as w: # reclassified ch raw = _test_raw_reader(read_raw_ctf, directory=ctf_eeg_fname) assert_true(all('MISC channel' in str(ww.message) for ww in w)) picks = pick_types(raw.info, meg=False, eeg=True) pos = np.random.RandomState(42).randn(len(picks), 3) fake_eeg_fname = op.join(ctf_eeg_fname, 'catch-alp-good-f.eeg') # Create a bad file with open(fake_eeg_fname, 'wb') as fid: fid.write('foo\n'.encode('ascii')) assert_raises(RuntimeError, read_raw_ctf, ctf_eeg_fname) # Create a good file with open(fake_eeg_fname, 'wb') as fid: for ii, ch_num in enumerate(picks): args = ( str(ch_num + 1), raw.ch_names[ch_num], ) + tuple('%0.5f' % x for x in 100 * pos[ii]) # convert to cm fid.write(('\t'.join(args) + '\n').encode('ascii')) pos_read_old = np.array([raw.info['chs'][p]['loc'][:3] for p in picks]) with warnings.catch_warnings(record=True) as w: # reclassified channel raw = read_raw_ctf(ctf_eeg_fname) # read modified data assert_true(all('MISC channel' in str(ww.message) for ww in w)) pos_read = np.array([raw.info['chs'][p]['loc'][:3] for p in picks]) assert_allclose(apply_trans(raw.info['ctf_head_t'], pos), pos_read, rtol=1e-5, atol=1e-5) assert_true((pos_read == pos_read_old).mean() < 0.1) shutil.copy(op.join(ctf_dir, 'catch-alp-good-f.ds_randpos_raw.fif'), op.join(temp_dir, 'randpos', 'catch-alp-good-f.ds_raw.fif')) # Create a version with no hc, starting out *with* EEG pos (error) os.mkdir(op.join(temp_dir, 'nohc')) ctf_no_hc_fname = op.join(temp_dir, 'no_hc', ctf_fname_catch) shutil.copytree(ctf_eeg_fname, ctf_no_hc_fname) remove_base = op.join(ctf_no_hc_fname, op.basename(ctf_fname_catch[:-3])) os.remove(remove_base + '.hc') with warnings.catch_warnings(record=True): # no coord tr assert_raises(RuntimeError, read_raw_ctf, ctf_no_hc_fname) os.remove(remove_base + '.eeg') shutil.copy(op.join(ctf_dir, 'catch-alp-good-f.ds_nohc_raw.fif'), op.join(temp_dir, 'no_hc', 'catch-alp-good-f.ds_raw.fif')) # All our files use_fnames = [op.join(ctf_dir, c) for c in ctf_fnames] for fname in use_fnames: raw_c = Raw(fname + '_raw.fif', add_eeg_ref=False, preload=True) with warnings.catch_warnings(record=True) as w: # reclassified ch raw = read_raw_ctf(fname) assert_true(all('MISC channel' in str(ww.message) for ww in w)) # check info match assert_array_equal(raw.ch_names, raw_c.ch_names) assert_allclose(raw.times, raw_c.times) assert_allclose(raw._cals, raw_c._cals) for key in ('version', 'usecs'): assert_equal(raw.info['meas_id'][key], raw_c.info['meas_id'][key]) py_time = raw.info['meas_id']['secs'] c_time = raw_c.info['meas_id']['secs'] max_offset = 24 * 60 * 60 # probably overkill but covers timezone assert_true(c_time - max_offset <= py_time <= c_time) for t in ('dev_head_t', 'dev_ctf_t', 'ctf_head_t'): assert_allclose(raw.info[t]['trans'], raw_c.info[t]['trans'], rtol=1e-4, atol=1e-7) for key in ('acq_pars', 'acq_stim', 'bads', 'ch_names', 'custom_ref_applied', 'description', 'events', 'experimenter', 'highpass', 'line_freq', 'lowpass', 'nchan', 'proj_id', 'proj_name', 'projs', 'sfreq', 'subject_info'): assert_equal(raw.info[key], raw_c.info[key], key) if op.basename(fname) not in single_trials: # We don't force buffer size to be smaller like MNE-C assert_equal(raw.info['buffer_size_sec'], raw_c.info['buffer_size_sec']) assert_equal(len(raw.info['comps']), len(raw_c.info['comps'])) for c1, c2 in zip(raw.info['comps'], raw_c.info['comps']): for key in ('colcals', 'rowcals'): assert_allclose(c1[key], c2[key]) assert_equal(c1['save_calibrated'], c2['save_calibrated']) for key in ('row_names', 'col_names', 'nrow', 'ncol'): assert_array_equal(c1['data'][key], c2['data'][key]) assert_allclose(c1['data']['data'], c2['data']['data'], atol=1e-7, rtol=1e-5) assert_allclose(raw.info['hpi_results'][0]['coord_trans']['trans'], raw_c.info['hpi_results'][0]['coord_trans']['trans'], rtol=1e-5, atol=1e-7) assert_equal(len(raw.info['chs']), len(raw_c.info['chs'])) for ii, (c1, c2) in enumerate(zip(raw.info['chs'], raw_c.info['chs'])): for key in ('kind', 'scanno', 'unit', 'ch_name', 'unit_mul', 'range', 'coord_frame', 'coil_type', 'logno'): if c1['ch_name'] == 'RMSP' and \ 'catch-alp-good-f' in fname and \ key in ('kind', 'unit', 'coord_frame', 'coil_type', 'logno'): continue # XXX see below... assert_equal(c1[key], c2[key], err_msg=key) for key in ('cal', ): assert_allclose(c1[key], c2[key], atol=1e-6, rtol=1e-4, err_msg='raw.info["chs"][%d][%s]' % (ii, key)) # XXX 2016/02/24: fixed bug with normal computation that used # to exist, once mne-C tools are updated we should update our FIF # conversion files, then the slices can go away (and the check # can be combined with that for "cal") for key in ('loc', ): if c1['ch_name'] == 'RMSP' and 'catch-alp-good-f' in fname: continue assert_allclose(c1[key][:3], c2[key][:3], atol=1e-6, rtol=1e-4, err_msg='raw.info["chs"][%d][%s]' % (ii, key)) assert_allclose(c1[key][9:12], c2[key][9:12], atol=1e-6, rtol=1e-4, err_msg='raw.info["chs"][%d][%s]' % (ii, key)) if fname.endswith('catch-alp-good-f.ds'): # omit points from .pos file raw.info['dig'] = raw.info['dig'][:-10] assert_dig_allclose(raw.info, raw_c.info) # check data match raw_c.save(out_fname, overwrite=True, buffer_size_sec=1.) raw_read = Raw(out_fname, add_eeg_ref=False) # so let's check tricky cases based on sample boundaries rng = np.random.RandomState(0) pick_ch = rng.permutation(np.arange(len(raw.ch_names)))[:10] bnd = int(round(raw.info['sfreq'] * raw.info['buffer_size_sec'])) assert_equal(bnd, raw._raw_extras[0]['block_size']) assert_equal(bnd, block_sizes[op.basename(fname)]) slices = (slice(0, bnd), slice(bnd - 1, bnd), slice(3, bnd), slice(3, 300), slice(None)) if len(raw.times) >= 2 * bnd: # at least two complete blocks slices = slices + (slice(bnd, 2 * bnd), slice( bnd, bnd + 1), slice(0, bnd + 100)) for sl_time in slices: assert_allclose(raw[pick_ch, sl_time][0], raw_c[pick_ch, sl_time][0]) assert_allclose(raw_read[pick_ch, sl_time][0], raw_c[pick_ch, sl_time][0]) # all data / preload with warnings.catch_warnings(record=True) as w: # reclassified ch raw = read_raw_ctf(fname, preload=True) assert_true(all('MISC channel' in str(ww.message) for ww in w)) assert_allclose(raw[:][0], raw_c[:][0]) raw.plot(show=False) # Test plotting with ref_meg channels. assert_raises(ValueError, raw.plot, order='selection') assert_raises(TypeError, read_raw_ctf, 1) assert_raises(ValueError, read_raw_ctf, ctf_fname_continuous + 'foo.ds') # test ignoring of system clock read_raw_ctf(op.join(ctf_dir, ctf_fname_continuous), 'ignore') assert_raises(ValueError, read_raw_ctf, op.join(ctf_dir, ctf_fname_continuous), 'foo')
def test_read_ctf(): """Test CTF reader""" temp_dir = _TempDir() out_fname = op.join(temp_dir, 'test_py_raw.fif') # Create a dummy .eeg file so we can test our reading/application of it os.mkdir(op.join(temp_dir, 'randpos')) ctf_eeg_fname = op.join(temp_dir, 'randpos', ctf_fname_catch) shutil.copytree(op.join(ctf_dir, ctf_fname_catch), ctf_eeg_fname) with warnings.catch_warnings(record=True) as w: # reclassified ch raw = _test_raw_reader(read_raw_ctf, directory=ctf_eeg_fname) assert_true(all('MISC channel' in str(ww.message) for ww in w)) picks = pick_types(raw.info, meg=False, eeg=True) pos = np.random.RandomState(42).randn(len(picks), 3) fake_eeg_fname = op.join(ctf_eeg_fname, 'catch-alp-good-f.eeg') # Create a bad file with open(fake_eeg_fname, 'wb') as fid: fid.write('foo\n'.encode('ascii')) assert_raises(RuntimeError, read_raw_ctf, ctf_eeg_fname) # Create a good file with open(fake_eeg_fname, 'wb') as fid: for ii, ch_num in enumerate(picks): args = (str(ch_num + 1), raw.ch_names[ch_num],) + tuple( '%0.5f' % x for x in 100 * pos[ii]) # convert to cm fid.write(('\t'.join(args) + '\n').encode('ascii')) pos_read_old = np.array([raw.info['chs'][p]['loc'][:3] for p in picks]) with warnings.catch_warnings(record=True) as w: # reclassified channel raw = read_raw_ctf(ctf_eeg_fname) # read modified data assert_true(all('MISC channel' in str(ww.message) for ww in w)) pos_read = np.array([raw.info['chs'][p]['loc'][:3] for p in picks]) assert_allclose(apply_trans(raw.info['ctf_head_t'], pos), pos_read, rtol=1e-5, atol=1e-5) assert_true((pos_read == pos_read_old).mean() < 0.1) shutil.copy(op.join(ctf_dir, 'catch-alp-good-f.ds_randpos_raw.fif'), op.join(temp_dir, 'randpos', 'catch-alp-good-f.ds_raw.fif')) # Create a version with no hc, starting out *with* EEG pos (error) os.mkdir(op.join(temp_dir, 'nohc')) ctf_no_hc_fname = op.join(temp_dir, 'no_hc', ctf_fname_catch) shutil.copytree(ctf_eeg_fname, ctf_no_hc_fname) remove_base = op.join(ctf_no_hc_fname, op.basename(ctf_fname_catch[:-3])) os.remove(remove_base + '.hc') with warnings.catch_warnings(record=True): # no coord tr assert_raises(RuntimeError, read_raw_ctf, ctf_no_hc_fname) os.remove(remove_base + '.eeg') shutil.copy(op.join(ctf_dir, 'catch-alp-good-f.ds_nohc_raw.fif'), op.join(temp_dir, 'no_hc', 'catch-alp-good-f.ds_raw.fif')) # All our files use_fnames = [op.join(ctf_dir, c) for c in ctf_fnames] for fname in use_fnames: raw_c = Raw(fname + '_raw.fif', add_eeg_ref=False, preload=True) with warnings.catch_warnings(record=True) as w: # reclassified ch raw = read_raw_ctf(fname) assert_true(all('MISC channel' in str(ww.message) for ww in w)) # check info match assert_array_equal(raw.ch_names, raw_c.ch_names) assert_allclose(raw.times, raw_c.times) assert_allclose(raw._cals, raw_c._cals) for key in ('version', 'usecs'): assert_equal(raw.info['meas_id'][key], raw_c.info['meas_id'][key]) py_time = raw.info['meas_id']['secs'] c_time = raw_c.info['meas_id']['secs'] max_offset = 24 * 60 * 60 # probably overkill but covers timezone assert_true(c_time - max_offset <= py_time <= c_time) for t in ('dev_head_t', 'dev_ctf_t', 'ctf_head_t'): assert_allclose(raw.info[t]['trans'], raw_c.info[t]['trans'], rtol=1e-4, atol=1e-7) for key in ('acq_pars', 'acq_stim', 'bads', 'ch_names', 'custom_ref_applied', 'description', 'events', 'experimenter', 'highpass', 'line_freq', 'lowpass', 'nchan', 'proj_id', 'proj_name', 'projs', 'sfreq', 'subject_info'): assert_equal(raw.info[key], raw_c.info[key], key) if op.basename(fname) not in single_trials: # We don't force buffer size to be smaller like MNE-C assert_equal(raw.info['buffer_size_sec'], raw_c.info['buffer_size_sec']) assert_equal(len(raw.info['comps']), len(raw_c.info['comps'])) for c1, c2 in zip(raw.info['comps'], raw_c.info['comps']): for key in ('colcals', 'rowcals'): assert_allclose(c1[key], c2[key]) assert_equal(c1['save_calibrated'], c2['save_calibrated']) for key in ('row_names', 'col_names', 'nrow', 'ncol'): assert_array_equal(c1['data'][key], c2['data'][key]) assert_allclose(c1['data']['data'], c2['data']['data'], atol=1e-7, rtol=1e-5) assert_allclose(raw.info['hpi_results'][0]['coord_trans']['trans'], raw_c.info['hpi_results'][0]['coord_trans']['trans'], rtol=1e-5, atol=1e-7) assert_equal(len(raw.info['chs']), len(raw_c.info['chs'])) for ii, (c1, c2) in enumerate(zip(raw.info['chs'], raw_c.info['chs'])): for key in ('kind', 'scanno', 'unit', 'ch_name', 'unit_mul', 'range', 'coord_frame', 'coil_type', 'logno'): if c1['ch_name'] == 'RMSP' and \ 'catch-alp-good-f' in fname and \ key in ('kind', 'unit', 'coord_frame', 'coil_type', 'logno'): continue # XXX see below... assert_equal(c1[key], c2[key], err_msg=key) for key in ('cal',): assert_allclose(c1[key], c2[key], atol=1e-6, rtol=1e-4, err_msg='raw.info["chs"][%d][%s]' % (ii, key)) # XXX 2016/02/24: fixed bug with normal computation that used # to exist, once mne-C tools are updated we should update our FIF # conversion files, then the slices can go away (and the check # can be combined with that for "cal") for key in ('loc',): if c1['ch_name'] == 'RMSP' and 'catch-alp-good-f' in fname: continue assert_allclose(c1[key][:3], c2[key][:3], atol=1e-6, rtol=1e-4, err_msg='raw.info["chs"][%d][%s]' % (ii, key)) assert_allclose(c1[key][9:12], c2[key][9:12], atol=1e-6, rtol=1e-4, err_msg='raw.info["chs"][%d][%s]' % (ii, key)) if fname.endswith('catch-alp-good-f.ds'): # omit points from .pos file raw.info['dig'] = raw.info['dig'][:-10] assert_dig_allclose(raw.info, raw_c.info) # check data match raw_c.save(out_fname, overwrite=True, buffer_size_sec=1.) raw_read = Raw(out_fname, add_eeg_ref=False) # so let's check tricky cases based on sample boundaries rng = np.random.RandomState(0) pick_ch = rng.permutation(np.arange(len(raw.ch_names)))[:10] bnd = int(round(raw.info['sfreq'] * raw.info['buffer_size_sec'])) assert_equal(bnd, raw._raw_extras[0]['block_size']) assert_equal(bnd, block_sizes[op.basename(fname)]) slices = (slice(0, bnd), slice(bnd - 1, bnd), slice(3, bnd), slice(3, 300), slice(None)) if len(raw.times) >= 2 * bnd: # at least two complete blocks slices = slices + (slice(bnd, 2 * bnd), slice(bnd, bnd + 1), slice(0, bnd + 100)) for sl_time in slices: assert_allclose(raw[pick_ch, sl_time][0], raw_c[pick_ch, sl_time][0]) assert_allclose(raw_read[pick_ch, sl_time][0], raw_c[pick_ch, sl_time][0]) # all data / preload with warnings.catch_warnings(record=True) as w: # reclassified ch raw = read_raw_ctf(fname, preload=True) assert_true(all('MISC channel' in str(ww.message) for ww in w)) assert_allclose(raw[:][0], raw_c[:][0]) assert_raises(TypeError, read_raw_ctf, 1) assert_raises(ValueError, read_raw_ctf, ctf_fname_continuous + 'foo.ds') # test ignoring of system clock read_raw_ctf(op.join(ctf_dir, ctf_fname_continuous), 'ignore') assert_raises(ValueError, read_raw_ctf, op.join(ctf_dir, ctf_fname_continuous), 'foo')