//genesis
//InputFromFile.g
/*
1. What this file does:
This file has the functions for reading in the input from the file
into tables in genesis and for connecting these inputs to the synapses
of the cells. The connectInsignalToCell function takes as input
EACH individual cell name (SPcell(1) as oppossed to SPcell) and for that
cell loops through the different synapses in the different compartments
2. What this file does NOT do:
This file does not randomize the connection of the inputs to the synapses.
That function is performed in SimFile.g
NOTE: The files are generated in MATLAB with the ASSUMPTION that we are hooking
up every single input in the network. So at a minimum we must have enough inputs
for the synapses described in the nsynapses file.
Please note that readInputFromFile assumes that the files are numbered
from 1 and up, whereas the input naming convention starts from 0
*/
////////////////////////////////////////////////////////////////////////////////
//Connect the files for the unique inputs from the MATLAB files to the timetables.
function readInputFromFile(net, inputName, filePath, SynNum, Unique)
str inputName
str filePath
int SynNum
int Unique
if ({net}=="FS")
str inputBasePath = "/input"
else
end
if ({net}=="SP")
str inputBasePath = "/input2"
else
end
int ctr
str inputPath = {inputBasePath}@"/"@{inputName}
if({tmax} == 0)
// echo "readInputFromFile: Error, maxTime is set to 0"
quit
end
if(!{exists {inputBasePath}})
create neutral {inputBasePath}
end
// echo "Reading from "{filePath}" files 1 to "{SynNum}
// echo "Connecting input to "{inputPath}[0]" to "[{{SynNum}-1}]
pushe {inputBasePath}
for(ctr = 0; ctr < {Unique}; ctr = {ctr + 1})
create timetable {inputName}[{ctr}]
setfield {inputName}[{ctr}] maxtime {maxTime} \
method 4 \
act_val 1.0 \
fname {filePath}{{ctr}+1}".txt" //connect input from file with filename given in filepath
call {inputName}[{ctr}] TABFILL
create spikegen {inputName}[{ctr}]/spikes
setfield {inputName}[{ctr}]/spikes \
output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {inputName}[{ctr}] {inputName}[{ctr}]/spikes \
INPUT activation
end
pope
end
//Connect the files for the duplicate inputs
function readInputdFromFile(net,inputName, filePath_d, Dups)
str inputName
str filePath_d
int Dups
if ({net}=="FS")
str inputBasePath = "/input"
else
str inputBasePath = "/input2"
end
int ctr
//input name has cell number embedded and dup vs unique
str inputPath = {inputBasePath}@"/"@{inputName}
//echo "Connecting duplicate input to "{inputPath}[0]" to "[{{nAMPA}-1}]
pushe {inputBasePath}
//input name (inputPath) will not have a cell number
for(ctr = 0; ctr < {Dups}; ctr = {ctr + 1})
create timetable {inputName}[{ctr}]
setfield {inputName}[{ctr}] maxtime {maxTime} \
method 4 \
act_val 1.0 \
fname {filePath_d}{{ctr}+1}".txt" //Call the files generated to provide duplicate inputs
call {inputName}[{ctr}] TABFILL
create spikegen {inputName}[{ctr}]/spikes
setfield {inputName}[{ctr}]/spikes \
output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {inputName}[{ctr}] {inputName}[{ctr}]/spikes \
INPUT activation
end
pope
end
//////////////////////////////////////////////////////////////////////////////
//
// Connects insignal objects to the synapses of the cells
//
//////////////////////////////////////////////////////////////////////////////
//Function to randomly select the input file names from the tabchannels
function rannum_unique (tablename)
str tablename
int i
int last={getfield {tablename} X_A->xmax} //get the index of last element from the value of xmax
//echo "last=" {last}
int index={ round {rand -0.499 {last+0.499}} } //choose a random index
int filenum={getfield {tablename} X_A->table[{index}]} //return filenum associated with index selected above
setfield {tablename} X_A->table[{filenum}] {getfield {tablename} X_A->table[{last}]} //replace selected filenum with last element
setfield {tablename} X_A->xmax {last-1} //set xmax to be {last-1}
return {filenum}
end
//connects the timetable input to the SP network
function connectInsignalToCell(net,NetworkName,InsignaluName,InsignaldName,channelType,nu,nd,f_weight,s_weight)
str NetworkName, InsignaluName, InsignaldName, channelType, compName, compN
int insignalCtr = 0, dCtr, nsyn, nu, nd, i, tablemax, nsyn_allowed, f_weight, s_weight, nu_syn
if ({net}=="FS")
str inputBasePath = "/input"
else
str inputBasePath = "/input2"
end
// str networkBasePath = "/{net}network"
//input name has cell number embedded and dup vs unique
str InsignaluPath = {inputBasePath}@"/"@{InsignaluName}
str InsignaldPath = {inputBasePath}@"/"@{InsignaldName}
//str NetworkPath = {networkBasePath}@"/"@{NetworkName}
str NetworkPath = {NetworkName}
// echo "The function connectInsignal has been called"
// echo "Networkname=" {NetworkName} {InsignaluName} {InsignaldName}
create tabchannel inp //create a table to contain the indices of the filenames
disable inp
if ({channelType}=="NR2A")
tablemax = {getglobal nAMPA_{net}}
else
tablemax = {getglobal n{channelType}_{net}} //set tablemax to be number of synaptic inputs
end
call inp TABCREATE X {{tablemax}-1} 0 {{tablemax}-1}
for (i=0; i<{nu}; i={i+1})
setfield inp X_A->table[{i}] {i} //indices of unique filenames
setfield inp X_B->table[{i}] 0 //0 represents unique indices
end
for (i=0; i<{nd}; i={i+1})
setfield inp X_A->table[{i+nu}] {i} //indices of duplicate filenames
setfield inp X_B->table[{i+nu}] 1 //1 represents duplicate indices
end
// Connect to all compartments till we reach synapse number
int c=0
foreach compName ({el {NetworkPath}/##[TYPE=compartment]})
c = {c}+1
compN = {getpath {compName} -tail}
nsyn = {getfield {compName}/{channelType} nsynapses}
if ({channelType}=="AMPA" || {channelType}=="NR2A")
nsyn_allowed = {getfield {compName} nsynallowed_a}
elif ({channelType}=="GABA")
nsyn_allowed = {getfield {compName} nsynallowed_g}
else
end
// echo "compartment="{compN}
while ({nsyn}<{nsyn_allowed})
//echo "nsyn="{nsyn}
// echo "nsyn_allowed="{nsyn_allowed}
insignalCtr = {rannum_unique inp} //select index randomly using function above
if ({getfield inp X_B->table[{insignalCtr}]}==1) //if duplicate then addmsg from duplicate filenames
addmsg {InsignaldPath}[{insignalCtr}]/spikes {compName}/{channelType} SPIKE
else
addmsg {InsignaluPath}[{insignalCtr}]/spikes {compName}/{channelType} SPIKE //or unique
end
nsyn = {getfield {compName}/{channelType} nsynapses} //update nsyn for while check
nu_syn={nsyn}-1
if ({channelType}=="GABA")
setfield {compName}/{channelType} synapse[{nu_syn}].weight {f_weight}
else
setfield {compName}/{channelType} synapse[{nu_syn}].weight {getglobal weight_C_{net}}
end
end
if ({c}==(1+{getglobal prim_dend_num_{net}}+{getglobal sec_dend_num_{net}}+{getglobal tert_dend_num_{net}}))
c=0
else
end
end
call inp TABDELETE
delete inp
//reclaim //reclaim occupied space
end
function connectInsignalToCell_SP(net,NetworkName,InsignaluName,InsignaldName, channelType,nu,nd,f_weight,s_weight)
str NetworkName, InsignaluName, InsignaldName, channelType, compName, compN
int insignalCtr = 0, dCtr, nsyn, nu, nd, i, tablemax, nsyn_allowed, f_weight, s_weight, nu_syn
if ({net}=="FS")
str inputBasePath = "/input"
else
str inputBasePath = "/input2"
end
// str networkBasePath = "/{net}network"
//input name has cell number embedded and dup vs unique
str InsignaluPath = {inputBasePath}@"/"@{InsignaluName}
str InsignaldPath = {inputBasePath}@"/"@{InsignaldName}
//str NetworkPath = {networkBasePath}@"/"@{NetworkName}
str NetworkPath = {NetworkName}
// echo "The function connectInsignal has been called"
// echo "Networkname=" {NetworkName} {InsignaluName} {InsignaldName}
create tabchannel inp //create a table to contain the indices of the filenames
disable inp
if ({channelType}=="NR2A")
tablemax = {getglobal nAMPA_{net}}
else
tablemax = {getglobal n{channelType}_{net}} //set tablemax to be number of synaptic inputs
end
call inp TABCREATE X {{tablemax}-1} 0 {{tablemax}-1}
for (i=0; i<{nu}; i={i+1})
setfield inp X_A->table[{i}] {i} //indices of unique filenames
setfield inp X_B->table[{i}] 0 //0 represents unique indices
end
for (i=0; i<{nd}; i={i+1})
setfield inp X_A->table[{i+nu}] {i} //indices of duplicate filenames
setfield inp X_B->table[{i+nu}] 1 //1 represents duplicate indices
end
// Connect to all compartments till we reach synapse number
int c=0
foreach compName ({el {NetworkPath}/##[TYPE=compartment]})
c = {c}+1
compN = {getpath {compName} -tail}
nsyn = {getfield {compName}/{channelType} nsynapses}
if ({channelType}=="AMPA" || {channelType}=="NR2A")
nsyn_allowed = {getfield {compName} nsynallowed_a}
elif ({channelType}=="GABA")
nsyn_allowed = {getfield {compName} nsynallowed_g}
else
end
// echo "compartment="{compN}
while ({nsyn}<{nsyn_allowed})
//echo "nsyn="{nsyn}
// echo "nsyn_allowed="{nsyn_allowed}
insignalCtr = {rannum_unique inp} //select index randomly using function above
if ({getfield inp X_B->table[{insignalCtr}]}==1) //if duplicate then addmsg from duplicate filenames
addmsg {InsignaldPath}[{insignalCtr}]/spikes {compName}/{channelType} SPIKE
else
addmsg {InsignaluPath}[{insignalCtr}]/spikes {compName}/{channelType} SPIKE //or unique
end
nsyn = {getfield {compName}/{channelType} nsynapses} //update nsyn for while check
nu_syn={nsyn}-1
if ({channelType}=="GABA")
setfield {compName}/{channelType} synapse[{nu_syn}].weight {f_weight}
else
setfield {compName}/{channelType} synapse[{nu_syn}].weight {getglobal weight_C_{net}}
end
end
if ({c}==(1+{getglobal prim_dend_num_{net}}+{getglobal sec_dend_num_{net}}+{getglobal tert_dend_num_{net}}))
c=0
else
end
end
call inp TABDELETE
delete inp
//reclaim //reclaim occupied space
end
//////////////////////////////////////////////////////////////////////////////