def get_unit_waveforms(file_dir, unit, required_descrip=None): if isinstance(unit, int): un = 'unit%03i' % unit else: un = unit unit = parse_unit_number(un) h5_file = get_h5_filename(file_dir) clustering_params = params.load_params('clustering_params', file_dir) fs = clustering_params['sampling_rate'] with tables.open_file(h5_file, 'r') as hf5: waveforms = hf5.root.sorted_units[un].waveforms[:] descriptor = hf5.root.unit_descriptor[unit] if required_descrip is not None: if descriptor != required_descrip: return None, descriptor, fs return waveforms, descriptor, fs * 10
def get_raw_unit_waveforms(rec_dir, unit_name, electrode_mapping=None, clustering_params=None, shell=True, required_descrip=None): '''Returns the waveforms of a single unit extracting them directly from the raw data files. Parameters ---------- rec_dir : str unit_name : str or int electrode_mapping : pd.DataFrame (optional) if raw data is not in hf5 this is used to get the raw data from the original dat files if not provided program will try to grab this from the h5 file clustering_params : dict (optional) requires fields 'spike_snapshot' and 'bandpass_params' if not provided these will be queried from the json file written in the rec_dir or from the defaults if no params are in rec_dir shell : bool (optional) True to CLI (default in ssh). False for GUI. Only relevant if multiple h5 files in rec_dir required_descrip : tuple (optional) required unit description. Returns None instead of raw trace if unit does not match required_descrip Returns ------- raw_trace, unit_descriptor, sampling_rate np.array, tuple, float ''' if isinstance(unit_name, int): unit_num = unit_name unit_name = 'unit%03i' % unit_num else: unit_num = parse_unit_number(unit_name) if electrode_mapping is None: electrode_mapping = get_electrode_mapping(rec_dir) if clustering_params is None: clustering_params = params.load_params('clustering_params', rec_dir) snapshot = clustering_params['spike_snapshot'] snapshot = [ snapshot['Time before spike (ms)'], snapshot['Time after spike (ms)'] ] bandpass = clustering_params['bandpass_params'] bandpass = [bandpass['Lower freq cutoff'], bandpass['Upper freq cutoff']] fs = clustering_params['sampling_rate'] if fs is None: raise ValueError('clustering_params.json does not exist') # Get spike times for unit h5_file = get_h5_filename(rec_dir, shell=shell) with tables.open_file(h5_file, 'r') as hf5: spike_times = hf5.root.sorted_units[unit_name]['times'][:] descriptor = hf5.root.unit_descriptor[unit_num] if required_descrip is not None: if descriptor != required_descrip: return None, descriptor, fs print('Getting raw waveforms for %s %s' % (os.path.basename(rec_dir), unit_name)) electrode = descriptor['electrode_number'] raw_el = get_raw_trace(rec_dir, electrode, electrode_mapping) if electrode_mapping is None and raw_el is None: raise FileNotFoundError('Raw data not found in h5 file and' ' electrode_mapping not found') if raw_el is None: raise FileNotFoundError('Raw data not found') slices_dj, new_fs = clust.get_waveforms(raw_el, spike_times, sampling_rate=fs, snapshot=snapshot, bandpass=bandpass) return slices_dj, descriptor, new_fs