Shaping NMDA spikes by timed synaptic inhibition on L5PC (Doron et al. 2017)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:231427
This work (published in "Timed synaptic inhibition shapes NMDA spikes, influencing local dendritic processing and global I/O properties of cortical neurons", Doron et al, Cell Reports, 2017), examines the effect of timed inhibition over dendritic NMDA spikes on L5PC (Based on Hay et al., 2011) and CA1 cell (Based on Grunditz et al. 2008 and Golding et al. 2001).
Reference:
1 . Doron M, Chindemi G, Muller E, Markram H, Segev I (2017) Timed Synaptic Inhibition Shapes NMDA Spikes, Influencing Local Dendritic Processing and Global I/O Properties of Cortical Neurons. Cell Rep 21:1550-1561 [PubMed]
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: Neocortex;
Cell Type(s): Neocortex V1 L6 pyramidal corticothalamic GLU cell;
Channel(s): I Na,p; I Na,t; I L high threshold; I T low threshold; I A; I M; I h; I K,Ca; I Calcium; I A, slow;
Gap Junctions:
Receptor(s): NMDA; GabaA; AMPA;
Gene(s):
Transmitter(s): Glutamate; Gaba;
Simulation Environment: NEURON;
Model Concept(s): Active Dendrites; Detailed Neuronal Models;
Implementer(s): Doron, Michael [michael.doron at mail.huji.ac.il];
Search NeuronDB for information about:  Neocortex V1 L6 pyramidal corticothalamic GLU cell; GabaA; AMPA; NMDA; I Na,p; I Na,t; I L high threshold; I T low threshold; I A; I M; I h; I K,Ca; I Calcium; I A, slow; Gaba; Glutamate;
/
reproduction
readme.txt
ampa.mod
Ca_HVA.mod
Ca_LVAst.mod *
cad.mod *
cadiffus.mod
CaDynamics_E2.mod *
canmda.mod *
car.mod *
gabaa.mod *
gabab.mod *
Ih.mod *
Im.mod *
K_Pst.mod *
K_Tst.mod *
Nap_Et2.mod *
NaTa_t.mod *
NaTs2_t.mod *
nmda.mod *
ProbAMPA.mod
ProbAMPANMDA2_ratio.mod
ProbUDFsyn2_lark.mod
SK_E2.mod *
SKv3_1.mod *
SynExp5NMDA.mod *
cell1.asc *
cellmorphology.hoc *
create_data_for_figure_01.py
create_data_for_figure_02.py
create_data_for_figure_03.py *
create_data_for_figure_03_control.py
create_data_for_figure_03_Dt_10.py *
create_data_for_figure_03_Dt_40.py *
data_same_excitation.pickle
iniparameter.hoc
L5PCbiophys3.hoc
L5PCbiophys3_noActive.hoc
mosinit.hoc
plot_figure_01.py
plot_figure_02.py
plot_figure_03.py
plot_figure_04.py
plot_figure_05.py
plot_figure_06.py
spikes_num.pickle
spine.hoc
TTC.hoc
                            
#!/usr/bin/python

## A point neuron model for testing inhibition on NMDA spikes

import matplotlib
matplotlib.use('Agg')
from neuron import h
from neuron import gui
import matplotlib.pyplot as plt
import numpy as np
import sys
import pickle
import time
import os

dt = 0.025
voltages = (np.array(np.linspace(-90,0,901)) / 1.0);
depolarStrength = 0.007
depolarLength = 1
hyperStrength = 0.0015
hyperLength = 1
shift = 10
recordingTimings = range(int(80 / dt), int(250 / dt), int(0.025 / dt))
fixedPointColors = ['blue','green','red']
finalStop = 300
timeAfterClamp = 0.1 / dt

startTime = time.time()
h.load_file("nrngui.hoc")

h.tstop = finalStop
h.dt = dt;
h.v_init = -80 
timeDiff = 40;

