'''
Defines a class, Neuron472299294, of neurons from Allen Brain Institute's model 472299294

A demo is available by running:

    python -i mosinit.py
'''
class Neuron472299294:
    def __init__(self, name="Neuron472299294", x=0, y=0, z=0):
        '''Instantiate Neuron472299294.
        
        Parameters:
            x, y, z -- position offset
            
        Note: if name is not specified, Neuron472299294_instance is used instead
        '''
                
        self._name = name
        # load the morphology
        from load_swc import load_swc
        load_swc('Rorb-IRES2-Cre-D_Ai14_IVSCC_-168052.03.02.01_397999191_m.swc', self,
                 use_axon=False, xshift=x, yshift=y, zshift=z)

        # custom axon (works because dropping axon during import)
        from neuron import h
        self.axon = [h.Section(cell=self, name='axon[0]'),
                     h.Section(cell=self, name='axon[1]')]
        for sec in self.axon:
            sec.L = 30
            sec.diam = 1
            sec.nseg = 1
        self.axon[0].connect(self.soma[0](0.5))
        self.axon[1].connect(self.axon[0](1))
        self.all += self.axon

        self._insert_mechanisms()
        self._discretize_model()
        self._set_mechanism_parameters()
    
    def __str__(self):
        if self._name is not None:
            return self._name
        else:
            return "Neuron472299294_instance"
                
    def _insert_mechanisms(self):
        from neuron import h
        for sec in self.all:
            sec.insert("pas")
        for mech in [u'CaDynamics', u'Ca_HVA', u'Ca_LVA', u'Ih', u'Im', u'K_P', u'K_T', u'Kv3_1', u'NaTs', u'Nap', u'SK']:
            self.soma[0].insert(mech)
    
    def _set_mechanism_parameters(self):
        from neuron import h
        for sec in self.all:
            sec.Ra = 167.07
            sec.e_pas = -90.582359314
        for sec in self.apic:
            sec.cm = 2.17
            sec.g_pas = 7.76313565885e-05
        for sec in self.axon:
            sec.cm = 1.0
            sec.g_pas = 0.000551976131423
        for sec in self.dend:
            sec.cm = 2.17
            sec.g_pas = 1.08526630687e-05
        for sec in self.soma:
            sec.cm = 1.0
            sec.ena = 53.0
            sec.ek = -107.0
            sec.gbar_Im = 1.23992e-05
            sec.gbar_Ih = 0.000331224
            sec.gbar_NaTs = 0.452286
            sec.gbar_Nap = 0.00101181
            sec.gbar_K_P = 0.0370931
            sec.gbar_K_T = 0.000133211
            sec.gbar_SK = 0.000150215
            sec.gbar_Kv3_1 = 0.0857197
            sec.gbar_Ca_HVA = 0.000509044
            sec.gbar_Ca_LVA = 0.00616339
            sec.gamma_CaDynamics = 0.000993274
            sec.decay_CaDynamics = 845.244
            sec.g_pas = 0.000199625
    
    def _discretize_model(self):
        for sec in self.all:
            sec.nseg = 1 + 2 * int(sec.L / 40)

