/**
 * This is a template file for synapse placement at a set of locations.
 * As the morphology is a free parameter, you insert it.
 *
 * These template files all work by replacing bracket-percent???percent-bracket
 *  enclosed segments with some value.  The replacement is done with a MATLAB 
 *  script, and the template is the basis for a NEURON simulation, hence the
 *  C-like commenting.  So, for instance, the first line below will replace the
 *  morphoFile string with whatever the user assigns to params(x).value where
 *  params(x).idstr is "morphoFile".  This is all done in generate_hocfiles.m,
 *  so look there if the above sounds confusing.
 *
 *     morpho: cell = <%morphoFile%>
 *  variables: Rm = <%Rm%>
 *             Ri = <%Ri%>
 *             Cm = 1.5
 *       synalpha = <%synAlpha%>
 *   sampInterval = .025 ms
 *         simLen = <%simLen%>
 *         output = <%outfilePath%>/<%outfileTag%>.out
 *  
 */ 

strdef morphologyFile, parameterFile
lineRead = 1

/* Definitions */
morphologyFile = "<%morphoFile%>.hoc"
simLen = <%simLen%> // length of simulation in ms
dt = <%dt%> // resolution of simulation
samfreq_den = <%samp_dt%>/dt // resolution of data -- 0.025/.005 means every 5th is 
                              // sampled, so 1/.025=40 kHz (remember, .025 is ms)

/* Load the cell file */
xopen (morphologyFile)

  fRm = <%Rm%> // membrane resistsance
  fCm = 1.5 // capactance
  fRi = <%Ri%>  // intracellular resistivity

  v_init = -68 // base voltage -- note that this is where the simulation STARTS, 
	             // not Erest, which will stabilize based on active conductances
							 // after some time
  tstop1 = simLen // when the simulation stops

  /* Membrane properties ... */
  Rm = fRm // Ohm cm2
  Cm = fCm    // micro farad / cm 2
  Rax = fRi    // ohm cm

  // Derive the file to write to's name
  strdef fil_name // output filename
  sprint(fil_name, "<%outfilePath%>/<%outfileTag%>.out")
  g_m = 1 / Rm // membrane condctance -- this is what NEURON uses so we convert

  /* Create the leak conductance (and hence Rm) */
  forall {
    Ra = Rax // axial resistivity = intracellular resistivity
    cm = Cm // membrane capacitiance
  }


  /* setup active conductances ; this uses the class variable you assign in 
   * the morphology file, allowing this to work independent of morpho file
   * as long as that variable is used; specifically, 
   *   1 = dendrite
   *   2 = SIZ (with KCa)
   *   3 = axon
   */
 
  // Hodgkin Huxley conductance settings (HH throughout)
  gna_axon = <%gNaAxon%>   //axonal, starting as the SIZ widens on axon side
  gkdr_axon = <%gKDrAxon%> 
  gna_siz = <%gNa%>  // concentration in the narrowing
  gkdr_siz = <%gKDr%> 
  gna_dend = <%gNaDend%>  // along the main trunk of the dendritic tree, for back-propogation, not initiation
  gkdr_dend = <%gKDrDend%> 
  

  // settings for KCa -- only in SIZ
  gcal = <%gCaL%> // conductance for calcium channel (L-type like)
  gkca = <%gKCa%> // conductance for ca-dependent K channel
	// These parameters govern calcium clearance; see Peron and Gabbiani 2009 
	//  nature neuroscience, and the accompanying biological cybernetics paper
	//  from same year
  alphaCa = 0.006 // mM * cm2 / ms / mA
  tauCa = 132 // FIXED from GAbbiani and Krapp 2006 -- extrusion time constant
  kD = .030 // mM


  // For different compartment classes (dendrite, spike-initiation-zone, axon)
	//  the conductance complement is different.  This is reflected below.
  for i=1, nseg {
    access seg[i]
    if (cmpt_class[i] == 1) {  // DEND (In future models, H-current)
        insert pas g_pas=g_m e_pas=v_init // this line creates passive properties
   } else if (cmpt_class[i] == 2) {  // SIZ (HH + KCa)
        insert pas g_pas=g_m e_pas=v_init // this line creates passive properties
  		insert HH_Na35 ena=70 gmax_HH_Na35=gna_siz
			insert HH_Kdr35 ek=-80  gmax_HH_Kdr35=gkdr_siz
			insert CaL eca=120 gmax_CaL=gcal
			insert CaInternal alpha_ca_CaInternal=alphaCa tau_ca_CaInternal=tauCa 
			insert KCa gmax_KCa = gkca kD_ca = kD ek=-80
			cai = 0
   } else if (cmpt_class[i] == 3) {  // AXON (HH only)
            insert pas g_pas=g_m e_pas=v_init // this line creates passive properties
			insert HH_Na35 ena=70 gmax_HH_Na35=gna_axon
			insert HH_Kdr35 ek=-80  gmax_HH_Kdr35=gkdr_axon
   } else if (cmpt_class[i] == 4) { // proximal dendritic trunk
           insert pas g_pas=g_m e_pas=v_init
           //insert dendNa ena=70 gmax_dendNa=gna_siz*1.3
           //insert HH_Kdr35 ek=-80  gmax_HH_Kdr35=gkdr_siz
           //insert CaL eca=120 gmax_CaL=gcal
		   //insert CaInternal alpha_ca_CaInternal=alphaCa tau_ca_CaInternal=tauCa 
	       //insert KCa gmax_KCa = gkca kD_ca = kD ek=-80
		   //cai = 0
    } else { // main dendritic trunk, create a Na channel gradient
           insert pas g_pas=g_m e_pas=v_init
           //insert dendNa ena=70 gmax_dendNa=gna_dend
           //insert HH_Kdr35 ek=-80  gmax_HH_Kdr35=gkdr_dend
           //insert HH_Na35 ena=70 gmax_HH_Na35=gna_siz/(1+1*(cmpt_class[i]-4))
           //insert HH_Kdr35 ek=-80  gmax_HH_Kdr35=gkdr_siz/(1+1*(cmpt_class[i]-4))
    }
  }  
 
  /* Synaptic block goes here -- this is generally quite complex so it is 
	 * generated by a MATLAB script and then inserted.  It generally constitutes the
	 * bulk of this script.  Synaptic properties are defined in the MATLAB code. */
	<%synBlock%>

  /* **** SETUP IS NOW DONE ; SIMULATION IS RUN BELOW **** */

  /* Prepare file for writing */
  wopen (fil_name)

  finitialize (v_init)
  fcurrent()
    
  // forall for (x,0) ri_dummy(x) = ri(x) // skip the 0 area nodes at 0 and 1
  
  wv = 0
  while (t<tstop1) {
    wv = wv + 1 
    fadvance()
    /* record the voltage at the middle of the compartment */
    if (wv >= samfreq_den) {
      wv = 0
      // Sample saveparams line: fprint(" %f %f %f %f %f %f %f\n", t, seg[133].v(.5), seg[463].v(.5), seg[320].v(.5), seg[1470].v(.5), seg[1466].v(.5), seg[1480].v(.5))
			<%saveParamsLine%>
    }
  }

  /* close the file */
  wopen()
  quit()