Goldfish Mauthner cell (Medan et al 2017)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:189308
" ...In fish, evasion of a diving bird that breaks the water surface depends on integrating visual and auditory stimuli with very different characteristics. How do neurons process such differential sensory inputs at the dendritic level? For that we studied the Mauthner-cells (M-cells) in the goldfish startle circuit, which receive visual and auditory inputs via two separate dendrites, both accessible for in vivo recordings. We asked if electrophysiological membrane properties and dendrite morphology, studied in vivo, play a role in selective sensory processing in the M-cell. Our results show that anatomical and electrophysiological differences between the dendrites combine to produce stronger attenuation of visually evoked post synaptic potentials (PSPs) than to auditory evoked PSPs. Interestingly, our recordings showed also cross-modal dendritic interaction, as auditory evoked PSPs invade the ventral dendrite (VD) as well as the opposite, visual PSPs invade the lateral dendrite (LD). However, these interactions were asymmetrical with auditory PSPs being more prominent in the VD than visual PSPs in the LD. Modelling experiments imply that this asymmetry is caused by active conductances expressed in the proximal segments of the VD. ..."
Reference:
1 . Medan V, Mäki-Marttunen T, Sztarker J, Preuss T (2018) Differential processing in modality-specific Mauthner cell dendrites. J Physiol 596:667-689 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Goldfish;
Cell Type(s): Mauthner cell;
Channel(s): I Sodium; I Potassium;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; Python;
Model Concept(s): Sensory processing;
Implementer(s): Maki-Marttunen, Tuomo [tuomomm at uio.no];
Search NeuronDB for information about:  I Sodium; I Potassium;
# A script that runs the simulations with the dendritic stimulations (active dendrites) using
# various values for active conductances, fits the maximal membrane potential along the dendrites
# to an exponential decay and analyzes the results. Both dendrites are active and have a constant
# value for the active conductances along the dendrites.
# The script plots two figures:
# decays_robustness_activeL.eps:
#   Plots the obtained exponential decay constants for each ventral and lateral conductance value.
#   These data were not plotted in the paper but may help to understand the results.
# decay_orders_robustness_activeL.eps
#   Plots the order of decay constants between the two cases (orthodromic vs antidromic).
#   Corresponds to Figure 9B.
# Tuomo Maki-Marttunen, 2013-2017 (CC-BY 4.0)

import mcell_activedend_varycoeffs_activeL as mcell
from pylab import *
from neuron import h
import numpy.matlib
import pickle
import time
from os.path import exists

params = [ 0.008692502978958,  9.033350623275275,  4.380690156620405, -83.399741825852217,  0.000204081169084, -55.832300314690642, -67.436819173866425,  8.100021281440229,  9.559735981936562,  0.020391367006446,  1.412486203424452, -63.999689527874885,  6.046642114148621,  0.170597469041809 ] #(THE BEST ONE FOR ACTIVE VENTRAL DENDRITE)

stimbranches = ['lateral','ventral']
close("all")
f,axarr = subplots(1,2)
cols = ['#800000','#000080'][::-1]
linecols = ['#FF0000','#0000FF'][::-1]

# The variables 'cond_Ls' and 'cond_Vs' define the parameter space where the effect of the values of active conductances along the lateral and ventral dendrites is analyzed.
# The variable 'coeffs' will determine the active conductances along the dendrites. The first compartment ("dend[20]", i.e. previously passive AIS between soma and active AIS) is set
# the conductances such that Na+ channel conductance is coeffs[0]*(Na+ conductance at active AIS) and K+ channel conductance is coeffs[0]*(K+ conductance at active AIS). In a similar
# manner, the following compartments along the main branch of ventral dendrite until the end of the ventral dendrite ("soma", "dend[21]", "dend[25]", "dend[27]", "dend[29]") receive
# values that are scaled by coeffs[1-5] from the values at active AIS. Likewise, the compartments along the main branch of lateral dendrite ("dend[19]", "dend[17]", "dend[0]",
# "dend[4]", "dend[8]","dend[10]", "dend[16]") receive values that are scaled by coeffs[6-12] from the values at active AIS. Here, the values of 'coeffs' are constant within ventral
# dendrite (except the last compartment which is zero) and another constant within lateral dendrite (except the last compartment which is zero).
cond_Ls = [0.0+0.00125*i for i in range(0,41)] 
cond_Vs = [0.0+0.0025*i for i in range(0,51)]
amps = [0.5,1,1.5,2,2.5,3,4,5]

