diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c83ffcf7..6a8001cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,7 @@ jobs: if: ${{ matrix.runs-on == 'macos-latest' }} run: | brew install hdf5 - + - name: Build package run: | pip install .[full] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..5f83cf7e --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,15 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.1 + hooks: + - id: ruff + args: [ "--select", "I", "--fix" ] + - id: ruff-format diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..79416054 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,112 @@ +# Contributing + +Please open issues to discuss enhancements and bugs that you may encounter with +libNeuroML. Pull requests with enhancements and bug fixes are welcome. + +## Virtual environments and editable installs + +It is best to use [virtual environments](https://docs.python.org/3/tutorial/venv.html) when developing Python packages. +This ensures that one uses a clean environment that includes the necessary +dependencies and does not affect the overall system installation. + +For quick development, consider using [editable installs](https://setuptools.pypa.io/en/latest/userguide/development_mode.html). +The dependencies are broken down in the `setup.cfg` file. To get a complete development environment, one can run: + + + pip install -e .[dev] # an editable install with all development dependecies installed + + +## Code style + +1. The source code uses spaces, and each tab is equivalent to 4 spaces. + +2. We use the [reStructuredText (reST) + format](https://stackoverflow.com/a/24385103/375067) for Python docstrings. + Please document your code when opening pull requests. + All methods/functions/modules *must* include docstrings that explain the parameters. + +3. We use [ruff](https://pypi.org/project/ruff/) to format and lint our code. (See the section on pre-commit below.) + +4. Please use [type hints](https://docs.python.org/3/library/typing.html) wherever applicable. + You can set up type checkers such as [mypy](https://mypy.readthedocs.io/) to use type hints in your development environment/IDE. + + + pip install mypy + + +### Pre-commit + +A number of [pre-commit](https://pre-commit.com/) hooks are used to improve code-quality. +Please run the following code to set up the pre-commit hooks: + + $ pre-commit install + +The hooks will be run at each `git commit`. +Please see `.pre-commit-config.yaml` for information on what hooks we run. + + +### Commit messages + +Writing good commit messages makes things easy to follow. +Please see these posts: + +- [How to write a Git commit message](https://cbea.ms/git-commit/) +- While not compulsory, we prefer [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) + + +## Tests + +Bug fixes and new features should include unit tests to test for correctness. +One can base new tests off the current ones included in the `tests/` directory. +To see how tests are run, please see the [GitHub Actions configuration file](https://github.com/NeuralEnsemble/libNeuroML/blob/development/.github/workflows/ci.yml). + +We use [pytest](https://docs.pytest.org/) for unit testing. +One can run it from the root of the repository: + + pytest + + +To run specific tests, one can use the `-k` flag: + + + pytest -k "..." + + +## Pull Request Process + +1. Please contribute pull requests against the `development` branch. +2. Please ensure that the automated build for your pull request passes. +3. Please write good commit messages (see the section above). + +### Updating your pull request branch + +Over time, as pull requests are reviewed, the `development` branch continues to move on with other changes. +Sometimes, it can be useful/necessary to pull in these changes to the pull request branch, using the following steps. + +Add the upstream libNeuroML repository as a remote: + + + git remote add upstream https://github.com/NeuralEnsemble/libNeuroML.git + + +Update your local copy of the `development` branch, and the remote copy in your fork: + + + git checkout development + git pull upstream development + git push + + +Pull in changes from development to your branch: + + + git checkout + git merge development + + +If there are merge conflicts, you will need to [resolve these](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging#_basic_merge_conflicts), since merging the feature branch in the pull request will also result in these. +After any merge conflicts have been resolved (or if there aren't any), you can +push your branch to your fork to update the pull request: + + + git push diff --git a/doc/conf.py b/doc/conf.py index 2c7646ee..2599834c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -11,8 +11,8 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys import os +import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the diff --git a/doc/devdocs/index.rst b/doc/devdocs/index.rst index 7d373357..9185ecb4 100644 --- a/doc/devdocs/index.rst +++ b/doc/devdocs/index.rst @@ -9,4 +9,3 @@ Contributing implementation_of_bindings meeting_june_2012 nodes_segments_sections - diff --git a/doc/devdocs/meeting_june_2012.rst b/doc/devdocs/meeting_june_2012.rst index b00aacc3..9dd1366d 100644 --- a/doc/devdocs/meeting_june_2012.rst +++ b/doc/devdocs/meeting_june_2012.rst @@ -109,7 +109,7 @@ Mike V was asked to add a clone method to a morphology. It was decided that fraction_along should be a property of segment. The syntax for segment groups should be as follows: -group=morph.segment_groups['axon_group'] +group=morph.segment_groups['axon_group'] (in connect merge groups should be false by default - throw an exception, tell the user setting merge_groups = True or rename group will fix this) This was a subject of great debate and has not been completely settled. diff --git a/doc/devdocs/nodes_segments_sections.rst b/doc/devdocs/nodes_segments_sections.rst index 5ead32d6..27909e1c 100644 --- a/doc/devdocs/nodes_segments_sections.rst +++ b/doc/devdocs/nodes_segments_sections.rst @@ -58,7 +58,7 @@ unbranched segmentGroups, which can be used as the basis for sections in any par in them, or be ignored by any other application. In libNeuroML, a section-like concept can be added at API level, to facilitate building cells, to facilitate import/export -to/from simulators supporting this concept, and to serve as a basis for recompartmentalisation of cells. +to/from simulators supporting this concept, and to serve as a basis for recompartmentalisation of cells. @@ -96,7 +96,7 @@ to the **parent** element, i.e. This is not possible in a node based format, but represents a logically consistent description of what the modeller -wants. +wants. What to do? @@ -108,4 +108,4 @@ enforce "best practice"? PG: I'd argue for the first approach, as it retains as much as possible of what the original reconstructor/simulator specified. An API which enforces a policy when it encounters a non optimal morphology (e.g. moving all dendrites to connection points, inserting new nodes) will alter the original data in perhaps unintended ways, and that information will be lost by subsequent readers. -It should be up to each parsing application to decide what to do with the extra information when it reads in a file. \ No newline at end of file +It should be up to each parsing application to decide what to do with the extra information when it reads in a file. diff --git a/doc/helpers/nml-core-docs.py b/doc/helpers/nml-core-docs.py index 43b39b1c..71dfc58c 100644 --- a/doc/helpers/nml-core-docs.py +++ b/doc/helpers/nml-core-docs.py @@ -7,7 +7,6 @@ Copyright 2023 NeuroML authors """ - import textwrap print("Generating list of nml classes") diff --git a/doc/refs.bib b/doc/refs.bib index 0eba5e03..d6e55e0b 100644 --- a/doc/refs.bib +++ b/doc/refs.bib @@ -20,4 +20,3 @@ @Article{Vella2014 timestamp = {2019-02-20}, year = {2014}, } - diff --git a/doc/userdocs/api.rst b/doc/userdocs/api.rst index aa2f6688..08cb1aaa 100644 --- a/doc/userdocs/api.rst +++ b/doc/userdocs/api.rst @@ -12,5 +12,3 @@ You can find information on these in the pages below. writers utils arraymorph - - diff --git a/doc/userdocs/arraymorph.rst b/doc/userdocs/arraymorph.rst index 243300eb..a6d656d2 100644 --- a/doc/userdocs/arraymorph.rst +++ b/doc/userdocs/arraymorph.rst @@ -6,5 +6,3 @@ :members: :undoc-members: :show-inheritance: - - diff --git a/doc/userdocs/coreclasses_list.txt b/doc/userdocs/coreclasses_list.txt index 8cf70be2..af542cfa 100644 --- a/doc/userdocs/coreclasses_list.txt +++ b/doc/userdocs/coreclasses_list.txt @@ -2216,5 +2216,3 @@ basePyNNIaFCondCell :undoc-members: :show-inheritance: :inherited-members: - - diff --git a/doc/userdocs/examples.rst b/doc/userdocs/examples.rst index 5899adff..e200b1a4 100644 --- a/doc/userdocs/examples.rst +++ b/doc/userdocs/examples.rst @@ -2,7 +2,7 @@ Examples ======== -The examples in this section are intended to give in depth overviews of how to accomplish +The examples in this section are intended to give in depth overviews of how to accomplish specific tasks with libNeuroML. These examples are located in the neuroml/examples directory and can @@ -19,7 +19,7 @@ Loading and modifying a file ---------------------------- .. literalinclude:: ../../neuroml/examples/loading_modifying_writing.py - + Building a network ------------------ @@ -30,7 +30,7 @@ Building a 3D network --------------------- .. literalinclude:: ../../neuroml/examples/build_3D_network.py - + Ion channels ------------ diff --git a/doc/userdocs/index.rst b/doc/userdocs/index.rst index f12f4592..cda9df87 100644 --- a/doc/userdocs/index.rst +++ b/doc/userdocs/index.rst @@ -9,4 +9,3 @@ User guide api examples bibliography - diff --git a/doc/userdocs/install.rst b/doc/userdocs/install.rst index a9c14cb4..7490631e 100644 --- a/doc/userdocs/install.rst +++ b/doc/userdocs/install.rst @@ -97,7 +97,7 @@ If all tests passed correctly, your output should look something like this: ....... ---------------------------------------------------------------------- Ran 55 tests in 40.1s - + OK You can also use PyTest to run tests. diff --git a/doc/userdocs/loaders.rst b/doc/userdocs/loaders.rst index e61a3dfd..4c16bdbd 100644 --- a/doc/userdocs/loaders.rst +++ b/doc/userdocs/loaders.rst @@ -5,5 +5,3 @@ :members: :undoc-members: :show-inheritance: - - diff --git a/doc/userdocs/writers.rst b/doc/userdocs/writers.rst index 723e1457..4aef4d5d 100644 --- a/doc/userdocs/writers.rst +++ b/doc/userdocs/writers.rst @@ -5,4 +5,3 @@ :members: :undoc-members: :show-inheritance: - diff --git a/neuroml/__init__.py b/neuroml/__init__.py index 1b742460..b4e140b2 100644 --- a/neuroml/__init__.py +++ b/neuroml/__init__.py @@ -1,7 +1,18 @@ -from .nml.nml import * # allows importation of all neuroml classes +import logging + +from . import build_time_validation from .__version__ import __version__ as __version__ from .__version__ import __version_info__ as __version__info__ from .__version__ import current_neuroml_version as current_neuroml_version +from .nml.nml import * # allows importation of all neuroml classes + +logging.basicConfig( + format="libNeuroML >>> %(levelname)s - %(message)s", + level=logging.WARN, +) + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) def print_(text, verbose=True): @@ -10,3 +21,45 @@ def print_(text, verbose=True): # if not isinstance(text, str): text = text.decode('ascii') if verbose: print("%s%s" % (prefix, text.replace("\n", "\n" + prefix))) + + +def disable_build_time_validation(): + """Disable build time validation. + + This will disable the validation of components when they are being created + using the factory functions, such as component_factory, and add. + + This is useful for certain cases where a new component cannot necessarily + be created in a valid state from the beginning. For example, a population + is usually created after a network, but a network without a population + would not be valid. + + This switch provides a convenient way to disable this check. + + Please note that this should only be used sparingly, and not abused to turn + off build time validation completely. + + .. versionadded:: 0.6.0 + """ + build_time_validation.ENABLED = False + logger.warning("Build time validation has been disabled.") + + +def enable_build_time_validation(): + """Enable build time validation + + .. versionadded:: 0.6.0 + """ + build_time_validation.ENABLED = True + logger.info("Build time validation has been enabled.") + + +def get_build_time_validation() -> bool: + """Get build time validation + + .. versionadded:: 0.6.0 + + :returns: state of build time validation + :rtype: bool + """ + return build_time_validation.ENABLED diff --git a/neuroml/__version__.py b/neuroml/__version__.py index 9c8bd64e..b22c62ba 100644 --- a/neuroml/__version__.py +++ b/neuroml/__version__.py @@ -6,7 +6,6 @@ Copyright 2023 NeuroML contributors """ - try: import importlib.metadata @@ -19,4 +18,4 @@ __version_info__: tuple = tuple(int(i) for i in __version__.split(".")) -current_neuroml_version: str = "v2.3" +current_neuroml_version: str = "v2.3.1" diff --git a/neuroml/arraymorph.py b/neuroml/arraymorph.py index 82dcadc9..31c64a13 100644 --- a/neuroml/arraymorph.py +++ b/neuroml/arraymorph.py @@ -3,6 +3,7 @@ """ import numpy as np + import neuroml diff --git a/neuroml/arraymorph_load_time_benchmark.py b/neuroml/arraymorph_load_time_benchmark.py index c8f36185..6319c79e 100644 --- a/neuroml/arraymorph_load_time_benchmark.py +++ b/neuroml/arraymorph_load_time_benchmark.py @@ -1,4 +1,5 @@ import numpy as np + import neuroml import neuroml.arraymorph as am diff --git a/neuroml/benchmarks/arraymorph_benchmarks.py b/neuroml/benchmarks/arraymorph_benchmarks.py index 3366aa2a..b2c319bb 100644 --- a/neuroml/benchmarks/arraymorph_benchmarks.py +++ b/neuroml/benchmarks/arraymorph_benchmarks.py @@ -1,15 +1,19 @@ """ Benchmarks for reading and writing arraymorphs. """ + from __future__ import print_function + +import os +import tempfile +import time + import numpy as np -from neuroml import arraymorph as am +from matplotlib import pyplot as plt + import neuroml import neuroml.writers -import tempfile -from matplotlib import pyplot as plt -import time -import os +from neuroml import arraymorph as am def timeit(method): diff --git a/neuroml/build_time_validation.py b/neuroml/build_time_validation.py new file mode 100644 index 00000000..eacb7013 --- /dev/null +++ b/neuroml/build_time_validation.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +""" +Module handling the current state of the build time validation. + +Setting ENABLED to False will disable build time validation when using the +`component_factory` and `add` functions. This setting overrides the `validate` +parameter of the two functions also. + +Disabling build time validation is useful for certain cases where a new +component cannot necessarily be created in a valid state from the beginning. +For example, a population is usually created after a network, but a network +without a population would not be valid. + +Please note that this should only be used sparingly, and not abused to turn +off build time validation completely. + +Split out into a separate module so that all the parts of the code can +access/modify it without the creation of circular dependencies. + +.. versionadded:: 0.6.0 + +File: build_time_validation.py + +Copyright 2024 NeuroML contributors +""" + +ENABLED = True diff --git a/neuroml/examples/arraymorph_generation.py b/neuroml/examples/arraymorph_generation.py index af281b6f..6476573e 100644 --- a/neuroml/examples/arraymorph_generation.py +++ b/neuroml/examples/arraymorph_generation.py @@ -1,5 +1,5 @@ """ -Example of connecting segments together to create a +Example of connecting segments together to create a multicompartmental model of a cell. In this case ArrayMorphology will be used rather than @@ -8,8 +8,8 @@ """ import neuroml -import neuroml.writers as writers import neuroml.arraymorph as am +import neuroml.writers as writers p = neuroml.Point3DWithDiam(x=0, y=0, z=0, diameter=50) d = neuroml.Point3DWithDiam(x=50, y=0, z=0, diameter=50) diff --git a/neuroml/examples/build_3D_network.py b/neuroml/examples/build_3D_network.py index 1f1e594b..7a143faa 100644 --- a/neuroml/examples/build_3D_network.py +++ b/neuroml/examples/build_3D_network.py @@ -4,23 +4,25 @@ """ -from neuroml import NeuroMLDocument -from neuroml import Network -from neuroml import ExpOneSynapse -from neuroml import Population -from neuroml import Property -from neuroml import Cell -from neuroml import Location -from neuroml import Instance -from neuroml import Morphology -from neuroml import Point3DWithDiam -from neuroml import Segment -from neuroml import SegmentParent -from neuroml import Projection -from neuroml import Connection +from random import random import neuroml.writers as writers -from random import random +from neuroml import ( + Cell, + Connection, + ExpOneSynapse, + Instance, + Location, + Morphology, + Network, + NeuroMLDocument, + Point3DWithDiam, + Population, + Projection, + Property, + Segment, + SegmentParent, +) soma_diam = 10 soma_len = 10 diff --git a/neuroml/examples/build_complete.py b/neuroml/examples/build_complete.py index 54077416..66853138 100644 --- a/neuroml/examples/build_complete.py +++ b/neuroml/examples/build_complete.py @@ -1,44 +1,43 @@ """ -Example to build an NML2 file with many (all?) NeuroML elements, particularly for +Example to build an NML2 file with many (all?) NeuroML elements, particularly for different network options """ -from neuroml import NeuroMLDocument -from neuroml import IafCell -from neuroml import IzhikevichCell -from neuroml import Network -from neuroml import ExpOneSynapse -from neuroml import ExpTwoSynapse -from neuroml import Population -from neuroml import GapJunction - -from neuroml import Input -from neuroml import InputW -from neuroml import InputList -from neuroml import ConnectionWD -from neuroml import Connection -from neuroml import Projection -from neuroml import ContinuousConnection -from neuroml import ContinuousConnectionInstance -from neuroml import ContinuousConnectionInstanceW -from neuroml import ContinuousProjection -from neuroml import SilentSynapse - -from neuroml import GradedSynapse - -from neuroml import ElectricalProjection -from neuroml import ElectricalConnection -from neuroml import ElectricalConnectionInstance -from neuroml import ElectricalConnectionInstanceW -from neuroml import Property -from neuroml import Instance -from neuroml import Location -from neuroml import PoissonFiringSynapse +import random import neuroml.writers as writers -import random +from neuroml import ( + Connection, + ConnectionWD, + ContinuousConnection, + ContinuousConnectionInstance, + ContinuousConnectionInstanceW, + ContinuousProjection, + ElectricalConnection, + ElectricalConnectionInstance, + ElectricalConnectionInstanceW, + ElectricalProjection, + ExpOneSynapse, + ExpTwoSynapse, + GapJunction, + GradedSynapse, + IafCell, + Input, + InputList, + InputW, + Instance, + IzhikevichCell, + Location, + Network, + NeuroMLDocument, + PoissonFiringSynapse, + Population, + Projection, + Property, + SilentSynapse, +) random.seed(123) diff --git a/neuroml/examples/build_network.py b/neuroml/examples/build_network.py index b1f62782..53408a1a 100644 --- a/neuroml/examples/build_network.py +++ b/neuroml/examples/build_network.py @@ -5,17 +5,19 @@ """ -from neuroml import NeuroMLDocument -from neuroml import IafCell -from neuroml import Network -from neuroml import ExpOneSynapse -from neuroml import Population -from neuroml import PulseGenerator -from neuroml import ExplicitInput -from neuroml import SynapticConnection -import neuroml.writers as writers from random import random +import neuroml.writers as writers +from neuroml import ( + ExplicitInput, + ExpOneSynapse, + IafCell, + Network, + NeuroMLDocument, + Population, + PulseGenerator, + SynapticConnection, +) nml_doc = NeuroMLDocument(id="IafNet") diff --git a/neuroml/examples/build_network2.py b/neuroml/examples/build_network2.py index e838bdd1..b8e8becf 100644 --- a/neuroml/examples/build_network2.py +++ b/neuroml/examples/build_network2.py @@ -5,27 +5,28 @@ """ -from neuroml import NeuroMLDocument -from neuroml import IafCell -from neuroml import Network -from neuroml import ExpOneSynapse -from neuroml import Population -from neuroml import GapJunction - -from neuroml import Input -from neuroml import InputList -from neuroml import ConnectionWD -from neuroml import Projection -from neuroml import ElectricalProjection -from neuroml import ElectricalConnection -from neuroml import ElectricalConnectionInstance -from neuroml import Property -from neuroml import Instance -from neuroml import Location -from neuroml import PoissonFiringSynapse +import random import neuroml.writers as writers -import random +from neuroml import ( + ConnectionWD, + ElectricalConnection, + ElectricalConnectionInstance, + ElectricalProjection, + ExpOneSynapse, + GapJunction, + IafCell, + Input, + InputList, + Instance, + Location, + Network, + NeuroMLDocument, + PoissonFiringSynapse, + Population, + Projection, + Property, +) random.seed(123) diff --git a/neuroml/examples/loading_modifying_writing_large.py b/neuroml/examples/loading_modifying_writing_large.py index f06a7830..52790bfc 100644 --- a/neuroml/examples/loading_modifying_writing_large.py +++ b/neuroml/examples/loading_modifying_writing_large.py @@ -3,13 +3,12 @@ then connected to the loadeed morphology. """ +from guppy import hpy + import neuroml import neuroml.loaders as loaders import neuroml.writers as writers - -from guppy import hpy - h = hpy() diff --git a/neuroml/examples/morphology_generation.py b/neuroml/examples/morphology_generation.py index aa2cd19c..07bb1e25 100644 --- a/neuroml/examples/morphology_generation.py +++ b/neuroml/examples/morphology_generation.py @@ -1,5 +1,5 @@ """ -Example of connecting segments together to create a +Example of connecting segments together to create a multicompartmental model of a cell. """ diff --git a/neuroml/examples/single_izhikevich_writer.py b/neuroml/examples/single_izhikevich_writer.py index e49afc99..2df627df 100644 --- a/neuroml/examples/single_izhikevich_writer.py +++ b/neuroml/examples/single_izhikevich_writer.py @@ -1,7 +1,6 @@ -from neuroml import NeuroMLDocument -from neuroml import IzhikevichCell -from neuroml.writers import NeuroMLWriter +from neuroml import IzhikevichCell, NeuroMLDocument from neuroml.utils import validate_neuroml2 +from neuroml.writers import NeuroMLWriter def write_izhikevich(filename="./tmp/SingleIzhikevich_test.nml"): diff --git a/neuroml/examples/test_files/CA1.nml b/neuroml/examples/test_files/CA1.nml index a3291a70..92bb83d3 100644 --- a/neuroml/examples/test_files/CA1.nml +++ b/neuroml/examples/test_files/CA1.nml @@ -11401,149 +11401,149 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -11553,1137 +11553,1137 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -12693,1723 +12693,1723 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -14419,119 +14419,119 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -14541,1689 +14541,1689 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -18089,9 +18089,9 @@ - + - - \ No newline at end of file + + diff --git a/neuroml/examples/test_files/Ca_pyr.channel.nml b/neuroml/examples/test_files/Ca_pyr.channel.nml index 141db360..acf2b34f 100644 --- a/neuroml/examples/test_files/Ca_pyr.channel.nml +++ b/neuroml/examples/test_files/Ca_pyr.channel.nml @@ -6,11 +6,11 @@ - + - + Traub, R. D., Wong, R. K., Miles, R., and Michelson, H. (1991). A model of a CA3 hippocampal pyramidal neuron incorporating voltage-clamp data on intrinsic conductances. Journal of neurophysiology, 66(2), 635-50. @@ -18,7 +18,7 @@ - + Ca channels @@ -39,7 +39,7 @@ - + diff --git a/neuroml/examples/test_files/EC2-609291-4.CNG.nml b/neuroml/examples/test_files/EC2-609291-4.CNG.nml index f6d4a2fb..5397f06d 100644 --- a/neuroml/examples/test_files/EC2-609291-4.CNG.nml +++ b/neuroml/examples/test_files/EC2-609291-4.CNG.nml @@ -1,10 +1,10 @@ - + @@ -17,16 +17,16 @@ - + - + - + @@ -34,4525 +34,4525 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4560,7392 +4560,7392 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -11953,2331 +11953,2331 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -14285,5595 +14285,5595 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -19881,3006 +19881,3006 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -22888,1894 +22888,1894 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -24783,18679 +24783,18679 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -43463,11834 +43463,11834 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -55298,1579 +55298,1579 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -56878,81080 +56878,81080 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/neuroml/examples/test_files/Kahp_pyr.channel.nml b/neuroml/examples/test_files/Kahp_pyr.channel.nml index 9f05401e..40f952be 100644 --- a/neuroml/examples/test_files/Kahp_pyr.channel.nml +++ b/neuroml/examples/test_files/Kahp_pyr.channel.nml @@ -6,11 +6,11 @@ - + - + Traub, R. D., Wong, R. K., Miles, R., and Michelson, H. (1991). A model of a CA3 hippocampal pyramidal neuron incorporating voltage-clamp data on intrinsic conductances. Journal of neurophysiology, 66(2), 635-50. @@ -18,7 +18,7 @@ - + K channels @@ -34,7 +34,7 @@ - + diff --git a/neuroml/examples/test_files/Kdr_bask.channel.nml b/neuroml/examples/test_files/Kdr_bask.channel.nml index 1efe5131..3908ca75 100644 --- a/neuroml/examples/test_files/Kdr_bask.channel.nml +++ b/neuroml/examples/test_files/Kdr_bask.channel.nml @@ -6,11 +6,11 @@ - + - + Traub, R. D., & Miles, R. (1991). Neuronal Networks of the Hippocampus. Cambridge University Press. @@ -18,7 +18,7 @@ - + K channels @@ -34,7 +34,7 @@ - + diff --git a/neuroml/examples/test_files/Kdr_pyr.channel.nml b/neuroml/examples/test_files/Kdr_pyr.channel.nml index 5b8b95be..e13fbdd2 100644 --- a/neuroml/examples/test_files/Kdr_pyr.channel.nml +++ b/neuroml/examples/test_files/Kdr_pyr.channel.nml @@ -6,11 +6,11 @@ - + - + Traub, R. D., Wong, R. K., Miles, R., and Michelson, H. (1991). A model of a CA3 hippocampal pyramidal neuron incorporating voltage-clamp data on intrinsic conductances. Journal of neurophysiology, 66(2), 635-50. @@ -18,7 +18,7 @@ - + K channels @@ -34,7 +34,7 @@ - + diff --git a/neuroml/examples/test_files/LEMS_TestComplete.xml b/neuroml/examples/test_files/LEMS_TestComplete.xml index 4bf26f63..efb53e19 100644 --- a/neuroml/examples/test_files/LEMS_TestComplete.xml +++ b/neuroml/examples/test_files/LEMS_TestComplete.xml @@ -42,4 +42,3 @@ - diff --git a/neuroml/examples/test_files/LeakConductance_bask.channel.nml b/neuroml/examples/test_files/LeakConductance_bask.channel.nml index e8a38c4b..8ae0f773 100644 --- a/neuroml/examples/test_files/LeakConductance_bask.channel.nml +++ b/neuroml/examples/test_files/LeakConductance_bask.channel.nml @@ -7,7 +7,7 @@ Simple example of a leak/passive conductance. Note: for GENESIS cells with a single leak conductance, it is better to use the Rm and Em variables for a passive current. - + diff --git a/neuroml/examples/test_files/LeakConductance_pyr.channel.nml b/neuroml/examples/test_files/LeakConductance_pyr.channel.nml index 2b8f6db2..1908990f 100644 --- a/neuroml/examples/test_files/LeakConductance_pyr.channel.nml +++ b/neuroml/examples/test_files/LeakConductance_pyr.channel.nml @@ -7,7 +7,7 @@ Simple example of a leak/passive conductance. Note: for GENESIS cells with a single leak conductance, it is better to use the Rm and Em variables for a passive current. - + diff --git a/neuroml/examples/test_files/MediumNet.net.nml b/neuroml/examples/test_files/MediumNet.net.nml index 640578e1..70b354c7 100644 --- a/neuroml/examples/test_files/MediumNet.net.nml +++ b/neuroml/examples/test_files/MediumNet.net.nml @@ -35,10 +35,10 @@ Network connection: SmallNet_pyr_bask contains 252 individual synaptic connectio - + - + A small scale network model with 60 cells based on Dave Beeman's Auditory Cortex model @@ -1254,4 +1254,4 @@ Network connection: SmallNet_pyr_bask contains 252 individual synaptic connectio - \ No newline at end of file + diff --git a/neuroml/examples/test_files/Na_bask.channel.nml b/neuroml/examples/test_files/Na_bask.channel.nml index cd55894c..1a317bdd 100644 --- a/neuroml/examples/test_files/Na_bask.channel.nml +++ b/neuroml/examples/test_files/Na_bask.channel.nml @@ -6,11 +6,11 @@ - + - + Traub, R. D., & Miles, R. (1991). Neuronal Networks of the Hippocampus. Cambridge University Press. @@ -18,7 +18,7 @@ - + Na channels @@ -39,7 +39,7 @@ - + diff --git a/neuroml/examples/test_files/Na_pyr.channel.nml b/neuroml/examples/test_files/Na_pyr.channel.nml index 584b6d16..c1259258 100644 --- a/neuroml/examples/test_files/Na_pyr.channel.nml +++ b/neuroml/examples/test_files/Na_pyr.channel.nml @@ -6,11 +6,11 @@ - + - + Traub, R. D., Wong, R. K., Miles, R., and Michelson, H. (1991). A model of a CA3 hippocampal pyramidal neuron incorporating voltage-clamp data on intrinsic conductances. Journal of neurophysiology, 66(2), 635-50. @@ -18,7 +18,7 @@ - + Na channels @@ -39,7 +39,7 @@ - + diff --git a/neuroml/examples/test_files/Purk2M9s.nml b/neuroml/examples/test_files/Purk2M9s.nml index 511ab43e..ecf4d680 100644 --- a/neuroml/examples/test_files/Purk2M9s.nml +++ b/neuroml/examples/test_files/Purk2M9s.nml @@ -20825,10 +20825,10 @@ - + - + diff --git a/neuroml/examples/test_files/Purk2M9s_v1x.nml1 b/neuroml/examples/test_files/Purk2M9s_v1x.nml1 index ea0517fc..cab676c5 100644 --- a/neuroml/examples/test_files/Purk2M9s_v1x.nml1 +++ b/neuroml/examples/test_files/Purk2M9s_v1x.nml1 @@ -8008,7 +8008,7 @@ - + @@ -21079,4 +21079,4 @@ - \ No newline at end of file + diff --git a/neuroml/examples/test_files/bask.cell.nml b/neuroml/examples/test_files/bask.cell.nml index b82ab581..74d0f895 100644 --- a/neuroml/examples/test_files/bask.cell.nml +++ b/neuroml/examples/test_files/bask.cell.nml @@ -26,7 +26,7 @@ @@ -34,7 +34,7 @@ @@ -55,7 +55,7 @@ - + @@ -63,13 +63,13 @@ - + - + - + - + @@ -88,5 +88,5 @@ - + diff --git a/neuroml/examples/test_files/complete.nml b/neuroml/examples/test_files/complete.nml index 1147da96..8a0de960 100644 --- a/neuroml/examples/test_files/complete.nml +++ b/neuroml/examples/test_files/complete.nml @@ -1,4 +1,4 @@ - + Lots of notes.... diff --git a/neuroml/examples/test_files/complete.nml.h5 b/neuroml/examples/test_files/complete.nml.h5 index 9294f283..0b1979fa 100644 Binary files a/neuroml/examples/test_files/complete.nml.h5 and b/neuroml/examples/test_files/complete.nml.h5 differ diff --git a/neuroml/examples/test_files/pas_nml.channel.nml b/neuroml/examples/test_files/pas_nml.channel.nml index f861bf70..2d0db17d 100644 --- a/neuroml/examples/test_files/pas_nml.channel.nml +++ b/neuroml/examples/test_files/pas_nml.channel.nml @@ -5,7 +5,7 @@ Simple example of a leak/passive conductance. - + diff --git a/neuroml/examples/test_files/pyr_4_sym.cell.nml b/neuroml/examples/test_files/pyr_4_sym.cell.nml index dda62784..381e1d92 100644 --- a/neuroml/examples/test_files/pyr_4_sym.cell.nml +++ b/neuroml/examples/test_files/pyr_4_sym.cell.nml @@ -74,7 +74,7 @@ @@ -82,7 +82,7 @@ @@ -90,7 +90,7 @@ @@ -98,7 +98,7 @@ @@ -106,7 +106,7 @@ @@ -114,7 +114,7 @@ @@ -122,7 +122,7 @@ @@ -130,7 +130,7 @@ @@ -138,7 +138,7 @@ @@ -203,7 +203,7 @@ - + @@ -211,17 +211,17 @@ - + - + - + - + - + - + @@ -242,5 +242,5 @@ - + diff --git a/neuroml/examples/test_files/sbml-example.xml b/neuroml/examples/test_files/sbml-example.xml index dae4e7fd..59792696 100644 --- a/neuroml/examples/test_files/sbml-example.xml +++ b/neuroml/examples/test_files/sbml-example.xml @@ -21,7 +21,7 @@ To cite BioModels Database, please use: Li C, Donizelli M, Rodriguez N, Dharuri H, Endler L, Chelliah V, Li L, He E, Henry A, Stefan MI, Snoep JL, Hucka M, Le Novère N, Laibe C (2010) BioModels Database: An enhanced, curated and annotated resource for published quantitative kinetic models. BMC Syst Biol., 4:92.

