//genesis //HookUp.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 set_timetable(inputname,maxTime,filename) str inputname, filename float maxTime echo {inputname} setfield {inputname} maxtime maxTime, method 4 \ act_val 1.0 \ fname filename call {inputname} TABFILL create spikegen {inputname}/spikes setfield {inputname}/spikes output_amp 1 thresh 0.5 abs_refract 0.0001 addmsg {inputname} {inputname}/spikes INPUT activation pope end function connect_synapse(input,spikegen,stimname,name) str input,spikegen,stimname,name if ({exists {stimname}/{name}}) addmsg {input}/{spikegen} {stimname}/{name} SPIKE else echo could not find {stimname}/{name} end end //pass the name of the paradigm, because it is used in naming spine stimulation files function HookUp(PreStim, paradigm, timing, StimComp, file,numAP,inj,dur,interval, isi, pulseFreq, pulses, burstFreq, numbursts, trainFreq, numtrains, jitter) int PreStim str StimComp,file, compt, paradigm, timing //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, bufpos str spikegen = "spikes", bufStrTmp, whereStim // 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 //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} 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 //**********set the filenames, and //set up presynaptic element for stimulating str filenam={file} if ({GABAYesNo}) filenam={file}@"_gaba_delay_"@{GABAdelay}@"_" bufStrTmp = {StimComp} bufpos = 0 str gaba_file = {paradigm}@"_"@{timing}@"_gaba" int i = 0 while ({bufpos} > -1) bufpos = {findchar {bufStrTmp} ,} if ({bufpos} == -1) whereStim = {bufStrTmp} else whereStim = {substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp = {substring {bufStrTmp} {bufpos+1}} end pushe / create timetable GABA[{i}] //set_timetable {input_name}/GABA[{i}] {numtrains}/{trainFreq} {gaba_file} float maxt = {numtrains/trainFreq+initSim} filenam = {filenam}@"_"@whereStim@"_"@"GABAtau2"@{GABAtau2}@"_" setfield GABA[{i}] maxtime {maxt} \ method 4 \ act_val 1.0 \ fname {gaba_file} echo GABA[{i}] {gaba_file} call GABA[{i}] TABFILL create spikegen GABA[{i}]/{spikegen} setfield GABA[{i}]/{spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001 addmsg GABA[{i}] GABA[{i}]/{spikegen} INPUT activation echo GABA[{i}] pope str stimname = {neuronname}@"/"@{whereStim} connect_synapse GABA[{i}] {spikegen} {stimname} {GABAname} i = i + 1 end else filenam={file}@"_no_gaba_" end if ({jitter} == 1) filenam = {filenam}@"jitter_" end if ({abs {isi}}<{SMALLNUMBER}) isi=0 end //Used for stimulation during simulation filenam={filenam}@"Stim_"@{StimComp}@"_AP_"@{numAP}@"_ISI_"@{isi} if ({spinesYesNo}) if ({PreStim}>0) echo "before pulseFreq entry pulseFreq" {pulseFreq} {TooFast} {pulses} str fname_base = paradigm@"_"@timing@"_stimulation_spine_" bufpos =0 bufStrTmp = whichSpines str whichSpine str stimname str res_spines = "" if ({pulseFreq}>{TooFast} && {pulses}>1) int i = 0 res_spines = whichSpines while ({bufpos} > -1) bufpos = {findchar {bufStrTmp} ,} if ({bufpos} == -1) whichSpine = {bufStrTmp} else whichSpine = {substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp = {substring {bufStrTmp} {bufpos+1}} end pushe / create timetable {input_name}[{i}] //set_timetable {fname_base}[{i}] {numtrains}/{trainFreq} {filename} float maxt = {numtrains/trainFreq+initSim} echo "max time" {maxt} setfield {input_name}[{i}] maxtime {maxt} \ method 4 \ act_val 1.0 \ fname {fname_base}{whichSpine} echo {input_name}[{i}] {fname_base}{whichSpine} call {input_name}[{i}] TABFILL create spikegen {input_name}[{i}]/{spikegen} setfield {input_name}[{i}]/{spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001 addmsg {input_name}[{i}] {input_name}[{i}]/{spikegen} INPUT activation echo {input_name}[{i}] str fnam = {filenam}@"_spikes_"@{whichSpine} echo {fnam} create spikehistory SynTimes[{i}].history setfield SynTimes[{i}].history ident_toggle 1 filename {fnam} initialize 1 leave_open 1 flush 1 addmsg {input_name}/spikes SynTimes[{i}].history SPIKESAVE reset pope stimname = {neuronname}@"/"@{StimComp}@"/spine_"@{whichSpine}@"/"@{spcomp1} connect_synapse {input_name}[{i}] {spikegen} {stimname} {NMDAname} connect_synapse {input_name}[{i}] {spikegen} {stimname} {AMPAname} i = {i+1} end else //If only one spine gets stimulated, it is the first on the list // or if 0<PreStim <1, python script will select which spine or set up // PreStim = 0 (Don't know how yet, but I will) bufpos = {findchar {bufStrTmp} ,} if ({bufpos} == -1) whichSpine = {bufStrTmp} else whichSpine = {substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp = {substring {bufStrTmp} {bufpos+1}} end res_spines = whichSpine stimname={neuronname}@"/"@{StimComp}@"/spine_"@{whichSpine}@"/"@{spcomp1} echo "1 pulse" {stimname} pushe / create timetable {input_name} float maxt = {numtrains/trainFreq+ initSim} echo "max time" {maxt} setfield {input_name} maxtime {maxt} \ method 4 \ act_val 1.0 \ fname {fname_base}{whichSpine} call {input_name} TABFILL create spikegen {input_name}/{spikegen} setfield {input_name}/{spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001 addmsg {input_name} {input_name}/{spikegen} INPUT activation str fnam = {filenam}@"_spikes_"@{whichSpine} echo {fnam} create spikehistory SynTimes.history setfield SynTimes.history ident_toggle 1 filename {fnam} initialize 1 leave_open 1 flush 1 addmsg {input_name}/spikes SynTimes.history SPIKESAVE reset pope //set_timetable {input_name} {numtrains}/{trainFreq} {filename} connect_synapse {input_name} {spikegen} {stimname} {NMDAname} connect_synapse {input_name} {spikegen} {stimname} {AMPAname} end else str res_spines = "1" end end /* //Does not really work, should be rewritten str stimname={StimComp} create timetable {input_name} set_timetable {input_name} {numtrains}/{trainFreq} {filename} connect_synapse {input_name} {NMDAname} {neuronname} {stimname} connect_synapse {input_name} {AMPAname} {neuronname} {stimname} end */ echo "################ simulating STDP, " {numAP} "AP, ISI: " {isi} //set-up file names, post-synaptic spike generators if ({spinesYesNo}) spinehead={add_output_hook_up {spinefile} {neuronname} {StimComp} {res_spines} {PreStim}} end setfilename {Vmfile} {filenam} 1 {Vmhead} setfilename {Cafile} {filenam} 1 {Cahead} setfilename {Gkfile} {filenam} 1 {Gkhead} setfilename {spinefile} {filenam} 1 {spinehead} 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} 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}} setfilename {somainjfile} {filenam} 1 {inj_header} end reset end