/*
GENESIS functions to read variable parameter names and values from
environment variable and store them in the GENESIS object hierarchy.
Requires the environment variables GENESIS_PAR_ROW for parameter
values and GENESIS_PAR_NAMES for parameter names. If names are not
provided, parameter values can still be accessed via an index.
Example for setting environment variables in Bash:
export GENESIS_PAR_ROW="1 2 3"
export GENESIS_PAR_NAMES="a b c"
(which means a=1, b=2, and c=3.)
Then call
genesis myscript.g
which must include this file.
In your GENESIS script, initialize first by calling
read_env_params. And access the parameters either by name:
par_a = {get_param_byname "a"}
or by index:
par_b = {get_param 2}
Special versions exist for maximal conductance parameters:
set_gmax_par_byname /soma chanSK gmax_SK
which sets the gmax of /soma/chanSK element from parameter named
gmax_SK. Same can be done with parameter index:
set_gmax_par /soma chanSK 5
assuming gmax_SK was at index 5 in GENESIS_PAR_ROW.
Cengiz Gunay <cengique@users.sf.net>, 2015-05-13
*/
// constants
float PI = 3.14159265359
// Set globals
str parrow
str parnames
// From the parameter string (parrow), return parameter number (num)
function get_param (num)
return {getarg {arglist {parrow}} -arg {num}}
end
// Initialization function to read from env variables
function read_env_params
echo "*********************************************************************"
echo "Reading environment variable GENESIS_PAR_ROW"
parrow = {getenv GENESIS_PAR_ROW}
// useless check because above line will crash script
if ({strcmp {parrow} ""} == 0)
echo "*********************************************************************"
echo "Error: This script needs to read the parameters from the environment "
echo " variable GENESIS_PAR_ROW and GENESIS_PAR_NAMES. Set them prior "
echo " to running the script. Aborting simulation."
echo "*********************************************************************"
quit
end
// If we find parameter names, create an element structure with them
parnames = {getenv GENESIS_PAR_NAMES}
if ({strcmp {parnames} ""} != 0)
echo "Reading environment variable GENESIS_PAR_NAMES and creating parameter"
echo "element /@params with fields corresponding to parameter names and values:"
int param_num
// create structure for params, put raw values in there
create neutral /@params
pushe /@params
for (param_num=1; param_num <= {getarg {arglist {parnames}} -count}; param_num=param_num+1)
str param_name = {getarg {arglist {parnames}} -arg {param_num}}
addfield {param_name}
setfield {param_name} {get_param {param_num}}
echo {param_name} "=" {get_param {param_num}}
end
pope
end
end
// From the /@params element, return parameter by name
function get_param_byname (param_name)
return {getfield /@params {param_name}}
end
// returns surface of compartment at path
function calc_surf (path)
return { PI * { getfield {path} dia } * { getfield {path} len} }
end
// returns volume of compartment at path
function calc_vol (path)
return { PI * {{ getfield {path} dia } ** 2} * { getfield {path} len} / 4 }
end
// finds the target field in element
// if tabchannel, then Gbar
// if Ca_concen, then B, etc.
function find_def_field (path)
str fieldname
// Is it a tabchannel?
if ( {exists {path} Gbar} )
fieldname = "Gbar"
elif ( {exists {path} B} )
// or Ca_concen?
fieldname = "B"
end
return {fieldname}
end
// return proper readcell parameter (Gbar, B, etc) value from element at path
function get_gmax (path)
return { getfield {path} { find_def_field {path}}}
end
// convert from integer param value to specific gmax value by
// dividing by 50 and then scale by gmax in path (gmax's from P file are the maximal values)
// (already scaled by compartment area)
function get_gmax_spec (path, param_num)
return { { {get_param {param_num} } / 50 } * { get_gmax {path} } }
end
// same thing by name
function get_gmax_spec_byname (path, param_name)
return { { {get_param_byname {param_name} } / 50 } * { get_gmax {path} } }
end
// Takes specific gmax value and applies to channel
// No need to scale by compartment area because P file value is already scaled
// removed: { calc_surf { path } }
function set_gmax (path, chan, value)
setfield {path}/{chan} { find_def_field {path}/{chan} } { { value } }
end
// Set gmax value from parameter index
function set_gmax_par (path, chan, param_num)
set_gmax {path} {chan} {get_gmax_spec {path}/{chan} {param_num}}
end
// Set gmax value from parameter name
function set_gmax_par_byname (path, chan, param_name)
set_gmax {path} {chan} {get_gmax_spec_byname {path}/{chan} {param_name}}
end
// Set gmax for all neurites from param
function set_neurites_par (path, chan, param_num)
set_gmax_par {path}/neurite1 { chan } { param_num }
set_gmax_par {path}/neurite2 { chan } { param_num }
set_gmax_par {path}/neurite3 { chan } { param_num }
end
// Set gmax for all neurites from param name
function set_neurites_par_byname (path, chan, param_name)
set_gmax_par_byname {path}/neurite1 { chan } { param_name }
set_gmax_par_byname {path}/neurite2 { chan } { param_name }
set_gmax_par_byname {path}/neurite3 { chan } { param_name }
end
// Set gmax for all neurites from value
// (obsolete)
function set_neurites_val (path, chan, value)
set_gmax {path}/neurite1 { chan } { value }
set_gmax {path}/neurite2 { chan } { value }
set_gmax {path}/neurite3 { chan } { value }
end