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 [tuomo.maki-marttunen at tut.fi];
Search NeuronDB for information about:  I Sodium; I Potassium;
# An example of the dimension-by-dimension parameter fitting.
# Tuomo Maki-Marttunen, 2013-2017 (CC-BY 4.0)

import scipy.io
from pylab import *
import minimizedimbydim
import mcell
import mytools


stims = [[5.0, 10.0, 10.], [5.0, 10.0, 30.], [5.0, 10.0, 50.], [5.0, 10.0, 70.], [5.0, 10.0, 90.], [5.0, 10.0, 190.], [5.0, 10.0, 170.], [5.0, 10.0, 150.], [5.0, 10.0, 140.], [5.0, 10.0, 130.], [5.0, 10.0, 110.], [5.0, 10.0, 100.], [5.0, 10.0, 20.], [5.0, 10.0, -20.], [5.0, 10.0, -50.], [5.0, 10.0, -70.]]
stimsR = [52.0, 72.0, 200.]
experimental_data = scipy.io.loadmat('experimental_data.mat')
experimental_spt = [mytools.spike_times(experimental_data['ts'].T[0], x, -62, inf) for x in experimental_data['medianVs'].T]+[mytools.spike_times(experimental_data['tsR'].T[0], experimental_data['medianVsR'].T[0], -62, inf)]

weight_ramp = 3
coeff_mV = 1./200
coeff_ms = 1./20

def objective_function(params_this,savefig=""):
  myparams = [0.0]*28
  myparams[0] = params_this[0] #0.008700000039526
  myparams[1] = params_this[1] #20.999999990461987
  myparams[2] = params_this[2] #15.289301400499159
  myparams[3] = params_this[3] #-83.400007934423883
  myparams[4] = params_this[4] #0.000300000004592
  myparams[5] = params_this[5] #-56.700000003615479
  myparams[6] = params_this[6] #-67.499999903453016
  myparams[7] = params_this[7] #8.100000020602771
  myparams[8] = params_this[8] #9.570002271582146
  myparams[9] = params_this[9] #0.017999999846640
  myparams[10] = params_this[10] #1.399997381068154
  myparams[11] = params_this[11] #-64.000000481147609
  myparams[12] = params_this[12] #6.060000000757244
  myparams[13] = params_this[13] #0.209992252219524
  return calc_error(myparams,savefig)

def calc_error(params_this,savefig=""):
  global stims, stimsR, experimental_data

  data = mcell.run_model_somatic_stims(params_this,stims,stimsR)
  times = data[0]
  Vrecs = data[1]

  errs = []
  for irun in range(0,len(times)):
    if irun == len(times)-1:
      tref = experimental_data['tsR'].T[0]
      vref = experimental_data['medianVsR'].T[0]
    else:
      tref = experimental_data['ts'].T[0]
      vref = experimental_data['medianVs'].T[irun]
    sptref = experimental_spt[irun]

    tthis = times[irun]
    vthis = Vrecs[irun]
    sptthis = mytools.spike_times(tthis, vthis, -62, inf)
    vthis = mytools.interpolate_extrapolate_constant(tthis,vthis,tref)

    meantracediff_this = 1.0*mean([abs(x-y) for x,y in zip(vthis, vref)])
    sp_N_err_this = abs((not len(sptthis))-(not len(sptref)))
    sp_t_err_this = 0
    if len(sptref) > 0:
      for ispike in range(0,min(len(sptthis),len(sptref))):
        sp_t_err_this = sp_t_err_this + min([abs(sptthis[ispike] - x) for x in sptref])

    if irun == len(times)-1:
      errs.append( weight_ramp * (coeff_mV * meantracediff_this + coeff_ms * sp_t_err_this + sp_N_err_this) )
    else:
      errs.append( coeff_mV * meantracediff_this + coeff_ms * sp_t_err_this + sp_N_err_this )

  if len(savefig) > 0:
    close("all")
    f,axs = subplots(1,2)
    for i in [0,1,2,3,4,11,12,13,14,15]:
      axs[0].plot(times[i],Vrecs[i],'b-')
      axs[0].plot(experimental_data['ts'].T[0],experimental_data['medianVs'].T[i],'r--')
    axs[1].plot(times[9],Vrecs[9],'b-')
    axs[1].plot(experimental_data['ts'].T[0],experimental_data['medianVs'].T[9],'r--')

    for i in range(0,2):
      axs[i].set_xlim([4,12])
      axs[i].set_xticks([5,7,9,11])
      axs[i].set_xticklabels(['0','2','4','6'])

    f.savefig(savefig)
  return sum(errs)

thrs = [ [0.002, 0.02],
         [0, 30],
         [0, 20],
         [-80, -90],
         [0.000, 0.01], #gleak_A
         [-60, -30],    #Voffa_Na
         [-70, -30],    #Voffa_K
         [6.0, 10.0],
         [7.0, 12.0],
         [0.015, 0.025],
         [1.0, 2.0],
         [-75, -25],    #Voffi_Na
         [4.0, 10.0],
         [0.1, 0.4]]

init_params = array([0.0087, 21., 15.2893, -83.4, 0.0003, -56.700000003615479, -67.499999939430012, 8.1, 9.57, 0.018, 1.399997369505575, -64, 6.06, 0.209992280912807])
init_error = objective_function(init_params,"init.eps")

params = minimizedimbydim.minimizedimbydim(lambda x: objective_function(x),array(thrs).T, init_params)
fitted_error = objective_function(params[0][0],"fitted.eps")
scipy.io.savemat('fitted.mat',{'params': params, 'init_params': init_params})