Esempio n. 1
0
def load(fname, filter=None, abr_window=8.5e-3):
    with open(fname) as fh:
        line = fh.readline()
        if not line.startswith('Identifier:'):
            raise IOError('Unsupported file format')
    info = load_metadata(fname)
    info = info[info.channel == 1]
    fs = 1 / (info.iloc[0]['smp. period'] * 1e-6)
    series = []
    for frequency, f_info in info.groupby('stim. freq.'):
        signal = load_waveforms(fname, f_info)
        signal = signal[signal.index >= 0]
        waveforms = []
        min_latency = latencies.get(frequency)
        for i, row in f_info.iterrows():
            s = signal[i].values[np.newaxis]
            waveform = ABRWaveform(fs,
                                   s,
                                   row['level'],
                                   min_latency=min_latency,
                                   filter=filter)
            waveforms.append(waveform)

        s = ABRSeries(waveforms, frequency / 1e3)
        s.filename = fname
        series.append(s)
    return series
Esempio n. 2
0
def load(base_directory, filter_settings=None, frequencies=None):
    filename = get_filename(base_directory, filter_settings)
    if frequencies is not None and np.isscalar(frequencies):
        frequencies = [frequencies]

    data = pd.io.parsers.read_csv(filename, header=[0, 1], index_col=0).T
    fs = np.mean(np.diff(data.columns.values)**-1)
    data.columns *= 1e3
    waveforms = {}
    for (frequency, level), w in data.iterrows():
        frequency = float(frequency)
        level = float(level)
        if frequencies is not None:
            if frequency not in frequencies:
                continue
        frequency = float(frequency)
        level = float(level)
        waveform = ABRWaveform(fs, w, level)
        waveforms.setdefault(frequency, []).append(waveform)

    series = []
    for frequency, stack in waveforms.items():
        s = ABRSeries(stack, frequency)
        s.filename = filename
        s.id = filename.parent.name
        series.append(s)

    return series
Esempio n. 3
0
def load(filename, filter=None, frequencies=None):
    filename = Path(filename)
    with filename.open(encoding='ISO-8859-1') as f:
        line = f.readline()
        if not line.startswith(':RUN-'):
            raise IOError('Unsupported file format')

    p_level = re.compile(':LEVELS:([0-9;]+)')
    p_fs = re.compile('SAMPLE \(.sec\): ([0-9]+)')
    p_freq = re.compile('FREQ: ([0-9\.]+)')

    abr_window = 8500  # usec
    try:
        with filename.open(encoding='ISO-8859-1') as f:
            header, data = f.read().split('DATA')

            # Extract data from header
            levelstring = p_level.search(header).group(1).strip(';').split(';')
            levels = np.array(levelstring).astype(np.float32)
            sampling_period = float(p_fs.search(header).group(1))
            frequency = float(p_freq.search(header).group(1))

            # Convert text representation of data to Numpy array
            fs = 1e6 / sampling_period
            cutoff = int(abr_window / sampling_period)
            data = np.array(data.split()).astype(np.float32)
            data.shape = -1, len(levels)
            data = data.T[:, :cutoff]
            t = np.arange(data.shape[-1]) / fs * 1e3
            t = pd.Index(t, name='time')

            if filter is not None:
                Wn = filter['highpass'] / (0.5 *
                                           fs), filter['lowpass'] / (0.5 * fs)
                N = filter['order']
                b, a = signal.iirfilter(N, Wn)
                data = signal.filtfilt(b, a, data, axis=-1)

            waveforms = []
            for s, level in zip(data, levels):
                # Checks for a ABR I-O bug that sometimes saves zeroed waveforms
                if not (s == 0).all():
                    w = pd.Series(s, index=t)
                    waveform = ABRWaveform(fs, w, level)
                    waveforms.append(waveform)

            series = ABRSeries(waveforms, frequency)
            series.filename = filename
            return [series]

    except (AttributeError, ValueError):
        msg = 'Could not parse %s.  Most likely not a valid ABR file.' % fname
        raise IOError(msg)
