Sensory-evoked responses of L5 pyramidal tract neurons (Egger et al 2020)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:239145
This is the L5 pyramidal tract neuron (L5PT) model from Egger, Narayanan et al., Neuron 2020. It allows investigating how synaptic inputs evoked by different sensory stimuli are integrated by the complex intrinsic properties of L5PTs. The model is constrained by anatomical measurements of the subcellular synaptic input patterns to L5PT neurons, in vivo measurements of sensory-evoked responses of different populations of neurons providing these synaptic inputs, and in vitro measurements constraining the biophysical properties of the soma, dendrites and axon (note: the biophysical model is based on the work by Hay et al., Plos Comp Biol 2011). The model files provided here allow performing simulations and analyses presented in Figures 3, 4 and 5.
Reference:
1 . Egger R, Narayanan RT, Guest JM, Bast A, Udvary D, Messore LF, Das S, de Kock CP, Oberlaender M (2020) Cortical Output Is Gated by Horizontally Projecting Neurons in the Deep Layers Neuron
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Dendrite; Realistic Network; Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L5/6 pyramidal GLU cell;
Channel(s): I Calcium; I h; I M; I K; I Na,t; I Na,p; I K,Ca;
Gap Junctions:
Receptor(s): AMPA; GabaA; NMDA;
Gene(s):
Transmitter(s): Glutamate; Gaba;
Simulation Environment: NEURON; Python;
Model Concept(s): Active Dendrites; Detailed Neuronal Models; Sensory processing; Stimulus selectivity; Synaptic Integration;
Implementer(s): Egger, Robert [robert.egger at nyumc.org];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; GabaA; AMPA; NMDA; I Na,p; I Na,t; I K; I M; I h; I K,Ca; I Calcium; Gaba; Glutamate;
'''
Created on Mar 19, 2012

@author: robert
'''

import numpy as np
#import matplotlib.pyplot as plt
import neuron
import cell_parser
import reader
import synapse_mapper as smap

class SimControl(object):
    '''
    Objects of this class control a current clamp simulation. Example of use:
      >>> cell = CellParser()
      >>> sim = SimControl(cell=cell.get_cell())
      >>> sim.go()
      >>> sim.show()
    '''


    def __init__(self, cell=None, sim_time=5, dt=0.001, T=37):
        '''
        Constructor
        '''
        self.cell = cell
        self.simTime = sim_time
        self.dt = dt
        self.T = T
        self.goAlready = False
        self.h = neuron.h
        
    def set_IClamp(self, delay=1, amp=-1, dur=3):
        """
        Initializes values for current clamp.
        
        Default values:
          
          delay = 1 [ms]
          amp   = -1 [nA]
          dur   = 3 [ms]
        """
        stim = self.h.IClamp(self.cell.neuronTree.soma.hocSec(0.5))
        stim.delay = delay
        stim.amp = amp
        stim.dur = dur
        self.stim = stim
        
    def show(self):
        if self.go_already:
            x = np.array(self.rec_t)
            y = np.array(self.rec_v)
            plt.plot(x, y)
            plt.title("1st spike")
            plt.xlabel("Time [ms]")
            plt.ylabel("Voltage [mV]")
            plt.axis(xmin=0, xmax=self.simTime, ymin=-80, ymax=60)
            plt.show()
        else:
            print("""First you have to `go()` the simulation.""")
        
    def set_recording(self):
        # Record Time
        self.rec_t = self.h.Vector()
        self.rec_t.record(self.h._ref_t)
        # Record Voltage
        self.rec_v = self.h.Vector()
        self.rec_v.record(self.cell.soma(0.5)._ref_v)
        
    def go(self, simTime=None):
        self.set_recording()
        self.h.celsius = self.T
        print 'Temperature = %d' % int(self.h.celsius)
#        self.h.dt = self.dt
        self.cvode = self.h.CVode()
        self.cvode.active()
        self.h.finitialize(self.cell.E)
        neuron.init()
        if simTime:
            neuron.run(simTime)
        else:
            neuron.run(self.simTime)
        self.go_already = True
        
    
if __name__ == '__main__':
#    fname = 'test_morphology.hoc'
    fname = '93_CDK080806_marcel_3x3_registered_zZeroBarrel.hoc.am-14678.hoc'
    testParser = cell_parser.CellParser(fname)
    testParser.spatialgraph_to_cell()
    testParser.spatialgraph_to_hoc(['Soma', 'Dendrite', 'ApicalDendrite'])
    testParser.spatialgraph_to_hoc(['Axon'])
    testParser.insert_passive_membrane('Soma')
    testParser.insert_passive_membrane('Dendrite')
    testParser.insert_passive_membrane('ApicalDendrite')
    testParser.insert_passive_membrane('Axon')
    testParser.insert_hh_membrane('Soma')
    testParser.insert_hh_membrane('Dendrite')
    testParser.insert_hh_membrane('ApicalDendrite')
    testParser.insert_hh_membrane('Axon')
    
    synapseFName = 'SynapseCount.14678.am'
    synDist = reader.read_scalar_field(synapseFName)
    mapper = smap.SynapseMapper(testParser.cell, synDist)
    mapper.create_synapses('VPM')
    
#    quick test of synapse activation
    mech_str = '/Users/robert/neuron/nrn-7.2/share/examples/nrniv/netcon/i386/.libs/libnrnmech.so'
    load_flag = neuron.h.nrn_load_dll(mech_str)
    if not load_flag:
        err_str = 'Failed to load NMODL mechanism from ' + mech_str
        raise RuntimeError(err_str)
    tvec = neuron.h.Vector([10.0])
    vs = neuron.h.VecStim()
    vs.play(tvec)
    
    for syn in testParser.cell.synapses['VPM']:
        syn.activate_hoc_syn(vs, testParser.cell, weight=0.002)
    
    sim = SimControl(cell=testParser.get_cell(), sim_time=100, dt=0.01)
#    sim.set_IClamp(delay=3.0, amp=1.1, dur=95)
    sim.go()
    sim.show()