from neuron import h
import numpy as np

from new_geomnseg import *

def range_func(sect,typ,bounds):
	for seg in sect:
		exec "seg." + typ +"= np.interp(seg.x,[0,1],bounds)"

def init(neuron_obj, p):
  test = neuron_obj
  distalance = p['dst']
  cattog = p['gcat']
  hcntog = p['ghcn']
  taukv4 = p['taukv4']
  shift = -p['na_shift']
  hshift = -p['na_hshift']
  sshift = p['na_sshift']
  SCALE = p['scale']
  h.distance(0,test.soma(0.5)) # set 0 of distance to soma # may be redundant
  tcap = 0  
  for s in test.all:
	 #s.nseg = s.nseg*2+1
	 s.Ra = 100.0*p['ra']
	 s.cm = 1.0*p['cm']
	 s.insert('hhb') # for Kv4, Kdr
	 #s.insert('pump')
	 s.insert('leak')
	 #s.insert('nabalan')
	 #s.insert('Na12')
	 s.insert('NaMark')
	 #s.insert('Na16')
	 s.insert('cabalstore')
	 #s.insert('cicr') # requires cabalstore

	 s.insert('typem') # a module that creates a range variable that specifies compartment type by color
	 s.gnabar_NaMark = 1000e-6*p['gnahh']
	 if p['ratio'] < 1:
		s.insert('FastNaMark')
		s.gnabar_FastNaMark = 1000e-6*(1-p['ratio'])*p['gnahh']
		s.shift_FastNaMark = shift
		s.hshift_FastNaMark = hshift
		s.gnabar_NaMark = 1000e-6*p['ratio']*p['gnahh']

	 #s.DCa_cabalthin = 0.0
	 #s.shellfrac_cabalthin = min(0.1/s.diam,1.0) 
	 s.shift_hhb = shift
	 s.sshift_hhb = sshift 
	 s.hshift_hhb = hshift
	 s.ashift_hhb = 0
	 s.asshift_hhb = 0
	 s.gkabar_hhb = 300e-6*p['gka']
	 #s.scale_Na12 = 0.2
	 s.nspeed_hhb = p['nspeed']

	 s.scale_NaMark = SCALE
	 #s.shift_Na12 = -15.0
	 s.shift_NaMark = shift
	 s.hshift_NaMark = hshift

	 for seg in s:
	    tcap+=s.cm*h.area(seg.x,sec=s)
	 #s.ipumpmax_pump*=0.0

	 s.gkhhbar_hhb = 500e-6*p['gkhh']
	 s.gnabar_hhb = 0
	 #s.gnabar_Na12 = 1000e-6*p[5]

	 #s.scale_Na16 =0.2
	 #s.gnabar_Na16 = 1000e-6*p[5]
	 s.gkbar_leak=1.0e-6*p['glk']
	 s.gnabar_leak=1.0e-6*p['glna']
	 s.vhblock_hhb = 0
  
  s.nseg = 1
  #geom_nseg(test) # sets nseg based on geometry 
  """for s in test.all:
	  for seg in s:
		h.setpointer(seg._ref_ju_cicr,'ju_p', seg.cabalstore)
		h.setpointer(seg._ref_jcicr_cicr,'jcicr_p', seg.cabalstore)
		h.setpointer(seg._ref_cac_cabalstore,'cac_p', seg.cicr)
		h.setpointer(seg._ref_cast_cabalstore,'cas_p', seg.cicr)"""

  for s in test.somatic:
	s.insert('hcn')
	#s.insert('katp')
	#s.insert('skpool')
	s.insert('kca')
	#s.insert('catchan')
	s.insert('canchan')
	s.insert('calhh')
	  
	
	s.marker_typem = 0
	#s.gnabar_Na16 *= 1.0
	#s.gnabar_Na12 *= 0.5
	
	#s.prad_bkpool = 0.001
	#s.prad_skpool = 0.1
	
	#s.prad_cabalthin = s.prad_skpool
	s.TotalBuffer_cabalstore = 0.03
	
	#s.gkbar_bk = 0e-3
	s.gkbar_kca = 100e-6*p['gkca']
	s.tausk_kca = 5.0
	s.icapumpmax_cabalstore *= p['capump']
	
	s.gcanbar_canchan = 50e-6
	s.gcalbar_calhh =10.0e-6*p['gcal'] # 
	s.skcoup_calhh = 1.0 # coupling of L-type to SK pool
	s.mhalf_calhh = -30 # half activation
	
	s.gnabar_hhb *= 1.0
	s.gkbar_leak *=1.0
	s.gkhhbar_hhb *=1.0
	s.ghcnbar_hcn = 50.0e-6*hcntog
	s.taukv4_hhb = taukv4
	s.deptog_hhb = 1
	#s.gcatbar_catchan*=0
	s.gkabar_hhb *=2.0
	
	#s.gkbar_katp = 0
	#s.n_katp = 1.3
	
	#s.ghcnbar_hcn = hcntog*50e-6
	#s.tau1_hcn *=0.5
	#s.tau2_hcn *=0.5


def to_shreds_you_say(neuron_obj,chop_dist):  # removes sections whose midpoints are greater than chop distance, name is futurama reference.
	blest = neuron_obj
	h.distance(0,blest.soma(0.5))
	for s in blest.all:
		sref = h.SectionRef(sec = s)
		dist = h.distance(0.5, sec=s)
		if dist > chop_dist:
			h.disconnect(sref)
			h.delete_section(sref)