// This function centralizes parameters so that we won't confuse experimental variable bindings with 
// neurophysiological variable bindings
// written by Terrence Brannon, modified by Yiota Poirazi, July 2001, poirazi@LNC.usc.edu
 

begintemplate ExperimentControl

public morphology_dir, generic_dir, data_dir 
strdef morphology_dir, generic_dir, data_dir

public syscmd
strdef syscmd

public tmp_str, tmp_str2, tmp_str3
strdef tmp_str, tmp_str2, tmp_str3, tmp_str_internal

public defvar, self_define
public add_lib_dir, xopen_geometry_dependent, xopen_generic, xopen_library

public printfile, create_variable

objref this, filep

objref tmpo, tmpo2, tmpo3
public tmpo, tmpo2, tmpo3

objref grapho[20], fileo[20]
public grapho, fileo

proc init () {
  print "object ExperimentControl created.\n"
  sprint(tmp_str,"show_errmess_always(%d)",$1)
  execute1(tmp_str)

  verbose_level=$2

  variable_dump_cleared=0
}


proc clear_variable_dump() {
  sprint(tmp_str, "system(\"rm -rf %s/variable_dump\")", data_dir)
  execute1(tmp_str)
}

proc defvar() {
  if (!variable_dump_cleared) {
    clear_variable_dump()
    variable_dump_cleared=1
  }
    
  sprint(tmp_str,"%s = %s", $s2, $s3)
  execute1(tmp_str)
  dump_variable($s1,$s2,$s3,$s4)
}

proc dump_variable() {

  filep=new File()

  sprint(tmp_str,"%s/variable_dump",data_dir)
  filep.aopen(tmp_str)
  filep.printf("%s\n%s\n%s\n%s\n\n", $s1, $s2, $s3, $s4)
  filep.close()
  
}

proc create_variable() {
  sprint(tmp_str_internal,"%s=%s",$s1,$s2)
  execute1(tmp_str_internal)
}


proc self_define() {
  this = $o1
}

proc xopen_geometry_dependent() {
  sprint(tmp_str,"xopen(\"%s/%s.hoc\")",morphology_dir,$s1)
  execute1(tmp_str)
}

proc xopen_generic() {
  sprint(tmp_str,"xopen(\"%s/%s.hoc\")",generic_dir,$s1)
  execute1(tmp_str)
}

proc xopen_library() {
  sprint(tmp_str, "%s.tmp_str2=lib_dir_%s",this,$s1)
  execute1(tmp_str)
  sprint(tmp_str3,"xopen(\"%s/%s.hoc\")",tmp_str2,$s2)
  print tmp_str3
  execute1(tmp_str3)
}

proc printfile() {
  sprint(tmp_str2, "%s/%s.ps", $s1,$s2)
  tmpo.printfile(tmp_str2)
}

proc add_lib_dir() {
  sprint(tmp_str,"strdef lib_dir_%s",$s1)
  execute1(tmp_str)
  sprint(tmp_str,"lib_dir_%s=\"%s\"",$s1,$s2)
  execute1(tmp_str)
}

endtemplate ExperimentControl