//genesis - test of rasterplots with single compartment cells basic-cell.p float tmax = 0.25 // simulation time in sec float dt = 0.00005 // simulation time step in sec setclock 0 {dt} // set the simulation clock float injcurrent = 0.3e-9 // int Ncells = 32 int Ncells = 128 int Nplots = Ncells str timedata ="/time_data" // name of the array of tables str spike_time_file="spike_times.txt" // output file str cellfile = "basic-cell.p" /* Some Booleans indicating the type of calculations or output */ int batch = 0 // if (batch) run simulation with default injcurrent, tmax int graphics = 1 // display control panel, graphs //=============================== // Function Definitions //=============================== // The number of spike times will be around tmax/abs_refract // A very conservative estimate is tmax/0.001 int Npoints = {round {tmax/0.001}} // make array of tables to hold time series data to display function make_time_data_tables(Nplots, tmax, tablename) float tmax int Nplots int Npoints = {round {tmax/0.001}} str timedata = tablename int i int xdivs = Npoints float xmin = 0; float xmax = {tmax} // this is arbitrary for (i = 0; i < {Nplots}; i = i + 1) if ({exists {timedata}[{i}]}) // Get rid of any existing one with old xdivs delete {timedata}[{i}] end create table {timedata}[{i}] call {timedata}[{i}] TABCREATE {xdivs} {xmin} {xmax} setfield {timedata}[{i}] step_mode 4 stepsize 0.0 end // useclock {timedata} 1 end function make_time_data_file(Nplots,filename, tablename) str filename, tablename int i,j, ntimes, Nplots float spike_time openfile {filename} w for (i = 0; i < {Nplots}; i = i + 1) ntimes = {getfield {tablename}[{i}] output} for (j=0; j < {ntimes}; j = j + 1) spike_time = {getfield {tablename}[{i}] table->table[{j}]} // write it to the file writefile {filename} {spike_time} " " -n end writefile {filename} // put a final newline end // i = 0; i < {Nplots} closefile {filename} end function set_inject(value) str value float fract = 0.1 setrandfield /cell[]/soma inject \ -uniform {value*(1-fract)} {value*(1+fract)} end /* The Vm message source will have to be customized for other cell arrays */ function make_rasterplot_msgs(Nplots, Vm_src, dest_table) int i, Nplots str Vm_src, dest_table for (i = 0; i < {Nplots}; i = i + 1) addmsg {Vm_src}[{i}]/soma {dest_table}[{i}] INPUT Vm end end function step_tmax step {tmax} -time make_time_data_file {Nplots} {spike_time_file} {timedata} end //=============================== // Graphics Functions //=============================== function make_control create xform /control [10,50,250,145] create xlabel /control/label -hgeom 50 -bg cyan -label "CONTROL PANEL" create xbutton /control/RESET -wgeom 33% -script reset create xbutton /control/RUN -xgeom 0:RESET -ygeom 0:label -wgeom 33% \ -script step_tmax create xbutton /control/QUIT -xgeom 0:RUN -ygeom 0:label -wgeom 34% \ -script quit create xdialog /control/Injection -label "Injection (amperes)" \ -value 0.3e-9 -script "set_inject <value>" xshow /control end /* GENESIS 2 cannot make raster plots. make_fastplots generates Nplots tiny plots of Vm within a rarely-used G2 xfastplot element. */ function make_fastplots(form,plotname,Nplots) int form_height = 800 int i, Nplots str form, plotname float vmin = -0.100 float vmax = 0.05 int plot_height = {round {form_height/Nplots}} create xform {form} [265,370,500,525] for (i = 0; i < {Nplots}; i = i + 1) create xfastplot {form}/{plotname}[{i}] -ygeom {plot_height*i} \ -hgeom {plot_height} setfield ^ xaxis_flag 0 yaxis_flag 0 setfield ^ xmax {tmax} ymin {vmin} ymax {vmax} setfield ^ npts {round {tmax/{getclock 0}}} setfield ^ oscope_flag 0 line_flag 0 color 2 setfield ^ lborder 0 bborder 0 end xshow {form} end /* Create a library of prototype elements to be used by the cell reader Included files are in genesis/Scripts/neurokit/prototypes */ // include the definitions for the functions to create H-H tabchannels include hh_tchan EREST_ACT = -0.07 // resting membrane potential (volts) ENA = 0.045 // sodium equilibrium potential EK = -0.082 // potassium equilibrium potential // Make a "library element" to hold the prototypes, which will be used // by the cell reader to add compartments and channels to the cell. create neutral /library // We don't want the library to try to calculate anything, so we disable it disable /library // To ensure that all subsequent elements are made in the library pushe /library create compartment compartment make_Na_hh_tchan make_K_hh_tchan create spikegen spike setfield spike thresh -0.03 abs_refract 2.0e-3 output_amp 1 pope // Return to the original place in the element tree //=============================== // Main Script //=============================== readcell {cellfile} /cell // provide current injection to the soma - to be modified setfield /cell/soma inject 0.3e-9 // 0.3 nA injection current // This should later become a function using createmap // Make the array of cells int i for (i = 1; i < {Ncells}; i = i + 1) copy /cell /cell[{i}] end set_inject {injcurrent} // Make the array of {timedata}[]} tables make_time_data_tables {Nplots} {tmax} {timedata} make_rasterplot_msgs {Nplots} /cell {timedata} if (graphics) // make the control panel make_control // make the fastplot to display soma Vm for all cells make_fastplots "/raster" "plot" {Nplots} // Add the messages to plot for (i = 0; i < {Nplots}; i = i + 1) addmsg /cell[{i}]/soma /raster/plot[{i}] NPLOT Vm 1 0 end end check reset if (batch) step_tmax end