if exists('activedend_decays_varyconds_activeL.sav'): # If the result file already exists, use it.
 unpicklefile = open('activedend_decays_varyconds_activeL.sav', 'r')
 unpickledlist = pickle.load(unpicklefile)
 unpicklefile.close()
 cond_Ls = unpickledlist[0]
 cond_Vs = unpickledlist[1]
 cMs_all = unpickledlist[2]
 maxVs_all = unpickledlist[3]
 cMsA_all = unpickledlist[4]
 maxVsA_all = unpickledlist[5]
else: # Simulate the model for all combinations of the cond_Ls and cond_Vs and save the data in the result file
 cMs_all = []
 maxVs_all = []
 for icond_L in range(0,len(cond_Ls)):
  cMs_thiscond_L = []
  maxVs_thiscond_L = []
  print "ORTHO: icond_L = "+str(icond_L)+"/"+str(len(cond_Ls))
  for icond_V in range(0,len(cond_Vs)):
   cMs_thiscond_V = []
   maxVs_thiscond_V = []
   for ibranch in range(0,len(stimbranches)):
     branch = stimbranches[ibranch]
     coeffs = [cond_Vs[icond_V] for i in range(0,5)]+[0.0]+[cond_Ls[icond_L] for i in range(0,6)]+[0.0]
     data = mcell.run_model_dendritic_stims(params, branch, 5, 50.0, amps, [16, 29], [1.0, 1.0], 15, ["dend[20]", "soma", "dend[21]", "dend[25]", "dend[27]", "dend[29]", "dend[19]", "dend[17]", "dend[0]", "dend[4]", "dend[8]","dend[10]", "dend[16]"], coeffs)

     times = data[0]
     Vrecs = data[1]
     dists = data[2]
     branches = data[3]

     cMs = []
     print "coeffs = "+str(coeffs)
     for iamp in range(0,len(amps)):
       XL = array([dists[iloc] for iloc in range(0,len(dists)) if dists[iloc] < 400 and branches[iloc]==ibranch or branches[iloc]==-1])
       XM = matrix(c_[np.matlib.repmat(XL,1,1).T, kron([1],ones([len(XL),])).T])
       YL = [array([max(Vrecs[iamp][iloc]) for iloc in range(0,len(dists)) if dists[iloc] < 400 and branches[iloc]==ibranch or branches[iloc]==-1])]
       YM = matrix(concatenate(YL)).T
       thiserr = inf
  
       Vappr = params[3]

       cM = inv(XM.T*XM)*XM.T*(log(YM-Vappr))
       thiserr = sum(sum(abs(YM-Vappr-exp(XM*cM))))
       cMs.append(cM[:])
     cMs_thiscond_V.append(cMs[:])
     maxVs_thiscond_V.append([max(Vrecs[i][30]) for i in range(0,len(amps))])
   cMs_thiscond_L.append(cMs_thiscond_V[:])
   maxVs_thiscond_L.append(maxVs_thiscond_V[:])
  cMs_all.append(cMs_thiscond_L[:])
  maxVs_all.append(maxVs_thiscond_L[:])

 cMsA_all = []
 maxVsA_all = []
 for icond_L in range(0,len(cond_Ls)):
  cMsA_thiscond_L = []
  maxVsA_thiscond_L = []
  print "ANTI: icond_L = "+str(icond_L)+"/"+str(len(cond_Ls))
  for icond_V in range(0,len(cond_Vs)):
   cMsA_thiscond_V = []
   maxVsA_thiscond_V = []

   stim = []
   for i in range(0,len(amps)):
     stim.append([5,55,amps[i]])
   coeffs = [cond_Vs[icond_V] for i in range(0,5)]+[0.0]+[cond_Ls[icond_L] for i in range(0,5)]+[0.0]
   data = mcell.run_model_somatic_stims(params, stim,[5.0, 10.0, 0], True, ["dend[20]", "soma", "dend[21]", "dend[25]", "dend[27]", "dend[29]", "dend[19]", "dend[17]", "dend[0]", "dend[4]", "dend[10]", "dend[16]"], coeffs)

   times = data[0]
   Vrecs = data[1]
   VrecsDend = data[2]
   dists = data[3]
   branches = data[4]

   for ibranch in range(0,2):
     cMs = []
     cMolds = []
     for iamp in range(0,len(amps)):
       XL = array([dists[iloc] for iloc in range(0,len(dists)) if dists[iloc] < 400 and branches[iloc]==ibranch or branches[iloc]==-1])
       XM = matrix(c_[np.matlib.repmat(XL,1,1).T, kron([1],ones([len(XL),])).T])
       YL = [array([max(VrecsDend[iamp][iloc]) for iloc in range(0,len(dists)) if dists[iloc] < 400 and branches[iloc]==ibranch or branches[iloc]==-1])]
       YM = matrix(concatenate(YL)).T
       thiserr = inf
  
       Vappr = params[3]

       cM = inv(XM.T*XM)*XM.T*(log(YM-Vappr))
       thiserr = sum(sum(abs(YM-Vappr-exp(XM*cM))))
       cM = cM
       cMs.append(cM[:])
     cMsA_thiscond_V.append(cMs[:])
   maxVsA_thiscond_L.append([max(VrecsDend[i][30]) for i in range(0,len(amps))])
   cMsA_thiscond_L.append(cMsA_thiscond_V[:])
  cMsA_all.append(cMsA_thiscond_L[:])
  maxVsA_all.append(maxVsA_thiscond_L[:])

 picklelist = [cond_Ls, cond_Vs, cMs_all, maxVs_all, cMsA_all, maxVsA_all]
 file = open('activedend_decays_varyconds_activeL.sav', 'w')
 pickle.dump(picklelist,file)
 file.close()

