// $Id: geom.hoc,v 1.9 2012/05/22 15:10:53 samn Exp $

declare("armLen","d[2]") // length of each arm segment -- fixed throughout sim
declare("MLen","d[4]") // length of each muscle -- varies throughout sim
declare("MFctr",1)
declare("minDPr",0,"maxDPr",1)

begintemplate DPC

public soma,drspk,id,type,subtype,xloc,yloc,zloc,mlenmin,mlenmax
public setmlenrange,updatedrive
external armLen,MLen,MFctr,minDPr,maxDPr
objref drspk
double id[1],type[1],subtype[1],xloc[1],yloc[1],zloc[1],mlenmin[1],mlenmax[1]

create soma[1]

proc init () {
  if(numarg()>0) id=$1
  if(numarg()>1) type=$2
  initsoma()
}

proc initsoma () {
  soma {
    diam = 30
    L = 30
    nseg = 1
    Ra = 1
    drspk = new DRSPK(0.5)
    insert pas    
    e_pas = 0
  }
}

proc setmlenrange () {
  mlenmin = $1
  mlenmax = $2
}

proc updatedrive () { local mlen
  // The first argument is the relevant muscle length.  If none is provided,
  // the default is the current muscle length.
  if (numarg() > 0) mlen = $1 else mlen = MLen[zloc] 

  // Set the drive between minDPr and maxDPr where muscle length divided by the
  // arm length for the corresponding arm segment sets distance from the 
  // minDPr baseline firing rate.
  // drspk.drive = minDPr + (maxDPr-minDPr) * MFctr * MLen[zloc] / armLen[zloc/2]

  // If the muscle length associated with the cell is within the range,
  // then set maximal drive, else set minimal drive.
  if ((mlen >= mlenmin) && (mlen <= mlenmax)) {
    drspk.drive = maxDPr
  } else {
    drspk.drive = minDPr
  }
}

endtemplate DPC