//genesis
//STDP.g
//Can give pattern of current injection and/or pattern of pre-syn stim, allowing STDP, HFS, Theta, etc
//pulse>=1 and numtrains>=1 else there will be NO pre-syn stim (good for evaluating AP alone)
//AND preStimPct>0, else there will be NO pre-syn stim
//inject=0 will give pre-syn stim alone, without triggered AP (e.g. hfs or theta)
//set TooFast = 100 will revert to stimulating just one spine, even for 50 Hz stimulation
//If no synaptic stimulation StimComp is where one specifies which spine output to save
/*Commented out lines allow giving a pulse before and after, to test the plasticity
and also repeating the pairings. BUT, these will mess up the alignment of the
pre-synaptic stim and the post-synaptic depol. So, fix the pulse generators when you uncomment them */
function connect_synapse_with_delay(precell,name,stimname,StimDelay)
str precell, name, stimname ,neuronname
float StimDelay
int msgnum
if ({exists {stimname}/{name}})
addmsg {precell}/spikegen {stimname}/{name} SPIKE
msgnum = {getfield {stimname}/{name} nsynapses} - 1
echo {msgnum}
setfield {stimname}/{name} synapse[{msgnum}].weight 1 synapse[{msgnum}].delay StimDelay
else
echo could not connect to {stimname}/{name}
end
end
function connect_synapse(precell,name,neuronname,stimname)
str neuronname, stimname, name, precell
if ({exists {neuronname}/{stimname}/{name}})
addmsg {precell}/spikegen {neuronname}/{stimname}/{name} SPIKE
else
echo could not connect to {neuronname}/{stimname}/{name}
end
end
function STDP(PreStim, StimComp, file,numAP,inj,dur,interval, isi, pulseFreq, pulses, burstFreq, numbursts, trainFreq, numtrains, jitter,ChanString)
int PreStim
str StimComp,file, compt,ChanString
//These are parameters related to both pre-and post-synaptic AP (EPSP) pattern
int numbursts, numtrains
float trainFreq, burstFreq
float isi //interval between onset of EPSP and onset of AP
//These are parameters related to pre-synaptic stimulation - pulses in a burst
int pulses
float pulseFreq
//These parameters describe post-synaptic stimulation - AP in a burst
int numAP
float inj, dur, interval, interpulse=0
// Determine the interpulse intervals for pre-synaptic stimulation
if ({pulses}>1)
interpulse=1/{pulseFreq}
end
// Determine the interburst and intertrain intervals for pre- and post- stimulation
float intertrain=0, interburst=0
interburst = 1.0/{burstFreq}
intertrain = 1.0/{trainFreq}
int pulse, train, burst
float initSim=0.1 //delay refers to onset of current injection relative to first pulse, which occurs at initSim
float TooFast = 30 //if pre-syn pulses in burst are too fast, distribute them among multiple spines
if ({pulseYN})
float AP_delay= {2*initSim + isi}//+ (pulses-1)*interpulse}
else
float AP_delay = {initSim + isi}// + (pulses-1)*interpulse}
end
if ({isi} > 0)
AP_delay = {AP_delay} + ({pulses}-1)*{interpulse}
else
AP_delay = {AP_delay} - ({numAP}-1)*{interval}
end
echo {AP_delay}
//parameters for post-synaptic spike generators
if ({interval} == 0 )
echo "Wrong paradigm chosen. You can choose: P_and_K (Pawlak and Kerr), K_and_P (Kerr and Plenz), Shindou, Shen and IF (IF curves)"
return
end
if ({interval}<{dur})
echo "please define lower AP frequency"
end
int anystim
float PreStimPct
//**********set the filenames, and
//set up presynaptic element for stimulating
str filenam={file}@"_STDP_"
if ({jitter} == 1)
filenam = {filenam}@"jitter_"
end
if ({abs {isi}}<{SMALLNUMBER})
isi=0
end
if ({PreStim}==2)
PreStimPct=2 //Used for stimulation during simulation
filenam={filenam}@"Stim_"@{StimComp}@"_AP_"@{numAP}@"_ISI_"@{isi}
PreSynStim {precell}
if ({spinesYesNo})
str stimname
echo "before pulseFreq entry pulseFreq" {pulseFreq} {TooFast} {pulses}
if ({pulseFreq}>{TooFast} && {pulses}>1)
int stim=0, msgnum
float StimDelay
echo "in pulseFreq"
//Connect up to the number of pulses in the burst
echo "Stim Comp" {StimComp}
foreach compt ({el {neuronname}/{StimComp}/##[TYPE=compartment]})
echo "compt" {compt}
if ({strcmp {getpath {compt} -tail} "head"} == 0)
echo "this should be a head compartment in our StimComp:" {compt}
//Double check whether compt includes StimComp as part of name
if ({stim} < {pulses})
//This won't work if number of spines is fewer than number of pulses in burst
StimDelay = {stim}*{interpulse}
str stimname={compt}
if ({exists {stimname}/{NMDAname}})
addmsg {precell}/spikegen {stimname}/{NMDAname} SPIKE
msgnum = {getfield {stimname}/{NMDAname} nsynapses} - 1
setfield {stimname}/{NMDAname} synapse[{msgnum}].weight 1 synapse[{msgnum}].delay StimDelay
end
if ({exists {stimname}/{AMPAname}})
addmsg {precell}/spikegen {stimname}/{AMPAname} SPIKE
msgnum = {getfield {stimname}/{AMPAname} nsynapses} - 1
setfield {stimname}/{AMPAname} synapse[{msgnum}].weight 1 synapse[{msgnum}].delay StimDelay
end
stim = {stim+1}
end
end
end
/*Above results in stimulating all pulses in burst with single stim,
so need to NOT loop over pulses below during simulation, e.g. set pulses = 1 */
pulses=1
else
str stimname={StimComp}@"/spine_1/"@{spcomp1}
echo "1 pulse" {stimname}
echo {StimComp}"/spine_1/"{spcomp1}
connect_synapse {precell} {NMDAname} {neuronname} {stimname}
connect_synapse {precell} {AMPAname} {neuronname} {stimname}
end
else
str stimname={StimComp}
connect_synapse {precell} {NMDAname} {neuronname} {stimname}
connect_synapse {precell} {AMPAname} {neuronname} {stimname}
end
showmsg {precell}/spikegen
//add_outputSpikeHistory {precell} {presynfile} {filenam}
else
PreStimPct= {PreStim}
if ({PreStimPct}>0 && {PreStimPct}<=1)
filenam={filenam}@"Pct_"@{StimComp}@"_AP_"@{numAP}@"_ISI_"@{isi}
PreSynStim {precell}
anystim={PreSynSyncRandom {precell} {neuronname} {PreStimPct} {StimComp}}
if ({anystim}==0)
echo "ERROR in STDP/PreSynSync: no successful connections"
else
// add_outputSpikeHistory {precell} {presynfile} {filenam}
end
elif ({PreStimPct}<=0)
filenam={filenam}@"NoStim"
else
echo "ERROR in STDP: PreStim," {PreStim} ", must be string <=1"
end
end
echo "################ simulating STDP, " {numAP} "AP, ISI: " {isi}
int go = 1
float width_burst = {numAP}*{interval}
float width_train = {numbursts}/{burstFreq}
float very_big_number = {1e9}
float exp_duration = {numtrains}/{trainFreq}
if ({dur} > {interval})
go = 0
echo "The AP is wider than the inter AP interval"
else
if ({width_burst} > {interburst})
if (({numbursts} == 1) && ({numtrains} == 1))
interburst = 2*{width_burst}
width_train = {interburst}
if ({width_train} > {intertrain})
echo "Train frequency smaller than duration of all bursts"
intertrain = 2*{width_train}
exp_duration = 2*{width_train}
end
else
go = 0
end
else
if ({width_train} > {intertrain})
if ({numtrains} == 1)
intertrain = 2*{width_train}
exp_duration = 1.2*{width_train}
echo "Train frequency smaller than duration of all bursts"
else
go = 0
echo "The train is wider than the intertrain interval"
end
end
end
end
if ({go} == 1)
//onset of the injections jitter (shift lower than 1 ms):
if ({jitter} == 1)
AP_delay = {AP_delay} + {rand 0 0.0005}
//amplitude jitter
inj = {inj} + {rand 0 {inj}/20.}
//width jitter
dur = {dur} + {rand 0 0.0005}
end
echo AP_delay {AP_delay} inj {inj} AP_duration {dur}
createPulseGen {inj} {basal_current_inj} 0 {interval} {dur} {neuronname}/soma {injectName} 2 "INJECT"
createPulseGen {inj} {basal_current} 0 {interburst} {width_burst} {injectName} {injectName}/burst_gate 2 "INPUT"
createPulseGen {inj} {basal_current} 0 {intertrain} {width_train} {injectName}/burst_gate {injectName}/train_gate 2 "INPUT"
createPulseGen {inj} {basal_current} {AP_delay} {very_big_number} {exp_duration} {injectName}/train_gate {injectName}/experiment_gate 0 "INPUT"
str inj_header
// inj_header = {add_outputPulseGen {somainjfile} {injectName}}
end
//if ({getmsg /output/Vm -in -find /injectCurr SAVE}<0)
// addmsg /injectCurr /output/Vm SAVE output
//end
reset
// H-Solve Here
if (hsolveYesNo==1)
call {neuronname}/solve SETUP
end
reset
//setfilename {Vmfile} {Cafile} {Gkfile} {spinefile} {filenam} 1 {Vmhead} {Cahead} {Gkhead} {spinehead}
//set-up file names, post-synaptic spike generators
if ({spinesYesNo})
// if ({PreStim}>0)
// spinehead={add_outputMultiSpines {spinefile} {PreStim} {ChanString}}
// else
spinehead={add_outputMultiSpines {spinefile} {0.1}}
spinehead={add_outputMultiSpines {spinefile} {2} {chans}}
str saveComps= "secdend11,tertdend1_1,tertdend1_2,tertdend1_3,tertdend1_4,tertdend1_5,tertdend1_6,tertdend1_7,tertdend1_8,tertdend1_9,tertdend1_10,tertdend1_11,tertdend2_1,tertdend2_2,tertdend2_3,tertdend2_4,tertdend2_5,tertdend2_6,tertdend2_7,tertdend2_8,tertdend3_1,tertdend3_2,tertdend3_3,tertdend3_4,tertdend3_5,tertdend3_6,tertdend3_7,tertdend3_8,tertdend3_9,tertdend3_10,tertdend3_11"
multispinehead={add_outputOneSpinePerComp {multispinefile} {neuronname} {saveComps} {chans}} // to look at spines in non stim compartments
// end
end
setfilename {somainjfile} {filenam} 1 {inj_header}
setfilename {Vmfile} {filenam} 1 {Vmhead}
setfilename {Cafile} {filenam} 1 {Cahead}
setfilename {Gkfile} {filenam} 1 {Gkhead}
setfilename {spinefile} {filenam} 1 {spinehead}
setfilename {multispinefile} {filenam} 1 {multispinehead}
setfilename {Ikfile} {filenam} 1 {Ikhead}
reset
//step through the simulation
step {initSim} -time
if ({pulseYN})
setfield {precell} Vm 10
step 1
setfield {precell} Vm 0
step {initSim} -time
end
for (train=0; train<{numtrains}; train={train+1})
for (burst=0;burst<{numbursts}; burst=burst+1)
if ({PreStim}!="0")
for (pulse=0; pulse<{pulses}; pulse={pulse+1})
setfield {precell} Vm 10
step 1
setfield {precell} Vm 0
step {interpulse} -time
end
end
step {interburst-(pulses*interpulse)} -time
end
if ({train<numtrains-1})
step {intertrain -(numbursts*interburst)} -time
end
end
step {initSim} -time
if({pulseYN})
setfield {precell} Vm 10
step 1
setfield {precell} Vm 0
step {initSim} -time
end
fileFLUSH {Vmfile}
fileFLUSH {Cafile}
fileFLUSH {Gkfile}
fileFLUSH {spinefile}
fileFLUSH {somainjfile}
//eliminate both current injection input and spikegenerator input in preparation for another stimulation paradigm
//setfield {injectName} level1 0
if ({PreStim}>0)
int nummsg={getmsg {precell}/spikegen -out -count}
int i
for (i=0; i<nummsg; i=i+1)
deletemsg {precell}/spikegen 0 -outgoing
end
end
end