cMsL = [[[log(3.0)/cMs_all[i][j][0][k][0][0,0] for j in range(0,len(cMs_all[i]))] for i in range(0,len(cMs_all))] for k in range(0,len(amps))]
cMsV = [[[log(3.0)/cMs_all[i][j][1][k][0][0,0] for j in range(0,len(cMs_all[i]))] for i in range(0,len(cMs_all))] for k in range(0,len(amps))]
mcMsL = mean(array(cMsL),axis=0)
mcMsV = mean(array(cMsV),axis=0)

cMsAL = [[[-log(3.0)/cMsA_all[i][j][0][k][0][0,0] for j in range(0,len(cMsA_all[i]))] for i in range(0,len(cMsA_all))] for k in range(0,len(amps))]
cMsAV = [[[-log(3.0)/cMsA_all[i][j][1][k][0][0,0] for j in range(0,len(cMsA_all[i]))] for i in range(0,len(cMsA_all))] for k in range(0,len(amps))]
mcMsAL = mean(array(cMsAL),axis=0)
mcMsAV = mean(array(cMsAV),axis=0)

f,axarr = subplots(2,2)
a1 = axarr[0,0].imshow(mcMsL,extent=[min(cond_Vs),max(cond_Vs),min(cond_Ls),max(cond_Ls)],interpolation='nearest')
colorbar(a1,ax = axarr[0,0], orientation='horizontal')
axarr[0,0].set_title('Ortho, L')

a2 = axarr[0,1].imshow(mcMsV,extent=[min(cond_Vs),max(cond_Vs),min(cond_Ls),max(cond_Ls)],interpolation='nearest')
colorbar(a2,ax = axarr[0,1], orientation='horizontal')
axarr[0,1].set_title('Ortho, C')

a3 = axarr[1,0].imshow(mcMsAL,extent=[min(cond_Vs),max(cond_Vs),min(cond_Ls),max(cond_Ls)],interpolation='nearest')
colorbar(a3,ax = axarr[1,0], orientation='horizontal')
axarr[1,0].set_title('Anti, L')

a4 = axarr[1,1].imshow(mcMsAV,extent=[min(cond_Vs),max(cond_Vs),min(cond_Ls),max(cond_Ls)],interpolation='nearest')
colorbar(a4,ax = axarr[1,1], orientation='horizontal')
axarr[1,1].set_title('Anti, V')

f.savefig("decays_robustness_activeL.eps")


mask_chosen = zeros(array(cMsL[0]).shape)
mask_chosen[find(array(cond_Ls)==0.0)[0],find(array(cond_Vs)==0.035)[0]] = True
f,axarr = subplots(1,1)
data = (12*logical_and(greater(numpy.min(array(cMsL[1:]),axis=0),numpy.max(array(cMsV[1:]),axis=0)),greater(numpy.min(array(cMsAV[1:-2]),axis=0),numpy.max(array(cMsAL[1:-2]),axis=0))) + \
        7.5*logical_and(greater(numpy.min(array(cMsL[1:]),axis=0),numpy.max(array(cMsV[1:]),axis=0)),logical_not(greater(numpy.min(array(cMsAV[1:-2]),axis=0),numpy.max(array(cMsAL[1:-2]),axis=0)))) + \
        8*logical_and(logical_not(greater(numpy.min(array(cMsL[1:]),axis=0),numpy.max(array(cMsV[1:]),axis=0))),greater(numpy.min(array(cMsAV[1:-2]),axis=0),numpy.max(array(cMsAL[1:-2]),axis=0))) + \
        6*logical_and(logical_not(greater(numpy.min(array(cMsL[1:]),axis=0),numpy.max(array(cMsV[1:]),axis=0))),logical_not(greater(numpy.min(array(cMsAV[1:-2]),axis=0),numpy.max(array(cMsAL[1:-2]),axis=0)))) + \
        -0.5*logical_and(greater(numpy.min(array(cMsL[1:]),axis=0),numpy.max(array(cMsV[1:]),axis=0)),less(numpy.max(array(cMsAV[1:-2]),axis=0),numpy.min(array(cMsAL[1:-2]),axis=0))) + \
        0.5*logical_and(less(numpy.max(array(cMsL[1:]),axis=0),numpy.min(array(cMsV[1:]),axis=0)),greater(numpy.min(array(cMsAV[1:-2]),axis=0),numpy.max(array(cMsAL[1:-2]),axis=0))) \
        )*(1-mask_chosen)