Esempio n. 4
0
File: PSI.py Progetto: bburan/abr
def load(base_directory, filter_settings=None, frequencies=None):
    filename = get_filename(base_directory)
    with filename.open() as fh:
        fh.readline()  # frequency
        fh.readline()  # level
        has_metadata = fh.readline().startswith('epoch_n')

    if frequencies is not None and np.isscalar(frequencies):
        frequencies = [frequencies]

    if has_metadata:
        data = pd.io.parsers.read_csv(filename,
                                      header=[0, 1, 2, 3],
                                      index_col=0).T
        data = data.reset_index(['epoch_n', 'epoch_reject_ratio'], drop=True)
        settings_file = filename.parent / 'ABR processing settings.json'
        fs = json.loads(settings_file.read_text())['actual_fs']
        print(fs)
    else:
        data = pd.io.parsers.read_csv(filename, header=[0, 1], index_col=0).T
        fs = np.mean(np.diff(data.columns.values)**-1)
    if filter_settings is not None:
        Wn = filter_settings['highpass'], filter_settings['lowpass']
        N = filter_settings['order']
        b, a = signal.iirfilter(N, Wn, fs=fs)
        data_filt = signal.filtfilt(b, a, data.values, axis=-1)
        data = pd.DataFrame(data_filt, columns=data.columns, index=data.index)

    data.columns *= 1e3
    waveforms = {}

    for (frequency, level), w in data.iterrows():
        frequency = float(frequency)
        level = float(level)
        if frequencies is not None:
            if frequency not in frequencies:
                continue
        frequency = float(frequency)
        level = float(level)
        waveform = ABRWaveform(fs, w, level)
        waveforms.setdefault(frequency, []).append(waveform)

    series = []
    for frequency, stack in waveforms.items():
        s = ABRSeries(stack, frequency)
        s.filename = filename
        s.id = filename.parent.name
        series.append(s)

    return series
Esempio n. 5
0
def load(fname, filter=None, frequencies=None):
    with io.open(fname, encoding='ISO-8859-1') as f:
        line = f.readline()
        if not line.startswith(':RUN-'):
            raise IOError('Unsupported file format')

    p_level = re.compile(':LEVELS:([0-9;]+)')
    p_fs = re.compile('SAMPLE \(.sec\): ([0-9]+)')
    p_freq = re.compile('FREQ: ([0-9\.]+)')

    abr_window = 8500  # usec
    try:
        with io.open(fname, encoding='ISO-8859-1') as f:
            header, data = f.read().split('DATA')

            # Extract data from header
            levelstring = p_level.search(header).group(1).strip(';').split(';')
            levels = np.array(levelstring).astype(np.float32)
            sampling_period = float(p_fs.search(header).group(1))
            frequency = float(p_freq.search(header).group(1))

            # Convert text representation of data to Numpy array
            fs = 1e6/sampling_period
            cutoff = int(abr_window / sampling_period)
            data = np.array(data.split()).astype(np.float32)
            data.shape = -1, len(levels)
            data = data.T[:, :cutoff]

            waveforms = []
            for signal, level in zip(data, levels):
                # Checks for a ABR I-O bug that sometimes saves zeroed waveforms
                if not (signal == 0).all():
                    # Add new dimension to signal since the updated ABR program
                    # now takes individual waveforms.
                    waveform = ABRWaveform(fs, signal[np.newaxis], level,
                                           filter=filter)
                    waveforms.append(waveform)

            series = ABRSeries(waveforms, frequency)
            series.filename = fname
            return [series]

    except (AttributeError, ValueError):
        msg = 'Could not parse %s.  Most likely not a valid ABR file.' % fname
        raise IOError(msg)
Esempio n. 6
0
def load(fname, filter=None, abr_window=8.5e-3, frequencies=None):
    with tables.open_file(fname) as fh:
        fs = fh.root.waveforms._v_attrs['fs']
        cutoff = int(abr_window*fs)
        signal = fh.root.waveforms[:, :, :cutoff]*1e6
        levels = fh.root.trial_log.read(field='level')
        available_frequencies = fh.root.trial_log.read(field='frequency')

        # Load all frequencies by default
        if frequencies is None:
            frequencies = np.unique(available_frequencies)

        series = []
        for frequency in frequencies:
            mask = available_frequencies == frequency
            waveforms = [ABRWaveform(fs, s, l, filter=filter, min_latency=2)
                         for s, l in zip(signal[mask], levels[mask])]
            s = ABRSeries(waveforms, frequency/1e3)
            s.filename = fname
            series.append(s)
        return series