# Data plots from spikesreader import SpikesReader import bulbdef from multiprocessing import Process import pylab color = [ 'b', 'g', 'r', 'c', 'm', 'y' ] def gid_is_soma(gid): return bulbdef.gid_is_mitral(gid) or \ bulbdef.gid_is_mtufted(gid) or \ bulbdef.gid_is_granule(gid) or \ bulbdef.gid_is_blanes(gid) def legend(bulbdict, gid): def soma_prefix(gid): if bulbdef.gid_is_mitral(gid): return ' MC' elif bulbdef.gid_is_mtufted(gid): return 'mTC' elif bulbdef.gid_is_granule(gid): return ' GC' elif bulbdef.gid_is_blanes(gid): return 'dSAC' return None stype = soma_prefix(gid) if stype: return stype+'-'+str(gid) elif gid % 2 == 0: ci = bulbdict.gid_dict[gid] return 'e%d: %d->%s %d[%d](%.3g)'%(gid, ci[3], soma_prefix(ci[0]), ci[0], ci[1], ci[2]) else: ci = bulbdict.gid_dict[gid+1] return 'i%d: %s %d[%d](%.3g)->%d'%(gid, soma_prefix(ci[0]), ci[0], ci[1], ci[2], ci[3]) class SpikesGraph: def __init__(self, bulbdict, filename, initweights=None): self.sr = SpikesReader(filename, initweights) self.bulbdict = bulbdict self.__plotproc = [] self.__Nplot = 0 self.__win = False with open('winflag.txt') as fi: self.__win = int(fi.readline()) == 1 def __plot(self, gids, title, xlabel, ylabel, datafunc, plotgen, ylim=[]): pylab.figure() pylab.title(title) pylab.xlabel(xlabel) pylab.ylabel(ylabel) for i, gid in enumerate(gids): r = datafunc(gid) if len(r) == 2: # t, data x, y = r else: x = r y = [i]*len(r) # draw the raster or the line plotgen(x, y, legend(self.bulbdict, gid), color[i]) pylab.legend().draggable() pylab.xlim([-1, self.sr.tstop]) if len(ylim): pylab.ylim(ylim) pylab.draw() def __firingplot(self, gids): def line(x, y, descr, col): pylab.plot(x, y, '-'+col+'o', label=descr) self.__plot(gids, 'Firing Rate', 't (ms)', 'FR (Hz)', self.sr.frequency, line) def __weightplot(self, gids): def line(x, y, descr, col): pylab.plot(x, y, '-'+col+'o', label=descr) self.__plot(gids, 'Synaptic weights', 't (ms)', 'Syn. Weight', self.sr.weight, line, [0,1]) def __rasterplot(self, gids): def raster(x, y, descr, col): pylab.scatter(x, y, s=10, marker='|', label=descr, c=col) self.__plot(gids, 'Spikes raster', 't (ms)', '', self.sr.retrieve, raster) def __show(self, gid_soma, gid_syn): # draw the somas for i in range(0, len(gid_soma), len(color)): self.__rasterplot(gid_soma[i:(i + len(color))]) self.__firingplot(gid_soma[i:(i + len(color))]) self.__Nplot += 2 # draw the reciprocal sin. for i in range(0, len(gid_syn), len(color)): self.__rasterplot(gid_syn[i:(i + len(color))]) self.__firingplot(gid_syn[i:(i + len(color))]) self.__weightplot(gid_syn[i:(i + len(color))]) self.__Nplot += 3 # show all graph pylab.show() def show(self, gids): if len(gids): gid_soma = set() gid_syn = set() for gid in gids: if gid_is_soma(gid): gid_soma.add(gid) else: gid_syn.add(gid) if gid % 2 != 0: gid_syn.add(gid+1) else: gid_syn.add(gid-1) # check for existing in spikes data gid_syn = list(gid_syn.intersection(self.sr.header.keys())) gid_soma = list(gid_soma.intersection(self.sr.header.keys())) # new process if self.__win: self.__show(gid_soma, gid_syn) else: self.__plotproc.append(Process(target=self.__show, args=(gid_soma, gid_syn))) self.__plotproc[-1].start() def clear(self): for i in range(self.__Nplot): pylab.close() for p in self.__plotproc: p.terminate() self.__plotproc = [] if __name__ == '__main__': from bulbdict import BulbDict bd = BulbDict('fakeodor.dic') print 'dict loaded' sg = SpikesGraph(bd, 'fakeodor.spk2') print 'spikes graph loaded' sg.show([0]) sg.show([0])