- + @@ -88,7 +88,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -132,7 +132,7 @@ - + @@ -146,7 +146,7 @@ - + @@ -160,7 +160,7 @@ - + @@ -176,7 +176,7 @@ - + @@ -190,7 +190,7 @@ - + @@ -204,7 +204,7 @@ - + @@ -219,7 +219,7 @@ - + @@ -233,7 +233,7 @@ - + @@ -247,7 +247,7 @@ - + @@ -261,7 +261,7 @@ - + @@ -275,7 +275,7 @@ - + @@ -289,7 +289,7 @@ - + @@ -303,7 +303,7 @@ - + @@ -317,7 +317,7 @@ - + @@ -331,7 +331,7 @@ - + @@ -347,7 +347,7 @@ - + @@ -438,7 +438,7 @@ - + @@ -460,7 +460,7 @@ - + @@ -477,7 +477,7 @@ - + Swe1 @@ -488,7 +488,7 @@ - + IEtot @@ -497,7 +497,7 @@ - + Cdh1tot @@ -506,7 +506,7 @@ - + Mih1tot @@ -515,7 +515,7 @@ - + Mcmtot @@ -524,7 +524,7 @@ - + SBFtot @@ -544,7 +544,7 @@ - + @@ -555,7 +555,7 @@ - + kdiss @@ -574,7 +574,7 @@ - + @@ -587,7 +587,7 @@ - + Trim @@ -619,7 +619,7 @@ - + @@ -633,7 +633,7 @@ - + Trim @@ -665,7 +665,7 @@ - + @@ -675,7 +675,7 @@ - + Trim @@ -694,7 +694,7 @@ - + @@ -705,7 +705,7 @@ - + kass @@ -725,7 +725,7 @@ - + @@ -735,7 +735,7 @@ - + PTrim @@ -754,7 +754,7 @@ - + @@ -765,7 +765,7 @@ - + Clb @@ -797,7 +797,7 @@ - + @@ -807,7 +807,7 @@ - + kswe @@ -826,7 +826,7 @@ - + @@ -837,7 +837,7 @@ - + @@ -870,7 +870,7 @@ - + @@ -880,7 +880,7 @@ - + kmih @@ -899,7 +899,7 @@ - + @@ -909,7 +909,7 @@ - + @@ -944,7 +944,7 @@ - + @@ -955,7 +955,7 @@ - + @@ -994,14 +994,14 @@ - + - + @@ -1028,7 +1028,7 @@ - + @@ -1038,7 +1038,7 @@ - + @@ -1066,7 +1066,7 @@ - + @@ -1076,7 +1076,7 @@ - + @@ -1103,14 +1103,14 @@ - + - + kdcdc20 @@ -1129,7 +1129,7 @@ - + @@ -1142,7 +1142,7 @@ - + @@ -1170,7 +1170,7 @@ - + @@ -1181,7 +1181,7 @@ - + @@ -1220,7 +1220,7 @@ - + @@ -1230,7 +1230,7 @@ - + @@ -1265,7 +1265,7 @@ - + @@ -1275,7 +1275,7 @@ - + khsl1 @@ -1295,7 +1295,7 @@ - + @@ -1305,7 +1305,7 @@ - + khsl1 @@ -1325,7 +1325,7 @@ - + @@ -1338,7 +1338,7 @@ - + @@ -1366,7 +1366,7 @@ - + @@ -1379,7 +1379,7 @@ - + @@ -1407,14 +1407,14 @@ - + - + kdswe_prime @@ -1433,7 +1433,7 @@ - + @@ -1443,7 +1443,7 @@ - + khsl1r @@ -1462,7 +1462,7 @@ - + @@ -1472,7 +1472,7 @@ - + khsl1r @@ -1491,7 +1491,7 @@ - + @@ -1501,7 +1501,7 @@ - + @@ -1528,7 +1528,7 @@ - + @@ -1538,7 +1538,7 @@ - + @@ -1565,7 +1565,7 @@ - + @@ -1575,7 +1575,7 @@ - + ksswe @@ -1594,14 +1594,14 @@ - + - + kssweC @@ -1616,14 +1616,14 @@ - + - + kdswe_prime @@ -1642,7 +1642,7 @@ - + @@ -1653,7 +1653,7 @@ - + kdiss @@ -1672,7 +1672,7 @@ - + @@ -1686,7 +1686,7 @@ - + PTrim @@ -1718,7 +1718,7 @@ - + @@ -1732,7 +1732,7 @@ - + PTrim @@ -1764,7 +1764,7 @@ - + @@ -1775,7 +1775,7 @@ - + kass @@ -1795,14 +1795,14 @@ - + - + @@ -1829,7 +1829,7 @@ - + @@ -1839,7 +1839,7 @@ - + @@ -1867,14 +1867,14 @@ - + - + @@ -1901,7 +1901,7 @@ - + @@ -1911,7 +1911,7 @@ - + @@ -1939,14 +1939,14 @@ - + - + kdbud @@ -1963,7 +1963,7 @@ - + ksbud @@ -1982,7 +1982,7 @@ - + @@ -1993,7 +1993,7 @@ - + Sic @@ -2025,14 +2025,14 @@ - + - + kssic @@ -2047,14 +2047,14 @@ - + - + kdcln @@ -2073,7 +2073,7 @@ - + @@ -2083,7 +2083,7 @@ - + kscln @@ -2102,14 +2102,14 @@ - + - + kdswe_prime @@ -2128,14 +2128,14 @@ - + - + kdcdc20 @@ -2154,7 +2154,7 @@ - + @@ -2164,7 +2164,7 @@ - + kscdc20_prime @@ -2207,14 +2207,14 @@ - + - + kdswe_doubleprime @@ -2233,7 +2233,7 @@ - + @@ -2244,7 +2244,7 @@ - + PClb @@ -2276,14 +2276,14 @@ - + - + mu @@ -2296,7 +2296,7 @@ - + Clb @@ -2306,7 +2306,7 @@ - + 1 @@ -2314,7 +2314,7 @@ - + @@ -2332,12 +2332,12 @@ - + 0 - + 0.5 @@ -2349,7 +2349,7 @@ - + @@ -2367,7 +2367,7 @@ - + 1 @@ -2375,7 +2375,7 @@ - + @@ -2393,7 +2393,7 @@ - + 0 @@ -2401,4 +2401,4 @@ - \ No newline at end of file + diff --git a/neuroml/examples/test_files/testh5.nml b/neuroml/examples/test_files/testh5.nml index 92c78aad..d557efb5 100644 --- a/neuroml/examples/test_files/testh5.nml +++ b/neuroml/examples/test_files/testh5.nml @@ -1,4 +1,4 @@ - + Root notes diff --git a/neuroml/examples/write_pynn.py b/neuroml/examples/write_pynn.py index 00ee9224..1223c316 100644 --- a/neuroml/examples/write_pynn.py +++ b/neuroml/examples/write_pynn.py @@ -4,11 +4,11 @@ """ -from neuroml import NeuroMLDocument -from neuroml import * -import neuroml.writers as writers from random import random +import neuroml.writers as writers +from neuroml import * +from neuroml import NeuroMLDocument ######################## Build the network #################################### diff --git a/neuroml/examples/write_syns.py b/neuroml/examples/write_syns.py index af806476..db6cc372 100644 --- a/neuroml/examples/write_syns.py +++ b/neuroml/examples/write_syns.py @@ -4,11 +4,11 @@ """ -from neuroml import NeuroMLDocument -from neuroml import * -import neuroml.writers as writers from random import random +import neuroml.writers as writers +from neuroml import * +from neuroml import NeuroMLDocument nml_doc = NeuroMLDocument(id="SomeSynapses") diff --git a/neuroml/hdf5/NetworkBuilder.py b/neuroml/hdf5/NetworkBuilder.py index 7a4941e9..a3db5a5a 100644 --- a/neuroml/hdf5/NetworkBuilder.py +++ b/neuroml/hdf5/NetworkBuilder.py @@ -10,14 +10,13 @@ # # -import sys import logging +import sys sys.path.append("../NeuroMLUtils") -from neuroml.hdf5.DefaultNetworkHandler import DefaultNetworkHandler - import neuroml +from neuroml.hdf5.DefaultNetworkHandler import DefaultNetworkHandler class NetworkBuilder(DefaultNetworkHandler): diff --git a/neuroml/hdf5/NetworkContainer.py b/neuroml/hdf5/NetworkContainer.py index 353a9653..19ebef38 100644 --- a/neuroml/hdf5/NetworkContainer.py +++ b/neuroml/hdf5/NetworkContainer.py @@ -3,9 +3,10 @@ """ -import neuroml import numpy as np +import neuroml + class NetworkContainer(neuroml.Network): pass diff --git a/neuroml/hdf5/NeuroMLHdf5Parser.py b/neuroml/hdf5/NeuroMLHdf5Parser.py index a2f57c8f..559131f8 100644 --- a/neuroml/hdf5/NeuroMLHdf5Parser.py +++ b/neuroml/hdf5/NeuroMLHdf5Parser.py @@ -14,28 +14,28 @@ # # +import inspect import logging +import os.path import sys -import inspect -import tables # pytables for HDF5 support import numpy as np +import tables # pytables for HDF5 support import neuroml - from neuroml.hdf5 import get_str_attribute_group -from neuroml.hdf5.NetworkContainer import NetworkContainer -from neuroml.hdf5.NetworkContainer import PopulationContainer -from neuroml.hdf5.NetworkContainer import InstanceList -from neuroml.hdf5.NetworkContainer import ProjectionContainer -from neuroml.hdf5.NetworkContainer import ElectricalProjectionContainer -from neuroml.hdf5.NetworkContainer import ConnectionList -from neuroml.hdf5.NetworkContainer import InputListContainer -from neuroml.hdf5.NetworkContainer import InputsList - +from neuroml.hdf5.NetworkContainer import ( + ConnectionList, + ElectricalProjectionContainer, + InputListContainer, + InputsList, + InstanceList, + NetworkContainer, + PopulationContainer, + ProjectionContainer, +) from neuroml.loaders import read_neuroml2_string from neuroml.utils import add_all_to_document -import os.path class NeuroMLHdf5Parser: diff --git a/neuroml/hdf5/NeuroMLXMLParser.py b/neuroml/hdf5/NeuroMLXMLParser.py index fe1682bc..bbaab2a8 100644 --- a/neuroml/hdf5/NeuroMLXMLParser.py +++ b/neuroml/hdf5/NeuroMLXMLParser.py @@ -11,8 +11,8 @@ # # -import logging import inspect +import logging class NeuroMLXMLParser: @@ -27,8 +27,9 @@ class NeuroMLXMLParser: currentProjectionPostPop = "" currentSynapse = "" - def __init__(self, netHandler): + def __init__(self, netHandler, fix_external_morphs_biophys=True): self.netHandler = netHandler + self.fix_external_morphs_biophys = fix_external_morphs_biophys # For continued use with old API if not hasattr(self.netHandler, "handle_network") or hasattr( @@ -91,6 +92,10 @@ def parse(self, filename): self.nml_doc = loaders.read_neuroml2_file( filename, include_includes=True, already_included=[] ) + if self.fix_external_morphs_biophys: + from neuroml.utils import fix_external_morphs_biophys_in_cell + + fix_external_morphs_biophys_in_cell(self.nml_doc) print("Loaded: %s as NeuroMLDocument" % filename) @@ -474,7 +479,12 @@ def parse(self, filename): if __name__ == "__main__": - file_name = "../examples/tmp/testh5.nml" + file_name = "../examples/tmp/testnet.nml" + + import sys + + if len(sys.argv) == 2: + file_name = sys.argv[1] logging.basicConfig( level=logging.INFO, format="%(name)-19s %(levelname)-5s - %(message)s" @@ -503,6 +513,10 @@ def parse(self, filename): nml_doc = nmlHandler.get_nml_doc() print(nml_doc.summary()) + print(nml_doc.cells) + + for cell in nml_doc.cells: + print("--- Cell: %s" % cell) nml_file = "../examples/tmp/testh5_2_.nml" import neuroml.writers as writers diff --git a/neuroml/nml/NeuroML_v2.3.1.xsd b/neuroml/nml/NeuroML_v2.3.1.xsd new file mode 100644 index 00000000..741f1e88 --- /dev/null +++ b/neuroml/nml/NeuroML_v2.3.1.xsd @@ -0,0 +1,3963 @@ + + + + + + + + An id attribute for elements which need to be identified uniquely (normally just within their parent element). + + + + + + + + A value for a physical quantity in NeuroML 2, e.g. 20, -60.0mV or 5nA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An id string for pointing to an entry in an annotation element related to a MIRIAM resource. Based on metaid of SBML + + + + + + + + An id string for pointing to an entry in the NeuroLex ontology. Use of this attribute is a shorthand for a full + RDF based reference to the MIRIAM Resource urn:miriam:neurolex, with an bqbiol:is qualifier + + + + + + + + + A path referring to another component. + + + + + + + + + An attribute useful as id of segments, connections, etc: integer >=0 only! + + + + + + + + + + + Integer >=1 only! + + + + + + + + + + + Double >0 only + + + + + + + + Value which is either 0 or 1 + + + + + + + + + + + + + Textual human readable notes related to the element in question. It's useful to put these into + the NeuroML files instead of XML comments, as the notes can be extracted and repeated in the files to which the NeuroML is mapped. + + + + + + + A property ( a **tag** and **value** pair ), which can be on any **baseStandalone** either as a direct child, or within an **Annotation** . Generally something which helps the visual display or facilitates simulation of a Component, but is not a core physiological property. Common examples include: **numberInternalDivisions,** equivalent of nseg in NEURON; **radius,** for a radius to use in graphical displays for abstract cells ( i. e. without defined morphologies ); **color,** the color to use for a **Population** or **populationList** of cells; **recommended_dt_ms,** the recommended timestep to use for simulating a **Network** , **recommended_duration_ms** the recommended duration to use when running a **Network** + + + + + + + + + + + + A structured annotation containing metadata, specifically RDF or **property** elements + + + + + + + + + + + + + + Contains an extension to NeuroML by creating custom LEMS ComponentType. + + + + + + + + + + + + + + + + + + LEMS ComponentType for Constant. + + + + + + + + + + + + + LEMS Exposure (ComponentType property) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LEMS DerivedParamter element + + + + + + + + + + + + + + + + + + + + + + + + + + + + LEMS ComponentType for Dynamics + + + + + + + + + + + + + + + LEMS ComponentType for DerivedVariable + + + + + + + + + + + + + + + + + + + LEMS ComponentType for ConditionalDerivedVariable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Float value restricted to between 1 and 0 + + + + + + + + + + + + The root NeuroML element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various types of cells which are defined in NeuroML 2. This list will be expanded... + + + + + + + + + + + + + + + + + + + + + Various types of cells which are defined in NeuroML 2 based on PyNN standard cell models. + + + + + + + + + + + + + + Various types of synapse which are defined in NeuroML 2. This list will be expanded... + + + + + + + + + + + + + + + + + + Various types of synapse which are defined in NeuroML 2 based on PyNN standard cell/synapse models. + + + + + + + + + + + Various types of inputs which are defined in NeuroML2. This list will be expanded... + + + + + + + + + + + + + + + + + + + + + + + + + Various types of input which are defined in NeuroML 2 based on PyNN standard cell/synapse models. + + + + + + + + Various types of concentration model which are defined in NeuroML 2. This list will be expanded... + + + + + + + + + + + + + + + + + + + + + + A kinetic scheme based ion channel with multiple **gateKS** s, each of which consists of multiple **KSState** s and **KSTransition** s giving the rates of transition between them +\n +:param conductance: +:type conductance: conductance + + + + + + + + + + + + + + + + + Note **ionChannel** and **ionChannelHH** are currently functionally identical. This is needed since many existing examples use ionChannel, some use ionChannelHH. NeuroML v2beta4 should remove one of these, probably ionChannelHH. +\n +:param conductance: +:type conductance: conductance + + + + + + + + + + + + + + + + + + + + + + + + Note **ionChannel** and **ionChannelHH** are currently functionally identical. This is needed since many existing examples use ionChannel, some use ionChannelHH. NeuroML v2beta4 should remove one of these, probably ionChannelHH. +\n +:param conductance: +:type conductance: conductance + + + + + + + + + + Same as **ionChannel** , but with a **vShift** parameter to change voltage activation of gates. The exact usage of **vShift** in expressions for rates is determined by the individual gates. +\n +:param vShift: +:type vShift: voltage +:param conductance: +:type conductance: conductance + + + + + + + + + + + + + + + + + + + A value for the conductance scaling which varies as a standard function of the difference between the current temperature, **temperature,** and the temperature at which the conductance was originally determined, **experimentalTemp** +\n +:param q10Factor: +:type q10Factor: none +:param experimentalTemp: +:type experimentalTemp: temperature + + + + + + + + + + + + + + + + + + + + + + + + + A **KSState** with **relativeConductance** of 0 +\n +:param relativeConductance: +:type relativeConductance: none + + + + + + + + + + + + A **KSState** with **relativeConductance** of 1 +\n +:param relativeConductance: +:type relativeConductance: none + + + + + + + + + + + + A forward only **KSTransition** for a **gateKS** which specifies a **rate** ( type **baseHHRate** ) which follows one of the standard Hodgkin Huxley forms ( e. g. **HHExpRate** , **HHSigmoidRate** , **HHExpLinearRate** + + + + + + + + + + + + + + + + A reverse only **KSTransition** for a **gateKS** which specifies a **rate** ( type **baseHHRate** ) which follows one of the standard Hodgkin Huxley forms ( e. g. **HHExpRate** , **HHSigmoidRate** , **HHExpLinearRate** + + + + + + + + + + + + + + + + + + + + + + KS Transition specified in terms of time constant **tau** and steady state **inf** + + + + + + + + + + + + + + + + A gate which consists of multiple **KSState** s and **KSTransition** s giving the rates of transition between them +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + + + + Note all sub elements for gateHHrates, gateHHratesTau, gateFractional etc. allowed here. Which are valid should be constrained by what type is set + + + + + + + + + + + + + + + + + + + + + Gate which follows the general Hodgkin Huxley formalism +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + Gate which follows the general Hodgkin Huxley formalism +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + Gate which follows the general Hodgkin Huxley formalism +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + + + Gate which follows the general Hodgkin Huxley formalism +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + + Gate which follows the general Hodgkin Huxley formalism +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + + Gate which follows the general Hodgkin Huxley formalism but is instantaneous, so tau = 0 and gate follows exactly inf value +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + Gate composed of subgates contributing with fractional conductance +\n +:param instances: +:type instances: none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Model of an intracellular buffering mechanism for **ion** ( currently hard Coded to be calcium, due to requirement for **iCa** ) which has a baseline level **restingConc** and tends to this value with time course **decayConstant.** The ion is assumed to occupy a shell inside the membrane of thickness **shellThickness.** +\n +:param restingConc: +:type restingConc: concentration +:param decayConstant: +:type decayConstant: time +:param shellThickness: +:type shellThickness: length + + + + + + + + + + + + + + + + + + Model of buffering of concentration of an ion ( currently hard coded to be calcium, due to requirement for **iCa** ) which has a baseline level **restingConc** and tends to this value with time course **decayConstant.** A fixed factor **rho** is used to scale the incoming current *independently of the size of the compartment* to produce a concentration change. +\n +:param restingConc: +:type restingConc: concentration +:param decayConstant: +:type decayConstant: time +:param rho: +:type rho: rho_factor + + + + + + + + + + + + + + + + + + + + + Base type for all synapses, i. e. ComponentTypes which produce a current ( dimension current ) and change Dynamics in response to an incoming event. cno_0000009 + + + + + + + + + + + Base type for synapses with a dependence on membrane potential + + + + + + + + + + + Synapse model which produces a synaptic current. + + + + + + + + + + + Synapse model which exposes a conductance **g** in addition to producing a current. Not necessarily ohmic!! cno_0000027 +\n +:param gbase: Baseline conductance, generally the maximum conductance following a single spike +:type gbase: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + + Synapse model suited for a sum of two expTwoSynapses which exposes a conductance **g** in addition to producing a current. Not necessarily ohmic!! cno_0000027 +\n +:param gbase1: Baseline conductance 1 +:type gbase1: conductance +:param gbase2: Baseline conductance 2 +:type gbase2: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + + + Gap junction/single electrical connection +\n +:param conductance: +:type conductance: conductance + + + + + + + + + + + + Dummy synapse which emits no current. Used as presynaptic endpoint for analog synaptic connection. + + + + + + + + + + + Behaves just like a one way gap junction. +\n +:param conductance: +:type conductance: conductance + + + + + + + + + + + + Graded/analog synapse. Based on synapse in Methods of http://www. nature.com/neuro/journal/v7/n12/abs/nn1352.html +\n +:param conductance: +:type conductance: conductance +:param delta: Slope of the activation curve +:type delta: voltage +:param k: Rate constant for transmitter-receptor dissociation rate +:type k: per_time +:param Vth: The half-activation voltage of the synapse +:type Vth: voltage +:param erev: The reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + + + + + Alpha current synapse: rise time and decay time are both **tau.** +\n +:param tau: Time course for rise and decay +:type tau: time +:param ibase: Baseline current increase after receiving a spike +:type ibase: current + + + + + + + + + + + + + Ohmic synapse model where rise time and decay time are both **tau.** Max conductance reached during this time ( assuming zero conductance before ) is **gbase** * **weight.** +\n +:param tau: Time course of rise/decay +:type tau: time +:param gbase: Baseline conductance, generally the maximum conductance following a single spike +:type gbase: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + Ohmic synapse model whose conductance rises instantaneously by ( **gbase** * **weight** ) on receiving an event, and which decays exponentially to zero with time course **tauDecay** +\n +:param tauDecay: Time course of decay +:type tauDecay: time +:param gbase: Baseline conductance, generally the maximum conductance following a single spike +:type gbase: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + Ohmic synapse model whose conductance waveform on receiving an event has a rise time of **tauRise** and a decay time of **tauDecay.** Max conductance reached during this time ( assuming zero conductance before ) is **gbase** * **weight.** +\n +:param tauRise: +:type tauRise: time +:param tauDecay: +:type tauDecay: time +:param gbase: Baseline conductance, generally the maximum conductance following a single spike +:type gbase: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + + Ohmic synapse similar to expTwoSynapse but consisting of two components that can differ in decay times and max conductances but share the same rise time. +\n +:param tauRise: +:type tauRise: time +:param tauDecay1: +:type tauDecay1: time +:param tauDecay2: +:type tauDecay2: time +:param gbase1: Baseline conductance 1 +:type gbase1: conductance +:param gbase2: Baseline conductance 2 +:type gbase2: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + + + Synapse consisting of two independent synaptic mechanisms ( e. g. AMPA-R and NMDA-R ), which can be easily colocated in connections + + + + + + + + + + + + + + Biexponential synapse that allows for optional block and plasticity mechanisms, which can be expressed as child elements. +\n +:param tauRise: +:type tauRise: time +:param tauDecay: +:type tauDecay: time +:param gbase: Baseline conductance, generally the maximum conductance following a single spike +:type gbase: conductance +:param erev: Reversal potential of the synapse +:type erev: voltage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base type of any cell ( e. g. point neuron like **izhikevich2007Cell** , or a morphologically detailed **Cell** with **segment** s ) which can be used in a **population** + + + + + + + + + + + Integrate and fire cell which returns to its leak reversal potential of **leakReversal** with a time constant **tau** +\n +:param leakReversal: +:type leakReversal: voltage +:param tau: +:type tau: time +:param thresh: The membrane potential at which to emit a spiking event and reset voltage +:type thresh: voltage +:param reset: The value the membrane potential is reset to on spiking +:type reset: voltage + + + + + + + + + + + + + + + Integrate and fire cell which returns to its leak reversal potential of **leakReversal** with a time course **tau.** It has a refractory period of **refract** after spiking +\n +:param refract: +:type refract: time +:param leakReversal: +:type leakReversal: voltage +:param tau: +:type tau: time +:param thresh: The membrane potential at which to emit a spiking event and reset voltage +:type thresh: voltage +:param reset: The value the membrane potential is reset to on spiking +:type reset: voltage + + + + + + + + + + + + Integrate and fire cell with capacitance **C,** **leakConductance** and **leakReversal** +\n +:param leakConductance: +:type leakConductance: conductance +:param leakReversal: +:type leakReversal: voltage +:param thresh: +:type thresh: voltage +:param reset: +:type reset: voltage +:param C: Total capacitance of the cell membrane +:type C: capacitance + + + + + + + + + + + + + + + + Integrate and fire cell with capacitance **C,** **leakConductance,** **leakReversal** and refractory period **refract** +\n +:param refract: +:type refract: time +:param leakConductance: +:type leakConductance: conductance +:param leakReversal: +:type leakReversal: voltage +:param thresh: +:type thresh: voltage +:param reset: +:type reset: voltage +:param C: Total capacitance of the cell membrane +:type C: capacitance + + + + + + + + + + + + Cell based on the 2003 model of Izhikevich, see http://izhikevich.org/publications/spikes.htm +\n +:param v0: Initial membrane potential +:type v0: voltage +:param a: Time scale of the recovery variable U +:type a: none +:param b: Sensitivity of U to the subthreshold fluctuations of the membrane potential V +:type b: none +:param c: After-spike reset value of V +:type c: none +:param d: After-spike increase to U +:type d: none +:param thresh: Spike threshold +:type thresh: voltage + + + + + + + + + + + + + + + + + Any cell with a membrane potential **v** with voltage units and a membrane capacitance **C.** Also defines exposed value **iSyn** for current due to external synapses and **iMemb** for total transmembrane current ( usually channel currents plus **iSyn** ) +\n +:param C: Total capacitance of the cell membrane +:type C: capacitance + + + + + + + + + + + + + + + + + + Cell based on the modified Izhikevich model in Izhikevich 2007, Dynamical systems in neuroscience, MIT Press +\n +:param v0: Initial membrane potential +:type v0: voltage +:param k: +:type k: conductance_per_voltage +:param vr: Resting membrane potential +:type vr: voltage +:param vt: Spike threshold +:type vt: voltage +:param vpeak: Peak action potential value +:type vpeak: voltage +:param a: Time scale of recovery variable u +:type a: per_time +:param b: Sensitivity of recovery variable u to subthreshold fluctuations of membrane potential v +:type b: conductance +:param c: After-spike reset value of v +:type c: voltage +:param d: After-spike increase to u +:type d: current +:param C: Total capacitance of the cell membrane +:type C: capacitance + + + + + + + + + + + + + + + + + + + + Model based on Brette R and Gerstner W ( 2005 ) Adaptive Exponential Integrate-and-Fire Model as an Effective Description of Neuronal Activity. J Neurophysiol 94:3637-3642 +\n +:param gL: Leak conductance +:type gL: conductance +:param EL: Leak reversal potential +:type EL: voltage +:param VT: Spike threshold +:type VT: voltage +:param thresh: Spike detection threshold +:type thresh: voltage +:param reset: Reset potential +:type reset: voltage +:param delT: Slope factor +:type delT: voltage +:param tauw: Adaptation time constant +:type tauw: time +:param refract: Refractory period +:type refract: time +:param a: Sub-threshold adaptation variable +:type a: conductance +:param b: Spike-triggered adaptation variable +:type b: current +:param C: Total capacitance of the cell membrane +:type C: capacitance + + + + + + + + + + + + + + + + + + + + + Simple dimensionless model of spiking cell from FitzHugh and Nagumo. Superseded by **fitzHughNagumo1969Cell** ( See https://github.com/NeuroML/NeuroML2/issues/42 ) +\n +:param I: +:type I: none + + + + + + + + + + + + The Fitzhugh Nagumo model is a two-dimensional simplification of the Hodgkin-Huxley model of spike generation in squid giant axons. This system was suggested by FitzHugh ( FitzHugh R. [1961]: Impulses and physiological states in theoretical models of nerve membrane. Biophysical J. 1:445-466 ), who called it " Bonhoeffer-van der Pol model ", and the equivalent circuit by Nagumo et al. ( Nagumo J. , Arimoto S. , and Yoshizawa S. [1962] An active pulse transmission line simulating nerve axon. Proc IRE. 50:2061-2070. 1962 ). This version corresponds to the one described in FitzHugh R. [1969]: Mathematical models of excitation and propagation in nerve. Chapter 1 ( pp. 1-85 in H. P. Schwan, ed. Biological Engineering, McGraw-Hill Book Co. , N. Y. ) +\n +:param a: +:type a: none +:param b: +:type b: none +:param I: plays the role of an external injected current +:type I: none +:param phi: +:type phi: none +:param V0: +:type V0: none +:param W0: +:type W0: none + + + + + + + + + + + + + + + + + Reduced CA3 cell model from Pinsky, P. F. , Rinzel, J. Intrinsic and network rhythmogenesis in a reduced traub model for CA3 neurons. J Comput Neurosci 1, 39-60 ( 1994 ). See https://github.com/OpenSourceBrain/PinskyRinzelModel +\n +:param iSoma: +:type iSoma: currentDensity +:param iDend: +:type iDend: currentDensity +:param gLs: +:type gLs: conductanceDensity +:param gLd: +:type gLd: conductanceDensity +:param gNa: +:type gNa: conductanceDensity +:param gKdr: +:type gKdr: conductanceDensity +:param gCa: +:type gCa: conductanceDensity +:param gKahp: +:type gKahp: conductanceDensity +:param gKC: +:type gKC: conductanceDensity +:param gc: +:type gc: conductanceDensity +:param eNa: +:type eNa: voltage +:param eCa: +:type eCa: voltage +:param eK: +:type eK: voltage +:param eL: +:type eL: voltage +:param pp: +:type pp: none +:param cm: +:type cm: specificCapacitance +:param alphac: +:type alphac: none +:param betac: +:type betac: none +:param gNmda: +:type gNmda: conductanceDensity +:param gAmpa: +:type gAmpa: conductanceDensity +:param qd0: +:type qd0: none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Hindmarsh Rose model is a simplified point cell model which captures complex firing patterns of single neurons, such as periodic and chaotic bursting. It has a fast spiking subsystem, which is a generalization of the FitzHugh-Nagumo system, coupled to a slower subsystem which allows the model to fire bursts. The dynamical variables x, y, z correspond to the membrane potential, a recovery variable, and a slower adaptation current, respectively. See Hindmarsh J. L. , and Rose R. M. ( 1984 ) A model of neuronal bursting using three coupled first order differential equations. Proc. R. Soc. London, Ser. B 221:87–102. +\n +:param a: cubic term in x nullcline +:type a: none +:param b: quadratic term in x nullcline +:type b: none +:param c: constant term in y nullcline +:type c: none +:param d: quadratic term in y nullcline +:type d: none +:param r: timescale separation between slow and fast subsystem ( r greater than 0; r much less than 1 ) +:type r: none +:param s: related to adaptation +:type s: none +:param x1: related to the system's resting potential +:type x1: none +:param v_scaling: scaling of x for physiological membrane potential +:type v_scaling: voltage +:param x0: +:type x0: none +:param y0: +:type y0: none +:param z0: +:type z0: none +:param C: Total capacitance of the cell membrane +:type C: capacitance + + + + + + + + + + + + + + + + + + + + + + Cell with **segment** s specified in a **morphology** element along with details on its **biophysicalProperties** . NOTE: this can only be correctly simulated using jLEMS when there is a single segment in the cell, and **v** of this cell represents the membrane potential in that isopotential segment. + + + + + + + + + + + + + + + + + + + + + + Variant of cell with two independent Ca2+ pools. Cell with **segment** s specified in a **morphology** element along with details on its **biophysicalProperties** . NOTE: this can only be correctly simulated using jLEMS when there is a single segment in the cell, and **v** of this cell represents the membrane potential in that isopotential segment. + + + + + + + + + + + + + The collection of **segment** s which specify the 3D structure of the cell, along with a number of **segmentGroup** s + + + + + + + + + + + + + + A segment defines the smallest unit within a possibly branching structure ( **morphology** ), such as a dendrite or axon. Its **id** should be a nonnegative integer ( usually soma/root = 0 ). Its end points are given by the **proximal** and **distal** points. The **proximal** point can be omitted, usually because it is the same as a point on the **parent** segment, see **proximal** for details. **parent** specifies the parent segment. The first segment of a **cell** ( with no **parent** ) usually represents the soma. The shape is normally a cylinder ( radii of the **proximal** and **distal** equal, but positions different ) or a conical frustum ( radii and positions different ). If the x, y, x positions of the **proximal** and **distal** are equal, the segment can be interpreted as a sphere, and in this case the radii of these points must be equal. NOTE: LEMS does not yet support multicompartmental modelling, so the Dynamics here is only appropriate for single compartment modelling. + + + + + + + + + + + + + + + + + + + + + + + + + + Base type for ComponentTypes which specify an ( **x,** **y,** **z** ) coordinate along with a **diameter.** Note: no dimension used in the attributes for these coordinates! These are assumed to have dimension micrometer ( 10^-6 m ). This is due to micrometers being the default option for the majority of neuronal morphology formats, and dimensions are omitted here to facilitate reading and writing of morphologies in NeuroML. +\n +:param x: x coordinate of the point. Note: no dimension used, see description of **point3DWithDiam** for details. +:type x: none +:param y: y coordinate of the ppoint. Note: no dimension used, see description of **point3DWithDiam** for details. +:type y: none +:param z: z coordinate of the ppoint. Note: no dimension used, see description of **point3DWithDiam** for details. +:type z: none +:param diameter: Diameter of the ppoint. Note: no dimension used, see description of **point3DWithDiam** for details. +:type diameter: none + + + + + + + + + + + + + + + A method to describe a group of **segment** s in a **morphology** , e. g. soma_group, dendrite_group, axon_group. While a name is useful to describe the group, the **neuroLexId** attribute can be used to explicitly specify the meaning of the group, e. g. sao1044911821 for 'Neuronal Cell Body', sao1211023249 for 'Dendrite'. The **segment** s in this group can be specified as: a list of individual **member** segments; a **path** , all of the segments along which should be included; a **subTree** of the **cell** to include; other segmentGroups to **include** ( so all segments from those get included here ). An **inhomogeneousParameter** can be defined on the region of the cell specified by this group ( see **variableParameter** for usage ). + + + + + + + + + + + + + + + + + + + + + An inhomogeneous parameter specified across the **segmentGroup** ( see **variableParameter** for usage ). + + + + + + + + + + + + + + + + Allowed metrics for InhomogeneousParam + + + + + + + + What to do at the proximal point when creating an inhomogeneous parameter + + + + + + + + + + + What to do at the distal point when creating an inhomogeneous parameter + + + + + + + + + + + A single identified **segment** which is part of the **segmentGroup** + + + + + + + + + + + Include all members of another **segmentGroup** in this group + + + + + + + + + + + Include all the **segment** s between those specified by **from** and **to** , inclusive + + + + + + + + + + + + + + Include all the **segment** s distal to that specified by **from** in the **segmentGroup** + + + + + + + + + + + + + + + + + + + + + + + + The biophysical properties of the **cell** , including the **membraneProperties** and the **intracellularProperties** + + + + + + + + + + + + + + + The biophysical properties of the **cell** , including the **membraneProperties2CaPools** and the **intracellularProperties2CaPools** for a cell with two Ca pools + + + + + + + + + + + + + + + Properties specific to the membrane, such as the **populations** of channels, **channelDensities,** **specificCapacitance,** etc. + + + + + + + + + + + + + + + + + + + + + + + + + Variant of membraneProperties with 2 independent Ca pools + + + + + + + + + + + + + + Membrane potential at which to emit a spiking event. Note, usually the spiking event will not be emitted again until the membrane potential has fallen below this value and rises again to cross it in a positive direction +\n +:param value: +:type value: voltage + + + + + + + + + + + + + Capacitance per unit area +\n +:param value: +:type value: specificCapacitance + + + + + + + + + + + + + Explicitly set initial membrane potential for the cell +\n +:param value: +:type value: voltage + + + + + + + + + + + + + The resistivity, or specific axial resistance, of the cytoplasm +\n +:param value: +:type value: resistivity + + + + + + + + + + + + + Population of a **number** of ohmic ion channels. These each produce a conductance **channelg** across a reversal potential **erev,** giving a total current **i.** Note that active membrane currents are more frequently specified as a density over an area of the **cell** using **channelDensity** +\n +:param number: The number of channels present. This will be multiplied by the time varying conductance of the individual ion channel ( which extends **baseIonChannel** ) to produce the total conductance +:type number: none +:param erev: The reversal potential of the current produced +:type erev: voltage + + + + + + + + + + + + + + + + + + + + + + + + Specifies a time varying ohmic conductance density, which is distributed on a region of the **cell.** The conductance density of the channel is not uniform, but is set using the **variableParameter** . Note, there is no dynamical description of this in LEMS yet, as this type only makes sense for multicompartmental cells. A ComponentType for this needs to be present to enable export of NeuroML 2 multicompartmental cells via LEMS/jNeuroML to NEURON +\n +:param erev: The reversal potential of the current produced +:type erev: voltage + + + + + + + + + + + + + + + + + + + + Specifies a time varying conductance density, which is distributed on a region of the **cell,** and whose reversal potential is calculated from the Nernst equation. Hard coded for Ca only!. The conductance density of the channel is not uniform, but is set using the **variableParameter** . Note, there is no dynamical description of this in LEMS yet, as this type only makes sense for multicompartmental cells. A ComponentType for this needs to be present to enable export of NeuroML 2 multicompartmental cells via LEMS/jNeuroML to NEURON + + + + + + + + + + + + + + + + + + Specifies a time varying conductance density, which is distributed on a region of the **cell,** and whose current is calculated from the Goldman-Hodgkin-Katz equation. Hard coded for Ca only!. The conductance density of the channel is not uniform, but is set using the **variableParameter** . Note, there is no dynamical description of this in LEMS yet, as this type only makes sense for multicompartmental cells. A ComponentType for this needs to be present to enable export of NeuroML 2 multicompartmental cells via LEMS/jNeuroML to NEURON + + + + + + + + + + + + + + + + + + Specifies a time varying ohmic conductance density, **gDensity,** which is distributed on an area of the **cell** ( specified in **membraneProperties** ) with fixed reversal potential **erev** producing a current density **iDensity** +\n +:param erev: The reversal potential of the current produced +:type erev: voltage +:param condDensity: +:type condDensity: conductanceDensity + + + + + + + + + + + + + + + + + + + + + + + + Same as **channelDensity** , but with a **vShift** parameter to change voltage activation of gates. The exact usage of **vShift** in expressions for rates is determined by the individual gates. +\n +:param vShift: +:type vShift: voltage +:param erev: The reversal potential of the current produced +:type erev: voltage +:param condDensity: +:type condDensity: conductanceDensity + + + + + + + + + + + + Specifies a time varying conductance density, **gDensity,** which is distributed on an area of the **cell,** producing a current density **iDensity** and whose reversal potential is calculated from the Nernst equation. Hard coded for Ca only! See https://github.com/OpenSourceBrain/ghk-nernst. +\n +:param condDensity: +:type condDensity: conductanceDensity + + + + + + + + + + + + + + + + + + + + + + + This component is similar to the original component type **channelDensityNernst** but it is changed in order to have a reversal potential that depends on a second independent Ca++ pool ( ca2 ). See https://github.com/OpenSourceBrain/ghk-nernst. +\n +:param condDensity: +:type condDensity: conductanceDensity + + + + + + + + + + + + Specifies a time varying conductance density, **gDensity,** which is distributed on an area of the cell, producing a current density **iDensity** and whose reversal potential is calculated from the Goldman Hodgkin Katz equation. Hard coded for Ca only! See https://github.com/OpenSourceBrain/ghk-nernst. +\n +:param permeability: +:type permeability: permeability + + + + + + + + + + + + + + + + + + + + Time varying conductance density, **gDensity,** which is distributed on an area of the cell, producing a current density **iDensity.** Modified version of Jaffe et al. 1994 ( used also in Lawrence et al. 2006 ). See https://github.com/OpenSourceBrain/ghk-nernst. +\n +:param condDensity: +:type condDensity: conductanceDensity + + + + + + + + + + + + + + + + + + + + + Specifies a **parameter** ( e. g. condDensity ) which can vary its value across a **segmentGroup.** The value is calculated from **value** attribute of the **inhomogeneousValue** subelement. This element is normally a child of **channelDensityNonUniform** , **channelDensityNonUniformNernst** or **channelDensityNonUniformGHK** and is used to calculate the value of the conductance, etc. which will vary on different parts of the cell. The **segmentGroup** specified here needs to define an **inhomogeneousParameter** ( referenced from **inhomogeneousParameter** in the **inhomogeneousValue** ), which calculates a **variable** ( e. g. p ) varying across the cell ( e. g. based on the path length from soma ), which is then used in the **value** attribute of the **inhomogeneousValue** ( so for example condDensity = f( p ) ) + + + + + + + + + + + Specifies the **value** of an **inhomogeneousParameter.** For usage see **variableParameter** + + + + + + + + + + + + + Description of a chemical species identified by **ion,** which has internal, **concentration,** and external, **extConcentration** values for its concentration +\n +:param initialConcentration: +:type initialConcentration: concentration +:param initialExtConcentration: +:type initialExtConcentration: concentration + + + + + + + + + + + + + + + + + + + + + + + + + + + Biophysical properties related to the intracellular space within the **cell** , such as the **resistivity** and the list of ionic **species** present. **caConc** and **caConcExt** are explicitly exposed here to facilitate accessing these values from other Components, even though **caConcExt** is clearly not an intracellular property + + + + + + + + + + + + + + Variant of intracellularProperties with 2 independent Ca pools + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Generates a constant current pulse of a certain **amplitude** for a specified **duration** after a **delay.** Scaled by **weight,** if set +\n +:param delay: Delay before change in current. Current is zero prior to this. +:type delay: time +:param duration: Duration for holding current at amplitude. Current is zero after delay + duration. +:type duration: time +:param amplitude: Amplitude of current pulse +:type amplitude: current + + + + + + + + + + + + + + Dimensionless equivalent of **pulseGenerator** . Generates a constant current pulse of a certain **amplitude** for a specified **duration** after a **delay.** Scaled by **weight,** if set +\n +:param delay: Delay before change in current. Current is zero prior to this. +:type delay: time +:param duration: Duration for holding current at amplitude. Current is zero after delay + duration. +:type duration: time +:param amplitude: Amplitude of current pulse +:type amplitude: none + + + + + + + + + + + + + + Generates a sinusoidally varying current after a time **delay,** for a fixed **duration.** The **period** and maximum **amplitude** of the current can be set as well as the **phase** at which to start. Scaled by **weight,** if set +\n +:param phase: Phase ( between 0 and 2*pi ) at which to start the varying current ( i. e. at time given by delay ) +:type phase: none +:param delay: Delay before change in current. Current is zero prior to this. +:type delay: time +:param duration: Duration for holding current at amplitude. Current is zero after delay + duration. +:type duration: time +:param amplitude: Maximum amplitude of current +:type amplitude: current +:param period: Time period of oscillation +:type period: time + + + + + + + + + + + + + + + + Dimensionless equivalent of **sineGenerator** . Generates a sinusoidally varying current after a time **delay,** for a fixed **duration.** The **period** and maximum **amplitude** of the current can be set as well as the **phase** at which to start. Scaled by **weight,** if set +\n +:param phase: Phase ( between 0 and 2*pi ) at which to start the varying current ( i. e. at time given by delay ) +:type phase: none +:param delay: Delay before change in current. Current is zero prior to this. +:type delay: time +:param duration: Duration for holding current at amplitude. Current is zero after delay + duration. +:type duration: time +:param amplitude: Maximum amplitude of current +:type amplitude: none +:param period: Time period of oscillation +:type period: time + + + + + + + + + + + + + + + + Generates a ramping current after a time **delay,** for a fixed **duration.** During this time the current steadily changes from **startAmplitude** to **finishAmplitude.** Scaled by **weight,** if set +\n +:param delay: Delay before change in current. Current is baselineAmplitude prior to this. +:type delay: time +:param duration: Duration for holding current at amplitude. Current is baselineAmplitude after delay + duration. +:type duration: time +:param startAmplitude: Amplitude of linearly varying current at time delay +:type startAmplitude: current +:param finishAmplitude: Amplitude of linearly varying current at time delay + duration +:type finishAmplitude: current +:param baselineAmplitude: Amplitude of current before time delay, and after time delay + duration +:type baselineAmplitude: current + + + + + + + + + + + + + + + + Dimensionless equivalent of **rampGenerator** . Generates a ramping current after a time **delay,** for a fixed **duration.** During this time the dimensionless current steadily changes from **startAmplitude** to **finishAmplitude.** Scaled by **weight,** if set +\n +:param delay: Delay before change in current. Current is baselineAmplitude prior to this. +:type delay: time +:param duration: Duration for holding current at amplitude. Current is baselineAmplitude after delay + duration. +:type duration: time +:param startAmplitude: Amplitude of linearly varying current at time delay +:type startAmplitude: none +:param finishAmplitude: Amplitude of linearly varying current at time delay + duration +:type finishAmplitude: none +:param baselineAmplitude: Amplitude of current before time delay, and after time delay + duration +:type baselineAmplitude: none + + + + + + + + + + + + + + + + Generates a current which is the sum of all its child **basePointCurrent** element, e. g. can be a combination of **pulseGenerator** , **sineGenerator** elements producing a single **i.** Scaled by **weight,** if set + + + + + + + + + + + + + + + Generates a current which is the sum of all its child **basePointCurrentDL** elements, e. g. can be a combination of **pulseGeneratorDL** , **sineGeneratorDL** elements producing a single **i.** Scaled by **weight,** if set + + + + + + + + + + + + + + + Voltage clamp. Applies a variable current **i** to try to keep parent at **targetVoltage.** Not yet fully tested!!! Consider using voltageClampTriple!! +\n +:param delay: Delay before change in current. Current is zero prior to this. +:type delay: time +:param duration: Duration for attempting to keep parent at targetVoltage. Current is zero after delay + duration. +:type duration: time +:param targetVoltage: Current will be applied to try to get parent to this target voltage +:type targetVoltage: voltage +:param simpleSeriesResistance: Current will be calculated by the difference in voltage between the target and parent, divided by this value +:type simpleSeriesResistance: resistance + + + + + + + + + + + + + + + Voltage clamp with 3 clamp levels. Applies a variable current **i** ( through **simpleSeriesResistance** ) to try to keep parent cell at **conditioningVoltage** until time **delay,** **testingVoltage** until **delay** + **duration,** and **returnVoltage** afterwards. Only enabled if **active** = 1. +\n +:param active: Whether the voltage clamp is active ( 1 ) or inactive ( 0 ). +:type active: none +:param delay: Delay before switching from conditioningVoltage to testingVoltage. +:type delay: time +:param duration: Duration to hold at testingVoltage. +:type duration: time +:param conditioningVoltage: Target voltage before time delay +:type conditioningVoltage: voltage +:param testingVoltage: Target voltage between times delay and delay + duration +:type testingVoltage: voltage +:param returnVoltage: Target voltage after time duration +:type returnVoltage: voltage +:param simpleSeriesResistance: Current will be calculated by the difference in voltage between the target and parent, divided by this value +:type simpleSeriesResistance: resistance + + + + + + + + + + + + + + + + + + Emits a single spike at the specified **time** +\n +:param time: Time at which to emit one spike event +:type time: time + + + + + + + + + + + + Set of spike ComponentTypes, each emitting one spike at a certain time. Can be used to feed a predetermined spike train into a cell + + + + + + + + + + + + + Spike array connected to a single **synapse,** producing a current triggered by each **spike** in the array. + + + + + + + + + + + + + + + Simple generator of spikes at a regular interval set by **period** +\n +:param period: Time between spikes. The first spike will be emitted after this time. +:type period: time + + + + + + + + + + + + Generator of spikes with a random interspike interval of at least **minISI** and at most **maxISI** +\n +:param maxISI: Maximum interspike interval +:type maxISI: time +:param minISI: Minimum interspike interval +:type minISI: time + + + + + + + + + + + + + Generator of spikes whose ISI is distributed according to an exponential PDF with scale: 1 / **averageRate** +\n +:param averageRate: The average rate at which spikes are emitted +:type averageRate: per_time + + + + + + + + + + + + Generator of spikes whose ISI distribution is the maximum entropy distribution over [ **minimumISI,** +infinity ) with mean: 1 / **averageRate** +\n +:param minimumISI: The minimum interspike interval +:type minimumISI: time +:param averageRate: The average rate at which spikes are emitted +:type averageRate: per_time + + + + + + + + + + + + Poisson spike generator firing at **averageRate,** which is connected to single **synapse** that is triggered every time a spike is generated, producing an input current. See also **transientPoissonFiringSynapse** . +\n +:param averageRate: The average rate at which spikes are emitted +:type averageRate: per_time + + + + + + + + + + + + + + Poisson spike generator firing at **averageRate** after a **delay** and for a **duration,** connected to single **synapse** that is triggered every time a spike is generated, providing an input current. Similar to ComponentType **poissonFiringSynapse** . +\n +:param averageRate: +:type averageRate: per_time +:param delay: +:type delay: time +:param duration: +:type duration: time + + + + + + + + + + + + + + + + + + + Network containing: **population** s ( potentially of type **populationList** , and so specifying a list of cell **location** s ); **projection** s ( with lists of **connection** s ) and/or **explicitConnection** s; and **inputList** s ( with lists of **input** s ) and/or **explicitInput** s. Note: often in NeuroML this will be of type **networkWithTemperature** if there are temperature dependent elements ( e. g. ion channels ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Initial attempt to specify 3D region for placing cells. Work in progress. . . + + + + + + + + + + + + + + + A population of components, with just one parameter for the **size,** i. e. number of components to create. Note: quite often this is used with type= **populationList** which means the size is determined by the number of **instance** s ( with **location** s ) in the list. The **size** attribute is still set, and there will be a validation error if this does not match the number in the list. +\n +:param size: Number of instances of this Component to create when the population is instantiated +:type size: none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies a single instance of a component in a **population** ( placed at **location** ). + + + + + + + + + + + + + + + + + + + + Specifies the ( x, y, z ) location of a single **instance** of a component in a **population** +\n +:param x: +:type x: none +:param y: +:type y: none +:param z: +:type z: none + + + + + + + + + + + + + + + + + + + + + + + + + Explicit event connection between named components, which gets processed via a new instance of a **synapse** component which is created on the target component + + + + + + + + + + + + + + + Base for projection (set of synaptic connections) between two populations + + + + + + + + + + + Projection from one population, **presynapticPopulation** to another, **postsynapticPopulation,** through **synapse.** Contains lists of **connection** or **connectionWD** elements. + + + + + + + + + + + + + + + Base of all synaptic connections (chemical/electrical/analog, etc.) inside projections + + + + + + + + + + + Base of all synaptic connections with preCellId, postSegmentId, etc. + Note: this is not the best name for these attributes, since Id is superfluous, hence BaseConnectionNewFormat + + + + + + + + + + + + + + + Base of all synaptic connections with preCell, postSegment, etc. + See BaseConnectionOldFormat + + + + + + + + + + + + + + + Event connection directly between named components, which gets processed via a new instance of a **synapse** component which is created on the target component. Normally contained inside a **projection** element. + + + + + + + + + + Event connection between named components, which gets processed via a new instance of a synapse component which is created on the target component, includes setting of **weight** and **delay** for the synaptic connection +\n +:param weight: +:type weight: none +:param delay: +:type delay: time + + + + + + + + + + + + + A projection between **presynapticPopulation** to another **postsynapticPopulation** through gap junctions. + + + + + + + + + + + + + + + To enable connections between populations through gap junctions. + + + + + + + + + + + To enable connections between populations through gap junctions. Populations need to be of type **populationList** and contain **instance** and **location** elements. + + + + + + + + + To enable connections between populations through gap junctions. Populations need to be of type **populationList** and contain **instance** and **location** elements. Includes setting of **weight** for the connection +\n +:param weight: +:type weight: none + + + + + + + + + + + + A projection between **presynapticPopulation** and **postsynapticPopulation** through components **preComponent** at the start and **postComponent** at the end of a **continuousConnection** or **continuousConnectionInstance** . Can be used for analog synapses. + + + + + + + + + + + + + + + An instance of a connection in a **continuousProjection** between **presynapticPopulation** to another **postsynapticPopulation** through a **preComponent** at the start and **postComponent** at the end. Can be used for analog synapses. + + + + + + + + + + + + An instance of a connection in a **continuousProjection** between **presynapticPopulation** to another **postsynapticPopulation** through a **preComponent** at the start and **postComponent** at the end. Populations need to be of type **populationList** and contain **instance** and **location** elements. Can be used for analog synapses. + + + + + + + + + An instance of a connection in a **continuousProjection** between **presynapticPopulation** to another **postsynapticPopulation** through a **preComponent** at the start and **postComponent** at the end. Populations need to be of type **populationList** and contain **instance** and **location** elements. Can be used for analog synapses. Includes setting of **weight** for the connection +\n +:param weight: +:type weight: none + + + + + + + + + + + + An explicit input ( anything which extends **basePointCurrent** ) to a target cell in a population + + + + + + + + + + + + + An explicit list of **input** s to a **population.** + + + + + + + + + + + + + + + + Specifies a single input to a **target,** optionally giving the **segmentId** ( default 0 ) and **fractionAlong** the segment ( default 0. 5 ). + + + + + + + + + + + + + + Specifies input lists. Can set **weight** to scale individual inputs. +\n +:param weight: +:type weight: none + + + + + + + + + + + + + + + Base type of any PyNN standard cell model. Note: membrane potential **v** has dimensions voltage, but all other parameters are dimensionless. This is to facilitate translation to and from PyNN scripts in Python, where these parameters have implicit units, see http://neuralensemble.org/trac/PyNN/wiki/StandardModels +\n +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + + + + + + Base type of any PyNN standard integrate and fire model +\n +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + + + + + + Base type of conductance based PyNN IaF cell models +\n +:param e_rev_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_E: none +:param e_rev_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_I: none +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + + + Leaky integrate and fire model with fixed threshold and alpha-function-shaped post-synaptic current +\n +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + Leaky integrate and fire model with fixed threshold and decaying-exponential post-synaptic current +\n +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + Leaky integrate and fire model with fixed threshold and alpha-function-shaped post-synaptic conductance +\n +:param e_rev_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_E: none +:param e_rev_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_I: none +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + Leaky integrate and fire model with fixed threshold and exponentially-decaying post-synaptic conductance +\n +:param e_rev_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_E: none +:param e_rev_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_I: none +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + Adaptive exponential integrate and fire neuron according to Brette R and Gerstner W ( 2005 ) with exponentially-decaying post-synaptic conductance +\n +:param v_spike: +:type v_spike: none +:param delta_T: +:type delta_T: none +:param tau_w: +:type tau_w: none +:param a: +:type a: none +:param b: +:type b: none +:param e_rev_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_E: none +:param e_rev_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_I: none +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + + + + + + Adaptive exponential integrate and fire neuron according to Brette R and Gerstner W ( 2005 ) with alpha-function-shaped post-synaptic conductance +\n +:param v_spike: +:type v_spike: none +:param delta_T: +:type delta_T: none +:param tau_w: +:type tau_w: none +:param a: +:type a: none +:param b: +:type b: none +:param e_rev_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_E: none +:param e_rev_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type e_rev_I: none +:param tau_refrac: +:type tau_refrac: none +:param v_thresh: +:type v_thresh: none +:param tau_m: +:type tau_m: none +:param v_rest: +:type v_rest: none +:param v_reset: +:type v_reset: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + Single-compartment Hodgkin-Huxley-type neuron with transient sodium and delayed-rectifier potassium currents using the ion channel models from Traub. +\n +:param gbar_K: +:type gbar_K: none +:param gbar_Na: +:type gbar_Na: none +:param g_leak: +:type g_leak: none +:param e_rev_K: +:type e_rev_K: none +:param e_rev_Na: +:type e_rev_Na: none +:param e_rev_leak: +:type e_rev_leak: none +:param v_offset: +:type v_offset: none +:param e_rev_E: +:type e_rev_E: none +:param e_rev_I: +:type e_rev_I: none +:param cm: +:type cm: none +:param i_offset: +:type i_offset: none +:param tau_syn_E: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_E: none +:param tau_syn_I: This parameter is never used in the NeuroML2 description of this cell! Any synapse producing a current can be placed on this cell +:type tau_syn_I: none +:param v_init: +:type v_init: none + + + + + + + + + + + + + + + + + + + + Base type for all PyNN synapses. Note, the current **I** produced is dimensionless, but it requires a membrane potential **v** with dimension voltage +\n +:param tau_syn: +:type tau_syn: none + + + + + + + + + + + + Conductance based synapse with instantaneous rise and single exponential decay ( with time constant tau_syn ) +\n +:param e_rev: +:type e_rev: none +:param tau_syn: +:type tau_syn: none + + + + + + + + + + + + Alpha synapse: rise time and decay time are both tau_syn. Conductance based synapse. +\n +:param e_rev: +:type e_rev: none +:param tau_syn: +:type tau_syn: none + + + + + + + + + + + + Current based synapse with instantaneous rise and single exponential decay ( with time constant tau_syn ) +\n +:param tau_syn: +:type tau_syn: none + + + + + + + + + + + + Alpha synapse: rise time and decay time are both tau_syn. Current based synapse. +\n +:param tau_syn: +:type tau_syn: none + + + + + + + + + + + + Spike source, generating spikes according to a Poisson process. +\n +:param start: +:type start: time +:param duration: +:type duration: time +:param rate: +:type rate: per_time + + + + + + + + + + + + + + + + + + Base element without ID specified *yet*, e.g. for an element with a particular requirement on its id which does not comply with NmlId (e.g. Segment needs nonNegativeInteger). + + + + + Anything which can have a unique (within its parent) id, which must be an integer zero or greater. + + + + + + + + + + Anything which can have a unique (within its parent) id of the form NmlId (spaceless combination of letters, numbers and underscore). + + + + + + + + + + Elements which can stand alone and be referenced by id, e.g. cell, morphology. + + + + + + + + + + + + + + + + diff --git a/neuroml/nml/Purk2M9s.nml b/neuroml/nml/Purk2M9s.nml index 511ab43e..ecf4d680 100644 --- a/neuroml/nml/Purk2M9s.nml +++ b/neuroml/nml/Purk2M9s.nml @@ -20825,10 +20825,10 @@
- + - + diff --git a/neuroml/nml/README.md b/neuroml/nml/README.md index 483add3d..67f35a26 100644 --- a/neuroml/nml/README.md +++ b/neuroml/nml/README.md @@ -13,19 +13,19 @@ Please **do not** regenerate nml.py and push directly to the `master` branch bec The following packages are required. - generateds -- black +- ruff -They can be installed using the `requirements-dev.txt` file in the root directory: +They can be installed with using the dev option in the root directory: ``` -pip install -r requirements-dev.txt +pip install .[dev] ``` ### Regenerating nml.py - Run the `regenerate-nml.sh` script in the `neuroml/nml` folder. - This will use the API version defined in `neuroml/__init__.py` to find the right schema XSD file and run generateds to regenerate the `nml.py` file. -- It will also run `black` on the newly generated file to reformat it. +- It will also run `ruff` on the newly generated file to reformat it. The generateDS command that is invoked is of this form: diff --git a/neuroml/nml/annotate_nml.py b/neuroml/nml/annotate_nml.py index a1e920ac..0ae96475 100644 --- a/neuroml/nml/annotate_nml.py +++ b/neuroml/nml/annotate_nml.py @@ -13,10 +13,9 @@ Copyright 2023 NeuroML contributors """ - import inspect -from . import nml +from . import nml ignorelist = [ "GeneratedsSuper", diff --git a/neuroml/nml/gds_imports-template.py b/neuroml/nml/gds_imports-template.py index 2ff53ed8..403fac31 100644 --- a/neuroml/nml/gds_imports-template.py +++ b/neuroml/nml/gds_imports-template.py @@ -1,11 +1,12 @@ +import inspect import math +import typing from math import pi, sqrt from operator import attrgetter -import inspect + +import natsort import networkx as nx import numpy -import natsort -import typing import neuroml import neuroml.neuro_lex_ids diff --git a/neuroml/nml/generateds_config.py b/neuroml/nml/generateds_config.py index 3534e526..cd51b450 100644 --- a/neuroml/nml/generateds_config.py +++ b/neuroml/nml/generateds_config.py @@ -2,12 +2,13 @@ # The class names are essentially correct, the instance names need converting # also attributes need fixing -import lxml -from lxml import objectify -import re import csv +import re import sys + +import lxml import process_includes +from lxml import objectify # In Python 3, it's io try: @@ -16,7 +17,6 @@ from io import StringIO from config import variables - sys.setrecursionlimit(10000) diff --git a/neuroml/nml/generatedssupersuper.py b/neuroml/nml/generatedssupersuper.py index bbe3a020..dacfc20f 100644 --- a/neuroml/nml/generatedssupersuper.py +++ b/neuroml/nml/generatedssupersuper.py @@ -7,14 +7,18 @@ Copyright 2023 NeuroML contributors """ - +import logging import sys +import neuroml.build_time_validation + from .generatedscollector import GdsCollector +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) -class GeneratedsSuperSuper(object): +class GeneratedsSuperSuper(object): """Super class for GeneratedsSuper. Any bits that must go into every libNeuroML class should go here. @@ -52,7 +56,7 @@ def add(self, obj=None, hint=None, force=False, validate=True, **kwargs): self.info() return # a component type has been passed, create and add a new one - if type(obj) == type or type(obj) == str: + if type(obj) is type or isinstance(obj, str): obj = self.component_factory(obj, validate=validate, **kwargs) # getattr only returns the value of the provided member but one cannot @@ -69,9 +73,7 @@ def add(self, obj=None, hint=None, force=False, validate=True, **kwargs): # no targets found e = Exception( """A member object of {} type could not be found in NeuroML class {}.\n{} - """.format( - type(obj).__name__, type(self).__name__, self.info() - ) + """.format(type(obj).__name__, type(self).__name__, self.info()) ) raise e elif len(targets) == 1: @@ -93,8 +95,10 @@ def add(self, obj=None, hint=None, force=False, validate=True, **kwargs): self.__add(obj, t, force) break - if validate: + if neuroml.build_time_validation.ENABLED and validate: self.validate() + else: + logger.warn("Build time validation is disabled.") return obj @classmethod @@ -150,8 +154,10 @@ def component_factory(cls, component_type, validate=True, **kwargs): comp._check_arg_list(**kwargs) - if validate: + if neuroml.build_time_validation.ENABLED and validate: comp.validate() + else: + logger.warn("Build time validation is disabled.") return comp def __add(self, obj, member, force=False): @@ -475,7 +481,7 @@ def parentinfo(self, return_format="string"): if ac.startswith("_") or ac.endswith("_") or ac in excluded_classes: continue cc = getattr(module_object, ac, None) - if type(cc) == type: + if type(cc) is type: try: cc_members = cc()._get_members() for amember in cc_members: diff --git a/neuroml/nml/helper_methods.py b/neuroml/nml/helper_methods.py index a7f0bd49..37b1a94c 100644 --- a/neuroml/nml/helper_methods.py +++ b/neuroml/nml/helper_methods.py @@ -1,5 +1,5 @@ -import sys import re +import sys # @@ -1872,7 +1872,7 @@ def add_membrane_property(self, property_name, **kwargs): """ self.setup_nml_cell(use_convention=False) - prop = self.biophysical_properties.membrane_properties.add(property_name, **kwargs) + prop = self.biophysical_properties.membrane_properties.add(property_name, validate=False, **kwargs) return prop @@ -2544,9 +2544,7 @@ def get_morphology_root(self): inserts = {} -inserts[ - "Network" -] = """ +inserts["Network"] = """ netGroup = h5file.create_group(h5Group, 'network') @@ -2578,9 +2576,7 @@ def get_morphology_root(self): """ -inserts[ - "Population" -] = """ +inserts["Population"] = """ popGroup = h5file.create_group(h5Group, 'population_'+self.id) popGroup._f_setattr("id", self.id) @@ -2622,9 +2618,7 @@ def __str__(self): """ -inserts[ - "Projection" -] = """ +inserts["Projection"] = """ projGroup = h5file.create_group(h5Group, 'projection_'+self.id) projGroup._f_setattr("id", self.id) @@ -2711,9 +2705,7 @@ def __str__(self): """ -inserts[ - "ElectricalProjection" -] = """ +inserts["ElectricalProjection"] = """ projGroup = h5file.create_group(h5Group, 'projection_'+self.id) projGroup._f_setattr("id", self.id) @@ -2786,9 +2778,7 @@ def __str__(self): """ -inserts[ - "ContinuousProjection" -] = """ +inserts["ContinuousProjection"] = """ projGroup = h5file.create_group(h5Group, 'projection_'+self.id) projGroup._f_setattr("id", self.id) @@ -2867,9 +2857,7 @@ def __str__(self): """ -inserts[ - "InputList" -] = """ +inserts["InputList"] = """ ilGroup = h5file.create_group(h5Group, 'inputList_'+self.id) ilGroup._f_setattr("id", self.id) diff --git a/neuroml/nml/nml.py b/neuroml/nml/nml.py index 4c40a3bc..ed651297 100644 --- a/neuroml/nml/nml.py +++ b/neuroml/nml/nml.py @@ -2,8 +2,8 @@ # -*- coding: utf-8 -*- # -# Generated Tue Mar 5 14:34:31 2024 by generateDS.py version 2.43.3. -# Python 3.11.8 (main, Feb 7 2024, 00:00:00) [GCC 13.2.1 20231205 (Red Hat 13.2.1-6)] +# Generated Tue Jun 11 14:00:16 2024 by generateDS.py version 2.43.3. +# Python 3.10.9 (main, Jan 11 2023, 15:21:40) [GCC 11.2.0] # # Command line options: # ('-o', 'nml.py') @@ -13,10 +13,10 @@ # ('--custom-imports-template', 'gds_imports-template.py') # # Command line arguments: -# NeuroML_v2.3.xsd +# NeuroML_v2.3.1.xsd # # Command line: -# /home/asinha/.local/share/virtualenvs/neuroml-311-dev/bin/generateDS -o "nml.py" --use-getter-setter="none" --user-methods="helper_methods.py" --export="write validate" --custom-imports-template="gds_imports-template.py" NeuroML_v2.3.xsd +# /home/padraig/anaconda2/envs/py310//bin/generateDS -o "nml.py" --use-getter-setter="none" --user-methods="helper_methods.py" --export="write validate" --custom-imports-template="gds_imports-template.py" NeuroML_v2.3.1.xsd # # Current working directory (os.getcwd()): # nml @@ -28,33 +28,24 @@ ModulenotfoundExp_ = ModuleNotFoundError except NameError: ModulenotfoundExp_ = ImportError -from six.moves import zip_longest -import os -import re as re_ import base64 import datetime as datetime_ import decimal as decimal_ -from lxml import etree as etree_ - +import inspect import math - +import os +import re as re_ +import typing from math import pi, sqrt - from operator import attrgetter -import inspect - +import natsort import networkx as nx - import numpy - -import natsort - -import typing - +from lxml import etree as etree_ +from six.moves import zip_longest import neuroml - import neuroml.neuro_lex_ids Validate_simpletypes_ = True @@ -155,7 +146,6 @@ def parsexmlstring_(instring, parser=None, **kwargs): except ModulenotfoundExp_: class GdsCollector_(object): - def __init__(self, messages=None): if messages is None: self.messages = [] @@ -7040,7 +7030,6 @@ def get_fraction_along(self): return float(self.fraction_along) if self.fraction_along else 0.5 def __str__(self): - return ( "Input " + str(self.id) @@ -7431,7 +7420,6 @@ def exportHdf5(self, h5file, h5Group): array._f_setattr(k, extra_cols[k]) def __str__(self): - return ( "Input list: " + self.id @@ -7768,7 +7756,6 @@ def get_fraction_along(self): return float(self.fraction_along) if self.fraction_along else 0.5 def __str__(self): - return ( "Input " + str(self.id) @@ -7800,7 +7787,6 @@ def get_target_population( return self.target.split("/")[0] def __str__(self): - dest = self.destination if self.destination else "unspecified" return ( "Explicit Input of type " @@ -8741,7 +8727,6 @@ def _get_population(self, ref): return ref.split("/")[0] def __str__(self): - dest = self.destination if self.destination else "unspecified" return ( "Synaptic connection from " @@ -9151,14 +9136,12 @@ def _buildChildren( pass def _format(self, value): - if int(value) == value: return str(int(value)) else: return "%.4f" % value def __str__(self): - return ( "(" + self._format(self.x) @@ -9170,7 +9153,6 @@ def __str__(self): ) def __repr__(self): - return str(self) @@ -9425,7 +9407,6 @@ def _buildChildren( super(Instance, self)._buildChildren(child_, node, nodeName_, True) def __str__(self): - return ( "Instance " + str(self.id) @@ -9433,7 +9414,6 @@ def __str__(self): ) def __repr__(self): - return str(self) @@ -10877,7 +10857,6 @@ def exportHdf5(self, h5file, h5Group): popGroup._f_setattr("property:" + p.tag, p.value) if len(self.instances) > 0: - colCount = 3 a = numpy.zeros([len(self.instances), colCount], numpy.float32) @@ -10910,7 +10889,6 @@ def get_size(self): ) def __str__(self): - return ( "Population: " + str(self.id) @@ -12524,7 +12502,6 @@ def get_by_id(self, id: str) -> typing.Optional[typing.Any]: return None def __str__(self): - return ( "Network " + str(self.id) @@ -24598,10 +24575,10 @@ class MembraneProperties(BaseWithoutId): "spike_threshes", "SpikeThresh", 1, - 1, + 0, { "maxOccurs": "unbounded", - "minOccurs": "0", + "minOccurs": "1", "name": "spikeThresh", "type": "SpikeThresh", }, @@ -24611,10 +24588,10 @@ class MembraneProperties(BaseWithoutId): "specific_capacitances", "SpecificCapacitance", 1, - 1, + 0, { "maxOccurs": "unbounded", - "minOccurs": "0", + "minOccurs": "1", "name": "specificCapacitance", "type": "SpecificCapacitance", }, @@ -24624,10 +24601,10 @@ class MembraneProperties(BaseWithoutId): "init_memb_potentials", "InitMembPotential", 1, - 1, + 0, { "maxOccurs": "unbounded", - "minOccurs": "0", + "minOccurs": "1", "name": "initMembPotential", "type": "InitMembPotential", }, @@ -24648,9 +24625,9 @@ def __init__( channel_density_non_uniforms: "list of ChannelDensityNonUniform(s) (optional)" = None, channel_density_non_uniform_nernsts: "list of ChannelDensityNonUniformNernst(s) (optional)" = None, channel_density_non_uniform_ghks: "list of ChannelDensityNonUniformGHK(s) (optional)" = None, - spike_threshes: "list of SpikeThresh(s) (optional)" = None, - specific_capacitances: "list of SpecificCapacitance(s) (optional)" = None, - init_memb_potentials: "list of InitMembPotential(s) (optional)" = None, + spike_threshes: "list of SpikeThresh(s) (required)" = None, + specific_capacitances: "list of SpecificCapacitance(s) (required)" = None, + init_memb_potentials: "list of InitMembPotential(s) (required)" = None, extensiontype_=None, gds_collector_=None, **kwargs_, @@ -25097,18 +25074,18 @@ def validate_(self, gds_collector, recursive=False): max_occurs=9999999, ) self.gds_check_cardinality_( - self.spike_threshes, "spike_threshes", min_occurs=0, max_occurs=9999999 + self.spike_threshes, "spike_threshes", min_occurs=1, max_occurs=9999999 ) self.gds_check_cardinality_( self.specific_capacitances, "specific_capacitances", - min_occurs=0, + min_occurs=1, max_occurs=9999999, ) self.gds_check_cardinality_( self.init_memb_potentials, "init_memb_potentials", - min_occurs=0, + min_occurs=1, max_occurs=9999999, ) if recursive: @@ -28176,7 +28153,6 @@ def _buildChildren( super(SegmentGroup, self)._buildChildren(child_, node, nodeName_, True) def __str__(self): - return ( "SegmentGroup: " + str(self.id) @@ -28188,7 +28164,6 @@ def __str__(self): ) def __repr__(self): - return str(self) @@ -28452,7 +28427,6 @@ def _buildChildren( pass def __str__(self): - return ( "(" + str(self.x) @@ -28466,7 +28440,6 @@ def __str__(self): ) def __repr__(self): - return str(self) def distance_to(self, other_3d_point) -> float: @@ -29119,7 +29092,6 @@ def length(self): return length def __str__(self): - return ( " 0 - else ( - self.continuous_connection_instances[0].pre_component - if len(self.continuous_connection_instances) > 0 - else self.continuous_connection_instance_ws[0].pre_component - ) + else self.continuous_connection_instances[0].pre_component + if len(self.continuous_connection_instances) > 0 + else self.continuous_connection_instance_ws[0].pre_component ) projGroup._f_setattr("preComponent", pre_comp) post_comp = ( self.continuous_connections[0].post_component if len(self.continuous_connections) > 0 - else ( - self.continuous_connection_instances[0].post_component - if len(self.continuous_connection_instances) > 0 - else self.continuous_connection_instance_ws[0].post_component - ) + else self.continuous_connection_instances[0].post_component + if len(self.continuous_connection_instances) > 0 + else self.continuous_connection_instance_ws[0].post_component ) projGroup._f_setattr("postComponent", post_comp) @@ -45475,11 +45439,9 @@ def exportHdf5(self, h5file, h5Group): syn = ( self.electrical_connections[0].synapse if len(self.electrical_connections) > 0 - else ( - self.electrical_connection_instances[0].synapse - if len(self.electrical_connection_instances) > 0 - else self.electrical_connection_instance_ws[0].synapse - ) + else self.electrical_connection_instances[0].synapse + if len(self.electrical_connection_instances) > 0 + else self.electrical_connection_instance_ws[0].synapse ) projGroup._f_setattr("synapse", syn) @@ -47958,9 +47920,9 @@ def __init__( channel_density_non_uniforms: "list of ChannelDensityNonUniform(s) (optional)" = None, channel_density_non_uniform_nernsts: "list of ChannelDensityNonUniformNernst(s) (optional)" = None, channel_density_non_uniform_ghks: "list of ChannelDensityNonUniformGHK(s) (optional)" = None, - spike_threshes: "list of SpikeThresh(s) (optional)" = None, - specific_capacitances: "list of SpecificCapacitance(s) (optional)" = None, - init_memb_potentials: "list of InitMembPotential(s) (optional)" = None, + spike_threshes: "list of SpikeThresh(s) (required)" = None, + specific_capacitances: "list of SpecificCapacitance(s) (required)" = None, + init_memb_potentials: "list of InitMembPotential(s) (required)" = None, channel_density_nernst_ca2s: "list of ChannelDensityNernstCa2(s) (optional)" = None, gds_collector_=None, **kwargs_, @@ -48698,7 +48660,6 @@ def get_all_segments_in_group( if sg.id == segment_group: segment_group = sg if isinstance(segment_group, str): - if ( assume_all_means_all and segment_group == "all" ): # i.e. wasn't explicitly defined, but assume it means all segments @@ -48836,19 +48797,16 @@ def get_ordered_segments_in_groups( tot_len = 0 for seg in ord_segs[key]: - length = self.get_segment_length(seg.id) if ( not seg.parent or not seg.parent.segments in path_lengths_to_distal[key] ): - path_lengths_to_proximal[key][seg.id] = 0 last_seg = seg par_seg_element = seg.parent while par_seg_element != None: - par_seg = segments[par_seg_element.segments] par_length = self.get_segment_length(par_seg.id) @@ -48873,15 +48831,12 @@ def get_ordered_segments_in_groups( cumulative_lengths[key].append(tot_len) if include_path_lengths and not include_cumulative_lengths: - return ord_segs, path_lengths_to_proximal, path_lengths_to_distal if include_cumulative_lengths and not include_path_lengths: - return ord_segs, cumulative_lengths if include_cumulative_lengths and include_path_lengths: - return ( ord_segs, cumulative_lengths, @@ -49480,7 +49435,7 @@ def add_membrane_property(self, property_name, **kwargs): """ self.setup_nml_cell(use_convention=False) prop = self.biophysical_properties.membrane_properties.add( - property_name, **kwargs + property_name, validate=False, **kwargs ) return prop @@ -49938,7 +49893,6 @@ def get_graph(self): adlist = self.get_segment_adjacency_list() for parid, childrenids in adlist.items(): - par_length = self.get_segment_length(parid) for cid in childrenids: @@ -58435,7 +58389,6 @@ def get_post_info(self): ) def __str__(self): - return ( "Continuous Connection " + str(self.id) @@ -58780,7 +58733,6 @@ def get_post_info(self): ) def __str__(self): - return ( "Electrical Connection " + str(self.id) @@ -59126,7 +59078,6 @@ def get_post_info(self): ) def __str__(self): - return ( "Connection " + str(self.id) @@ -59137,7 +59088,6 @@ def __str__(self): ) def __str__(self): - return ( "Connection " + str(self.id) @@ -59407,7 +59357,6 @@ def get_post_info(self): ) def __str__(self): - return ( "Connection " + str(self.id) @@ -64534,7 +64483,6 @@ def _get_cell_id(self, id_string): return int(id_string.split("/")[2]) def __str__(self): - return ( "Continuous Connection (Instance based) " + str(self.id) @@ -64763,7 +64711,6 @@ def _get_cell_id(self, id_string): return int(id_string.split("/")[2]) def __str__(self): - return ( "Electrical Connection (Instance based) " + str(self.id) @@ -66879,7 +66826,6 @@ def get_weight(self): return float(self.weight) if self.weight != None else 1.0 def __str__(self): - return ( "Continuous Connection (Instance based & weight) " + str(self.id) @@ -67119,7 +67065,6 @@ def get_weight(self) -> float: return float(self.weight) if self.weight != None else 1.0 def __str__(self): - return ( "Electrical Connection (Instance based & weight) " + str(self.id) @@ -67894,243 +67839,243 @@ def main(): # simpleTypes are marked "ST" and complexTypes "CT". NamespaceToDefMappings_ = { "http://www.neuroml.org/schema/neuroml2": [ - ("NmlId", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_none", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_voltage", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_length", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_resistance", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_resistivity", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_conductance", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_conductanceDensity", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_permeability", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_time", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_pertime", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_capacitance", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_specificCapacitance", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_concentration", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_current", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_currentDensity", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_temperature", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_rhoFactor", "NeuroML_v2.3.xsd", "ST"), - ("Nml2Quantity_conductancePerVoltage", "NeuroML_v2.3.xsd", "ST"), - ("MetaId", "NeuroML_v2.3.xsd", "ST"), - ("NeuroLexId", "NeuroML_v2.3.xsd", "ST"), - ("Nml2PopulationReferencePath", "NeuroML_v2.3.xsd", "ST"), - ("NonNegativeInteger", "NeuroML_v2.3.xsd", "ST"), - ("PositiveInteger", "NeuroML_v2.3.xsd", "ST"), - ("DoubleGreaterThanZero", "NeuroML_v2.3.xsd", "ST"), - ("ZeroOrOne", "NeuroML_v2.3.xsd", "ST"), - ("Notes", "NeuroML_v2.3.xsd", "ST"), - ("TrueOrFalse", "NeuroML_v2.3.xsd", "ST"), - ("ZeroToOne", "NeuroML_v2.3.xsd", "ST"), - ("channelTypes", "NeuroML_v2.3.xsd", "ST"), - ("gateTypes", "NeuroML_v2.3.xsd", "ST"), - ("BlockTypes", "NeuroML_v2.3.xsd", "ST"), - ("PlasticityTypes", "NeuroML_v2.3.xsd", "ST"), - ("Metric", "NeuroML_v2.3.xsd", "ST"), - ("networkTypes", "NeuroML_v2.3.xsd", "ST"), - ("allowedSpaces", "NeuroML_v2.3.xsd", "ST"), - ("populationTypes", "NeuroML_v2.3.xsd", "ST"), - ("Property", "NeuroML_v2.3.xsd", "CT"), - ("Annotation", "NeuroML_v2.3.xsd", "CT"), - ("ComponentType", "NeuroML_v2.3.xsd", "CT"), - ("Constant", "NeuroML_v2.3.xsd", "CT"), - ("Exposure", "NeuroML_v2.3.xsd", "CT"), - ("NamedDimensionalType", "NeuroML_v2.3.xsd", "CT"), - ("NamedDimensionalVariable", "NeuroML_v2.3.xsd", "CT"), - ("Parameter", "NeuroML_v2.3.xsd", "CT"), - ("DerivedParameter", "NeuroML_v2.3.xsd", "CT"), - ("LEMS_Property", "NeuroML_v2.3.xsd", "CT"), - ("Requirement", "NeuroML_v2.3.xsd", "CT"), - ("InstanceRequirement", "NeuroML_v2.3.xsd", "CT"), - ("Dynamics", "NeuroML_v2.3.xsd", "CT"), - ("DerivedVariable", "NeuroML_v2.3.xsd", "CT"), - ("StateVariable", "NeuroML_v2.3.xsd", "CT"), - ("ConditionalDerivedVariable", "NeuroML_v2.3.xsd", "CT"), - ("Case", "NeuroML_v2.3.xsd", "CT"), - ("TimeDerivative", "NeuroML_v2.3.xsd", "CT"), - ("OnStart", "NeuroML_v2.3.xsd", "CT"), - ("StateAssignment", "NeuroML_v2.3.xsd", "CT"), - ("OnEvent", "NeuroML_v2.3.xsd", "CT"), - ("EventOut", "NeuroML_v2.3.xsd", "CT"), - ("OnCondition", "NeuroML_v2.3.xsd", "CT"), - ("Transition", "NeuroML_v2.3.xsd", "CT"), - ("Regime", "NeuroML_v2.3.xsd", "CT"), - ("OnEntry", "NeuroML_v2.3.xsd", "CT"), - ("NeuroMLDocument", "NeuroML_v2.3.xsd", "CT"), - ("IncludeType", "NeuroML_v2.3.xsd", "CT"), - ("IonChannelScalable", "NeuroML_v2.3.xsd", "CT"), - ("IonChannelKS", "NeuroML_v2.3.xsd", "CT"), - ("IonChannel", "NeuroML_v2.3.xsd", "CT"), - ("IonChannelHH", "NeuroML_v2.3.xsd", "CT"), - ("IonChannelVShift", "NeuroML_v2.3.xsd", "CT"), - ("Q10ConductanceScaling", "NeuroML_v2.3.xsd", "CT"), - ("ClosedState", "NeuroML_v2.3.xsd", "CT"), - ("OpenState", "NeuroML_v2.3.xsd", "CT"), - ("ForwardTransition", "NeuroML_v2.3.xsd", "CT"), - ("ReverseTransition", "NeuroML_v2.3.xsd", "CT"), - ("TauInfTransition", "NeuroML_v2.3.xsd", "CT"), - ("GateKS", "NeuroML_v2.3.xsd", "CT"), - ("GateHHUndetermined", "NeuroML_v2.3.xsd", "CT"), - ("GateHHRates", "NeuroML_v2.3.xsd", "CT"), - ("GateHHTauInf", "NeuroML_v2.3.xsd", "CT"), - ("GateHHRatesTauInf", "NeuroML_v2.3.xsd", "CT"), - ("GateHHRatesTau", "NeuroML_v2.3.xsd", "CT"), - ("GateHHRatesInf", "NeuroML_v2.3.xsd", "CT"), - ("GateHHInstantaneous", "NeuroML_v2.3.xsd", "CT"), - ("GateFractional", "NeuroML_v2.3.xsd", "CT"), - ("GateFractionalSubgate", "NeuroML_v2.3.xsd", "CT"), - ("Q10Settings", "NeuroML_v2.3.xsd", "CT"), - ("HHRate", "NeuroML_v2.3.xsd", "CT"), - ("HHVariable", "NeuroML_v2.3.xsd", "CT"), - ("HHTime", "NeuroML_v2.3.xsd", "CT"), - ("DecayingPoolConcentrationModel", "NeuroML_v2.3.xsd", "CT"), - ("FixedFactorConcentrationModel", "NeuroML_v2.3.xsd", "CT"), - ("BaseSynapse", "NeuroML_v2.3.xsd", "CT"), - ("BaseVoltageDepSynapse", "NeuroML_v2.3.xsd", "CT"), - ("BaseCurrentBasedSynapse", "NeuroML_v2.3.xsd", "CT"), - ("BaseConductanceBasedSynapse", "NeuroML_v2.3.xsd", "CT"), - ("BaseConductanceBasedSynapseTwo", "NeuroML_v2.3.xsd", "CT"), - ("GapJunction", "NeuroML_v2.3.xsd", "CT"), - ("SilentSynapse", "NeuroML_v2.3.xsd", "CT"), - ("LinearGradedSynapse", "NeuroML_v2.3.xsd", "CT"), - ("GradedSynapse", "NeuroML_v2.3.xsd", "CT"), - ("AlphaCurrentSynapse", "NeuroML_v2.3.xsd", "CT"), - ("AlphaSynapse", "NeuroML_v2.3.xsd", "CT"), - ("ExpOneSynapse", "NeuroML_v2.3.xsd", "CT"), - ("ExpTwoSynapse", "NeuroML_v2.3.xsd", "CT"), - ("ExpThreeSynapse", "NeuroML_v2.3.xsd", "CT"), - ("DoubleSynapse", "NeuroML_v2.3.xsd", "CT"), - ("BlockingPlasticSynapse", "NeuroML_v2.3.xsd", "CT"), - ("BlockMechanism", "NeuroML_v2.3.xsd", "CT"), - ("PlasticityMechanism", "NeuroML_v2.3.xsd", "CT"), - ("BaseCell", "NeuroML_v2.3.xsd", "CT"), - ("IafTauCell", "NeuroML_v2.3.xsd", "CT"), - ("IafTauRefCell", "NeuroML_v2.3.xsd", "CT"), - ("IafCell", "NeuroML_v2.3.xsd", "CT"), - ("IafRefCell", "NeuroML_v2.3.xsd", "CT"), - ("IzhikevichCell", "NeuroML_v2.3.xsd", "CT"), - ("BaseCellMembPotCap", "NeuroML_v2.3.xsd", "CT"), - ("Izhikevich2007Cell", "NeuroML_v2.3.xsd", "CT"), - ("AdExIaFCell", "NeuroML_v2.3.xsd", "CT"), - ("FitzHughNagumoCell", "NeuroML_v2.3.xsd", "CT"), - ("FitzHughNagumo1969Cell", "NeuroML_v2.3.xsd", "CT"), - ("PinskyRinzelCA3Cell", "NeuroML_v2.3.xsd", "CT"), - ("HindmarshRose1984Cell", "NeuroML_v2.3.xsd", "CT"), - ("Cell", "NeuroML_v2.3.xsd", "CT"), - ("Cell2CaPools", "NeuroML_v2.3.xsd", "CT"), - ("Morphology", "NeuroML_v2.3.xsd", "CT"), - ("Segment", "NeuroML_v2.3.xsd", "CT"), - ("SegmentParent", "NeuroML_v2.3.xsd", "CT"), - ("Point3DWithDiam", "NeuroML_v2.3.xsd", "CT"), - ("SegmentGroup", "NeuroML_v2.3.xsd", "CT"), - ("InhomogeneousParameter", "NeuroML_v2.3.xsd", "CT"), - ("ProximalDetails", "NeuroML_v2.3.xsd", "CT"), - ("DistalDetails", "NeuroML_v2.3.xsd", "CT"), - ("Member", "NeuroML_v2.3.xsd", "CT"), - ("Include", "NeuroML_v2.3.xsd", "CT"), - ("Path", "NeuroML_v2.3.xsd", "CT"), - ("SubTree", "NeuroML_v2.3.xsd", "CT"), - ("SegmentEndPoint", "NeuroML_v2.3.xsd", "CT"), - ("BiophysicalProperties", "NeuroML_v2.3.xsd", "CT"), - ("BiophysicalProperties2CaPools", "NeuroML_v2.3.xsd", "CT"), - ("MembraneProperties", "NeuroML_v2.3.xsd", "CT"), - ("MembraneProperties2CaPools", "NeuroML_v2.3.xsd", "CT"), - ("SpikeThresh", "NeuroML_v2.3.xsd", "CT"), - ("SpecificCapacitance", "NeuroML_v2.3.xsd", "CT"), - ("InitMembPotential", "NeuroML_v2.3.xsd", "CT"), - ("Resistivity", "NeuroML_v2.3.xsd", "CT"), - ("ChannelPopulation", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityNonUniform", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityNonUniformNernst", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityNonUniformGHK", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensity", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityVShift", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityNernst", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityNernstCa2", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityGHK", "NeuroML_v2.3.xsd", "CT"), - ("ChannelDensityGHK2", "NeuroML_v2.3.xsd", "CT"), - ("VariableParameter", "NeuroML_v2.3.xsd", "CT"), - ("InhomogeneousValue", "NeuroML_v2.3.xsd", "CT"), - ("Species", "NeuroML_v2.3.xsd", "CT"), - ("ConcentrationModel_D", "NeuroML_v2.3.xsd", "CT"), - ("IntracellularProperties", "NeuroML_v2.3.xsd", "CT"), - ("IntracellularProperties2CaPools", "NeuroML_v2.3.xsd", "CT"), - ("ExtracellularProperties", "NeuroML_v2.3.xsd", "CT"), - ("ExtracellularPropertiesLocal", "NeuroML_v2.3.xsd", "CT"), - ("ReactionScheme", "NeuroML_v2.3.xsd", "CT"), - ("PulseGenerator", "NeuroML_v2.3.xsd", "CT"), - ("PulseGeneratorDL", "NeuroML_v2.3.xsd", "CT"), - ("SineGenerator", "NeuroML_v2.3.xsd", "CT"), - ("SineGeneratorDL", "NeuroML_v2.3.xsd", "CT"), - ("RampGenerator", "NeuroML_v2.3.xsd", "CT"), - ("RampGeneratorDL", "NeuroML_v2.3.xsd", "CT"), - ("CompoundInput", "NeuroML_v2.3.xsd", "CT"), - ("CompoundInputDL", "NeuroML_v2.3.xsd", "CT"), - ("VoltageClamp", "NeuroML_v2.3.xsd", "CT"), - ("VoltageClampTriple", "NeuroML_v2.3.xsd", "CT"), - ("Spike", "NeuroML_v2.3.xsd", "CT"), - ("SpikeArray", "NeuroML_v2.3.xsd", "CT"), - ("TimedSynapticInput", "NeuroML_v2.3.xsd", "CT"), - ("SpikeGenerator", "NeuroML_v2.3.xsd", "CT"), - ("SpikeGeneratorRandom", "NeuroML_v2.3.xsd", "CT"), - ("SpikeGeneratorPoisson", "NeuroML_v2.3.xsd", "CT"), - ("SpikeGeneratorRefPoisson", "NeuroML_v2.3.xsd", "CT"), - ("PoissonFiringSynapse", "NeuroML_v2.3.xsd", "CT"), - ("TransientPoissonFiringSynapse", "NeuroML_v2.3.xsd", "CT"), - ("Network", "NeuroML_v2.3.xsd", "CT"), - ("Space", "NeuroML_v2.3.xsd", "CT"), - ("SpaceStructure", "NeuroML_v2.3.xsd", "CT"), - ("Region", "NeuroML_v2.3.xsd", "CT"), - ("Population", "NeuroML_v2.3.xsd", "CT"), - ("Layout", "NeuroML_v2.3.xsd", "CT"), - ("UnstructuredLayout", "NeuroML_v2.3.xsd", "CT"), - ("RandomLayout", "NeuroML_v2.3.xsd", "CT"), - ("GridLayout", "NeuroML_v2.3.xsd", "CT"), - ("Instance", "NeuroML_v2.3.xsd", "CT"), - ("Location", "NeuroML_v2.3.xsd", "CT"), - ("CellSet", "NeuroML_v2.3.xsd", "CT"), - ("SynapticConnection", "NeuroML_v2.3.xsd", "CT"), - ("BaseProjection", "NeuroML_v2.3.xsd", "CT"), - ("Projection", "NeuroML_v2.3.xsd", "CT"), - ("BaseConnection", "NeuroML_v2.3.xsd", "CT"), - ("BaseConnectionOldFormat", "NeuroML_v2.3.xsd", "CT"), - ("BaseConnectionNewFormat", "NeuroML_v2.3.xsd", "CT"), - ("Connection", "NeuroML_v2.3.xsd", "CT"), - ("ConnectionWD", "NeuroML_v2.3.xsd", "CT"), - ("ElectricalProjection", "NeuroML_v2.3.xsd", "CT"), - ("ElectricalConnection", "NeuroML_v2.3.xsd", "CT"), - ("ElectricalConnectionInstance", "NeuroML_v2.3.xsd", "CT"), - ("ElectricalConnectionInstanceW", "NeuroML_v2.3.xsd", "CT"), - ("ContinuousProjection", "NeuroML_v2.3.xsd", "CT"), - ("ContinuousConnection", "NeuroML_v2.3.xsd", "CT"), - ("ContinuousConnectionInstance", "NeuroML_v2.3.xsd", "CT"), - ("ContinuousConnectionInstanceW", "NeuroML_v2.3.xsd", "CT"), - ("ExplicitInput", "NeuroML_v2.3.xsd", "CT"), - ("InputList", "NeuroML_v2.3.xsd", "CT"), - ("Input", "NeuroML_v2.3.xsd", "CT"), - ("InputW", "NeuroML_v2.3.xsd", "CT"), - ("basePyNNCell", "NeuroML_v2.3.xsd", "CT"), - ("basePyNNIaFCell", "NeuroML_v2.3.xsd", "CT"), - ("basePyNNIaFCondCell", "NeuroML_v2.3.xsd", "CT"), - ("IF_curr_alpha", "NeuroML_v2.3.xsd", "CT"), - ("IF_curr_exp", "NeuroML_v2.3.xsd", "CT"), - ("IF_cond_alpha", "NeuroML_v2.3.xsd", "CT"), - ("IF_cond_exp", "NeuroML_v2.3.xsd", "CT"), - ("EIF_cond_exp_isfa_ista", "NeuroML_v2.3.xsd", "CT"), - ("EIF_cond_alpha_isfa_ista", "NeuroML_v2.3.xsd", "CT"), - ("HH_cond_exp", "NeuroML_v2.3.xsd", "CT"), - ("BasePynnSynapse", "NeuroML_v2.3.xsd", "CT"), - ("ExpCondSynapse", "NeuroML_v2.3.xsd", "CT"), - ("AlphaCondSynapse", "NeuroML_v2.3.xsd", "CT"), - ("ExpCurrSynapse", "NeuroML_v2.3.xsd", "CT"), - ("AlphaCurrSynapse", "NeuroML_v2.3.xsd", "CT"), - ("SpikeSourcePoisson", "NeuroML_v2.3.xsd", "CT"), - ("BaseWithoutId", "NeuroML_v2.3.xsd", "CT"), - ("BaseNonNegativeIntegerId", "NeuroML_v2.3.xsd", "CT"), - ("Base", "NeuroML_v2.3.xsd", "CT"), - ("Standalone", "NeuroML_v2.3.xsd", "CT"), + ("NmlId", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_none", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_voltage", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_length", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_resistance", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_resistivity", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_conductance", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_conductanceDensity", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_permeability", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_time", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_pertime", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_capacitance", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_specificCapacitance", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_concentration", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_current", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_currentDensity", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_temperature", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_rhoFactor", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2Quantity_conductancePerVoltage", "NeuroML_v2.3.1.xsd", "ST"), + ("MetaId", "NeuroML_v2.3.1.xsd", "ST"), + ("NeuroLexId", "NeuroML_v2.3.1.xsd", "ST"), + ("Nml2PopulationReferencePath", "NeuroML_v2.3.1.xsd", "ST"), + ("NonNegativeInteger", "NeuroML_v2.3.1.xsd", "ST"), + ("PositiveInteger", "NeuroML_v2.3.1.xsd", "ST"), + ("DoubleGreaterThanZero", "NeuroML_v2.3.1.xsd", "ST"), + ("ZeroOrOne", "NeuroML_v2.3.1.xsd", "ST"), + ("Notes", "NeuroML_v2.3.1.xsd", "ST"), + ("TrueOrFalse", "NeuroML_v2.3.1.xsd", "ST"), + ("ZeroToOne", "NeuroML_v2.3.1.xsd", "ST"), + ("channelTypes", "NeuroML_v2.3.1.xsd", "ST"), + ("gateTypes", "NeuroML_v2.3.1.xsd", "ST"), + ("BlockTypes", "NeuroML_v2.3.1.xsd", "ST"), + ("PlasticityTypes", "NeuroML_v2.3.1.xsd", "ST"), + ("Metric", "NeuroML_v2.3.1.xsd", "ST"), + ("networkTypes", "NeuroML_v2.3.1.xsd", "ST"), + ("allowedSpaces", "NeuroML_v2.3.1.xsd", "ST"), + ("populationTypes", "NeuroML_v2.3.1.xsd", "ST"), + ("Property", "NeuroML_v2.3.1.xsd", "CT"), + ("Annotation", "NeuroML_v2.3.1.xsd", "CT"), + ("ComponentType", "NeuroML_v2.3.1.xsd", "CT"), + ("Constant", "NeuroML_v2.3.1.xsd", "CT"), + ("Exposure", "NeuroML_v2.3.1.xsd", "CT"), + ("NamedDimensionalType", "NeuroML_v2.3.1.xsd", "CT"), + ("NamedDimensionalVariable", "NeuroML_v2.3.1.xsd", "CT"), + ("Parameter", "NeuroML_v2.3.1.xsd", "CT"), + ("DerivedParameter", "NeuroML_v2.3.1.xsd", "CT"), + ("LEMS_Property", "NeuroML_v2.3.1.xsd", "CT"), + ("Requirement", "NeuroML_v2.3.1.xsd", "CT"), + ("InstanceRequirement", "NeuroML_v2.3.1.xsd", "CT"), + ("Dynamics", "NeuroML_v2.3.1.xsd", "CT"), + ("DerivedVariable", "NeuroML_v2.3.1.xsd", "CT"), + ("StateVariable", "NeuroML_v2.3.1.xsd", "CT"), + ("ConditionalDerivedVariable", "NeuroML_v2.3.1.xsd", "CT"), + ("Case", "NeuroML_v2.3.1.xsd", "CT"), + ("TimeDerivative", "NeuroML_v2.3.1.xsd", "CT"), + ("OnStart", "NeuroML_v2.3.1.xsd", "CT"), + ("StateAssignment", "NeuroML_v2.3.1.xsd", "CT"), + ("OnEvent", "NeuroML_v2.3.1.xsd", "CT"), + ("EventOut", "NeuroML_v2.3.1.xsd", "CT"), + ("OnCondition", "NeuroML_v2.3.1.xsd", "CT"), + ("Transition", "NeuroML_v2.3.1.xsd", "CT"), + ("Regime", "NeuroML_v2.3.1.xsd", "CT"), + ("OnEntry", "NeuroML_v2.3.1.xsd", "CT"), + ("NeuroMLDocument", "NeuroML_v2.3.1.xsd", "CT"), + ("IncludeType", "NeuroML_v2.3.1.xsd", "CT"), + ("IonChannelScalable", "NeuroML_v2.3.1.xsd", "CT"), + ("IonChannelKS", "NeuroML_v2.3.1.xsd", "CT"), + ("IonChannel", "NeuroML_v2.3.1.xsd", "CT"), + ("IonChannelHH", "NeuroML_v2.3.1.xsd", "CT"), + ("IonChannelVShift", "NeuroML_v2.3.1.xsd", "CT"), + ("Q10ConductanceScaling", "NeuroML_v2.3.1.xsd", "CT"), + ("ClosedState", "NeuroML_v2.3.1.xsd", "CT"), + ("OpenState", "NeuroML_v2.3.1.xsd", "CT"), + ("ForwardTransition", "NeuroML_v2.3.1.xsd", "CT"), + ("ReverseTransition", "NeuroML_v2.3.1.xsd", "CT"), + ("TauInfTransition", "NeuroML_v2.3.1.xsd", "CT"), + ("GateKS", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHUndetermined", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHRates", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHTauInf", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHRatesTauInf", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHRatesTau", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHRatesInf", "NeuroML_v2.3.1.xsd", "CT"), + ("GateHHInstantaneous", "NeuroML_v2.3.1.xsd", "CT"), + ("GateFractional", "NeuroML_v2.3.1.xsd", "CT"), + ("GateFractionalSubgate", "NeuroML_v2.3.1.xsd", "CT"), + ("Q10Settings", "NeuroML_v2.3.1.xsd", "CT"), + ("HHRate", "NeuroML_v2.3.1.xsd", "CT"), + ("HHVariable", "NeuroML_v2.3.1.xsd", "CT"), + ("HHTime", "NeuroML_v2.3.1.xsd", "CT"), + ("DecayingPoolConcentrationModel", "NeuroML_v2.3.1.xsd", "CT"), + ("FixedFactorConcentrationModel", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseVoltageDepSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseCurrentBasedSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseConductanceBasedSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseConductanceBasedSynapseTwo", "NeuroML_v2.3.1.xsd", "CT"), + ("GapJunction", "NeuroML_v2.3.1.xsd", "CT"), + ("SilentSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("LinearGradedSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("GradedSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("AlphaCurrentSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("AlphaSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("ExpOneSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("ExpTwoSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("ExpThreeSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("DoubleSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("BlockingPlasticSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("BlockMechanism", "NeuroML_v2.3.1.xsd", "CT"), + ("PlasticityMechanism", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseCell", "NeuroML_v2.3.1.xsd", "CT"), + ("IafTauCell", "NeuroML_v2.3.1.xsd", "CT"), + ("IafTauRefCell", "NeuroML_v2.3.1.xsd", "CT"), + ("IafCell", "NeuroML_v2.3.1.xsd", "CT"), + ("IafRefCell", "NeuroML_v2.3.1.xsd", "CT"), + ("IzhikevichCell", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseCellMembPotCap", "NeuroML_v2.3.1.xsd", "CT"), + ("Izhikevich2007Cell", "NeuroML_v2.3.1.xsd", "CT"), + ("AdExIaFCell", "NeuroML_v2.3.1.xsd", "CT"), + ("FitzHughNagumoCell", "NeuroML_v2.3.1.xsd", "CT"), + ("FitzHughNagumo1969Cell", "NeuroML_v2.3.1.xsd", "CT"), + ("PinskyRinzelCA3Cell", "NeuroML_v2.3.1.xsd", "CT"), + ("HindmarshRose1984Cell", "NeuroML_v2.3.1.xsd", "CT"), + ("Cell", "NeuroML_v2.3.1.xsd", "CT"), + ("Cell2CaPools", "NeuroML_v2.3.1.xsd", "CT"), + ("Morphology", "NeuroML_v2.3.1.xsd", "CT"), + ("Segment", "NeuroML_v2.3.1.xsd", "CT"), + ("SegmentParent", "NeuroML_v2.3.1.xsd", "CT"), + ("Point3DWithDiam", "NeuroML_v2.3.1.xsd", "CT"), + ("SegmentGroup", "NeuroML_v2.3.1.xsd", "CT"), + ("InhomogeneousParameter", "NeuroML_v2.3.1.xsd", "CT"), + ("ProximalDetails", "NeuroML_v2.3.1.xsd", "CT"), + ("DistalDetails", "NeuroML_v2.3.1.xsd", "CT"), + ("Member", "NeuroML_v2.3.1.xsd", "CT"), + ("Include", "NeuroML_v2.3.1.xsd", "CT"), + ("Path", "NeuroML_v2.3.1.xsd", "CT"), + ("SubTree", "NeuroML_v2.3.1.xsd", "CT"), + ("SegmentEndPoint", "NeuroML_v2.3.1.xsd", "CT"), + ("BiophysicalProperties", "NeuroML_v2.3.1.xsd", "CT"), + ("BiophysicalProperties2CaPools", "NeuroML_v2.3.1.xsd", "CT"), + ("MembraneProperties", "NeuroML_v2.3.1.xsd", "CT"), + ("MembraneProperties2CaPools", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeThresh", "NeuroML_v2.3.1.xsd", "CT"), + ("SpecificCapacitance", "NeuroML_v2.3.1.xsd", "CT"), + ("InitMembPotential", "NeuroML_v2.3.1.xsd", "CT"), + ("Resistivity", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelPopulation", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityNonUniform", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityNonUniformNernst", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityNonUniformGHK", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensity", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityVShift", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityNernst", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityNernstCa2", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityGHK", "NeuroML_v2.3.1.xsd", "CT"), + ("ChannelDensityGHK2", "NeuroML_v2.3.1.xsd", "CT"), + ("VariableParameter", "NeuroML_v2.3.1.xsd", "CT"), + ("InhomogeneousValue", "NeuroML_v2.3.1.xsd", "CT"), + ("Species", "NeuroML_v2.3.1.xsd", "CT"), + ("ConcentrationModel_D", "NeuroML_v2.3.1.xsd", "CT"), + ("IntracellularProperties", "NeuroML_v2.3.1.xsd", "CT"), + ("IntracellularProperties2CaPools", "NeuroML_v2.3.1.xsd", "CT"), + ("ExtracellularProperties", "NeuroML_v2.3.1.xsd", "CT"), + ("ExtracellularPropertiesLocal", "NeuroML_v2.3.1.xsd", "CT"), + ("ReactionScheme", "NeuroML_v2.3.1.xsd", "CT"), + ("PulseGenerator", "NeuroML_v2.3.1.xsd", "CT"), + ("PulseGeneratorDL", "NeuroML_v2.3.1.xsd", "CT"), + ("SineGenerator", "NeuroML_v2.3.1.xsd", "CT"), + ("SineGeneratorDL", "NeuroML_v2.3.1.xsd", "CT"), + ("RampGenerator", "NeuroML_v2.3.1.xsd", "CT"), + ("RampGeneratorDL", "NeuroML_v2.3.1.xsd", "CT"), + ("CompoundInput", "NeuroML_v2.3.1.xsd", "CT"), + ("CompoundInputDL", "NeuroML_v2.3.1.xsd", "CT"), + ("VoltageClamp", "NeuroML_v2.3.1.xsd", "CT"), + ("VoltageClampTriple", "NeuroML_v2.3.1.xsd", "CT"), + ("Spike", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeArray", "NeuroML_v2.3.1.xsd", "CT"), + ("TimedSynapticInput", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeGenerator", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeGeneratorRandom", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeGeneratorPoisson", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeGeneratorRefPoisson", "NeuroML_v2.3.1.xsd", "CT"), + ("PoissonFiringSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("TransientPoissonFiringSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("Network", "NeuroML_v2.3.1.xsd", "CT"), + ("Space", "NeuroML_v2.3.1.xsd", "CT"), + ("SpaceStructure", "NeuroML_v2.3.1.xsd", "CT"), + ("Region", "NeuroML_v2.3.1.xsd", "CT"), + ("Population", "NeuroML_v2.3.1.xsd", "CT"), + ("Layout", "NeuroML_v2.3.1.xsd", "CT"), + ("UnstructuredLayout", "NeuroML_v2.3.1.xsd", "CT"), + ("RandomLayout", "NeuroML_v2.3.1.xsd", "CT"), + ("GridLayout", "NeuroML_v2.3.1.xsd", "CT"), + ("Instance", "NeuroML_v2.3.1.xsd", "CT"), + ("Location", "NeuroML_v2.3.1.xsd", "CT"), + ("CellSet", "NeuroML_v2.3.1.xsd", "CT"), + ("SynapticConnection", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseProjection", "NeuroML_v2.3.1.xsd", "CT"), + ("Projection", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseConnection", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseConnectionOldFormat", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseConnectionNewFormat", "NeuroML_v2.3.1.xsd", "CT"), + ("Connection", "NeuroML_v2.3.1.xsd", "CT"), + ("ConnectionWD", "NeuroML_v2.3.1.xsd", "CT"), + ("ElectricalProjection", "NeuroML_v2.3.1.xsd", "CT"), + ("ElectricalConnection", "NeuroML_v2.3.1.xsd", "CT"), + ("ElectricalConnectionInstance", "NeuroML_v2.3.1.xsd", "CT"), + ("ElectricalConnectionInstanceW", "NeuroML_v2.3.1.xsd", "CT"), + ("ContinuousProjection", "NeuroML_v2.3.1.xsd", "CT"), + ("ContinuousConnection", "NeuroML_v2.3.1.xsd", "CT"), + ("ContinuousConnectionInstance", "NeuroML_v2.3.1.xsd", "CT"), + ("ContinuousConnectionInstanceW", "NeuroML_v2.3.1.xsd", "CT"), + ("ExplicitInput", "NeuroML_v2.3.1.xsd", "CT"), + ("InputList", "NeuroML_v2.3.1.xsd", "CT"), + ("Input", "NeuroML_v2.3.1.xsd", "CT"), + ("InputW", "NeuroML_v2.3.1.xsd", "CT"), + ("basePyNNCell", "NeuroML_v2.3.1.xsd", "CT"), + ("basePyNNIaFCell", "NeuroML_v2.3.1.xsd", "CT"), + ("basePyNNIaFCondCell", "NeuroML_v2.3.1.xsd", "CT"), + ("IF_curr_alpha", "NeuroML_v2.3.1.xsd", "CT"), + ("IF_curr_exp", "NeuroML_v2.3.1.xsd", "CT"), + ("IF_cond_alpha", "NeuroML_v2.3.1.xsd", "CT"), + ("IF_cond_exp", "NeuroML_v2.3.1.xsd", "CT"), + ("EIF_cond_exp_isfa_ista", "NeuroML_v2.3.1.xsd", "CT"), + ("EIF_cond_alpha_isfa_ista", "NeuroML_v2.3.1.xsd", "CT"), + ("HH_cond_exp", "NeuroML_v2.3.1.xsd", "CT"), + ("BasePynnSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("ExpCondSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("AlphaCondSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("ExpCurrSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("AlphaCurrSynapse", "NeuroML_v2.3.1.xsd", "CT"), + ("SpikeSourcePoisson", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseWithoutId", "NeuroML_v2.3.1.xsd", "CT"), + ("BaseNonNegativeIntegerId", "NeuroML_v2.3.1.xsd", "CT"), + ("Base", "NeuroML_v2.3.1.xsd", "CT"), + ("Standalone", "NeuroML_v2.3.1.xsd", "CT"), ] } diff --git a/neuroml/nml/regenerate-nml.sh b/neuroml/nml/regenerate-nml.sh index 1465345c..abda3e2e 100755 --- a/neuroml/nml/regenerate-nml.sh +++ b/neuroml/nml/regenerate-nml.sh @@ -53,13 +53,13 @@ regenerate () { } reformat () { - if command -v black > /dev/null 2>&1 + if command -v ruff > /dev/null 2>&1 then - echo "Formatting new nml.py with black" - black nml.py + echo "Formatting new nml.py with ruff" + ruff format nml.py else - echo "black is not installed" - echo "Run: pip install black" + echo "ruff is not installed" + echo "Run: pip install ruff" fi } diff --git a/neuroml/test/misc_tests.py b/neuroml/test/misc_tests.py index c11e498a..ab39a385 100644 --- a/neuroml/test/misc_tests.py +++ b/neuroml/test/misc_tests.py @@ -3,8 +3,8 @@ """ -import sys import inspect +import sys import neuroml diff --git a/neuroml/test/test_arraymorph.py b/neuroml/test/test_arraymorph.py index 922b43e0..4cab4873 100644 --- a/neuroml/test/test_arraymorph.py +++ b/neuroml/test/test_arraymorph.py @@ -1,9 +1,11 @@ import warnings -import neuroml.arraymorph as am -import neuroml + import numpy as np -import neuroml.writers as writers + +import neuroml +import neuroml.arraymorph as am import neuroml.loaders as loaders +import neuroml.writers as writers try: import unittest2 as unittest diff --git a/neuroml/test/test_cell.py b/neuroml/test/test_cell.py index a1328758..1cbf6735 100644 --- a/neuroml/test/test_cell.py +++ b/neuroml/test/test_cell.py @@ -3,20 +3,21 @@ """ -import neuroml -from neuroml import loaders - -from neuroml import Segment -from neuroml import SegmentParent -from neuroml import SegmentGroup -from neuroml import Member -from neuroml import Include -from neuroml import Cell -from neuroml import Morphology -from neuroml import Point3DWithDiam - import os +import neuroml +from neuroml import ( + Cell, + Include, + Member, + Morphology, + Point3DWithDiam, + Segment, + SegmentGroup, + SegmentParent, + loaders, +) + try: import unittest2 as unittest except ImportError: diff --git a/neuroml/test/test_global_validation.py b/neuroml/test/test_global_validation.py new file mode 100644 index 00000000..ec22d0ca --- /dev/null +++ b/neuroml/test/test_global_validation.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +""" +Test global validation toggles + +File: test_global_validation.py + +Copyright 2024 Ankur Sinha +Author: Ankur Sinha +""" + +try: + import unittest2 as unittest +except ImportError: + import unittest + +import neuroml +from neuroml import ( + disable_build_time_validation, + enable_build_time_validation, + get_build_time_validation, +) +from neuroml.utils import component_factory + + +class TestGlobalValidationToggle(unittest.TestCase): + def test_global_validation_toggle(self): + """Test enabling and disabling build time validation""" + self.assertTrue(get_build_time_validation()) + with self.assertRaises(ValueError): + anet = component_factory(neuroml.Network, id="anet") + + disable_build_time_validation() + self.assertFalse(get_build_time_validation()) + anet = component_factory(neuroml.Network, id="anet") + + enable_build_time_validation() + with self.assertRaises(ValueError): + anet = component_factory(neuroml.Network, id="anet") diff --git a/neuroml/test/test_hdf5_optimized.py b/neuroml/test/test_hdf5_optimized.py index c34fef3a..193f6ccc 100644 --- a/neuroml/test/test_hdf5_optimized.py +++ b/neuroml/test/test_hdf5_optimized.py @@ -3,11 +3,10 @@ """ -from neuroml import loaders -import neuroml.writers as writers - import os +import neuroml.writers as writers +from neuroml import loaders from neuroml.test.test_xml_parser import compare try: diff --git a/neuroml/test/test_hdf5_parser.py b/neuroml/test/test_hdf5_parser.py index c83faf92..13da2004 100644 --- a/neuroml/test/test_hdf5_parser.py +++ b/neuroml/test/test_hdf5_parser.py @@ -3,10 +3,10 @@ """ -from neuroml import loaders -import neuroml.writers as writers - import os + +import neuroml.writers as writers +from neuroml import loaders from neuroml.test.test_xml_parser import compare try: diff --git a/neuroml/test/test_loaders.py b/neuroml/test/test_loaders.py index 441d0169..3e667ea6 100644 --- a/neuroml/test/test_loaders.py +++ b/neuroml/test/test_loaders.py @@ -3,9 +3,10 @@ """ +import os + import neuroml from neuroml import loaders -import os try: import unittest2 as unittest diff --git a/neuroml/test/test_nml.py b/neuroml/test/test_nml.py index 01fad7fe..f2ffd85b 100644 --- a/neuroml/test/test_nml.py +++ b/neuroml/test/test_nml.py @@ -12,12 +12,11 @@ except ImportError: import unittest -from neuroml.utils import (component_factory, print_hierarchy) import neuroml +from neuroml.utils import component_factory, print_hierarchy class TestNML(unittest.TestCase): - """Tests related to nml.py""" def test_get_members(self): @@ -177,6 +176,9 @@ def test_add_to_container(self): def test_info(self): """Test getting member info.""" cell = neuroml.Cell(id="testcell") + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") info = cell.info() self.assertRegex(info, "morphology") self.assertRegex(info, "biophysical_properties") @@ -212,6 +214,9 @@ def test_component_validate(self): def test_parentinfo(self): """Test the parent info method""" cell = neuroml.Cell(id="testcell") + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") info = cell.parentinfo() self.assertRegex(info, "NeuroMLDocument") @@ -237,6 +242,9 @@ def test_component_argument_list_checker(self): def test_add_segment(self): """Test adding a segment.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") segment = new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -255,6 +263,9 @@ def test_add_segment(self): def test_add_segment_no_group(self): """Test adding a segment but without a group.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") segment = new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), name="soma", group_id=None, seg_type="soma" ) @@ -269,6 +280,8 @@ def test_add_segment_no_group(self): def test_setting_init_memb_potential(self): """Test adding initial membrane potential.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -291,6 +304,8 @@ def test_setting_spike_thresh(self): seg_type="soma", ) new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") self.assertIsNone(new_cell.validate(True)) @@ -321,6 +336,9 @@ def test_setting_resistivity(self): seg_type="soma", ) new_cell.set_resistivity("2000 ohm_cm") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") self.assertIsNone(new_cell.validate(True)) @unittest.expectedFailure @@ -340,6 +358,9 @@ def test_setting_resistivity_should_fail(self): def test_setting_specific_capacitance(self): """Test setting the specific_capacitance.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -354,6 +375,9 @@ def test_setting_specific_capacitance(self): def test_setting_specific_capacitance_should_fail(self): """Test setting the specific_capacitance.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -367,6 +391,9 @@ def test_setting_specific_capacitance_should_fail(self): def test_setting_channel_density(self): """Test setting the channel_density.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -411,6 +438,9 @@ def test_setting_channel_density(self): def test_setting_channel_density_v(self): """Test setting the channel_density.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -458,6 +488,9 @@ def test_setting_channel_density_v(self): def test_setting_channel_density_should_fail(self): """Test setting the channel_density.""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -490,6 +523,8 @@ def test_setting_channel_density_should_fail(self): def test_setting_membrane_property(self): """Test adding a new membrane property""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -511,6 +546,9 @@ def test_setting_membrane_property(self): def test_setting_intracellular_property(self): """Test adding a new membrane property""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") new_cell.add_segment( (0, 0, 0, 20), (20, 0, 0, 20), @@ -536,6 +574,9 @@ def test_simple_cell(self): "Test a simple cell." # test with component_factory cell = component_factory("Cell", id="simple_cell") + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") cell.notes = "NeuroML cell created by CellBuilder" # Add soma segment @@ -556,6 +597,9 @@ def test_complex_cell(self): """Test a complex cell.""" # with component_factory cell = component_factory("Cell", id="complex_cell") # type: neuroml.Cell + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") cell.notes = "NeuroML cell created by CellBuilder" # Add soma segment @@ -584,6 +628,9 @@ def test_complex_cell(self): def test_component_factory_create_cell(self): """Test cell creation""" new_cell = component_factory("Cell", id="test_cell") + new_cell.set_spike_thresh("40mV") + new_cell.set_init_memb_potential("-70mV") + new_cell.set_specific_capacitance("1 uF_per_cm2") self.assertIsInstance(new_cell, neuroml.Cell) # cell does not have segments: is invalid NeuroML @@ -594,6 +641,9 @@ def test_add_unbranched_segments(self): "Test add_unbranced_segments" # test with component_factory cell = component_factory("Cell", id="simple_cell") + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") cell.notes = "NeuroML cell created by CellBuilder" # Add soma segment @@ -629,6 +679,9 @@ def test_add_unbranched_segments(self): def test_optimise_segment_group(self): """Test `optimise_segment_group`""" cell = component_factory("Cell", id="simple_cell") # type: neuroml.Cell + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") cell.notes = "NeuroML cell created by CellBuilder" # Add soma segment @@ -669,6 +722,9 @@ def test_optimise_segment_group(self): def test_create_unbranched_segment_group_branches(self): "Test create_unbranched_segment_group_branches" cell = component_factory("Cell", id="simple_cell") # type: neuroml.Cell + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") cell.notes = "NeuroML cell created by CellBuilder" # Add soma segment @@ -738,6 +794,9 @@ def test_morphinfo(self): """Test the morphinfo method""" # with component_factory cell = component_factory("Cell", id="complex_cell") # type: neuroml.Cell + cell.set_spike_thresh("40mV") + cell.set_init_memb_potential("-70mV") + cell.set_specific_capacitance("1 uF_per_cm2") cell.notes = "NeuroML cell created by CellBuilder" # Add soma segment @@ -764,8 +823,7 @@ def test_morphinfo(self): cell.biophysinfo() def test_class_hierarchy(self): - """Test the class hierarchy getter and printer - """ + """Test the class hierarchy getter and printer""" hier = neuroml.Cell.get_class_hierarchy() self.assertIsNotNone(hier) print() @@ -777,3 +835,9 @@ def test_class_hierarchy(self): print(hier) print() print_hierarchy(hier) + + +if __name__ == "__main__": + ta = TestNML() + + ta.test_add_segment() diff --git a/neuroml/test/test_segment.py b/neuroml/test/test_segment.py index 784368a2..54c1ff74 100644 --- a/neuroml/test/test_segment.py +++ b/neuroml/test/test_segment.py @@ -3,13 +3,10 @@ """ + import math -from neuroml import Segment -from neuroml import SegmentParent -from neuroml import Cell -from neuroml import Morphology -from neuroml import Point3DWithDiam +from neuroml import Cell, Morphology, Point3DWithDiam, Segment, SegmentParent try: import unittest2 as unittest diff --git a/neuroml/test/test_utils.py b/neuroml/test/test_utils.py index c16bfbd1..79e7e4db 100644 --- a/neuroml/test/test_utils.py +++ b/neuroml/test/test_utils.py @@ -10,12 +10,14 @@ import unittest import neuroml -from neuroml.utils import (component_factory, get_relative_component_path, - print_hierarchy) +from neuroml.utils import ( + component_factory, + get_relative_component_path, + print_hierarchy, +) class UtilsTestCase(unittest.TestCase): - """Test the Utils module""" def test_component_factory(self): diff --git a/neuroml/test/test_writers.py b/neuroml/test/test_writers.py index e1ae6733..38dc17ab 100644 --- a/neuroml/test/test_writers.py +++ b/neuroml/test/test_writers.py @@ -3,10 +3,12 @@ """ -import neuroml +import tempfile + import numpy as np + +import neuroml from neuroml import arraymorph as am -import tempfile try: import unittest2 as unittest diff --git a/neuroml/test/test_xml_parser.py b/neuroml/test/test_xml_parser.py index 8b8ec6d4..56231470 100644 --- a/neuroml/test/test_xml_parser.py +++ b/neuroml/test/test_xml_parser.py @@ -3,15 +3,15 @@ """ +import os + +import pytest + +import neuroml.writers as writers +from neuroml import loaders from neuroml.hdf5.DefaultNetworkHandler import DefaultNetworkHandler from neuroml.hdf5.NetworkBuilder import NetworkBuilder from neuroml.hdf5.NeuroMLXMLParser import NeuroMLXMLParser -from neuroml import loaders -import neuroml.writers as writers - - -import os -import pytest @pytest.mark.parametrize( diff --git a/neuroml/utils.py b/neuroml/utils.py index b5998f43..121cfebc 100644 --- a/neuroml/utils.py +++ b/neuroml/utils.py @@ -3,15 +3,17 @@ Utilities for checking generated code """ + import inspect import os import sys import warnings -from typing import Any, Dict, Union, Optional, Type +from typing import Any, Dict, Optional, Type, Union import networkx import neuroml.nml.nml as schema +from neuroml import NeuroMLDocument from . import loaders @@ -240,7 +242,7 @@ def print_hierarchy(tree, indent=4, current_ind=0): for k, v in tree.items(): if current_ind: before_dashes = current_ind - indent - print(' ' * before_dashes + '└' + '-'*(indent-1) + k) + print(" " * before_dashes + "└" + "-" * (indent - 1) + k) else: print(k) for sub_tree in v: @@ -265,9 +267,12 @@ def get_hier_graph_networkx(graph: networkx.DiGraph, hier: Dict[str, Any]): graph.add_edge(k, v) -def get_relative_component_path(src: str, dest: str, root: Type = - schema.NeuroMLDocument, graph: - Optional[networkx.DiGraph] = None): +def get_relative_component_path( + src: str, + dest: str, + root: Type = schema.NeuroMLDocument, + graph: Optional[networkx.DiGraph] = None, +): """Construct a path from src component to dest in a neuroml document. Useful when referring to components in other components @@ -284,8 +289,8 @@ def get_relative_component_path(src: str, dest: str, root: Type = graph = networkx.DiGraph() get_hier_graph_networkx(graph, root.get_nml2_class_hierarchy()) - p1 = (list(networkx.all_shortest_paths(graph, root.__name__, "Instance"))) - p2 = (list(networkx.all_shortest_paths(graph, root.__name__, "Input"))) + p1 = list(networkx.all_shortest_paths(graph, root.__name__, "Instance")) + p2 = list(networkx.all_shortest_paths(graph, root.__name__, "Input")) if len(p1) > 1 or len(p2) > 1: print("Multiple paths found, cannot calculate recommended path") @@ -305,6 +310,20 @@ def get_relative_component_path(src: str, dest: str, root: Type = return (path, graph) +def fix_external_morphs_biophys_in_cell(nml2_doc: NeuroMLDocument) -> None: + """ + Only used in the case where a cell element has a morphology (or biophysicalProperties) attribute, as opposed to a + subelement morphology/biophysicalProperties. This will substitute the external element into the cell element for ease of access + """ + for cell in nml2_doc.cells: + if cell.morphology_attr != None: + ext_morph = nml2_doc.get_by_id(cell.morphology_attr) + cell.morphology = ext_morph + if cell.biophysical_properties_attr != None: + ext_bp = nml2_doc.get_by_id(cell.biophysical_properties_attr) + cell.biophysical_properties = ext_bp + + def main(): if len(sys.argv) != 2: print("Please specify the name of the NeuroML2 file...") diff --git a/setup.cfg b/setup.cfg index 83eedc93..7f402f19 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = libNeuroML -version = 0.5.9 +version = 0.6.1 author_email = vellamike@gmail.com, p.gleeson@gmail.com author = libNeuroML authors and contributors description = A Python library for working with NeuroML descriptions of neuronal models @@ -57,8 +57,9 @@ dev = networkx flake8 pytest - black ; python_version >= '3.0' + ruff natsort + pre-commit doc = sphinxcontrib-bibtex