def test_head_translation(): """Test Maxwell filter head translation""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0., 1., False) # First try with an unchanged destination raw_sss = maxwell_filter(raw, destination=raw_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, Raw(sss_std_fname).crop(0., 1., False), 200.) # Now with default with warnings.catch_warnings(record=True): with catch_logging() as log: raw_sss = maxwell_filter(raw, destination=mf_head_origin, origin=mf_head_origin, regularize=None, bad_condition='ignore', verbose='warning') assert_true('over 25 mm' in log.getvalue()) assert_meg_snr(raw_sss, Raw(sss_trans_default_fname), 125.) destination = np.eye(4) destination[2, 3] = 0.04 assert_allclose(raw_sss.info['dev_head_t']['trans'], destination) # Now to sample's head pos with warnings.catch_warnings(record=True): with catch_logging() as log: raw_sss = maxwell_filter(raw, destination=sample_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore', verbose='warning') assert_true('= 25.6 mm' in log.getvalue()) assert_meg_snr(raw_sss, Raw(sss_trans_sample_fname), 350.) assert_allclose(raw_sss.info['dev_head_t']['trans'], read_info(sample_fname)['dev_head_t']['trans']) # Degenerate cases assert_raises(RuntimeError, maxwell_filter, raw, destination=mf_head_origin, coord_frame='meg') assert_raises(ValueError, maxwell_filter, raw, destination=[0.] * 4)
def test_head_translation(): """Test Maxwell filter head translation""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0.0, 1.0, False) # First try with an unchanged destination raw_sss = maxwell_filter(raw, destination=raw_fname, origin=mf_head_origin, regularize=None, bad_condition="ignore") assert_meg_snr(raw_sss, Raw(sss_std_fname).crop(0.0, 1.0, False), 200.0) # Now with default with catch_logging() as log: raw_sss = maxwell_filter( raw, destination=mf_head_origin, origin=mf_head_origin, regularize=None, bad_condition="ignore", verbose="warning", ) assert_true("over 25 mm" in log.getvalue()) assert_meg_snr(raw_sss, Raw(sss_trans_default_fname), 125.0) # Now to sample's head pos with catch_logging() as log: raw_sss = maxwell_filter( raw, destination=sample_fname, origin=mf_head_origin, regularize=None, bad_condition="ignore", verbose="warning", ) assert_true("= 25.6 mm" in log.getvalue()) assert_meg_snr(raw_sss, Raw(sss_trans_sample_fname), 350.0) # Degenerate cases assert_raises(RuntimeError, maxwell_filter, raw, destination=mf_head_origin, coord_frame="meg") assert_raises(ValueError, maxwell_filter, raw, destination=[0.0] * 4)
def test_cross_talk(): """Test Maxwell filter cross-talk cancellation""" raw = Raw(raw_fname, allow_maxshield='yes').crop(0., 1., False) raw.info['bads'] = bads sss_ctc = Raw(sss_ctc_fname) raw_sss = maxwell_filter(raw, cross_talk=ctc_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_ctc, 275.) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_true(len(py_ctc) > 0) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw_fname) mf_ctc = sss_ctc.info['proc_history'][0]['max_info']['sss_ctc'] del mf_ctc['block_id'] # we don't write this assert_equal(object_diff(py_ctc, mf_ctc), '') raw_ctf = Raw(fname_ctf_raw) assert_raises(ValueError, maxwell_filter, raw_ctf) # cannot fit headshape raw_sss = maxwell_filter(raw_ctf, origin=(0., 0., 0.04)) _assert_n_free(raw_sss, 68) raw_sss = maxwell_filter(raw_ctf, origin=(0., 0., 0.04), ignore_ref=True) _assert_n_free(raw_sss, 70) raw_missing = raw.crop(0, 0.1, copy=True).load_data().pick_channels( [raw.ch_names[pi] for pi in pick_types(raw.info, meg=True, exclude=())[3:]]) with warnings.catch_warnings(record=True) as w: maxwell_filter(raw_missing, cross_talk=ctc_fname) assert_equal(len(w), 1) assert_true('Not all cross-talk channels in raw' in str(w[0].message)) # MEG channels not in cross-talk assert_raises(RuntimeError, maxwell_filter, raw_ctf, origin=(0., 0., 0.04), cross_talk=ctc_fname)
def test_maxwell_noise_rejection(): """Test Maxwell filter shielding factor using empty room""" with warnings.catch_warnings(record=True): # maxshield raw_erm = Raw(erm_fname, allow_maxshield=True, preload=True) picks = pick_types(raw_erm.info, meg=True) erm_power = raw_erm[picks][0].ravel() erm_power = np.sqrt(np.sum(erm_power * erm_power)) # Vanilla SSS _assert_shielding(Raw(sss_erm_std_fname), erm_power, 1.5) raw_sss = maxwell_filter(raw_erm, coord_frame='meg') _assert_shielding(raw_sss, erm_power, 1.5) # tSSS _assert_shielding(Raw(sss_erm_st_fname), erm_power, 5) raw_sss = maxwell_filter(raw_erm, st_duration=1., coord_frame='meg') _assert_shielding(raw_sss, erm_power, 5.) # Fine cal _assert_shielding(Raw(sss_erm_fine_cal_fname), erm_power, 2) raw_sss = maxwell_filter(raw_erm, calibration=fine_cal_fname, coord_frame='meg') _assert_shielding(raw_sss, erm_power, 2.) # Crosstalk _assert_shielding(Raw(sss_erm_ctc_fname), erm_power, 2.1) raw_sss = maxwell_filter(raw_erm, cross_talk=ctc_fname, coord_frame='meg') _assert_shielding(raw_sss, erm_power, 2.1) # tSSS + fine cal + ctc _assert_shielding(Raw(sss_erm_st1FineCalCrossTalk_fname), erm_power, 6.) raw_sss = maxwell_filter(raw_erm, calibration=fine_cal_fname, cross_talk=ctc_fname, st_duration=1., coord_frame='meg') _assert_shielding(raw_sss, erm_power, 100) # somehow this is really high?
def test_head_translation(): """Test Maxwell filter head translation.""" raw = read_crop(raw_fname, (0., 1.)) # First try with an unchanged destination with use_coil_def(elekta_def_fname): raw_sss = maxwell_filter(raw, destination=raw_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_std_fname, (0., 1.)), 200.) # Now with default with use_coil_def(elekta_def_fname): with pytest.warns(RuntimeWarning, match='over 25 mm'): raw_sss = maxwell_filter(raw, destination=mf_head_origin, origin=mf_head_origin, regularize=None, bad_condition='ignore', verbose=True) assert_meg_snr(raw_sss, read_crop(sss_trans_default_fname), 125.) destination = np.eye(4) destination[2, 3] = 0.04 assert_allclose(raw_sss.info['dev_head_t']['trans'], destination) # Now to sample's head pos with pytest.warns(RuntimeWarning, match='= 25.6 mm'): raw_sss = maxwell_filter(raw, destination=sample_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore', verbose=True) assert_meg_snr(raw_sss, read_crop(sss_trans_sample_fname), 13., 100.) assert_allclose(raw_sss.info['dev_head_t']['trans'], read_info(sample_fname)['dev_head_t']['trans']) # Degenerate cases pytest.raises(RuntimeError, maxwell_filter, raw, destination=mf_head_origin, coord_frame='meg') pytest.raises(ValueError, maxwell_filter, raw, destination=[0.] * 4)
def test_fine_calibration(): """Test Maxwell filter fine calibration""" # Load testing data (raw, SSS std origin, SSS non-standard origin) with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0., 1., False) sss_fine_cal = Raw(sss_fine_cal_fname) # Test 1D SSS fine calibration raw_sss = maxwell_filter(raw, calibration=fine_cal_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_fine_cal, 82, 611) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert_true(py_cal is not None) assert_true(len(py_cal) > 0) mf_cal = sss_fine_cal.info['proc_history'][0]['max_info']['sss_cal'] # we identify these differently mf_cal['cal_chans'][mf_cal['cal_chans'][:, 1] == 3022, 1] = 3024 assert_allclose(py_cal['cal_chans'], mf_cal['cal_chans']) assert_allclose(py_cal['cal_corrs'], mf_cal['cal_corrs'], rtol=1e-3, atol=1e-3) # Test 3D SSS fine calibration (no equivalent func in MaxFilter yet!) # very low SNR as proc differs, eventually we should add a better test raw_sss_3D = maxwell_filter(raw, calibration=fine_cal_fname_3d, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss_3D, sss_fine_cal, 1.0, 6.)
def test_fine_calibration(): """Test Maxwell filter fine calibration.""" # Load testing data (raw, SSS std origin, SSS non-standard origin) raw = read_crop(raw_fname, (0., 1.)) sss_fine_cal = read_crop(sss_fine_cal_fname) # Test 1D SSS fine calibration raw_sss = maxwell_filter(raw, calibration=fine_cal_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_fine_cal, 82, 611) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert_true(py_cal is not None) assert_true(len(py_cal) > 0) mf_cal = sss_fine_cal.info['proc_history'][0]['max_info']['sss_cal'] # we identify these differently mf_cal['cal_chans'][mf_cal['cal_chans'][:, 1] == 3022, 1] = 3024 assert_allclose(py_cal['cal_chans'], mf_cal['cal_chans']) assert_allclose(py_cal['cal_corrs'], mf_cal['cal_corrs'], rtol=1e-3, atol=1e-3) # Test 3D SSS fine calibration (no equivalent func in MaxFilter yet!) # very low SNR as proc differs, eventually we should add a better test raw_sss_3D = maxwell_filter(raw, calibration=fine_cal_fname_3d, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss_3D, sss_fine_cal, 1.0, 6.) raw_ctf = read_crop(fname_ctf_raw).apply_gradient_compensation(0) assert_raises(RuntimeError, maxwell_filter, raw_ctf, origin=(0., 0., 0.04), calibration=fine_cal_fname)
def test_basic(): """Test Maxwell filter basic version""" # Load testing data (raw, SSS std origin, SSS non-standard origin) with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0., 1., False) raw_err = Raw(raw_fname, proj=True, allow_maxshield=True) raw_erm = Raw(erm_fname, allow_maxshield=True) assert_raises(RuntimeError, maxwell_filter, raw_err) assert_raises(TypeError, maxwell_filter, 1.) # not a raw assert_raises(ValueError, maxwell_filter, raw, int_order=20) # too many n_int_bases = int_order ** 2 + 2 * int_order n_ext_bases = ext_order ** 2 + 2 * ext_order nbases = n_int_bases + n_ext_bases # Check number of bases computed correctly assert_equal(_get_n_moments([int_order, ext_order]).sum(), nbases) # Test SSS computation at the standard head origin raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, Raw(sss_std_fname), 200., 1000.) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert_equal(len(py_cal), 0) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_equal(len(py_ctc), 0) py_st = raw_sss.info['proc_history'][0]['max_info']['max_st'] assert_equal(len(py_st), 0) assert_raises(RuntimeError, maxwell_filter, raw_sss) # Test SSS computation at non-standard head origin raw_sss = maxwell_filter(raw, origin=[0., 0.02, 0.02], regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, Raw(sss_nonstd_fname), 250., 700.) # Test SSS computation at device origin sss_erm_std = Raw(sss_erm_std_fname) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', origin=mf_meg_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_erm_std, 100., 900.) for key in ('job', 'frame'): vals = [x.info['proc_history'][0]['max_info']['sss_info'][key] for x in [raw_sss, sss_erm_std]] assert_equal(vals[0], vals[1]) # Check against SSS functions from proc_history sss_info = raw_sss.info['proc_history'][0]['max_info'] assert_equal(_get_n_moments(int_order), proc_history._get_sss_rank(sss_info)) # Degenerate cases raw_bad = raw.copy() raw_bad.comp = True assert_raises(RuntimeError, maxwell_filter, raw_bad) del raw_bad assert_raises(ValueError, maxwell_filter, raw, coord_frame='foo') assert_raises(ValueError, maxwell_filter, raw, origin='foo') assert_raises(ValueError, maxwell_filter, raw, origin=[0] * 4)
def test_basic(): """Test Maxwell filter basic version.""" # Load testing data (raw, SSS std origin, SSS non-standard origin) raw = read_crop(raw_fname, (0., 1.)) raw_err = read_crop(raw_fname).apply_proj() raw_erm = read_crop(erm_fname) assert_raises(RuntimeError, maxwell_filter, raw_err) assert_raises(TypeError, maxwell_filter, 1.) # not a raw assert_raises(ValueError, maxwell_filter, raw, int_order=20) # too many n_int_bases = int_order ** 2 + 2 * int_order n_ext_bases = ext_order ** 2 + 2 * ext_order nbases = n_int_bases + n_ext_bases # Check number of bases computed correctly assert_equal(_get_n_moments([int_order, ext_order]).sum(), nbases) # Test SSS computation at the standard head origin assert_equal(len(raw.info['projs']), 12) # 11 MEG projs + 1 AVG EEG raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_equal(len(raw_sss.info['projs']), 1) # avg EEG assert_equal(raw_sss.info['projs'][0]['desc'], 'Average EEG reference') assert_meg_snr(raw_sss, read_crop(sss_std_fname), 200., 1000.) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert_equal(len(py_cal), 0) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_equal(len(py_ctc), 0) py_st = raw_sss.info['proc_history'][0]['max_info']['max_st'] assert_equal(len(py_st), 0) assert_raises(RuntimeError, maxwell_filter, raw_sss) # Test SSS computation at non-standard head origin raw_sss = maxwell_filter(raw, origin=[0., 0.02, 0.02], regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_nonstd_fname), 250., 700.) # Test SSS computation at device origin sss_erm_std = read_crop(sss_erm_std_fname) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', origin=mf_meg_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_erm_std, 100., 900.) for key in ('job', 'frame'): vals = [x.info['proc_history'][0]['max_info']['sss_info'][key] for x in [raw_sss, sss_erm_std]] assert_equal(vals[0], vals[1]) # Check against SSS functions from proc_history sss_info = raw_sss.info['proc_history'][0]['max_info'] assert_equal(_get_n_moments(int_order), proc_history._get_sss_rank(sss_info)) # Degenerate cases assert_raises(ValueError, maxwell_filter, raw, coord_frame='foo') assert_raises(ValueError, maxwell_filter, raw, origin='foo') assert_raises(ValueError, maxwell_filter, raw, origin=[0] * 4) assert_raises(ValueError, maxwell_filter, raw, mag_scale='foo')
def test_spatiotemporal_maxwell(): """Test spatiotemporal (tSSS) processing""" # Load raw testing data with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True) # Create coils picks = pick_types(raw.info) # Test that window is less than length of data assert_raises(ValueError, maxwell_filter, raw, st_dur=1000.) # Check both 4 and 10 seconds because Elekta handles them differently # This is to ensure that std/non-std tSSS windows are correctly handled st_durs = [4., 10.] for st_dur in st_durs: # Load tSSS data depending on st_dur and get data tSSS_fname = op.join(data_path, 'SSS', 'test_move_anon_raw_' + 'spatiotemporal_%0ds_sss.fif' % st_dur) with warnings.catch_warnings(record=True): # maxshield, naming tsss_bench = Raw(tSSS_fname, allow_maxshield=True) # Because Elekta's tSSS sometimes(!) lumps the tail window of data # onto the previous buffer if it's shorter than st_dur, we have to # crop the data here to compensate for Elekta's tSSS behavior. if st_dur == 10.: tsss_bench.crop(0, st_dur, copy=False) tsss_bench_data = tsss_bench[picks, :][0] del tsss_bench # Test sss computation at the standard head origin. Same cropping issue # as mentioned above. if st_dur == 10.: raw_tsss = maxwell_filter(raw.crop(0, st_dur), st_dur=st_dur) else: raw_tsss = maxwell_filter(raw, st_dur=st_dur) assert_allclose(raw_tsss[picks][0], tsss_bench_data, rtol=1e-12, atol=1e-4, err_msg='Spatiotemporal (tSSS) ' 'maxwell filtered data at standard origin incorrect.') # Confirm SNR is above 500. Single precision is part of discrepancy bench_rms = np.sqrt(np.mean(tsss_bench_data * tsss_bench_data, axis=1)) error = raw_tsss[picks][0] - tsss_bench_data error_rms = np.sqrt(np.mean(error * error, axis=1)) assert_true(np.mean(bench_rms / error_rms) >= 500, 'SNR (%0.1f) < 500' % np.mean(bench_rms / error_rms)) # Confirm we didn't modify other channels (like EEG chs) non_picks = np.setdiff1d(np.arange(len(raw.ch_names)), picks) assert_allclose(raw[non_picks, 0:raw_tsss.n_times][0], raw_tsss[non_picks, 0:raw_tsss.n_times][0]) # Degenerate cases assert_raises(ValueError, maxwell_filter, raw, st_dur=10., st_corr=0.)
def test_spatiotemporal_maxwell(): """Test Maxwell filter (tSSS) spatiotemporal processing""" # Load raw testing data raw = Raw(raw_fname, allow_maxshield='yes') # Test that window is less than length of data assert_raises(ValueError, maxwell_filter, raw, st_duration=1000.) # Check both 4 and 10 seconds because Elekta handles them differently # This is to ensure that std/non-std tSSS windows are correctly handled st_durations = [4., 10.] tols = [325., 200.] for st_duration, tol in zip(st_durations, tols): # Load tSSS data depending on st_duration and get data tSSS_fname = op.join(sss_path, 'test_move_anon_st%0ds_raw_sss.fif' % st_duration) tsss_bench = Raw(tSSS_fname) # Because Elekta's tSSS sometimes(!) lumps the tail window of data # onto the previous buffer if it's shorter than st_duration, we have to # crop the data here to compensate for Elekta's tSSS behavior. if st_duration == 10.: tsss_bench.crop(0, st_duration, copy=False) # Test sss computation at the standard head origin. Same cropping issue # as mentioned above. if st_duration == 10.: raw_tsss = maxwell_filter(raw.crop(0, st_duration), origin=mf_head_origin, st_duration=st_duration, regularize=None, bad_condition='ignore') else: raw_tsss = maxwell_filter(raw, st_duration=st_duration, origin=mf_head_origin, regularize=None, bad_condition='ignore', verbose=True) raw_tsss_2 = maxwell_filter(raw, st_duration=st_duration, origin=mf_head_origin, regularize=None, bad_condition='ignore', st_fixed=False, verbose=True) assert_meg_snr(raw_tsss, raw_tsss_2, 100., 1000.) assert_equal(raw_tsss.estimate_rank(), 140) assert_equal(raw_tsss_2.estimate_rank(), 140) assert_meg_snr(raw_tsss, tsss_bench, tol) py_st = raw_tsss.info['proc_history'][0]['max_info']['max_st'] assert_true(len(py_st) > 0) assert_equal(py_st['buflen'], st_duration) assert_equal(py_st['subspcorr'], 0.98) # Degenerate cases assert_raises(ValueError, maxwell_filter, raw, st_duration=10., st_correlation=0.)
def test_spatiotemporal_only(): """Test tSSS-only processing.""" # Load raw testing data tmax = 0.5 raw = read_crop(raw_fname, (0, tmax)).load_data() picks = pick_types(raw.info, meg=True, exclude='bads')[::2] raw.pick_channels([raw.ch_names[pick] for pick in picks]) mag_picks = pick_types(raw.info, meg='mag', exclude=()) power = np.sqrt(np.sum(raw[mag_picks][0] ** 2)) # basics raw_tsss = maxwell_filter(raw, st_duration=tmax / 2., st_only=True) assert_equal(len(raw.info['projs']), len(raw_tsss.info['projs'])) assert_equal(raw_tsss.estimate_rank(), len(picks)) _assert_shielding(raw_tsss, power, 9) # with movement head_pos = read_head_pos(pos_fname) raw_tsss = maxwell_filter(raw, st_duration=tmax / 2., st_only=True, head_pos=head_pos) assert_equal(raw_tsss.estimate_rank(), len(picks)) _assert_shielding(raw_tsss, power, 9) with pytest.warns(RuntimeWarning, match='st_fixed'): raw_tsss = maxwell_filter(raw, st_duration=tmax / 2., st_only=True, head_pos=head_pos, st_fixed=False) assert_equal(raw_tsss.estimate_rank(), len(picks)) _assert_shielding(raw_tsss, power, 9) # should do nothing raw_tsss = maxwell_filter(raw, st_duration=tmax, st_correlation=1., st_only=True) assert_allclose(raw[:][0], raw_tsss[:][0]) # degenerate pytest.raises(ValueError, maxwell_filter, raw, st_only=True) # no ST # two-step process equivalent to single-step process raw_tsss = maxwell_filter(raw, st_duration=tmax, st_only=True) raw_tsss = maxwell_filter(raw_tsss) raw_tsss_2 = maxwell_filter(raw, st_duration=tmax) assert_meg_snr(raw_tsss, raw_tsss_2, 1e5) # now also with head movement, and a bad MEG channel assert_equal(len(raw.info['bads']), 0) bads = [raw.ch_names[0]] raw.info['bads'] = list(bads) raw_tsss = maxwell_filter(raw, st_duration=tmax, st_only=True, head_pos=head_pos) assert_equal(raw.info['bads'], bads) assert_equal(raw_tsss.info['bads'], bads) # don't reset raw_tsss = maxwell_filter(raw_tsss, head_pos=head_pos) assert_equal(raw_tsss.info['bads'], []) # do reset MEG bads raw_tsss_2 = maxwell_filter(raw, st_duration=tmax, head_pos=head_pos) assert_equal(raw_tsss_2.info['bads'], []) assert_meg_snr(raw_tsss, raw_tsss_2, 1e5)
def test_all(): """Test maxwell filter using all options""" raw_fnames = (raw_fname, raw_fname, erm_fname, sample_fname) sss_fnames = (sss_st1FineCalCrossTalkRegIn_fname, sss_st1FineCalCrossTalkRegInTransSample_fname, sss_erm_st1FineCalCrossTalkRegIn_fname, sss_samp_fname) fine_cals = (fine_cal_fname, fine_cal_fname, fine_cal_fname, fine_cal_mgh_fname) coord_frames = ('head', 'head', 'meg', 'head') ctcs = (ctc_fname, ctc_fname, ctc_fname, ctc_mgh_fname) mins = (3.5, 3.5, 1.2, 0.9) meds = (10.9, 10.4, 3.2, 6.) st_durs = (1., 1., 1., None) destinations = (None, sample_fname, None, None) origins = (mf_head_origin, mf_head_origin, mf_meg_origin, mf_head_origin) for ii, rf in enumerate(raw_fnames): with warnings.catch_warnings(record=True): # maxshield raw = Raw(rf, allow_maxshield=True).crop(0., 1., copy=False) with warnings.catch_warnings(record=True): # head fit off-center sss_py = maxwell_filter( raw, calibration=fine_cals[ii], cross_talk=ctcs[ii], st_duration=st_durs[ii], coord_frame=coord_frames[ii], destination=destinations[ii], origin=origins[ii]) sss_mf = Raw(sss_fnames[ii]) assert_meg_snr(sss_py, sss_mf, mins[ii], meds[ii], msg=rf)
def test_bads_reconstruction(): """Test Maxwell filter reconstruction of bad channels""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0., 1., False) raw.info['bads'] = bads raw_sss = maxwell_filter(raw) _assert_snr(raw_sss, Raw(sss_bad_recon_fname), 300.)
def test_bads_reconstruction(): """Test Maxwell filter reconstruction of bad channels.""" raw = read_crop(raw_fname, (0., 1.)) raw.info['bads'] = bads raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_bad_recon_fname), 300.)
def test_regularization(): """Test Maxwell filter regularization""" # Load testing data (raw, SSS std origin, SSS non-standard origin) min_tols = (100., 2.6, 1.0) med_tols = (1000., 21.4, 3.7) origins = ((0., 0., 0.04), (0.,) * 3, (0., 0.02, 0.02)) coord_frames = ('head', 'meg', 'head') raw_fnames = (raw_fname, erm_fname, sample_fname) sss_fnames = (sss_reg_in_fname, sss_erm_reg_in_fname, sss_samp_reg_in_fname) comp_tols = [0, 1, 4] for ii, rf in enumerate(raw_fnames): with warnings.catch_warnings(record=True): # maxshield raw = Raw(rf, allow_maxshield=True).crop(0., 1., False) sss_reg_in = Raw(sss_fnames[ii]) # Test "in" regularization raw_sss = maxwell_filter(raw, coord_frame=coord_frames[ii], origin=origins[ii]) assert_meg_snr(raw_sss, sss_reg_in, min_tols[ii], med_tols[ii], msg=rf) # check components match py_info = raw_sss.info['proc_history'][0]['max_info']['sss_info'] assert_true(py_info is not None) assert_true(len(py_info) > 0) mf_info = sss_reg_in.info['proc_history'][0]['max_info']['sss_info'] n_in = None for inf in py_info, mf_info: if n_in is None: n_in = _get_n_moments(inf['in_order']) else: assert_equal(n_in, _get_n_moments(inf['in_order'])) assert_equal(inf['components'][:n_in].sum(), inf['nfree']) assert_allclose(py_info['nfree'], mf_info['nfree'], atol=comp_tols[ii], err_msg=rf)
def test_bads_reconstruction(): """Test Maxwell filter reconstruction of bad channels""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0.0, 1.0, False) raw.info["bads"] = bads raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition="ignore") assert_meg_snr(raw_sss, Raw(sss_bad_recon_fname), 300.0)
def test_maxwell_filter_additional(): """Test processing of Maxwell filtered data""" # TODO: Future tests integrate with mne/io/tests/test_proc_history # Load testing data (raw, SSS std origin, SSS non-standard origin) data_path = op.join(testing.data_path(download=False)) file_name = 'test_move_anon' raw_fname = op.join(data_path, 'SSS', file_name + '_raw.fif') with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, preload=False, proj=False, allow_maxshield=True).crop(0., 1., False) raw_sss = maxwell.maxwell_filter(raw) # Test io on processed data tempdir = _TempDir() test_outname = op.join(tempdir, 'test_raw_sss.fif') raw_sss.save(test_outname) raw_sss_loaded = Raw(test_outname, preload=True, proj=False, allow_maxshield=True) # Some numerical imprecision since save uses 'single' fmt assert_allclose(raw_sss_loaded._data[:, :], raw_sss._data[:, :], rtol=1e-6, atol=1e-20)
def test_bads_reconstruction(): """Test Maxwell filter reconstruction of bad channels""" raw = Raw(raw_fname, allow_maxshield='yes').crop(0., 1., False) raw.info['bads'] = bads raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, Raw(sss_bad_recon_fname), 300.)
def test_all(): """Test maxwell filter using all options.""" raw_fnames = (raw_fname, raw_fname, erm_fname, sample_fname) sss_fnames = (sss_st1FineCalCrossTalkRegIn_fname, sss_st1FineCalCrossTalkRegInTransSample_fname, sss_erm_st1FineCalCrossTalkRegIn_fname, sss_samp_fname) fine_cals = (fine_cal_fname, fine_cal_fname, fine_cal_fname, fine_cal_mgh_fname) coord_frames = ('head', 'head', 'meg', 'head') ctcs = (ctc_fname, ctc_fname, ctc_fname, ctc_mgh_fname) mins = (3.5, 3.5, 1.2, 0.9) meds = (10.8, 10.4, 3.2, 6.) st_durs = (1., 1., 1., None) destinations = (None, sample_fname, None, None) origins = (mf_head_origin, mf_head_origin, mf_meg_origin, mf_head_origin) for ii, rf in enumerate(raw_fnames): raw = read_crop(rf, (0., 1.)) with pytest.warns(None): # sometimes the fit is bad sss_py = maxwell_filter( raw, calibration=fine_cals[ii], cross_talk=ctcs[ii], st_duration=st_durs[ii], coord_frame=coord_frames[ii], destination=destinations[ii], origin=origins[ii]) sss_mf = read_crop(sss_fnames[ii]) assert_meg_snr(sss_py, sss_mf, mins[ii], meds[ii], msg=rf)
def test_spatiotemporal_maxwell(): """Test Maxwell filter (tSSS) spatiotemporal processing""" # Load raw testing data with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True) # Test that window is less than length of data assert_raises(ValueError, maxwell_filter, raw, st_duration=1000.0) # Check both 4 and 10 seconds because Elekta handles them differently # This is to ensure that std/non-std tSSS windows are correctly handled st_durations = [4.0, 10.0] tols = [325.0, 200.0] for st_duration, tol in zip(st_durations, tols): # Load tSSS data depending on st_duration and get data tSSS_fname = op.join(sss_path, "test_move_anon_st%0ds_raw_sss.fif" % st_duration) tsss_bench = Raw(tSSS_fname) # Because Elekta's tSSS sometimes(!) lumps the tail window of data # onto the previous buffer if it's shorter than st_duration, we have to # crop the data here to compensate for Elekta's tSSS behavior. if st_duration == 10.0: tsss_bench.crop(0, st_duration, copy=False) # Test sss computation at the standard head origin. Same cropping issue # as mentioned above. if st_duration == 10.0: raw_tsss = maxwell_filter( raw.crop(0, st_duration), origin=mf_head_origin, st_duration=st_duration, regularize=None, bad_condition="ignore", ) else: raw_tsss = maxwell_filter( raw, st_duration=st_duration, origin=mf_head_origin, regularize=None, bad_condition="ignore" ) assert_meg_snr(raw_tsss, tsss_bench, tol) py_st = raw_tsss.info["proc_history"][0]["max_info"]["max_st"] assert_true(len(py_st) > 0) assert_equal(py_st["buflen"], st_duration) assert_equal(py_st["subspcorr"], 0.98) # Degenerate cases assert_raises(ValueError, maxwell_filter, raw, st_duration=10.0, st_correlation=0.0)
def test_cross_talk(): """Test Maxwell filter cross-talk cancellation.""" raw = read_crop(raw_fname, (0., 1.)) raw.info['bads'] = bads sss_ctc = read_crop(sss_ctc_fname) raw_sss = maxwell_filter(raw, cross_talk=ctc_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_ctc, 275.) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_true(len(py_ctc) > 0) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw_fname) mf_ctc = sss_ctc.info['proc_history'][0]['max_info']['sss_ctc'] del mf_ctc['block_id'] # we don't write this assert isinstance(py_ctc['decoupler'], sparse.csc_matrix) assert isinstance(mf_ctc['decoupler'], sparse.csc_matrix) assert_array_equal(py_ctc['decoupler'].toarray(), mf_ctc['decoupler'].toarray()) # I/O roundtrip tempdir = _TempDir() fname = op.join(tempdir, 'test_sss_raw.fif') sss_ctc.save(fname) sss_ctc_read = read_raw_fif(fname) mf_ctc_read = sss_ctc_read.info['proc_history'][0]['max_info']['sss_ctc'] assert isinstance(mf_ctc_read['decoupler'], sparse.csc_matrix) assert_array_equal(mf_ctc_read['decoupler'].toarray(), mf_ctc['decoupler'].toarray()) assert_equal(object_diff(py_ctc, mf_ctc), '') raw_ctf = read_crop(fname_ctf_raw).apply_gradient_compensation(0) assert_raises(ValueError, maxwell_filter, raw_ctf) # cannot fit headshape raw_sss = maxwell_filter(raw_ctf, origin=(0., 0., 0.04)) _assert_n_free(raw_sss, 68) raw_sss = maxwell_filter(raw_ctf, origin=(0., 0., 0.04), ignore_ref=True) _assert_n_free(raw_sss, 70) raw_missing = raw.copy().crop(0, 0.1).load_data().pick_channels( [raw.ch_names[pi] for pi in pick_types(raw.info, meg=True, exclude=())[3:]]) with warnings.catch_warnings(record=True) as w: maxwell_filter(raw_missing, cross_talk=ctc_fname) assert_equal(len(w), 1) assert_true('Not all cross-talk channels in raw' in str(w[0].message)) # MEG channels not in cross-talk assert_raises(RuntimeError, maxwell_filter, raw_ctf, origin=(0., 0., 0.04), cross_talk=ctc_fname)
def test_fine_calibration(): """Test Maxwell filter fine calibration.""" # Load testing data (raw, SSS std origin, SSS non-standard origin) raw = read_crop(raw_fname, (0., 1.)) sss_fine_cal = read_crop(sss_fine_cal_fname) # Test 1D SSS fine calibration with use_coil_def(elekta_def_fname): raw_sss = maxwell_filter(raw, calibration=fine_cal_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_fine_cal, 82, 611) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert (py_cal is not None) assert (len(py_cal) > 0) mf_cal = sss_fine_cal.info['proc_history'][0]['max_info']['sss_cal'] # we identify these differently mf_cal['cal_chans'][mf_cal['cal_chans'][:, 1] == 3022, 1] = 3024 assert_allclose(py_cal['cal_chans'], mf_cal['cal_chans']) assert_allclose(py_cal['cal_corrs'], mf_cal['cal_corrs'], rtol=1e-3, atol=1e-3) # with missing channels raw_missing = raw.copy().load_data() raw_missing.info['bads'] = ['MEG0111', 'MEG0943'] # 1 mag, 1 grad raw_missing.info._check_consistency() raw_sss_bad = maxwell_filter( raw_missing, calibration=fine_cal_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') raw_missing.pick_types() # actually remove bads raw_sss_bad.pick_channels(raw_missing.ch_names) # remove them here, too with pytest.warns(RuntimeWarning, match='cal channels not in data'): raw_sss_missing = maxwell_filter( raw_missing, calibration=fine_cal_fname, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss_missing, raw_sss_bad, 1000., 10000.) # Test 3D SSS fine calibration (no equivalent func in MaxFilter yet!) # very low SNR as proc differs, eventually we should add a better test raw_sss_3D = maxwell_filter(raw, calibration=fine_cal_fname_3d, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss_3D, sss_fine_cal, 1.0, 6.) raw_ctf = read_crop(fname_ctf_raw).apply_gradient_compensation(0) pytest.raises(RuntimeError, maxwell_filter, raw_ctf, origin=(0., 0., 0.04), calibration=fine_cal_fname)
def test_mf_skips(): """Test processing of data with skips.""" raw = read_raw_fif(skip_fname, preload=True) raw.fix_mag_coil_types() raw.pick_channels(raw.ch_names[:50]) # fast and inaccurate kwargs = dict(st_only=True, coord_frame='meg', int_order=4, ext_order=3) # smoke test that this runs maxwell_filter(raw, st_duration=17., skip_by_annotation=(), **kwargs) # and this one, too, which will process some all-zero data maxwell_filter(raw, st_duration=2., skip_by_annotation=(), **kwargs) with pytest.raises(ValueError, match='duration'): # skips decrease acceptable duration maxwell_filter(raw, st_duration=17., **kwargs) onsets, ends = _annotations_starts_stops( raw, ('edge', 'bad_acq_skip'), 'skip_by_annotation', invert=True) assert (ends - onsets).min() / raw.info['sfreq'] == 2. assert (ends - onsets).max() / raw.info['sfreq'] == 3. for st_duration in (2., 3.): raw_sss = maxwell_filter(raw, st_duration=st_duration, **kwargs) for start, stop in zip(onsets, ends): orig_data = raw[:, start:stop][0] new_data = raw_sss[:, start:stop][0] if (stop - start) / raw.info['sfreq'] >= st_duration: # Should be modified assert not np.allclose(new_data, orig_data, atol=1e-20) else: # Should not be modified assert_allclose(new_data, orig_data, atol=1e-20) # Processing an individual file and concat should be equivalent to # concat then process raw.crop(0, 1) raw_sss = maxwell_filter(raw, st_duration=1., **kwargs) raw_sss_concat = concatenate_raws([raw_sss, raw_sss.copy()]) raw_concat = concatenate_raws([raw.copy(), raw.copy()]) raw_concat_sss = maxwell_filter(raw_concat, st_duration=1., **kwargs) raw_concat_sss_bad = maxwell_filter(raw_concat, st_duration=1., skip_by_annotation=(), **kwargs) data_c = raw_concat[:][0] data_sc = raw_sss_concat[:][0] data_cs = raw_concat_sss[:][0] data_csb = raw_concat_sss_bad[:][0] assert not np.allclose(data_cs, data_c, atol=1e-20) assert not np.allclose(data_cs, data_csb, atol=1e-20) assert_allclose(data_sc, data_cs, atol=1e-20)
def test_spatiotemporal(): """Test Maxwell filter (tSSS) spatiotemporal processing.""" # Load raw testing data raw = read_crop(raw_fname) # Test that window is less than length of data with pytest.raises(ValueError, match='duration'): maxwell_filter(raw, st_duration=1000.) # We could check both 4 and 10 seconds because Elekta handles them # differently (to ensure that std/non-std tSSS windows are correctly # handled), but the 4-sec case should hopefully be sufficient. st_durations = [4.] # , 10.] tols = [(80, 100)] # , 200.] kwargs = dict(origin=mf_head_origin, regularize=None, bad_condition='ignore') for st_duration, tol in zip(st_durations, tols): # Load tSSS data depending on st_duration and get data tSSS_fname = op.join(sss_path, 'test_move_anon_st%0ds_raw_sss.fif' % st_duration) tsss_bench = read_crop(tSSS_fname) # Because Elekta's tSSS sometimes(!) lumps the tail window of data # onto the previous buffer if it's shorter than st_duration, we have to # crop the data here to compensate for Elekta's tSSS behavior. # if st_duration == 10.: # tsss_bench.crop(0, st_duration) # raw.crop(0, st_duration) # Test sss computation at the standard head origin. Same cropping issue # as mentioned above. raw_tsss = maxwell_filter( raw, st_duration=st_duration, **kwargs) assert_equal(raw_tsss.estimate_rank(), 140) assert_meg_snr(raw_tsss, tsss_bench, *tol) py_st = raw_tsss.info['proc_history'][0]['max_info']['max_st'] assert (len(py_st) > 0) assert_equal(py_st['buflen'], st_duration) assert_equal(py_st['subspcorr'], 0.98) # Degenerate cases pytest.raises(ValueError, maxwell_filter, raw, st_duration=10., st_correlation=0.)
def test_maxwell_filter_head_translation(): """Test Maxwell filter head translation""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0., 1., False) # First try with an unchanged destination raw_sss = maxwell_filter(raw, destination=raw_fname) _assert_snr(raw_sss, Raw(sss_std_fname).crop(0., 1., False), 200.) # Now with default default = (0, 0, 0.04) with catch_logging() as log: raw_sss = maxwell_filter(raw, destination=default) assert_true('over 25 mm' in log.getvalue()) _assert_snr(raw_sss, Raw(sss_trans_default_fname), 125.) # Now to sample's head pos with catch_logging() as log: raw_sss = maxwell_filter(raw, destination=sample_fname) assert_true('= 25.6 mm' in log.getvalue()) _assert_snr(raw_sss, Raw(sss_trans_sample_fname), 350.) # Degenerate cases assert_raises(RuntimeError, maxwell_filter, raw, destination=default, coord_frame='meg') assert_raises(ValueError, maxwell_filter, raw, destination=[0.] * 4)
def test_maxwell_filter_cross_talk(): """Test Maxwell filter cross-talk cancellation""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0., 1., False) raw.info['bads'] = bads sss_ctc = Raw(sss_ctc_fname) raw_sss = maxwell_filter(raw, cross_talk=ctc_fname) _assert_snr(raw_sss, sss_ctc, 275.) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_true(len(py_ctc) > 0) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw_fname) mf_ctc = sss_ctc.info['proc_history'][0]['max_info']['sss_ctc'] del mf_ctc['block_id'] # we don't write this assert_equal(object_diff(py_ctc, mf_ctc), '')
def test_cross_talk(): """Test Maxwell filter cross-talk cancellation""" with warnings.catch_warnings(record=True): # maxshield raw = Raw(raw_fname, allow_maxshield=True).crop(0.0, 1.0, False) raw.info["bads"] = bads sss_ctc = Raw(sss_ctc_fname) raw_sss = maxwell_filter(raw, cross_talk=ctc_fname, origin=mf_head_origin, regularize=None, bad_condition="ignore") assert_meg_snr(raw_sss, sss_ctc, 275.0) py_ctc = raw_sss.info["proc_history"][0]["max_info"]["sss_ctc"] assert_true(len(py_ctc) > 0) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw) assert_raises(ValueError, maxwell_filter, raw, cross_talk=raw_fname) mf_ctc = sss_ctc.info["proc_history"][0]["max_info"]["sss_ctc"] del mf_ctc["block_id"] # we don't write this assert_equal(object_diff(py_ctc, mf_ctc), "")
def test_maxwell_filter_additional(): """Test processing of Maxwell filtered data""" # TODO: Future tests integrate with mne/io/tests/test_proc_history # Load testing data (raw, SSS std origin, SSS non-standard origin) data_path = op.join(testing.data_path(download=False)) file_name = 'test_move_anon' raw_fname = op.join(data_path, 'SSS', file_name + '_raw.fif') with warnings.catch_warnings(record=True): # maxshield # Use 2.0 seconds of data to get stable cov. estimate raw = Raw(raw_fname, preload=False, proj=False, allow_maxshield=True).crop(0., 2., False) # Get MEG channels, compute Maxwell filtered data raw.load_data() raw.pick_types(meg=True, eeg=False) int_order, ext_order = 8, 3 raw_sss = maxwell.maxwell_filter(raw, int_order=int_order, ext_order=ext_order) # Test io on processed data tempdir = _TempDir() test_outname = op.join(tempdir, 'test_raw_sss.fif') raw_sss.save(test_outname) raw_sss_loaded = Raw(test_outname, preload=True, proj=False, allow_maxshield=True) # Some numerical imprecision since save uses 'single' fmt assert_allclose(raw_sss_loaded._data[:, :], raw_sss._data[:, :], rtol=1e-6, atol=1e-20) # Test rank of covariance matrices for raw and SSS processed data cov_raw = compute_raw_covariance(raw) cov_sss = compute_raw_covariance(raw_sss) scalings = None cov_raw_rank = _estimate_rank_meeg_cov(cov_raw['data'], raw.info, scalings) cov_sss_rank = _estimate_rank_meeg_cov(cov_sss['data'], raw_sss.info, scalings) assert_equal(cov_raw_rank, raw.info['nchan']) assert_equal(cov_sss_rank, maxwell.get_num_moments(int_order, 0))
def test_maxwell_filter_additional(): """Test processing of Maxwell filtered data.""" # TODO: Future tests integrate with mne/io/tests/test_proc_history # Load testing data (raw, SSS std origin, SSS non-standard origin) data_path = op.join(testing.data_path(download=False)) file_name = 'test_move_anon' raw_fname = op.join(data_path, 'SSS', file_name + '_raw.fif') # Use 2.0 seconds of data to get stable cov. estimate raw = read_crop(raw_fname, (0., 2.)) # Get MEG channels, compute Maxwell filtered data raw.load_data() raw.pick_types(meg=True, eeg=False) int_order = 8 raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') # Test io on processed data tempdir = _TempDir() test_outname = op.join(tempdir, 'test_raw_sss.fif') raw_sss.save(test_outname) raw_sss_loaded = read_crop(test_outname).load_data() # Some numerical imprecision since save uses 'single' fmt assert_allclose(raw_sss_loaded[:][0], raw_sss[:][0], rtol=1e-6, atol=1e-20) # Test rank of covariance matrices for raw and SSS processed data cov_raw = compute_raw_covariance(raw) cov_sss = compute_raw_covariance(raw_sss) scalings = None cov_raw_rank = _estimate_rank_meeg_cov(cov_raw['data'], raw.info, scalings) cov_sss_rank = _estimate_rank_meeg_cov(cov_sss['data'], raw_sss.info, scalings) assert_equal(cov_raw_rank, raw.info['nchan']) assert_equal(cov_sss_rank, _get_n_moments(int_order))
def test_movement_compensation(tmpdir): """Test movement compensation.""" temp_dir = str(tmpdir) lims = (0, 4) raw = read_crop(raw_fname, lims).load_data() head_pos = read_head_pos(pos_fname) # # Movement compensation, no regularization, no tSSS # raw_sss = maxwell_filter(raw, head_pos=head_pos, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_movecomp_fname, lims), 4.6, 12.4, chpi_med_tol=58) # IO temp_fname = op.join(temp_dir, 'test_raw_sss.fif') raw_sss.save(temp_fname) raw_sss = read_crop(temp_fname) assert_meg_snr(raw_sss, read_crop(sss_movecomp_fname, lims), 4.6, 12.4, chpi_med_tol=58) # # Movement compensation, regularization, no tSSS # raw_sss = maxwell_filter(raw, head_pos=head_pos, origin=mf_head_origin) assert_meg_snr(raw_sss, read_crop(sss_movecomp_reg_in_fname, lims), 0.5, 1.9, chpi_med_tol=121) # # Movement compensation, regularization, tSSS at the end # raw_nohpi = filter_chpi(raw.copy(), t_window=0.2) with pytest.warns(RuntimeWarning, match='untested'): raw_sss_mv = maxwell_filter(raw_nohpi, head_pos=head_pos, st_duration=4., origin=mf_head_origin, st_fixed=False) # Neither match is particularly good because our algorithm actually differs assert_meg_snr(raw_sss_mv, read_crop(sss_movecomp_reg_in_st4s_fname, lims), 0.6, 1.3) tSSS_fname = op.join(sss_path, 'test_move_anon_st4s_raw_sss.fif') assert_meg_snr(raw_sss_mv, read_crop(tSSS_fname, lims), 0.6, 1.0, chpi_med_tol=None) assert_meg_snr(read_crop(sss_movecomp_reg_in_st4s_fname), read_crop(tSSS_fname), 0.8, 1.0, chpi_med_tol=None) # # Movement compensation, regularization, tSSS at the beginning # raw_sss_mc = maxwell_filter(raw_nohpi, head_pos=head_pos, st_duration=4., origin=mf_head_origin) assert_meg_snr(raw_sss_mc, read_crop(tSSS_fname, lims), 0.6, 1.0, chpi_med_tol=None) assert_meg_snr(raw_sss_mc, raw_sss_mv, 0.6, 1.4) # some degenerate cases raw_erm = read_crop(erm_fname) pytest.raises(ValueError, maxwell_filter, raw_erm, coord_frame='meg', head_pos=head_pos) # can't do ERM file pytest.raises(ValueError, maxwell_filter, raw, head_pos=head_pos[:, :9]) # bad shape pytest.raises(TypeError, maxwell_filter, raw, head_pos='foo') # bad type pytest.raises(ValueError, maxwell_filter, raw, head_pos=head_pos[::-1]) head_pos_bad = head_pos.copy() head_pos_bad[0, 0] = raw._first_time - 1e-2 pytest.raises(ValueError, maxwell_filter, raw, head_pos=head_pos_bad) head_pos_bad = head_pos.copy() head_pos_bad[0, 4] = 1. # off by more than 1 m with pytest.warns(RuntimeWarning, match='greater than 1 m'): maxwell_filter(raw.copy().crop(0, 0.1), head_pos=head_pos_bad, bad_condition='ignore') # make sure numerical error doesn't screw it up, though head_pos_bad = head_pos.copy() head_pos_bad[0, 0] = raw._first_time - 5e-4 raw_sss_tweak = maxwell_filter( raw.copy().crop(0, 0.05), head_pos=head_pos_bad, origin=mf_head_origin) assert_meg_snr(raw_sss_tweak, raw_sss.copy().crop(0, 0.05), 1.4, 8., chpi_med_tol=5)
def test_other_systems(): """Test Maxwell filtering on KIT, BTI, and CTF files.""" # KIT kit_dir = op.join(io_dir, 'kit', 'tests', 'data') sqd_path = op.join(kit_dir, 'test.sqd') mrk_path = op.join(kit_dir, 'test_mrk.sqd') elp_path = op.join(kit_dir, 'test_elp.txt') hsp_path = op.join(kit_dir, 'test_hsp.txt') raw_kit = read_raw_kit(sqd_path, mrk_path, elp_path, hsp_path) with pytest.warns(RuntimeWarning, match='fit'): pytest.raises(RuntimeError, maxwell_filter, raw_kit) with catch_logging() as log: raw_sss = maxwell_filter(raw_kit, origin=(0., 0., 0.04), ignore_ref=True, verbose=True) assert '12/15 out' in log.getvalue() # homogeneous fields removed _assert_n_free(raw_sss, 65, 65) raw_sss_auto = maxwell_filter(raw_kit, origin=(0., 0., 0.04), ignore_ref=True, mag_scale='auto') assert_allclose(raw_sss._data, raw_sss_auto._data) # XXX this KIT origin fit is terrible! Eventually we should get a # corrected HSP file with proper coverage with pytest.warns(RuntimeWarning, match='more than 20 mm'): with catch_logging() as log: pytest.raises(RuntimeError, maxwell_filter, raw_kit, ignore_ref=True, regularize=None) # bad condition raw_sss = maxwell_filter(raw_kit, origin='auto', ignore_ref=True, bad_condition='info', verbose=True) log = log.getvalue() assert 'badly conditioned' in log assert 'more than 20 mm from' in log # fits can differ slightly based on scipy version, so be lenient here _assert_n_free(raw_sss, 28, 34) # bad origin == brutal reg # Let's set the origin with catch_logging() as log: raw_sss = maxwell_filter(raw_kit, origin=(0., 0., 0.04), ignore_ref=True, bad_condition='info', regularize=None, verbose=True) log = log.getvalue() assert 'badly conditioned' in log assert '80/80 in, 12/15 out' in log _assert_n_free(raw_sss, 80) # Now with reg with catch_logging() as log: raw_sss = maxwell_filter(raw_kit, origin=(0., 0., 0.04), ignore_ref=True, verbose=True) log = log.getvalue() assert 'badly conditioned' not in log assert '12/15 out' in log _assert_n_free(raw_sss, 65) # BTi bti_dir = op.join(io_dir, 'bti', 'tests', 'data') bti_pdf = op.join(bti_dir, 'test_pdf_linux') bti_config = op.join(bti_dir, 'test_config_linux') bti_hs = op.join(bti_dir, 'test_hs_linux') raw_bti = read_raw_bti(bti_pdf, bti_config, bti_hs, preload=False) picks = pick_types(raw_bti.info, meg='mag', exclude=()) power = np.sqrt(np.sum(raw_bti[picks][0] ** 2)) raw_sss = maxwell_filter(raw_bti) _assert_n_free(raw_sss, 70) _assert_shielding(raw_sss, power, 0.5) raw_sss_auto = maxwell_filter(raw_bti, mag_scale='auto', verbose=True) _assert_shielding(raw_sss_auto, power, 0.7) # CTF raw_ctf = read_crop(fname_ctf_raw) assert raw_ctf.compensation_grade == 3 pytest.raises(RuntimeError, maxwell_filter, raw_ctf) # compensated raw_ctf.apply_gradient_compensation(0) pytest.raises(ValueError, maxwell_filter, raw_ctf) # cannot fit headshape raw_sss = maxwell_filter(raw_ctf, origin=(0., 0., 0.04)) _assert_n_free(raw_sss, 68) _assert_shielding(raw_sss, raw_ctf, 1.8) with catch_logging() as log: raw_sss = maxwell_filter(raw_ctf, origin=(0., 0., 0.04), ignore_ref=True, verbose=True) assert ', 12/15 out' in log.getvalue() # homogeneous fields removed _assert_n_free(raw_sss, 70) _assert_shielding(raw_sss, raw_ctf, 12) raw_sss_auto = maxwell_filter(raw_ctf, origin=(0., 0., 0.04), ignore_ref=True, mag_scale='auto') assert_allclose(raw_sss._data, raw_sss_auto._data) with catch_logging() as log: maxwell_filter(raw_ctf, origin=(0., 0., 0.04), regularize=None, ignore_ref=True, verbose=True) assert '80/80 in, 12/15 out' in log.getvalue() # homogeneous fields
def test_basic(): """Test Maxwell filter basic version.""" # Load testing data (raw, SSS std origin, SSS non-standard origin) raw = read_crop(raw_fname, (0., 1.)) raw_err = read_crop(raw_fname).apply_proj() raw_erm = read_crop(erm_fname) pytest.raises(RuntimeError, maxwell_filter, raw_err) pytest.raises(TypeError, maxwell_filter, 1.) # not a raw pytest.raises(ValueError, maxwell_filter, raw, int_order=20) # too many n_int_bases = int_order ** 2 + 2 * int_order n_ext_bases = ext_order ** 2 + 2 * ext_order nbases = n_int_bases + n_ext_bases # Check number of bases computed correctly assert _get_n_moments([int_order, ext_order]).sum() == nbases # Test SSS computation at the standard head origin assert len(raw.info['projs']) == 12 # 11 MEG projs + 1 AVG EEG with use_coil_def(elekta_def_fname): raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert len(raw_sss.info['projs']) == 1 # avg EEG assert raw_sss.info['projs'][0]['desc'] == 'Average EEG reference' assert_meg_snr(raw_sss, read_crop(sss_std_fname), 200., 1000.) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert len(py_cal) == 0 py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert len(py_ctc) == 0 py_st = raw_sss.info['proc_history'][0]['max_info']['max_st'] assert len(py_st) == 0 pytest.raises(RuntimeError, maxwell_filter, raw_sss) # Test SSS computation at non-standard head origin with use_coil_def(elekta_def_fname): raw_sss = maxwell_filter(raw, origin=[0., 0.02, 0.02], regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_nonstd_fname), 250., 700.) # Test SSS computation at device origin sss_erm_std = read_crop(sss_erm_std_fname) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', origin=mf_meg_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_erm_std, 70., 260.) for key in ('job', 'frame'): vals = [x.info['proc_history'][0]['max_info']['sss_info'][key] for x in [raw_sss, sss_erm_std]] assert vals[0] == vals[1] # Two equivalent things: at device origin in device coords (0., 0., 0.) # and at device origin at head coords info['dev_head_t'][:3, 3] raw_sss_meg = maxwell_filter( raw, coord_frame='meg', origin=(0., 0., 0.)) raw_sss_head = maxwell_filter( raw, origin=raw.info['dev_head_t']['trans'][:3, 3]) assert_meg_snr(raw_sss_meg, raw_sss_head, 100., 900.) # Check against SSS functions from proc_history assert _get_n_moments(int_order) == _get_rank_sss(raw_sss) # Degenerate cases pytest.raises(ValueError, maxwell_filter, raw, coord_frame='foo') pytest.raises(ValueError, maxwell_filter, raw, origin='foo') pytest.raises(ValueError, maxwell_filter, raw, origin=[0] * 4) pytest.raises(ValueError, maxwell_filter, raw, mag_scale='foo') raw_missing = raw.copy().load_data() raw_missing.info['bads'] = ['MEG0111'] raw_missing.pick_types(meg=True) # will be missing the bad maxwell_filter(raw_missing) with pytest.warns(RuntimeWarning, match='not in data'): maxwell_filter(raw_missing, calibration=fine_cal_fname)
def test_basic(): """Test Maxwell filter basic version.""" # Load testing data (raw, SSS std origin, SSS non-standard origin) raw = read_crop(raw_fname, (0., 1.)) raw_err = read_crop(raw_fname).apply_proj() raw_erm = read_crop(erm_fname) assert_raises(RuntimeError, maxwell_filter, raw_err) assert_raises(TypeError, maxwell_filter, 1.) # not a raw assert_raises(ValueError, maxwell_filter, raw, int_order=20) # too many n_int_bases = int_order**2 + 2 * int_order n_ext_bases = ext_order**2 + 2 * ext_order nbases = n_int_bases + n_ext_bases # Check number of bases computed correctly assert_equal(_get_n_moments([int_order, ext_order]).sum(), nbases) # Test SSS computation at the standard head origin assert_equal(len(raw.info['projs']), 12) # 11 MEG projs + 1 AVG EEG raw_sss = maxwell_filter(raw, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_equal(len(raw_sss.info['projs']), 1) # avg EEG assert_equal(raw_sss.info['projs'][0]['desc'], 'Average EEG reference') assert_meg_snr(raw_sss, read_crop(sss_std_fname), 200., 1000.) py_cal = raw_sss.info['proc_history'][0]['max_info']['sss_cal'] assert_equal(len(py_cal), 0) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_equal(len(py_ctc), 0) py_st = raw_sss.info['proc_history'][0]['max_info']['max_st'] assert_equal(len(py_st), 0) assert_raises(RuntimeError, maxwell_filter, raw_sss) # Test SSS computation at non-standard head origin raw_sss = maxwell_filter(raw, origin=[0., 0.02, 0.02], regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_nonstd_fname), 250., 700.) # Test SSS computation at device origin sss_erm_std = read_crop(sss_erm_std_fname) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', origin=mf_meg_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, sss_erm_std, 100., 900.) for key in ('job', 'frame'): vals = [ x.info['proc_history'][0]['max_info']['sss_info'][key] for x in [raw_sss, sss_erm_std] ] assert_equal(vals[0], vals[1]) # Check against SSS functions from proc_history sss_info = raw_sss.info['proc_history'][0]['max_info'] assert_equal(_get_n_moments(int_order), proc_history._get_sss_rank(sss_info)) # Degenerate cases assert_raises(ValueError, maxwell_filter, raw, coord_frame='foo') assert_raises(ValueError, maxwell_filter, raw, origin='foo') assert_raises(ValueError, maxwell_filter, raw, origin=[0] * 4) assert_raises(ValueError, maxwell_filter, raw, mag_scale='foo')
def test_MGH_cross_talk(): raw = read_crop(raw_fname, (0., 1.)) raw_sss = maxwell_filter(raw, cross_talk=ctc_mgh_fname) py_ctc = raw_sss.info['proc_history'][0]['max_info']['sss_ctc'] assert_true(len(py_ctc) > 0)
def test_spatiotemporal_only(): """Test tSSS-only processing.""" # Load raw testing data raw = read_crop(raw_fname, (0, 2)).load_data() picks = pick_types(raw.info, meg='mag', exclude=()) power = np.sqrt(np.sum(raw[picks][0]**2)) # basics raw_tsss = maxwell_filter(raw, st_duration=1., st_only=True) assert_equal(raw_tsss.estimate_rank(), 366) _assert_shielding(raw_tsss, power, 10) # temporal proj will actually reduce spatial DOF with small windows! raw_tsss = maxwell_filter(raw, st_duration=0.1, st_only=True) assert_true(raw_tsss.estimate_rank() < 350) _assert_shielding(raw_tsss, power, 40) # with movement head_pos = read_head_pos(pos_fname) raw_tsss = maxwell_filter(raw, st_duration=1., st_only=True, head_pos=head_pos) assert_equal(raw_tsss.estimate_rank(), 366) _assert_shielding(raw_tsss, power, 12) with warnings.catch_warnings(record=True): # st_fixed False raw_tsss = maxwell_filter(raw, st_duration=1., st_only=True, head_pos=head_pos, st_fixed=False) assert_equal(raw_tsss.estimate_rank(), 366) _assert_shielding(raw_tsss, power, 12) # should do nothing raw_tsss = maxwell_filter(raw, st_duration=1., st_correlation=1., st_only=True) assert_allclose(raw[:][0], raw_tsss[:][0]) # degenerate assert_raises(ValueError, maxwell_filter, raw, st_only=True) # no ST # two-step process equivalent to single-step process raw_tsss = maxwell_filter(raw, st_duration=1., st_only=True) raw_tsss = maxwell_filter(raw_tsss) raw_tsss_2 = maxwell_filter(raw, st_duration=1.) assert_meg_snr(raw_tsss, raw_tsss_2, 1e5) # now also with head movement, and a bad MEG channel assert_equal(len(raw.info['bads']), 0) raw.info['bads'] = ['EEG001', 'MEG2623'] raw_tsss = maxwell_filter(raw, st_duration=1., st_only=True, head_pos=head_pos) assert_equal(raw.info['bads'], ['EEG001', 'MEG2623']) assert_equal(raw_tsss.info['bads'], ['EEG001', 'MEG2623']) # don't reset raw_tsss = maxwell_filter(raw_tsss, head_pos=head_pos) assert_equal(raw_tsss.info['bads'], ['EEG001']) # do reset MEG bads raw_tsss_2 = maxwell_filter(raw, st_duration=1., head_pos=head_pos) assert_equal(raw_tsss_2.info['bads'], ['EEG001']) assert_meg_snr(raw_tsss, raw_tsss_2, 1e5)
def test_movement_compensation(): """Test movement compensation.""" temp_dir = _TempDir() lims = (0, 4, False) raw = read_crop(raw_fname, lims).load_data() head_pos = read_head_pos(pos_fname) # # Movement compensation, no regularization, no tSSS # raw_sss = maxwell_filter(raw, head_pos=head_pos, origin=mf_head_origin, regularize=None, bad_condition='ignore') assert_meg_snr(raw_sss, read_crop(sss_movecomp_fname, lims), 4.6, 12.4, chpi_med_tol=58) # IO temp_fname = op.join(temp_dir, 'test_raw_sss.fif') raw_sss.save(temp_fname) raw_sss = read_crop(temp_fname) assert_meg_snr(raw_sss, read_crop(sss_movecomp_fname, lims), 4.6, 12.4, chpi_med_tol=58) # # Movement compensation, regularization, no tSSS # raw_sss = maxwell_filter(raw, head_pos=head_pos, origin=mf_head_origin) assert_meg_snr(raw_sss, read_crop(sss_movecomp_reg_in_fname, lims), 0.5, 1.9, chpi_med_tol=121) # # Movement compensation, regularization, tSSS at the end # raw_nohpi = filter_chpi(raw.copy()) with warnings.catch_warnings(record=True) as w: # untested feature raw_sss_mv = maxwell_filter(raw_nohpi, head_pos=head_pos, st_duration=4., origin=mf_head_origin, st_fixed=False) assert_equal(len(w), 1) assert_true('is untested' in str(w[0].message)) # Neither match is particularly good because our algorithm actually differs assert_meg_snr(raw_sss_mv, read_crop(sss_movecomp_reg_in_st4s_fname, lims), 0.6, 1.3) tSSS_fname = op.join(sss_path, 'test_move_anon_st4s_raw_sss.fif') assert_meg_snr(raw_sss_mv, read_crop(tSSS_fname, lims), 0.6, 1.0, chpi_med_tol=None) assert_meg_snr(read_crop(sss_movecomp_reg_in_st4s_fname), read_crop(tSSS_fname), 0.8, 1.0, chpi_med_tol=None) # # Movement compensation, regularization, tSSS at the beginning # raw_sss_mc = maxwell_filter(raw_nohpi, head_pos=head_pos, st_duration=4., origin=mf_head_origin) assert_meg_snr(raw_sss_mc, read_crop(tSSS_fname, lims), 0.6, 1.0, chpi_med_tol=None) assert_meg_snr(raw_sss_mc, raw_sss_mv, 0.6, 1.4) # some degenerate cases raw_erm = read_crop(erm_fname) assert_raises(ValueError, maxwell_filter, raw_erm, coord_frame='meg', head_pos=head_pos) # can't do ERM file assert_raises(ValueError, maxwell_filter, raw, head_pos=head_pos[:, :9]) # bad shape assert_raises(TypeError, maxwell_filter, raw, head_pos='foo') # bad type assert_raises(ValueError, maxwell_filter, raw, head_pos=head_pos[::-1]) head_pos_bad = head_pos.copy() head_pos_bad[0, 0] = raw.first_samp / raw.info['sfreq'] - 1e-2 assert_raises(ValueError, maxwell_filter, raw, head_pos=head_pos_bad) head_pos_bad = head_pos.copy() head_pos_bad[0, 4] = 1. # off by more than 1 m with warnings.catch_warnings(record=True) as w: maxwell_filter(raw, head_pos=head_pos_bad, bad_condition='ignore') assert_true(any('greater than 1 m' in str(ww.message) for ww in w)) # make sure numerical error doesn't screw it up, though head_pos_bad = head_pos.copy() head_pos_bad[0, 0] = raw.first_samp / raw.info['sfreq'] - 5e-4 raw_sss_tweak = maxwell_filter(raw, head_pos=head_pos_bad, origin=mf_head_origin) assert_meg_snr(raw_sss_tweak, raw_sss, 2., 10., chpi_med_tol=11)
def test_shielding_factor(tmpdir): """Test Maxwell filter shielding factor using empty room.""" raw_erm = read_crop(erm_fname).load_data().pick_types(meg=True) erm_power = raw_erm[pick_types(raw_erm.info, meg='mag')][0] erm_power = np.sqrt(np.sum(erm_power * erm_power)) erm_power_grad = raw_erm[pick_types(raw_erm.info, meg='grad')][0] erm_power_grad = np.sqrt(np.sum(erm_power * erm_power)) # Vanilla SSS (second value would be for meg=True instead of meg='mag') _assert_shielding(read_crop(sss_erm_std_fname), erm_power, 10) # 1.5) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None) _assert_shielding(raw_sss, erm_power, 12) # 1.5) _assert_shielding(raw_sss, erm_power_grad, 0.45, 'grad') # 1.5) # Using different mag_scale values raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, mag_scale='auto') _assert_shielding(raw_sss, erm_power, 12) _assert_shielding(raw_sss, erm_power_grad, 0.48, 'grad') raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, mag_scale=1.) # not a good choice _assert_shielding(raw_sss, erm_power, 7.3) _assert_shielding(raw_sss, erm_power_grad, 0.2, 'grad') raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, mag_scale=1000., bad_condition='ignore') _assert_shielding(raw_sss, erm_power, 4.0) _assert_shielding(raw_sss, erm_power_grad, 0.1, 'grad') # Fine cal _assert_shielding(read_crop(sss_erm_fine_cal_fname), erm_power, 12) # 2.0) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, origin=mf_meg_origin, calibration=fine_cal_fname) _assert_shielding(raw_sss, erm_power, 12) # 2.0) # Crosstalk _assert_shielding(read_crop(sss_erm_ctc_fname), erm_power, 12) # 2.1) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, origin=mf_meg_origin, cross_talk=ctc_fname) _assert_shielding(raw_sss, erm_power, 12) # 2.1) # Fine cal + Crosstalk raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, calibration=fine_cal_fname, origin=mf_meg_origin, cross_talk=ctc_fname) _assert_shielding(raw_sss, erm_power, 13) # 2.2) # tSSS _assert_shielding(read_crop(sss_erm_st_fname), erm_power, 37) # 5.8) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, origin=mf_meg_origin, st_duration=1.) _assert_shielding(raw_sss, erm_power, 37) # 5.8) # Crosstalk + tSSS raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, cross_talk=ctc_fname, origin=mf_meg_origin, st_duration=1.) _assert_shielding(raw_sss, erm_power, 38) # 5.91) # Fine cal + tSSS raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, calibration=fine_cal_fname, origin=mf_meg_origin, st_duration=1.) _assert_shielding(raw_sss, erm_power, 38) # 5.98) # Fine cal + Crosstalk + tSSS _assert_shielding(read_crop(sss_erm_st1FineCalCrossTalk_fname), erm_power, 39) # 6.07) raw_sss = maxwell_filter(raw_erm, coord_frame='meg', regularize=None, calibration=fine_cal_fname, origin=mf_meg_origin, cross_talk=ctc_fname, st_duration=1.) _assert_shielding(raw_sss, erm_power, 39) # 6.05) # Fine cal + Crosstalk + tSSS + Reg-in _assert_shielding(read_crop(sss_erm_st1FineCalCrossTalkRegIn_fname), erm_power, 57) # 6.97) raw_sss = maxwell_filter(raw_erm, calibration=fine_cal_fname, cross_talk=ctc_fname, st_duration=1., origin=mf_meg_origin, coord_frame='meg', regularize='in') _assert_shielding(raw_sss, erm_power, 53) # 6.64) raw_sss = maxwell_filter(raw_erm, calibration=fine_cal_fname, cross_talk=ctc_fname, st_duration=1., coord_frame='meg', regularize='in') _assert_shielding(raw_sss, erm_power, 58) # 7.0) _assert_shielding(raw_sss, erm_power_grad, 1.6, 'grad') raw_sss = maxwell_filter(raw_erm, calibration=fine_cal_fname, cross_talk=ctc_fname, st_duration=1., coord_frame='meg', regularize='in', mag_scale='auto') _assert_shielding(raw_sss, erm_power, 51) _assert_shielding(raw_sss, erm_power_grad, 1.5, 'grad') raw_sss = maxwell_filter(raw_erm, calibration=fine_cal_fname_3d, cross_talk=ctc_fname, st_duration=1., coord_frame='meg', regularize='in') # Our 3D cal has worse defaults for this ERM than the 1D file _assert_shielding(raw_sss, erm_power, 54) # Show it by rewriting the 3D as 1D and testing it temp_dir = str(tmpdir) temp_fname = op.join(temp_dir, 'test_cal.dat') with open(fine_cal_fname_3d, 'r') as fid: with open(temp_fname, 'w') as fid_out: for line in fid: fid_out.write(' '.join(line.strip().split(' ')[:14]) + '\n') raw_sss = maxwell_filter(raw_erm, calibration=temp_fname, cross_talk=ctc_fname, st_duration=1., coord_frame='meg', regularize='in') # Our 3D cal has worse defaults for this ERM than the 1D file _assert_shielding(raw_sss, erm_power, 44)