예제 #1
0
def concat_and_save(raws,
                    fname=None,
                    save=False,
                    annotations=None,
                    clear=True):
    '''
    concatenate a list of raw obj's to a new raw obj
    calling mne.concatenate_raw
    clear raws in list
    
    with new raw obj:
     set fname, annotations
     save raw
    
    Parameters
    ----------
    raws  : list of raw objs
    fname : full filename <None>
    save  : <False>
    clear : close all raw obj in raws <True>
    annotations: set annotations in raw obj <None>.
  
    Returns
    -------
    raw obj concatenated
    '''
    raw_concat = None

    if raws:
        raw_concat = mne.concatenate_raws(raws)
        if clear:
            while raws:
                raws.pop().close()
            del raws
        if annotations:
            raw_concat.set_annotations(annotations)

        if fname:
            jb.set_raw_filename(raw_concat, fname)
        if save:
            jb.apply_save_mne_data(raw_concat, fname=fname)

    return raw_concat
예제 #2
0
    def apply(self, **kwargs):
        """
        :param kwargs:
         flow,fhigh,raw,picks
        :return:
         fname
        
        """
        self._update_from_kwargs(**kwargs)

        logger.info("---> Filter start: {}".format(self.fname))
        self.raw.filter(l_freq=self.flow, h_freq=self.fhigh, picks=self.picks)
        self._update_postfix()
        fname, ext = self.fname.rsplit('-', 1)  #raw.fif'
        fname += "," + self.postfix + "-" + ext
        if self.save:
            fname = jb.apply_save_mne_data(self.raw,
                                           fname=fname,
                                           overwrite=True)
            jb.set_raw_filename(self.raw, fname)
        logger.info("---> Filter done: {}".format(self.fname))
        return fname
def apply_import_to_fif(opt):
    """
    apply jumeg import 4D/BTi data to FIF
    convert 4D-file to FIF format using mne
    save raw-obj to new file
    
    jumeg wrapper for <mne.io.read_raw_bti>
    https://martinos.org/mne/stable/generated/mne.io.read_raw_bti.html#mne.io.read_raw_bti
    
    Parameter
    ---------
     opt
     
    Outputfile
    ----------
    <wawa>, -raw.fif

    Returns
    -------
    return mne.io.Raw instance
    """
    # --- ck file fullpath
    fpdf = jb.isFile(opt.pdf_fname,
                     path=opt.pdf_stage,
                     head="apply_import_to_fif => file check: 4D/BTI <raw>",
                     exit_on_error=True)
    if not fpdf: return
    fcfg = jb.isFile(opt.config_fname,
                     path=opt.pdf_stage,
                     head="apply_import_to_fif:=> file check: 4D/BTI <config>",
                     exit_on_error=True)
    if not fcfg: return

    # ToDo ck if headshape file must exist
    #  pt.headshape_fake and touch hs
    #---
    #fhs  = jb.isFile(opt.head_shape_fname,path=opt.pdf_stage,head="apply_import_to_fif:=> file check: 4D/BTI <head shape>",exit_on_error=True)
    #if not fhs : return

    #--- mk fif ouput file name
    # fpdf="/mnt/meg_store2/megdaw_data21/211063/INTEXT01//18-11-15@11:20/1/c,rfDC"
    # 211063_INTEXT01_181115_1120_1_c,rfDC-raw.fif  size [Mb]:  703.534
    #---> FIF / MNE path        : /mnt/meg_store1/exp/INTEXT/mne/211063/INTEXT01/181115_1120/1/

    fif_out = os.path.expandvars(os.path.expanduser(opt.fif_stage)) + "/"
    #if opt.fif_path_prefix:
    #   fif_out += opt.fif_path_prefix+"/"
    fif_out += "/".join(fpdf.split("/")[-5:-1]) + "/"
    fif_out += "_".join(fpdf.split("/")[-5:])
    fif_out = re.sub('/+', '/',
                     fif_out).replace('@', "_").replace(":",
                                                        "").replace("-", "")
    fif_out += opt.fif_extention

    if not opt.overwrite:
        if os.path.isfile(fif_out):
            if opt.verbose:
                logger.info(
                    "---> 4D/BTI file   : {}\n".format(fpdf) +
                    " --> FIF / MNE file: {} size [Mb]: {}\n".format(
                        os.path.basename(fif_out),
                        os.path.getsize(fif_out) / 1024.0**2) +
                    " --> FIF / MNE path: {}\n".format(os.path.dirname(
                        fif_out)) +
                    "  -> !!! FIF File exist will not overwrite [overwrite={}\n"
                    .format(opt.overwrite) + "===> Done")
            return

