//====================== STIMULUS FOR NGU MODEL ======================//
// This file contains functions for different stimuli for NGU model: //
// a) diffuse flash stimulus of a specified duration //
// //
// To use another stimulus, create a function to replace //
// make_diffuse_flash and call it from the model program. //
//====================================================================//
include ../lib/global_constants.g
float LGN_EREST = -74.0 * 1e-3 //LGN resting membrane potential (volts)
/* ******************************************************************
make_diffuse_flash
Sets up a diffuse flash input by stimulating all members of
target group for fixed time
Parameters:
src base name of spike source
target_group destination neurons for stimulation
are{target_group#}/soma
input_level injected current in amps
flash_dur flash duration in sec
tmax maximum time of simulation in sec
stim_delay stimulus onset delay in sec
****************************************************************** */
function make_diffuse_flash (src, target_group, input_level, flash_dur, tmax, stim_delay)
str src, target_group
float input_level, flash_dur, tmax, stim_delay
create neutral /input1
int count = 0
str pulse, target, name
foreach name ({el {target_group}#})
count = count + 1
pulse = {src}@{count}
target = {name}@"/soma"
create pulsegen {pulse}
setfield {pulse} level1 {input_level} baselevel 0 \
width1 {flash_dur} delay1 {stim_delay} delay2 {tmax}
addmsg {pulse} {target} INJECT output
setfield {target} initVm {LGN_EREST}
end
if (ECHO_ON == 1)
echo "Created" {count} {src} "pulse sources" for {target_group}
echo " Stimulus is diffuse flash of" {flash_dur} "seconds duration"
end
end
/* ******************************************************************
make_spot_flash
Sets up a spot flash input by stimulating a range of
target group for fixed time
Parameters:
first_lgn first LGN cell to stimulate
last_lgn last LGN cell to stimulate
src base name of spike source
target_group destination neurons for forcing
are{target_group#}/soma
input_level injected current in amps
flash_dur flash duration in sec
tmax maximum time of simulation in sec
stim_delay stimulus onset delay in sec
****************************************************************** */
function make_stationary_spot (first_lgn, last_lgn, src, target_group, input_level, flash_dur, tmax, stim_delay)
int first_lgn, last_lgn
str src, target_group
float input_level, flash_dur, tmax, stim_delay
create neutral /input2
int count, number
number = {abs {{first_lgn} - {last_lgn}}} + 1
str pulse, target, name
for (count = first_lgn; count <= last_lgn; count=count+1)
name = {target_group}@{count}
pulse = {src}@{count}
target = {name}@"/soma"
create pulsegen {pulse}
setfield {pulse} level1 {input_level} baselevel 0 \
width1 {flash_dur} delay1 {stim_delay} delay2 {tmax}
addmsg {pulse} {target} INJECT output
setfield {target} initVm {LGN_EREST}
end
if (ECHO_ON == 1)
echo "Created" {number} {src} "pulse sources for" {target_group}
echo " Stimulus is a stationary spot flash of" {flash_dur} "sec duration"
echo " starting at LGN cell" {first_lgn} "and ending at LGN cell" {last_lgn}
end
end
/* ******************************************************************
make_moving_spot
Sets up a moving spot flash input by sequentially stimulating a
range of LGN neurons at a speed measured in lgn neurons/ms. The
direction of movement depends on the sign of the speed. Use a
positive speed to cycle from lower number LGN neurons to higher
number; Use negative speed to cycle from higher number to lower
Parameters:
start first neuron to stimulate
end last neuron to stimulate
speed direction and movement of spot in lgn neurons/ms
src base name of spike source
target_group destination neurons for stimulation
are{target_group#}/soma
input_level injected current in amps
flash_dur flash duration in sec
tmax maximum time of simulation in sec
stim_delay stimulus onset delay in sec
****************************************************************** */
function make_moving_spot (spot_speed, src, target_group, input_level, flash_dur, tmax, stim_delay)
int first_lgn, last_lgn
float spot_speed
str src, target_group
float input_level, flash_dur, tmax, stim_delay
create neutral /input3
int count, number
float total_delay
int startpos
if (spot_speed > 0)
startpos = 1
else
startpos = {TOTAL_LGN_NEURONS}
end
number = 0
str pulse, target, name
foreach name ({el {target_group}#})
count = count + 1
name = {target_group}@{count}
pulse = {src}@{count}
target = {name}@"/soma"
create pulsegen {pulse}
total_delay = {stim_delay} + (0.001*({count}-{startpos})/{spot_speed})
setfield {pulse} level1 {input_level} baselevel 0 \
width1 {flash_dur} delay1 {total_delay} delay2 {tmax}
addmsg {pulse} {target} INJECT output
setfield {target} initVm {LGN_EREST}
number = number+1
end
if (ECHO_ON == 1)
echo "Created" {number} {src} "pulse sources for" {target_group}
echo " Stimulus is a spot moving at" {spot_speed} "LGN cells/ms"
if (startpos == 1)
echo " in a nasal-to-temporal direction"
else
echo " in a temporal-to-nasal direction"
end
end
end
/* ******************************************************************
make_neuron_stim_rec
Inject current into a rectangular area of neurons
Parameters:
x1,y1 lower left corner for stim area
x2,y2 upper right corner for stim area
src base name of spike source
target_group destination neurons for forcing
are{target_group#}/soma
input_level injected current in amps
target_erest resting membrane potential of target
stim_dur stimulus duration in sec
tmax maximum time of simulation in sec
stim_delay stimulus onset delay in sec
****************************************************************** */
function make_neuron_stim_rec (x1, x2, y1, y2, src, target_group, input_level, target_erest, stim_dur, tmax, stim_delay)
float x1, x2, y1, y2
str src, target_group
float input_level, stim_dur, tmax, stim_delay
create neutral /input4
float cell_x, cell_y, dist
int count = 0
int num_stim = 0
str pulse, target, name
foreach name ({el {target_group}#})
count = count + 1
pulse = {src}@{count}
cell_x = {getfield {name} x}
cell_y = {getfield {name} y}
if (cell_x >= {x1} && cell_x <= {x2} && cell_y >= {y1} && cell_y <= {y2})
target = {name}@"/soma"
create pulsegen {pulse}
setfield {pulse} level1 {input_level} baselevel 0 \
width1 {stim_dur} delay1 {stim_delay} delay2 {tmax}
addmsg {pulse} {target} INJECT output
setfield {target} initVm {target_erest}
// echo "Stimulating cell" {name} "at (" {cell_x} "," {cell_y} ")" // uncomment for debugging
num_stim = num_stim +1
end
end
if (ECHO_ON == 1)
echo "Created" {num_stim} {src} "pulse sources for" {target_group}
echo " Stimulating a rectangular area between (" {x1} "," {y1} ") and (" {x2} "," {y2} ")"
end
end
/* ******************************************************************
make_neuron_stim_cir
Inject current into a circle area of neurons
Parameters:
x1,y1 lower left corner for stim area
stim_rad radius of stimulation in mm
src base name of spike source
target_group destination neurons for forcing
are{target_group#}/soma
input_level injected current in amps
target_erest resting membrane potential of target
stim_dur stimulus duration in sec
tmax maximum time of simulation in sec
stim_delay stimulus onset delay in sec
****************************************************************** */
function make_neuron_stim_cir (x1, y1, stim_rad, src, target_group, input_level, target_erest, stim_dur, tmax, stim_delay)
float x1, y1, stim_rad
str src, target_group
float input_level, stim_dur, tmax, stim_delay
create neutral /input5
float cell_x, cell_y, dist
int count = 0
int num_stim = 0
str pulse, target, name
float dist
foreach name ({el {target_group}#})
count = count + 1
pulse = {src}@{count}
cell_x = {getfield {name} x}
cell_y = {getfield {name} y}
dist={sqrt {(cell_x - {x1})**2 + (cell_y - {y1})**2}}
if (dist <= {stim_rad})
target = {name}@"/soma"
create pulsegen {pulse}
setfield {pulse} level1 {input_level} baselevel 0 \
width1 {stim_dur} delay1 {stim_delay} delay2 {tmax}
addmsg {pulse} {target} INJECT output
setfield {target} initVm {target_erest}
// echo "Stimulating cell" {name} "at (" {cell_x} "," {cell_y} ")" // uncomment for debugging
num_stim = num_stim +1
end
end
if (ECHO_ON == 1)
echo "Created" {num_stim} {src} "pulse sources for" {target_group}
echo " Stimulating a circular area at (" {x1} "," {y1} ") with radius" {stim_rad} "mm"
end
end