#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import math

# The PYTHONPATH should contain the location of moose.py and _moose.so
# files.  Putting ".." with the assumption that moose.py and _moose.so
# has been generated in ${MOOSE_SOURCE_DIRECTORY}/pymoose/ (as default
# pymoose build does) and this file is located in
# ${MOOSE_SOURCE_DIRECTORY}/pymoose/examples
# sys.path.append('..\..')
try:
    import moose
except ImportError:
    print "ERROR: Could not import moose. Please add the directory containing moose.py in your PYTHONPATH"
    import sys
    sys.exit(1)

from channelConstants import *

# ALL SI UNITS

VCa = 0.070 # Volts

GCa = 40*sarea # Siemens, from mit4.hoc

def calc_Ca_alpha_s(v):
    return 7.5e3/(1+math.exp((-30e-3-v)/7e-3))

def calc_Ca_beta_s(v):
    return 1.65e3/(1+math.exp((v+30e-3)/4e-3))

def calc_Ca_alpha_r(v):
    return 6.8/(1+math.exp((v+60e-3)/12e-3))

def calc_Ca_beta_r(v):
    return 60/(1+math.exp(-v-30e-3/11e-3))


class CaTChannel(moose.HHChannel):
    """Ca channel inherits from HHChannel."""
    def __init__(self, *args):
        """Setup the Ca channel with defaults"""
        moose.HHChannel.__init__(self,*args)
        self.Ek = VCa
        self.Gbar = GCa
        self.addField('ion')
        self.setField('ion','Ca')
        self.Xpower = 1 # This will create HHGate instance xGate inside the Ca channel
        self.Ypower = 1 # This will create HHGate instance yGate inside the Ca channel
        ## Below gates get created after Xpower or Ypower are set to nonzero values
        ## I don't anymore have to explicitly create these attributes in the class
        #self.xGate = moose.HHGate(self.path + "/xGate")
        #self.yGate = moose.HHGate(self.path + "/yGate")
        self.xGate.A.xmin = VMIN
        self.xGate.A.xmax = VMAX
        self.xGate.A.xdivs = NDIVS
        self.xGate.B.xmin = VMIN
        self.xGate.B.xmax = VMAX
        self.xGate.B.xdivs = NDIVS
        self.yGate.A.xmin = VMIN
        self.yGate.A.xmax = VMAX
        self.yGate.A.xdivs = NDIVS
        self.yGate.B.xmin = VMIN
        self.yGate.B.xmax = VMAX
        self.yGate.B.xdivs = NDIVS
        
        v = VMIN

        for i in range(NDIVS+1):
            self.xGate.A[i] = calc_Ca_alpha_s(v)
            self.xGate.B[i] = calc_Ca_alpha_s(v) + calc_Ca_beta_s(v)
            self.yGate.A[i] = calc_Ca_alpha_r(v)
            self.yGate.B[i] = calc_Ca_alpha_r(v) + calc_Ca_beta_r(v)
            v = v + dv