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
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
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)
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
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)
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