#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import math import os # 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 * ##### MPI stuff ## This Channel needs to write a data file and have it read by moose - ## since moose doesn't support assignment to individual elements in the 2D table in HHChannel2D. ## I don't want to make every process generate the same data file, ## so have KCaChannel.py generate the file once in this directory. VKCa = -80.0e-3 # Volts # kca3.mod has a vshift=-10mV in addition to ek=-70mV GKCa = 142.0*sarea # Siemens, from mit4.hoc CaMIN = 0.0 CaMAX = 1.0e-2 # mol/m^2 same as millimol/litre CaNDIVS = 100 class KCaChannel_PG(moose.HHChannel2D): """KCa channel inherits from HHChannel2D.""" def __init__(self, *args): """Setup the KCa channel with defaults""" moose.HHChannel2D.__init__(self,*args) ### Since this channel is table based and ### this script is for reading in of KCaA.dat and KCaB.dat, ### while KCaChannel.py is for writing these tables, ### we hard code the VMIN, VMAX and NDIVS ### so that those in globalConstants.py ### do not spoil the reading in of already created tables. VMIN = -0.1 # V VMAX = 0.05 # V NDIVS = 150 dv = (VMAX-VMIN)/NDIVS ## For HHChannel2D; Ek, Gbar, etc don't get set via python assignments!!! ## Have to use moose shell commands. #self.Ek = VKCa self.getContext().runG('setfield '+self.path+' Ek '+str(VKCa)) #self.Gbar = GKCa self.getContext().runG('setfield '+self.path+' Gbar '+str(GKCa)) self.addField('ion') self.setField('ion','K') self.addField('ionDependency') self.setField('ionDependency','Ca') ## This will create HHGate2D instance xGate inside the KCa channel. ## (2D since it is within HHChannel2D) self.Xpower = 1 ## VOLT_C1_INDEX: VOLTAGE message specifies x variable ## and CONCEN1 variable specifies y variable of X_A and X_B tables; ## pg 323, sec 19.4.6 of Book of Genesis self.Xindex = "VOLT_C1_INDEX" ## xGate was already created and wrapped when Xpower was set non-zero #self.xGate = moose.HHGate2D(self.path + "/xGate") #self.getContext().runG("showfield "+self.path +"/xGate/A -all") self.xGate.A.xmin = VMIN self.xGate.A.xmax = VMAX #self.xGate.A.xdivs = NDIVS # these get overridden by the number of values in the table self.xGate.B.xmin = VMIN self.xGate.B.xmax = VMAX #self.xGate.B.xdivs = NDIVS # these get overridden by the number of values in the table ### HHGate2D is not wrapped properly in pyMOOSE. ymin, ymax and ydivs are not exposed. ### Setting them creates new and useless attributes within HHGate2D without warning! ### Hence use runG to set these via Genesis command self.getContext().runG("setfield "+self.path+"/xGate/A"+\ #" ydivs "+str(CaNDIVS)+\ # these get overridden by the number of values in the table " ymin "+str(CaMIN)+\ " ymax "+str(CaMAX)) self.getContext().runG("setfield "+self.path+"/xGate/B"+\ #" ydivs "+str(CaNDIVS)+\ # these get overridden by the number of values in the table " ymin "+str(CaMIN)+\ " ymax "+str(CaMAX)) ### PRESENTLY, Interpol2D.cpp in MOOSE only allows loading via a data file, ### one cannot set individual entries A[0][0] etc. ### Thus pyMOOSE also has not wrapped Interpol2D #### KCaA_PG.dat and KCaB_PG.dat MUST have been generated previously by KCaChannel_PG.py #### and kept in the directory where this channel file is kept selfdir = os.path.dirname(__file__) if selfdir != '': selfdir += os.sep self.getContext().runG("call "+self.path+"/xGate/A load "+selfdir+"KCaA_PG.dat 0") self.getContext().runG("call "+self.path+"/xGate/B load "+selfdir+"KCaB_PG.dat 0")