def readOneChannelEventOrSpike(self, fid, channel_num, header, lazy=True): # return SPikeTrain or EventArray channelHeader = header.channelHeaders[channel_num] if channelHeader.firstblock < 0: return if channelHeader.kind not in [2, 3, 4, 5, 6, 7, 8]: return ## Step 1 : type of blocks if channelHeader.kind in [2, 3, 4]: # Event data fmt = [('tick', 'i4')] elif channelHeader.kind in [5]: # Marker data fmt = [('tick', 'i4'), ('marker', 'i4')] elif channelHeader.kind in [6]: # AdcMark data fmt = [('tick', 'i4'), ('marker', 'i4'), ('adc', 'S%d' % channelHeader.n_extra)] elif channelHeader.kind in [7]: # RealMark data fmt = [('tick', 'i4'), ('marker', 'i4'), ('real', 'S%d' % channelHeader.n_extra)] elif channelHeader.kind in [8]: # TextMark data fmt = [('tick', 'i4'), ('marker', 'i4'), ('label', 'S%d' % channelHeader.n_extra)] dt = np.dtype(fmt) ## Step 2 : first read for allocating mem fid.seek(channelHeader.firstblock) totalitems = 0 for _ in range(channelHeader.blocks): blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) totalitems += blockHeader.items if blockHeader.succ_block > 0: fid.seek(blockHeader.succ_block) #~ print 'totalitems' , totalitems if lazy: if channelHeader.kind in [2, 3, 4, 5, 8]: ea = EventArray() ea.annotate(channel_index=channel_num) ea.lazy_shape = totalitems return [ea] elif channelHeader.kind in [6, 7]: sptr = SpikeTrain( [] * pq.s, t_stop=1e99) # correct value for t_stop to be put in later sptr.annotate(channel_index=channel_num, ced_unit=0) sptr.lazy_shape = totalitems return [sptr] else: alltrigs = np.zeros(totalitems, dtype=dt) ## Step 3 : read fid.seek(channelHeader.firstblock) pos = 0 for _ in range(channelHeader.blocks): blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) # read all events in block trigs = np.fromstring(fid.read(blockHeader.items * dt.itemsize), dtype=dt) alltrigs[pos:pos + trigs.size] = trigs pos += trigs.size if blockHeader.succ_block > 0: fid.seek(blockHeader.succ_block) ## Step 3 convert in neo standard class : eventarrays or spiketrains alltimes = alltrigs['tick'].astype( 'f') * header.us_per_time * header.dtime_base * pq.s if channelHeader.kind in [2, 3, 4, 5, 8]: #events ea = EventArray() ea.annotate(channel_index=channel_num) ea.times = alltimes if channelHeader.kind >= 5: # Spike2 marker is closer to label sens of neo ea.labels = alltrigs['marker'].astype('S32') if channelHeader.kind == 8: ea.annotate(extra_labels=alltrigs['label']) return [ea] elif channelHeader.kind in [6, 7]: # spiketrains # waveforms if channelHeader.kind == 6: waveforms = np.fromstring(alltrigs['adc'].tostring(), dtype='i2') waveforms = waveforms.astype( 'f4' ) * channelHeader.scale / 6553.6 + channelHeader.offset elif channelHeader.kind == 7: waveforms = np.fromstring(alltrigs['real'].tostring(), dtype='f4') if header.system_id >= 6 and channelHeader.interleave > 1: waveforms = waveforms.reshape( (alltimes.size, -1, channelHeader.interleave)) waveforms = waveforms.swapaxes(1, 2) else: waveforms = waveforms.reshape((alltimes.size, 1, -1)) if header.system_id in [1, 2, 3, 4, 5]: sample_interval = (channelHeader.divide * header.us_per_time * header.time_per_adc) * 1e-6 else: sample_interval = (channelHeader.l_chan_dvd * header.us_per_time * header.dtime_base) if channelHeader.unit in unit_convert: unit = pq.Quantity(1, unit_convert[channelHeader.unit]) else: #print channelHeader.unit try: unit = pq.Quantity(1, channelHeader.unit) except: unit = pq.Quantity(1, '') if len(alltimes) > 0: t_stop = alltimes.max( ) # can get better value from associated AnalogSignal(s) ? else: t_stop = 0.0 if not self.ced_units: sptr = SpikeTrain(alltimes, waveforms=waveforms * unit, sampling_rate=(1. / sample_interval) * pq.Hz, t_stop=t_stop) sptr.annotate(channel_index=channel_num, ced_unit=0) return [sptr] sptrs = [] for i in set(alltrigs['marker'] & 255): sptr = SpikeTrain( alltimes[alltrigs['marker'] == i], waveforms=waveforms[alltrigs['marker'] == i] * unit, sampling_rate=(1. / sample_interval) * pq.Hz, t_stop=t_stop) sptr.annotate(channel_index=channel_num, ced_unit=i) sptrs.append(sptr) return sptrs
def readOneChannelEventOrSpike(self , fid, channel_num, header ,lazy = True): # return SPikeTrain or EventArray channelHeader = header.channelHeaders[channel_num] if channelHeader.firstblock <0: return if channelHeader.kind not in [2, 3, 4 , 5 , 6 ,7, 8]: return ## Step 1 : type of blocks if channelHeader.kind in [2, 3, 4]: # Event data fmt = [('tick' , 'i4') ] elif channelHeader.kind in [5]: # Marker data fmt = [('tick' , 'i4') , ('marker' , 'i4') ] elif channelHeader.kind in [6]: # AdcMark data fmt = [('tick' , 'i4') , ('marker' , 'i4') , ('adc' , 'S%d' %channelHeader.n_extra )] elif channelHeader.kind in [7]: # RealMark data fmt = [('tick' , 'i4') , ('marker' , 'i4') , ('real' , 'S%d' %channelHeader.n_extra )] elif channelHeader.kind in [8]: # TextMark data fmt = [('tick' , 'i4') , ('marker' , 'i4') , ('label' , 'S%d'%channelHeader.n_extra)] dt = np.dtype(fmt) ## Step 2 : first read for allocating mem fid.seek(channelHeader.firstblock) totalitems = 0 for _ in range(channelHeader.blocks) : blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) totalitems += blockHeader.items if blockHeader.succ_block > 0 : fid.seek(blockHeader.succ_block) #~ print 'totalitems' , totalitems if lazy : if channelHeader.kind in [2, 3, 4 , 5 , 8]: ea = EventArray( ) ea.annotate(channel_index = channel_num) ea.lazy_shape = totalitems return ea elif channelHeader.kind in [6 ,7]: sptr = SpikeTrain([ ]*pq.s, t_stop=1e99) # correct value for t_stop to be put in later sptr.annotate(channel_index = channel_num) sptr.lazy_shape = totalitems return sptr else: alltrigs = np.zeros( totalitems , dtype = dt) ## Step 3 : read fid.seek(channelHeader.firstblock) pos = 0 for _ in range(channelHeader.blocks) : blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) # read all events in block trigs = np.fromstring( fid.read( blockHeader.items*dt.itemsize) , dtype = dt) alltrigs[pos:pos+trigs.size] = trigs pos += trigs.size if blockHeader.succ_block > 0 : fid.seek(blockHeader.succ_block) ## Step 3 convert in neo standard class : eventarrays or spiketrains alltimes = alltrigs['tick'].astype('f')*header.us_per_time * header.dtime_base*pq.s if channelHeader.kind in [2, 3, 4 , 5 , 8]: #events ea = EventArray( ) ea.annotate(channel_index = channel_num) ea.times = alltimes if channelHeader.kind >= 5: # Spike2 marker is closer to label sens of neo ea.labels = alltrigs['marker'].astype('S32') if channelHeader.kind == 8: ea.annotate(extra_labels = alltrigs['label']) return ea elif channelHeader.kind in [6 ,7]: # spiketrains # waveforms if channelHeader.kind == 6 : waveforms = np.fromstring(alltrigs['adc'].tostring() , dtype = 'i2') waveforms = waveforms.astype('f4') *channelHeader.scale/ 6553.6 + channelHeader.offset elif channelHeader.kind == 7 : waveforms = np.fromstring(alltrigs['real'].tostring() , dtype = 'f4') if header.system_id>=6 and channelHeader.interleave>1: waveforms = waveforms.reshape((alltimes.size,-1,channelHeader.interleave)) waveforms = waveforms.swapaxes(1,2) else: waveforms = waveforms.reshape(( alltimes.size,1, -1)) if header.system_id in [1,2,3,4,5]: sample_interval = (channelHeader.divide*header.us_per_time*header.time_per_adc)*1e-6 else : sample_interval = (channelHeader.l_chan_dvd*header.us_per_time*header.dtime_base) if channelHeader.unit in unit_convert: unit = pq.Quantity(1, unit_convert[channelHeader.unit] ) else: #print channelHeader.unit try: unit = pq.Quantity(1, channelHeader.unit ) except: unit = pq.Quantity(1, '') if len(alltimes) > 0: t_stop = alltimes.max() # can get better value from associated AnalogSignal(s) ? else: t_stop = 0.0 sptr = SpikeTrain(alltimes, waveforms = waveforms*unit, sampling_rate = (1./sample_interval)*pq.Hz, t_stop = t_stop ) sptr.annotate(channel_index = channel_num) return sptr