h("create soma")
h("access soma")
h("nseg = 1")
h("L = 20")
h("diam = 20")
h("insert pas")
h("cm = 1")
h("Ra = 100")
h("cm = 1")
h("forall nseg = 1")
h("forall e_pas = -80")
h("objref resistanceVector")
h("objref eSynlist, ePreconlist, iPreconlist, eStimlist, iStimlist, iSynlist, iclamp, voltageClamp, resistanceVector")
h("g_pas = 0.00005")


h.voltageClamp = h.SEClamp(0.5)
h.iclamp = h.IClamp(0.5)
eSynlist = []
ePreconlist = []
iPreconlist = []
eStimlist = []
iStimlist = []
iSynlist = []
h.resistanceVector = h.Vector(int(h.tstop/h.dt))


def placeGABA(location):
  iStimlist.append(h.NetStim())
  iStimlist[-1].interval = 1
  iStimlist[-1].number = 1
  iStimlist[-1].start = 100
  iStimlist[-1].noise = 0                   
  
  iSynlist.append(h.ProbUDFsyn2_lark(location))
  iSynlist[-1].tau_r = 0.18
  iSynlist[-1].tau_d = 5
  iSynlist[-1].e = - 80
  iSynlist[-1].Dep = 0
  iSynlist[-1].Fac = 0
  iSynlist[-1].Use = 0.6
  iSynlist[-1].u0 = 0
  iSynlist[-1].gmax = 0
  
  iPreconlist.append(h.NetCon(iStimlist[-1], iSynlist[-1]))
  iPreconlist[-1].weight[0] = 1
  iPreconlist[-1].delay = 0


def placeNMDA(location):
  eStimlist.append(h.NetStim())
  eStimlist[-1].interval = 1
  eStimlist[-1].number = 1
  eStimlist[-1].start = 100
  eStimlist[-1].noise = 0
  eSynlist.append(h.ProbAMPANMDA2_RATIO(location))
  eSynlist[-1].gmax = 0
  eSynlist[-1].mgVoltageCoeff = 0.08
  
  ePreconlist.append(h.NetCon(eStimlist[-1], eSynlist[-1]))
  ePreconlist[-1].weight[0] = 1
  ePreconlist[-1].delay = 0
  

placeNMDA(0.5)
placeGABA(0.5)


