def make_NMDA( name ): if moose.exists( '/library/' + name ): return NMDA = moose.NMDAChan( '/library/' + name ) NMDA.Ek = 0.0 NMDA.tau1 = 20.0e-3 NMDA.tau2 = 20.0e-3 NMDA.Gbar = 5 * SOMA_A NMDA.CMg = 1.2 # [Mg]ext in mM NMDA.KMg_A = 1.0/0.28 NMDA.KMg_B = 1.0/62 NMDA.temperature = 300 # Temperature in Kelvin. NMDA.extCa = 1.5 # [Ca]ext in mM NMDA.intCa = 0.00008 # [Ca]int in mM NMDA.intCaScale = 1 # Scale factor from elec Ca units to mM NMDA.intCaOffset = 0.00008 # Basal [Ca]int in mM NMDA.condFraction = 0.02 # Fraction of conductance due to Ca addmsg1 = moose.Mstring( NMDA.path + '/addmsg1' ) addmsg1.value = '. ICaOut ../Ca_conc current' addmsg2 = moose.Mstring( NMDA.path + '/addmsg2' ) addmsg2.value = '../Ca_conc concOut . assignIntCa' sh = moose.SimpleSynHandler( NMDA.path + '/sh' ) moose.connect( sh, 'activationOut', NMDA, 'activation' ) sh.numSynapses = 1 sh.synapse[0].weight = 1 return NMDA
def transformNMDAR( path ): for i in moose.wildcardFind( path + "/##/#NMDA#[ISA!=NMDAChan]" ): chanpath = i.path pa = i.parent i.name = '_temp' if ( chanpath[-3:] == "[0]" ): chanpath = chanpath[:-3] nmdar = moose.NMDAChan( chanpath ) sh = moose.SimpleSynHandler( chanpath + '/sh' ) moose.connect( sh, 'activationOut', nmdar, 'activation' ) sh.numSynapses = 1 sh.synapse[0].weight = 1 nmdar.Ek = i.Ek nmdar.tau1 = i.tau1 nmdar.tau2 = i.tau2 nmdar.Gbar = i.Gbar nmdar.CMg = 12 nmdar.KMg_A = 1.0 / 0.28 nmdar.KMg_B = 1.0 / 62 nmdar.temperature = 300 nmdar.extCa = 1.5 nmdar.intCa = 0.00008 nmdar.intCaScale = 1 nmdar.intCaOffset = 0.00008 nmdar.condFraction = 0.02 moose.delete( i ) moose.connect( pa, 'channel', nmdar, 'channel' ) caconc = moose.wildcardFind( pa.path + '/#[ISA=CaConcBase]' ) if ( len( caconc ) < 1 ): print('no caconcs found on ', pa.path) else: moose.connect( nmdar, 'ICaOut', caconc[0], 'current' ) moose.connect( caconc[0], 'concOut', nmdar, 'assignIntCa' )
def create_synaptic_channel(name, Gbar, tau1, tau2, ek, synapse_count, delay, params=None): lib = moose.Neutral('/library') if not moose.exists( '/library') else moose.element('/library') if name == 'nmda': synchan = moose.NMDAChan(lib.path + '/' + name) try: synchan = set_nmda_magnesium_parameters(synchan, params) synchan = set_ghk_equation_factors(synchan, params) except: raise ValueError("No NMDA params provided") else: synchan = moose.SynChan(lib.path + '/' + name) synchan.Gbar = Gbar synchan.tau1 = tau1 synchan.tau2 = tau2 synchan.Ek = ek sh = create_synaptic_handle(synchan, synapse_count, delay) moose.connect(sh, 'activationOut', synchan, 'activation') return (synchan, sh)
def testNMDAChan(simtime=1.0, simdt=1e-5, plotdt=1e-5): context = moose.PyMooseBase.getContext() container = moose.Neutral('test_NMDA') soma_b = moose.Compartment('B', container) soma_b.Rm = 5.3e9 # GM = 2e-5 S/cm^2 soma_b.Cm = 8.4823001646924426e-12 # CM = 0.9 uF/cm^2 soma_b.Em = -65e-3 soma_b.initVm = -65e-3 soma_b.Ra = 282942.12 # RA = 250 Ohm-cm nmda = moose.NMDAChan('nmda', container) nmda.tau2 = 5e-3 nmda.tau1 = 130e-3 nmda.Gbar = 1e-9 nmda.saturation = 1e10 nmda.connect('channel', soma_b, 'channel') spikegen = moose.SpikeGen('spike', container) spikegen.threshold = 0.5 spikegen.connect('event', nmda, 'synapse') spikegen.refractT = 0.0 nmda.delay[0] = 1e-3 nmda.weight[0] = 1.0 pulsegen = moose.PulseGen('pulse', container) pulsegen.setCount(3) pulsegen.level[0] = 1.0 pulsegen.delay[0] = 10e-3 pulsegen.width[0] = 1e-3 pulsegen.level[1] = 1.0 pulsegen.delay[1] = 2e-3 pulsegen.width[1] = 1e-3 pulsegen.delay[2] = 1e9 pulsegen.connect('outputSrc', spikegen, 'Vm') data = moose.Neutral('data') vmB = moose.Table('Vm_B', data) vmB.stepMode = 3 vmB.connect('inputRequest', soma_b, 'Vm') pulse = moose.Table('pulse', data) pulse.stepMode = 3 pulse.connect('inputRequest', pulsegen, 'output') gNMDA = moose.Table('G', data) gNMDA.stepMode = 3 gNMDA.connect('inputRequest', nmda, 'Gk') context.setClock(0, simdt) context.setClock(1, simdt) context.setClock(2, simdt) context.setClock(3, plotdt) context.reset() context.step(simtime) # gNMDA.dumpFile('gNMDA.dat', False) # vmA.dumpFile('Va.dat', False) # vmB.dumpFile('Vb.dat', False) ts = np.linspace(0, simtime, len(gNMDA)) pylab.plot(ts, pulse) pylab.plot(ts, np.asarray(gNMDA) * 1e9, label='gNMDA') pylab.show() np.savetxt('../data/two_comp_nmda.plot', np.transpose(np.vstack((ts, vmB, gNMDA))))
def test_synintegration(filename, target_cell, source_type): sim = Simulation('synintegration') cell = SpinyStellate(SpinyStellate.prototype, sim.model.path + '/SpinyStellate') vm_table = cell.comp[cell.presyn].insertRecorder('Vm', 'Vm', sim.data) # Create a common spike gen object sp = moose.SpikeGen('spike', sim.model) sp.threshold = 0.0 sp.edgeTriggered = 1 sptab = moose.Table('spike', sim.data) sptab.stepMode = 3 sptab.connect('inputRequest', sp, 'state') (comp_indices, syntype, gbar, tau1, tau2, Ek, ) = \ get_syninfo(filename, target_cell, source_type) # Set up the synapses for ii in range(len(comp_indices)): print '%d\t%s\t%g\t%g\t%g\t%g' % (comp_indices[ii], syntype[ii], gbar[ii], tau1[ii], tau2[ii], Ek[ii]) comp = cell.comp[comp_indices[ii]] weight = 1.0 if syntype[ii] == 'nmda': chan = moose.NMDAChan('nmda_from_%s' % (source_type), comp) chan.MgConc = 1.5 weight = gbar[ii] else: chan = moose.SynChan('%s_from_%s' % (syntype[ii], source_type), comp) chan.Gbar = gbar[ii] chan.tau1 = tau1[ii] chan.tau2 = tau2[ii] chan.Ek = Ek[ii] comp.connect('channel', chan, 'channel') sp.connect('event', chan, 'synapse') count = chan.numSynapses if source_type == 'TCR': chan.delay[count-1] = 1e-3 # thalamocortical delay else: chan.delay[count-1] = 0.05e-3 # default delay chan.weight[count-1] = weight gktable = moose.Table('%s_%s_%s' % (cell.name, comp.name, chan.name), sim.data) gktable.stepMode = 3 gktable.connect('inputRequest', chan, 'Gk') pulsegen = moose.PulseGen('pulse', sim.model) pulsegen.firstDelay = 3.0 pulsegen.firstLevel = 1.0 pulsegen.firstWidth = 1e-3 pulsegen.trigMode = moose.FREE_RUN pulsegen.connect('outputSrc', sp, 'Vm') ptable = moose.Table('pulse', sim.data) ptable.stepMode = 3 ptable.connect('inputRequest', pulsegen, 'output') sim.schedule(simdt=1e-6, plotdt=1e-6) sim.run(10.0) sim.save_data_h5(filename.replace('network_', 'synintegration_'))
def synintegration2(filename, target_cell): raise NotImplementedError syntab = None netfile = h5.File(filename, 'r') syntab = netfile['network/synapse'][:] idx = np.char.startswith(syntab['dest'], target_cell) syntab = syntab[idx] sim = Simulation('synintegration') cell = SpinyStellate(SpinyStellate.prototype, sim.model.path + '/SpinyStellate') vm_table = cell.comp[cell.presyn].insertRecorder('Vm', 'Vm', sim.data) # Create a common spike gen object sp = moose.SpikeGen('spike', sim.model) sp.threshold = 0.0 sp.edgeTriggered = 1 sptab = moose.Table('spike', sim.data) sptab.stepMode = 3 sptab.connect('inputRequest', sp, 'state') for ii in range(len(syntab)): source = syntab['source'][ii].partition('/')[0] dest, compname = syntab['dest'][ii].split('/') if source == dest: print 'source = dest', source, filename continue comp_no = compname.split('_')[-1] comp = cell[int(comp_no)] weight = 1.0 if syntab['type'][ii] == 'nmda': chan = moose.NMDAChan('nmda_from_%s' % (source.split('_')[0]), comp) chan.MgConc = 1.5 weight = syntab['Gbar'][ii] else: chan = moose.SynChan('%s_from_%s' % (syntab['type'][ii], source.split('_')[0]), comp) chan.Gbar = syntab['Gbar'][ii] chan.tau1 = syntab['tau1'][ii] chan.tau2 = syntab['tau2'][ii] chan.Ek = syntab['Ek'][ii] comp.connect('channel', chan, 'channel') sp.connect('event', chan, 'synapse') count = chan.numSynapses if source_type == 'TCR': chan.delay[count-1] = 1e-3 # thalamocortical delay else: chan.delay[count-1] = 0.05e-3 # default delay chan.weight[count-1] = weight gktable = moose.Table('%s_%s_%s' % (cell.name, comp.name, chan.name), sim.data) gktable.stepMode = 3 gktable.connect('inputRequest', chan, 'Gk')
def makeSynapse(sg, comp, syntype, name, Ek, Gbar, tau1, tau2, delay=0.0): syn = None if syntype == 'nmda': syn = moose.NMDAChan(name, comp) else: syn = moose.SynChan(name, comp) syn.Ek = Ek syn.Gbar = Gbar syn.tau1 = tau1 syn.tau2 = tau2 comp.connect('channel', syn, 'channel') sg.threshold = 0.0 sg.absRefract = 0.0 if not sg.connect('event', syn, 'synapse'): raise Exception('Error creating connection: %s->%s' % (sg.path, syn.path)) return syn
def make_synchan(model, chanpath, synparams): # for AMPA or GABA - just make the channel, no connections/messages log.info('synparams: {} {}', chanpath, synparams) if synparams.NMDA: synchan = moose.NMDAChan(chanpath) else: synchan = moose.SynChan(chanpath) synchan.tau1 = synparams.tau1 synchan.tau2 = synparams.tau2 synchan.Ek = synparams.Erev #for NMDA, assign MgBlock parameters, and then parameters for calcium current using GHK if synparams.NMDA and synparams.MgBlock: synchan.KMg_A = synparams.MgBlock.A synchan.KMg_B = synparams.MgBlock.B synchan.CMg = synparams.MgBlock.C if (model.calYN): synchan.condFraction = synparams.nmdaCaFrac synchan.temperature = constants.celsius_to_kelvin(model.Temp) synchan.extCa = model.ConcOut return synchan
import moose import numpy as np from matplotlib import pyplot as plt from pprint import pprint # allows for one to see nested dictionaries clearer plt.ion() nmdachan = moose.NMDAChan('/nmda') moose.showfield(nmdachan) nmdachan.KMg_A = 0.17 nmdachan.KMg_B = 0.012 nmdachan.CMg = 1.4 # Function to plot and see magnesium effect on NMDA channel def magnesium_term(A, B, C): eta = 1.0 / A gamma = 1.0 / B v = np.linspace(-100e-3, 60e-3, 1000) # voltage vector mg_term = 1 / (1 + eta * C * np.exp(-gamma * v)) plt.plot(v, mg_term) synparams = {} mgparams = {'A': (1 / 6.0), 'B': (1 / 80.0), 'conc': 1.4} synparams['ampa'] = {'Erev': 5e-3, 'tau1': 1.0e-3, 'tau2': 5e-3, 'Gbar': 1e-9} synparams['nmda'] = { 'Erev': 5e-3, 'tau1': 1.1e-3, 'tau2': 37.5e-3, 'Gbar': 2e-9, 'mgparams': mgparams,
def addNMDA(comp, name): synchan = moose.NMDAChan(comp.path + "/" + name)
def testNMDAChan(simtime=1.0, simdt=1e-5, plotdt=1e-5): context = moose.PyMooseBase.getContext() container = moose.Neutral('test_NMDA') soma_a = moose.Compartment('A', container) soma_a.Rm = 5.3e9 # GM = 2e-5 S/cm^2 soma_a.Cm = 8.4823001646924426e-12 # CM = 0.9 uF/cm^2 soma_a.Em = -65e-3 soma_a.initVm = -65e-3 soma_a.Ra = 282942.12 soma_b = moose.Compartment('B', container) soma_b.Rm = 5.3e9 # GM = 2e-5 S/cm^2 soma_b.Cm = 8.4823001646924426e-12 # CM = 0.9 uF/cm^2 soma_b.Em = -65e-3 soma_b.initVm = -65e-3 soma_b.Ra = 282942.12 # RA = 250 Ohm-cm nmda = moose.NMDAChan('nmda', container) nmda.tau2 = 5e-3 nmda.tau1 = 130.5e-3 nmda.Gbar = 1 nmda.saturation = 1e10 nmda.connect('channel', soma_b, 'channel') spikegen = moose.SpikeGen('spike', container) spikegen.threshold = 0.0 soma_a.connect('VmSrc', spikegen, 'Vm') spikegen.connect('event', nmda, 'synapse') nmda.delay[0] = 0.05e-3 nmda.weight[0] = 0.25e-9 pulsegen = moose.PulseGen('pulse', container) pulsegen.firstLevel = 0.1e-9 pulsegen.firstDelay = 20e-3 pulsegen.firstWidth = 20e-3 pulsegen.secondDelay = 1e9 pulsegen.connect('outputSrc', soma_a, 'injectMsg') data = moose.Neutral('data') vmB = moose.Table('Vm_B', data) vmB.stepMode = 3 vmB.connect('inputRequest', soma_b, 'Vm') vmA = moose.Table('Vm_A', data) vmA.stepMode = 3 vmA.connect('inputRequest', soma_a, 'Vm') gNMDA = moose.Table('G', data) gNMDA.stepMode = 3 gNMDA.connect('inputRequest', nmda, 'Gk') context.setClock(0, simdt) context.setClock(1, simdt) context.setClock(2, simdt) context.setClock(3, plotdt) context.reset() context.step(simtime) # gNMDA.dumpFile('gNMDA.dat', False) # vmA.dumpFile('Va.dat', False) # vmB.dumpFile('Vb.dat', False) ts = np.linspace(0, simtime, len(gNMDA)) np.savetxt('../data/two_comp_nmda.plot', np.transpose(np.vstack((ts, vmA, vmB, gNMDA))))