"""
Template for single compartment Olufsen model of pyramidal neuron

Coded: Ruben A. Tikidji-Hamburyan

"""
import os,sys,csv
from numpy import *
from numpy import random as rnd
import scipy as sp
import matplotlib
matplotlib.rcParams["savefig.directory"] = ""
from matplotlib.pyplot import *
try:
	import cPickle as pkl
except:
	import pickle as pkl
from neuron import h

class Py:
	def __init__(self, init=-66.5910933966):
		self.soma = h.Section()
		self.soma.L		= 100.
		self.soma.diam	= 10./np.pi
		self.soma.nseg	= 1
		self.soma.insert('Ecellchann')
		self.soma.v = init
		#Spike Recorder
		self.spks	= h.Vector()
		self.recorder = h.NetCon(self.soma(0.5)._ref_v,None,sec=self.soma)
		self.recorder.threshold = 0.
		self.recorder.record(self.spks)
		#Synapses
		self.isyn	= h.Exp2Syn(0.5, sec=self.soma)
		self.isyn.e		= -75.0
		self.isyn.tau1	= 2.
		self.isyn.tau2	= 5.0
		self.esyn	= h.Exp2Syn(0.5, sec=self.soma)
		self.esyn.e		= 0.0
		self.esyn.tau1	= 0.8
		self.esyn.tau2	= 1.2
		#Recorders
		self.rec	= {}
		#output connection point
		self.output  = self.soma(0.5)._ref_v

	def setrecorder(self,name):
		if type(name) is int or type(name) is float or type(name) is list or type(name) is tuple or type(name) is str:
			raise TypeError("first argument must be only dict")
		for n in name:
			vec = h.Vector()
			try:
				exec "vec.record(self."+name[n]+")"
			except:
				print "Cannot set a recorder for self."+name[n]
			self.rec[n]  = vec
	def setparameters(self,name):
		if type(name) is int or type(name) is float or type(name) is list or type(name) is tuple or type(name) is str:
			raise TypeError("first argument must be only dict")
		for n in name:
			try:
				exec "self.{} = {}".format(n, name[n])
			except:
				print "Cannot set a parameter self.{} to {}.".format(n,name[n])
	def getEtoIspace(self,conduct=False):
		if conduct: 
			return (self.esyn.tau2 - self.esyn.tau1)/(self.isyn.tau2 - self.isyn.tau1)
		else:
			#return (self.esyn.tau2 - self.esyn.tau1)*abs(self.esyn.e-self.soma(0.5).v)/(self.isyn.tau2 - self.isyn.tau1)/abs(self.isyn.e-self.soma(0.5).v)
			return (self.esyn.tau2 - self.esyn.tau1)*abs(self.esyn.e+66.5910933966)/(self.isyn.tau2 - self.isyn.tau1)/abs(self.isyn.e+66.5910933966)
	#def setparallelcontext(self, gid, pd):
		#s
		
		
if __name__ == "__main__":
	py = Py()
	py.setrecorder({"volt":"soma(0.5)._ref_v"})
	
	stim = h.IClamp(0.5,sec=py.soma)
	stim.amp = 0.1
	stim.delay = 100.
	stim.dur   = 300.
	
	trec = h.Vector()
	trec.record(h._ref_t)
    
	h.finitialize()
	h.fcurrent()
	h.frecord_init()
	while h.t < 500. :h.fadvance()
    
    
	plot(trec,py.rec['volt'])
	c = array(py.spks)
	print float(c.shape[0])/300.*1000, py.soma(0.5).v
	show()