// $Id: setup.hoc,v 1.2 2008/10/06 16:35:44 samn Exp $ //================================================================ // INSERTED /usr/site/nrniv/local/hoc/setup.hoc // =Id= setup.hoc,v 1.24 2006/11/08 00:51:51 billl Exp // variables normally controlled by SIMCTRL // load_file("setup.hoc") load_file("stdgui.hoc") show_panel=0 strdef simname, filename, output_file, datestr, uname, comment, section, osname objref tmpfile,nil,graphItem,sfunc sfunc = hoc_sf_ // from stdlib.hoc proc chop () { sfunc.left($s1,sfunc.len($s1)-1) } tmpfile = new File() simname = "sim" // helpful if running multiple simulations simultaneously runnum = 1 // updated at end of run system("uname -m",uname) // keep track of type of machine for byte compatibility chop(uname) system("date +%y%b%d",datestr) chop(datestr) // may prefer to downcase later sprint(output_file,"data/%s.%02d",datestr,runnum) // assumes a subdir called data if (unix_mac_pc()==1) osname = "Linux" else if (unix_mac_pc()==2) { osname = "Mac" } else if (unix_mac_pc()==3) osname = "PC" printStep = 0.25 // time interval for saving to vector graph_flag=0 batch_flag=1 xwindows = 0 // can still save but not look without xwindows // load_file("nrnoc.hoc") // END /usr/site/nrniv/local/hoc/setup.hoc //================================================================ //================================================================ // INSERTED /usr/site/nrniv/simctrl/hoc/nrnoc.hoc // =Id= nrnoc.hoc,v 1.74 2007/11/20 07:51:52 billl Exp proc nrnoc () {} // Users should not edit nrnoc.hoc or default.hoc. Any local // changes to these files should be made in local.hoc. // key '*&*' is picked up by to indicate command for emacs proc elisp () { printf("*&* %s\n",$s1) } // if (not exists(simname)) { strdef simname, output_file, datestr, comment } // Simctrl.hoc will automatically load stdgraph.hoc which automatically // loads stdrun.hoc strdef temp_string_, user_string_ // needed for simctrl /* Global variable default values. NOTE that stdrun.hoc, stdgraph.hoc and simctrl.hoc all contain variable definitions and thus default.hoc should be loaded after these files */ //================================================================ // INSERTED /usr/site/nrniv/simctrl/hoc/default.hoc // =Id= default.hoc,v 1.5 2003/07/08 16:16:52 billl Exp /* This file contains various global defaults for hoc ** Users should not edit nrnoc.hoc or default.hoc. Any local changes to these files should be made in local.hoc. ----------------------------------------------------------------*/ /*------------------------------------------------------------ Object defaults ------------------------------------------------------------*/ /*** Define a "nil" object ***/ objectvar nil /*------------------------------------------------------------ String defaults ------------------------------------------------------------*/ /*** "Section" is used if errors are found in the initializiations ***/ strdef section /*** Misc defines used by graphic routines ***/ temp_string_ = "t" tempvar = 0 /*------------------------------------------------------------ Simulation defaults ------------------------------------------------------------*/ /* To be consistent w/the nmodl values */ FARADAY = 96520. /* Hoc default = 96484.56 */ PI = 3.14159 /* Hoc default = 3.1415927 */ /* 0=off, 1=on */ print_flag = 0 /* Write to output file */ graph_flag = 1 /* Plot output */ iv_flag = 1 /* Using Interviews plotting */ batch_flag = 0 /* Using batch_run() */ compress_flag = 0 /* Compress output file when saved */ stoprun = 0 /* 0=running, 1=stopped */ iv_loaded = 0 /* Load initial iv stuff on once */ init_seed = 830529 run_seed = 680612 t = 0 /* msec */ dt = .01 /* msec */ tstop = 100 /* msec */ printStep = 0.1 /* msec */ plotStep = 0.1 /* msec */ flushStep = 0.1 /* msec */ eventStep = 50 /* Number of nstep's before a doEvent */ secondorder = 0 celsius = 6.3 /* degC */ v_init = -70 /* (mV) */ global_ra = 200 /* (ohm-cm) specific axial resisitivity */ /*** Ion parameters ***/ ca_init = 50e-6 /* mM */ na_init = 10 /* mM */ k_init = 54.4 /* mM */ // END /usr/site/nrniv/simctrl/hoc/default.hoc //================================================================ /* Allows arrays of strings */ objref hoc_obj_[2] //================================================================ // INSERTED /usr/site/nrniv/simctrl/hoc/simctrl.hoc // =Id= simctrl.hoc,v 1.14 2000/11/27 21:59:33 billl Exp // Graphic routines for neuremacs simulation control proc sim_panel () { xpanel(simname) xvarlabel(output_file) xbutton("Init", "stdinit()") xbutton("Init & Run", "run()") xbutton("Stop", "stoprun=1") xbutton("Continue till Tstop", "continueRun(tstop)") xvalue("Continue till", "runStopAt", 1, "{continueRun(runStopAt) stoprun=1}", 1, 1) xvalue("Continue for", "runStopIn", 1, "{continueRun(t + runStopIn) stoprun=1}", 1,1) xbutton("Single Step", "steprun()") xvalue("Tstop", "tstop", 1, "tstop_changed()", 0, 1) graphmenu() sim_menu_bar() misc_menu_bar() xpanel() } proc misc_menu_bar() { xmenu("Miscellaneous") xbutton("Label Graphs", "labelgrs()") xbutton("Label With String", "labelwith()") xbutton("Label Panel", "labelpanel()") xbutton("Parameterized Function", "load_template(\"FunctionFitter\") makefitter()") xmenu() } proc sim_menu_bar() { xmenu("Simulation Control") xbutton("File Vers", "elisp(\"sim-current-files\")") xbutton("File Status...", "elisp(\"sim-rcs-status\")") xbutton("Sim Status", "elisp(\"sim-portrait\")") xbutton("Load Current Files", "elisp(\"sim-load-sim\")") xbutton("Load Templates", "elisp(\"sim-load-templates\")") xbutton("Load File...", "elisp(\"sim-load-file\")") xbutton("Save Sim...", "elisp(\"sim-save-sim\")") xbutton("Set File Vers...", "elisp(\"sim-set-file-ver\")") xbutton("Read Current Vers From Index", "elisp(\"sim-read-index-file\")") xbutton("Read Last Saved Vers", "elisp(\"sim-read-recent-versions\")") xbutton("Output to sim buffer", "elisp(\"sim-direct-output\")") xmenu() } proc labelpanel() { xpanel(simname,1) xvarlabel(output_file) xpanel() } proc labels () { labelwith($s1) labelgrs() } proc labelgrs () { local i, j, cnt for j=0,n_graph_lists-1 { cnt = graphList[j].count() - 1 for i=0,cnt labelgr(graphList[j].object(i)) } } proc labelwith () { local i, j, cnt temp_string_ = user_string_ // save the old one if (numarg() == 1) { /* interactive mode */ user_string_ = $s1 } else { string_dialog("write what?", user_string_) } for j=0,n_graph_lists-1 { cnt = graphList[j].count() - 1 for i=0,cnt { graphList[j].object(i).color(0) graphList[j].object(i).label(0.5,0.9,temp_string_) graphList[j].object(i).color(1) graphList[j].object(i).label(0.5,0.9,user_string_) } } } proc labelgr () { local i $o1.color(0) // white overwrite for (i=0;i<10;i=i+1) { // erase every possible runnum for this date sprint(temp_string_,"%s %d%d",datestr,i,i) $o1.label(0.1,0.7,temp_string_) } $o1.color(1) // back to basic black sprint(temp_string_,"%s %02d",datestr,runnum) $o1.label(0.1,0.7,temp_string_) } // END /usr/site/nrniv/simctrl/hoc/simctrl.hoc //================================================================ proc run () { running_ = 1 stdinit() continueRun(tstop) finish() } proc continueRun () { local rt, rtstart, ts if (numarg()==1) ts=$1 else ts=t+1e3 realtime = 0 rt = screen_update_invl rtstart = startsw() eventcount=0 eventslow=1 stoprun = 0 if (using_cvode_) { if (cvode.use_local_dt || (cvode.current_method()%10) == 0) { cvode.solve(ts) flushPlot() realtime = startsw() - rtstart return } } else { ts -= dt/2 } while (t= rt) { // if (!stdrun_quiet) fastflushPlot() screen_update() //really compute for at least screen_update_invl realtime = startsw() - rtstart rt = realtime + screen_update_invl } } if (using_cvode_ && stoprun == 0) { // handle the "tstop" event step() // so all recordings take place at tstop } flushPlot() realtime = startsw() - rtstart } proc stdinit() { cvode_simgraph() realtime = 0 setdt() init() initPlot() } proc init () { cvode_simgraph() initMech() initMisc1() // Initialize state vars then calculate currents // If user hand-set v in initMisc1() then v_init should be > 1000, // else all compartments will be set to v_init if (v_init < 1000) { finitialize(v_init) } else { finitialize() } // Set ca pump and leak channel for steady state setMemb() initMisc2() if (cvode_active()) cvode.re_init() else fcurrent() frecord_init() } // Initialization of mechanism variables // NOTE: if any changes are made to the NEURON block of any local mod // file, the user must add the necessary inits to initMisc1() proc initMech () { forall { if ((!ismembrane("pas")) && (!ismembrane("Passive"))) { // Allow for either pas or Passive mod file usage // errorMsg("passive not inserted") } if (ismembrane("na_ion")) { nai = na_init nai0_na_ion = na_init } if (ismembrane("k_ion")) { ki = k_init ki0_k_ion = k_init } if (ismembrane("ca_ion")) { cai = ca_init cai0_ca_ion = ca_init } } } //* setMemb complex -- multiple names for passive mech //** declarations iterator scase() { local i for i = 1, numarg() { temp_string_ = $si iterator_statement }} objref paslist,pasvars[3],XO double pasvals[2],x[1] paslist = new List() for ii=0,2 pasvars[ii]= new String() for scase("fastpas","pas","Pass","Passive") paslist.append(new String(temp_string_)) //** getval(),setval() -- return/set the hoc value of a string func retval () { return getval($s1) } func getval () { sprint(temp_string2_,"x=%s",$s1) execute(temp_string2_) return x } proc setval () { sprint(temp_string2_,"%s=%g",$s1,$2) execute(temp_string2_) } //** findpas() // assumes that we are starting in a live section since looks for pass mech there qx_=0 proc findpas () { for ii=0,paslist.count-1 { XO=paslist.object(ii) if (ismembrane(XO.s)) { // print XO.s,"found" pasvars[2].s=XO.s sprint(pasvars[0].s,"g_%s(qx_)",XO.s) for scase("e","erev","XXXX") { // look for the proper prefix sprint(temp_string_,"%s_%s",temp_string_,XO.s) if (name_declared(temp_string_)==1) break } if (name_declared(temp_string_)==0) { // not found printf("SetMemb() in nrnoc.hoc: Can't find proper 'erev' prefix for %s\n",XO.s) } else { sprint(pasvars[1].s,"%s(qx_)",temp_string_) } } } } proc setMemb () { if (!secp()) return findpas() // assume that passive name is the same in all sections forall for (qx_,0) { // will eventually want 'for (x)' to handle all the segments if (ismembrane(pasvars[2].s)) { for ii=0,1 pasvals[ii]=getval(pasvars[ii].s) setmemb2() for ii=0,1 setval(pasvars[ii].s,pasvals[ii]) } } } // secp() determine whether any sections exist func secp () { local n n=0 forall n+=1 if (n>0) return 1 else return 0 } func setother () {return 0} // callback stub proc setmemb2 () { local iSum, ii, epas, gpas if (!secp()) return gpas=pasvals[0] epas=pasvals[1] // Setup steady state voltage using leak channel iSum = 0.0 if (ismembrane("na_ion")) { iSum += ina(qx_) } if (ismembrane("k_ion")) { iSum += ik(qx_) } if (ismembrane("ca_ion")) { iSum += ica(qx_) } iSum += setother() if (iSum == 0) { // Passive cmp so set e_pas = v epas = v } else { if (gpas > 0) { // Assume g set by user, calc e epas = v + iSum/gpas } else { // Assume e set by user, calc g if (epas != v) { gpas = iSum/(epas - v) } else { gpas=0 } } if (gpas < 0) errorMsg("bad g", gpas) if (epas < -100 || epas > 0) { printf(".") // printf("%s erev: %g %g %g\n",secname(),e_pas,ina,ik) } } pasvals[0]=gpas pasvals[1]=epas } proc finish () { /* Called following completion of continueRun() */ finishMisc() if (graph_flag == 1) { if (iv_flag == 1) { flushPlot() doEvents() } else { graphmode(-1) plt(-1) } } if (print_flag == 1) { wopen("") } } /*------------------------------------------------------------ User definable GRAPHICS and PRINTING routines ------------------------------------------------------------*/ proc outputData() { // Default procedure - if outputData() doesn't exist in the run file if (graph_flag == 1) { if (iv_flag == 1) { Plot() rt = stopsw() if (rt > realtime) { realtime = rt fastflushPlot() doNotify() if (realtime == 2 && eventcount > 50) { eventslow = int(eventcount/50) + 1 } eventcount = 0 }else{ eventcount = eventcount + 1 if ((eventcount%eventslow) == 0) { doEvents() } } } else { graph(t) } } if (print_flag == 1) { if (t%printStep <= printStep) { printOut() } } } proc printOut() { /* Default procedure - if printOut() doesn't exist in the run file */ } proc initGraph() { /* Default procedure - if initGraph() doesn't exist in the run file */ graph() } proc initPrint() { /* Default procedure - if initPrint() doesn't exist in the run file */ wopen(output_file) } /*------------------------------------------------------------ User definable BATCH RUN routines ------------------------------------------------------------*/ proc nextrun() { // Called from finishmisc() following completion of batch in an autorun wopen("") runnum = runnum + 1 sprint(output_file,"data/b%s.%02d", datestr, runnum) } // commands for emacs proc update_runnum() { runnum = $1 sprint(output_file,"data/%s.%02d", datestr, runnum) print "^&^ (progn (sim-index-revert)(setq sim-runnum ",runnum,"))" } proc nrn_write_index() { printf("&INDEX& %s\n",$s1) } proc nrn_update () { elisp("nrn-update") } proc nrn_message () { printf("!&! %s\n",$s1) } /*------------------------------------------------------------ User definable INITIALIZATION and FINISH routines ------------------------------------------------------------*/ // Default procedure - if initMisc1() doesn't exist in the run file // Initializations performed prior to finitialize() // This should contain point process inits and inits for any changes // made to the NEURON block of any local mod file proc initMisc1() { } // Default procedure - if initMisc2() doesn't exist in the run file // Initializations performed after finitialize() proc initMisc2() { } // Default procedure - if finishMisc() doesn't exist in the run file proc finishMisc() { } /*------------------------------------------------------------ Miscellaneous routines ------------------------------------------------------------*/ proc errorMsg() { /* Print warning, assumes arg1 is string and arg2 if present is a variable value */ sectionname(section) if (numarg() == 0) { printf("ERROR in errorMsg(): Needs at least 1 argument.\n") } else if (numarg() == 1) { printf("ERROR: %s in section %s.\n", $s1, section) } else { printf("ERROR: %s in section %s (var=%g).\n", $s1, section, $2) } } proc clear() { /* Clear non-interviews plot window */ plt(-3) } func mod() { local x, y /* Mod function for non-integers */ x=$1 y=$2 return (x/y - int(x/y)) } proc whatSection() { print secname() } proc print_pp_location() { local x //arg1 must be a point process x = $o1.get_loc() sectionname(temp_string_) printf("%s located at %s(%g)\n", $o1, temp_string_, x) pop_section() } //* set method with method() proc method () { local prc if (numarg()==0) { if (cvode_active() && cvode_local()) { printf("\tlocal atol=%g\n",cvode.atol) } else if (cvode_active()) { printf("\tglobal atol=%g\n",cvode.atol) } else if (secondorder==2) { printf("\tCrank-Nicholson dt=%g\n",dt) } else if (secondorder==0) { printf("\timplicit dt=%g\n",dt) } else { printf("\tMethod unrecognized\n") } return } if (numarg()==2) prc = $2 else prc=0 finitialize() if (strcmp($s1,"global")==0) { cvode_active(1) cvode.condition_order(2) if (prc) cvode.atol(prc) } else if (strcmp($s1,"local")==0) { cvode_local(1) cvode.condition_order(2) if (prc) cvode.atol(prc) } else if (strcmp($s1,"implicit")==0) { secondorder=0 cvode_active(1) cvode_active(0) if (prc) dt=prc } else if (strcmp($s1,"CN")==0) { secondorder=2 cvode_active(1) // this turns off local cvode_active(0) if (prc) dt=prc } else { printf("Integration method %s not recognized\n",$s1) } } //* Load local modifications to nrnoc.hoc and default.hoc //================================================================ // INSERTED /usr/site/nrniv/simctrl/hoc/local.hoc // $Header: /u/samn/mysql_neuron_test/RCS/setup.hoc,v 1.2 2008/10/06 16:35:44 samn Exp $ // // This file contains local modifications to nrnoc.hoc and default.hoc // // Users should not edit nrnoc.hoc or default.hoc. Any local // changes to these files should be made in this file. // ------------------------------------------------------------ //* MODIFICATIONS TO NRNOC.HOC // The procedures declared here will overwrite any duplicate // procedures in nrnoc.hoc. // ------------------------------------------------------------ //*MODIFICATIONS TO DEFAULT.HOC // // Vars added here may not be handled properly within nrnoc.hoc //------------------------------------------------------------ //** String defaults //** Simulation defaults long_dt = .001 // msec objref sfunc,tmpfile sfunc = hoc_sf_ // needed to use is_name() tmpfile = new File() // check for existence before opening a user's local.hoc file proc write_comment () { tmpfile.aopen("index") tmpfile.printf("%s\n",$s1) tmpfile.close() } func asin () { return atan($1/sqrt(1-$1*$1)) } func acos () { return atan(sqrt(1-$1*$1)/$1) } objref mt[2] mt = new MechanismType(0) proc uninsert_all () { local ii forall for ii=0,mt.count()-1 { mt.select(ii) mt.selected(temp_string_) if (strcmp(temp_string_,"morphology")==0) continue if (strcmp(temp_string_,"capacitance")==0) continue if (strcmp(temp_string_,"extracellular")==0) continue if (sfunc.substr(temp_string_,"_ion")!=-1) continue mt.remove() // print ii,temp_string_ } } condor_run = 0 // define for compatability // END /usr/site/nrniv/simctrl/hoc/local.hoc //================================================================ if (xwindows && graph_flag) { nrnmainmenu() } // pwman_place(50,50) print "Init complete.\n" // END /usr/site/nrniv/simctrl/hoc/nrnoc.hoc