def get_raw_trace(rec_dir, electrode, el_map=None, h5_file=None): '''Returns raw voltage trace for electrode from hdf5 store If /raw is not in hdf5, this grabs the raw trace from the dat file if it is present and electrode_mapping was provided Parameters ---------- rec_dir : str, recording directory electrode : int el_map: pd.DataFrame (optional) This is required in order to pull data from .dat file. If this is not given and data is not in hdf5 store then this will return None Returns ------- np.array of the scaled raw voltage trace or None if raw trace could not be obtained ''' if h5_file is None: h5_file = get_h5_filename(rec_dir) with tables.open_file(h5_file, 'r') as hf5: if '/raw' in hf5 and '/raw/electrode%i' % electrode in hf5: out = hf5.root.raw['electrode%i' % electrode][:] * rawIO.voltage_scaling return out else: out = None if el_map is None: el_map = get_electrode_mapping(rec_dir) if el_map is None: return out tmp = el_map.query('Electrode == @electrode') port = tmp['Port'].values[0] channel = tmp['Channel'].values[0] filetype = rawIO.get_recording_filetype(rec_dir) try: if filetype == 'one file per channel': amp_file = os.path.join(rec_dir, 'amp-%s-%03i.dat' % (port, channel)) out = rawIO.read_one_channel_file(amp_file) elif filetype == 'one file per signal type': dat = rawIO.read_amplifier_dat(rec_dir) out = dat[electrode, :] return out * rawIO.voltage_scaling except FileNotFoundError: return None
def read_in_digital_signal(hf5, file_dir, file_type, channels, dig_type='in'): '''Reads 'one file per signal type' or 'one file per signal' digital input or digital output into hf5 array Parameters ---------- hf5 : tables.file.File, hdf5 object to write data into file_dir : str, path to recording directory file_type : str, type of recording files to read in. Currently supported: 'one file per signal type' and 'one file per channel' channels : list, list of integer channel number of used digital inputs/outputs dig_type : {'in', 'out'} Type of data being read (so it puts it in the right array in hdf5 store ''' exec_str = 'hf5.root.digital_%s.dig_%s_%i.append(data[:])' if file_type == 'one file per signal type': println('Reading all digital%s data...' % dig_type) all_data = rawIO.read_digital_dat(file_dir, channels, dig_type) print('Done!') for i, ch in enumerate(channels): if file_type == 'one file per signal type': data = all_data[i] elif file_type == 'one file per channel': file_name = os.path.join( file_dir, 'board-D%s-%02d.dat' % (dig_type.upper(), ch)) println('Reading digital%s data from %s...' % (dig_type, os.path.basename(file_name))) data = rawIO.read_one_channel_file(file_name) print('Done!') tmp_str = exec_str % (dig_type, dig_type, ch) println('Writing data from ditigal %s channel %i to dig_%s_%i...' % (dig_type, ch, dig_type, ch)) exec(tmp_str) print('Done!') hf5.flush()
def get_raw_digital_signal(rec_dir, dig_type, channel, h5_file=None): if h5_file is None: h5_file = get_h5_filename(rec_dir) with tables.open_file(h5_file, 'r') as hf5: if ('/digital_%s' % dig_type in hf5 and '/digital_%s/dig_%s_%i' % (dig_type, dig_type, channel) in hf5): out = hf5.root['digital_%s' % dig_type]['dig_%s_%i' % (dig_type, channel)][:] return out file_type = rawIO.get_recording_filetype(rec_dir) if file_type == 'one file per signal type': println('Reading all digital%s data...' % dig_type) all_data = rawIO.read_digital_dat(rec_dir, channels, dig_type) return all_data[channel] elif file_type == 'one file per channel': file_name = os.path.join(rec_dir, 'board-DIN-%02d.dat' % channel) println('Reading digital_in data from %s...' % os.path.basename(file_name)) data = rawIO.read_one_channel_file(file_name) return data[:] return None
def read_in_amplifier_signal(hf5, file_dir, file_type, num_channels, el_map, em_map): '''Read intan amplifier files into hf5 array. For electrode and emg signals. Supported recording types: - one file per signal type - one file per channel Parameters ---------- hf5 : tables.file.File, hdf5 object to write data into file_dir : str, path to recording directory file_type : str type of recording files to read in. Currently supported: 'one file per signal type' and 'one file per channel' num_channels: int number of amplifier channels from info.rhd or blechby.rawIO.read_recording_info el_map, em_map : pandas.DataFrames dataframe mapping electrode or emg number to port and channel numer. Must have columns Port and Channel and either Electrode (el_map) or EMG (em_map) ''' exec_str = 'hf5.root.%s.%s%i.append(data[:])' if file_type == 'one file per signal type': println('Reading all amplifier_dat...') all_data = rawIO.read_amplifier_dat(file_dir, num_channels) print('Done!') # Read in electrode data for idx, row in el_map.iterrows(): port = row['Port'] channel = row['Channel'] electrode = row['Electrode'] if file_type == 'one file per signal type': data = all_data[channel] elif file_type == 'one file per channel': file_name = os.path.join(file_dir, 'amp-%s-%03d.dat' % (port, channel)) println('Reading data from %s...' % os.path.basename(file_name)) data = rawIO.read_one_channel_file(file_name) print('Done!') tmp_str = exec_str % ('raw', 'electrode', electrode) println('Writing data from port %s channel %i to electrode%i...' % (port, channel, electrode)) exec(tmp_str) print('Done!') hf5.flush() # Read in emg data if it exists if not em_map.empty: for idx, row in em_map.iterrows(): port = row['Port'] channel = row['Channel'] emg = row['EMG'] if file_type == 'one file per signal type': data = all_data[channel] elif file_type == 'one file per channel': file_name = os.path.join(file_dir, 'amp-%s-%03d.dat' % (port, channel)) println('Reading data from %s...' % os.path.basename(file_name)) data = rawIO.read_one_channel_file(file_name) print('Done!') tmp_str = exec_str % ('raw_emg', 'emg', emg) println('Writing data from port %s channel %i to emg%i...' % (port, channel, emg)) exec(tmp_str) print('Done!') hf5.flush()