123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- import os
- import sys
- import seaborn as sns
- from brian2 import defaultclock, units, StateMonitor
- from matplotlib import pyplot as plt
- from brian2.core.network import Network
- from dirDefs import homeFolder
- from models.neuronModels import VSNeuron, JOSpikes265, getSineInput
- from models.neurons import AdExp
- from models.synapses import exp2Syn, exp2SynStateInits
- from mplPars import mplPars
- from paramLists import synapsePropsList, inputParsList, AdExpPars
- from neo import AnalogSignal
- import nixio
- from neoNIXIO import addAnalogSignal2Block, addMultiTag
- import quantities as qu
- from brianUtils import addBrianQuantity2Section
- sns.set(style="whitegrid", rc=mplPars)
- simSettleTime = 600 * units.ms
- simStepSize = 0.1 * units.ms
- simDuration = 150 * units.ms
- # inputParsName = 'onePulse'
- # inputParsName = 'twoPulse'
- # inputParsName = 'threePulse'
- inputParsName = "thirtyMSPulse"
- # inputParsName = "fortyMSPulse"
- showBefore = 50 * units.ms
- showAfter = 50 * units.ms
- # simStepSize = 0.1 * units.ms
- # simDuration = 450 * units.ms
- # # inputParsName = "pTShortInt20Dur10"
- # # inputParsName = "pTShortInt20Dur16"
- # # inputParsName = "pTShortInt33Dur10"
- # # inputParsName = "pTShortInt33Dur16"
- # # inputParsName = "pTShortInt33Dur20"
- # # inputParsName = "pTShortInt50Dur10"
- # # inputParsName = "pTShortInt50Dur16"
- # # inputParsName = "pTShortInt50Dur20"
- # inputParsName = "pTShortInt100Dur10"
- # # inputParsName = "pTShortInt100Dur16"
- # # inputParsName = "pTShortInt100Dur20"
- #
- # showBefore = 100 * units.ms
- # showAfter = 100 * units.ms
- # simStepSize = 0.1 * units.ms
- # simDuration = 1500 * units.ms
- # # inputParsName = 'oneSecondPulse'
- # # inputParsName = 'pulseTrainInt20Dur10'
- # inputParsName = 'pulseTrainInt20Dur16'
- # # inputParsName = 'pulseTrainInt33Dur10'
- # # inputParsName = 'pulseTrainInt33Dur16'
- # showBefore = 500 * units.ms
- # showAfter = 500 * units.ms
- DLInt1ModelProps = "DLInt1Aynur"
- DLInt1SynapsePropsE = 'DLInt1_syn_try2_e'
- # DLInt1SynapsePropsE = ""
- DLInt1SynapsePropsI = 'DLInt1_syn_try2_i'
- # DLInt1SynapsePropsI = ""
- DLInt1SynapseProps = "".join((DLInt1SynapsePropsE, DLInt1SynapsePropsI))
- DLInt2ModelProps = "DLInt2Try2"
- DLInt2SynapseProps = 'DLInt2_syn_try2'
- DLInt1DLInt2SynProps = "DLInt1_DLInt2_try1"
- opDir = os.path.join(homeFolder, DLInt1ModelProps + DLInt2ModelProps,
- DLInt1SynapseProps + DLInt2SynapseProps + DLInt1DLInt2SynProps,
- inputParsName)
- opFileDLInt1 = os.path.join(opDir, 'SynCurrentTracesDLInt1.png')
- opFileDLInt2 = os.path.join(opDir, 'SynCurrentTracesDLInt2.png')
- OPNixFile = os.path.join(opDir, 'simResWithSynCurrents.h5')
- if os.path.isfile(OPNixFile):
- ch = input('Results already exist at {}. Delete?(y/n):'.format(OPNixFile))
- if ch == 'y':
- os.remove(OPNixFile)
- if os.path.isfile(opFileDLInt1):
- os.remove(opFileDLInt1)
- if os.path.isfile(opFileDLInt2):
- os.remove(opFileDLInt2)
- else:
- sys.exit('User Abort!')
- elif not os.path.isdir(opDir):
- os.makedirs(opDir)
- inputPars = getattr(inputParsList, inputParsName)
- net = Network()
- JO = JOSpikes265(nOutputs=1, simSettleTime=simSettleTime, **inputPars)
- net.add(JO.JOSGG)
- DLInt1PropsDict = getattr(AdExpPars, DLInt1ModelProps)
- dlint1 = VSNeuron(**AdExp, inits=DLInt1PropsDict, name='dlint1')
- dlint1.recordSpikes()
- dlint1.recordMembraneV()
- if DLInt1SynapsePropsE:
- synPropsEDLInt1 = getattr(synapsePropsList, DLInt1SynapsePropsE)
- dlint1.addSynapse(synName="ExiJO", sourceNG=JO.JOSGG, **exp2Syn,
- synParsInits=synPropsEDLInt1,
- synStateInits=exp2SynStateInits,
- sourceInd=0, destInd=0
- )
- if DLInt1SynapsePropsI:
- synPropsIDLInt1 = getattr(synapsePropsList, DLInt1SynapsePropsI)
- dlint1.addSynapse(synName="InhJO", sourceNG=JO.JOSGG, **exp2Syn,
- synParsInits=synPropsIDLInt1,
- synStateInits=exp2SynStateInits,
- sourceInd=0, destInd=0
- )
- dlint1.addToNetwork(net)
- if DLInt1SynapsePropsE:
- gEMonitorDLInt1 = StateMonitor(dlint1.incomingSynapses["ExiJO"], "g_ExiJO", record=True)
- net.add(gEMonitorDLInt1)
- if DLInt1SynapsePropsI:
- gIMonitorDLInt1 = StateMonitor(dlint1.incomingSynapses["InhJO"], "g_InhJO", record=True)
- net.add(gIMonitorDLInt1)
- DLInt2PropsDict = getattr(AdExpPars, DLInt2ModelProps)
- dlint2 = VSNeuron(**AdExp, inits=DLInt2PropsDict, name='dlint2')
- dlint2.recordMembraneV()
- dlint2.recordSpikes()
- if DLInt2SynapseProps:
- synPropsEDLInt2 = getattr(synapsePropsList, DLInt2SynapseProps)
- dlint2.addSynapse(synName="ExiJO", sourceNG=JO.JOSGG, **exp2Syn,
- synParsInits=synPropsEDLInt2,
- synStateInits=exp2SynStateInits,
- sourceInd=0, destInd=0
- )
- if DLInt1DLInt2SynProps:
- synPropsIDLInt2 = getattr(synapsePropsList, DLInt1DLInt2SynProps)
- dlint2.addSynapse(synName="DLInt1", sourceNG=dlint1.ng, **exp2Syn,
- synParsInits=synPropsIDLInt2,
- synStateInits=exp2SynStateInits,
- sourceInd=0, destInd=0
- )
- dlint2.addToNetwork(net)
- if DLInt2SynapseProps:
- gEMonitorDLInt2 = StateMonitor(dlint2.incomingSynapses["ExiJO"], "g_ExiJO", record=True)
- net.add(gEMonitorDLInt2)
- if DLInt1DLInt2SynProps:
- gIMonitorDLInt2 = StateMonitor(dlint2.incomingSynapses["DLInt1"], "g_DLInt1", record=True)
- net.add(gIMonitorDLInt2)
- defaultclock.dt = simStepSize
- totalSimDur = simDuration + simSettleTime
- net.run(totalSimDur, report='text')
- simT, DLInt2memV = dlint2.getMemVTrace()
- DLInt2spikeTimes = dlint2.getSpikes()
- dlint2MemVAS = AnalogSignal(signal=DLInt2memV / units.mV,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="mV",
- name="DLInt2 MemV")
- dlint2SpikesQU = (DLInt2spikeTimes / units.ms) * qu.ms
- simT, DLInt1memV = dlint1.getMemVTrace()
- DLInt1spikeTimes = dlint1.getSpikes()
- dlint1MemVAS = AnalogSignal(signal=DLInt1memV / units.mV,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="mV",
- name="DLInt1 MemV")
- dlint1SpikesQU = (DLInt1spikeTimes / units.ms) * qu.ms
- joSpikesQU = (JO.spikeTimes / units.ms) * qu.ms
- sineInput = getSineInput(simDur=simDuration, simStepSize=simStepSize,
- sinPulseDurs=inputPars['sinPulseDurs'],
- sinPulseStarts=inputPars['sinPulseStarts'],
- freq=265 * units.Hz, simSettleTime=simSettleTime)
- inputAS = AnalogSignal(signal=sineInput,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="um",
- name="Input Vibration Signal")
- fig, axs = plt.subplots(nrows=3, figsize=(10, 6.25), sharex='col')
- axs[0].plot(simT / units.ms, DLInt2memV / units.mV)
- spikesY = DLInt2memV.min() + 1.05 * (DLInt2memV.max() - DLInt2memV.min())
- axs[0].plot(DLInt2spikeTimes / units.ms, [spikesY / units.mV] * DLInt2spikeTimes.shape[0], 'k^')
- axs[0].set_ylabel('DLInt2\nMembrane\nPotential\n(mV)')
- axs[0].set_xlim([(simSettleTime - showBefore) / units.ms,
- (totalSimDur + showAfter) / units.ms])
- fig1, axs1 = plt.subplots(nrows=3, figsize=(10, 6.25), sharex='col')
- axs1[0].plot(simT / units.ms, DLInt1memV / units.mV)
- spikesY = DLInt1memV.min() + 1.05 * (DLInt1memV.max() - DLInt1memV.min())
- axs1[0].plot(DLInt1spikeTimes / units.ms, [spikesY / units.mV] * DLInt1spikeTimes.shape[0], 'k^')
- axs1[0].set_ylabel('DLInt1\nMembrane\nPotential\n(mV)')
- axs1[0].set_xlim([(simSettleTime - showBefore) / units.ms,
- (totalSimDur + showAfter) / units.ms])
- if DLInt2SynapseProps:
- gSynEDLInt2 = gEMonitorDLInt2.g_ExiJO[0]
- iSynEDLInt2 = -gSynEDLInt2 * (DLInt2memV - synPropsEDLInt2['Esyn'])
- axs[1].plot(simT / units.ms,
- iSynEDLInt2 / units.nA, 'm-', label=r'$I_{synE}$')
- iSynEASDLInt2 = AnalogSignal(signal=iSynEDLInt2 / units.nA,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="nA",
- name="DL-Int-2 input EPSC")
- if DLInt1DLInt2SynProps:
- gSynI = gIMonitorDLInt2.g_DLInt1[0]
- iSynI = -gSynI * (DLInt2memV - synPropsIDLInt2['Esyn'])
- axs[1].plot(simT / units.ms,
- iSynI / units.nA, 'c-', label=r'$I_{synI}$')
- iSynIASDLInt2 = AnalogSignal(signal=iSynI / units.nA,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="nA",
- name="DL-Int-2 input IPSC")
- axs[1].legend(loc='center right')
- axs[1].set_ylabel("Synaptic\ncurrents\n(nA)")
- axs[2].plot(simT / units.ms, sineInput,
- color=[130. / 255, 72. / 255, 7. / 255], ls='-', marker='None',
- label='Vibration Input')
- axs[2].plot(JO.spikeTimes / units.ms, [sineInput.max() * 1.05] * len(JO.spikeTimes), 'k^',
- label='JO Spikes')
- axs[2].legend(loc='center right')
- axs[2].set_xlabel('time (ms)')
- axs[2].set_ylabel('Input')
- fig.tight_layout()
- fig.canvas.draw()
- # plt.show()
- fig.savefig(opFileDLInt2, dpi=150)
- if DLInt1SynapsePropsE:
- gSynEDLInt1 = gEMonitorDLInt1.g_ExiJO[0]
- iSynEDLInt1 = -gSynEDLInt1 * (DLInt1memV - synPropsEDLInt1['Esyn'])
- axs1[1].plot(simT / units.ms,
- iSynEDLInt1 / units.nA, 'r-', label=r'$I_{synE}$')
- iSynEASDLInt1 = AnalogSignal(signal=iSynEDLInt1 / units.nA,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="nA",
- name="DL-Int-1 input EPSC")
- if DLInt1SynapsePropsI:
- gSynIDLInt1 = gIMonitorDLInt1.g_InhJO[0]
- iSynIDLInt1 = -gSynIDLInt1 * (DLInt1memV - synPropsIDLInt1['Esyn'])
- axs1[1].plot(simT / units.ms,
- iSynIDLInt1 / units.nA, 'g-', label=r'$I_{synI}$')
- iSynIASDLInt1 = AnalogSignal(signal=iSynIDLInt1 / units.nA,
- sampling_period=(simStepSize / units.ms) * qu.ms,
- t_start=0 * qu.mV,
- units="nA",
- name="DL-Int-1 input IPSC")
- axs1[1].legend(loc='center right')
- axs1[1].set_ylabel("Synaptic\ncurrents\n(nA)")
- axs1[2].plot(simT / units.ms, sineInput,
- color=[130. / 255, 72. / 255, 7. / 255], ls='-', marker='None',
- label='Vibration Input')
- axs1[2].plot(JO.spikeTimes / units.ms, [sineInput.max() * 1.05] * len(JO.spikeTimes), 'k^',
- label='JO Spikes')
- axs1[2].legend(loc='center right')
- axs1[2].set_xlabel('time (ms)')
- axs1[2].set_ylabel('Input')
- fig1.tight_layout()
- fig1.canvas.draw()
- # plt.show()
- fig1.savefig(opFileDLInt1, dpi=150)
- nixFile = nixio.File.open(OPNixFile, mode=nixio.FileMode.ReadWrite)
- neuronModels = nixFile.create_section("Neuron Models", "Model Parameters")
- DLInt1PropsSec = neuronModels.create_section("DL-Int-1", "AdExp")
- for propName, propVal in DLInt1PropsDict.items():
- addBrianQuantity2Section(DLInt1PropsSec, propName, propVal)
- DLInt2PropsSec = neuronModels.create_section("DL-Int-2", "AdExp")
- for propName, propVal in DLInt2PropsDict.items():
- addBrianQuantity2Section(DLInt2PropsSec, propName, propVal)
- inputSec = nixFile.create_section("Input Parameters", "Sinusoidal Pulses")
- for parName, parVal in inputPars.items():
- addBrianQuantity2Section(inputSec, parName, parVal)
- addBrianQuantity2Section(inputSec, "simSettleTime", simSettleTime)
- brianSimSettingsSec = nixFile.create_section("Simulation Parameters", "Brian Simulation")
- addBrianQuantity2Section(brianSimSettingsSec, "simStepSize", simStepSize)
- addBrianQuantity2Section(brianSimSettingsSec, "totalSimDuration", totalSimDur)
- brianSimSettingsSec.create_property("method", nixio.Value("euler"))
- synPropsSec = nixFile.create_section("Synapse Models", "Model Parameters")
- if DLInt1SynapsePropsE:
- JODLInt1SynESec = synPropsSec.create_section("JODLInt1Exi", "DoubleExpSyn")
- JODLInt1SynEDict = getattr(synapsePropsList, DLInt1SynapsePropsE)
- for propName, propVal in JODLInt1SynEDict.items():
- addBrianQuantity2Section(JODLInt1SynESec, propName, propVal)
- JODLInt1SynESec.create_property("PreSynaptic Neuron", nixio.Value("JO"))
- JODLInt1SynESec.create_property("PostSynaptic Neuron", nixio.Value("DLInt1"))
- if DLInt1SynapsePropsI:
- JODLInt1SynISec = synPropsSec.create_section("JODLInt1Inh", "DoubleExpSyn")
- JODLInt1SynIDict = getattr(synapsePropsList, DLInt1SynapsePropsI)
- for propName, propVal in JODLInt1SynIDict.items():
- addBrianQuantity2Section(JODLInt1SynISec, propName, propVal)
- JODLInt1SynISec.create_property("PreSynaptic Neuron", nixio.Value("JO"))
- JODLInt1SynISec.create_property("PostSynaptic Neuron", nixio.Value("DLInt1"))
- if DLInt2SynapseProps:
- JODLInt2SynESec = synPropsSec.create_section("JODLInt2Exi", "DoubleExpSyn")
- JODLInt2SynEDict = getattr(synapsePropsList, DLInt2SynapseProps)
- for propName, propVal in JODLInt2SynEDict.items():
- addBrianQuantity2Section(JODLInt2SynESec, propName, propVal)
- JODLInt2SynESec.create_property("PreSynaptic Neuron", nixio.Value("JO"))
- JODLInt2SynESec.create_property("PostSynaptic Neuron", nixio.Value("DLInt2"))
- if DLInt1DLInt2SynProps:
- DLInt1DLInt2SynSec = synPropsSec.create_section("DLInt1DLInt2Inh", "DoubleExpSyn")
- DLInt1DLInt2SynDict = getattr(synapsePropsList, DLInt1DLInt2SynProps)
- for propName, propVal in DLInt1DLInt2SynDict.items():
- addBrianQuantity2Section(DLInt1DLInt2SynSec, propName, propVal)
- DLInt1DLInt2SynSec.create_property("PreSynaptic Neuron", nixio.Value("DLInt1"))
- DLInt1DLInt2SynSec.create_property("PostSynaptic Neuron", nixio.Value("DLInt2"))
- blk = nixFile.create_block("Simulation Traces", "Brian Output")
- DLInt2DA = addAnalogSignal2Block(blk, dlint2MemVAS)
- DLInt1DA = addAnalogSignal2Block(blk, dlint1MemVAS)
- inputDA = addAnalogSignal2Block(blk, inputAS)
- if DLInt1SynapsePropsE:
- epscAS = addAnalogSignal2Block(blk, iSynEASDLInt1)
- if DLInt1SynapsePropsI:
- ipscAS = addAnalogSignal2Block(blk, iSynIASDLInt1)
- if DLInt2SynapseProps:
- epscAS = addAnalogSignal2Block(blk, iSynEASDLInt2)
- if DLInt1DLInt2SynProps:
- ipscAS = addAnalogSignal2Block(blk, iSynIASDLInt2)
- addMultiTag("DLInt2 Spikes", type="Spikes", positions=dlint2SpikesQU,
- blk=blk, refs=[DLInt2DA])
- addMultiTag("DLInt1 Spikes", type="Spikes", positions=dlint1SpikesQU,
- blk=blk, refs=[DLInt2DA])
- addMultiTag("JO Spikes", type="Spikes", positions=joSpikesQU,
- blk=blk, refs=[inputDA])
- nixFile.close()
|