//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 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 function set_timetable(input_name,fname_base,i,maxt,fnam, spikegen,StimComp, spike_history) str input_name, fnam, fname_base, spikegen, StimComp, spike_history int i float maxt str stimname pushe / create timetable {input_name}[{i}] echo {input_name}[{i}] {StimComp} "max time" {maxt} setfield {input_name}[{i}] maxtime {maxt} \ method 4 \ act_val 1.0 \ fname {fname_base} 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 create spikehistory {spike_history}[{i}].history setfield {spike_history}[{i}].history ident_toggle 1 filename {fnam} initialize 1 leave_open 1 flush 1 addmsg {input_name}/spikes {spike_history}[{i}].history SPIKESAVE reset pope 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, ChanString) int PreStim str StimComp,file, compt, paradigm, timing,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, 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 str spines_to_hook_up = "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} else AP_delay = {AP_delay} - ({numAP}-1)*{interval} end echo "APdelay" {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 float maxt = {numtrains/trainFreq+2*initSim} str filenam={file} if ({GABAYesNo}) filenam={file}@"_gaba_delay_"@{GABAdelay}@"_" if ({GABAstim} == "") GABAstim = {StimComp} end 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 filenam = {filenam}@"_"@whereStim@"_"@"GABAtau2"@{GABAtau2}@"_" set_timetable {GABA_input} {gaba_file} {i} {maxt} {filenam} {spikegen} {whereStim} "GABASynTimes" str stimname = {neuronname}@"/"@{whereStim} connect_synapse {GABA_input}[{i}] {spikegen} {stimname} {GABAname} i = i + 1 end else if ({GABAtonic}==0) filenam={file}@"_no_gaba_" end 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}@"_PSP_"@{pulses}@"_interpulse_"@{interpulse} if ({spinesYesNo}) if ({PreStim}>0) echo "before pulseFreq entry pulseFreq" {pulseFreq} {TooFast} {pulses} str fname_base = paradigm@"_"@timing@"_stimulation_spine_" int dendPos = 0 str dendBuf = {StimComp} str whichSegment str stimname if ({pulses} == 1) int help = {findchar {whichSpines} ,} spines_to_hook_up = {substring {whichSpines} 0 {help-1}} else spines_to_hook_up = {whichSpines} end int i = 0 while ({dendPos} >-1) dendPos = {findchar {dendBuf} ,} if ({dendPos} == -1) whichSegment = {dendBuf} else whichSegment = {substring {dendBuf} 0 {dendPos-1}} dendBuf = {substring {dendBuf} {dendPos+1}} end bufpos =0 bufStrTmp = spines_to_hook_up str whichSpine while ({bufpos} > -1) bufpos = {findchar {bufStrTmp} ,} if ({bufpos} == -1) whichSpine = {bufStrTmp} else whichSpine = {substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp = {substring {bufStrTmp} {bufpos+1}} end str fnam = {filenam}@"_spikes_"@{whichSpine} str spikegen_file = {fname_base}@{whichSpine} set_timetable {input_name} {spikegen_file} {i} {maxt} {fnam} {spikegen} {whichSegment} "SynTimes" stimname = {neuronname}@"/"@{whichSegment}@"/spine_"@{whichSpine}@"/"@{spcomp1} connect_synapse {input_name}[{i}] {spikegen} {stimname} {NMDAname} connect_synapse {input_name}[{i}] {spikegen} {stimname} {AMPAname} i = {i+1} end end 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} {spines_to_hook_up} {ChanString} {PreStim}} //echo {spinehead} 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 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 echo go {go} 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" if ({somainjout}) str inj_header inj_header = {add_outputPulseGen {somainjfile} {injectName}} setfilename {somainjfile} {filenam} 1 {inj_header} else inj_header = "" somainjfile = "X" end end reset end