def PlotSCD( files='*.pk' ): import pylab if isinstance( files, basestring ): if os.path.isdir( files ): files = os.path.join( files, '*.pk' ) files = glob.glob( files ) d = DataFiles.load( files ) r = SigTools.correlate( d['x'], d['y'], axis=0 ) SigTools.imagesc( r*numpy.abs(r), y=d['channels'], x=SigTools.samples2msec( range( r.shape[1] ), d['fs'] ), aspect='auto', balance=0.0, colorbar=True ) pylab.title( ', '.join( [ '%d: %d' % ( yi, ( d['y'] == yi ).sum() ) for yi in numpy.unique( d['y'] ) ] ) ) pylab.draw()
def PlotTrials( files='*.pk', channel='Cz' ): import pylab if isinstance( files, basestring ): if os.path.isdir( files ): files = os.path.join( files, '*.pk' ) files = glob.glob( files ) d = DataFiles.load( files ) chind = d[ 'channels' ].index( channel ) v = [ ( d[ 'y' ][ i ], i, vi ) for i, vi in enumerate( d[ 'x' ][ :, chind, : ] ) ] v = numpy.array( [ vi for yi, i, vi in sorted( v ) ] ) SigTools.imagesc( v, x=SigTools.samples2msec( range( v.shape[1] ), d['fs'] ), aspect='auto', balance=0.0, colorbar=True ) pylab.title( ', '.join( [ '%d: %d' % ( yi, ( d['y'] == yi ).sum() ) for yi in numpy.unique( d['y'] ) ] ) + ( ' (channel %s)' % channel ) ) pylab.draw()
def PlotSCD(files='*.pk'): import pylab if isinstance(files, basestring): if os.path.isdir(files): files = os.path.join(files, '*.pk') files = glob.glob(files) d = DataFiles.load(files) r = SigTools.correlate(d['x'], d['y'], axis=0) SigTools.imagesc(r * numpy.abs(r), y=d['channels'], x=SigTools.samples2msec(range(r.shape[1]), d['fs']), aspect='auto', balance=0.0, colorbar=True) pylab.title(', '.join([ '%d: %d' % (yi, (d['y'] == yi).sum()) for yi in numpy.unique(d['y']) ])) pylab.draw()
def PlotTrials(files='*.pk', channel='Cz'): import pylab if isinstance(files, basestring): if os.path.isdir(files): files = os.path.join(files, '*.pk') files = glob.glob(files) d = DataFiles.load(files) chind = d['channels'].index(channel) v = [(d['y'][i], i, vi) for i, vi in enumerate(d['x'][:, chind, :])] v = numpy.array([vi for yi, i, vi in sorted(v)]) SigTools.imagesc(v, x=SigTools.samples2msec(range(v.shape[1]), d['fs']), aspect='auto', balance=0.0, colorbar=True) pylab.title(', '.join( ['%d: %d' % (yi, (d['y'] == yi).sum()) for yi in numpy.unique(d['y'])]) + (' (channel %s)' % channel)) pylab.draw()
def StimulusTiming(filename='.', ind=None, channels=0, trigger='StimulusCode > 0', msec=200, rectify=False, threshold=0.5, use_eo=True, save=None, **kwargs): """ In <filename> and <ind>, give it - a directory and ind=None: for all .dat files in the directory, in session/run order - a directory and ind=an index or list of indices: for selected .dat files in the directory - a dat-file name and ind=anything: for that particular file - a list of filenames and ind=anything: for certain explicitly-specified files <channels> may be a 0-based index, list of indices, list of channel names, or space- or comma- delimited string of channel names <rectify> subtracts the median and takes the abs before doing anything else <threshold> is on the normalized scale of min=0, max=1 within the resulting image <use_eo> uses the EventOffset state to correct timings """### if hasattr(filename, 'filename'): filename = filename.filename if ind == None: ind = -1 if os.path.isdir(filename): filename = ListDatFiles(filename) if not isinstance(filename, (tuple, list)): filename = [filename] if not isinstance(ind, (tuple, list)): ind = [ind] n = max(len(filename), len(ind)) if len(filename) == 1: filename = list(filename) * n if len(ind) == 1: ind = list(ind) * n if isinstance(channels, basestring): channels = channels.replace(',', ' ').split() if not isinstance(channels, (tuple, list)): channels = [channels] out = [ SigTools.sstruct( files=[], events=[], t=None, channel=ch, img=[], edges=[], threshold=None, EventOffsets=[], UseEventOffsets=False, ) for ch in channels ] if len(filename) == 0: raise ValueError("no data files specified") for f, i in zip(filename, ind): b = bcistream(filename=f, ind=i) nsamp = b.msec2samples(msec) sig, st = b.decode('all') statenames = zip(*sorted([(-len(x), x) for x in st]))[1] criterion = trigger for x in statenames: criterion = criterion.replace(x, "st['%s']" % x) criterion = numpy.asarray(eval(criterion)).flatten() startind = RisingEdge(criterion).nonzero()[0] + 1 print "%d events found in %s" % (len(startind), b.filename) for s in out: s.files.append(b.filename) s.events.append(len(startind)) ch = s.channel if isinstance(ch, basestring): chn = [x.lower() for x in b.params['ChannelNames']] if ch.lower() in chn: ch = chn.index(ch.lower()) else: raise ValueError("could not find channel %s in %s" % (ch, b.filename)) if len(b.params['ChannelNames']) == len(sig): s.channel = b.params['ChannelNames'][ch] xx = numpy.asarray(sig)[ch] if rectify: xx = numpy.abs(xx - numpy.median(xx)) xx -= xx.min() if xx.max(): xx /= xx.max() s.threshold = threshold for ind in startind: if 'EventOffset' in st: eo = st['EventOffset'].flat[ind] if use_eo: ind += eo - 2**(b.statedefs['EventOffset']['length'] - 1) s.UseEventOffsets = True else: eo = 0 s.EventOffsets.append(eo) x = xx[ind:ind + nsamp].tolist() x += [0.0] * (nsamp - len(x)) s.img.append(x) for s in out: s.img = numpy.asarray(s.img) s.edges = [ min(list(x.nonzero()[0]) + [numpy.nan]) for x in (s.img > s.threshold) ] s.edges = b.samples2msec(numpy.asarray(s.edges)) s.t = b.samples2msec(numpy.arange(nsamp)) import pylab pylab.clf() for i, s in enumerate(out): pylab.subplot(1, len(out), i + 1) y = y = range(1, len(s.img) + 1) SigTools.imagesc(s.img, x=s.t, y=y, aspect='auto', **kwargs) xl, yl = pylab.xlim(), pylab.ylim() pylab.plot(s.edges, y, 'w*', markersize=10) pylab.xlim(xl) pylab.ylim(yl) pylab.grid('on') #pylab.ylim([len(s.img)+0.5,0.5]) # this corrupts the image!! pylab.draw() if save: pylab.gcf().savefig(save, orientation='portrait') return out
def StimulusTiming(filename='.', ind=None, channels=0, trigger='StimulusCode > 0', msec=200, rectify=False, threshold=0.5, use_eo=True, save=None, **kwargs): """ In <filename> and <ind>, give it - a directory and ind=None: for all .dat files in the directory, in session/run order - a directory and ind=an index or list of indices: for selected .dat files in the directory - a dat-file name and ind=anything: for that particular file - a list of filenames and ind=anything: for certain explicitly-specified files <channels> may be a 0-based index, list of indices, list of channel names, or space- or comma- delimited string of channel names <rectify> subtracts the median and takes the abs before doing anything else <threshold> is on the normalized scale of min=0, max=1 within the resulting image <use_eo> uses the EventOffset state to correct timings """### if hasattr(filename, 'filename'): filename = filename.filename if ind==None: ind = -1 if os.path.isdir(filename): filename = ListDatFiles(filename) if not isinstance(filename, (tuple,list)): filename = [filename] if not isinstance(ind, (tuple,list)): ind = [ind] n = max(len(filename), len(ind)) if len(filename) == 1: filename = list(filename) * n if len(ind) == 1: ind = list(ind) * n if isinstance(channels, basestring): channels = channels.replace(',', ' ').split() if not isinstance(channels, (tuple,list)): channels = [channels] out = [SigTools.sstruct( files=[], events=[], t=None, channel=ch, img=[], edges=[], threshold=None, EventOffsets=[], UseEventOffsets=False, ) for ch in channels] if len(filename) == 0: raise ValueError("no data files specified") for f,i in zip(filename, ind): b = bcistream(filename=f, ind=i) nsamp = b.msec2samples(msec) sig,st = b.decode('all') statenames = zip(*sorted([(-len(x),x) for x in st]))[1] criterion = trigger for x in statenames: criterion = criterion.replace(x, "st['%s']"%x) criterion = numpy.asarray(eval(criterion)).flatten() startind = RisingEdge(criterion).nonzero()[0] + 1 print "%d events found in %s" % (len(startind), b.filename) for s in out: s.files.append(b.filename) s.events.append(len(startind)) ch = s.channel if isinstance(ch, basestring): chn = [x.lower() for x in b.params['ChannelNames']] if ch.lower() in chn: ch = chn.index(ch.lower()) else: raise ValueError("could not find channel %s in %s" % (ch,b.filename)) if len(b.params['ChannelNames']) == len(sig): s.channel = b.params['ChannelNames'][ch] xx = numpy.asarray(sig)[ch] if rectify: xx = numpy.abs(xx - numpy.median(xx)) xx -= xx.min() if xx.max(): xx /= xx.max() s.threshold = threshold for ind in startind: if 'EventOffset' in st: eo = st['EventOffset'].flat[ind] if use_eo: ind += eo - 2**(b.statedefs['EventOffset']['length']-1) s.UseEventOffsets = True else: eo = 0 s.EventOffsets.append(eo) x = xx[ind:ind+nsamp].tolist() x += [0.0] * (nsamp - len(x)) s.img.append(x) for s in out: s.img = numpy.asarray(s.img) s.edges = [min(list(x.nonzero()[0])+[numpy.nan]) for x in (s.img > s.threshold)] s.edges = b.samples2msec(numpy.asarray(s.edges)) s.t = b.samples2msec(numpy.arange(nsamp)) import pylab pylab.clf() for i,s in enumerate(out): pylab.subplot(1, len(out), i+1) y = y=range(1,len(s.img)+1) SigTools.imagesc(s.img, x=s.t, y=y, aspect='auto', **kwargs) xl,yl = pylab.xlim(),pylab.ylim() pylab.plot(s.edges, y, 'w*', markersize=10) pylab.xlim(xl); pylab.ylim(yl) pylab.grid('on') #pylab.ylim([len(s.img)+0.5,0.5]) # this corrupts the image!! pylab.draw() if save: pylab.gcf().savefig(save, orientation='portrait') return out