# -*- coding: utf-8 -*-
# ALL SI UNITS
# milliMolar is same as mol/m^3
## USAGE: python2.6 average_odor_pulses.py [SAVEFIG]
import os,sys,math,string
import os.path
import pickle
import subprocess
cwd = os.getcwd() # current working directory
sys.path.extend(["..","../networks","../generators","../simulations"])
from stimuliConstants import * # has RESPIRATION
from sim_utils import * # has rebin() and imports data_utils.py for axes_off()
from calc_corrs import * # has calc_corrs()
## BE CAREFUL: use _constair_separateodors below, others are obsolete.
from fit_odor_pulses_constair_separateodors import * # has fit_pulses() and kerneltlist
import average_odor_morphs as corr_utils # has get_filename() for morphs
from pylab import * # part of matplotlib that depends on numpy but not scipy
from scipy import stats
from scipy import signal # for gaussian smoothing
IN_VIVO = True
directed = True
FRAC_DIRECTED = 0.01 ## overrides the one in networkConstants.py (came in via sim_utils.py)
## Below two overide the variables that came in from stimuliConstantsMinimal.py via stimuliConstants.py
NONLINEAR_ORNS = False
NONLINEAR_TYPE = 'P' # P for primary glom non-linear, L for lateral gloms non-linear
#fullfilename = '../results/odor_morphs/morphs_random'
#if NONLINEAR_ORNS: fullfilename += 'NL'+NONLINEAR_TYPE
#fullfilename += '.pickle'
#fullfile = open(fullfilename,'r')
#morphs = pickle.load(fullfile)
#fullfile.close()
PLOTRESP_NUM = 1 # whether to plot 2 respiration cycles or 1
NUMBINS = 5
BIN_WIDTH_TIME = RESPIRATION/NUMBINS
bindt = RESPIRATION/float(NUMBINS)
## I take the last PLOTRESP_NUM of respiration cycles out of NUM_RESPS simulated
responsetlist = arange( SETTLETIME+(NUM_RESPS-PLOTRESP_NUM)*RESPIRATION+bindt/2.0, \
SETTLETIME+NUM_RESPS*RESPIRATION, RESPIRATION/NUMBINS )
min_frate_cutoff = 0.25 # Hz
salient = False#True
if salient:
stim_seeds = [-1,-19]#range(-1,-37,-1)#[-1,-2,-3,-4,-5,-6,-7,-8,-9]
num_gloms_list = [3]
## inh_options = [ (no_singles,no_joints,no_lat,no_PGs,varyRMP), ... ]
## in order,below options are:
## all cells; no lat; no joints, varyRMP; no PGs; no singles + no joints, only mitrals
#inh_options = [ (0,(False,False,False,False,False)), (1,(False,False,True,False,False)), \
# (2,(False,True,False,False,False)), (3,(False,False,False,False,True)), \
# (4,(False,False,False,True,False)), (5,(True,True,False,False,False)), \
# (6,(True,True,False,True,False))]
inh_options = [ (0,(False,False,False,False,False)), (1,(False,False,True,False,False)) ]
else:
#stim_seeds = [157.0,160.0,190.0,191.0,212.0,441.0]
#num_gloms_list = [5,2]
stim_seeds = arange(750.0,800.0,1.0)#[157.0,160.0,190.0,191.0]
num_gloms_list = [3]
## inh_options = [ (no_singles,no_joints,no_lat,no_PGs,varyRMP), ... ]
## in order,below options are: all cells; no lat; no joints, varyRMP; no PGs; only mitrals
inh_options = [ (0,(False,False,False,False,False)), (1,(False,False,True,False,False)), \
(2,(True,False,False,False,False)), (3,(True,True,False,False,True)), \
(6,(False,False,False,True,False)), (8,(True,True,False,True,False))]
net_seeds = [200.0]
def get_filename(netseed,stimseed,inh,ngi,stimi,neti,\
nl_orns=NONLINEAR_ORNS,nl_type=NONLINEAR_TYPE,\
resultsdir='../results/odor_pulses'):
### read filename from the output file of automated run
## construct the filename
if inh[0]: singles_str = '_NOSINGLES'
else: singles_str = '_SINGLES'
if inh[1]: joints_str = '_NOJOINTS'
else: joints_str = '_JOINTS'
if inh[3]: pgs_str = '_NOPGS'
else: pgs_str = '_PGS'
if inh[2]: lat_str = '_NOLAT'
else: lat_str = '_LAT'
if inh[4]: varmitstr = '_VARMIT'
else: varmitstr = '_NOVARMIT'
## stable enough that time tags are not needed
filename = resultsdir+'/odorpulses'+\
'_netseed'+str(netseed)+'_stimseed'+str(stimseed)
if nl_orns: filename += '_NL'+nl_type
filename += singles_str+joints_str+pgs_str+lat_str+varmitstr+\
'_numgloms'+str(num_gloms_list[ngi])
if directed: filename += '_directed'+str(FRAC_DIRECTED)
filename += '.pickle'
return filename, (singles_str, joints_str, pgs_str, lat_str, varmitstr)
def plot_scaled_kernels():
for neti,netseed in enumerate(net_seeds):
numsubfigs_rows = len(stim_seeds)*len(num_gloms_list)
numsubfigs_cols = len(inh_options)*2 # two mitral sisters
fig = figure(facecolor='w')
ax = fig.add_subplot(111)
figtext(0.1,0.94,'OdorA & OdorB kernels x1 and x2 netseed='+str(netseed),fontsize=20)
delaxes()
if not salient: net_seeds = [stimseed]
for stimi,stimseed in enumerate(stim_seeds):
for ngi,num_gloms in enumerate(num_gloms_list):
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
for plotyi,(inhi,inh) in enumerate(inh_options):
## add_subplot(rows,cols,fignum), fignum starts from 1 not 0
## fignum fills first row to end, then next row
## one subfig for mit0, one for mit1
ax0 = fig.add_subplot(numsubfigs_rows,numsubfigs_cols,\
(stimi+ngi)*numsubfigs_cols+plotyi*2+1) # *2 for two mit sisters
ax1 = fig.add_subplot(numsubfigs_rows,numsubfigs_cols,\
(stimi+ngi)*numsubfigs_cols+plotyi*2+2) # *2 for two mit sisters
all_chisqs = []
for dualnum,dualstimseed in enumerate( (stimseed,stimseed-len(salient_seed_glom_mapA)) ):
filename, switch_strs \
= get_filename(netseed,dualstimseed,inh,ngi,stimi,neti)
switches_str = string.join(switch_strs,'')
print filename
## read in the spiketimes/binned responses for this run
kernels,chisqs,fitted_responses_full,mdict_full = \
fit_pulses(filename,dualstimseed,False,NOSHOW=True,SAVEFIG=False)
all_chisqs.append(chisqs)
ax0.plot(kerneltlist,kernels[0][0],color=(1,0,dualnum),linewidth=2)
ax0.plot(kerneltlist,kernels[0][1],color=(0,1,dualnum),linewidth=2)
ax1.plot(kerneltlist,kernels[1][0],color=(1,0,dualnum),linewidth=2)
ax1.plot(kerneltlist,kernels[1][1],color=(0,1,dualnum),linewidth=2)
if dualnum==0: ## double the kernels to compare with x2 kernels
ax0.plot(kerneltlist,kernels[0][0]*2,color=(1,0,1),linewidth=2,linestyle=':')
ax0.plot(kerneltlist,kernels[0][1]*2,color=(0,1,1),linewidth=2,linestyle=':')
ax1.plot(kerneltlist,kernels[1][0]*2,color=(1,0,1),linewidth=2,linestyle=':')
ax1.plot(kerneltlist,kernels[1][1]*2,color=(0,1,1),linewidth=2,linestyle=':')
ax0.set_title(
'mit0_'+str(num_gloms)+'G_'+\
'%1.2f,%1.2f'%(all_chisqs[0][0],all_chisqs[1][0])+switches_str,fontsize=8)
ax1.set_title(
'mit1_'+str(num_gloms)+'G_'+\
'%1.2f,%1.2f'%(all_chisqs[0][1],all_chisqs[1][1])+switches_str,fontsize=8)
## put whichever netseed, stimseed, mit and odor you want plotted separately a la Priyanka
def plot_scaled_kernels_special():
netseed = 200.0
stimseed = -19
ngi = 0
mitnum = 1 # 0 or 1
odornum = 0 # 0 for odorA, 1 for odorB
# use 1 or 3 for odorA, 2 or 4 for odorB
if odornum==0: pulsenum = 1
else: pulsenum = 2
fig = figure(facecolor='w')
## set main axes off
bigAxes = axes(frameon=False) # hide frame
xticks([]) # don't want to see any ticks on this axis
yticks([])
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
inh = (False,False,False,False,False)
ax = fig.add_subplot(1,3,1) # for kernels
all_chisqs = []
for dualnum,dualstimseed in enumerate( (stimseed,stimseed-len(salient_seed_glom_mapA)) ):
filename, switch_strs \
= get_filename(netseed,dualstimseed,inh,ngi,None,None,None)
switches_str = string.join(switch_strs,'')
print filename
## read in the spiketimes/binned responses for this run
##mdict={'firingbinsmeanList':firingbinsmeanList,
## 'firingbinserrList':firingbinserrList, 'bgnd':bgnd, 'FIRINGFILLDT':FIRINGFILLDT,
## 'pulseList':pulserebinList,'pulseStepsList':pulseStepsList,
## 'start_kernels':ORNkernels,'pulserebindt':pulserebindt,'pulsetlist':pulsetlist}
## _full means data for both mitrals
kernels,chisqs,fitted_responses_full,mdict_full = \
fit_pulses(filename,dualstimseed,False,NOSHOW=True)
fitted_responses = fitted_responses_full[mitnum]
mdict = mdict_full[mitnum]
all_chisqs.append(chisqs)
FIRINGFILLDT=mdict['FIRINGFILLDT']
pulserebindt=mdict['pulserebindt']
pulsetlist=mdict['pulsetlist']
pulseStepsList = mdict['pulseStepsList']
firingbinsmeanList = mdict['firingbinsmeanList']
firingbinserrList = mdict['firingbinserrList']
## plot kernel
if dualnum==0: scale = 1.0
else: scale = 0.5 ## halve the kernels to compare with 1x kernel
ax.plot(kerneltlist,kernels[mitnum][odornum]*scale,\
color=(1-dualnum,0,dualnum),linewidth=4)
ax2 = fig.add_subplot(1,3,dualnum+2) # for pulse, response and fit
################# random pulses and ORN responses
xpulse = 50
randompulsetime = arange(0,PULSE_RUNTIME+1e-10,FIRINGFILLDT)
fill_between(randompulsetime,xpulse*pulseStepsList[pulsenum+1],
linewidth=0,color=(0.9,0.7,0.7),alpha=1.0)#facecolor=(0.9,0.7,0.7),edgecolor=(0.9,0.7,0.7))
################### Plot the simulated responses
## smooth the simulated response
## windowsize=5 and SD=0.69 are defaults from matlab's smoothts() for gaussian smoothing
Gwindow = signal.gaussian(5,0.69)
## help from http://www.scipy.org/Cookbook/SignalSmooth
simresponse = convolve(Gwindow/Gwindow.sum(),firingbinsmeanList[pulsenum],mode='same')
## numpy array, hence adds element by element
fill_between(pulsetlist,
simresponse+firingbinserrList[pulsenum]/sqrt(9),
simresponse-firingbinserrList[pulsenum]/sqrt(9),
color=(0.6,0.9,0.6))
plot(pulsetlist,simresponse,linewidth=2,color=(0.3,0.3,0.3))
################## Plot the fitted responses
starti = int(PULSE_START/pulserebindt)
response = fitted_responses[pulsenum-1]
plot(pulsetlist[starti:],response[starti:],linestyle='solid',
linewidth=2.0,color=(1-dualnum,0,dualnum))
ax2.set_ylim(-xpulse/20,xpulse)
ax2.set_yticks([0,xpulse])
ax2.set_yticklabels(['0',str(xpulse)])
ax2.set_xlim(0,8.5)
ax2.set_xticks([0,8.5])
ax2.set_xticklabels(['0','8.5'])
axes_labels(ax2,'time (s)','',adjustpos=False,fontsize=34)
ax2.set_title('firing rate (Hz)',fontsize=34)
ax.set_yticks([0])
ax.set_xlim(0,2.0)
ax.set_xticks([0,2])
ax.set_xticklabels(['0','2'])
axes_labels(ax,'time(s)','amplitude (arb)',adjustpos=False,fontsize=34)
def plot_kernels(graph=True):
""" Plots kernels for each result file if graph=True, else just fits each result file """
for stimi,stimseed in enumerate(stim_seeds):
if graph:
numsubfigs_rows = len(net_seeds)*len(num_gloms_list)
numsubfigs_cols = len(inh_options)*2 # two mitral sisters
fig = figure(facecolor='w')
ax = fig.add_subplot(111)
figtext(0.1,0.94,'OdorA & OdorB kernels stimseed='+str(stimseed),fontsize=20)
delaxes()
if not salient: net_seeds = [stimseed]
for neti,netseed in enumerate(net_seeds):
for ngi,num_gloms in enumerate(num_gloms_list):
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
for plotyi,(inhi,inh) in enumerate(inh_options):
if graph:
## add_subplot(rows,cols,fignum), fignum starts from 1 not 0
## fignum fills first row to end, then next row
## one subfig for mit0, one for mit1
ax0 = fig.add_subplot(numsubfigs_rows,numsubfigs_cols,\
(neti+ngi)*numsubfigs_cols+plotyi*2+1) # *2 for two mit sisters
ax1 = fig.add_subplot(numsubfigs_rows,numsubfigs_cols,\
(neti+ngi)*numsubfigs_cols+plotyi*2+2) # *2 for two mit sisters
filename, switch_strs \
= get_filename(netseed,stimseed,inh,ngi,stimi,neti)
switches_str = string.join(switch_strs,'')
## if the result file for these seeds & tweaks doesn't exist,
## then carry on to the next.
if not os.path.exists(filename): continue
print filename
## fit the responses for this result file
kernels,chisqs,fitted_responses_full,mdict_full = \
fit_pulses(filename,stimseed,False,NOSHOW=True,SAVEFIG=False)
if graph:
ax0.plot(kerneltlist,kernels[0][0],color=(1,0,0),linewidth=2)
ax0.plot(kerneltlist,kernels[0][1],color=(0,1,0),linewidth=2)
ax1.plot(kerneltlist,kernels[1][0],color=(1,0,0),linewidth=2)
ax1.plot(kerneltlist,kernels[1][1],color=(0,1,0),linewidth=2)
ax0.set_title(
'mit0_'+str(num_gloms)+'G_'+\
'%1.2f,%1.2f'%chisqs[0]+switches_str,fontsize=8)
ax1.set_title(
'mit1_'+str(num_gloms)+'G_'+\
'%1.2f,%1.2f'%chisqs[1]+switches_str,fontsize=8)
def residual2noise(fitted_response,sim_mean,sim_std,starti):
residual = mean( [(val-sim_mean[i])**2\
for i,val in enumerate(fitted_response[starti:],start=starti)] )
noise = mean( [val**2\
for i,val in enumerate(sim_std[starti:],start=starti)] )
signal_mean = mean(sim_mean[starti:])
#signal_mean = sim_mean[starti] ### HACK presently - but should be this way
signal = mean( [(val-signal_mean)**2\
for i,val in enumerate(sim_mean[starti:],start=starti)] )
signal2noise = sqrt(signal/noise)
signal2residual = sqrt(signal/residual)
return signal2noise,signal2residual
def residual2noise_resp(fitted_response,sim_odor_mean,sim_air_mean,sim_std,starti):
sim_mean = sim_odor_mean - sim_air_mean
## uncomment below code to remove those points that have 0 odor frate
#zeroval_indices = where(sim_odor_mean==0)[0]
### Where the val of the odor+air simulated response is zero,
### set bins of all arrays to zero, thus they don't contribute to S/N/R.
#for idx in zeroval_indices:
# fitted_response[idx]=0
# sim_mean[idx]=0
# sim_std[idx]=0
return residual2noise(fitted_response,sim_mean,sim_std,starti)
def resp_SRN(filename,fitted_mitral,kernelA,kernelB):
## goodness of fits: Signal-Residual-Noise for respiratory responses
## below functions are from fit_odor_pulses_constair_separateodors.py
## minimum error is set by load_morph...() to avoid divide by zero errors
morph_numavgs,morph_mitral_responses_avg,morph_mitral_responses_std = \
load_morph_responses_from_pulsefilename(filename,fitted_mitral,respdt,numresps=1)
respirationtime,morph_responseA,morph_responseB = \
predict_respresp(kernelA,kernelB,numresps=1)
## subtract air response from mitral odor response
airmean = morph_mitral_responses_avg[6]
sim_responseA = morph_mitral_responses_avg[5]
sim_responseB = morph_mitral_responses_avg[0]
## normalize the predicted response to the simulated response
#normA = abs(max(sim_responseA-airmean))/abs(max(morph_responseA))
#normB = abs(max(sim_responseB-airmean))/abs(max(morph_responseB))
#morph_responseA /= normA
#morph_responseB /= normB
signal2noiseA,signal2residualA = residual2noise_resp( \
morph_responseA,sim_responseA,airmean,\
morph_mitral_responses_std[5],0 ) # start from 0th bin
signal2noiseB,signal2residualB = residual2noise_resp( \
morph_responseB,sim_responseB,airmean,\
morph_mitral_responses_std[0],0 ) # start from 0th bin
return signal2noiseA,signal2residualA,signal2noiseB,signal2residualB,\
morph_mitral_responses_avg,morph_mitral_responses_std,\
morph_responseA,morph_responseB
def get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,inh,\
nl_orns,nl_type,dirextn,resp_fits=True,dirextn4stim=True):
chisqs = []
signal2residuals = []
signal2noises = []
AandB_signal2residuals = []
AandB_signal2noises = []
resp_signal2residuals = []
resp_signal2noises = []
n_accept = 0
n_total = 0
for stimi,stimseed in enumerate(stim_seeds):
if not salient: net_seeds = [stimseed]
for neti,netseed in enumerate(net_seeds):
for ngi,num_gloms in enumerate(num_gloms_list):
filename, switch_strs \
= get_filename(netseed,stimseed,inh,ngi,stimi,neti,\
nl_orns,nl_type,resultsdir='../results/odor_pulses'+dirextn)
switches_str = string.join(switch_strs,'')
## if the result file for these seeds & tweaks doesn't exist,
## then carry on to the next.
print filename
if not os.path.exists(filename): continue
## If the fitted params file does not exist, create it (them).
if not os.path.exists(filename+'_params0'):
## fit the responses for this result file
fitter = fit_plot_pulses(filename,stimseed,False,NOSHOW=True,SAVEFIG=False)
kernels,chisqs,fitted_responses_full,mdict_full = \
fitter.fit_pulses(filename,stimseed,False,NOSHOW=True,SAVEFIG=False,\
dirextn=dirextn,dirextn4stim=dirextn4stim)
for fitted_mitral in [0,1]:
f = open(filename+'_params'+str(fitted_mitral),'r')
## firingbinsmeanList,firingbinserrList [pulsenum][binnum] are for this mitral
## fitted responses [pulsenum-1][binnum] are for this mitral (note no air pulses).
chisqs_mit,kernels,bgnd,firingbinsmeanList,firingbinserrList,fitted_responses \
= pickle.load(f)
f.close()
n_total += 1 # total number of mitral cells
kernelA,kernelB = kernels
## Priyanka's definitions, following Geffen et al, 2009
## for the last A&B pulse train index 5
## only compare after odor onset at PULSE_START
starti = int(PULSE_START/pulserebindt)
## If mean firing rate is close to zero for any odour, the fits are terrible,
## even if the chi-sq comes out low! So discard low firing cells to any odour A or B.
if mean(firingbinsmeanList[1][starti:])>min_frate_cutoff \
and mean(firingbinsmeanList[2][starti:])>min_frate_cutoff \
and mean(firingbinsmeanList[3][starti:])>min_frate_cutoff \
and mean(firingbinsmeanList[4][starti:])>min_frate_cutoff:
chisqs.append(chisqs_mit[0])
chisqs.append(chisqs_mit[1])
for pulsenum in [1,2,3,4]:
## Returns with sqrt() taken for S2N and S2R.
signal2noise,signal2residual = residual2noise( \
fitted_responses[pulsenum-1],firingbinsmeanList[pulsenum],\
firingbinserrList[pulsenum],starti )
signal2noises.append(signal2noise)
signal2residuals.append(signal2residual)
signal2noise,signal2residual = residual2noise( \
fitted_responses[4],firingbinsmeanList[5],firingbinserrList[5],starti )
AandB_signal2noises.append(signal2noise)
AandB_signal2residuals.append(signal2residual)
n_accept += 1
print stimseed,chisqs_mit,'S2R =',signal2residual,'S2N =',signal2noise
## Below are for AandB summation fits, just calculated above
if signal2residual<0.5:
print 'poor pulses A+B prediction',filename
elif signal2residual/signal2noise > 2.0:
print 'good pulses A+B prediction, ratio =',signal2residual/signal2noise,filename
## goodness of fits for respiratory responses
if resp_fits:
signal2noiseA,signal2residualA,signal2noiseB,signal2residualB,\
morph_mitral_responses_avg,morph_mitral_responses_std,\
morph_responseA,morph_responseB = \
resp_SRN(filename,fitted_mitral,kernelA,kernelB)
resp_signal2noises.append(signal2noiseA)
resp_signal2residuals.append(signal2residualA)
resp_signal2noises.append(signal2noiseB)
resp_signal2residuals.append(signal2residualB)
#print 'resp ',signal2residualA,'/',signal2noiseA,\
# signal2residualB,'/',signal2noiseB
if signal2residualA/signal2noiseA > 1.5:
print 'good resp odour A: sqrt(S2R/S2N) = ',signal2residualA,'/',signal2noiseA
elif signal2residualA/signal2noiseB > 1.5:
print 'good resp odour B: sqrt(S2R/S2N) = ',signal2residualB,'/',signal2noiseB
elif signal2residualA<0.5 or signal2residualB<0.5:
print 'bad resp odour A: sqrt(S2R/S2N) = ',signal2residualA,'/',signal2noiseA,\
'resp odour B: sqrt(S2R/S2N) = ',signal2residualB,'/',signal2noiseB
else:
pass
#print 'low reponse, discarded',filename
#print mean(firingbinsmeanList[1][starti:])
#print mean(firingbinsmeanList[2][starti:])
print "Number of mitral cells accepted =",n_accept,"out of",n_total
return chisqs, array(signal2residuals), array(signal2noises), \
array(AandB_signal2residuals), array(AandB_signal2noises), \
array(resp_signal2residuals), array(resp_signal2noises)
def plot_all_stats():
""" Plot chi-sq histogram, and residual vs noise for individual pulse fits,
both odors pulse prediction, and respiratory prediction. """
fig = figure(figsize=(columnwidth,linfig_height),dpi=300,facecolor='w') # 'none' is transparent
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
inh_options = [ ('',0,(False,False,False,False,False),'lat inh'), \
('',1,(False,False,True,False,False),'no lat inh') ]
for ploti,(dirextn,inhi,inh,inhstr) in enumerate(inh_options):
chisqs, signal2residuals, signal2noises, \
AandB_signal2residuals, AandB_signal2noises, \
resp_signal2residuals, resp_signal2noises = \
get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,\
inh,NONLINEAR_ORNS,NONLINEAR_TYPE,dirextn)
ax1 = fig.add_subplot(2,4,4*ploti+1,frameon=False)
ax2 = fig.add_subplot(2,4,4*ploti+2,frameon=False)
ax3 = fig.add_subplot(2,4,4*ploti+3,frameon=False)
ax4 = fig.add_subplot(2,4,4*ploti+4,frameon=False)
signal2residuals = array(signal2residuals)
#ax1.hist(chisqs,20,histtype='step',linewidth=linewidth,label=inhstr,color='k')
ax2.scatter(signal2noises,signal2residuals,s=linewidth,\
label=inhstr,color='k',marker='.',alpha=0.7)
ax3.scatter(AandB_signal2noises,AandB_signal2residuals,s=linewidth,\
label=inhstr,color='k',marker='.',alpha=0.7)
ax4.scatter(resp_signal2noises,resp_signal2residuals,s=linewidth,\
label=inhstr,color='k',marker='.',alpha=0.7)
## beautify plots
for axnum,ax in enumerate([ax1,ax2,ax3,ax4]):
panel_label = ['A','B','C','D','E','F','G','H'][ploti*4+axnum]
## ax.transAxes ensures relative to axes size, rather than to data units.
text(0.15, 1.0, panel_label, fontsize=label_fontsize, transform=ax.transAxes)
ax.get_yaxis().set_ticks_position('left')
ax.get_xaxis().set_ticks_position('bottom')
xmin, xmax = ax.get_xaxis().get_view_interval()
ymin, ymax = ax.get_yaxis().get_view_interval()
ax.set_xlim([0,xmax])
ax.set_ylim([0,ymax])
ax.set_xticks([0,xmax])
ax.set_yticks([0,ymax])
ax.add_artist(Line2D((0, 0), (0, ymax), color='black', linewidth=axes_linewidth))
ax.add_artist(Line2D((0, xmax), (0, 0), color='black', linewidth=axes_linewidth))
minax = min(xmax,ymax)
if ax!=ax1:
ax.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
## axes_labels() sets sizes of tick labels too.
if ploti==1:
if ax==ax1:
axes_labels(ax,'chi-sq','',adjustpos=False)
else:
axes_labels(ax,'','',adjustpos=False)
else:
axes_labels(ax,'','',adjustpos=False)
fig.tight_layout()
subplots_adjust(top=0.95,wspace=1.0)
fig.text(0.01,0.8,'count',fontsize=label_fontsize, rotation='vertical', transform=fig.transFigure)
fig.text(0.2,0.92,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
rotation='vertical', transform=fig.transFigure)
fig.text(0.5,0.02,'$\sqrt{signal/noise}$',fontsize=label_fontsize, transform=fig.transFigure)
fig.savefig('../figures/linpulses_stats.svg', bbox_inches='tight',dpi=fig.dpi)
fig.savefig('../figures/linpulses_stats.png', bbox_inches='tight',dpi=fig.dpi)
######## PAPER SUPPLEMENTARY FIGURE
def plot_1x2x_stats_papersupplfigure():
""" Plot residual vs noise for individual pulse fits,
both odors pulse prediction, and respiratory prediction. """
fig = figure(figsize=(columnwidth*2/3.,linfig_height*2/3),dpi=300,facecolor='w')
hist_bins = arange(0.0,2.01,0.05)
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,3)
ax3 = fig.add_subplot(2,2,2)
ax4 = fig.add_subplot(2,2,4)
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
## inh_options = [(dirextn,inhi,inh,inhstr,(axfits,axpreds),resp_fits_on),...]
inh_options = [ \
('',0,(False,False,False,False,False),'all',(ax1,ax2),False),
('_aug15_2x',1,(False,False,False,False,False),'all',(ax3,ax4),False) ]
yR2Nmax = 0.
for (dirextn,inhi,inh,inhstr,(axfits,axpreds),resp_fits_on) in inh_options:
## sqrt() already taken for S2Rs and S2Ns -- see above get_pulse_goodnessfits()
chisqs, signal2residuals, signal2noises, \
AandB_signal2residuals, AandB_signal2noises, \
resp_signal2residuals, resp_signal2noises = \
get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,inh,\
False,'P',dirextn,resp_fits=resp_fits_on,dirextn4stim=False)
## alpha a in the marker's facecolor (r,g,b,a) doesn't work
axfits.hist(clip(signal2noises/signal2residuals,0,2),\
hist_bins,normed=True,edgecolor='b',facecolor='b')
_,y1=axfits.get_ylim()
axpreds.hist(clip(AandB_signal2noises/AandB_signal2residuals,0,2),\
hist_bins,normed=True,edgecolor='b',facecolor='b')
_,y2=axpreds.get_ylim()
yR2Nmax = max((yR2Nmax,y1,y2))
print "Mean of signal2noises =",mean(array(signal2noises)**2)
print "Mean of signal2residuals =",mean(array(signal2residuals)**2)
print "Mean of A+B signal2noises =",mean(array(AandB_signal2noises)**2)
print "Mean of A+B signal2residuals =",mean(array(AandB_signal2residuals)**2)
## beautify plots
for axnum,ax in enumerate([ax1,ax2,ax3,ax4]):
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
ax.set_xlim(0,2)
ax.set_xticks([0,1,2])
ax.set_ylim(0,yR2Nmax)
ax.set_yticks([0,yR2Nmax])
if axnum in [0,2]: ax.set_xticklabels(['','',''])
else: ax.set_xticklabels(['0','1','2'])
## axes_labels() sets sizes of tick labels too.
if axnum==1:
axes_labels(ax,"$\sqrt{residual/noise}$","")
ax.xaxis.set_label_coords(1.2,-0.35)
elif axnum==0:
axes_labels(ax,"","prob. density")
ax.yaxis.set_label_coords(-0.3,-0.3)
else: axes_labels(ax,'','',adjustpos=False) # just to set fontsize
fig.tight_layout()
fig_clip_off(fig)
#fig.text(-0.02,0.8,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
# rotation='vertical',transform=fig.transFigure)
fig.subplots_adjust(top=0.95,left=0.17,bottom=0.23,wspace=0.35,hspace=0.4)
if SAVEFIG:
fig.savefig('../figures/linpulses_stats_1x2x.svg',dpi=fig.dpi)
fig.savefig('../figures/linpulses_stats_1x2x.png',dpi=fig.dpi)
######## PAPER FIGURE 6
def plot_mitioNL_stats_paperfigure():
""" Plot residual vs noise for individual pulse fits,
both odors pulse prediction, and respiratory prediction. """
fig = figure(figsize=(columnwidth*2,linfig_height*2/3),dpi=300,facecolor='w')
hist_bins = arange(0.0,2.01,0.05)
ax1 = fig.add_subplot(2,5,1)
ax2 = fig.add_subplot(2,5,6)
ax3 = fig.add_subplot(2,5,2)
ax4 = fig.add_subplot(2,5,7)
ax5 = fig.add_subplot(2,5,3)
ax6 = fig.add_subplot(2,5,8)
ax7 = fig.add_subplot(2,5,4)
ax8 = fig.add_subplot(2,5,9)
ax9 = fig.add_subplot(2,5,5)
ax10 = fig.add_subplot(2,5,10)
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
## inh_options = [(dirextn,inhi,inh,inhstr,(axfits,axpreds),resp_fits_on),...]
inh_options = [ \
('',0,(False,False,False,False,False),'all',(ax1,ax2),False),
('',0,(False,False,False,True,False),'all',(ax3,ax4),False),
('',0,(True,True,False,False,False),'all',(ax5,ax6),False),
('_aug17_2_PGmod',0,(False,False,False,False,False),'all',(ax7,ax8),False),
('_aug17_4_PGmod',1,(False,False,False,False,False),'all',(ax9,ax10),False) ]
maxy1 = 0
maxy2 = 0
for (dirextn,inhi,inh,inhstr,(axfits,axpreds),resp_fits_on) in inh_options:
## sqrt() already taken for S2Rs and S2Ns -- see above get_pulse_goodnessfits()
chisqs, signal2residuals, signal2noises, \
AandB_signal2residuals, AandB_signal2noises, \
resp_signal2residuals, resp_signal2noises = \
get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,inh,\
False,'P',dirextn,resp_fits=resp_fits_on,dirextn4stim=False)
## alpha a in the marker's facecolor (r,g,b,a) doesn't work
axfits.hist(clip(signal2noises/signal2residuals,0,2),\
hist_bins,normed=True,edgecolor='b',facecolor='b')
axpreds.hist(clip(AandB_signal2noises/AandB_signal2residuals,0,2),\
hist_bins,normed=True,edgecolor='b',facecolor='b')
print "Mean of signal2noises =",mean(array(signal2noises)**2)
print "Mean of signal2residuals =",mean(array(signal2residuals)**2)
print "Mean of A+B signal2noises =",mean(array(AandB_signal2noises)**2)
print "Mean of A+B signal2residuals =",mean(array(AandB_signal2residuals)**2)
## beautify plots
for axnum,ax in enumerate([ax1,ax2,ax3,ax4,ax5,ax6,ax7,ax8,ax9,ax10]):
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
## find the ymax across all plots in top row and in bottom row
if axnum % 2 == 0: maxy1 = max(maxy1,ymax)
else: maxy2 = max(maxy2,ymax)
ax.set_xlim(0,2)
ax.set_xticks([0,1,2])
if axnum in [0,2,4,6,8]: ax.set_xticklabels(['','',''])
else: ax.set_xticklabels(['0','1','2+'])
## axes_labels() sets sizes of tick labels too.
if axnum==5:
axes_labels(ax,"$\sqrt{residual/noise}$","",xpad=1)
#ax.xaxis.set_label_coords(1.2,-0.35)
elif axnum==0:
axes_labels(ax,"","prob. density")
ax.yaxis.set_label_coords(-0.25,-0.2)
else: axes_labels(ax,'','',adjustpos=False) # just to set fontsize
for ax in [ax1,ax3,ax5,ax7,ax9]:
ax.set_ylim([0,maxy1])
ax.set_yticks([0,maxy1])
for ax in [ax2,ax4,ax6,ax8,ax10]:
ax.set_ylim([0,maxy2])
ax.set_yticks([0,maxy2])
#fig.tight_layout()
fig_clip_off(fig)
#fig.text(-0.02,0.8,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
# rotation='vertical',transform=fig.transFigure)
fig.subplots_adjust(top=0.95,left=0.07,right=0.95,bottom=0.23,wspace=0.25,hspace=0.4)
if SAVEFIG:
fig.savefig('../figures/linpulses_stats_mitioNL.svg',dpi=fig.dpi)
fig.savefig('../figures/linpulses_stats_mitioNL.png',dpi=fig.dpi)
######## PAPER FIGURE 5
def plot_all_stats_paperfigure():
""" Plot residual vs noise for individual pulse fits,
both odors pulse prediction, and respiratory prediction. """
fig = figure(figsize=(columnwidth,linfig_height*2/3),dpi=300,facecolor='w')
hist_bins = arange(0.0,2.01,0.05)
import scipy.io
## The first two columns of Score_grand and Score_twoodor are
## S2N and S2R respectively, without sqrt(). So be careful to take sqrt().
fit_goodnesses = scipy.io.loadmat('priyanka_goodness_of_fits.mat',struct_as_record=True)
Priyanka_fit_odor = fit_goodnesses['Score_grand']
Priyanka_pred_binary = fit_goodnesses['Score_twoodor']
R2N_odor = sqrt(Priyanka_fit_odor[:,0]/Priyanka_fit_odor[:,1])
R2N_binary = sqrt(Priyanka_pred_binary[:,0]/Priyanka_pred_binary[:,1])
ax1 = fig.add_subplot(2,3,1)
ax2 = fig.add_subplot(2,3,4)
## histogram of residual/noise
expcol = (0.55,0.55,0.22) ## olive colour from http://cloford.com/resources/colours/500col.htm
ax1.hist(clip(R2N_odor,0,2),hist_bins,normed=True,edgecolor=expcol,facecolor=expcol)
ax2.hist(clip(R2N_binary,0,2),hist_bins,normed=True,edgecolor=expcol,facecolor=expcol)
ax3 = fig.add_subplot(2,3,2)
ax4 = fig.add_subplot(2,3,5)
ax5 = fig.add_subplot(2,3,3)
ax6 = fig.add_subplot(2,3,6)
#ax7 = fig.add_subplot(2,4,4)
#ax8 = fig.add_subplot(2,4,8)
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
## inh_options = [(dirextn,inhi,inh,inhstr,(axfits,axpreds),resp_fits_on),...]
inh_options = [ \
('',0,(False,False,False,False,False),'all',(ax3,ax4),True),
('_excinh_jun17',1,(False,False,False,False,False),'all',(ax5,ax6),False) ]
#('',2,(False,False,True,False,False),'all',(ax7,ax8),False),
#('_0.33x_may14',3,(False,False,True,False,False),'all',(ax7,ax8),False) ]
for (dirextn,inhi,inh,inhstr,(axfits,axpreds),resp_fits_on) in inh_options:
## sqrt() already taken for S2Rs and S2Ns -- see above get_pulse_goodnessfits()
chisqs, signal2residuals, signal2noises, \
AandB_signal2residuals, AandB_signal2noises, \
resp_signal2residuals, resp_signal2noises = \
get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,inh,\
False,'P',dirextn,resp_fits=resp_fits_on)
## alpha a in the marker's facecolor (r,g,b,a) doesn't work,
## only in edgecolor -- looks slightly weird
if inhi==3: color = (1,0,0,0.5)
else: color = 'b'
axfits.hist(clip(signal2noises/signal2residuals,0,2),\
hist_bins,normed=True,edgecolor=color,facecolor=color)
axpreds.hist(clip(AandB_signal2noises/AandB_signal2residuals,0,2),\
hist_bins,normed=True,edgecolor=color,facecolor=color)
print "Mean of signal2noises =",mean(array(signal2noises)**2)
print "Mean of signal2residuals =",mean(array(signal2residuals)**2)
print "Mean of A+B signal2noises =",mean(array(AandB_signal2noises)**2)
print "Mean of A+B signal2residuals =",mean(array(AandB_signal2residuals)**2)
## respiratory / freely breathing predictions
if inhi==0:
fig_resp = figure(figsize=(columnwidth/3.0,linfig_height/2.0),dpi=300,facecolor='w')
ax = fig_resp.add_subplot(111)
ax.hist(clip(resp_signal2noises/resp_signal2residuals,0,2),\
hist_bins,normed=True,edgecolor='b',facecolor='b')
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
## axes_labels() sets sizes of tick labels too.
axes_labels(ax,'$\sqrt{residual/noise}$','prob. density',adjustpos=False,xpad=1,ypad=4)
## set from Priyanka's resp fits in Priyanka_expmnt_resp_fits(),
## we need same ymax to compare
ymax = 3.5
ax.set_xlim([0,2])
ax.set_ylim([0,ymax])
ax.set_xticks([0,1,2])
ax.set_yticks([0,ymax])
fig_clip_off(fig_resp)
fig_resp.tight_layout()
fig_resp.subplots_adjust(right=0.85)
if SAVEFIG:
fig_resp.savefig('../figures/linpulses_respstats.svg',dpi=fig_resp.dpi)
fig_resp.savefig('../figures/linpulses_respstats.png',dpi=fig_resp.dpi)
## beautify plots
maxy1 = 0.0
maxy2 = 0.0
for axnum,ax in enumerate([ax1,ax2,ax3,ax4,ax5,ax6]):
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
if axnum % 2 == 0: maxy1 = max(maxy1,ymax) # get max of all plots
else: maxy2 = max(maxy2,ymax) # get max of all plots
for axnum,ax in enumerate([ax1,ax2,ax3,ax4,ax5,ax6]):
if axnum % 2 == 0:
ax.set_ylim([0,maxy1])
ax.set_yticks([0,maxy1])
else:
ax.set_ylim([0,maxy2])
ax.set_yticks([0,maxy2])
ax.set_xlim(0,2)
ax.set_xticks([0,1,2])
if axnum in [0,2,4,6]: ax.set_xticklabels(['','',''])
else: ax.set_xticklabels(['0','1','2'])
## axes_labels() sets sizes of tick labels too.
if axnum==3:
axes_labels(ax,"$\sqrt{residual/noise}$","",xpad=2)
#ax.xaxis.set_label_coords(1.25,-0.35)
elif axnum==0:
axes_labels(ax,"","prob. density")
ax.yaxis.set_label_coords(-0.2,-0.3)
else: axes_labels(ax,'','',adjustpos=False) # just to set fontsize
fig.tight_layout()
fig_clip_off(fig)
#fig.text(-0.02,0.8,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
# rotation='vertical',transform=fig.transFigure)
fig.subplots_adjust(top=0.95,left=0.1,bottom=0.25,wspace=0.35,hspace=0.4)
if SAVEFIG:
fig.savefig('../figures/linpulses_stats.svg',dpi=fig.dpi)
fig.savefig('../figures/linpulses_stats.png',dpi=fig.dpi)
return
################# Below this is the older method of plotting S2R vs S2N
fig = figure(figsize=(columnwidth/2.0,linfig_height*2/3),dpi=300,facecolor='w')
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
(dirextn,inhi,inh,inhstr) = \
('',0,(False,False,False,False,False),'all')
## sqrt() already taken for S2Rs and S2Ns -- see above get_pulse_goodnessfits()
chisqs, signal2residuals, signal2noises, \
AandB_signal2residuals, AandB_signal2noises, \
resp_signal2residuals, resp_signal2noises = \
get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,inh,\
False,'P',dirextn,resp_fits=False)
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
signal2residuals = array(signal2residuals)
## alpha a in the marker's facecolor (r,g,b,a) doesn't work
ax1.scatter(signal2noises,signal2residuals,s=marker_size,edgecolor='k',\
label=inhstr,marker='o',alpha=0.7,facecolor=(0.7,0.7,0.7,0.3),linewidth=linewidth)
ax2.scatter(AandB_signal2noises,AandB_signal2residuals,s=marker_size,edgecolor='k',\
label=inhstr,marker='o',alpha=0.7,facecolor=(0.7,0.7,0.7,0.3),linewidth=linewidth)
print "Mean of signal2noises =",mean(array(signal2noises)**2)
print "Mean of signal2residuals =",mean(array(signal2residuals)**2)
print "Mean of A+B signal2noises =",mean(array(AandB_signal2noises)**2)
print "Mean of A+B signal2residuals =",mean(array(AandB_signal2residuals)**2)
xmax_list = []
ymax_list = []
## beautify plots
for axnum,ax in enumerate([ax1,ax2]):
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
xmax_list.append(xmax)
ymax_list.append(ymax)
xmax = max(xmax_list)
ymax = max(ymax_list)
for axnum,ax in enumerate([ax1,ax2]):
ax.set_xlim([0,xmax])
ax.set_ylim([0,ymax])
if axnum==0: ax.set_yticks([0,ymax])
else: ax.set_yticks([])
ax.set_xticks([0,xmax])
minax = min(xmax,ymax)
ax.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
## axes_labels() sets sizes of tick labels too.
if axnum==0:
axes_labels(ax,"$\sqrt{signal/noise}$","$\sqrt{signal/residual}$",ypad=-4)
ax.xaxis.set_label_coords(1.25,-0.15)
else: axes_labels(ax,'','',adjustpos=False) # just to set fontsize
fig.tight_layout()
fig_clip_off(fig)
subplots_adjust(left=0.3)
#fig.text(-0.02,0.8,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
# rotation='vertical',transform=fig.transFigure)
fig.subplots_adjust(top=0.95,left=0.2,bottom=0.25,wspace=0.35,hspace=0.35)
fig.savefig('../figures/linpulses_stats.svg',dpi=fig.dpi)
fig.savefig('../figures/linpulses_stats.png',dpi=fig.dpi)
return
## separate figure for respiratory fits -- older method of plotting S2R vs S2N
fig = figure(figsize=(columnwidth/3.0,linfig_height/2.0),dpi=300,facecolor='w') # 'none' is transparent
ax = fig.add_subplot(111)
ax.scatter(resp_signal2noises,resp_signal2residuals,s=marker_size,edgecolor='k',\
label=inhstr,marker='o',alpha=0.7,facecolor=(0.7,0.7,0.7,0.3),linewidth=linewidth)
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
## axes_labels() sets sizes of tick labels too.
axes_labels(ax,'$\sqrt{signal/noise}$','$\sqrt{signal/residual}$',adjustpos=False)
ax.set_xlim([0,xmax])
ax.set_ylim([0,ymax])
ax.set_xticks([0,xmax])
ax.set_yticks([0,ymax])
minax = min(xmax,ymax)
ax.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
fig.tight_layout()
subplots_adjust(top=0.84)
fig_clip_off(fig)
fig.savefig('../figures/linpulses_respstats.svg',dpi=fig.dpi)
fig.savefig('../figures/linpulses_respstats.png',dpi=fig.dpi)
def plot_lin_contribs_paperfigure():
""" Plot residual vs noise for summation A+B predictions.
Then plot residual vs noise of fits and predictions together
for no lat, no singles+no PGs, nonlinear-primary.
"""
fig1 = figure(figsize=(columnwidth,linfig_height*1.2),dpi=300,facecolor='w')
ax1 = plt.subplot2grid((3,3),(0,1)) # full
ax2 = plt.subplot2grid((3,3),(1,1)) # no lat
ax3 = plt.subplot2grid((3,3),(1,2)) # no lat, 0.5x
ax4 = plt.subplot2grid((3,3),(2,1)) # no self
ax5 = plt.subplot2grid((3,3),(0,2)) # non-lin
#ax6 = plt.subplot2grid((2,3),(1,2))
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
inh_options = [
('',0,(False,False,False,False,False),'all',False,None,ax1), \
('',1,(False,False,True,False,False),'no lat-inh',False,None,ax2), \
('_mar12_0.5xcentralfrate',\
2,(False,False,True,False,False),'no lat-inh',False,None,ax3), \
('',3,(True,False,False,True,False),'no self-inh',False,None,ax4), \
('',4,(False,False,False,False,False),'non-lin ORNs',True,'P',ax5) ]
R2Ns_AB_all = [ [] for i in range(len(inh_options)) ]
xmaxlist = []
ymaxlist = []
for ploti,(dirextn,inhi,inh,inhstr,nl_orns,nl_type,ax) in enumerate(inh_options):
chisqs, signal2residuals, signal2noises, \
AandB_signal2residuals, AandB_signal2noises, \
resp_signal2residuals, resp_signal2noises = \
get_pulse_goodnessfits(stim_seeds,net_seeds,num_gloms_list,inh,\
nl_orns,nl_type,dirextn,resp_fits=False)
signal2residuals = array(signal2residuals)
ax.scatter(AandB_signal2noises,AandB_signal2residuals,s=marker_size,edgecolor='k',\
label=inhstr,marker='o',alpha=0.7,facecolor=(0.7,0.7,0.7,0.3),linewidth=linewidth)
## beautify plots
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
xmaxlist.append(xmax)
ymaxlist.append(ymax)
xmax = max(xmaxlist)
ymax = max(ymaxlist)
axlist = [ax1,ax2,ax3,ax4,ax5]
for axnum,ax in enumerate(axlist):
ax.set_xlim([0,xmax])
if axnum in [2,3]: ax.set_xticks([0,xmax])
else: ax.set_xticks([])
ax.set_ylim([0,ymax])
if axnum in [0,1,3]: ax.set_yticks([0,ymax])
else: ax.set_yticks([])
minax = min(xmax,ymax)
ax.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
#panel_label = ['a','b','c','d','e','f'][axnum]
### ax.transAxes ensures relative to axes size, rather than to data units.
#ax.text(0.15, 1.0, panel_label, fontsize=label_fontsize, transform=ax.transAxes)
fig1.tight_layout()
fig_clip_off(fig1)
fig1.subplots_adjust(top=0.95,left=0.13,bottom=0.17,wspace=0.4,hspace=0.4)
fig1.text(0.31,0.65,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
rotation='vertical', transform=fig1.transFigure)
fig1.text(0.6,0.025,'$\sqrt{signal/noise}$',fontsize=label_fontsize,transform=fig1.transFigure)
fig1.savefig('../figures/lin_contribs.svg',dpi=fig1.dpi)
fig1.savefig('../figures/lin_contribs.png',dpi=fig1.dpi)
def plot_lin_contribs():
""" Plot residual vs noise for individual pulse fits and summation A+B predictions.
Then plot residual vs noise of fits and predictions together
for no lat, no grans, no singles, no PGs, nonlinear-primary.
Plot residual/noise of fits and predictions vs firing rate. """
fig1 = figure(figsize=(columnwidth,linfig_height),dpi=300,facecolor='w') # 'none' is transparent
ax1 = plt.subplot2grid((2,3),(0,0),frameon=False)
ax2 = plt.subplot2grid((2,3),(1,0),frameon=False)
ax3 = plt.subplot2grid((2,3),(0,1),frameon=False)
ax4 = plt.subplot2grid((2,3),(1,1),frameon=False)
ax5 = plt.subplot2grid((2,3),(0,2),frameon=False)
ax6 = plt.subplot2grid((2,3),(1,2),frameon=False)
fig2 = figure(figsize=(columnwidth,linfig_height),dpi=300,facecolor='w') # 'none' is transparent
ax7 = plt.subplot2grid((1,4),(0,0),frameon=False)
ax8 = plt.subplot2grid((1,4),(0,1),frameon=False)
ax9 = plt.subplot2grid((1,4),(0,2),frameon=False)
ax10 = plt.subplot2grid((1,4),(0,3),frameon=False)
fig3 = figure(figsize=(columnwidth,linfig_height),dpi=300,facecolor='w') # 'none' is transparent
fig4 = figure(figsize=(columnwidth,linfig_height),dpi=300,facecolor='w') # 'none' is transparent
ax11 = plt.subplot2grid((1,1),(0,0),frameon=False)
#plot_fits_vs_corr(ax1,ax2) # these 2 panels go into another figure
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
inh_options = [
(0,(False,False,False,False,False),'all',False,None,ax1), \
(1,(False,False,True,False,False),'no lat',False,None,ax2), \
(2,(True,True,False,False,False),'no granules',False,None,ax4), \
(3,(True,False,False,False,False),'no singles',False,None,ax3), \
(4,(False,False,False,True,False),'no PGs',False,None,ax5),
(5,(False,False,False,False,False),'non-linear',True,'P',ax6) ]
#R2Ns_AB_all = [[]]*len(inh_options) # doesn't work, creates copies of the same list!!
R2Ns_AB_all = [ [] for i in range(len(inh_options)) ]
R2Ns_resp_all = [ [] for i in range(len(inh_options)) ]
fig3plotnum = 1
for ploti,(inhi,inh,inhstr,nl_orns,nl_type,ax) in enumerate(inh_options):
chisqs = []
signal2residuals = []
signal2noises = []
AandB_signal2residuals = []
AandB_signal2noises = []
resp_signal2residuals = []
resp_signal2noises = []
fratemeans,R2Ns,fratemeans_AB,R2Ns_AB = [],[],[],[]
n_accept = 0
for stimi,stimseed in enumerate(stim_seeds):
if not salient: net_seeds = [stimseed]
for neti,netseed in enumerate(net_seeds):
for ngi,num_gloms in enumerate([3]):
filename, switch_strs \
= get_filename(netseed,stimseed,inh,ngi,stimi,neti,nl_orns,nl_type)
switches_str = string.join(switch_strs,'')
## if the result file for these seeds & tweaks doesn't exist,
## then carry on to the next.
if not os.path.exists(filename): continue
#print filename
## If the fitted params file does not exist, create it (them).
if not os.path.exists(filename+'_params0'):
print filename
## fit the responses for this result file
kernels,chisqs,fitted_responses_full,mdict_full = \
fit_pulses(filename,stimseed,False,NOSHOW=True,SAVEFIG=False)
for fitted_mitral in [0,1]:
f = open(filename+'_params'+str(fitted_mitral),'r')
## firingbinsmeanList,firingbinserrList [pulsenum][binnum] are for this mitral
## fitted responses [pulsenum-1][binnum] are for this mitral (note no air pulses).
chisqs_mit,kernels,bgnd,firingbinsmeanList,firingbinserrList,fitted_responses \
= pickle.load(f)
f.close()
kernelA,kernelB = kernels
## Priyanka's definitions, following Geffen et al, 2009
## for the last A&B pulse train index 5
## only compare after odor onset at PULSE_START
starti = int(PULSE_START/pulserebindt)
## If mean firing rate is close to zero for any odour, the fits are terrible,
## even if the chi-sq comes out low! So discard low firing cells to any odour A or B.
discard = False
if mean(firingbinsmeanList[1][starti:])>1 and mean(firingbinsmeanList[2][starti:])>1 \
and mean(firingbinsmeanList[3][starti:])>1 and mean(firingbinsmeanList[4][starti:])>1:
#chisqs.append(chisqs_mit[0])
#chisqs.append(chisqs_mit[1])
R2N_A,R2N_B = 0.0,0.0
## Save S2R and S2N initially, if not discarded in any pulse, keep.
S2R_temp = []
S2N_temp = []
for pulsenum in [1,2,3,4]:
signal2noise,signal2residual = residual2noise( \
fitted_responses[pulsenum-1],firingbinsmeanList[pulsenum],\
firingbinserrList[pulsenum],starti )
## discard those with too high S2R
## (usually zero frate but large air initially)
if signal2residual>5:
print 'discarded S2R =',signal2residual,'for',filename
discard = True
else:
S2N_temp.append(signal2noise)
S2R_temp.append(signal2residual)
if pulsenum in [1,3]: R2N_A += signal2noise/signal2residual
else: R2N_B += signal2noise/signal2residual
if not discard:
n_accept += 1
## A mitral is only accepted if both odor responses are reasonable
## S2N and S2R are noted for all its pulse fits
signal2noises.extend(S2N_temp)
signal2residuals.extend(S2R_temp)
AandB_signal2noise,AandB_signal2residual = residual2noise( \
fitted_responses[4],firingbinsmeanList[5],firingbinserrList[5],starti )
AandB_signal2noises.append(AandB_signal2noise)
AandB_signal2residuals.append(AandB_signal2residual)
R2N_AB = AandB_signal2noise/AandB_signal2residual
## Below are for AandB summation fits, just calculated above
if AandB_signal2residual<0.1:
print 'poor fit',filename
elif 1.0/R2N_AB > 2.5:
print 'good fit ratio =',signal2residual/signal2noise,filename
## Below are needed for plotting R2N vs mean frate
fratemeanA = (mean(firingbinsmeanList[1][starti:])+\
mean(firingbinsmeanList[3][starti:]))/2.0
fratemeanB = (mean(firingbinsmeanList[2][starti:])+\
mean(firingbinsmeanList[4][starti:]))/2.0
fratemeans.append(fratemeanA)
R2Ns.append(R2N_A/2.0)
fratemeans.append(fratemeanB)
R2Ns.append(R2N_B/2.0)
fratemeans_AB.append(mean(firingbinsmeanList[5][starti:]))
## R2Ns_AB_all stores nan-s also (see below),
## whereas R2Ns_AB does not (same size as fratemeans),
R2Ns_AB.append(R2N_AB)
R2Ns_AB_all[inhi].append(R2N_AB)
## Below are for plotting goodness of fit vs linear contribs
if inhi!=5: ## non-linear NLP is not yet done for morphs
signal2noiseA,signal2residualA,signal2noiseB,signal2residualB,\
morph_mitral_responses_avg,morph_mitral_responses_std,\
morph_responseA,morph_responseB =\
resp_SRN(filename,fitted_mitral,kernelA,kernelB)
resp_signal2noises.append(signal2noiseA)
resp_signal2noises.append(signal2noiseB)
resp_signal2residuals.append(signal2residualA)
resp_signal2residuals.append(signal2residualB)
R2N_resp = ( signal2noiseA/signal2residualA + \
signal2noiseB/signal2residualB ) / 2.0
R2Ns_resp_all[inhi].append( R2N_resp )
## plot the good/bad predictions (conditions below) for the default network
if inhi==0 and (R2N_AB>1.0 or R2N_resp>1.0):
ax_AB = fig3.add_subplot(10,10,fig3plotnum,frameon=False)
ax_AB.plot(firingbinsmeanList[5],'-k',linewidth=0.25)
ax_AB.plot(fitted_responses[4],'-r',linewidth=0.25)
beautify_plot(ax_AB)
ax_AB.set_xticklabels([])
ax_AB.set_yticklabels([])
#ax_AB.set_title('%1.2f'%(R2N_AB),fontsize=4)
## ax.transAxes ensures relative to axes size, rather than to data units.
ax_AB.text(0.15, 1.0, '%1.2f'%(R2N_AB), fontsize=3, transform=ax_AB.transAxes)
fig3plotnum += 1
ax_AB = fig3.add_subplot(10,10,fig3plotnum,frameon=False)
airmean = morph_mitral_responses_avg[6]
ax_AB.plot(morph_mitral_responses_avg[5]-airmean,'-r',linewidth=0.25)
ax_AB.plot(morph_responseA,'-m',linewidth=0.25)
ax_AB.plot(morph_mitral_responses_avg[0]-airmean,'-b',linewidth=0.25)
ax_AB.plot(morph_responseB,'-c',linewidth=0.25)
beautify_plot(ax_AB)
ax_AB.set_xticklabels([])
ax_AB.set_yticklabels([])
#ax_AB.set_title('%1.2f'%(R2N_resp),fontsize=4)
## ax.transAxes ensures relative to axes size, rather than to data units.
ax_AB.text(0.15, 1.0, '%1.2f'%(R2N_resp), fontsize=3, transform=ax_AB.transAxes)
fig3plotnum += 1
print 'R2N_AB = %1.2f, R2N_respA = %1.2f,%1.2f, R2N_respB = %1.2f,%1.2f'\
%(R2N_AB,signal2noiseA,signal2residualA,signal2noiseB,signal2residualB),\
filename
else: # discarded as signal2residual is too high
R2Ns_AB_all[inhi].append(nan)
R2Ns_resp_all[inhi].append(nan)
else: # discarded as mean firing rate(s) are too low.
R2Ns_AB_all[inhi].append(nan)
R2Ns_resp_all[inhi].append(nan)
#print 'low reponse, discarded',filename
#print mean(firingbinsmeanList[1][starti:])
#print mean(firingbinsmeanList[2][starti:])
signal2residuals = array(signal2residuals)
ax.scatter(signal2noises,signal2residuals,\
label=inhstr,color=(0.3,0.3,0.3),marker='o',s=marker_size,\
facecolors='none',linewidth=linewidth)
ax.scatter(AandB_signal2noises,AandB_signal2residuals,\
label=inhstr,color='k',marker='x',s=marker_size,linewidth=linewidth)
print "Number of mitral cells accepted =",n_accept
if inhi==0:
## plot for R2N vs frate
ax7.scatter(fratemeans,R2Ns,\
label=inhstr,color=(0.3,0.3,0.3),marker='o',s=marker_size,\
facecolors='none',linewidth=linewidth)
ax7.scatter(fratemeans_AB,R2Ns_AB,\
label=inhstr,color='k',marker='x',s=marker_size,linewidth=linewidth)
beautify_plot(ax7)
axes_labels(ax7,'firing rate (Hz)','$\sqrt{residual/noise}$',adjustpos=False)
## plot for R2N_AB vs R2N_resp
ax8.scatter(R2Ns_AB_all[inhi],R2Ns_resp_all[inhi],\
label=inhstr,color='k',marker='x',s=marker_size,linewidth=linewidth)
xmin,xmax,ymin,ymax = beautify_plot(ax8)
minax = min(xmax,ymax)
ax8.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
axes_labels(ax8,'$\sqrt{R/N} for AB$','',adjustpos=False)
## plot S2R vs S2N for default network
ax11.scatter(resp_signal2residuals,resp_signal2noises,\
label=inhstr,color='k',marker='x',s=marker_size,\
linewidth=linewidth)
axes_labels(ax11,'$\sqrt{signal/residual}','$\sqrt{signal/noise}$',adjustpos=False)
xmin,xmax,ymin,ymax = beautify_plot(ax11)
minax = min(xmax,ymax)
ax11.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
## beautify plots
xmin,xmax,ymin,ymax = beautify_plot(ax)
minax = min(xmax,ymax)
ax.plot([0,minax],[0,minax],linestyle='dashed',color='k',alpha=0.5,linewidth=linewidth)
## plot for R2N (for AB and resp) vs lin tweaks
for R2Ns_all,ax in ((R2Ns_AB_all,ax9),(R2Ns_resp_all,ax10)):
maxR2N = max(R2Ns_all[0])
for lincontrib_line in zip(*R2Ns_all[0:3]):
color = (lincontrib_line[0]/maxR2N,0,1-lincontrib_line[0]/maxR2N)
nanincolor = [ isnan(col) for col in color ]
if True not in nanincolor:
if lincontrib_line[0]>1.0: color='r'
else: color='b'
ax.plot(lincontrib_line,'-x',ms=marker_size,color=color,linewidth=linewidth)
beautify_plot(ax)
ax.set_xticks(range(3))
ax.set_xticklabels(['all','no lat','no granules'])
fig2.autofmt_xdate()
axes_labels(ax,'','',adjustpos=False)
axlists = [ [ax1,ax2,ax3,ax4,ax5,ax6] , [ax7,ax8,ax9,ax10] ]
for axlist in axlists:
for axnum,ax in enumerate(axlist):
panel_label = ['A','B','C','D','E','F'][axnum]
## ax.transAxes ensures relative to axes size, rather than to data units.
ax.text(0.15, 1.0, panel_label, fontsize=label_fontsize, transform = ax.transAxes)
fig1.tight_layout()
fig1.subplots_adjust(top=0.95,left=0.13,bottom=0.17,wspace=0.4,hspace=0.4)
fig1.text(0.01,0.7,'$\sqrt{signal/residual}$',fontsize=label_fontsize,\
rotation='vertical', transform=fig1.transFigure)
fig1.text(0.45,0.025,'$\sqrt{signal/noise}$',fontsize=label_fontsize,transform=fig1.transFigure)
fig1.savefig('../figures/lin_contribs.svg', bbox_inches='tight',dpi=fig1.dpi)
fig1.savefig('../figures/lin_contribs.png', bbox_inches='tight',dpi=fig1.dpi)
fig2.tight_layout()
fig2.subplots_adjust(top=0.95,wspace=0.4)
fig2.text(0.3,0.7,'$\sqrt{R/N} for resp$',fontsize=label_fontsize,\
rotation='vertical', transform=fig2.transFigure)
fig2.savefig('../figures/lin_mech.svg', bbox_inches='tight',dpi=fig2.dpi)
fig2.savefig('../figures/lin_mech.png', bbox_inches='tight',dpi=fig2.dpi)
fig3.tight_layout()
fig4.tight_layout()
def plot_fits_vs_corr(ax1,ax2):
""" Plot avg-chisq vs correlation for each sisters pair - odor combination.
Plot residual2noise vs correlation for each sisters pair - odor pair combination. """
## ax1 and ax2 are now passed in for another figure
#fig = figure(figsize=(columnwidth/3.0,linfig_height),dpi=300,facecolor='w') # 'none' is transparent
#ax1 = fig.add_subplot(2,1,1,frameon=False)
#ax2 = fig.add_subplot(2,1,2,frameon=False)
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
inh_options = [ (0,(False,False,False,False,False),'lat inh') ]
for ploti,(inhi,inh,inhstr) in enumerate(inh_options):
corrs = []
corrsA = []
corrsB = []
chisqsA = []
chisqsB = []
residuals2noises = []
residuals2noisesAandB = []
n_accept_chisq = 0
n_accept_ratio = 0
for stimi,stimseed in enumerate(stim_seeds):
if not salient: net_seeds = [stimseed]
for neti,netseed in enumerate(net_seeds):
for ngi,num_gloms in enumerate(num_gloms_list):
filename, switch_strs \
= get_filename(netseed,stimseed,inh,ngi,stimi,neti)
switches_str = string.join(switch_strs,'')
## if the result file for these seeds & tweaks doesn't exist,
## then carry on to the next.
if not os.path.exists(filename): continue
#print filename
## morphs results file to calculate correlation
corr_filename, corr_switch_strs \
= corr_utils.get_filename(netseed,stimseed,inh,num_gloms,\
None,None,None,directed,FRAC_DIRECTED)
## if the result file for these seeds & tweaks doesn't exist,
## then carry on to the next.
if not os.path.exists(corr_filename): continue
## calc phase corr-s for printing on the title
(air_corr,odorA_corr,odorB_corr),\
(tcorrlist,airxcorrgram,odorAxcorrgram,odorBxcorrgram),\
Dfrates = \
calc_corrs(corr_filename, norm_str="overall", \
numbins=corr_utils.NUMBINS, bin_width_time=corr_utils.BIN_WIDTH_TIME,
printinfo=False)
ratio = 0
ratioAandB = 0
chisqA,chisqB = 0,0
for fitted_mitral in [0,1]:
f = open(filename+'_params'+str(fitted_mitral),'r')
## firingbinsmeanList,firingbinserrList [pulsenum][binnum] are for this mitral
## fitted responses [pulsenum-1][binnum] are for this mitral (note no air pulses).
chisqs_mit,kernels,bgnd,firingbinsmeanList,firingbinserrList,fitted_responses \
= pickle.load(f)
f.close()
## Priyanka's definitions, following Geffen et al, 2009
## for the last A&B pulse train index 5
## only compare after odor onset at PULSE_START
starti = int(PULSE_START/pulserebindt)
## If mean firing rate is close to zero for any odour, the fits are terrible,
## even if the chi-sq comes out low! So discard low firing cells to any odour A or B.
if mean(firingbinsmeanList[1][starti:])>1 and mean(firingbinsmeanList[2][starti:])>1 \
and mean(firingbinsmeanList[3][starti:])>1 and mean(firingbinsmeanList[4][starti:])>1:
for pulsenum in [1,2,3,4]:
signal2noise,signal2residual = residual2noise( \
fitted_responses[pulsenum-1],firingbinsmeanList[pulsenum],\
firingbinserrList[pulsenum],starti )
ratio += signal2noise/signal2residual
signal2noise,signal2residual = residual2noise( \
fitted_responses[4],firingbinsmeanList[5],firingbinserrList[5],starti )
ratioAandB += signal2noise/signal2residual
else:
ratio += nan
ratioAandB += nan
## chisqs
if mean(firingbinsmeanList[1][starti:])>0.6: chisqA += chisqs_mit[0]
else: chisqA += nan
if mean(firingbinsmeanList[2][starti:])>0.6: chisqB += chisqs_mit[0]
else: chisqB += nan
if not isnan(ratio) and not isnan(odorA_corr) and not isnan(odorB_corr):
n_accept_ratio += 1
corrs.append(mean(odorA_corr,odorB_corr)) ## mean correlation
residuals2noises.append(ratio/8.0) ## 4 pulses per sister
residuals2noisesAandB.append(ratioAandB/2.0) ## 1 pulse per sister
if not isnan(chisqA) and not isnan(odorA_corr):
n_accept_chisq += 1
corrsA.append(odorA_corr)
chisqsA.append(chisqA/2.0) # chisq of odor A, mean over 2 sister mitrals
if not isnan(chisqB) and not isnan(odorB_corr):
n_accept_chisq += 1
corrsB.append(odorB_corr)
chisqsB.append(chisqB/2.0) # chisq of odor B, mean over 2 sister mitrals
## for plotting fit vs corr, odorA vs odorB need not be distinguished
## set clip_on=False, to allow points that are just on the edge to not get half-cut.
ax1.scatter(corrsA,chisqsA,marker='.',s=marker_size,color='k',alpha=0.7,\
linewidth=linewidth,clip_on=False)
ax1.scatter(corrsB,chisqsB,marker='.',s=marker_size,color='k',alpha=0.7,\
linewidth=linewidth,clip_on=False)
print "Number of sister-pair--odor combos accepted for chisq =",n_accept_chisq
ax2.scatter(corrs,residuals2noises,marker='.',s=marker_size,color='k',alpha=0.7,\
linewidth=linewidth,clip_on=False)
ax2.scatter(corrs,residuals2noisesAandB,marker='x',s=marker_size,color='k',alpha=0.7,\
linewidth=linewidth,clip_on=False)
print "Number of sister-pair--odor-pair combos accepted for residual2noise =",n_accept_ratio
xmin, xmax = ax1.get_xaxis().get_view_interval()
ymin, ymax = ax1.get_yaxis().get_view_interval()
ax1.set_xlim(-1,1)
ax1.set_xticks([-1,0,1])
ax1.set_xticklabels(['','',''])
ax1.set_ylim(0,ymax)
ax1.set_yticks([0,ymax])
## turn on/off the side axes (after turning off the frame above):
## http://www.shocksolution.com/2011/08/removing-an-axis-or-both-axes-from-a-matplotlib-plot/
ax1.get_xaxis().set_ticks_position('bottom')
ax1.get_yaxis().set_ticks_position('left')
ax1.add_artist(Line2D((-1, -1), (0, ymax), color='black', linewidth=linewidth))
ax1.add_artist(Line2D((-1, 1), (0, 0), color='black', linewidth=linewidth))
axes_labels(ax1,'','chi-sq',fontsize=label_fontsize)
xmin, xmax = ax2.get_xaxis().get_view_interval()
ymin, ymax = ax2.get_yaxis().get_view_interval()
ax2.get_xaxis().set_ticks_position('bottom')
ax2.get_yaxis().set_ticks_position('left')
ax2.set_xlim(-1,1)
ax2.set_xticks([-1,0,1])
ax2.set_yticks([0,1,ymax])
ax2.add_artist(Line2D((-1, -1), (0, ymax), color='black', linewidth=linewidth))
ax2.add_artist(Line2D((-1, 1), (0, 0), color='black', linewidth=linewidth))
axes_labels(ax2,'correlation','$\sqrt{residual/noise}$',fontsize=label_fontsize)
## now called as part of larger figure, hence not needed
#fig.tight_layout()
#fig.savefig('../figures/fits_vs_corr.svg', bbox_inches='tight',dpi=fig.dpi)
#fig.savefig('../figures/fits_vs_corr.png', bbox_inches='tight',dpi=fig.dpi)
def plot_kernelscorr_vs_conc_papersupplfigure():
#import mpl_toolkits.axisartist as AA
fig_kc = figure(figsize=(columnwidth/3.0,linfig_height*2/3.),dpi=300,facecolor='w')
### This was to use new_fixed_axis(), but I couldn't change its tick properties.
#ax1 = AA.Subplot(fig_kc,2,1,1)
#fig_kc.add_subplot(ax1)
#ax2 = AA.Subplot(fig_kc,2,1,2)
#fig_kc.add_subplot(ax2)
ax1 = fig_kc.add_subplot(2,1,1)
ax2 = fig_kc.add_subplot(2,1,2)
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
inh_options = [
('',0,(False,False,False,False,False),'1x conc',False,None), \
('_aug15_2x',1,(False,False,False,False,False),'2x_conc',False,None) ]
kernel_corrs_1x2x = []
kernel_corrs_AvsB = []
for fitted_mitral in [0,1]:
for stimi,stimseed in enumerate(stim_seeds):
if not salient: net_seeds = [stimseed]
for neti,netseed in enumerate(net_seeds):
for ngi,num_gloms in enumerate(num_gloms_list):
## inh = (no_singles,no_joints,no_lat,no_PGs,varyRMP)
kernelAs = []
kernelBs = []
for ploti,(dirextn,inhi,inh,inhstr,nl_orns,nl_type) in enumerate(inh_options):
filename, switch_strs \
= get_filename(netseed,stimseed,inh,ngi,stimi,neti,nl_orns,nl_type,\
'../results/odor_pulses'+dirextn)
## if the result file for these seeds & tweaks doesn't exist,
## then carry on to the next.
if not os.path.exists(filename): continue
## If the fitted params file does not exist, create it (them).
if not os.path.exists(filename+'_params0'):
## fit the responses for this result file
fitter = fit_plot_pulses(filename,stimseed,False,NOSHOW=True,SAVEFIG=False)
kernels,chisqs,fitted_responses_full,mdict_full = \
fitter.fit_pulses(filename,stimseed,False,NOSHOW=True,SAVEFIG=False,dirextn=dirextn)
f = open(filename+'_params'+str(fitted_mitral),'r')
## firingbinsmeanList,firingbinserrList [pulsenum][binnum] are for this mitral
## fitted responses [pulsenum-1][binnum] are for this mitral (note no air pulses).
chisqs_mit,kernels,bgnd,firingbinsmeanList,firingbinserrList,fitted_responses \
= pickle.load(f)
f.close()
kernelAs.append(kernels[0])
kernelBs.append(kernels[1])
## Control: corr between odor kernels A and B
kernel_corrs_AvsB.append(stats.pearsonr(kernelAs[-1],kernelBs[-1])[0])
if len(kernelAs) == 2 and len(kernelBs) == 2:
print "Comparing",filename
kernel_corrs_1x2x.append(stats.pearsonr(kernelAs[0],kernelAs[1])[0])
kernel_corrs_1x2x.append(stats.pearsonr(kernelBs[0],kernelBs[1])[0])
ax1.hist(kernel_corrs_1x2x,20,(-1,1),normed=True,edgecolor='b',facecolor='b')
_,y1 = ax1.get_ylim()
ax2.hist(kernel_corrs_AvsB,20,(-1,1),normed=True,edgecolor='b',facecolor='b')
_,y2 = ax2.get_ylim()
ycorrmax = max(y1,y2)
for ax in [ax1,ax2]:
##beautify_plot() doesn't work with AxisArtist
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=False,y0min=True,\
drawyaxis=False,xticksposn='bottom',yticksposn='none')
#ax.axis["left", "top", "right"].set_visible(False) ## for AxisArtist
ax.set_xlim([-1,1])
ax.set_ylim([0,ycorrmax])
ax.set_xticks([-1,0,1])
ax.set_yticks([])
### make an new axis along the second axis axis (y-axis) which passes
### throught x=0.
#ax.axis["x=0"] = ax.new_floating_axis(nth_coord=1, value=0,
# axis_direction="top")
### new_fixed_axis doesn't even use pixel coords for offset
### calculate pixel values for (0,0) and (-1,0) and get offset
#offpixels = ax.transData.transform([(0,0)])[0] - \
# ax.transData.transform([(-1,0)])[0]
## CAUTION: Resizing window or modifying the figure
## will screw things up
## make new (right-side) yaxis, but wth some offset
#ax.axis["left2"] = ax.new_fixed_axis(loc="left",
# offset=(32.37,0))
######## Could not change ticklabelsizes for new_fixed_axis(), so draw lines!
ax.add_artist(Line2D((0, 0), (0, ycorrmax),\
color='black', linewidth=axes_linewidth)) # y-axis in center
ax.add_artist(Line2D((-0.05, 0.05), (ycorrmax, ycorrmax),\
color='black', linewidth=axes_linewidth)) # tick at the top
ax.text(-0.2, ycorrmax-0.2, str(int(ycorrmax)), fontsize=label_fontsize, transform=ax.transData)
ax1.set_xticklabels([])
## axes_labels() sets sizes of tick labels too.
axes_labels(ax2,'kernels corr.','',adjustpos=False,fontsize=label_fontsize,xpad=2)
#axes_labels(ax1,"","count")
#ax1.yaxis.set_label_coords(-0.2,-0.4)
fig_clip_off(fig_kc)
#fig_kc.tight_layout()
fig_kc.subplots_adjust(top=0.95,left=0.1,bottom=0.23,wspace=0.25,hspace=0.4)
if SAVEFIG:
fig_kc.savefig('../figures/linpulses_kernelscorr.svg',dpi=fig_kc.dpi)
fig_kc.savefig('../figures/linpulses_kernelscorr.png',dpi=fig_kc.dpi)
def Priyanka_expmnt_resp_fits():
## from Priyanka_resp_fits_xy_measurements_CALCULATED.ods measured using imagej
Priyanka_sqrtR2Ns = [0.6434834828,0.8345060122,1.0775429321,0.9184755103,0.5617743816,\
0.9951396655,0.9524784277,0.8871217591,1.0978010014,0.9840340849,0.9774409973,\
0.8435189615,0.8145737706,0.7257902014,0.51483604,0.3591452397,0.4256076386,\
0.4895118111,0.7157424823,0.7781404064,1.2538144314,1.6401905231,0.907039066]
fig_resp = figure(figsize=(columnwidth/3.0,linfig_height/2.0),dpi=300,facecolor='w')
ax = fig_resp.add_subplot(111)
hist_bins = arange(0.0,2.01,0.05)
ax.hist(clip(Priyanka_sqrtR2Ns,0,2),\
hist_bins,normed=True,edgecolor='b',facecolor='b')
xmin,xmax,ymin,ymax = \
beautify_plot(ax,x0min=True,y0min=True,xticksposn='bottom',yticksposn='left')
## axes_labels() sets sizes of tick labels too.
axes_labels(ax,'$\sqrt{residual/noise}$','prob. density',adjustpos=False,xpad=1,ypad=4)
ax.set_xlim([0,2])
ax.set_ylim([0,ymax])
ax.set_xticks([0,1,2])
ax.set_yticks([0,ymax])
fig_clip_off(fig_resp)
fig_resp.tight_layout()
fig_resp.subplots_adjust(right=0.85)
if SAVEFIG:
fig_resp.savefig('../figures/Priyanka_respstats.svg',dpi=fig_resp.dpi)
fig_resp.savefig('../figures/Priyanka_respstats.png',dpi=fig_resp.dpi)
if __name__ == "__main__":
if 'SAVEFIG' in sys.argv: SAVEFIG = True
else: SAVEFIG = False
#plot_kernels(graph=False)
## below two functions fit the results file and
## create the _params files if they don't exist
## plot all statistics using below function:
#plot_all_stats() # older with chi-sq, and nolat.
## PAPER FIGURE: plot the sqrt(S/R) vs sqrt(S/N) for fits, A+Bs, resp.: OLD
## PAPER FIGURE 5: Now this plots R2N histogram for fits and A+Bs.
plot_all_stats_paperfigure()
## PAPER FIGURE 6: non-linear mitral i-o curve gives non-linear random pulse preds
#plot_mitioNL_stats_paperfigure()
## plot goodness of fits with parts of the network removed / tweaked
## No longer a paper figure -- use average_odor_scaledpulses_noregress.py for Suppl. Fig.
#plot_lin_contribs_paperfigure() # old paper figure -- now use average_odor_scaledpulses_noregress.py
## PAPER SUPPL FIGURE 2: 1x and 2x fits and preds of random pulses
#plot_1x2x_stats_papersupplfigure()
## PAPER SUPPL FIGURE 2: Correlation of kernels 1x vs 2x and odor A vs odor B (control).
#plot_kernelscorr_vs_conc_papersupplfigure()
## PAPER SUPPL FIGURE 3: resp preds of Priyanka using half-exhalation (the best ones)
#Priyanka_expmnt_resp_fits()
## Priyanka style example plots:
#plot_scaled_kernels()
#plot_scaled_kernels_special()
show()