data2 = zeros([2*x for x in data.shape])
for i in range(0,data.shape[0]):
  for j in range(0,data.shape[1]):
    if abs(data[i,j]-12) < 1e-7 or abs(data[i,j]-7.0) < 1e-7 or abs(data[i,j]-0) < 1e-7 or abs(data[i,j]-8.5) < 1e-7:
      data2[2*i:2*i+2,2*j:2*j+2] = data[i,j]
    elif abs(data[i,j]-7.5) < 1e-7:
      data2[2*i:2*i+2,2*j:2*j+2] = array([[7,12],[12,7]])
    elif abs(data[i,j]-8.0) < 1e-7:
      data2[2*i:2*i+2,2*j:2*j+2] = array([[12,8],[8,12]])
    elif abs(data[i,j]-6.5) < 1e-7 or abs(data[i,j]-6.0) < 1e-7:
      data2[2*i:2*i+2,2*j:2*j+2] = array([[7,8],[8,7]])
a3 = axarr.imshow(data2, extent=[min(cond_Vs),max(cond_Vs),max(cond_Ls),min(cond_Ls)],interpolation='nearest', cmap="hot")

axarr.set_ylim([0.0,0.05])
axarr.set_aspect('auto')
axarr.set_position([0.2,0.33,0.6,0.5])
axarr.set_xlabel('$c_{VD}$')
myyl = axarr.set_ylabel('$c_{LD}$')
myyl.set_rotation(0)
axnew = [0,0,0,0,0]
axnew[0] = f.add_axes([0.18, 0.19, 0.03, 0.03],axisbg='w')
axnew[1] = f.add_axes([0.18, 0.11, 0.03, 0.03],axisbg='w')
axnew[2] = f.add_axes([0.48, 0.19, 0.03, 0.03],axisbg='w')
axnew[3] = f.add_axes([0.48, 0.11, 0.03, 0.03],axisbg='w')
axnew[4] = f.add_axes([0.48, 0.03, 0.03, 0.03],axisbg='w')
a4 = axnew[0].imshow(array([[12,12],[12,12]]), interpolation='nearest', cmap="hot", vmin=0, vmax=12)
a4 = axnew[1].imshow(array([[7,7],[7,7]]), interpolation='nearest', cmap="hot", vmin=0, vmax=12)
a4 = axnew[2].imshow(array([[7,12],[12,7]]), interpolation='nearest', cmap="hot", vmin=0, vmax=12)
a4 = axnew[3].imshow(array([[12,8],[8,12]]), interpolation='nearest', cmap="hot", vmin=0, vmax=12)
a4 = axnew[4].imshow(array([[7,8],[8,7]]), interpolation='nearest', cmap="hot", vmin=0, vmax=12)
for ax in axnew:
  ax.set_xticks([])
  ax.set_yticks([])
axnew[0].text(4,2,'L(O) $>$ V(O), L(A) $<$ V(A)\nfor each amplitude',fontsize=10)
axnew[1].text(4,2,'L(O) $>$ V(O), L(A) $>$ L(A)\nfor each amplitude',fontsize=10)
axnew[2].text(4,2,'L(O) $>$ V(O) for each amplitude,\nL(A) $>$ V(A) for some amplitudes',fontsize=10)
axnew[3].text(4,2,'L(O) $<$ V(O) for some amplitudes,\nL(A) $<$ V(A) for each amplitude',fontsize=10)
axnew[4].text(4,2,'L(O) $<$ V(O) for some amplitudes,\nL(A) $>$ V(A) for some amplitudes',fontsize=10)
f.savefig("decay_orders_robustness_activeL.eps")