def get_explained(subject_no, n_comp, n_bads): subject = subjects[subject_no] raw_fname = root_dir + '%s/passive_raw.fif' % subject room_fname = root_dir + '%s/emptyroom_%s.fif' % (subject, subject) raw = mne.io.read_raw_fif(raw_fname, preload=True) raw_room = mne.io.read_raw_fif(room_fname, preload=True) raw.filter(0.5, 70) raw_room.filter(1, 70) mne.channels.fix_mag_coil_types(raw.info) mne.channels.fix_mag_coil_types(raw_room.info) picks = mne.pick_types(raw.info, meg='mag', eeg=False, eog=False, stim=False, exclude='bads') events = mne.find_events(raw) tmin, tmax = -0.1, 0.3 expes = list(event_id.keys()) expe = expes[2] # reject = dict(grad=4000e-13, mag=1e-12, eog=150e-6) reject = None # Fit smica freqs = np.linspace(1, 70, 41) smica = ICA(n_components=n_comp, freqs=freqs, rng=0).fit(raw, picks, tol=1e-9, verbose=100, n_it_min=3000, em_it=3000, n_it_lbfgs=3000) ica = ICA_mne(n_comp).fit(raw, picks) X_room = raw_room.get_data(picks=picks) X_room /= np.linalg.norm(X_room) Ss = smica.compute_sources(X_room) As = smica.A del smica Ai = ica.get_components() Si = np.linalg.pinv(Ai).dot(X_room) def greedy_comp(X_room, A, S, n_comp=5): bads = [] vals = [] Xc = X_room.copy() idxs = np.arange(S.shape[0]) for i in range(n_comp): print(i) diffs = [np.linalg.norm(Xc - a[:, None] * s) for a, s in zip(A.T[idxs], S[idxs])] j = idxs[np.argmin(diffs)] bads.append(j) Xc -= A[:, j][:, None] * S[j] vals.append(np.linalg.norm(Xc)) idxs = np.delete(idxs, np.where(idxs == j)) return bads, vals bads, vals = greedy_comp(X_room, As, Ss, n_bads) badi, vali = greedy_comp(X_room, Ai, Si, n_bads) np.save('results/expl_%d_%d_%d.npy' % (subject_no, n_comp, n_bads), np.array((vals, vali))) return vals, vali
def process_one(dipole_no, amp, n_components, crop_idx, crop_len=None): raw_fname = "%sAmp%d_Dip%d_IASoff.fif" % (get_root_dir(), amp, dipole_no) raw = read_raw_fif(raw_fname) raw.load_data() raw.crop(5, None) if crop_len is not None: raw.crop(crop_idx * crop_len, (crop_idx + 1) * crop_len) raw.fix_mag_coil_types() events = find_events(raw, "SYS201") picks = mne.pick_types(raw.info, meg="mag", eeg=False, eog=False, stim=False, exclude="bads") n_bins = 40 freqs = np.linspace(1, 70, n_bins + 1) smica = ICA(n_components, freqs, rng=0).fit( raw, picks=picks, em_it=50000, n_it_lbfgs=200, tol=1e-8, verbose=100, n_it_min=10000, ) ica = ICA_mne(n_components, method="picard").fit(raw.copy().filter(1, 70), picks=picks) jdiag = JDIAG_mne(n_components, freqs, rng=0).fit(raw, picks=picks) tmin, tmax = -0.1, 0.1 event_id = [dipole_no] # pows = np.linalg.norm(smica.A, axis=0) * # np.linalg.norm(smica.powers, axis=0) ** .5 raw_max = raw.copy().filter(1, 40) raw_max = maxwell_filter(raw_max, origin=(0.0, 0.0, 0.0)) epochs = mne.Epochs( raw_max, events, event_id, tmin, tmax, baseline=(None, -0.01), preload=True, picks=picks, ) cov = mne.compute_covariance(epochs, tmax=0) e1 = get_error(epochs, cov) e_2 = get_error_A(smica.A, cov, epochs.info) good = np.argmin(e_2[0]) e2 = [e_2[0][good], e_2[1][good]] e_3 = get_error_A(jdiag.A, cov, epochs.info) good = np.argmin(e_3[0]) e3 = [e_3[0][good], e_3[1][good]] e_4 = get_error_A(ica.get_components(), cov, epochs.info) good = np.argmin(e_4[0]) e4 = [e_4[0][good], e_4[1][good]] crop_str = crop_len if crop_len is not None else 0 np.save( "results/phantom_%d_%d_%d_%d_%d.npy" % (dipole_no, amp, n_components, crop_idx, crop_str), np.array([e1, e2, e3, e4]), ) print(e1, e2, e3, e4) return e1, e2, e3, e4
colors = ["k", "darkred", "forestgreen", "royalblue", "orange"] # Plot the clusters # smica.plot_extended(sort=False) bad_sources = [17, 18, 19] X_filtered = smica.filter( raw._data[picks], bad_sources=bad_sources, method="wiener" ) raw_filtered = raw.copy() raw_filtered._data[picks] = X_filtered raw.filter(1, 70) ica = ICA_mne(n_components=20, method="fastica", random_state=0) ica.fit(raw, picks=picks) sources = ica.get_sources(raw).get_data() ica_mne = transfer_to_ica( raw, picks, freqs, ica.get_sources(raw).get_data(), ica.get_components() ) # ica_mne.plot_extended(sources, sort=False) bads_infomax = [0, 1, 2] X_ifmx = ica_mne.filter( raw._data[picks], bad_sources=bads_infomax, method="pinv" ) raw_ifmx = raw.copy() raw_ifmx._data[picks] = X_ifmx # We identify that clusters 6, 7, 8, 9 correspond to noise
smica = ICA(n_components=n_components, freqs=freqs, rng=0) smica.fit(raw, picks=picks, verbose=100, tol=1e-10, em_it=100000) # Plot powers # noise_sources = [6, 8, 9] # muscle_source = [7] # f, ax = plt.subplots(figsize=(4, 2)) # plot_powers(smica.powers, noise_sources, muscle_source, ax, 'smica') # plt.show() # # # # # sobi = SOBI_mne(100, n_components, freqs, rng=0) # sobi.fit(raw, picks=picks) raw.filter(2, 70) ica = ICA_mne(n_components=n_components, method='fastica', random_state=0) ica.fit(raw, picks=picks) ica_mne = transfer_to_ica(raw, picks, freqs, ica.get_sources(raw).get_data(), ica.get_components()) brain_sources = smica.compute_sources() K, W, _ = picard(brain_sources, ortho=False, verbose=True, random_state=0, max_iter=1000) picard_mix = np.linalg.pinv(W @ K) A_wiener = smica.A.dot(picard_mix) gof_wiener = dipolarity(A_wiener, raw, picks, fname_bem, n_jobs=3)[0]
return order n_bins = 40 freqs = np.linspace(1, 70, n_bins + 1) n_comp = 40 smica_room = ICA(10, freqs=freqs, rng=0).fit(raw_room, picks) jdiag_room = JDIAG_mne(10, freqs=freqs, rng=0).fit(raw_room, picks=picks) smica = ICA(n_comp, freqs=freqs, rng=0).fit(raw, picks=picks) to_plot_smica = [37, 38, 39, 20, 4, 3, 19, 8, 12, 2] raw.filter(1, 70) jdiag = JDIAG_mne(n_comp, freqs=freqs, rng=0).fit(raw, picks=picks) to_plot_jdiag = [2, 1, 0, 13, 34, 3, 20, 30, 5, 10] sobi = SOBI_mne(100, n_comp, freqs).fit(raw, picks=picks) to_plot_sobi = [2, 0, 8, 12, 20, 31, 3, 17, 9, 10] ifmx_ = ICA_mne(n_comp, random_state=0).fit(raw, picks=picks) ifmx = transfer_to_ica(raw, picks, freqs, ifmx_.get_sources(raw).get_data(), ifmx_.get_components()) to_plot_ifmx = [1, 2, 0, 35, 33, 19, 3, 32, 25, 9] plot_args = dict(number=True, t_min=2, t_max=4) pow_lims = [(np.min(algo.powers), np.max(algo.powers)) for algo in [smica, jdiag, sobi, ifmx]] y_lim = 0.0001, 0.21 for algo, sort, method, name in zip( [smica, jdiag, sobi, ifmx], [to_plot_smica, to_plot_jdiag, to_plot_sobi, to_plot_ifmx], ['wiener', 'pinv', 'pinv', 'pinv'], ['smica', 'jdiag', 'sobi', 'ifmx']):
plt.show() smica = ICA(n_components=n_components, freqs=freqs, rng=0) smica.fit(raw, picks=picks, verbose=100, tol=1e-10, em_it=100000) # Plot powers noise_sources = [6, 8, 9] muscle_source = [7] f, ax = plt.subplots(figsize=(4, 2)) plot_powers(smica.powers, noise_sources, muscle_source, ax, 'smica') plt.show() ica = ICA_mne(n_components=n_components, method='picard', random_state=0) ica.fit(raw, picks=picks) ica_mne = transfer_to_ica(raw, picks, freqs, ica.get_sources(raw).get_data(), ica.mixing_matrix_) noise_sources = [1, 2] muscle_source = [4] f, ax = plt.subplots(figsize=(4, 2)) plot_powers(ica_mne.powers, noise_sources, muscle_source, ax, 'infomax') plt.show() sobi = SOBI_mne(p=2000, n_components=n_components, freqs=freqs, rng=0) sobi.fit(raw, picks=picks, verbose=True, tol=1e-7, max_iter=10000)