# --- check and set opt parameter
    kwargs = dict()

    if jb.isNotEmpty(opt.rotation_x):
        kwargs["rotation_x"] = float(opt.rotation_x)
    if jb.isNotEmpty(opt.translation):
        kwargs["translation"] = float(opt.translation)
    if jb.isNotEmpty(opt.ecg_ch): kwargs["ecg_ch"] = opt.ecg_ch
    if jb.isNotEmpty(opt.eog_ch): kwargs["eog_ch"] = opt.eog_ch

    #--- run
    if opt.run:
        #print("RUN")
        # defaults mne017
        # pdf_fname, config_fname='config', head_shape_fname='hs_file', rotation_x=0.0, translation=(0.0, 0.02, 0.11), convert=True,
        # rename_channels=True, sort_by_ch_name=True, ecg_ch='E31', eog_ch=('E63', 'E64'), preload=False, verbose=None
        try:
            raw = mne.io.read_raw_bti(fpdf,
                                      config_fname=opt.config_fname,
                                      head_shape_fname=opt.head_shape_fname,
                                      preload=opt.preload,
                                      convert=opt.convert,
                                      rename_channels=opt.rename_channels,
                                      sort_by_ch_name=opt.sort_by_ch_name,
                                      verbose=opt.verbose,
                                      **kwargs)
        except:
            logger.exception(
                "---> error in mne.io.read_raw_bti:\n   -> file: {}".format(
                    fpdf))

    #--- make output filename and save
        if opt.save:
            fif_out = jb.apply_save_mne_data(raw,
                                             fname=fif_out,
                                             overwrite=opt.overwrite)

            if opt.verbose:
                logger.info("===> 4D/BTI file   : {}\n".format(fpdf) +
                            " --> FIF / MNE file: {} size [Mb]: {}\n".format(
                                os.path.basename(fif_out),
                                os.path.getsize(fif_out) / 1024.0**2) +
                            " --> FIF / MNE path: {}\n".format(
                                os.path.dirname(fif_out)))
        return raw
예제 #4
0
def apply_filter(opt):
    """
    apply jumeg filter with argparser options
    
    load fif file (mne) get raw-obj
    calc  FIR FFT filter [bp,hp,lp,notches] for raw-obj data
    save raw-obj to new file
    filter_method : mne => fft mne-filter
                    bw  => fft butterwoth
                    ws  => fft - windowed sinc
    
    Parameter
    ---------                 
     opt: argparser option obj
     
    Result
    -------
    raw-obj
    """
    raw = None
    fout = None
    jb.verbose = opt.verbose

    #--- check if fullfile exists
    fin = jb.isfile(opt.fif_filename,
                    path=opt.fif_stage,
                    head="apply_suggest_bads: FIF File Check",
                    exit_on_error=False)
    if not fin: return

    #--- generate filter obj reset no defaults
    filter_obj = jumeg_filter(filter_method=opt.method,
                              filter_type=opt.type,
                              fcut1=None,
                              fcut2=None,
                              remove_dcoffset=False,
                              notch=np.array([]),
                              notch_width=1.0,
                              order=4)

    # !!! Py3 type(opt.fcut  ) return < cls str>

    #--- check and set opt parameter
    if jb.isNotEmpty(opt.fcut1): filter_obj.fcut1 = float(opt.fcut1)
    #---
    if jb.isNotEmpty(opt.fcut2): filter_obj.fcut2 = float(opt.fcut2)
    #---
    if jb.isNotEmpty(opt.order): filter_obj.order = float(opt.order)
    #--- calc notch array e.g. 50,100,150 .. max
    if opt.notch:
        filter_obj.calc_notches(opt.notch, opt.notch_max)
        if jb.isNotEmpty(opt.notch_width):
            filter_obj.notch_width = float(opt.notch_width)
#---
    filter_obj.filter_window = opt.window
    filter_obj.remove_dcoffset = opt.remove_dcoffset
    filter_obj.verbose = opt.verbose

    if opt.method.lower() == "mne":
        filter_obj.mne_filter_method = opt.mne_method
        if jb.isNotEmpty(opt.mne_length):
            filter_obj.mne_filter_length = float(opt.mne_length)
        if jb.isNotEmpty(opt.mne_trans_bandwith):
            filter_obj.trans_bandwith = float(opt.mne_trans_bandwith)


