// genesis - simulate 2-cpt neuron with active soma, passive dendrite maxwarnings 100 // Output format addglobal str out_form "%0.15g" setclock 2 100 // prevents carriage returns from sim_chan // set injection current: creates tables inject_1...inject_n (n=ninj) of injection currents // note: requires scanned table to start at time zero function set_inject(files) if ({strcmp {files} "none"}) int j, ninj={getarg {arglist {files}} -count} for (j=1; j<={ninj}; j=j+1) create table "time" call "time" TABCREATE 1 0 1 // default to be overwritten str file = {getarg {arglist {files}} -arg {j}} file2tab {file} "time" table -table2 "dummy" float tdivs = {getfield time table->xdivs} create table "inject_"{j} call "inject_"{j} TABCREATE 1 0 1 // default to be overwritten setfield "inject_"{j} step_mode 2 stepsize 0 file2tab {file} "inject_"{j} table -xy {tdivs} echo "set inject_"{j}" for" {file} end else echo "injection current not specified in file" end end // output params: output_params <dir> <file> <object> <var1> <var2> ... function output_params(dir,file,object,var) str dir, file, object, var if (!{exists {file}}) // create & open asc_file if doesn't exist create asc_file {file} setfield {file} filename {dir}/{file} leave_open 1 append 1 float_format {out_form} call {file} OUT_OPEN // (careful - think acts as toggle) end int i, nv=({argc}-3) for (i=1; i<={nv}; i=i+1) // iterate through variables str var = {argv {3+i}} // ... and write value to file call {file} OUT_WRITE "%" {object} {var} {getfield {object} {var}} end end // output morphology: output_mrphgy <dir> <file> <cpmpt> function output_mrphgy(dir,file,cpmnt) str dir, file, cpmnt, cpmnt1, lij, lji if (!{exists {file}}) // create & open asc_file if doesn't exist create asc_file {file} setfield {file} filename {dir}/{file} leave_open 1 append 1 float_format {out_form} call {file} OUT_OPEN // (careful - think acts as toggle) end int i, ncpmnt={countelementlist /cell/##[CLASS=membrane]} // # cpmnts for (i=1; i<=ncpmnt; i=i+1) // iterate through compartments cpmnt1 = {getarg {el /cell/##[CLASS=membrane]} -arg {i}} lij = {{getmsg {cpmnt} -in -find {cpmnt1} RAXIAL}>0} lji = {{getmsg {cpmnt1} -in -find {cpmnt} RAXIAL}>0} call {file} OUT_WRITE "%" {cpmnt} {cpmnt1} {lij+lji} end end // output results: output_sim <dir> <file> <object> <var1> <var2> ... function output_sim(dir,file,object,var) str dir, file, object, var if (!{exists {file}}) // create & open asc_file if doesn't exist create asc_file {file} setfield {file} filename {dir}/{file} leave_open 1 append 1 float_format {out_form} call {file} OUT_OPEN // (careful - think acts as toggle) end useclock {file} 1 int i, nv=({argc}-3) for (i=1; i<={nv}; i=i+1) // write header describing vars str var = {argv {3+i}} call {file} OUT_WRITE "%" {object} {var} end for (i=1; i<={nv}; i=i+1) // iterate through variables str var = {argv {3+i}} // ... and add message to asc_file addmsg {object} {file} SAVE {var} end end // output channels: output_XYchan <dir> <file> <loc> function output_XYchan(dir,file,loc) str dir, file, loc if (!{exists {file}}) // create & open asc_file if doesn't exist create asc_file {file} setfield {file} filename {dir}/{file} notime 1 leave_open 1 append 1 float_format {out_form} call {file} OUT_OPEN end useclock {file} 2 // HACK - small clock step avoids carriage returns int i, j, nchan={countelementlist {loc}/#[CLASS=channel]} for (i=1; i<=nchan; i=i+1) // write header describing channels str channel = {getarg {el {loc}/#[CLASS=channel]} -arg {i}} float Ek={getfield {channel} Ek}, Gbar={getfield {channel} Gbar} float Xp={getfield {channel} Xpower}, Yp={getfield {channel} Ypower} call {file} OUT_WRITE "%" {channel} "Ek" {Ek} "Gbar" {Gbar} "Xpower" {Xp} "Ypower" {Yp} end for (i=1; i<=nchan; i=i+1) // loop through channels str channel = {getarg {el {loc}/#[CLASS=channel]} -arg {i}} float X_alloced={getfield {channel} X_alloced}, Y_alloced={getfield {channel} Y_alloced} if (X_alloced) // find voltage range of channel float xmin={getfield {channel} X_A->xmin}, dx={getfield {channel} X_A->dx} float xdivs={getfield {channel} X_A->xdivs} elif (Y_alloced) float xmin={getfield {channel} Y_A->xmin}, dx={getfield {channel} Y_A->dx} float xdivs={getfield {channel} Y_A->xdivs} else // flag up if both X & Y undefined echo {channel} "undefined" return end for (j=0; j<={xdivs}; j=j+1) // loop through voltage vals if (X_alloced) // find X float x_A={getfield {channel} X_A->table[{j}]} float x_B={getfield {channel} X_B->table[{j}]} else str x_A="nan", x_B="nan" end if (Y_alloced) // find Y float y_A={getfield {channel} Y_A->table[{j}]} float y_B={getfield {channel} Y_B->table[{j}]} else str y_A="nan", y_B="nan" end // then write to file call {file} OUT_WRITE {xmin+dx*j} {x_A} {x_B} {y_A} {y_B} end end end //=============================== // Main Script //=============================== // set injection current set_inject {files_inject} // Morphological parameters float pi = 3.14, SA = pi*len*dia, SA1 = pi*len1*dia1, XA = pi*dia*dia/4, XA1 = pi*dia1*dia1/4 // Make the cell create neutral /cell create compartment /cell/soma create compartment /cell/dend setfield /cell/soma dia {dia} len {len} Em {Em0} Cm {CM0*SA} Rm {RM0/SA} Ra {RA0*len/XA} setfield /cell/dend dia {dia1} len {len1} Em {Em0} Cm {CM0*SA1} Rm {RM0/SA1} Ra {RA0*len1/XA1} addmsg /cell/dend /cell/soma RAXIAL Ra previous_state addmsg /cell/soma /cell/dend AXIAL previous_state // Add channels to soma int j, nchans={countelementlist {loc_chans}/[CLASS=channel]} for (j=1; j<={nchans}; j=j+1) str chan = {getarg {el {loc_chans}/[CLASS=channel]} -arg 1} setfield {chan} Gbar {{getarg {arglist {G}} -arg {j}}*SA} addmsg {chan} /cell/soma CHANNEL Gk Ek addmsg /cell/soma {chan} VOLTAGE Vm move {chan} /cell/soma end // Initialise sim check reset setclock 0 {100*dt} setfield /cell/soma inject {getfield inject_1 table->table[0]} // init inj current step 100 -t // Output results from all compartments to text file str file="data_IV.dat", cpmnt int i, ncpmnt={countelementlist /cell/##[CLASS=membrane]} // # cpmnts for (i=1; i<=ncpmnt; i=i+1) // iterate through compartments cpmnt = {getarg {el /cell/##[CLASS=membrane]} -arg {i}} output_params {dir_out} {file} {cpmnt} Em Rm Cm Ra len dia // passive params output_mrphgy {dir_out} {file} {cpmnt} // morphology end output_sim {dir_out} {file} /cell/soma inject // injection current for (i=1; i<=ncpmnt; i=i+1) // iterate through other compartments cpmnt = {getarg {el /cell/##[CLASS=membrane]} -arg {i}} output_sim {dir_out} {file} {cpmnt} Vm end // Output channel defns to text file output_XYchan {dir_out} data_XY.dat /cell/soma // Save initial state (user defined dir - using same as output_results) save /cell/## {dir_out}/mycell.save // Run sim int i for (i=1; i<={countelementlist /inject_#}; i=i+1) reset setclock 0 {dt} restore {dir_out}/mycell.save addmsg "inject_"{i} /cell/soma INJECT output // created by set_params step {getfield inject_1 table->xmax} -t // tmax from injection current deletemsg /cell/soma 0 -incoming -find "/inject_"{i} INJECT end quit