# Graphical plot output printtime('*************') printtime('* Analyzing *') printtime('*************') outputSelection = range(M) #outputSelection = arange(6, 52, 13) #outputSelection = arange(2*13, 3*13, 1) #outputSelection = [58] # # not used anymore (here only for compatibility) computeOutput=True monitorInputPot = False nbPlot = sum([ monitorInput, monitorInputPot, monitorOutput , monitorCurrent, monitorPot, monitorRate, computeOutput ]) # additional plot w = f(patternValue) if len(outputSelection)==1 and computeOutput and os.path.exists(os.path.join('..','data','realValuedPattern.'+'%03d' % (randState)+'.mat')): nbPlot+=1 ## additional plot w = f(index) for 'academic' patterns #if len(outputSelection)==1 and computeOutput: # nbPlot+=1 useSubplot = False nCol = 1 # 1 nRow = int(ceil(1.0*nbPlot/nCol)) # end minTime = max(timeOffset*1000,(endTime-4)*1000) maxTime = endTime*1000 ## beginning #minTime = 0 ##maxTime = 200/oscilFreq*1000 #maxTime = min(endTime,3)*1000 ## all #minTime = 0*second #maxTime = endTime*1000 #figure() if useSubplot: fig = plt.figure() idxPlot = 1 if monitorInput: # raster plots if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) else: fig = plt.figure() ax = fig.add_subplot(1,1,1,title='Input spikes') if len(outputSelection)==1: # color code for spikes for i in range(inputSpike.nspikes): if 1000*inputSpike.spikes[i][1]=450 and inputSpike.spikes[i][0]<=550: col = finalWeight[inputSpike.spikes[i][0]][outputSelection] * double([1,0,0]) + (1-finalWeight[inputSpike.spikes[i][0]][outputSelection]) * double([0,0,1]) plot([1000*inputSpike.spikes[i][1]],[inputSpike.spikes[i][0]],'.',markerfacecolor=col,markeredgecolor=col,markersize=3) if 1000*inputSpike.spikes[i][1]>maxTime+1: break else: raster_plot(inputSpike) # if useReset and maxTime - minTime < 100000: # plot([1000*reset,1000*reset],[-1*ones(len(reset)),N*ones(len(reset))],'-r') # axis([minTime, maxTime, -1, N]) # axis([minTime, maxTime, 150, 250]) # axis([1000*reset[4]-20, 1000*reset[4]+100, 180, 220]) xlabel('Time (ms)') ylabel('Afferent #') # title('A') text(1.04, 0.5,'A', fontsize=20, horizontalalignment='center',verticalalignment='center',transform = ax.transAxes) idxPlot+=1 if inputSpike.nspikes>0: print 'Mean input firing rate = ' + '%.1f' % (inputSpike.nspikes/(endTime-inputSpike.spikes[0][1])/N) # pattern periods if os.path.exists(os.path.join('..','data','patternPeriod.'+'%03d' % (randState)+'.mat')): patternPeriod=loadmat(os.path.join('..','data','patternPeriod.'+'%03d' % (randState)+'.mat')) # patternPeriod=(patternPeriod['patternPeriod']+timeOffset) patternPeriod=(patternPeriod['patternPeriod']) for i in range(size(patternPeriod,0)): if 1000*patternPeriod[i,1]maxTime+10000: break print 'Input spikes done' if monitorInputPot: # membrane potential subplot(nRow,nCol,idxPlot) if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) else: fig = plt.figure() ax = fig.add_subplot(1,1,1,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) for j in range(N): plot(inputPot.times/(1*msecond),inputPot.values[j,:]/(1*mvolt)) axis([minTime, maxTime, 1000*(El-.1*(vt-El)), 1000*(vt+.1*(vt-El))]) xlabel('Time (s)') ylabel('Input - Membrane potential (in mV)') idxPlot+=1 print 'Input pot. done' if monitorCurrent: # current if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) else: fig = plt.figure() ax = fig.add_subplot(1,1,1,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) for j in outputSelection: plot(current.times/(1*msecond),current.values[j,:]/(1*mvolt)) plot([0, endTime*1000],[1000*(vt-El),1000*(vt-El)],':r',linewidth=2) ## axis([0, 300*1000, -1*1000*(vt-El), 5.0*1000*(vt-El)]) axis([minTime, maxTime, .0*1000*(vt-El), 2.0*1000*(vt-El)]) xlabel('Time (s)') ylabel('R x input current (in mV)') idxPlot+=1 print 'Current done' if monitorPot: if poissonOutput: coef=1 else: coef=1000 # membrane potential if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) # ax = fig.add_subplot(nRow,nCol,idxPlotTransp) text(1.04, 0.5,'B', fontsize=20, horizontalalignment='center',verticalalignment='center',transform = ax.transAxes) else: fig = plt.figure() ax = fig.add_subplot(1,1,1,title='Postsynaptic potential',xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) for j in outputSelection: plot(pot.times/(1*msecond),coef*pot.values[j,:],label= str(j)+' nW='+str(sum(finalWeight[:,j]>.5,0))) # plot(pot.times/(1*msecond),pot.values[j,:]/(1*mvolt)) # pattern periods if os.path.exists(os.path.join('..','data','patternPeriod.'+'%03d' % (randState)+'.mat')): patternPeriod=loadmat(os.path.join('..','data','patternPeriod.'+'%03d' % (randState)+'.mat')) # patternPeriod=(patternPeriod['patternPeriod']+timeOffset) patternPeriod=(patternPeriod['patternPeriod']) for i in range(size(patternPeriod,0)): if 1000*patternPeriod[i,1]<=minTime-10000: continue rect = Rectangle( [1000*patternPeriod[i,0],coef*(El-.1*(vt-El))], 1000*(patternPeriod[i,1]-patternPeriod[i,0]), coef*(1.2*(vt-El)), facecolor='grey', edgecolor='none') ax.add_patch(rect) if 1000*patternPeriod[i,0]>=maxTime+10000: break xlabel('Time (s)') if poissonOutput: plot([0, endTime*1000],[0,0],':r',linewidth=1.0) ylabel('Firing rate (Hz)') else: plot([0, endTime*1000],[coef*vt,coef*vt],':r',linewidth=1.5) ylabel('Membrane potential (mV)') axis([minTime, maxTime, coef*(El-.1*(vt-El)), coef*(vt+.1*(vt-El))]) leg = legend(loc='upper right') # title('B') idxPlot+=1 if monitorOutput: # raster plots if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow # ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)],yticks=outputSelection,yticklabels=[]) ax = fig.add_subplot(nRow,nCol,idxPlotTransp) text(1.04, 0.5,'C', fontsize=20, horizontalalignment='center',verticalalignment='center',transform = ax.transAxes) else: fig = plt.figure() # ax = fig.add_subplot(1,1,1,title='Output spikes',xticks=[minTime,maxTime],xticklabels=[str(minTime/1000),str(maxTime/1000)]) ax = fig.add_subplot(1,1,1,title='Output spikes') if len(outputSelection)maxTime+10: break else: raster_plot(outputSpike) # just for easier visualization for i in arange(0,M,2*nG): rect = Rectangle( [minTime, i-.5], maxTime-minTime, nG, facecolor=[.8,.8,.8], edgecolor='none') ax.add_patch(rect) # pattern periods if os.path.exists(os.path.join('..','data','patternPeriod.'+'%03d' % (randState)+'.mat')): patternPeriod=loadmat(os.path.join('..','data','patternPeriod.'+'%03d' % (randState)+'.mat')) # patternPeriod=(patternPeriod['patternPeriod']+timeOffset) patternPeriod=(patternPeriod['patternPeriod']) for i in range(size(patternPeriod,0)): if 1000*patternPeriod[i,1]<=minTime-10000: continue rect = Rectangle( [1000*patternPeriod[i,0], -1], 1000*(patternPeriod[i,1]-patternPeriod[i,0]), M+1, facecolor='grey', edgecolor='none') ax.add_patch(rect) if 1000*patternPeriod[i,0]>=maxTime+10000: break axis([minTime, maxTime, min(outputSelection)-5, max(outputSelection)+5]) # axis([minTime, maxTime, 19.5, 21.5]) xlabel('Time (s)') # ylabel('Neuron #') # ylabel('Increasing $w^{in}$') ylabel('Postsynaptic spikes') idxPlot+=1 print str(outputSpike.nspikes) + ' post synaptic spikes' if outputSpike.nspikes>0: print 'Mean output firing rate = ' + '%.1f' % (outputSpike.nspikes/(endTime-outputSpike.spikes[0][1])/M) # print 'First output spikes: ' + str( outputSpike.spikes[0:min(5,outputSpike.nspikes)] ) nu_avg = 20*Hz nu_out = - w_in * nu_avg / (w_out+(a_pre*tau_pre+a_post*tau_post)*nu_avg) print 'Theoretical mean output firing rate = ' + '%.1f' % mean(nu_out) print 'Output spikes done' if monitorRate: # firing rates if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp) else: fig = plt.figure() ax = fig.add_subplot(1,1,1) for i in outputSelection: f_pre = 10 dwdt = f_pre*rate[i]._rate[0] * (a_pre*tau_pre/(1+tau_pre*(f_pre+rate[i]._rate[0]))+a_post[i]*tau_post/(1+tau_post*(f_pre+rate[i]._rate[0])) ) # plot(rate[0].times/ms,rate[i].smooth_rate(6000*ms),label= str(i)+' (gmax=' + '%2.1e' % gmax[i] + ', r=' + '%.2f' % (a_post[i]/a_pre) + ', dW/dt='+'%2.1e' % dwdt) plot(rate[0].times/ms,rate[i]._rate,label= str(i)+' (gmax=' + '%2.1e' % gmax[i] + ', r=' + '%.2f' % (a_post[i]/a_pre) + ', dW/dt='+'%2.1e' % dwdt) # axis([minTime, 400*1000, 0, 90]) xlabel('Time (in ms)') ylabel('Rates in Hz') leg = legend(loc='upper center') # matplotlib.text.Text instances for t in leg.get_texts(): t.set_fontsize(8) # the legend text fontsize # matplotlib.lines.Line2D instances for l in leg.get_lines(): l.set_linewidth(1.5) # the legend line width idxPlot+=1 print 'Rates done' if computeOutput: # synaptic weights if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[0,1]) text(1.04, 0.5,'D', fontsize=20, horizontalalignment='center',verticalalignment='center',transform = ax.transAxes) else: fig = plt.figure() ax = fig.add_subplot(1,1,1) # always show final synatpic weights # bar(histc(finalWeight,arange(0, 1.1, .1))) for i in outputSelection: # hist(finalWeight[:,i],bins=20,label= str(i)+' (gmax=' + '%2.1e' % gmax[i] + ', r=' + '%.2f' % (a_post[i]/a_pre) ) hist(finalWeight[:,i],label= str(i)+' (gmax=' + '%2.1e' % gmax[i] + ', r=' + '%.2f' % (a_post[i]/a_pre) ) axis([0, 1, 0, N]) # bar(hist(finalWeight[:,i],bins=arange(0, 1.05, .05)),color=None,label= str(i)+' (gmax=' + '%2.1e' % gmax[i] + ', r=' + '%.1f' % (a_post[i]/a_pre) ) # leg = legend() # # matplotlib.text.Text instances # for t in leg.get_texts(): # t.set_fontsize(8) # the legend text fontsize # # matplotlib.lines.Line2D instances # for l in leg.get_lines(): # l.set_linewidth(1.5) # the legend line width # hist(x, bins=10, range=[0.,1.]) xlabel('Normalized weight') ylabel('#') idxPlot+=1 print "# of selected synapses=",str(sum(finalWeight>.5,0)) print "weight sum=",str(sum(finalWeight,0)) print 'Weight hist. done' if len(outputSelection)==1 and os.path.exists(os.path.join('..','data','realValuedPattern.'+'%03d' % (randState)+'.mat')): if useSubplot: idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow ax = fig.add_subplot(nRow,nCol,idxPlotTransp,xticks=[0,1]) text(1.04, 0.5,'D', fontsize=20, horizontalalignment='center',verticalalignment='center',transform = ax.transAxes) else: fig = plt.figure() ax = fig.add_subplot(1,1,1) realValuedPattern=loadmat(os.path.join('..','data','realValuedPattern.'+'%03d' % (randState)+'.mat'),squeeze_me=True) realValuedPattern=realValuedPattern['realValuedPattern'] plot(realValuedPattern,finalWeight[range(len(realValuedPattern)),outputSelection],'.') xlabel('Pattern value') ylabel('Normalized weight') axis([0, 1, -.1, 1.1]) idxPlot+=1 # if len(outputSelection)==1: # w=f(index) for academic patterns # if useSubplot: # idxPlotTransp = mod(idxPlot-1,nRow)*nCol + 1 + (idxPlot-1)/nRow # ax = fig.add_subplot(nRow,nCol,idxPlotTransp,title='E',xticks=[0,1]) # else: # fig = plt.figure() # ax = fig.add_subplot(1,1,1) # plot(range(N),finalWeight[range(size(realValuedPattern,1)),outputSelection],'.') # xlabel('Afferent #') # ylabel('Normalized weight') # axis([0, N-1, -.1, 1.1]) # idxPlot+=1 #for i in range(M): #for i in []: for i in []: figure() hist(finalWeight[:,i],bins=20) title( str(i)+' (gmax=' + '%2.1e' % gmax[i] + ', r=' + '%.2f' % (a_post[i]/a_pre) ) print 'Individual hist.' + str(i) + ' done' #show() # for i in range(N-1): # print pot.mean[i] # print pot[i][len(pot[i])-1] # print pot[i][0] # print len(pot[i]) # print pot.times[len(pot.times)-1] # write output in a file # f = open("spikeList.txt", 'w') # f.write("neuron spikeTime\n") # for i in range(spike.nspikes-1): # f.write(str(spike.spikes[i][0])+" "+str(spike.spikes[i][1])+"\n") # f.close()