//genesis // // $Id: mapping.g 1.9 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 //' ////////////////////////////////////////////////////////////////////////////// // mapping.g : mapping between dendrites and spines int include_mapping if ( {include_mapping} == 0 ) include_mapping = 1 /// /// SH: MappingCreate /// /// PA: path..: path with spines /// /// DE: Create mapping elements between dendrites and spines /// Mappings are created within the element /mappings /// function MappingCreate(path) str path //- go to specified path pushe {path} //- create a neutral mapping element create neutral /mappings //- add a field for number of mappings addfield /mappings mappingCount \ -description "Number of mappings" //- loop over all compartments in the path str comp foreach comp ( {el ./#[][TYPE=compartment]} ) //- index of the element defaults to zero int index = 0 //- default : do not create a mapping for this element int bCreateMapping = 0 //- get the tail of the element str tail = {getpath {comp} -tail} //- calculate the place of the index count // the quotes are not necessary but this way emacs is somewhat // more friendly when matching braces int indexOpen = {findchar {tail} "["} int indexClose = {findchar {tail} "]"} //- if this element has an index count if ({indexOpen} != -1) //- remove the index from the element str compNoIndex = {substring {tail} 0 {indexOpen - 1}} //- if it is not a spine if ({strcmp {compNoIndex} spine} != 0) //- calculate the index index = {substring {tail} \ {indexOpen + 1} \ {indexClose - 1}} //- remember to create a mapping bCreateMapping = 1 end end //- if we should create a mapping if (bCreateMapping) //- if the mapping already exists if (! {exists /mappings/{compNoIndex}}) //- create a neutral mapping element create neutral /mappings/{compNoIndex} //- add field for indices addfield /mappings/{compNoIndex} indexCount \ -description "Number of elements - 1" //- add field for number of synapses addfield /mappings/{compNoIndex} synapseCount \ -description "Number of synapses" //- add field for synapse begin addfield /mappings/{compNoIndex} synapseBegin \ -description "Synapse begin index" //- add field for synapse end addfield /mappings/{compNoIndex} synapseEnd \ -description "Synapse end index" //- clear the field setfield /mappings/{compNoIndex} \ synapseCount 0 end //- set index field setfield /mappings/{compNoIndex} \ indexCount {index} end end //- loop over all mappings with less than 30 indices foreach comp ( {el /mappings/#[][indexCount<30]} ) //- delete the mapping element delete {comp} end //- loop over all created mapping elements str mapping foreach mapping ( {el /mappings/#[]} ) //- get tail of mapping str mappingTail = {getpath {mapping} -tail} //echo Source elements : {path}/{mappingTail} //- initialize synapse begin and end index // because the Genesis reference manual does not document the // ranges for the different numerical types (int, float), // I use here 32767 as it is certainly big enough int synapseBegin = 32767 int synapseEnd = -1 //- loop over the source array for this mapping str source foreach source ( {el {path}/{mappingTail}[]} ) //- get the spine that gives messages to the element str spine = {getmsg {source} -outgoing -destination 7} //- get tail of spine str spineTail = {getpath {spine} -tail} //echo spine tail : {spineTail} //- if we are handling a spine if ( {strncmp {spineTail} "spine" 5} == 0 ) //- create a neutral compartment for the spine create neutral \ /mappings/{mappingTail}/{spineTail} //echo {source} -> {spineTail} //- if this is the first spine if (spineTail == "spine") //- add index [0] spineTail = "spine[0]" end //- get index of synapse int synapseIndex \ = {substring \ {spineTail} \ 6 \ {{strlen {spineTail}} - 1}} //- if the synapse index is the lowest so far if (synapseIndex < synapseBegin) //- remember the synapse begin synapseBegin = {synapseIndex} end //- if the synapse index is the highest so far if (synapseIndex > synapseEnd) //- remember synapse end synapseEnd = {synapseIndex} end end end //- set field for number of synapses and synaptic range setfield {mapping} \ synapseCount {NumberOfElements {mapping}/} \ synapseBegin {synapseBegin} \ synapseEnd {synapseEnd} end //- go to previous current element pope end /// /// SH: MappingDelete /// /// PA: path..: path with spines /// /// DE: Delete mappings created by MappingCreate /// function MappingDelete //- delete mappings element delete /mappings end end