//genesis
//
// $Id: config.g 1.7.1.2 Thu, 04 Apr 2002 11:55:56 +0200 hugo $
//
//////////////////////////////////////////////////////////////////////////////
//'
//' Purkinje tutorial
//'
//' (C) 1998-2002 BBF-UIA
//'
//' see our site at http://www.bbf.uia.ac.be/ for more information regarding
//' the Purkinje cell and genesis simulation software.
//'
//'
//' functional ideas ... Erik De Schutter, erik@bbf.uia.ac.be
//' genesis coding ..... Hugo Cornelis, hugo@bbf.uia.ac.be
//'
//' general feedback ... Reinoud Maex, Erik De Schutter
//'
//////////////////////////////////////////////////////////////////////////////
// config.g : configuration file manipulation
int include_config
if ( {include_config} == 0 )
include_config = 1
///
/// SH: ConfigFilename
///
/// PA: cell..: cellfile that has been read with readcell command
/// path..: path to cell that has been read
///
/// RE: Filename for config file
///
/// DE: Construct a filename for a config file for the given cell and path
/// For the same combination of parameters this routine will allways
/// give the same result
///
function ConfigFilename(cell,path)
str cell
str path
//- return cell filename and cat '.config'
return {cell} @ ".config"
end
///
/// SH: ConfigHostType
///
/// PA: cell..: cellfile that has been read with readcell command
/// path..: path to cell that has been read
///
/// RE: string with the type of OS for current config file
/// if there is no valid config file, "nil" is returned.
///
/// DE: Return the type of OS the current config file was created on
///
function ConfigHostType(cell,path)
str cell
str path
//- create a filename for the config file
str filename = {ConfigFilename {cell} {path}}
//- create an empty config file if it does not exist
sh "touch "{filename}
//= read data from config file
str argline
str arg1
str arg2
//- open the config file
openfile {filename} r
//- read header line
argline = {readfile {filename} -line}
//- if the argument count is different from 1
if ( argline == "" || {CountArguments {argline}} != 1)
//- return nil
return "nil"
end
//- read line with type of OS
argline = {readfile {filename} -line}
//- obtain arguments
arg1 = {getarg {arglist {argline}} -arg 1}
arg2 = {getarg {arglist {argline}} -arg 2}
//- if the line does not contain OS information
if (arg1 != "hostType")
//- return nil
return "nil"
end
//- return the type of the OS
return {arg2}
end
///
/// SH: ConfigWrite
///
/// PA: cell..: cellfile that has been read with readcell command
/// path..: path to cell that has been read
///
/// DE: Make and write a configuration file.
///
function ConfigWrite(cell,path)
str cell
str path
//{
//1 first declare locals for all config settings
//2 determine the value for all config settings
//3 write all locals to config file
//}
//- create a filename for the config file
str filename = {ConfigFilename {cell} {path}}
//- give diagnostics
echo "Making "{filename}" configuration file for "{cell}
//{
//1 first declare locals for all config settings
//v type of host
str hostType
//v number of spines in the cell
int iSpines = 0
//v xcell wildcard
str xCellPath
//v number of elements in xcell
int xCellElements = 0
//2 determine the value for all config settings
//- determine type of host
//! since this does not work correctly on all systems,
//! it is commented out
//hostType = {getenv HOSTTYPE}
//! and replaced by a default
hostType = "default"
//- loop over all spines
str spine
foreach spine ( {el {path}/spine[]} )
//- increment count
iSpines = {iSpines + 1}
end
//- set xcell wildcard
xCellPath = {cellpath} @ "/soma[TYPE=compartment]," \
@ {cellpath} @ "/main[][TYPE=compartment]," \
@ {cellpath} @ "/b#[][TYPE=compartment]"
//- loop over the elements in the xcell
str xcomp
foreach xcomp ( {el {xCellPath}} )
//- increment count
xCellElements = {xCellElements + 1}
end
//3 write all locals to config file
//- open config file for output
openfile {filename} w
//- write the cell file as header
writefile {filename} "cellfile" {cell}
//- write the hostType
writefile {filename} "hostType" {hostType}
//- write the number of spines
writefile {filename} "iSpines" {iSpines}
//- write xcell wildcard
writefile {filename} "xCellPath" {xCellPath}
//- write number of elements in xcell
writefile {filename} "xCellElements" {xCellElements}
//- close config file
closefile {filename}
//}
end
///
/// SH: ConfigWriteUpdate
///
/// PA: cell..: cellfile that has been read with readcell command
/// path..: path to cell that has been read
///
/// DE: Update a config file if necessary
/// If the config file corresponds to the cell file, nothing is done.
///
function ConfigWriteUpdate(cell,path)
str cell
str path
//- create a filename for the config file
str filename = {ConfigFilename {cell} {path}}
//- default : we do not create a config file
int bCreate = 0
sh "touch "{filename}
//v read data from config file
str argline
str arg1
str arg2
//- open the config file
openfile {filename} r
//- read first line
argline = {readfile {filename} -line}
//echo config : count args = {CountArguments {argline}}
//- if the argument count is different from 1
if ( argline == "" || {CountArguments {argline}} != 1)
//- force a new config file
bCreate = 1
//- else check the contents
else
//- obtain arguments
arg1 = {getarg {arglist {argline}} -arg 1}
arg2 = {getarg {arglist {argline}} -arg 2}
//- close the config file
closefile {filename}
//- if this is not a valid config file
if (arg1 != "cellfile")
//- force a new config file
bCreate = 1
end
//- if the file does not match the cell
if (arg2 != cellfile)
//- force a new config file
bCreate = 1
end
end
//- if we should create a config file
if (bCreate)
//- make a new config file
ConfigWrite {cell} {path}
end
end
///
/// SH: ConfigRead
///
/// PA: cell..: cellfile that has been read with readcell command
/// path..: path to cell that has been read
///
/// RE: 0 for failure
/// 1 for success
///
/// DE: Read or make the configuration file.
/// If no configuration file is found, one will be made from the current
/// read cell in {cellpath}.
/// This function can produce a 'getarg' failure when the config file is
/// not valid.
///
function ConfigRead(cell,path)
str cell
str path
//- make sure the config file exists and is up to date
ConfigWriteUpdate {cell} {path}
//- create a filename for the config file
str filename = {ConfigFilename {cell} {path}}
//- give diagnostics
echo "Using configuration from "{filename}
//v line argument
str argline
//v two arguments
str arg1
str arg2
//{
//| Read in the configuration
//|
//1 first declare locals for all config settings
//2 read all locals from config file
//3 set the value for all config settings
//}
//{
//1 first declare locals for all config settings
//v type of OS
//! this is of no use anymore, it is always "default"
str hostType
//v number of spines
int iSpines
//v xcell wildcard
str xCellPath
//v number of elements in xcell
int xCellElements
//2 read all locals from config file
//- open the config file
openfile {filename} r
//- read first line
argline = {readfile {filename} -line}
//- obtain arguments
arg1 = {getarg {arglist {argline}} -arg 1}
arg2 = {getarg {arglist {argline}} -arg 2}
//- if this is not a valid config file
if (arg1 != "cellfile")
//- return a failure
return 0
end
//- if the file does not match the cell
if (arg2 != cellfile)
//- return a failure
return 0
end
//! from now on we assume a valid config file,
//! the tags identifying the data are ignored,
//! so the serial order is the only method for
//! identifying the information
//- read line with type of OS
argline = {readfile {filename} -line}
//- set type of OS
hostType = {getarg {arglist {argline}} -arg 2}
//- read line with number of spines
argline = {readfile {filename} -line}
//- set number of spines
iSpines = {getarg {arglist {argline}} -arg 2}
//- read line with xcell wildcard
argline = {readfile {filename} -line}
//- set xcell wildcard
xCellPath = {getarg {arglist {argline}} -arg 2}
//- read line with number of elements in xcell
argline = {readfile {filename} -line}
//- set number of elements in xcell
xCellElements = {getarg {arglist {argline}} -arg 2}
//3 set the value for all config settings
//- create a configuration element
create neutral /config
//- add a field for purkinje cell name
addfield /config \
cellfile -description "Cell read with readcell"
//- add a field for hostType
addfield /config \
hostType -description "Type of host"
//- add a field for the number of spines
addfield /config \
iSpines -description "Number of attached spines"
//- add a field for the xcell wildcard
addfield /config \
xCellPath -description "Elements displayed by xcell"
//- add a field for the number of elements in xcell
addfield /config \
xCellElements -description "Number of elements in xcell"
//- set the config values
setfield /config \
cellfile {cell} \
hostType {hostType} \
iSpines {iSpines} \
xCellPath {xCellPath} \
xCellElements {xCellElements}
//- close the config file
closefile {filename}
//}
//- return success with configuration
return 1
end
end
|