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

# This program creates a Migliore & Shepherd 2008 gran cell model along with tables to pull data.
# Only the two biggest compartments are modelled.

import os
import sys
import math

sys.path.extend(["..","../channels","../neuroml","../simulations"])

from moose_utils import *

from load_channels import *
from MorphML_reader import *
from simset_inhibition import *

SETTLETIME = 50e-3 # s
RUNTIME = REALRUNTIME + SETTLETIME

from pylab import * # part of matplotlib that depends on numpy but not scipy

class granTest:

    def __init__(self):
        load_channels()
        MML = MorphML()
        gran_dict = MML.readMorphMLFromFile('../cells/granule_granadityaMS2007_neuroML_L1_L2_L3.xml',{})
        self.context = moose.PyMooseBase.getContext()
        granCellId = self.context.deepCopy(self.context.pathToId('/library/granule'),self.context.pathToId('/'),"granule")
        self.granCell = moose.Cell(granCellId)
        # note that soma is not just /granule/soma, it'll also have its segid appended - thus the general purpose function below:
        self.granSoma = moose.Compartment(get_matching_children(self.granCell, ['Soma','soma'])[0]) # take the first [0] available soma!!
        self.somaVm = setupTable('soma_vm', self.granSoma,'Vm')

if __name__ == "__main__":
    gran = granTest()
    iclamp = setup_iclamp(gran.granSoma, 'gran_iclamp', SETTLETIME, 100e-3, 500e-12) # 500pA for 100ms to get a single AP
    resetSim(gran.context, SIMDT, PLOTDT)
    gran.context.step(RUNTIME)
    timevec = arange(0.0,RUNTIME+1e-10,SIMDT)
    plot(timevec, gran.somaVm,'r,-', label='gran soma Vm (V)')
    legend()
    xlabel('time (s)')
    show()