def IVCurveAtTime(depolarStrength, depolarLength, hyperStrength, hyperLength, shift, recordingTiming):
  recordingTimingInMilliseconds = recordingTiming * h.dt
  recordingTimingInInds = recordingTiming
  h.voltageClamp.dur1 = 10000000
  h.voltageClamp.rs = 0.0000001
  res = {'vclamp' : {},'NMDA' : {},'AMPA' : {},'PAS' : {},'GABA' : {},'CAP' : {}}
  tVector = np.zeros(h.tstop / h.dt)
  timeStart = time.time()
  res['vclamp'][recordingTimingInInds] = {}
  res['CAP'][recordingTimingInInds] = {}
  res['NMDA'][recordingTimingInInds] = {}
  res['AMPA'][recordingTimingInInds] = {}
  res['PAS'][recordingTimingInInds] = {}
  res['GABA'][recordingTimingInInds] = {}
  for j in xrange(int(h.tstop / h.dt)-1):   
    h.resistanceVector.x[j] = 1e9
  
  for j in np.arange(recordingTimingInInds, len(tVector), 1):   
    h.resistanceVector.x[int(j)] = 0.0000001
  
  eSynlist[-1].gmax = depolarStrength
  iSynlist[-1].gmax = hyperStrength
  iStimlist[-1].start = eStimlist[-1].start + shift
  
  h("resistanceVector.play_remove()")
  h("resistanceVector.play(&voltageClamp.rs, dt)")      
  for voltage in voltages:
    neuronNMDAVectors = {'vclamp' : h.Vector(), 'NMDA' : h.Vector(), 'AMPA' : h.Vector(), 'PAS' : h.Vector(), 'GABA' : h.Vector(), 'CAP' : h.Vector()}
    vecNMDA = {'vclamp' : [], 'NMDA' : [], 'AMPA' : [], 'PAS' : [], 'GABA' : [], 'CAP' : []}
    neuronNMDAVectors['vclamp'].record(h.voltageClamp._ref_i)
    neuronNMDAVectors['GABA'].record(iSynlist[-1]._ref_i)
    neuronNMDAVectors['AMPA'].record(eSynlist[-1]._ref_i_AMPA)
    neuronNMDAVectors['NMDA'].record(eSynlist[-1]._ref_i_NMDA)
    neuronNMDAVectors['PAS'].record(h.soma(0.5)._ref_i_pas)
    neuronNMDAVectors['CAP'].record(h.soma(0.5)._ref_i_cap)
    h.voltageClamp.amp1 = voltage
    h.tstop = ((recordingTimingInInds + timeAfterClamp + 1) * h.dt)
    h.run()
    res['vclamp'][recordingTimingInInds][voltage] = {}
    res['GABA'][recordingTimingInInds][voltage] = {}
    res['NMDA'][recordingTimingInInds][voltage] = {}
    res['AMPA'][recordingTimingInInds][voltage] = {}
    res['PAS'][recordingTimingInInds][voltage] = {}
    res['CAP'][recordingTimingInInds][voltage] = {}
    for key in vecNMDA.keys():
      if key == 'vclamp': 
        vecNMDA[key].append(h.Vector())
        vecNMDA[key][-1].copy(neuronNMDAVectors[key])
        res['vclamp'][recordingTimingInInds][voltage] = np.array(vecNMDA[key][-1])[recordingTimingInInds + timeAfterClamp]
      elif key == 'NMDA': 
        vecNMDA[key].append(h.Vector())
        vecNMDA[key][-1].copy(neuronNMDAVectors[key])   
        res['NMDA'][recordingTimingInInds][voltage] =  (np.array(vecNMDA[key][-1]))[recordingTimingInInds + timeAfterClamp]
      elif key == 'AMPA': 
        vecNMDA[key].append(h.Vector())
        vecNMDA[key][-1].copy(neuronNMDAVectors[key])   
        res['AMPA'][recordingTimingInInds][voltage] =  (np.array(vecNMDA[key][-1]))[recordingTimingInInds + timeAfterClamp]
      elif key == 'PAS': 
        vecNMDA[key].append(h.Vector())
        vecNMDA[key][-1].copy(neuronNMDAVectors[key])   
        res['PAS'][recordingTimingInInds][voltage] =  (np.array(vecNMDA[key][-1]) * h.area(0.5) / 100.0)[recordingTimingInInds + timeAfterClamp]
      elif key == 'GABA': 
        vecNMDA[key].append(h.Vector())
        vecNMDA[key][-1].copy(neuronNMDAVectors[key])   
        res['GABA'][recordingTimingInInds][voltage] =  (np.array(vecNMDA[key][-1]))[recordingTimingInInds + timeAfterClamp]
      elif key == 'CAP': 
        vecNMDA[key].append(h.Vector())
        vecNMDA[key][-1].copy(neuronNMDAVectors[key])   
        res['CAP'][recordingTimingInInds][voltage] =  (np.array(vecNMDA[key][-1]) * h.area(0.5) / 100.0)[recordingTimingInInds - 1]
             
  h.tstop = finalStop
  for j in xrange(int(h.tstop / h.dt)):   
    h.resistanceVector.x[j] = 1e9
  
  h("resistanceVector.play_remove()")
  h("resistanceVector.play(&voltageClamp.rs, dt)")
  
  neuronRealVectors = {'voltage' : h.Vector(), 'NMDA_total' : h.Vector(), 'AMPA_total' : h.Vector(), 'pas_total' : h.Vector(), 'cap_total' : h.Vector(), 'GABA_total' : h.Vector(), 'time' : h.Vector()}
  vecReal = {'voltage' : [], 'NMDA_total' : [], 'AMPA_total' : [], 'GABA_total' : [], 'pas_total' : [], 'cap_total' : [], 'time' : []}
  neuronRealVectors['voltage'].record(h.soma(0.5)._ref_v)
  neuronRealVectors['GABA_total'].record(iSynlist[-1]._ref_i)  
  neuronRealVectors['NMDA_total'].record(eSynlist[-1]._ref_i_NMDA)  
  neuronRealVectors['AMPA_total'].record(eSynlist[-1]._ref_i_AMPA)  
  neuronRealVectors['pas_total'].record(h.soma(0.5)._ref_i_pas)
  neuronRealVectors['cap_total'].record(h.soma(0.5)._ref_i_cap)
  neuronRealVectors['time'].record(h._ref_t)  
  h.run()
  vecReal['voltage'].append(h.Vector())
  vecReal['voltage'][-1].copy(neuronRealVectors['voltage'])
  res['voltage'] = np.array(vecReal['voltage'][-1])
  
  vecReal['NMDA_total'].append(h.Vector())
  vecReal['NMDA_total'][-1].copy(neuronRealVectors['NMDA_total'])
  res['NMDA_total'] = np.array(vecReal['NMDA_total'][-1])
  
  vecReal['AMPA_total'].append(h.Vector())
  vecReal['AMPA_total'][-1].copy(neuronRealVectors['AMPA_total'])
  res['AMPA_total'] = np.array(vecReal['AMPA_total'][-1])
  
  vecReal['GABA_total'].append(h.Vector())
  vecReal['GABA_total'][-1].copy(neuronRealVectors['GABA_total'])
  res['GABA_total'] = np.array(vecReal['GABA_total'][-1])
    
  vecReal['pas_total'].append(h.Vector())
  vecReal['pas_total'][-1].copy(neuronRealVectors['pas_total'])
  res['pas_total'] = np.array(vecReal['pas_total'][-1]) * h.area(0.5) / 100.0
  
  vecReal['cap_total'].append(h.Vector())
  vecReal['cap_total'][-1].copy(neuronRealVectors['cap_total'])
  res['cap_total'] = np.array(vecReal['cap_total'][-1]) * h.area(0.5) / 100.0
    
  vecReal['time'].append(h.Vector())
  vecReal['time'][-1].copy(neuronRealVectors['time'])
  res['time'] = np.array(vecReal['time'][-1])
  
  valuesOverTime = {'VOLTAGE' : res['voltage'], 'NMDA' : res['NMDA_total'], 'AMPA' : res['AMPA_total'], 'GABA' : res['GABA_total'], 'PAS' : res['pas_total'], 'CAP' : res['cap_total'], 'TIME' : res['time']}
  valuesOverVoltage = {'NMDA' : res['NMDA'], 'AMPA' : res['AMPA'], 'GABA' : res['GABA'], 'PAS' : res['PAS'], 'CAP' : res['CAP'], 'vclamp' : res['vclamp']}
  timeEnd = time.time()
  print 'recorded values for time %f in %f seconds' % (recordingTimingInMilliseconds, timeEnd - timeStart)
  return (valuesOverTime, valuesOverVoltage)



valuesOverTime = {}
valuesOverVoltage = {}

for recordingTiming in recordingTimings:
  (overTime, overVoltage) = IVCurveAtTime(depolarStrength, depolarLength, hyperStrength, hyperLength, shift, recordingTiming)
  for key in overTime:
    valuesOverTime[key] = overTime[key]
  for key in overVoltage:
    if (key not in valuesOverVoltage.keys()):
      valuesOverVoltage[key] = {}
    valuesOverVoltage[key][recordingTiming] = []
    for voltage in sorted(voltages):
      valuesOverVoltage[key][recordingTiming].append(overVoltage[key][recordingTiming][voltage])

filename = 'results_for_depolarStrength_%f_hyperStrength_%f_shift_%f.pickle' % (depolarStrength, hyperStrength, shift)
pickle.dump((valuesOverTime, valuesOverVoltage), open(filename, 'wb'),protocol=2)

Loading data, please wait...