#--- load fif
    logger.info(" --> jumeg filter load MEG data: " + fin)
    raw, _ = jb.get_raw_obj(fin, raw=raw)
    #--- get MEG & Ref picks
    picks = jb.picks.exclude_trigger(raw)
    filter_obj.sampling_frequency = raw.info['sfreq']

    #--- apply filter
    logger.info(" --> jumeg filter apply filter")
    filter_obj.apply_filter(raw._data, picks=picks)
    logger.info(" --> jumeg filter info: " + filter_obj.filter_info)

    filter_obj.update_info_filter_settings(
        raw)  # raw.info lowpass and highpass

    #--- make output filename
    name_raw = fin.split('-')[0]
    fout = name_raw + "," + filter_obj.filter_name_postfix + opt.file_extention

    if opt.save:
        fout = jb.apply_save_mne_data(raw, fname=fout)

    return raw
예제 #5
0
    def apply(self, **kwargs):
        """
        wrapper function for MNE version 19.2 notch filter cls
        data in raw-obj will be overwritten
        filename is updated in raw-obj

        call MNE <raw.notch_filter>
        notch_filter(self,freqs,picks=None,filter_length='auto',notch_widths=None,trans_bandwidth=1.0,n_jobs=1,method='fir',
                     iir_params=None,mt_bandwidth=None,p_value=0.05,phase='zero',fir_window='hamming',fir_design='firwin',
                     pad='reflect_limited',verbose=None)[source]
      

        :param kwargs:
        
        Example
        --------
        -> notch all chanels 50.0,100.0,150.0 Hz except STIM
        
        from jumeg.base.jumeg_base import jumeg_base as jb
        from jumeg.filter.jumeg_mne_filter import JUMEG_NOTCH_FILTER
        
        jNFI = JUMEG_NOTCH_FILTER()
        
        fname = jNFI.apply(
                           freqs = [50.0,100.0,150.0]
                           picks = jb.picks.exclude_trigger(raw)
                           )
        Example
        --------
        -> filter all chanels 0.1 -45.0 Hz except STIM

        from jumeg.filter.jumeg_mne_filter import JUMEG_FILTER
        jFI = JUMEG_FILTER()
        fname = jFI.apply(
                  flow = 0.1,
                  fhigh = 45.0,
                  save  = True,
                  raw   = raw,
                  picks = jb.picks.exclude_trigger(raw) )

        
        :return:
         fname
        """

        self._update_from_kwargs(**kwargs)
        self._is_filtered = False
        self._is_reloaded = False

        v = jb.verbose
        jb.verbose = self.verbose

        logger.info("---> Filter start: {}".format(self.fname))

        self._update_postfix()
        fname, ext = self.fname.rsplit('-', 1)  #raw.fif'
        fname += "," + self.postfix + "-" + ext

        #--- ck if load from disk
        if not self.overwrite:
            if jb.isFile(fname):
                logger.debug("Notch Filtered RAW reloading from disk ...")
                self.raw, fname = jb.get_raw_obj(fname, None)
                self._is_filtered = True
                self._is_reloaded = True

        if not self._is_filtered:
            logger.info("Notch Filter start MNE filter ...")
            if isinstance(self.picks, (list, np.ndarray)):
                picks = self.picks
            else:
                logger.warning(
                    "picks not defined : excluding channel group <stim> and <resp>"
                )
                picks = jb.picks.exclude_trigger(self.raw)

            self.raw.notch_filter(self.freqs,
                                  picks=picks,
                                  filter_length=self.filter_length,
                                  notch_widths=self.notch_widths,
                                  trans_bandwidth=self.trans_bandwidth,
                                  n_jobs=self.n_jobs,
                                  method=self.method,
                                  iir_params=self.iir_params,
                                  mt_bandwidth=self.mt_bandwidth,
                                  p_value=self.p_value,
                                  phase=self.phase,
                                  fir_window=self.fir_window,
                                  fir_design=self.fir_design,
                                  pad=self.pad,
                                  verbose=self.verbose)

            self._fname_orig = jb.get_raw_filename(self.raw)
            self._is_filtered = True

            if self.save:
                logger.info("Notch Filter saving data")
                fname = jb.apply_save_mne_data(self.raw,
                                               fname=fname,
                                               overwrite=True)
            else:
                jb.set_raw_filename(self.raw, fname)

        logger.info("Notch Filter done: {}\n".format(self.fname) +
                    "  -> reloaded from disk: {}".format(self._is_reloaded))

        jb.verbose = v
        return fname