def _read_tsq(self, event_name): """Read the metadata (TSQ) file of a TDT Tank. Returns ------- b : pandas.DataFrame Recording metadata """ # create the path name tsq_name = self.path + os.extsep + self.header_ext # read in the raw data as a numpy rec array and convert to DataFrame b = DataFrame(np.fromfile(tsq_name, dtype=self.tsq_dtype)) # zero based indexing b.channel -= 1 b.channel = b.channel.astype(f8) # -1s are invalid b.channel[b.channel == -1] = np.nan b.type = EventTypes[b.type].reset_index(drop=True) b.format = DataTypes[b.format].reset_index(drop=True) b.timestamp[np.logical_not(b.timestamp)] = np.nan b.fs[np.logical_not(b.fs)] = np.nan # fragile subtraction (i.e., what if TDT changes this value?) b.size -= 10 # create some new indices based on the electrode array srt = Indexer.sort('channel').reset_index(drop=True) shank = srt.shank[b.channel].reset_index(drop=True) tsq = b.join(shank) # convert the event_name to a number name = name2num(event_name) # get the row of the metadata where its value equals the name-number row = tsq.name == name # make sure there's at least one event assert row.any(), 'no event named %s in tank: %s' % (event_name, self.path) # get all the metadata for those events tsq = tsq[row] # convert to integer where possible tsq.channel = tsq.channel.astype(int) tsq.shank = tsq.shank.astype(int) return tsq, row
def test_name2num(): num_to_test = 10 str_len = 4 letters = string.ascii_letters x = Series(dict(zip(letters, map(ord, letters)))) base = 256 ** np.arange(str_len) mn = base.dot(np.repeat(x.min(), str_len)) mx = base.dot(np.repeat(x.max(), str_len)) for _ in xrange(num_to_test): name = random.sample(letters, str_len) num = name2num(name) assert mn <= num <= mx