"""Clean a raw file from EOG and ECG artifacts with PCA (ie SSP). Examples -------- .. code-block:: console $ mne clean_eog_ecg -i in_raw.fif -o clean_raw.fif -e -c """ # Authors: The MNE-Python contributors. # License: BSD-3-Clause # Copyright the MNE-Python contributors. import sys import mne def clean_ecg_eog( in_fif_fname, out_fif_fname=None, eog=True, ecg=True, ecg_proj_fname=None, eog_proj_fname=None, ecg_event_fname=None, eog_event_fname=None, in_path=".", quiet=False, ): """Clean ECG from raw fif file. Parameters ---------- in_fif_fname : path-like Raw fif File eog_event_fname : str name of EOG event file required. eog : bool Reject or not EOG artifacts. ecg : bool Reject or not ECG artifacts. ecg_event_fname : str name of ECG event file required. in_path : str Path where all the files are. """ if not eog and not ecg: raise Exception("EOG and ECG cannot be both disabled") # Reading fif File raw_in = mne.io.read_raw_fif(in_fif_fname) if in_fif_fname.endswith("_raw.fif") or in_fif_fname.endswith("-raw.fif"): prefix = in_fif_fname[:-8] else: prefix = in_fif_fname[:-4] if out_fif_fname is None: out_fif_fname = prefix + "_clean_ecg_eog_raw.fif" if ecg_proj_fname is None: ecg_proj_fname = prefix + "_ecg-proj.fif" if eog_proj_fname is None: eog_proj_fname = prefix + "_eog-proj.fif" if ecg_event_fname is None: ecg_event_fname = prefix + "_ecg-eve.fif" if eog_event_fname is None: eog_event_fname = prefix + "_eog-eve.fif" print("Implementing ECG and EOG artifact rejection on data") kwargs = dict() if quiet else dict(stdout=None, stderr=None) if ecg: ecg_events, _, _ = mne.preprocessing.find_ecg_events( raw_in, reject_by_annotation=True ) print(f"Writing ECG events in {ecg_event_fname}") mne.write_events(ecg_event_fname, ecg_events) print("Computing ECG projector") command = ( "mne_process_raw", "--cd", in_path, "--raw", in_fif_fname, "--events", ecg_event_fname, "--makeproj", "--projtmin", "-0.08", "--projtmax", "0.08", "--saveprojtag", "_ecg-proj", "--projnmag", "2", "--projngrad", "1", "--projevent", "999", "--highpass", "5", "--lowpass", "35", "--projmagrej", "4000", "--projgradrej", "3000", ) mne.utils.run_subprocess(command, **kwargs) if eog: eog_events = mne.preprocessing.find_eog_events(raw_in) print(f"Writing EOG events in {eog_event_fname}") mne.write_events(eog_event_fname, eog_events) print("Computing EOG projector") command = ( "mne_process_raw", "--cd", in_path, "--raw", in_fif_fname, "--events", eog_event_fname, "--makeproj", "--projtmin", "-0.15", "--projtmax", "0.15", "--saveprojtag", "_eog-proj", "--projnmag", "2", "--projngrad", "2", "--projevent", "998", "--lowpass", "35", "--projmagrej", "4000", "--projgradrej", "3000", ) mne.utils.run_subprocess(command, **kwargs) if out_fif_fname is not None: # Applying the ECG EOG projector print("Applying ECG EOG projector") command = ( "mne_process_raw", "--cd", in_path, "--raw", in_fif_fname, "--proj", in_fif_fname, "--projoff", "--save", out_fif_fname, "--filteroff", "--proj", ecg_proj_fname, "--proj", eog_proj_fname, ) mne.utils.run_subprocess(command, **kwargs) print("Done removing artifacts.") print(f"Cleaned raw data saved in: {out_fif_fname}") print("IMPORTANT : Please eye-ball the data !!") else: print("Projection not applied to raw data.") def run(): """Run command.""" from mne.commands.utils import get_optparser parser = get_optparser(__file__) parser.add_option( "-i", "--in", dest="raw_in", help="Input raw FIF file", metavar="FILE" ) parser.add_option( "-o", "--out", dest="raw_out", help="Output raw FIF file", metavar="FILE", default=None, ) parser.add_option( "-e", "--no-eog", dest="eog", action="store_false", help="Remove EOG", default=True, ) parser.add_option( "-c", "--no-ecg", dest="ecg", action="store_false", help="Remove ECG", default=True, ) parser.add_option( "-q", "--quiet", dest="quiet", action="store_true", help="Suppress mne_process_raw output", default=False, ) options, args = parser.parse_args() if options.raw_in is None: parser.print_help() sys.exit(1) raw_in = options.raw_in raw_out = options.raw_out eog = options.eog ecg = options.ecg quiet = options.quiet clean_ecg_eog(raw_in, raw_out, eog=eog, ecg=ecg, quiet=quiet) mne.utils.run_command_if_main()