From 6ed2f7019c23935556277591ce0647c96813dd98 Mon Sep 17 00:00:00 2001 From: HarshaRani <ranishashi@gmail.com> Date: Fri, 14 Apr 2017 18:48:02 +0530 Subject: [PATCH] Squashed 'moose-examples/' changes from 7318878..69062d9 69062d9 For crossComptSimpleReac a temp fix so that segfault doesn't occur, rest cleanup 729f216 deleted unwanted files and added new files 045aa11 Fixed assert by Upi 2b16c59 Deleted temp files. 3881f8a khali khali 97599aa Fixed docstring on example. git-subtree-dir: moose-examples git-subtree-split: 69062d9340a032a32f316eed69f914e486c19171 --- docs/source/install/index.rst~ | 207 ----- docs/source/install/moose_quickstart.rst~ | 0 genesis/Kholodenko_tosbml.xml | 902 ++++++++++++++++++++++ snippets/RandSpikeStats.py | 2 - snippets/analogStimTable.py | 1 + snippets/analogStimTable.py~ | 95 --- snippets/crossComptNeuroMesh.py.png | Bin 0 -> 43382 bytes snippets/crossComptSimpleReac.py | 168 ++-- snippets/cspaceSteadyState.py | 128 +-- snippets/diffSpinyNeuron.py | 2 - snippets/funcInputToPools.py | 35 +- snippets/function.py~ | 200 ----- snippets/intfire.py | 22 +- snippets/loadKineticModel.py | 2 +- snippets/loadSbmlmodel.py | 2 +- snippets/reacDiffBranchingNeuron.py | 9 + snippets/scaleVolumes.py | 6 + snippets/vclamp.py~ | 137 ---- 18 files changed, 1095 insertions(+), 823 deletions(-) delete mode 100644 docs/source/install/index.rst~ delete mode 100644 docs/source/install/moose_quickstart.rst~ create mode 100644 genesis/Kholodenko_tosbml.xml delete mode 100644 snippets/analogStimTable.py~ create mode 100644 snippets/crossComptNeuroMesh.py.png delete mode 100644 snippets/function.py~ delete mode 100644 snippets/vclamp.py~ diff --git a/docs/source/install/index.rst~ b/docs/source/install/index.rst~ deleted file mode 100644 index 5eb7a17d..00000000 --- a/docs/source/install/index.rst~ +++ /dev/null @@ -1,207 +0,0 @@ -Installation -============ - -Use pre-built packages ----------------------- - -Linux -^^^^^ - -We recommend that you use our repositories hosted at `Open Build Service -<http://build.opensuse.org>`_. We have packages for the following distributions - -- Debian 7.0, 8.0 -- Ubuntu 12.04, 14.04, 15.04, 15.10, 16.04 -- CentOS 6, 7 -- Fedora 20, 21, 22, 23 -- OpenSUSE 13.1, 13.2, Factory ARM, Leap 42.1, Tumbleweed -- SLE 12, 12 SP1 -- RHEL 7 -- Scientific Linux 7 - -Visit `this page -<https://software.opensuse.org/download.html?project=home:moose&package=moose>`_ -pick you distribution and follow instructions. - -.. note:: - ``moogli`` (tool to visualize network activity) is not available for CentOS-6. - -.. raw:: html - <iframe - src="http://software.opensuse.org/download/package.iframe?project=moose&package=moose"></iframe> - -.. todo:: Packages for gentoo, Arch Linux - - -Mac OSX -^^^^^^ - -Download the ``dmg`` file from `here <https://github.com/BhallaLab/moose/releases/download/ghevar_3.0.2/Moose_3.0.2_OSX.dmg>`_. - -Alternatively, you can use ``homebrew`` to install ``moose`` -:: - $ brew install homebrew/science/moose - - -Windows/Cygwin -^^^^^^^^^^^^^^ - -Building MOOSE --------------- - -In case your distribution is not listed on `our repository page -<https://software.opensuse.org/download.html?project=home:moose&package=moose>`_ -, or if you want to build the lastest development code, read on. - -First, you need to get the source code. You can use ``git`` (clone the -repository) or download snapshot of github repo by clicking on `this link -<https://github.com/BhallaLab/moose/archive/master.zip>`_.:: - $ git clone https://github.com/BhallaLab/moose - -Or, -:: - $ wget https://github.com/BhallaLab/moose/archive/master.zip - $ unzip master.zip - -If you don't want lasest snapshot of ``MOOSE``, you can download other released -versions from here `https://github.com/BhallaLab/moose/releases`. - -Install dependencies -~~~~~~~~~~~~~~~~~~~ - -Next, you need to install required dependencies. Depending on your OS, names of -following packages may vary. - -- cmake (version 2.8 or higher) -- gsl-1.16 or higher `download <ftp://ftp.gnu.org/gnu/gsl/>`_. -- libhdf5 development package e.g. `libhdf5-serial-dev` or `libhdf5-devel` -- python development package e.g. `python-dev` or `python-devel` -- numpy e.g. `python-numpy` or `numpy` - -Most of the dependencies can be installed using package manager. - -On ``Debian/Ubuntu`` -:: - $ sudo apt-get install libhdf5-dev cmake libgsl0-dev libpython-dev python-numpy - -.. note:: - Ubuntu 12.04 does not have required version of ``gsl`` (required 1.16 or - higher, available 1.15). On Ubuntu 16.04, package name is ``libgsl-dev``. - -On ``CentOS/Fedora/RHEL/Scientific Linux`` -:: - $ sudo yum install hdf5-devel cmake libgsl-dev python-devel python-numpy - -On ``OpenSUSE`` -:: - $ sudo zypper install hdf5-devel cmake libgsl-dev python-devel python-numpy - -Now use `cmake` to build moose -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. codeblock:: bash - $ cd /to/moose/source/code - $ mkdir _build - $ cd _build - $ cmake .. - $ make - $ ctest --output-on-failure # optional - -This will build pyMOOSE (MOOSE's python extention), `ctest` will run few tests to -check if build process was successful. - -.. note:: - To install MOOSE into non-standard directory, pass additional argument - `-DCMAKE_INSTALL_PREFIX=path/to/install/dir` to cmake - :: - $ cmake -DCMAKE_INSTALL_PREFIC=$HOME/.local .. - - To use different version of python - :: - $ cmake -DPYTHON_EXECUTABLE=/opt/python3/bin/python3 .. - -After that installation is pretty easy -:: - $ sudo make install - -If everything went fine, you should be able to import moose in python shell. - -.. code-block:: python - import moose - - -Graphical User Interface (GUI) ------------------------------- - -You can get the source of ``moose-gui`` from `here -<https://github.com/BhallaLab/moose-gui>`_. You can download it either by -clicking on `this link <https://github.com/BhallaLab/moose-gui/archive/master.zip>`_ -or by using ``git`` :: - $ git clone https://github.com/BhallaLab/moose-gui - -To be able to launch ``moose-gui``, you need to install some more packages - -- matplotlib -- python-qt4 - -On ``Ubuntu/Debian``, these can be installed with -:: - $ sudo apt-get install python-matplotlib python-qt4 - -On ``CentOS/Fedora/RHEL`` -:: - $ sudo yum install python-matplotlib python-qt4 - -Now you can fire up the GUI -:: - $ cd /to/moose-gui - $ python mgui.py - -.. note:: - If you have installed ``moose`` package, then GUI is launched by - running following commnad:: - $ moose - -Building moogli ---------------- - -``moogli`` is subproject of ``MOOSE`` for visualizing models. More details can -be found `here <http://moose.ncbs.res.in/moogli>`_. - -`Moogli` is part of `moose` package. Building moogli can be tricky because of -multiple depednecies it has. - - -To get the latest source code of ``moogli``, click on `this link <https://github.com/BhallaLab/moogli/archive/master.zip>`_. - -Moogli depends on ``OpenSceneGraph`` (version 3.2.0 or higher) which may not -be easily available for your operating system. -For this reason, we distribute required ``OpenSceneGraph`` with ``moogli`` -source code. - -Depending on distribution of your operating system, you would need following -packages to be installed. - -On ``Ubuntu/Debian`` -:: - $ sudo apt-get install python-qt4-dev python-qt4-gl python-sip-dev libqt4-dev - -On ``Fedora/CentOS/RHEL`` -:: - $ sudo yum install sip-devel PyQt4-devel qt4-devel libjpeg-devel PyQt4 - -On ``openSUSE`` -:: - $ sudo zypper install python-sip python-qt4-devel libqt4-devel python-qt4 - -After this, building and installing ``moogli`` should be as simple as -:: - $ cd /path/to/moogli - $ mkdir _build - $ cd _build - $ cmake .. - $ make - $ sudo make install - -If you run into troubles, please report it on our `github repository -<https://github.com/BhallaLab/moose/issues>`_. diff --git a/docs/source/install/moose_quickstart.rst~ b/docs/source/install/moose_quickstart.rst~ deleted file mode 100644 index e69de29b..00000000 diff --git a/genesis/Kholodenko_tosbml.xml b/genesis/Kholodenko_tosbml.xml new file mode 100644 index 00000000..01fff65d --- /dev/null +++ b/genesis/Kholodenko_tosbml.xml @@ -0,0 +1,902 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sbml xmlns:moose="http://www.moose.ncbs.res.in" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sbml.org/sbml/level3/version1/core" xmlns:addedPrefix="http://www.sbml.org/sbml/level3/version1" level="3" version="1"> + <model id="Kholodenko_tosbml" substanceUnits="substance" timeUnits="second" extentUnits="substance"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the oscillatory MAPK model from Kholodenko 2000 Eur J. Biochem 267:1583-1588 The original model is formulated in terms of idealized Michaelis-Menten enzymes and the enzyme-substrate complex concentrations are therefore assumed negligible. The current implementation of the model uses explicit enzyme reactions involving substrates and is therefore an approximation to the Kholodenko model. The approximation is greatly improved if the enzyme is flagged as Available which is an option in Kinetikit. This flag means that the enzyme protein concentration is not reduced even when it is involved in a complex. However, the substrate protein continues to participate in enzyme-substrate complexes and its concentration is therefore affected. Overall, this model works almost the same as the Kholodenko model but the peak MAPK-PP amplitudes are a little reduced and the period of oscillations is about 10% longer. If the enzymes are not flagged as Available then the oscillations commence only when the Km for enzyme 1 is set to 0.1 uM. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:runTime> 6000.0 </moose:runTime> + <moose:solver/> + <moose:simdt>0.005 </moose:simdt> + <moose:plotdt> 10.0 </moose:plotdt> + <moose:plots> /kinetics/Ras_dash_MKKKK; /kinetics/MKKK_dash_P; /kinetics/MKK_dash_PP; /kinetics/MAPK_dash_PP</moose:plots> + </moose:ModelAnnotation> + </annotation> + <listOfUnitDefinitions> + <unitDefinition id="volume"> + <listOfUnits> + <unit kind="litre" exponent="1" scale="0" multiplier="1"/> + </listOfUnits> + </unitDefinition> + <unitDefinition id="substance"> + <listOfUnits> + <unit kind="mole" exponent="1" scale="-3" multiplier="1"/> + </listOfUnits> + </unitDefinition> + <unitDefinition id="litre_per_mmole_per_second"> + <listOfUnits> + <unit kind="litre" exponent="1" scale="0" multiplier="1"/> + <unit kind="mole" exponent="-1" scale="-3" multiplier="1"/> + <unit kind="second" exponent="-1" scale="0" multiplier="1"/> + </listOfUnits> + </unitDefinition> + <unitDefinition id="per_second"> + <listOfUnits> + <unit kind="second" exponent="-1" scale="0" multiplier="1"/> + </listOfUnits> + </unitDefinition> + </listOfUnitDefinitions> + <listOfCompartments> + <compartment id="kinetics_481_0_" name="kinetics" spatialDimensions="3" size="1.66666666666667e-18" units="volume" constant="true"/> + </listOfCompartments> + <listOfSpecies> + <species id="MAPK_489_0_" name="MAPK" compartment="kinetics_481_0_" initialConcentration="0.0003" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The total concn. of MAPK is 300nM from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-8.0</moose:xCord> + <moose:yCord>-7.0</moose:yCord> + <moose:bgColor>35</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MKKK_491_0_" name="MKKK" compartment="kinetics_481_0_" initialConcentration="0.0001" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The total concn. of MKKK is 100nM from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-8.0</moose:xCord> + <moose:yCord>5.0</moose:yCord> + <moose:bgColor>16</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MKK_493_0_" name="MKK" compartment="kinetics_481_0_" initialConcentration="0.0003" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The total concn. of MKK is 300nM from Kholodenko,2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-8.0</moose:xCord> + <moose:yCord>-1.0</moose:yCord> + <moose:bgColor>60</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="int1_495_0_" name="int1" compartment="kinetics_481_0_" initialConcentration="1e-06" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the intermediate enzyme which catalyses the dephosphorylation of MKKK-P to MKKK. The concentration is set to 1 nM based on from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>4.0</moose:yCord> + <moose:bgColor>30</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MKKK_dash_P_499_0_" name="MKKK_dash_P" compartment="kinetics_481_0_" initialConcentration="0" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the phosphorylated form of MKKK which converts MKK to MKK-P and then to MKK-PP from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>0.0</moose:xCord> + <moose:yCord>5.0</moose:yCord> + <moose:bgColor>51</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="int3_505_0_" name="int3" compartment="kinetics_481_0_" initialConcentration="1e-06" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This intermediate enzyme catalyses the dephosphorylation of MKK-P to MKK. The concentration is 1nM from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>-2.0</moose:yCord> + <moose:bgColor>blue</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="int5_509_0_" name="int5" compartment="kinetics_481_0_" initialConcentration="1e-06" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This catalyses the conversion of MAPK-P to MAPK. The concenration is 1nM. from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>-8.0</moose:yCord> + <moose:bgColor>1</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MKK_dash_P_513_0_" name="MKK_dash_P" compartment="kinetics_481_0_" initialConcentration="0" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the single phoshorylated form of MKK. from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>0.0</moose:xCord> + <moose:yCord>-1.0</moose:yCord> + <moose:bgColor>5</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MAPK_dash_P_515_0_" name="MAPK_dash_P" compartment="kinetics_481_0_" initialConcentration="0" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the single phopshorylated form of MAPK from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>0.0</moose:xCord> + <moose:yCord>-7.0</moose:yCord> + <moose:bgColor>55</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="int2_517_0_" name="int2" compartment="kinetics_481_0_" initialConcentration="1e-06" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This intermediate enzyme which catalyses the dephosphorylation of MKK-PP to MKK-P. The concentration is 1nM. from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>4.0</moose:xCord> + <moose:yCord>-2.0</moose:yCord> + <moose:bgColor>2</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="int4_521_0_" name="int4" compartment="kinetics_481_0_" initialConcentration="1e-06" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This intermediate enzyme catalyses the dephosphorylation of MAPK-PP to MAPK-P. The concentration is 1nM. from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>4.0</moose:xCord> + <moose:yCord>-8.0</moose:yCord> + <moose:bgColor>17</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="Ras_dash_MKKKK_525_0_" name="Ras_dash_MKKKK" compartment="kinetics_481_0_" initialConcentration="1e-06" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The concn. of Ras-MKKKK* is set to 1 nM implicitly from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>6.0</moose:xCord> + <moose:yCord>8.0</moose:yCord> + <moose:bgColor>11</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="inactiveRas_dash_MKKK_529_0_" name="inactiveRas_dash_MKKK" compartment="kinetics_481_0_" initialConcentration="0" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the inactive form of Ras-MKKK. Based on the reaction scheme from Kholodenko 2000, this is equivalent to a binding of the MAPK-PP to the Ras. The amount of Ras in the model is small enough that negligible amounts of MAPK are involved in this reaction. So it is a fair approximation to the negative feedback mechanism from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>11.0</moose:xCord> + <moose:yCord>8.0</moose:yCord> + <moose:bgColor>30</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MKK_dash_PP_533_0_" name="MKK_dash_PP" compartment="kinetics_481_0_" initialConcentration="0" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the double phosphorylated and active form of MKK from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>8.0</moose:xCord> + <moose:yCord>-1.0</moose:yCord> + <moose:bgColor>0</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + <species id="MAPK_dash_PP_539_0_" name="MAPK_dash_PP" compartment="kinetics_481_0_" initialConcentration="0" substanceUnits="substance" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + This is the double phosphorylated and active form of MAPK. from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>8.0</moose:xCord> + <moose:yCord>-7.0</moose:yCord> + <moose:bgColor>58</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + </species> + </listOfSpecies> + <listOfReactions> + <reaction id="Neg_feedback_531_0_" name="Neg_feedback" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + From Kholodenko, 2000 Eur J Biochem 267 the Kd is 9 nM. We use a rather fast Kf of 1/sec/uM so that equilibrium is maintained. + </body> + </notes> + <annotation> + <moose:ModelAnnotation> + <moose:Group>MAPK</moose:Group> + <moose:xCord>11.0</moose:xCord> + <moose:yCord>2.0</moose:yCord> + <moose:bgColor>white</moose:bgColor> + <moose:textColor>yellow</moose:textColor> + </moose:ModelAnnotation> + </annotation> + <listOfReactants> + <speciesReference species="MAPK_dash_PP_539_0_" stoichiometry="1" constant="false"/> + <speciesReference species="Ras_dash_MKKKK_525_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="inactiveRas_dash_MKKK_529_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kinetics_481_0_ * Neg_feedback_531_0__Kf * MAPK_dash_PP_539_0_*Ras_dash_MKKKK_525_0_-kinetics_481_0_ * Neg_feedback_531_0__Kb * inactiveRas_dash_MKKK_529_0_ + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <minus/> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <ci> Neg_feedback_531_0__Kf </ci> + <ci> MAPK_dash_PP_539_0_ </ci> + <ci> Ras_dash_MKKKK_525_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <ci> Neg_feedback_531_0__Kb </ci> + <ci> inactiveRas_dash_MKKK_529_0_ </ci> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Neg_feedback_531_0__Kf" value="1000" units="litre_per_mmole_per_second"/> + <localParameter id="Neg_feedback_531_0__Kb" value="0.009" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_2_497_0_" name="2" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + Km is 8nM and Vmax is 0.25nM.s-1 from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>5.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>30</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MKKK_dash_P_499_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MKKK_491_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="int1_495_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MKKK_dash_P_499_0_*int1_495_0_/(kinetics_481_0_ * (Km+MKKK_dash_P_499_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MKKK_dash_P_499_0_ </ci> + <ci> int1_495_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MKKK_dash_P_499_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="8e-06" units="substance"/> + <localParameter id="kcat" value="0.25" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_3_501_0_" name="3" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + Km is 15 nM and Vmax is 0.025s-1 from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>2.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>51</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MKK_493_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MKK_dash_P_513_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="MKKK_dash_P_499_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MKK_493_0_*MKKK_dash_P_499_0_/(kinetics_481_0_ * (Km+MKK_493_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MKK_493_0_ </ci> + <ci> MKKK_dash_P_499_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MKK_493_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.500006000024e-05" units="substance"/> + <localParameter id="kcat" value="0.025" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_4_503_0_" name="4" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + Km is 15nM and Vmax is 0.025s-1 from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>4.0</moose:xCord> + <moose:yCord>2.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>51</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MKK_dash_P_513_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MKK_dash_PP_533_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="MKKK_dash_P_499_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MKK_dash_P_513_0_*MKKK_dash_P_499_0_/(kinetics_481_0_ * (Km+MKK_dash_P_513_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MKK_dash_P_513_0_ </ci> + <ci> MKKK_dash_P_499_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MKK_dash_P_513_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.500006000024e-05" units="substance"/> + <localParameter id="kcat" value="0.025" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_6_507_0_" name="6" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 15nM and the Vmax is 0.75nM.s-1 from Kholodenko 2000. + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>-1.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>blue</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MKK_dash_P_513_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MKK_493_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="int3_505_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MKK_dash_P_513_0_*int3_505_0_/(kinetics_481_0_ * (Km+MKK_dash_P_513_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MKK_dash_P_513_0_ </ci> + <ci> int3_505_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MKK_dash_P_513_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.5e-05" units="substance"/> + <localParameter id="kcat" value="0.75" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_10_511_0_" name="10" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 15nM and Vmax is 0.5nM.s-1 from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>-7.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>1</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MAPK_dash_P_515_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MAPK_489_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="int5_509_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MAPK_dash_P_515_0_*int5_509_0_/(kinetics_481_0_ * (Km+MAPK_dash_P_515_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MAPK_dash_P_515_0_ </ci> + <ci> int5_509_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MAPK_dash_P_515_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.49997000059999e-05" units="substance"/> + <localParameter id="kcat" value="0.5" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_5_519_0_" name="5" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 15nM and Vmax is 0.75nM.s-1 from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>4.0</moose:xCord> + <moose:yCord>-1.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>2</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MKK_dash_PP_533_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MKK_dash_P_513_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="int2_517_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MKK_dash_PP_533_0_*int2_517_0_/(kinetics_481_0_ * (Km+MKK_dash_PP_533_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MKK_dash_PP_533_0_ </ci> + <ci> int2_517_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MKK_dash_PP_533_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.5e-05" units="substance"/> + <localParameter id="kcat" value="0.75" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_9_523_0_" name="9" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 15nM and Vmax is 0.5nM.s-1 from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>4.0</moose:xCord> + <moose:yCord>-7.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>17</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MAPK_dash_PP_539_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MAPK_dash_P_515_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="int4_521_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MAPK_dash_PP_539_0_*int4_521_0_/(kinetics_481_0_ * (Km+MAPK_dash_PP_539_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MAPK_dash_PP_539_0_ </ci> + <ci> int4_521_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MAPK_dash_PP_539_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.49997000059999e-05" units="substance"/> + <localParameter id="kcat" value="0.5" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_1_527_0_" name="1" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 10nM and Vmax is 2.5nM sec^-1. We assume that there is 1 nM of the Ras-MKKKK. From Kholodenko, 2000. If the enzymes are not flagged as Available, then this Km should be set to 0.1 to obtain oscillations. + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>8.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>11</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MKKK_491_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MKKK_dash_P_499_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="Ras_dash_MKKKK_525_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MKKK_491_0_*Ras_dash_MKKKK_525_0_/(kinetics_481_0_ * (Km+MKKK_491_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MKKK_491_0_ </ci> + <ci> Ras_dash_MKKKK_525_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MKKK_491_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1e-05" units="substance"/> + <localParameter id="kcat" value="2.5" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_7_535_0_" name="7" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 15nM which is 0.015uM Vmax is 0.025s-1 from Kholodenko, 2000. + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>-4.0</moose:xCord> + <moose:yCord>-4.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>0</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MAPK_489_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MAPK_dash_P_515_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="MKK_dash_PP_533_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MAPK_489_0_*MKK_dash_PP_533_0_/(kinetics_481_0_ * (Km+MAPK_489_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MAPK_489_0_ </ci> + <ci> MKK_dash_PP_533_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MAPK_489_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.500006000024e-05" units="substance"/> + <localParameter id="kcat" value="0.025" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + <reaction id="_8_537_0_" name="8" reversible="true" fast="false"> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + The Km is 15nM which is 0.015uM and Vmax is 0.025s-1 from Kholodenko, 2000 + </body> + </notes> + <annotation> + <moose:EnzymaticReaction> + <moose:Group>MAPK</moose:Group> + <moose:xCord>4.0</moose:xCord> + <moose:yCord>-4.0</moose:yCord> + <moose:bgColor>red</moose:bgColor> + <moose:textColor>0</moose:textColor> + </moose:EnzymaticReaction> + </annotation> + <listOfReactants> + <speciesReference species="MAPK_dash_P_515_0_" stoichiometry="1" constant="false"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="MAPK_dash_PP_539_0_" stoichiometry="1" constant="false"/> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="MKK_dash_PP_533_0_"/> + </listOfModifiers> + <kineticLaw> + <notes> + <body xmlns="http://www.w3.org/1999/xhtml"> + kcat *MAPK_dash_P_515_0_*MKK_dash_PP_533_0_/(kinetics_481_0_ * (Km+MAPK_dash_P_515_0_)) + </body> + </notes> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <divide/> + <apply> + <times/> + <ci> kcat </ci> + <ci> MAPK_dash_P_515_0_ </ci> + <ci> MKK_dash_PP_533_0_ </ci> + </apply> + <apply> + <times/> + <ci> kinetics_481_0_ </ci> + <apply> + <plus/> + <ci> Km </ci> + <ci> MAPK_dash_P_515_0_ </ci> + </apply> + </apply> + </apply> + </math> + <listOfLocalParameters> + <localParameter id="Km" value="1.500006000024e-05" units="substance"/> + <localParameter id="kcat" value="0.025" units="per_second"/> + </listOfLocalParameters> + </kineticLaw> + </reaction> + </listOfReactions> + </model> +</sbml> diff --git a/snippets/RandSpikeStats.py b/snippets/RandSpikeStats.py index 05f935d3..dfe288f9 100644 --- a/snippets/RandSpikeStats.py +++ b/snippets/RandSpikeStats.py @@ -102,8 +102,6 @@ def main(): moose.setClock( i, dt ) moose.useClock( 8, '/plot#', 'process' ) ''' - - # Run the 'main' if this script is executed standalone. if __name__ == '__main__': main() diff --git a/snippets/analogStimTable.py b/snippets/analogStimTable.py index 09c852d6..006f47f8 100644 --- a/snippets/analogStimTable.py +++ b/snippets/analogStimTable.py @@ -91,5 +91,6 @@ for plotting. if __name__ == '__main__': main() + # # stimtable.py ends here diff --git a/snippets/analogStimTable.py~ b/snippets/analogStimTable.py~ deleted file mode 100644 index f1cf3c6c..00000000 --- a/snippets/analogStimTable.py~ +++ /dev/null @@ -1,95 +0,0 @@ -# analogStimTable.py --- -# -# Filename: analogStimTable.py -# Description: -# Author: Upi Bhalla -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# - -import numpy as np -import pylab -import moose -from moose import utils - -def analogStimTable(): - simtime = 150 - simdt = 0.1 - model = moose.Neutral('/model') - data = moose.Neutral('/data') - # This is the stimulus generator - stimtable = moose.StimulusTable('/model/stim') - a = moose.BufPool( '/model/a' ) - b = moose.Pool( '/model/b' ) - reac = moose.Reac( '/model/reac' ) - reac.Kf = 0.1 - reac.Kb = 0.1 - moose.connect( stimtable, 'output', a, 'setConcInit' ) - moose.connect( reac, 'sub', a, 'reac' ) - moose.connect( reac, 'prd', b, 'reac' ) - aPlot = moose.Table('/data/aPlot') - moose.connect(aPlot, 'requestOut', a, 'getConc') - bPlot = moose.Table('/data/bPlot') - moose.connect(bPlot, 'requestOut', b, 'getConc') - moose.setClock( stimtable.tick, simdt ) - moose.setClock( a.tick, simdt ) - moose.setClock( aPlot.tick, simdt ) - - #################################################### - # Here we set up the stimulus table. It is half a sine-wave. - stim = [ np.sin(0.01 * float(i) ) for i in range( 314 )] - stimtable.vector = stim - stimtable.stepSize = 0 # This forces use of current time as x value - - # The table will interpolate its contents over the time start to stop: - # At values less than startTime, it emits the first value in table - stimtable.startTime = 5 - # At values more than stopTime, it emits the last value in table - stimtable.stopTime = 60 - stimtable.doLoop = 1 # Enable repeat playbacks. - stimtable.loopTime = 10 + simtime / 2.0 # Repeat playback over this time - - moose.reinit() - moose.start(simtime) - t = [ x * simdt for x in range( len( aPlot.vector ) )] - pylab.plot( t, aPlot.vector, label='Stimulus waveform' ) - pylab.plot( t, bPlot.vector, label='Reaction product b' ) - pylab.legend() - pylab.show() - -def main(): - """ -Example of using a StimulusTable as an analog signal source in -a reaction system. It could be used similarly to give other -analog inputs to a model, such as a current or voltage clamp signal. - -This demo creates a StimulusTable and assigns it half a sine wave. -Then we assign the start time and period over which to emit the wave. -The output of the StimTable is sent to a pool **a**, which participates -in a trivial reaction:: - - table ----> a <===> b - -The output of **a** and **b** are recorded in a regular table -for plotting. - """ - analogStimTable() - -if __name__ == '__main__': - main - -# -# stimtable.py ends here diff --git a/snippets/crossComptNeuroMesh.py.png b/snippets/crossComptNeuroMesh.py.png new file mode 100644 index 0000000000000000000000000000000000000000..130c8446d0a064cbdff9f09228c633b6d1a2e6f0 GIT binary patch literal 43382 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 UwuJ`me?dJkPgg&ebxsLQ0ACtkGynhq literal 0 HcmV?d00001 diff --git a/snippets/crossComptSimpleReac.py b/snippets/crossComptSimpleReac.py index ddfea60b..e3fffe80 100644 --- a/snippets/crossComptSimpleReac.py +++ b/snippets/crossComptSimpleReac.py @@ -11,84 +11,84 @@ import math import matplotlib.pyplot as plt -import numpy +import numpy as np import moose def makeModel(): - # create container for model - model = moose.Neutral( 'model' ) - compt0 = moose.CubeMesh( '/model/compt0' ) - compt0.volume = 1e-15 - compt1 = moose.CubeMesh( '/model/compt1' ) - compt1.volume = 1e-16 - compt2 = moose.CubeMesh( '/model/compt2' ) - compt2.volume = 1e-17 - - # Position containers so that they abut each other, with - # compt1 in the middle. - side = compt1.dy - compt0.y1 += side - compt0.y0 += side - compt2.x1 += side - compt2.x0 += side - print(('Volumes = ', compt0.volume, compt1.volume, compt2.volume)) - - # create molecules and reactions - a = moose.Pool( '/model/compt0/a' ) - b = moose.Pool( '/model/compt1/b' ) - c = moose.Pool( '/model/compt2/c' ) - reac0 = moose.Reac( '/model/compt1/reac0' ) - reac1 = moose.Reac( '/model/compt1/reac1' ) - - # connect them up for reactions - moose.connect( reac0, 'sub', a, 'reac' ) - moose.connect( reac0, 'prd', b, 'reac' ) - moose.connect( reac1, 'sub', b, 'reac' ) - moose.connect( reac1, 'prd', c, 'reac' ) - - # Assign parameters - a.concInit = 1 - b.concInit = 12.1 - c.concInit = 1 - reac0.Kf = 0.1 - reac0.Kb = 0.1 - reac1.Kf = 0.1 - reac1.Kb = 0.1 - - # Create the output tables - graphs = moose.Neutral( '/model/graphs' ) - outputA = moose.Table2 ( '/model/graphs/concA' ) - outputB = moose.Table2 ( '/model/graphs/concB' ) - outputC = moose.Table2 ( '/model/graphs/concC' ) - - # connect up the tables - moose.connect( outputA, 'requestOut', a, 'getConc' ); - moose.connect( outputB, 'requestOut', b, 'getConc' ); - moose.connect( outputC, 'requestOut', c, 'getConc' ); - - # Build the solvers. No need for diffusion in this version. - ksolve0 = moose.Ksolve( '/model/compt0/ksolve0' ) - ksolve1 = moose.Ksolve( '/model/compt1/ksolve1' ) - ksolve2 = moose.Ksolve( '/model/compt2/ksolve2' ) - stoich0 = moose.Stoich( '/model/compt0/stoich0' ) - stoich1 = moose.Stoich( '/model/compt1/stoich1' ) - stoich2 = moose.Stoich( '/model/compt2/stoich2' ) - - # Configure solvers - stoich0.compartment = compt0 - stoich1.compartment = compt1 - stoich2.compartment = compt2 - stoich0.ksolve = ksolve0 - stoich1.ksolve = ksolve1 - stoich2.ksolve = ksolve2 - stoich0.path = '/model/compt0/#' - stoich1.path = '/model/compt1/#' - stoich2.path = '/model/compt2/#' - stoich1.buildXreacs( stoich0 ) - stoich1.buildXreacs( stoich2 ) - stoich0.filterXreacs() - stoich1.filterXreacs() - stoich2.filterXreacs() + # create container for model + model = moose.Neutral( 'model' ) + compt0 = moose.CubeMesh( '/model/compt0' ) + compt0.volume = 1e-15 + compt1 = moose.CubeMesh( '/model/compt1' ) + compt1.volume = 1e-16 + compt2 = moose.CubeMesh( '/model/compt2' ) + compt2.volume = 1e-17 + + # Position containers so that they abut each other, with + # compt1 in the middle. + side = compt1.dy + compt0.y1 += side + compt0.y0 += side + compt2.x1 += side + compt2.x0 += side + print(('Volumes = ', compt0.volume, compt1.volume, compt2.volume)) + + # create molecules and reactions + a = moose.Pool( '/model/compt0/a' ) + b = moose.Pool( '/model/compt1/b' ) + c = moose.Pool( '/model/compt2/c' ) + reac0 = moose.Reac( '/model/compt1/reac0' ) + reac1 = moose.Reac( '/model/compt1/reac1' ) + + # connect them up for reactions + moose.connect( reac0, 'sub', a, 'reac' ) + moose.connect( reac0, 'prd', b, 'reac' ) + moose.connect( reac1, 'sub', b, 'reac' ) + moose.connect( reac1, 'prd', c, 'reac' ) + + # Assign parameters + a.concInit = 1 + b.concInit = 12.1 + c.concInit = 1 + reac0.Kf = 0.1 + reac0.Kb = 0.1 + reac1.Kf = 0.1 + reac1.Kb = 0.1 + + # Create the output tables + graphs = moose.Neutral( '/model/graphs' ) + outputA = moose.Table2 ( '/model/graphs/concA' ) + outputB = moose.Table2 ( '/model/graphs/concB' ) + outputC = moose.Table2 ( '/model/graphs/concC' ) + + # connect up the tables + moose.connect( outputA, 'requestOut', a, 'getConc' ); + moose.connect( outputB, 'requestOut', b, 'getConc' ); + moose.connect( outputC, 'requestOut', c, 'getConc' ); + + # Build the solvers. No need for diffusion in this version. + ksolve0 = moose.Ksolve( '/model/compt0/ksolve0' ) + ksolve1 = moose.Ksolve( '/model/compt1/ksolve1' ) + ksolve2 = moose.Ksolve( '/model/compt2/ksolve2' ) + stoich0 = moose.Stoich( '/model/compt0/stoich0' ) + stoich1 = moose.Stoich( '/model/compt1/stoich1' ) + stoich2 = moose.Stoich( '/model/compt2/stoich2' ) + + # Configure solvers + stoich0.compartment = compt0 + stoich1.compartment = compt1 + stoich2.compartment = compt2 + stoich0.ksolve = ksolve0 + stoich1.ksolve = ksolve1 + stoich2.ksolve = ksolve2 + stoich0.path = '/model/compt0/#' + stoich1.path = '/model/compt1/#' + stoich2.path = '/model/compt2/#' + stoich1.buildXreacs( stoich0 ) + stoich1.buildXreacs( stoich2 ) + stoich0.filterXreacs() + stoich1.filterXreacs() + stoich2.filterXreacs() @@ -142,13 +142,17 @@ def main(): # FIXME: Plotting causes seg-fault. ## Iterate through all plots, dump their contents to data.plot. - #for x in moose.wildcardFind( '/model/graphs/conc#' ): - # t = numpy.linspace( 0, runtime, x.vector.size ) # sec - # plt.plot( t, x.vector, label=x.name ) - #plt.legend() - #plt.show() - #quit() - + ### Temp fix, if try to save and plot the graph doesn't give seg fault + for x in moose.wildcardFind( '/model/graphs/conc#' ): + t = np.arange( 0, x.vector.size, 1) # sec + graphpath = x.name+".csv" + #t = np.linspace( 0, runtime,x.vector.size) # sec + f = open(graphpath, "w") + np.savetxt(graphpath, np.vstack((t*plotdt,x.vector))) + plt.plot( t, x.vector, label=x.name ) + plt.legend() + plt.show() + quit() # Run the 'main' if this script is executed standalone. if __name__ == '__main__': main() diff --git a/snippets/cspaceSteadyState.py b/snippets/cspaceSteadyState.py index 13b8ae8a..713e157b 100644 --- a/snippets/cspaceSteadyState.py +++ b/snippets/cspaceSteadyState.py @@ -13,28 +13,28 @@ import numpy import moose def displayPlots(): - for x in moose.wildcardFind( '/model/graphs/#' ): - t = numpy.arange( 0, x.vector.size, 1 ) #sec - pylab.plot( t, x.vector, label=x.name ) - pylab.legend() - pylab.show() + for x in moose.wildcardFind( '/model/graphs/#' ): + t = numpy.arange( 0, x.vector.size, 1 ) #sec + pylab.plot( t, x.vector, label=x.name ) + pylab.legend() + pylab.show() def getState( ksolve, state ): - state.randomInit() - moose.start( 0.1 ) # Run the model for 2 seconds. - state.settle() - ''' - scale = 1.0 / ( 1e-15 * 6.022e23 ) - for x in ksolve.nVec[0]: - print x * scale, - # print ksolve.nVec[0] - print state.nIter, state.status, state.stateType, state.nNegEigenvalues, state.nPosEigenvalues, state.solutionStatus - ''' - moose.start( 20.0 ) # Run model for 10 seconds, just for display + state.randomInit() + moose.start( 0.1 ) # Run the model for 2 seconds. + state.settle() + ''' + scale = 1.0 / ( 1e-15 * 6.022e23 ) + for x in ksolve.nVec[0]: + print x * scale, + # print ksolve.nVec[0] + print state.nIter, state.status, state.stateType, state.nNegEigenvalues, state.nPosEigenvalues, state.solutionStatus + ''' + moose.start( 20.0 ) # Run model for 10 seconds, just for display def main(): - """ + """ This example sets up the kinetic solver and steady-state finder, on a bistable model. It looks for the fixed points 100 times, as follows: @@ -71,53 +71,53 @@ def main(): this algorithm! You may wish to sample concentration space logarithmically rather than linearly. - """ - # The wildcard uses # for single level, and ## for recursive. - #compartment = makeModel() - moose.loadModel( '../genesis/M1719.cspace', '/model', 'ee' ) - compartment = moose.element( 'model/kinetics' ) - compartment.name = 'compartment' - ksolve = moose.Ksolve( '/model/compartment/ksolve' ) - stoich = moose.Stoich( '/model/compartment/stoich' ) - stoich.compartment = compartment - stoich.ksolve = ksolve - #ksolve.stoich = stoich - stoich.path = "/model/compartment/##" - state = moose.SteadyState( '/model/compartment/state' ) - - moose.reinit() - state.stoich = stoich - #state.showMatrices() - state.convergenceCriterion = 1e-7 - - moose.le( '/model/graphs' ) - a = moose.element( '/model/compartment/a' ) - b = moose.element( '/model/compartment/b' ) - c = moose.element( '/model/compartment/c' ) - - for i in range( 0, 100 ): - getState( ksolve, state ) - - moose.start( 100.0 ) # Run the model for 100 seconds. - - b = moose.element( '/model/compartment/b' ) - c = moose.element( '/model/compartment/c' ) - - # move most molecules over to b - b.conc = b.conc + c.conc * 0.95 - c.conc = c.conc * 0.05 - moose.start( 100.0 ) # Run the model for 100 seconds. - - # move most molecules back to a - c.conc = c.conc + b.conc * 0.95 - b.conc = b.conc * 0.05 - moose.start( 100.0 ) # Run the model for 100 seconds. - - # Iterate through all plots, dump their contents to data.plot. - displayPlots() - - quit() + """ + # The wildcard uses # for single level, and ## for recursive. + #compartment = makeModel() + moose.loadModel( '../genesis/M1719.cspace', '/model', 'ee' ) + compartment = moose.element( 'model/kinetics' ) + compartment.name = 'compartment' + ksolve = moose.Ksolve( '/model/compartment/ksolve' ) + stoich = moose.Stoich( '/model/compartment/stoich' ) + stoich.compartment = compartment + stoich.ksolve = ksolve + #ksolve.stoich = stoich + stoich.path = "/model/compartment/##" + state = moose.SteadyState( '/model/compartment/state' ) + + moose.reinit() + state.stoich = stoich + #state.showMatrices() + state.convergenceCriterion = 1e-7 + + moose.le( '/model/graphs' ) + a = moose.element( '/model/compartment/a' ) + b = moose.element( '/model/compartment/b' ) + c = moose.element( '/model/compartment/c' ) + + for i in range( 0, 100 ): + getState( ksolve, state ) + + moose.start( 100.0 ) # Run the model for 100 seconds. + + b = moose.element( '/model/compartment/b' ) + c = moose.element( '/model/compartment/c' ) + + # move most molecules over to b + b.conc = b.conc + c.conc * 0.95 + c.conc = c.conc * 0.05 + moose.start( 100.0 ) # Run the model for 100 seconds. + + # move most molecules back to a + c.conc = c.conc + b.conc * 0.95 + b.conc = b.conc * 0.05 + moose.start( 100.0 ) # Run the model for 100 seconds. + + # Iterate through all plots, dump their contents to data.plot. + displayPlots() + + quit() # Run the 'main' if this script is executed standalone. if __name__ == '__main__': - main() + main() diff --git a/snippets/diffSpinyNeuron.py b/snippets/diffSpinyNeuron.py index b1502b7f..54d42330 100644 --- a/snippets/diffSpinyNeuron.py +++ b/snippets/diffSpinyNeuron.py @@ -267,8 +267,6 @@ def main(): moose.setClock( i, chemdt ) # for the chem objects moose.setClock( 10, diffdt ) # for the diffusion moose.setClock( 18, plotdt ) # for the output tables. - ''' - ''' moose.reinit() for i in numpy.arange( 0, runtime, animationdt ): moose.start( animationdt ) diff --git a/snippets/funcInputToPools.py b/snippets/funcInputToPools.py index 2ca3f4c0..b6f8f0b3 100644 --- a/snippets/funcInputToPools.py +++ b/snippets/funcInputToPools.py @@ -65,9 +65,6 @@ def makeModel(): stoich.compartment = compartment stoich.ksolve = gsolve stoich.path = '/model/compartment/##' - ''' - ''' - # We need a finer timestep than the default 0.1 seconds, # in order to get numerical accuracy. for i in range (10, 19 ): @@ -75,27 +72,27 @@ def makeModel(): def main(): """ - This example describes the special (and discouraged) use case where - functions provide input to a reaction system. Here we have two functions of - time which control the pool # and pool rate of change, respectively:: +This example describes the special (and discouraged) use case where +functions provide input to a reaction system. Here we have two functions of +time which control the pool # and pool rate of change, respectively:: - number of molecules of a = 1 + sin(t) - rate of change of number of molecules of b = 10 * cos(t) +number of molecules of a = 1 + sin(t) +rate of change of number of molecules of b = 10 * cos(t) - In the stochastic case one must set a special flag *useClockedUpdate* - in order to achieve clock-triggered updates from the functions. This is - needed because the functions do not have reaction events to trigger them, - and even if there were reaction events they might not be frequent enough to - track the periodic updates. The use of this flag slows down the calculations, - so try to use a table to control a pool instead. +In the stochastic case one must set a special flag *useClockedUpdate* +in order to achieve clock-triggered updates from the functions. This is +needed because the functions do not have reaction events to trigger them, +and even if there were reaction events they might not be frequent enough to +track the periodic updates. The use of this flag slows down the calculations, +so try to use a table to control a pool instead. - To run in stochastic mode:: +To run in stochastic mode:: - ''python funcInputToPools'' + ''python funcInputToPools'' - To run in deterministic mode:: +To run in deterministic mode:: - ''python funcInputToPools false'' + ''python funcInputToPools false'' """ @@ -120,4 +117,4 @@ def main(): # Run the 'main' if this script is executed standalone. if __name__ == '__main__': - main() + main() \ No newline at end of file diff --git a/snippets/function.py~ b/snippets/function.py~ deleted file mode 100644 index 8b574ea0..00000000 --- a/snippets/function.py~ +++ /dev/null @@ -1,200 +0,0 @@ -# function.py --- -# -# Filename: function.py -# Description: -# Author: Subhasis Ray -# Maintainer: -# Created: Tue Sep 9 17:59:50 2014 (+0530) -# Version: -# Last-Updated: Sun Dec 20 00:02:50 2015 (-0500) -# By: subha -# Update #: 4 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: - -import numpy as np -import sys -import matplotlib.pyplot as plt - -import moose - -simtime = 1.0 - -def example(): - demo = moose.Neutral('/model') - function = moose.Function('/model/function') - function.c['c0'] = 1.0 - function.c['c1'] = 2.0 - function.x.num = 1 - function.expr = 'c0 * exp(c1*x0) * cos(y0) + sin(t)' - # mode 0 - evaluate function value, derivative and rate - # mode 1 - just evaluate function value, - # mode 2 - evaluate derivative, - # mode 3 - evaluate rate - function.mode = 0 - function.independent = 'y0' - nsteps = 1000 - xarr = np.linspace(0.0, 1.0, nsteps) - # Stimulus tables allow you to store sequences of numbers which - # are delivered via the 'output' message at each time step. This - # is a placeholder and in real scenario you will be using any - # sourceFinfo that sends out a double value. - input_x = moose.StimulusTable('/xtab') - input_x.vector = xarr - input_x.startTime = 0.0 - input_x.stepPosition = xarr[0] - input_x.stopTime = simtime - moose.connect(input_x, 'output', function.x[0], 'input') - - yarr = np.linspace(-np.pi, np.pi, nsteps) - input_y = moose.StimulusTable('/ytab') - input_y.vector = yarr - input_y.startTime = 0.0 - input_y.stepPosition = yarr[0] - input_y.stopTime = simtime - moose.connect(function, 'requestOut', input_y, 'getOutputValue') - - # data recording - result = moose.Table('/ztab') - moose.connect(result, 'requestOut', function, 'getValue') - derivative = moose.Table('/zprime') - moose.connect(derivative, 'requestOut', function, 'getDerivative') - rate = moose.Table('/dz_by_dt') - moose.connect(rate, 'requestOut', function, 'getRate') - x_rec = moose.Table('/xrec') - moose.connect(x_rec, 'requestOut', input_x, 'getOutputValue') - y_rec = moose.Table('/yrec') - moose.connect(y_rec, 'requestOut', input_y, 'getOutputValue') - - dt = simtime/nsteps - for ii in range(32): - moose.setClock(ii, dt) - moose.reinit() - moose.start(simtime) - - # Uncomment the following lines and the import matplotlib.pyplot as plt on top - # of this file to display the plot. - plt.subplot(3,1,1) - plt.plot(x_rec.vector, result.vector, 'r-', label='z = {}'.format(function.expr)) - z = function.c['c0'] * np.exp(function.c['c1'] * xarr) * np.cos(yarr) + np.sin(np.arange(len(xarr)) * dt) - plt.plot(xarr, z, 'b--', label='numpy computed') - plt.xlabel('x') - plt.ylabel('z') - plt.legend() - - plt.subplot(3,1,2) - plt.plot(y_rec.vector, derivative.vector, 'r-', label='dz/dy0') - # derivatives computed by putting x values in the analytical formula - dzdy = function.c['c0'] * np.exp(function.c['c1'] * xarr) * (- np.sin(yarr)) - plt.plot(yarr, dzdy, 'b--', label='numpy computed') - plt.xlabel('y') - plt.ylabel('dz/dy') - plt.legend() - - plt.subplot(3,1,3) - # *** BEWARE *** The first two entries are spurious. Entry 0 is - # *** from reinit sending out the defaults. Entry 2 is because - # *** there is no lastValue for computing real forward difference. - plt.plot(np.arange(2, len(rate.vector), 1) * dt, rate.vector[2:], 'r-', label='dz/dt') - dzdt = np.diff(z)/dt - plt.plot(np.arange(0, len(dzdt), 1.0) * dt, dzdt, 'b--', label='numpy computed') - plt.xlabel('t') - plt.ylabel('dz/dt') - plt.legend() - plt.tight_layout() - plt.show() - -def main(): - """ - Function objects can be used to evaluate expressions with arbitrary - number of variables and constants. We can assign expression of the - form:: - - f(c_, c1, ..., cM, x0, x1, ..., xN, y0,..., yP ) - - where `ci`'s are constants and `xi`'s and `yi`'s are variables. - - The constants must be defined before setting the expression and - variables are connected via messages. The constants can have any - name, but the variable names must be of the form x{i} or y{i} - where i is increasing integer starting from 0. - - The `xi`'s are field elements and you have to set their number - first (function.x.num = N). Then you can connect any source field - sending out double to the 'input' destination field of the - `x[i]`. - - The `yi`'s are useful when the required variable is a value field - and is not available as a source field. In that case you connect - the `requestOut` source field of the function element to the - `get{Field}` destination field on the target element. The `yi`'s - are automatically added on connecting. Thus, if you call:: - - moose.connect(function, 'requestOut', a, 'getSomeField') - moose.connect(function, 'requestOut', b, 'getSomeField') - - then ``a.someField`` will be assigned to ``y0`` and - ``b.someField`` will be assigned to ``y1``. - - In this example we evaluate the expression: ``z = c0 * exp(c1 * - x0) * cos(y0)`` - - with x0 ranging from -1 to +1 and y0 ranging from -pi to - +pi. These values are stored in two stimulus tables called xtab - and ytab respectively, so that at each timestep the next values of - x0 and y0 are assigned to the function. - - Along with the value of the expression itself we also compute its - derivative with respect to y0 and its derivative with respect to - time (rate). The former uses a five-point stencil for the - numerical differentiation and has a glitch at y=0. The latter uses - backward difference divided by dt. - - Unlike Func class, the number of variables and constants are - unlimited in Function and you can set all the variables via - messages. - - """ - example() - -if __name__ == '__main__': - main() - - - - -# -# function.py ends here diff --git a/snippets/intfire.py b/snippets/intfire.py index bfd6c808..7cd93d3c 100644 --- a/snippets/intfire.py +++ b/snippets/intfire.py @@ -49,9 +49,8 @@ import moose def connect_two_intfires(): """ -Connect two IntFire neurons so that spike events in one gets -transmitted to synapse of the other. - + Connect two IntFire neurons so that spike events in one gets + transmitted to synapse of the other. """ if1 = moose.IntFire('if1') if2 = moose.IntFire('if2') @@ -64,12 +63,11 @@ transmitted to synapse of the other. def connect_spikegen(): """ -Connect a SpikeGen object to an IntFire neuron such that spike -events in spikegen get transmitted to the synapse of the IntFire -neuron. - -if3 = moose.IntFire('if3') + Connect a SpikeGen object to an IntFire neuron such that spike + events in spikegen get transmitted to the synapse of the IntFire + neuron. """ + if3 = moose.IntFire('if3') sf3 = moose.SimpleSynHandler( 'if3/sh' ) moose.connect( sf3, 'activationOut', if3, 'activation' ) sf3.synapse.num = 1 @@ -79,8 +77,7 @@ if3 = moose.IntFire('if3') def setup_synapse(): """ -Create an intfire object and create two synapses on it. - + Create an intfire object and create two synapses on it. """ if4 = moose.IntFire('if4') sf4 = moose.SimpleSynHandler( 'if4/sh' ) @@ -96,9 +93,8 @@ Create an intfire object and create two synapses on it. def main(): """ -Demonstrates connection between 2 IntFire neurons to observe -spike generation. - + Demonstrates connection between 2 IntFire neurons to observe + spike generation. """ connect_two_intfires() connect_spikegen() diff --git a/snippets/loadKineticModel.py b/snippets/loadKineticModel.py index f5addb08..ad71c67a 100644 --- a/snippets/loadKineticModel.py +++ b/snippets/loadKineticModel.py @@ -54,7 +54,7 @@ def main(): This example illustrates loading, running, and saving a kinetic model defined in kkit format. It uses a default kkit model but you can specify another using the command line - ``python filename runtime solver``. + ``python filename runtime solver``. We use the gsl solver here. The model already defines a couple of plots and sets the runtime 20 secs. diff --git a/snippets/loadSbmlmodel.py b/snippets/loadSbmlmodel.py index 744c7239..6288215d 100644 --- a/snippets/loadSbmlmodel.py +++ b/snippets/loadSbmlmodel.py @@ -43,7 +43,7 @@ import pylab import moose from moose.SBML import * -from moose.chemUtil.add_Delete_ChemicalSolver import * +#from moose.chemUtil.add_Delete_ChemicalSolver import * def main(): """ diff --git a/snippets/reacDiffBranchingNeuron.py b/snippets/reacDiffBranchingNeuron.py index 53206070..ac4de982 100644 --- a/snippets/reacDiffBranchingNeuron.py +++ b/snippets/reacDiffBranchingNeuron.py @@ -120,12 +120,21 @@ def makeChemModel( compt ): """ This function sets up a simple oscillatory chemical system within the script. The reaction system is:: +<<<<<<< HEAD s ---a---> a // s goes to a, catalyzed by a. s ---a---> b // s goes to b, catalyzed by a. a ---b---> s // a goes to s, catalyzed by b. b -------> s // b is degraded irreversibly to s. +======= + + s ---a---> a // s goes to a, catalyzed by a. + s ---a---> b // s goes to b, catalyzed by a. + a ---b---> s // a goes to s, catalyzed by b. + b -------> s // b is degraded irreversibly to s. + +>>>>>>> 0e491aa41584cf7a66c0e242374d8ee61660eb7b in sum, **a** has a positive feedback onto itself and also forms **b**. **b** has a negative feedback onto **a**. Finally, the diffusion constant for **a** is 1/10 that of **b**. diff --git a/snippets/scaleVolumes.py b/snippets/scaleVolumes.py index 35c7ce76..965a8562 100644 --- a/snippets/scaleVolumes.py +++ b/snippets/scaleVolumes.py @@ -155,8 +155,14 @@ def main(): # Iterate through all plots, dump their contents to data.plot. displayPlots() pylab.show( block=False ) +<<<<<<< HEAD + print(('vol = ', vol, 'hit 0 to go to next plot')) + eval(str(input())) + +======= print( 'vol = %f ' % vol ) response = input( "Press enter to go to next plot... " ) +>>>>>>> 0e491aa41584cf7a66c0e242374d8ee61660eb7b quit() # Run the 'main' if this script is executed standalone. diff --git a/snippets/vclamp.py~ b/snippets/vclamp.py~ deleted file mode 100644 index 3ebd20ce..00000000 --- a/snippets/vclamp.py~ +++ /dev/null @@ -1,137 +0,0 @@ -# vclamp.py --- -# -# Filename: vclamp.py -# Description: -# Author:Subhasis Ray -# Maintainer: -# Created: Sat Feb 2 19:16:54 2013 (+0530) -# Version: -# Last-Updated: Tue Jun 11 17:35:20 2013 (+0530) -# By: subha -# Update #: 178 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: - -import sys -sys.path.append('../../python') -import moose -sys.path.append('../squid') -from squid import SquidAxon -from pylab import * - -def vclamp_demo(simtime=50.0, dt=1e-2): - ## It is good practice to modularize test elements inside a - ## container - container = moose.Neutral('/vClampDemo') - ## Create a compartment with properties of a squid giant axon - comp = SquidAxon('/vClampDemo/axon') - # Create and setup the voltage clamp object - clamp = moose.VClamp('/vClampDemo/vclamp') - ## The defaults should work fine - # clamp.mode = 2 - # clamp.tau = 10*dt - # clamp.ti = dt - # clamp.td = 0 - # clamp.gain = comp.Cm / dt - ## Setup command voltage time course - command = moose.PulseGen('/vClampDemo/command') - command.delay[0] = 10.0 - command.width[0] = 20.0 - command.level[0] = 50.0 - command.delay[1] = 1e9 - moose.connect(command, 'output', clamp, 'commandIn') - ## Connect the Voltage Clamp to the compartemnt - moose.connect(clamp, 'currentOut', comp, 'injectMsg') - moose.connect(comp, 'VmOut', clamp, 'sensedIn') - ## setup stimulus recroding - this is the command pulse - stimtab = moose.Table('/vClampDemo/vclamp_command') - moose.connect(stimtab, 'requestOut', command, 'getOutputValue') - ## Set up Vm recording - vmtab = moose.Table('/vClampDemo/vclamp_Vm') - moose.connect(vmtab, 'requestOut', comp, 'getVm') - ## setup command potential recording - this is the filtered input - ## to PID controller - commandtab = moose.Table('/vClampDemo/vclamp_filteredcommand') - moose.connect(commandtab, 'requestOut', clamp, 'getCommand') - ## setup current recording - Imtab = moose.Table('/vClampDemo/vclamp_inject') - moose.connect(Imtab, 'requestOut', clamp, 'getCurrent') - # Scheduling - moose.setClock(0, dt) - moose.setClock(1, dt) - moose.setClock(2, dt) - moose.setClock(3, dt) - moose.useClock(0, '%s/##[TYPE=Compartment]' % (container.path), 'init') - moose.useClock(0, '%s/##[TYPE=PulseGen]' % (container.path), 'process') - moose.useClock(1, '%s/##[TYPE=Compartment]' % (container.path), 'process') - moose.useClock(2, '%s/##[TYPE=HHChannel]' % (container.path), 'process') - moose.useClock(2, '%s/##[TYPE=VClamp]' % (container.path), 'process') - moose.useClock(3, '%s/##[TYPE=Table]' % (container.path), 'process') - moose.reinit() - print(('RC filter in VClamp:: tau:', clamp.tau)) - print(('PID controller in VClamp:: ti:', clamp.ti, 'td:', clamp.td, 'gain:', clamp.gain)) - moose.start(simtime) - print(('Finished simulation for %g seconds' % (simtime))) - tseries = linspace(0, simtime, len(vmtab.vector)) - subplot(211) - title('Membrane potential and clamp voltage') - plot(tseries, vmtab.vector, 'g-', label='Vm (mV)') - plot(tseries, commandtab.vector, 'b-', label='Filtered command (mV)') - plot(tseries, stimtab.vector, 'r-', label='Command (mV)') - xlabel('Time (ms)') - ylabel('Voltage (mV)') - legend() - # print len(commandtab.vector) - subplot(212) - title('Current through clamp circuit') - # plot(tseries, stimtab.vector, label='stimulus (uA)') - plot(tseries, Imtab.vector, label='injected current (uA)') - xlabel('Time (ms)') - ylabel('Current (uA)') - legend() - show() - -def main(): - """ - This snippet is to demonstrate modelling of voltage clamping. - """ - vclamp_demo() - -if __name__ == '__main__': - main() - -# -# vclamp.py ends here -- GitLab