// genesis - replay_netview.g /* The replay_netview utility reads binary disk_out files produced by ACnet2, displaying network activity and Vm plots of the middle cell of specified rows. It also calculates spike statistics to provide average firing rate and distribution plots, and power spectra of summed Excitatory Post Synaptic Currents (EPSC). It gets simulation parameters from a "run summary_<RUNID>.txt" text file. David Beeman, August 2013 */ // Unfortunately, data must exist for this RUNID, even if it will be changed str RUNID = "0000" // default ID string for data file names int debug = 1 // flag to print addtional info to console float octave_distance = 0.96e-3 // approx 1 mm/octave // used to give integer rows/octave /* These defaults will be changed by function load_params to values in {sum_file}_{RUNID}.txt. The value of {dt} for clock 0 will be set to that used in the simulation, but most of the work in this script is done by clock 1 with step {out_dt} (for the summed EPS current file), and clock 2 with step {netview_dt}, which is used for the disk_in objects and the netview display. It is the clock for any analysis that uses soma Vm data vs. time for the network Ex_cells and Inh_cells. The frequency_monitor, rasterplot, and the functions used for calculating average spike frequencies for groups of neurons use clock 3 to set the width of the bins for frequency(time) {freq_binwidth}. Clock 4 is a very long clock used to prevent calculator objects from reseting at the end of a clock step. */ float dt = 20e-6 // simulation time step for clock 0 float netview_dt = 0.0002 // slowest clock for netview display float out_dt = 0.0001 // clock used for the summed EPS current file float tmax = 1.0 // max simulation run time (sec) int EPSC_output = 0 // did simulation output Ex_ex EPS currents? // At present, use EPSC_output for both. int calc_EPSCsum = 1 // did it calculate summed EPScurrents? int netview_output = 0 // did simulation output Vm for all network cells? // These are NOT set by load_params int plot_spikedist = 1 // make a histogram of spike frequency distribution int plot_spikefreq = 1 // hack until I get consistent int write_spikefreqs = 1 // write file of average freq(t) for each targ_row // some globals used by spectra_funcs4.g int graphics = 1 // Use graphics (required) str timedata = "/time_data" // name of the table used to hold EPSC data // Additional definitions for calculating spike times for raster plots // used in analysis_funcs int n_per_row = 5 // number of cells per row to use in raster plot str spikedata ="/spike_data" // name of the array of spike time tables str EPSC_sum_file = "EPSC_sum" // prefix for summed Ex_ex currents str net_EPSC_file = "EPSC_netview" // filename prefix for Ex_ex_synpath Ik (EPSCs) str net_efile = "Ex_netview" // filename prefix for Ex_netview data str net_ifile = "Inh_netview" // filename for prefix Inh_netview data str sum_file = "run_summary" // text file prefix for summary of run params // Added delay between time steps to slow down the netview display // float frame_delay = 2.5*netview_dt/tmax float frame_delay = 0.0 // Default values may be changed by load_params, but views will not be resized! // int Ex_NX = 48; int Ex_NY = 72 // int Inh_NX = 24; int Inh_NY = 36 int Ex_NX = 48; int Ex_NY = 48 int Inh_NX = 24; int Inh_NY = 24 float Ex_SEP_X = 40e-6 float Ex_SEP_Y = 40e-6 float Inh_SEP_X = 2*Ex_SEP_X // There are 1/4 as many inihibitory neurons float Inh_SEP_Y = 2*Ex_SEP_Y // Will be read and replaced using load_params int Ninputs = 56 // number of input channels int rows_per_octave = {round {octave_distance/Ex_SEP_Y}} //default is 24 int row_offset = {round {rows_per_octave/3.0}} // To skip top and bottom rows // row_offset = first_row // int row_offset = 8 int Nrows = Ex_NY - 2*row_offset // will be recalculated with load_params /* Get network simulation parameters from run_summary file */ function load_params // This should be called early on to set parameters str filename str linelist // Will hold a line read from {filename} filename = {"run_summary_" @ {RUNID} @ ".txt"} if ({fileexists {filename}}) openfile {filename} r readfile {filename} // skip line 1 with script_name, RUNID, seed, date // This is a trick to separately get multiple values on one line // without doing another read linelist = {readfile {filename} -l} // Line 2 has tmax and clocks tmax = {getarg {arglist {linelist}} -arg 2} dt = {getarg {arglist {linelist}} -arg 4} out_dt = {getarg {arglist {linelist}} -arg 6} netview_dt = {getarg {arglist {linelist}} -arg 8} linelist = {readfile {filename} -l} // Line 3 has output flags EPSC_output = {getarg {arglist {linelist}} -arg 2} netview_output = {getarg {arglist {linelist}} -arg 4} linelist = {readfile {filename} -l} // Line 4 has number of cells Ex_NX = {getarg {arglist {linelist}} -arg 2} Ex_NY = {getarg {arglist {linelist}} -arg 4} Inh_NX = {getarg {arglist {linelist}} -arg 6} Inh_NY = {getarg {arglist {linelist}} -arg 8} linelist = {readfile {filename} -l} // Line 5 has cell separations Ex_SEP_X = {getarg {arglist {linelist}} -arg 2} Ex_SEP_Y = {getarg {arglist {linelist}} -arg 4} Inh_SEP_X = {getarg {arglist {linelist}} -arg 6} Inh_SEP_Y = {getarg {arglist {linelist}} -arg 8} Ninputs = {getarg {readfile {filename}} -arg 2} closefile {filename} // frame_delay = 2.5*netview_dt/tmax // set appropriate display delay rows_per_octave = {round {octave_distance/Ex_SEP_Y}} row_offset = {round {rows_per_octave/3.0}} Nrows = Ex_NY - 2*row_offset else echo "File " {filename} " does not exist!" end // at present, EPSC_output is used for netview and calc_EPSCsum for summed EPSC end // function load_params function step_tmax echo "dt = "{getclock 0}" tmax = "{tmax} echo "START: " {getdate} step {tmax} -time echo "END : " {getdate} end /* Utility functions used by the GUI */ extern load_summary extern open_files extern make_netview extern make_graph_messages extern make_time_data_table // from spectra_funcs3.g function change_stepsize(dialog) str dialog dt = {getfield {dialog} value} setclock 0 {dt} echo "Changing step size to "{dt} end function change_runtime(dialog) str dialog tmax = {getfield {dialog} value} end /* This does most of the setup and opens the data files to be used */ function change_RUNID(dialog) str dialog, filename RUNID = {getfield {dialog} value} filename = {{sum_file} @ "_" @ {RUNID} @ ".txt"} if ({fileexists {filename}}) // Only check for the summary file load_params // this should be generalized setfield /control/runtime value {tmax} setfield /control/stepsize value {dt} setfield /control/frame_delay value {frame_delay} load_summary setfield /control/spike_filename value spike_times_{RUNID}.txt open_files make_graph_messages setfield /data/##[ISA=xgraph] xmax {tmax} if (plot_spikefreq) setfield /freq_form/frequency xmax {tmax} end else // file doesn't exist setfield {dialog} value "0000" end end // Functions invoked by the script_out element /frame_delay function get_current_time setfield /control/current_time value {getstat -time} sleep {frame_delay} end function change_frame_delay(delay) str delay frame_delay = delay enable /frame_delay useclock /frame_delay 2 setfield /frame_delay command "get_current_time" get_current_time end /* ================================================================== Graphics tools used in many "graphics.g" scripts ================================================================== */ /* A subset of the functions defined in genesis/startup/xtools.g These are used to provide a "scale" button to graphs. "makegraphscale path_to_graph" creates the button and the popup menu to change the graph scale. */ function setgraphscale(graph) str graph str form = graph @ "_scaleform" str xmin = {getfield {form}/xmin value} str xmax = {getfield {form}/xmax value} str ymin = {getfield {form}/ymin value} str ymax = {getfield {form}/ymax value} setfield {graph} xmin {xmin} xmax {xmax} ymin {ymin} ymax {ymax} xhide {form} end function showgraphscale(form) str form str x, y // find the parent form str parent = {el {form}/..} while (!{isa xform {parent}}) parent = {el {parent}/..} end x = {getfield {parent} xgeom} y = {getfield {parent} ygeom} setfield {form} xgeom {x} ygeom {y} xshow {form} end function makegraphscale(graph) if ({argc} < 1) echo usage: makegraphscale graph return end str graph str graphName = {getpath {graph} -tail} float x, y str form = graph @ "_scaleform" str parent = {el {graph}/..} while (!{isa xform {parent}}) parent = {el {parent}/..} end x = {getfield {graph} x} y = {getfield {graph} y} create xbutton {graph}_scalebutton \ [{getfield {graph} xgeom},{getfield {graph} ygeom},50,25] \ -title scale -script "showgraphscale "{form} create xform {form} [{x},{y},180,170] -nolabel disable {form} pushe {form} create xbutton DONE [10,5,55,25] -script "setgraphscale "{graph} create xbutton CANCEL [70,5,55,25] -script "xhide "{form} create xdialog xmin [10,35,160,25] -value {getfield {graph} xmin} create xdialog xmax [10,65,160,25] -value {getfield {graph} xmax} create xdialog ymin [10,95,160,25] -value {getfield {graph} ymin} create xdialog ymax [10,125,160,25] -value {getfield {graph} ymax} pope end /* Add some interesting colors to any widgets that have been created */ function colorize setfield /##[ISA=xlabel] fg white bg blue3 setfield /##[ISA=xbutton] offbg rosybrown1 onbg rosybrown1 setfield /##[ISA=xtoggle] onfg red offbg cadetblue1 onbg cadetblue1 setfield /##[ISA=xdialog] bg palegoldenrod setfield /##[ISA=xgraph] bg ivory end // function to return a color name from an index into the colorlist // Usage example: str color = {colors 3} function colors(col_num) int col_num str colorlist = "black blue cyan green magenta red orange" str color // convert col_num to range 1 though 7 col_num = col_num - {trunc {col_num/7.0}}*7 + 1 color = {getarg {arglist {colorlist}} -arg {col_num}} return {color} end /* The function "sumwindow" (adapted from "textwindow" creates a form 600 pixels wide and 336 pixels high at x,y to display the specified text file with scrolling and paging. Using the default font (7x13bold), this provides room for 24 lines with 78 characters per line and a one character right and left margin. (The left margin is provided automatically.) */ //===================================================================== // sumwindow formpath,x,y // creates a form 600 pixels wide and 336 pixels high at x,y to display // the specified text file with scrolling and paging //===================================================================== function sumwindow(formpath, x, y) str formpath, textfile int x, y, width, height height = 336 width = 600 create xform {formpath} [{x},{y},{width},{height}] -nolabel pushe {formpath} create xlabel textbar [40,0,{100*(width - 40)/width}%,20] -label \ "Click and drag the left mouse button on the scroll bar to scroll the text" create xbutton DONE [0,0,40,20] -script "xhide "{formpath} create xtext run_summary [0%,20,100%,94%] -bg white pope xshow {formpath} end //================================== // Functions to set up the GUI //================================== function make_control create xform /control [0,0,270,345] pushe /control create xlabel label -hgeom 25 -bg cyan -label "CONTROL PANEL" create xbutton RESET -wgeom 25% -script reset create xbutton RUN -xgeom 0:RESET -ygeom 0:label -wgeom 25% \ -script step_tmax create xbutton STOP -xgeom 0:RUN -ygeom 0:label -wgeom 25% \ -script stop create xbutton QUIT -xgeom 0:STOP -ygeom 0:label -wgeom 25% -script quit create xdialog RUNID -title "RUNID string:" -value {RUNID} \ -script "change_RUNID <widget>" create xdialog stepsize -title "dt (sec)" -value {netview_dt} \ -script "change_stepsize <widget>" create xdialog runtime -title "runtime (sec)" -value {tmax} \ -script "change_runtime <widget>" create xdialog frame_delay -title "frame delay (sec)" -value {frame_delay} \ -script "change_frame_delay <v>" create xbutton show_spectrum -wgeom 50% -title "Show spectrum" \ -script "xshow /spectra_form" create xbutton show_spikefreq -wgeom 50% -ygeom 0:frame_delay \ -xgeom 0:show_spectrum -title "Show spike rate" \ -script "xshow /freq_form" create xbutton show_ratedist -ygeom 0:show_spectrum \ -title "Show avg spike rate distribution" -script "xshow /histform" create xbutton write_rasterfile -title "Write spike times to file" \ -script do_write_rasterfile create xdialog spike_filename -title Filename \ -value spike_times_{RUNID}.txt create xdialog n_per_row -title "cells/row to record" -value {n_per_row} \ -script "change_n_per_row <widget>" create xdialog current_time -script get_current_time -value 0.000 pope xshow /control end function load_summary str filename filename = {"run_summary_" @ {RUNID} @ ".txt"} if ({fileexists {filename}}) setfield /summary_form/run_summary filename {filename} else echo "File " {filename} " does not exist!" end end function make_Vmgraph str graph_form = "/data" str graphlabel = "Vm of center input targets" float vmin = -0.07 float vmax = 0.65 create xform {graph_form} [275,0,400,800] pushe {graph_form} create xlabel label -label {graphlabel} create xgraph voltage -hgeom 64% -title "Ex_cell Membrane Potential" ! setfield ^ XUnits sec YUnits V setfield ^ xmax {tmax} ymin {vmin} ymax {vmax} makegraphscale {graph_form}/voltage useclock voltage 2 // the clock used to write the netview file create xgraph Inh_voltage -hgeom 30% -ygeom 0:voltage \ -title "Inh_cell Membrane Potential" -bg white setfield ^ XUnits sec YUnits V setfield ^ xmax {tmax} ymin {vmin} ymax {vmax} makegraphscale {graph_form}/Inh_voltage create xdialog drop_plot -wgeom 50% -ygeom 0:Inh_voltage \ -title "Drop plot" -value 0 -script "drop_Vmplot <v>" create xdialog add_plot -xgeom 0:drop_plot -ygeom 0:Inh_voltage \ -title "Add plot" -value 0 -script "add_Vmplot <v>" useclock Inh_voltage 2 // the clock used to write the netview file pope xshow {graph_form} end function make_netview // sets up xview widget to display Vm of each cell // Adjust the aspect ratio for rectangular networks of width around 400 // Make view for Ex_cell[] int npixels = 2*{round {180/Ex_NX}} int Ex_view_width = npixels*Ex_NX + 20 int Ex_view_height = npixels*Ex_NY + 17 if ({exists /Ex_netview}) // make a new one of the right size delete /Ex_netview end create xform /Ex_netview [680,0,{Ex_view_width},{Ex_view_height}] create xdraw /Ex_netview/draw [0%,0%,100%, 100%] // Make the display region a little larger than the cell array setfield /Ex_netview/draw xmin {-Ex_SEP_X} xmax {Ex_NX*Ex_SEP_X} \ ymin {-Ex_SEP_Y} ymax {Ex_NY*Ex_SEP_Y} create xview /Ex_netview/draw/view setfield /Ex_netview/draw/view value_min -0.08 value_max 0.04 \ viewmode colorview morph_val 0 sizescale {Ex_SEP_X} useclock /Ex_netview/draw/view 2 // clock used to write netview file xshow /Ex_netview int Inh_view_width = npixels*Inh_NX + 20 int Inh_view_height = npixels*Inh_NY + 10 if ({exists /Inh_netview}) // make a new one of the right size delete /Inh_netview end create xform /Inh_netview [{255 - Inh_view_width}, 335, \ {Inh_view_width + npixels}, {Inh_view_height}] create xdraw /Inh_netview/draw [0%,0%,100%, 100%] // Make the display region a little larger than the cell array setfield /Inh_netview/draw xmin {-Inh_SEP_X} xmax {Inh_NX*Inh_SEP_X} \ ymin {-Inh_SEP_Y} ymax {Inh_NY*Inh_SEP_Y} create xview /Inh_netview/draw/view setfield /Inh_netview/draw/view value_min -0.08 value_max 0.03 \ viewmode colorview morph_val 0 sizescale {Inh_SEP_X} useclock /Inh_netview/draw/view 2 // clock used to write netview file xshow /Inh_netview /* For now, assume existence of EPSC_file */ if ({exists /EPSC_netview}) // make a new one of the right size delete /EPSC_netview end create xform /EPSC_netview [990,0,{Ex_view_width},{Ex_view_height}] create xdraw /EPSC_netview/draw [0%,0%,100%, 100%] // Make the display region a little larger than the cell array setfield /EPSC_netview/draw xmin {-Ex_SEP_X} xmax {Ex_NX*Ex_SEP_X} \ ymin {-Ex_SEP_Y} ymax {Ex_NY*Ex_SEP_Y} create xview /EPSC_netview/draw/view setfield /EPSC_netview/draw/view value_min 0.0 value_max 2e-9 \ viewmode colorview morph_val 0 sizescale {Ex_SEP_X} useclock /EPSC_netview/draw/view 2 // clock used to write netview file xshow /EPSC_netview end function open_files str filename if ({exists /Ex_diskin}) delete /Ex_diskin end if ({exists /Inh_diskin}) delete /Inh_diskin end if ({exists /EPSC_diskin}) delete /EPSC_diskin end if ({exists /EPSC_sum_diskin}) delete /EPSC_sum_diskin end filename = {{net_efile} @ "_" @ {RUNID} @ ".dat"} if ({fileexists {filename}}) create disk_in /Ex_diskin setfield /Ex_diskin filename {filename} fileformat 1 leave_open 1 call /Ex_diskin RESET setclock 2 {netview_dt} useclock /Ex_diskin 2 end filename = {{net_ifile} @ "_" @ {RUNID} @ ".dat"} if ({fileexists {filename}}) create disk_in /Inh_diskin setfield /Inh_diskin filename {filename} fileformat 1 leave_open 1 call /Inh_diskin RESET setclock 2 {netview_dt} useclock /Inh_diskin 2 end filename = {{net_EPSC_file} @ "_" @ {RUNID} @ ".dat"} if ({fileexists {filename}}) create disk_in /EPSC_diskin setfield /EPSC_diskin filename {filename} fileformat 0 leave_open 1 call /EPSC_diskin RESET setclock 2 {netview_dt} useclock /EPSC_diskin 2 end filename = {{EPSC_sum_file} @ "_" @ {RUNID} @ ".txt"} if ({fileexists {filename}}) create disk_in /EPSC_sum_diskin setfield /EPSC_sum_diskin filename {filename} fileformat 0 leave_open 1 setfield /EPSC_sum_diskin nx 2 ny 1 setclock 1 {out_dt} useclock /EPSC_sum_diskin 1 end end // function open_files /* Functions to drop and add plots of Vm for middle cell of input target row */ function drop_Vmplot(input_num) int input_num, del_num, n, count str label, msglabel label = "targ_" @ {input_num} count = {getmsg /data/voltage -in -count} del_num = -1 // set to < 0 initially, then look for message to delete for (n = 0; n < count; n = n +1) msglabel = {getmsg /data/voltage -in -slot {n} 1 } if ({msglabel} == {label}) del_num = n echo "Dropping plot " {n} " " {msglabel} end end if (del_num >= 0) deletemsg /data/voltage {del_num} -in else echo "A plot for input" {input_num} " does not exist." end // redo this for /data/Inh_voltage without assuming it has same messages count = {getmsg /data/Inh_voltage -in -count} del_num = -1 // set to < 0 initially, then look for message to delete for (n = 0; n < count; n = n +1) msglabel = {getmsg /data/Inh_voltage -in -slot {n} 1 } if ({msglabel} == {label}) del_num = n echo "Dropping plot " {n} " " {msglabel} end end if (del_num >= 0) deletemsg /data/Inh_voltage {del_num} -in else echo "A plot for input" {input_num} " does not exist." end end function add_Vmplot(row_num) int row_num, cell_num, dup_num, n, count str label, msglabel float offset // offset for plots float delta_y = 0.02 // vertical displacement of subsequent plots int first_row = row_offset // the first row to be plotted has no vertical offset // target is middle cell in row targeted by input_num cell_num = row_num*Ex_NX + {round {(Ex_NX -1)/2.0}} // generate PLOTSCALE options {value} *{label} *{color} scale offset label = "targ_" @ {row_num} offset = (row_num - first_row)*delta_y count = {getmsg /data/voltage -in -count} dup_num = -1 // default is that the message doesn't already exist for (n = 0; n < count; n = n +1) msglabel = {getmsg /data/voltage -in -slot {n} 1 } if ({msglabel} == {label}) dup_num = n echo "Plot " {n} " " {msglabel} " already exists" end end if (dup_num < 0) addmsg /Ex_diskin /data/voltage PLOTSCALE val[0][{cell_num}] \ *{label} *{colors {row_num}} 1 {offset} end // MGBv inputs target y-coord range, not a row, and Inh cells have // twice the spacing of Ex cell. Thus the row numbers of Inh inputs // increase at half the rate. cell_num = {round {row_num*Inh_NX/2.0}} + {round {(Inh_NX -1)/2.0}} // redo this for /data/Inh_voltage without assuming it has same messages count = {getmsg /data/Inh_voltage -in -count} dup_num = -1 // default is that the message doesn't already exist for (n = 0; n < count; n = n +1) msglabel = {getmsg /data/Inh_voltage -in -slot {n} 1 } if ({msglabel} == {label}) dup_num = n echo "Plot " {n} " " {msglabel} " already exists" end end if (dup_num < 0) addmsg /Inh_diskin /data/Inh_voltage PLOTSCALE val[0][{cell_num}] \ *{label} *{colors {row_num}} 1 {offset} end end extern make_freqmon // defined below analysis_funcs extern make_freqmon_messages /***** include analysis_funcs5.g ******/ include analysis_funcs5.g // functions for spike analysis /* Function used in control panel to output spike time data to a file for raster plots. Note that the present version only plots rows from row_offset to Ex_NY - row_offset */ function do_write_rasterfile str form = "/control" str spike_time_file = {getfield {form}/spike_filename value} int Nplots = n_per_row*Nrows // these are both globals make_spike_time_file {Nplots} {spike_time_file} {spikedata} if (debug) echo "Wrote spike time data file "{spike_time_file} end end // Warning - This will reset the run and allocate new spike_data tables function change_n_per_row(dialog) str dialog n_per_row = {getfield {dialog} value} change_RUNID /control/RUNID end /* Set up plotting messages to the graphs and netviews from disk_in objects */ function make_graph_messages int j int nx = {getfield /Ex_diskin nx} int ny = {getfield /Ex_diskin ny} // For FMT1 files, nx = 1 and x index is 0 // Set up messages to the views for (j = 0; j < ny; j = j + 1) addmsg /Ex_diskin /Ex_netview/draw/view VAL1 val[0][{j}] end // Now do for the In view int nx = {getfield /Inh_diskin nx} int ny = {getfield /Inh_diskin ny} for (j = 0; j < ny; j = j + 1) addmsg /Inh_diskin /Inh_netview/draw/view VAL1 val[0][{j}] end // Assume that there will be a /EPSC_diskin with Ik values int nx = {getfield /EPSC_diskin nx} int ny = {getfield /EPSC_diskin ny} // For FMT1 files, nx = 1 and x index is 0 // Set up messages to the views for (j = 0; j < ny; j = j + 1) addmsg /EPSC_diskin /EPSC_netview/draw/view VAL1 val[0][{j}] end reset // It is evidently not sufficient to reset just the diskins here // After a reset, this properly initializes position of shapes in view // However the following lines sometimes cause an error // "src table /Ex_diskin/ xpts not allocated" setfield /Ex_netview/draw/view xpts /Ex_diskin/xpts setfield /Ex_netview/draw/view ypts /Ex_diskin/ypts setfield /Ex_netview/draw/view zpts /Ex_diskin/zpts setfield /Inh_netview/draw/view xpts /Inh_diskin/xpts setfield /Inh_netview/draw/view ypts /Inh_diskin/ypts setfield /Inh_netview/draw/view zpts /Inh_diskin/zpts setfield /EPSC_netview/draw/view xpts /EPSC_diskin/xpts setfield /EPSC_netview/draw/view ypts /EPSC_diskin/ypts setfield /EPSC_netview/draw/view zpts /EPSC_diskin/zpts // Set up messages to the Vm graphs add_Vmplot 8 add_Vmplot 12 add_Vmplot 18 add_Vmplot 24 add_Vmplot 30 add_Vmplot 36 // make tables and messages for spike times - from analysis_funcs setup_rasterplot {n_per_row} // n_per_row is globally defined // the EPSC_output flag is set in the run_summary file to indicate that the EPSC // netview output is enabled. But, assume that the summed EPS currents // are also provided in {EPSC_sum_file}, and that calc_EPSCsum is also set. if ({calc_EPSCsum}) make_time_data_table // defined in spectra_funcs3.g addmsg /EPSC_sum_diskin {timedata} INPUT val[1][0] setfield /spectra_form/max_time value {tmax} setfield /spectra_form/power_spectrum/ title \ "EPSC power spectrum for run "{RUNID} xshow /spectra_form else xhide /spectra_form end if (plot_spikefreq) make_freqmon make_freqmon_messages 0 // default row 0 means calc for all rows make_inh_freqmon make_inh_freqmon_messages 0 // default row 0 means calc for all rows change_binwidth {getclock 3} setfield /freq_form/#[ISA=xgraph] xmax {tmax} make_rate_dist // make spike rate distribution histogram with controls end if (write_spikefreqs) make_freq_file end end // function make_graph_messages /* ========================== Main program =========================== */ load_params // Override many of the defaults if (debug) echo "out_dt = " {out_dt} " netview_dt = " {netview_dt} end setclock 0 {dt} // default clock - most of the work is done by 1 and 2 open_files make_control make_Vmgraph make_netview sumwindow /summary_form 680 320 load_summary /* Extra code to calculate power spectra */ // name of object generating time data - in this case, it is a file str data_source = {EPSC_sum_file} /***** include spectra_funcs3.g ******/ include spectra_funcs3.g make_FTgraph 1048 368 xhide /spectra_form // Hide the FT graphs until they are needed make_freq_graph 1048 368 make_graph_messages xshow /freq_form if (plot_spikedist) make_hist xshow /histform make_rate_dist end // Slow down the display create script_out /frame_delay change_frame_delay {frame_delay} colorize reset