diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..65c6d20 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "drawsbml"] + path = drawsbml + url = git@github.com:dilawar/drawsbml diff --git a/.travis.yml b/.travis.yml index 7848843..08a99d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,22 +2,16 @@ notifications: email: recipients: - dilawar.s.rajput@gmail.com - - upi.bhalla@gmail.com - - hrani@ncbs.res.in install: - - wget http://download.opensuse.org/repositories/home:moose/xUbuntu_14.04/Release.key - - sudo apt-key add - < Release.key - - sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/moose/xUbuntu_14.04/ /' >> /etc/apt/sources.list.d/moose.list" - sudo apt-get -y update - sudo apt-get -y --force-yes install python3 python-pip - - sudo apt-get -y --force-yes install moose - - sudo -H pip install python-libsbml + - sudo pip install python-libsbml script: - # Making sure no python incompatible file is added. - - python -m compileall -q . - - python -c 'import moose' - - #python -c 'import moogli' - - # More tests here for gui. + - python3 -m pip install pymoose --user --pre + - python3 -m compileall -q . + - python3 -c 'import moose' + - python3 setup.py install --user diff --git a/AUTHOR b/AUTHOR new file mode 100644 index 0000000..58cd432 --- /dev/null +++ b/AUTHOR @@ -0,0 +1,4 @@ +Harsha Rani +Subhasis Ray +Aviral Goel +Dilawar Singh diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..255b2e2 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +PY := $(shell which python3) + +all : check build + +check : + $(PY) -m compileall -q . + +build : + $(PY) setup.py sdist bdist + +install : uninstall + git clean -fxd . + $(PY) -m pip install . --upgrade --user + +test: install + ( cd /tmp && moosegui ) + +uninstall : + $(PY) -m pip uninstall moosegui -y + +lint: + find . -type f -name *.py -print0 | xargs -0 -I file pyflakes file + +.PHONY : lint uninstall test install build check diff --git a/PlotWidgetContainer.py b/PlotWidgetContainer.py deleted file mode 100644 index d51ab81..0000000 --- a/PlotWidgetContainer.py +++ /dev/null @@ -1,189 +0,0 @@ - -# -*- coding: utf-8 -*- -from __future__ import print_function - -""" -""" -__credits__ = ["Upi Lab"] -__author__ = "Aviral Goel" -__license__ = "GPL3" -__version__ = "1.0.0" -__maintainer__ = "Aviral Goel", "HarshaRani" -__email__ = "goel.aviral@gmail.com" -__status__ = "Development" -__updated__ = "Jul 26 2017" - - -import sys -import os -import PyQt4 -from PyQt4 import QtGui, Qt -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QSizeGrip -from PyQt4.QtGui import QDockWidget -from PyQt4.QtGui import QLayout -from PyQt4.QtGui import QVBoxLayout -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QScrollArea -from PyQt4.QtGui import QToolBar -from PyQt4.QtGui import QSizeGrip -from PyQt4.QtGui import QSplitter - -import moose -import default -import sidebar -# from default import PlotWidget - -ELECTRICAL = 0 -CHEMICAL = 1 -class PlotWidgetContainer(QWidget): - - def __init__(self, modelRoot, *args, **kwargs): - - super(PlotWidgetContainer, self).__init__(*args) - self.modelRoot = modelRoot - if len(moose.wildcardFind(modelRoot + "/##[ISA=ChemCompt]")) == 0: - self.modelType = ELECTRICAL - else: - self.modelType = CHEMICAL - - self.model = moose.element(self.modelRoot) - if self.modelRoot != "/": - self.modelRoot = self.findModelPath(self.modelRoot) - if moose.exists(modelRoot + "/data"): - self.data = moose.element(self.modelRoot + "/data") - else: - self.data = moose.Neutral(self.modelRoot + "/data") - - else: - self.data = moose.element("/data") - - self._layout = QVBoxLayout() - self.graphs = QSplitter() - self.graphs.setOrientation(PyQt4.QtCore.Qt.Vertical) - self.graphsArea = QScrollArea() - # self.graphsLayout = QGridLayout() - # self.menubar = self.createMenuBar() - self.rowIndex = 0 - # self.setSizePolicy( QtGui.QSizePolicy.Expanding - # , QtGui.QSizePolicy.Expanding - # ) - - self.graphs.setSizePolicy( QtGui.QSizePolicy.Expanding - , QtGui.QSizePolicy.Expanding - ) - self.setAcceptDrops(True) - # self._layout.setSizeConstraint( QLayout.SetNoConstraint ) - # self.graphs.setLayout(self.graphsLayout) - self.graphsArea.setWidget(self.graphs) - self.graphsArea.setWidgetResizable(True) - self.graphWidgets = [] - # self._layout.addWidget(self.menubar) - self._layout.addWidget(self.graphsArea) - self.setLayout(self._layout) - - for graph in self.data.children: - self.addPlotWidget(graph = graph) - - if len(self.data.children) == 0: - self.addPlotWidget() - - def mooseIsInstance(self,element, classNames): - return moose.element(element).__class__.__name__ in classNames - - - def findModelPath(self,element): - child = element - while not self.mooseIsInstance(element, "Shell"): - child = moose.element(element).path - element = moose.element(element).parent - return child - - def deleteWidget(self, graphWidget): - # print("Deleted => ", graphWidget) - self.graphWidgets.remove(graphWidget) - graphWidget.setParent(None) - graphWidget.close() - - def createMenuBar(self): - bar = sidebar.sidebar() - bar.addAction(sidebar.add_graph_action(bar, lambda event: self.addPlotWidget() )) - # bar.addAction(sidebar.delete_graph_action(bar, lambda event: self.addPlotWidget() )) - # bar.addAction(sidebar.list_action(bar, self.showPlotView)) - return bar - - def addPlotWidget(self, row = None, col = 0, graph = None): - if graph == None: - graph = moose.Neutral(self.data.path + "/graph_" + str(self.rowIndex)) - widget = default.PlotWidget(self.model, graph, self.rowIndex, self) - - if self.modelType == ELECTRICAL: - for axes in widget.canvas.axes.values(): - # axes.autoscale(False, axis='x', tight=True) - axes.set_ylim(bottom = -0.07, top= 0.03) - - if row == None: - row = self.rowIndex - self.graphs.addWidget(widget) - self.rowIndex += 1 - self.graphWidgets.append(widget) - widget.widgetClosedSignal.connect(self.deleteWidget) - widget.addGraph.connect(lambda event : self.addPlotWidget()) - # widget.resize(1, 1); - return widget - - def showPlotView(self): - pass - - def setModelRoot(self, *args): - pass - - def getMenus(self, *args): - return [] - - def setDataRoot(self, *args): - pass - - def updatePlots(self): - for graphWidget in self.graphWidgets: - graphWidget.updatePlots() - - def rescalePlots(self): - for graphWidget in self.graphWidgets: - graphWidget.rescalePlots() - - def extendXAxes(self, xlim): - for graphWidget in self.graphWidgets: - graphWidget.extendXAxes(xlim) - - def plotAllData(self): - for graphWidget in self.graphWidgets: - graphWidget.plotAllData() - - #print(graphWidget) - # def plotAll(self): - # self.apply(lambda obj: obj.plotAll()) - - # def plotAllData(self): - # selt.plotWidgetContainer.plotAllData() - - # def genColorMap(self,tableObject): - # pass - - # def onclick(self,event1): - # pass - - # def addTimeSeries(self, table, *args, **kwargs): - # pass - - # def addRasterPlot(self, eventtable, yoffset=0, *args, **kwargs): - # pass - - # def extendXAxes(self, xlim): - # pass - - # def saveCsv(self, line,directory): - # pass - - # def saveAllCsv(self): - # pass diff --git a/__init__.py b/__init__.py deleted file mode 100644 index 7ff5c6b..0000000 --- a/__init__.py +++ /dev/null @@ -1 +0,0 @@ -all = [ "plugins", 'suds' ] diff --git a/about.html b/about.html deleted file mode 100644 index 5345c9c..0000000 --- a/about.html +++ /dev/null @@ -1,36 +0,0 @@ - -
-MOOSE is the Multiscale Object-Oriented Simulation Environment (MOOSE) -

Version 3.0.2pre "Ghevar" - -


-

Copyright (C) 2003-2016 Upinder S. Bhalla and NCBS.

- -

MOOSE is released under the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at -your option) any later version.

- -

MOOSE is the Multiscale Object-Oriented Simulation Environment. It is designed -to simulate neural systems ranging from subcellular components and biochemical -reactions to complex models of single neurons, circuits, and large networks. -MOOSE can operate at many levels of detail, from stochastic chemical -computations, to multicompartment single-neuron models, to spiking neuron -network models. - -MOOSE is multiscale: It can do all these calculations together. For example it -handles interactions seamlessly between electrical and chemical signaling. -MOOSE is object-oriented. Biological concepts are mapped into classes, and a -model is built by creating instances of these classes and connecting them by -messages. MOOSE also has classes whose job is to take over difficult -computations in a certain domain, and do them fast. There are such solver -classes for stochastic and deterministic chemistry, for diffusion, and for -multicompartment neuronal models. MOOSE is a simulation environment, not just a -numerical engine: It provides data representations and solvers (of course!), but -also a scripting interface with Python, graphical displays with Matplotlib, -PyQt, and OpenGL, and support for many model formats. These include SBML, -NeuroML, GENESIS kkit and cell.p formats, HDF5 and NSDF for data writing.

- -

Home Page: -http://moose.ncbs.res.in

- - diff --git a/build/lib/moosegui/MooseCanvas.py b/build/lib/moosegui/MooseCanvas.py new file mode 100644 index 0000000..26446c7 --- /dev/null +++ b/build/lib/moosegui/MooseCanvas.py @@ -0,0 +1,104 @@ +"""MooseCanvas.py: + + +Here is my Canvas. + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import sys +import random +import os + +try: + import Tkinter as tk +except ImportError as e: + import tkinter as tk + +import logging + +class MooseCanvas( tk.Frame ): + + def __init__(self, root = None): + + + self.canvas = tk.Canvas( root , width=800, height=800 ) + self.canvas.create_line( 0, 0, 200, 200 ); + + ''' + self.xsb = tk.Scrollbar( self.canvas, + orient="horizontal", command=self.canvas.xview + ) + + self.ysb = tk.Scrollbar( self.canvas, orient="vertical", + command=self.canvas.yview + ) + self.canvas.configure( + yscrollcommand=self.ysb.set, + xscrollcommand=self.xsb.set + ) + + self.xsb.grid(row=1, column=0, sticky="ew") + self.ysb.grid(row=0, column=1, sticky="ns") + # self.grid_rowconfigure(0, weight=1) + # self.grid_columnconfigure(0, weight=1) + ''' + + # This is what enables using the mouse: + self.canvas.bind("", self.move_start) + self.canvas.bind("", self.move_move) + # linux scroll + self.canvas.bind("", self.zoomerP) + self.canvas.bind("", self.zoomerM) + # windows scroll + self.canvas.bind("", self.zoomer) + # self.canvas.bind( "", self.keyboard ) + self.canvas.bind( "Move", self.keyboard ) + self.canvas.bind( "", self.mouseCallback ) + self.canvas.grid( row = 0, column = 0, sticky = 'news' ) + # self.canvas.pack( ) + + # move + def move_start(self, event): + self.canvas.scan_mark(event.x, event.y) + + def move_move(self, event): + self.canvas.scan_dragto(event.x, event.y, gain=1) + + # windows zoom + def zoomer(self, event): + if (event.delta > 0): + self.canvas.scale("all", event.x, event.y, 1.1, 1.1) + elif (event.delta < 0): + self.canvas.scale("all", event.x, event.y, 0.9, 0.9) + self.canvas.configure(scrollregion=self.canvas.bbox("all")) + + # linux zoom + def zoomerP(self, event): + self.canvas.scale("all", event.x, event.y, 1.1, 1.1) + self.canvas.configure(scrollregion=self.canvas.bbox("all")) + + def zoomerM(self, event): + self.canvas.scale("all", event.x, event.y, 0.9, 0.9) + self.canvas.configure(scrollregion=self.canvas.bbox("all")) + + def mouseCallback(self, event ): + logging.info( 'Button pressed %s %s' % ( event.x, event.y ) ) + + def keyboard(self, event ): + logging.info( 'Key pressed %s' % ( event.char ) ) + +if __name__ == "__main__": + root = tk.Tk() + a = MooseCanvas( root ) + # a.plot_random_rects( ) + a.pack(fill="both", expand=True) + root.mainloop() diff --git a/build/lib/moosegui/MooseWindow.py b/build/lib/moosegui/MooseWindow.py new file mode 100644 index 0000000..c2b5cb6 --- /dev/null +++ b/build/lib/moosegui/MooseWindow.py @@ -0,0 +1,44 @@ +"""MooseWindow.py: + +MooseWindow. + +""" + +__author__ = "Me" +__copyright__ = "Copyright 2016, Me" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Me" +__email__ = "" +__status__ = "Development" + +import sys +import os + +try: + import Tkinter as tk +except ImportError as e: + import tkinter as tk + +class MooseWindow( tk.Tk ): + """docstring for MooseWindow""" + + def __init__( self, title = 'MOOSE' ): + tk.Tk.__init__( self ) + self.title( title ) + self.state = None + self.attributes( '-zoomed', True ) + self.bind( "", self.toggle_fullscreen ) + self.bind( "", self.end_fullscreen ) + + + def toggle_fullscreen(self, event=None): + self.state = not self.state # Just toggling the boolean + self.attributes("-fullscreen", self.state) + return "break" + + def end_fullscreen(self, event=None): + self.state = False + self.attributes("-fullscreen", False) + return "break" diff --git a/build/lib/moosegui/PyShell.py b/build/lib/moosegui/PyShell.py new file mode 100644 index 0000000..5b1ccff --- /dev/null +++ b/build/lib/moosegui/PyShell.py @@ -0,0 +1,1628 @@ +#! /usr/bin/env python +from __future__ import print_function + +import os +import os.path +import sys +import string +import getopt +import re +import socket +import time +import threading +import io + +import linecache +from code import InteractiveInterpreter +from platform import python_version, system + +try: + from Tkinter import * +except ImportError: + print("** IDLE can't import Tkinter.\n" + "Your Python may not be configured for Tk. **", file=sys.__stderr__) + sys.exit(1) +import tkMessageBox + +from idlelib.EditorWindow import EditorWindow, fixwordbreaks +from idlelib.FileList import FileList +from idlelib.ColorDelegator import ColorDelegator +from idlelib.UndoDelegator import UndoDelegator +from idlelib.OutputWindow import OutputWindow +from idlelib.configHandler import idleConf +from idlelib import rpc +from idlelib import Debugger +from idlelib import RemoteDebugger +from idlelib import macosxSupport +from idlelib import IOBinding + +IDENTCHARS = string.ascii_letters + string.digits + "_" +HOST = '127.0.0.1' # python execution server on localhost loopback +PORT = 0 # someday pass in host, port for remote debug capability + +try: + from signal import SIGTERM +except ImportError: + SIGTERM = 15 + +# Override warnings module to write to warning_stream. Initialize to send IDLE +# internal warnings to the console. ScriptBinding.check_syntax() will +# temporarily redirect the stream to the shell window to display warnings when +# checking user's code. +warning_stream = sys.__stderr__ # None, at least on Windows, if no console. +import warnings + +def idle_formatwarning(message, category, filename, lineno, line=None): + """Format warnings the IDLE way.""" + + s = "\nWarning (from warnings module):\n" + s += ' File \"%s\", line %s\n' % (filename, lineno) + if line is None: + line = linecache.getline(filename, lineno) + line = line.strip() + if line: + s += " %s\n" % line + s += "%s: %s\n" % (category.__name__, message) + return s + +def idle_showwarning( + message, category, filename, lineno, file=None, line=None): + """Show Idle-format warning (after replacing warnings.showwarning). + + The differences are the formatter called, the file=None replacement, + which can be None, the capture of the consequence AttributeError, + and the output of a hard-coded prompt. + """ + if file is None: + file = warning_stream + try: + file.write(idle_formatwarning( + message, category, filename, lineno, line=line)) + file.write(">>> ") + except (AttributeError, IOError): + pass # if file (probably __stderr__) is invalid, skip warning. + +_warnings_showwarning = None + +def capture_warnings(capture): + "Replace warning.showwarning with idle_showwarning, or reverse." + + global _warnings_showwarning + if capture: + if _warnings_showwarning is None: + _warnings_showwarning = warnings.showwarning + warnings.showwarning = idle_showwarning + else: + if _warnings_showwarning is not None: + warnings.showwarning = _warnings_showwarning + _warnings_showwarning = None + +capture_warnings(True) + +def extended_linecache_checkcache(filename=None, + orig_checkcache=linecache.checkcache): + """Extend linecache.checkcache to preserve the entries + + Rather than repeating the linecache code, patch it to save the + entries, call the original linecache.checkcache() + (skipping them), and then restore the saved entries. + + orig_checkcache is bound at definition time to the original + method, allowing it to be patched. + """ + cache = linecache.cache + save = {} + for key in list(cache): + if key[:1] + key[-1:] == '<>': + save[key] = cache.pop(key) + orig_checkcache(filename) + cache.update(save) + +# Patch linecache.checkcache(): +linecache.checkcache = extended_linecache_checkcache + + +class PyShellEditorWindow(EditorWindow): + "Regular text edit window in IDLE, supports breakpoints" + + def __init__(self, *args): + self.breakpoints = [] + EditorWindow.__init__(self, *args) + self.text.bind("<>", self.set_breakpoint_here) + self.text.bind("<>", self.clear_breakpoint_here) + self.text.bind("<>", self.flist.open_shell) + + self.breakpointPath = os.path.join(idleConf.GetUserCfgDir(), + 'breakpoints.lst') + # whenever a file is changed, restore breakpoints + def filename_changed_hook(old_hook=self.io.filename_change_hook, + self=self): + self.restore_file_breaks() + old_hook() + self.io.set_filename_change_hook(filename_changed_hook) + if self.io.filename: + self.restore_file_breaks() + self.color_breakpoint_text() + + rmenu_specs = [ + ("Cut", "<>", "rmenu_check_cut"), + ("Copy", "<>", "rmenu_check_copy"), + ("Paste", "<>", "rmenu_check_paste"), + ("Set Breakpoint", "<>", None), + ("Clear Breakpoint", "<>", None) + ] + + def color_breakpoint_text(self, color=True): + "Turn colorizing of breakpoint text on or off" + if self.io is None: + # possible due to update in restore_file_breaks + return + if color: + theme = idleConf.CurrentTheme() + cfg = idleConf.GetHighlight(theme, "break") + else: + cfg = {'foreground': '', 'background': ''} + self.text.tag_config('BREAK', cfg) + + def set_breakpoint(self, lineno): + text = self.text + filename = self.io.filename + text.tag_add("BREAK", "%d.0" % lineno, "%d.0" % (lineno+1)) + try: + self.breakpoints.index(lineno) + except ValueError: # only add if missing, i.e. do once + self.breakpoints.append(lineno) + try: # update the subprocess debugger + debug = self.flist.pyshell.interp.debugger + debug.set_breakpoint_here(filename, lineno) + except: # but debugger may not be active right now.... + pass + + def set_breakpoint_here(self, event=None): + text = self.text + filename = self.io.filename + if not filename: + text.bell() + return + lineno = int(float(text.index("insert"))) + self.set_breakpoint(lineno) + + def clear_breakpoint_here(self, event=None): + text = self.text + filename = self.io.filename + if not filename: + text.bell() + return + lineno = int(float(text.index("insert"))) + try: + self.breakpoints.remove(lineno) + except: + pass + text.tag_remove("BREAK", "insert linestart",\ + "insert lineend +1char") + try: + debug = self.flist.pyshell.interp.debugger + debug.clear_breakpoint_here(filename, lineno) + except: + pass + + def clear_file_breaks(self): + if self.breakpoints: + text = self.text + filename = self.io.filename + if not filename: + text.bell() + return + self.breakpoints = [] + text.tag_remove("BREAK", "1.0", END) + try: + debug = self.flist.pyshell.interp.debugger + debug.clear_file_breaks(filename) + except: + pass + + def store_file_breaks(self): + "Save breakpoints when file is saved" + # XXX 13 Dec 2002 KBK Currently the file must be saved before it can + # be run. The breaks are saved at that time. If we introduce + # a temporary file save feature the save breaks functionality + # needs to be re-verified, since the breaks at the time the + # temp file is created may differ from the breaks at the last + # permanent save of the file. Currently, a break introduced + # after a save will be effective, but not persistent. + # This is necessary to keep the saved breaks synched with the + # saved file. + # + # Breakpoints are set as tagged ranges in the text. + # Since a modified file has to be saved before it is + # run, and since self.breakpoints (from which the subprocess + # debugger is loaded) is updated during the save, the visible + # breaks stay synched with the subprocess even if one of these + # unexpected breakpoint deletions occurs. + breaks = self.breakpoints + filename = self.io.filename + try: + with open(self.breakpointPath,"r") as old_file: + lines = old_file.readlines() + except IOError: + lines = [] + try: + with open(self.breakpointPath,"w") as new_file: + for line in lines: + if not line.startswith(filename + '='): + new_file.write(line) + self.update_breakpoints() + breaks = self.breakpoints + if breaks: + new_file.write(filename + '=' + str(breaks) + '\n') + except IOError as err: + if not getattr(self.root, "breakpoint_error_displayed", False): + self.root.breakpoint_error_displayed = True + tkMessageBox.showerror(title='IDLE Error', + message='Unable to update breakpoint list:\n%s' + % str(err), + parent=self.text) + + def restore_file_breaks(self): + self.text.update() # this enables setting "BREAK" tags to be visible + if self.io is None: + # can happen if IDLE closes due to the .update() call + return + filename = self.io.filename + if filename is None: + return + if os.path.isfile(self.breakpointPath): + lines = open(self.breakpointPath,"r").readlines() + for line in lines: + if line.startswith(filename + '='): + breakpoint_linenumbers = eval(line[len(filename)+1:]) + for breakpoint_linenumber in breakpoint_linenumbers: + self.set_breakpoint(breakpoint_linenumber) + + def update_breakpoints(self): + "Retrieves all the breakpoints in the current window" + text = self.text + ranges = text.tag_ranges("BREAK") + linenumber_list = self.ranges_to_linenumbers(ranges) + self.breakpoints = linenumber_list + + def ranges_to_linenumbers(self, ranges): + lines = [] + for index in range(0, len(ranges), 2): + lineno = int(float(ranges[index].string)) + end = int(float(ranges[index+1].string)) + while lineno < end: + lines.append(lineno) + lineno += 1 + return lines + +# XXX 13 Dec 2002 KBK Not used currently +# def saved_change_hook(self): +# "Extend base method - clear breaks if module is modified" +# if not self.get_saved(): +# self.clear_file_breaks() +# EditorWindow.saved_change_hook(self) + + def _close(self): + "Extend base method - clear breaks when module is closed" + self.clear_file_breaks() + EditorWindow._close(self) + + +class PyShellFileList(FileList): + "Extend base class: IDLE supports a shell and breakpoints" + + # override FileList's class variable, instances return PyShellEditorWindow + # instead of EditorWindow when new edit windows are created. + EditorWindow = PyShellEditorWindow + + pyshell = None + + def open_shell(self, event=None): + if self.pyshell: + self.pyshell.top.wakeup() + else: + self.pyshell = PyShell(self) + if self.pyshell: + if not self.pyshell.begin(): + return None + return self.pyshell + + +class ModifiedColorDelegator(ColorDelegator): + "Extend base class: colorizer for the shell window itself" + + def __init__(self): + ColorDelegator.__init__(self) + self.LoadTagDefs() + + def recolorize_main(self): + self.tag_remove("TODO", "1.0", "iomark") + self.tag_add("SYNC", "1.0", "iomark") + ColorDelegator.recolorize_main(self) + + def LoadTagDefs(self): + ColorDelegator.LoadTagDefs(self) + theme = idleConf.CurrentTheme() + self.tagdefs.update({ + "stdin": {'background':None,'foreground':None}, + "stdout": idleConf.GetHighlight(theme, "stdout"), + "stderr": idleConf.GetHighlight(theme, "stderr"), + "console": idleConf.GetHighlight(theme, "console"), + }) + + def removecolors(self): + # Don't remove shell color tags before "iomark" + for tag in self.tagdefs: + self.tag_remove(tag, "iomark", "end") + +class ModifiedUndoDelegator(UndoDelegator): + "Extend base class: forbid insert/delete before the I/O mark" + + def insert(self, index, chars, tags=None): + try: + if self.delegate.compare(index, "<", "iomark"): + self.delegate.bell() + return + except TclError: + pass + UndoDelegator.insert(self, index, chars, tags) + + def delete(self, index1, index2=None): + try: + if self.delegate.compare(index1, "<", "iomark"): + self.delegate.bell() + return + except TclError: + pass + UndoDelegator.delete(self, index1, index2) + + +class MyRPCClient(rpc.RPCClient): + + def handle_EOF(self): + "Override the base class - just re-raise EOFError" + raise EOFError + + +class ModifiedInterpreter(InteractiveInterpreter): + + def __init__(self, tkconsole): + self.tkconsole = tkconsole + locals = sys.modules['__main__'].__dict__ + InteractiveInterpreter.__init__(self, locals=locals) + self.save_warnings_filters = None + self.restarting = False + self.subprocess_arglist = None + self.port = PORT + self.original_compiler_flags = self.compile.compiler.flags + + _afterid = None + rpcclt = None + rpcpid = None + + def spawn_subprocess(self): + if self.subprocess_arglist is None: + self.subprocess_arglist = self.build_subprocess_arglist() + args = self.subprocess_arglist + self.rpcpid = os.spawnv(os.P_NOWAIT, sys.executable, args) + + def build_subprocess_arglist(self): + assert (self.port!=0), ( + "Socket should have been assigned a port number.") + w = ['-W' + s for s in sys.warnoptions] + if 1/2 > 0: # account for new division + w.append('-Qnew') + # Maybe IDLE is installed and is being accessed via sys.path, + # or maybe it's not installed and the idle.py script is being + # run from the IDLE source directory. + del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', + default=False, type='bool') + if __name__ == 'idlelib.PyShell': + command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) + else: + command = "__import__('run').main(%r)" % (del_exitf,) + if sys.platform[:3] == 'win' and ' ' in sys.executable: + # handle embedded space in path by quoting the argument + decorated_exec = '"%s"' % sys.executable + else: + decorated_exec = sys.executable + return [decorated_exec] + w + ["-c", command, str(self.port)] + + def start_subprocess(self): + addr = (HOST, self.port) + # GUI makes several attempts to acquire socket, listens for connection + for i in range(3): + time.sleep(i) + try: + self.rpcclt = MyRPCClient(addr) + break + except socket.error: + pass + else: + self.display_port_binding_error() + return None + # if PORT was 0, system will assign an 'ephemeral' port. Find it out: + self.port = self.rpcclt.listening_sock.getsockname()[1] + # if PORT was not 0, probably working with a remote execution server + if PORT != 0: + # To allow reconnection within the 2MSL wait (cf. Stevens TCP + # V1, 18.6), set SO_REUSEADDR. Note that this can be problematic + # on Windows since the implementation allows two active sockets on + # the same address! + self.rpcclt.listening_sock.setsockopt(socket.SOL_SOCKET, + socket.SO_REUSEADDR, 1) + self.spawn_subprocess() + #time.sleep(20) # test to simulate GUI not accepting connection + # Accept the connection from the Python execution server + self.rpcclt.listening_sock.settimeout(10) + try: + self.rpcclt.accept() + except socket.timeout: + self.display_no_subprocess_error() + return None + self.rpcclt.register("console", self.tkconsole) + self.rpcclt.register("stdin", self.tkconsole.stdin) + self.rpcclt.register("stdout", self.tkconsole.stdout) + self.rpcclt.register("stderr", self.tkconsole.stderr) + self.rpcclt.register("flist", self.tkconsole.flist) + self.rpcclt.register("linecache", linecache) + self.rpcclt.register("interp", self) + self.transfer_path(with_cwd=True) + self.poll_subprocess() + return self.rpcclt + + def restart_subprocess(self, with_cwd=False, filename=''): + if self.restarting: + return self.rpcclt + self.restarting = True + # close only the subprocess debugger + debug = self.getdebugger() + if debug: + try: + # Only close subprocess debugger, don't unregister gui_adap! + RemoteDebugger.close_subprocess_debugger(self.rpcclt) + except: + pass + # Kill subprocess, spawn a new one, accept connection. + self.rpcclt.close() + self.unix_terminate() + console = self.tkconsole + was_executing = console.executing + console.executing = False + self.spawn_subprocess() + try: + self.rpcclt.accept() + except socket.timeout: + self.display_no_subprocess_error() + return None + self.transfer_path(with_cwd=with_cwd) + console.stop_readline() + # annotate restart in shell window and mark it + console.text.delete("iomark", "end-1c") + tag = 'RESTART: ' + (filename if filename else 'Shell') + halfbar = ((int(console.width) -len(tag) - 4) // 2) * '=' + console.write("\n{0} {1} {0}".format(halfbar, tag)) + console.text.mark_set("restart", "end-1c") + console.text.mark_gravity("restart", "left") + if not filename: + console.showprompt() + # restart subprocess debugger + if debug: + # Restarted debugger connects to current instance of debug GUI + RemoteDebugger.restart_subprocess_debugger(self.rpcclt) + # reload remote debugger breakpoints for all PyShellEditWindows + debug.load_breakpoints() + self.compile.compiler.flags = self.original_compiler_flags + self.restarting = False + return self.rpcclt + + def __request_interrupt(self): + self.rpcclt.remotecall("exec", "interrupt_the_server", (), {}) + + def interrupt_subprocess(self): + threading.Thread(target=self.__request_interrupt).start() + + def kill_subprocess(self): + if self._afterid is not None: + self.tkconsole.text.after_cancel(self._afterid) + try: + self.rpcclt.close() + except AttributeError: # no socket + pass + self.unix_terminate() + self.tkconsole.executing = False + self.rpcclt = None + + def unix_terminate(self): + "UNIX: make sure subprocess is terminated and collect status" + if hasattr(os, 'kill'): + try: + os.kill(self.rpcpid, SIGTERM) + except OSError: + # process already terminated: + return + else: + try: + os.waitpid(self.rpcpid, 0) + except OSError: + return + + def transfer_path(self, with_cwd=False): + if with_cwd: # Issue 13506 + path = [''] # include Current Working Directory + path.extend(sys.path) + else: + path = sys.path + + self.runcommand("""if 1: + import sys as _sys + _sys.path = %r + del _sys + \n""" % (path,)) + + active_seq = None + + def poll_subprocess(self): + clt = self.rpcclt + if clt is None: + return + try: + response = clt.pollresponse(self.active_seq, wait=0.05) + except (EOFError, IOError, KeyboardInterrupt): + # lost connection or subprocess terminated itself, restart + # [the KBI is from rpc.SocketIO.handle_EOF()] + if self.tkconsole.closing: + return + response = None + self.restart_subprocess() + if response: + self.tkconsole.resetoutput() + self.active_seq = None + how, what = response + console = self.tkconsole.console + if how == "OK": + if what is not None: + print(repr(what), file=console) + elif how == "EXCEPTION": + if self.tkconsole.getvar("<>"): + self.remote_stack_viewer() + elif how == "ERROR": + errmsg = "PyShell.ModifiedInterpreter: Subprocess ERROR:\n" + print(errmsg, what, file=sys.__stderr__) + print(errmsg, what, file=console) + # we received a response to the currently active seq number: + try: + self.tkconsole.endexecuting() + except AttributeError: # shell may have closed + pass + # Reschedule myself + if not self.tkconsole.closing: + self._afterid = self.tkconsole.text.after( + self.tkconsole.pollinterval, self.poll_subprocess) + + debugger = None + + def setdebugger(self, debugger): + self.debugger = debugger + + def getdebugger(self): + return self.debugger + + def open_remote_stack_viewer(self): + """Initiate the remote stack viewer from a separate thread. + + This method is called from the subprocess, and by returning from this + method we allow the subprocess to unblock. After a bit the shell + requests the subprocess to open the remote stack viewer which returns a + static object looking at the last exception. It is queried through + the RPC mechanism. + + """ + self.tkconsole.text.after(300, self.remote_stack_viewer) + return + + def remote_stack_viewer(self): + from idlelib import RemoteObjectBrowser + oid = self.rpcclt.remotequeue("exec", "stackviewer", ("flist",), {}) + if oid is None: + self.tkconsole.root.bell() + return + item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid) + from idlelib.TreeWidget import ScrolledCanvas, TreeNode + top = Toplevel(self.tkconsole.root) + theme = idleConf.CurrentTheme() + background = idleConf.GetHighlight(theme, 'normal')['background'] + sc = ScrolledCanvas(top, bg=background, highlightthickness=0) + sc.frame.pack(expand=1, fill="both") + node = TreeNode(sc.canvas, None, item) + node.expand() + # XXX Should GC the remote tree when closing the window + + gid = 0 + + def execsource(self, source): + "Like runsource() but assumes complete exec source" + filename = self.stuffsource(source) + self.execfile(filename, source) + + def execfile(self, filename, source=None): + "Execute an existing file" + if source is None: + source = open(filename, "r").read() + try: + code = compile(source, filename, "exec", dont_inherit=True) + except (OverflowError, SyntaxError): + self.tkconsole.resetoutput() + print('*** Error in script or command!\n' + 'Traceback (most recent call last):', + file=self.tkconsole.stderr) + InteractiveInterpreter.showsyntaxerror(self, filename) + self.tkconsole.showprompt() + else: + self.runcode(code) + + def runsource(self, source): + "Extend base class method: Stuff the source in the line cache first" + filename = self.stuffsource(source) + self.more = 0 + self.save_warnings_filters = warnings.filters[:] + warnings.filterwarnings(action="error", category=SyntaxWarning) + if isinstance(source, unicode) and IOBinding.encoding != 'utf-8': + try: + source = '# -*- coding: %s -*-\n%s' % ( + IOBinding.encoding, + source.encode(IOBinding.encoding)) + except UnicodeError: + self.tkconsole.resetoutput() + self.write("Unsupported characters in input\n") + return + try: + # InteractiveInterpreter.runsource() calls its runcode() method, + # which is overridden (see below) + return InteractiveInterpreter.runsource(self, source, filename) + finally: + if self.save_warnings_filters is not None: + warnings.filters[:] = self.save_warnings_filters + self.save_warnings_filters = None + + def stuffsource(self, source): + "Stuff source in the filename cache" + filename = "" % self.gid + self.gid = self.gid + 1 + lines = source.split("\n") + linecache.cache[filename] = len(source)+1, 0, lines, filename + return filename + + def prepend_syspath(self, filename): + "Prepend sys.path with file's directory if not already included" + self.runcommand("""if 1: + _filename = %r + import sys as _sys + from os.path import dirname as _dirname + _dir = _dirname(_filename) + if not _dir in _sys.path: + _sys.path.insert(0, _dir) + del _filename, _sys, _dirname, _dir + \n""" % (filename,)) + + def showsyntaxerror(self, filename=None): + """Extend base class method: Add Colorizing + + Color the offending position instead of printing it and pointing at it + with a caret. + + """ + text = self.tkconsole.text + stuff = self.unpackerror() + if stuff: + msg, lineno, offset, line = stuff + if lineno == 1: + pos = "iomark + %d chars" % (offset-1) + else: + pos = "iomark linestart + %d lines + %d chars" % \ + (lineno-1, offset-1) + text.tag_add("ERROR", pos) + text.see(pos) + char = text.get(pos) + if char and char in IDENTCHARS: + text.tag_add("ERROR", pos + " wordstart", pos) + self.tkconsole.resetoutput() + self.write("SyntaxError: %s\n" % str(msg)) + else: + self.tkconsole.resetoutput() + InteractiveInterpreter.showsyntaxerror(self, filename) + self.tkconsole.showprompt() + + def unpackerror(self): + type, value, tb = sys.exc_info() + ok = type is SyntaxError + if ok: + try: + msg, (dummy_filename, lineno, offset, line) = value + if not offset: + offset = 0 + except: + ok = 0 + if ok: + return msg, lineno, offset, line + else: + return None + + def showtraceback(self): + "Extend base class method to reset output properly" + self.tkconsole.resetoutput() + self.checklinecache() + InteractiveInterpreter.showtraceback(self) + if self.tkconsole.getvar("<>"): + self.tkconsole.open_stack_viewer() + + def checklinecache(self): + c = linecache.cache + for key in c.keys(): + if key[:1] + key[-1:] != "<>": + del c[key] + + def runcommand(self, code): + "Run the code without invoking the debugger" + # The code better not raise an exception! + if self.tkconsole.executing: + self.display_executing_dialog() + return 0 + if self.rpcclt: + self.rpcclt.remotequeue("exec", "runcode", (code,), {}) + else: + exec code in self.locals + return 1 + + def runcode(self, code): + "Override base class method" + if self.tkconsole.executing: + self.interp.restart_subprocess() + self.checklinecache() + if self.save_warnings_filters is not None: + warnings.filters[:] = self.save_warnings_filters + self.save_warnings_filters = None + debugger = self.debugger + try: + self.tkconsole.beginexecuting() + if not debugger and self.rpcclt is not None: + self.active_seq = self.rpcclt.asyncqueue("exec", "runcode", + (code,), {}) + elif debugger: + debugger.run(code, self.locals) + else: + exec code in self.locals + except SystemExit: + if not self.tkconsole.closing: + if tkMessageBox.askyesno( + "Exit?", + "Do you want to exit altogether?", + default="yes", + parent=self.tkconsole.text): + raise + else: + self.showtraceback() + else: + raise + except: + if use_subprocess: + print("IDLE internal error in runcode()", + file=self.tkconsole.stderr) + self.showtraceback() + self.tkconsole.endexecuting() + else: + if self.tkconsole.canceled: + self.tkconsole.canceled = False + print("KeyboardInterrupt", file=self.tkconsole.stderr) + else: + self.showtraceback() + finally: + if not use_subprocess: + try: + self.tkconsole.endexecuting() + except AttributeError: # shell may have closed + pass + + def write(self, s): + "Override base class method" + self.tkconsole.stderr.write(s) + + def display_port_binding_error(self): + tkMessageBox.showerror( + "Port Binding Error", + "IDLE can't bind to a TCP/IP port, which is necessary to " + "communicate with its Python execution server. This might be " + "because no networking is installed on this computer. " + "Run IDLE with the -n command line switch to start without a " + "subprocess and refer to Help/IDLE Help 'Running without a " + "subprocess' for further details.", + parent=self.tkconsole.text) + + def display_no_subprocess_error(self): + tkMessageBox.showerror( + "Subprocess Startup Error", + "IDLE's subprocess didn't make connection. Either IDLE can't " + "start a subprocess or personal firewall software is blocking " + "the connection.", + parent=self.tkconsole.text) + + def display_executing_dialog(self): + tkMessageBox.showerror( + "Already executing", + "The Python Shell window is already executing a command; " + "please wait until it is finished.", + parent=self.tkconsole.text) + + +class PyShell(OutputWindow): + + shell_title = "Python " + python_version() + " Shell" + + # Override classes + ColorDelegator = ModifiedColorDelegator + UndoDelegator = ModifiedUndoDelegator + + # Override menus + menu_specs = [ + ("file", "_File"), + ("edit", "_Edit"), + ("debug", "_Debug"), + ("options", "_Options"), + ("windows", "_Window"), + ("help", "_Help"), + ] + + + # New classes + from idlelib.IdleHistory import History + + def __init__(self, flist=None): + if use_subprocess: + ms = self.menu_specs + if ms[2][0] != "shell": + ms.insert(2, ("shell", "She_ll")) + self.interp = ModifiedInterpreter(self) + if flist is None: + root = Tk() + fixwordbreaks(root) + root.withdraw() + flist = PyShellFileList(root) + # + OutputWindow.__init__(self, flist, None, None) + # +## self.config(usetabs=1, indentwidth=8, context_use_ps1=1) + self.usetabs = True + # indentwidth must be 8 when using tabs. See note in EditorWindow: + self.indentwidth = 8 + self.context_use_ps1 = True + # + text = self.text + text.configure(wrap="char") + text.bind("<>", self.enter_callback) + text.bind("<>", self.linefeed_callback) + text.bind("<>", self.cancel_callback) + text.bind("<>", self.eof_callback) + text.bind("<>", self.open_stack_viewer) + text.bind("<>", self.toggle_debugger) + text.bind("<>", self.toggle_jit_stack_viewer) + if use_subprocess: + text.bind("<>", self.view_restart_mark) + text.bind("<>", self.restart_shell) + # + self.save_stdout = sys.stdout + self.save_stderr = sys.stderr + self.save_stdin = sys.stdin + from idlelib import IOBinding + self.stdin = PseudoInputFile(self, "stdin", IOBinding.encoding) + self.stdout = PseudoOutputFile(self, "stdout", IOBinding.encoding) + self.stderr = PseudoOutputFile(self, "stderr", IOBinding.encoding) + self.console = PseudoOutputFile(self, "console", IOBinding.encoding) + if not use_subprocess: + sys.stdout = self.stdout + sys.stderr = self.stderr + sys.stdin = self.stdin + # + self.history = self.History(self.text) + # + self.pollinterval = 50 # millisec + + def get_standard_extension_names(self): + return idleConf.GetExtensions(shell_only=True) + + reading = False + executing = False + canceled = False + endoffile = False + closing = False + _stop_readline_flag = False + + def set_warning_stream(self, stream): + global warning_stream + warning_stream = stream + + def get_warning_stream(self): + return warning_stream + + def toggle_debugger(self, event=None): + if self.executing: + tkMessageBox.showerror("Don't debug now", + "You can only toggle the debugger when idle", + parent=self.text) + self.set_debugger_indicator() + return "break" + else: + db = self.interp.getdebugger() + if db: + self.close_debugger() + else: + self.open_debugger() + + def set_debugger_indicator(self): + db = self.interp.getdebugger() + self.setvar("<>", not not db) + + def toggle_jit_stack_viewer(self, event=None): + pass # All we need is the variable + + def close_debugger(self): + db = self.interp.getdebugger() + if db: + self.interp.setdebugger(None) + db.close() + if self.interp.rpcclt: + RemoteDebugger.close_remote_debugger(self.interp.rpcclt) + self.resetoutput() + self.console.write("[DEBUG OFF]\n") + sys.ps1 = ">>> " + self.showprompt() + self.set_debugger_indicator() + + def open_debugger(self): + if self.interp.rpcclt: + dbg_gui = RemoteDebugger.start_remote_debugger(self.interp.rpcclt, + self) + else: + dbg_gui = Debugger.Debugger(self) + self.interp.setdebugger(dbg_gui) + dbg_gui.load_breakpoints() + sys.ps1 = "[DEBUG ON]\n>>> " + self.showprompt() + self.set_debugger_indicator() + + def beginexecuting(self): + "Helper for ModifiedInterpreter" + self.resetoutput() + self.executing = 1 + + def endexecuting(self): + "Helper for ModifiedInterpreter" + self.executing = 0 + self.canceled = 0 + self.showprompt() + + def close(self): + "Extend EditorWindow.close()" + if self.executing: + response = tkMessageBox.askokcancel( + "Kill?", + "Your program is still running!\n Do you want to kill it?", + default="ok", + parent=self.text) + if response is False: + return "cancel" + self.stop_readline() + self.canceled = True + self.closing = True + return EditorWindow.close(self) + + def _close(self): + "Extend EditorWindow._close(), shut down debugger and execution server" + self.close_debugger() + if use_subprocess: + self.interp.kill_subprocess() + # Restore std streams + sys.stdout = self.save_stdout + sys.stderr = self.save_stderr + sys.stdin = self.save_stdin + # Break cycles + self.interp = None + self.console = None + self.flist.pyshell = None + self.history = None + EditorWindow._close(self) + + def ispythonsource(self, filename): + "Override EditorWindow method: never remove the colorizer" + return True + + def short_title(self): + return self.shell_title + + COPYRIGHT = \ + 'Type "copyright", "credits" or "license()" for more information.' + + def begin(self): + self.resetoutput() + if use_subprocess: + nosub = '' + client = self.interp.start_subprocess() + if not client: + self.close() + return False + else: + nosub = "==== No Subprocess ====" + self.write("Python %s on %s\n%s\n%s" % + (sys.version, sys.platform, self.COPYRIGHT, nosub)) + self.text.focus_force() + self.showprompt() + import Tkinter + Tkinter._default_root = None # 03Jan04 KBK What's this? + return True + + def stop_readline(self): + if not self.reading: # no nested mainloop to exit. + return + self._stop_readline_flag = True + self.top.quit() + + def readline(self): + save = self.reading + try: + self.reading = 1 + self.top.mainloop() # nested mainloop() + finally: + self.reading = save + if self._stop_readline_flag: + self._stop_readline_flag = False + return "" + line = self.text.get("iomark", "end-1c") + if len(line) == 0: # may be EOF if we quit our mainloop with Ctrl-C + line = "\n" + if isinstance(line, unicode): + from idlelib import IOBinding + try: + line = line.encode(IOBinding.encoding) + except UnicodeError: + pass + self.resetoutput() + if self.canceled: + self.canceled = 0 + if not use_subprocess: + raise KeyboardInterrupt + if self.endoffile: + self.endoffile = 0 + line = "" + return line + + def isatty(self): + return True + + def cancel_callback(self, event=None): + try: + if self.text.compare("sel.first", "!=", "sel.last"): + return # Active selection -- always use default binding + except: + pass + if not (self.executing or self.reading): + self.resetoutput() + self.interp.write("KeyboardInterrupt\n") + self.showprompt() + return "break" + self.endoffile = 0 + self.canceled = 1 + if (self.executing and self.interp.rpcclt): + if self.interp.getdebugger(): + self.interp.restart_subprocess() + else: + self.interp.interrupt_subprocess() + if self.reading: + self.top.quit() # exit the nested mainloop() in readline() + return "break" + + def eof_callback(self, event): + if self.executing and not self.reading: + return # Let the default binding (delete next char) take over + if not (self.text.compare("iomark", "==", "insert") and + self.text.compare("insert", "==", "end-1c")): + return # Let the default binding (delete next char) take over + if not self.executing: + self.resetoutput() + self.close() + else: + self.canceled = 0 + self.endoffile = 1 + self.top.quit() + return "break" + + def linefeed_callback(self, event): + # Insert a linefeed without entering anything (still autoindented) + if self.reading: + self.text.insert("insert", "\n") + self.text.see("insert") + else: + self.newline_and_indent_event(event) + return "break" + + def enter_callback(self, event): + if self.executing and not self.reading: + return # Let the default binding (insert '\n') take over + # If some text is selected, recall the selection + # (but only if this before the I/O mark) + try: + sel = self.text.get("sel.first", "sel.last") + if sel: + if self.text.compare("sel.last", "<=", "iomark"): + self.recall(sel, event) + return "break" + except: + pass + # If we're strictly before the line containing iomark, recall + # the current line, less a leading prompt, less leading or + # trailing whitespace + if self.text.compare("insert", "<", "iomark linestart"): + # Check if there's a relevant stdin range -- if so, use it + prev = self.text.tag_prevrange("stdin", "insert") + if prev and self.text.compare("insert", "<", prev[1]): + self.recall(self.text.get(prev[0], prev[1]), event) + return "break" + next = self.text.tag_nextrange("stdin", "insert") + if next and self.text.compare("insert lineend", ">=", next[0]): + self.recall(self.text.get(next[0], next[1]), event) + return "break" + # No stdin mark -- just get the current line, less any prompt + indices = self.text.tag_nextrange("console", "insert linestart") + if indices and \ + self.text.compare(indices[0], "<=", "insert linestart"): + self.recall(self.text.get(indices[1], "insert lineend"), event) + else: + self.recall(self.text.get("insert linestart", "insert lineend"), event) + return "break" + # If we're between the beginning of the line and the iomark, i.e. + # in the prompt area, move to the end of the prompt + if self.text.compare("insert", "<", "iomark"): + self.text.mark_set("insert", "iomark") + # If we're in the current input and there's only whitespace + # beyond the cursor, erase that whitespace first + s = self.text.get("insert", "end-1c") + if s and not s.strip(): + self.text.delete("insert", "end-1c") + # If we're in the current input before its last line, + # insert a newline right at the insert point + if self.text.compare("insert", "<", "end-1c linestart"): + self.newline_and_indent_event(event) + return "break" + # We're in the last line; append a newline and submit it + self.text.mark_set("insert", "end-1c") + if self.reading: + self.text.insert("insert", "\n") + self.text.see("insert") + else: + self.newline_and_indent_event(event) + self.text.tag_add("stdin", "iomark", "end-1c") + self.text.update_idletasks() + if self.reading: + self.top.quit() # Break out of recursive mainloop() in raw_input() + else: + self.runit() + return "break" + + def recall(self, s, event): + # remove leading and trailing empty or whitespace lines + s = re.sub(r'^\s*\n', '' , s) + s = re.sub(r'\n\s*$', '', s) + lines = s.split('\n') + self.text.undo_block_start() + try: + self.text.tag_remove("sel", "1.0", "end") + self.text.mark_set("insert", "end-1c") + prefix = self.text.get("insert linestart", "insert") + if prefix.rstrip().endswith(':'): + self.newline_and_indent_event(event) + prefix = self.text.get("insert linestart", "insert") + self.text.insert("insert", lines[0].strip()) + if len(lines) > 1: + orig_base_indent = re.search(r'^([ \t]*)', lines[0]).group(0) + new_base_indent = re.search(r'^([ \t]*)', prefix).group(0) + for line in lines[1:]: + if line.startswith(orig_base_indent): + # replace orig base indentation with new indentation + line = new_base_indent + line[len(orig_base_indent):] + self.text.insert('insert', '\n'+line.rstrip()) + finally: + self.text.see("insert") + self.text.undo_block_stop() + + def runit(self): + line = self.text.get("iomark", "end-1c") + # Strip off last newline and surrounding whitespace. + # (To allow you to hit return twice to end a statement.) + i = len(line) + while i > 0 and line[i-1] in " \t": + i = i-1 + if i > 0 and line[i-1] == "\n": + i = i-1 + while i > 0 and line[i-1] in " \t": + i = i-1 + line = line[:i] + self.interp.runsource(line) + + def open_stack_viewer(self, event=None): + if self.interp.rpcclt: + return self.interp.remote_stack_viewer() + try: + sys.last_traceback + except: + tkMessageBox.showerror("No stack trace", + "There is no stack trace yet.\n" + "(sys.last_traceback is not defined)", + parent=self.text) + return + from idlelib.StackViewer import StackBrowser + StackBrowser(self.root, self.flist) + + def view_restart_mark(self, event=None): + self.text.see("iomark") + self.text.see("restart") + + def restart_shell(self, event=None): + "Callback for Run/Restart Shell Cntl-F6" + self.interp.restart_subprocess(with_cwd=True) + + def showprompt(self): + self.resetoutput() + try: + s = str(sys.ps1) + except: + s = "" + self.console.write(s) + self.text.mark_set("insert", "end-1c") + self.set_line_and_column() + self.io.reset_undo() + + def resetoutput(self): + source = self.text.get("iomark", "end-1c") + if self.history: + self.history.store(source) + if self.text.get("end-2c") != "\n": + self.text.insert("end-1c", "\n") + self.text.mark_set("iomark", "end-1c") + self.set_line_and_column() + sys.stdout.softspace = 0 + + def write(self, s, tags=()): + try: + self.text.mark_gravity("iomark", "right") + OutputWindow.write(self, s, tags, "iomark") + self.text.mark_gravity("iomark", "left") + except: + pass + if self.canceled: + self.canceled = 0 + if not use_subprocess: + raise KeyboardInterrupt + + def rmenu_check_cut(self): + try: + if self.text.compare('sel.first', '<', 'iomark'): + return 'disabled' + except TclError: # no selection, so the index 'sel.first' doesn't exist + return 'disabled' + return super(PyShell, self).rmenu_check_cut() + + def rmenu_check_paste(self): + if self.text.compare('insert', '<', 'iomark'): + return 'disabled' + return super(PyShell, self).rmenu_check_paste() + +class PseudoFile(io.TextIOBase): + + def __init__(self, shell, tags, encoding=None): + self.shell = shell + self.tags = tags + self.softspace = 0 + self._encoding = encoding + + @property + def encoding(self): + return self._encoding + + @property + def name(self): + return '<%s>' % self.tags + + def isatty(self): + return True + + +class PseudoOutputFile(PseudoFile): + + def writable(self): + return True + + def write(self, s): + if self.closed: + raise ValueError("write to closed file") + if type(s) not in (unicode, str, bytearray): + # See issue #19481 + if isinstance(s, unicode): + s = unicode.__getitem__(s, slice(None)) + elif isinstance(s, str): + s = str.__str__(s) + elif isinstance(s, bytearray): + s = bytearray.__str__(s) + else: + raise TypeError('must be string, not ' + type(s).__name__) + return self.shell.write(s, self.tags) + + +class PseudoInputFile(PseudoFile): + + def __init__(self, shell, tags, encoding=None): + PseudoFile.__init__(self, shell, tags, encoding) + self._line_buffer = '' + + def readable(self): + return True + + def read(self, size=-1): + if self.closed: + raise ValueError("read from closed file") + if size is None: + size = -1 + elif not isinstance(size, int): + raise TypeError('must be int, not ' + type(size).__name__) + result = self._line_buffer + self._line_buffer = '' + if size < 0: + while True: + line = self.shell.readline() + if not line: break + result += line + else: + while len(result) < size: + line = self.shell.readline() + if not line: break + result += line + self._line_buffer = result[size:] + result = result[:size] + return result + + def readline(self, size=-1): + if self.closed: + raise ValueError("read from closed file") + if size is None: + size = -1 + elif not isinstance(size, int): + raise TypeError('must be int, not ' + type(size).__name__) + line = self._line_buffer or self.shell.readline() + if size < 0: + size = len(line) + eol = line.find('\n', 0, size) + if eol >= 0: + size = eol + 1 + self._line_buffer = line[size:] + return line[:size] + + def close(self): + self.shell.close() + + +usage_msg = """\ + +USAGE: idle [-deins] [-t title] [file]* + idle [-dns] [-t title] (-c cmd | -r file) [arg]* + idle [-dns] [-t title] - [arg]* + + -h print this help message and exit + -n run IDLE without a subprocess (see Help/IDLE Help for details) + +The following options will override the IDLE 'settings' configuration: + + -e open an edit window + -i open a shell window + +The following options imply -i and will open a shell: + + -c cmd run the command in a shell, or + -r file run script from file + + -d enable the debugger + -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else + -t title set title of shell window + +A default edit window will be bypassed when -c, -r, or - are used. + +[arg]* are passed to the command (-c) or script (-r) in sys.argv[1:]. + +Examples: + +idle + Open an edit window or shell depending on IDLE's configuration. + +idle foo.py foobar.py + Edit the files, also open a shell if configured to start with shell. + +idle -est "Baz" foo.py + Run $IDLESTARTUP or $PYTHONSTARTUP, edit foo.py, and open a shell + window with the title "Baz". + +idle -c "import sys; print sys.argv" "foo" + Open a shell window and run the command, passing "-c" in sys.argv[0] + and "foo" in sys.argv[1]. + +idle -d -s -r foo.py "Hello World" + Open a shell window, run a startup script, enable the debugger, and + run foo.py, passing "foo.py" in sys.argv[0] and "Hello World" in + sys.argv[1]. + +echo "import sys; print sys.argv" | idle - "foobar" + Open a shell window, run the script piped in, passing '' in sys.argv[0] + and "foobar" in sys.argv[1]. +""" + +def main( tkroot ): + global flist, root, use_subprocess + root = tkroot + + capture_warnings(True) + use_subprocess = True + enable_shell = False + enable_edit = False + debug = False + cmd = None + script = None + startup = False + try: + opts, args = getopt.getopt(sys.argv[1:], "c:deihnr:st:") + except getopt.error as msg: + print("Error: %s\n%s" % (msg, usage_msg), file=sys.stderr) + sys.exit(2) + for o, a in opts: + if o == '-c': + cmd = a + enable_shell = True + if o == '-d': + debug = True + enable_shell = True + if o == '-e': + enable_edit = True + if o == '-h': + sys.stdout.write(usage_msg) + sys.exit() + if o == '-i': + enable_shell = True + if o == '-n': + use_subprocess = False + if o == '-r': + script = a + if os.path.isfile(script): + pass + else: + print("No script file: ", script, file=sys.stderr) + sys.exit() + enable_shell = True + if o == '-s': + startup = True + enable_shell = True + if o == '-t': + PyShell.shell_title = a + enable_shell = True + if args and args[0] == '-': + cmd = sys.stdin.read() + enable_shell = True + # process sys.argv and sys.path: + for i in range(len(sys.path)): + sys.path[i] = os.path.abspath(sys.path[i]) + if args and args[0] == '-': + sys.argv = [''] + args[1:] + elif cmd: + sys.argv = ['-c'] + args + elif script: + sys.argv = [script] + args + elif args: + enable_edit = True + pathx = [] + for filename in args: + pathx.append(os.path.dirname(filename)) + for dir in pathx: + dir = os.path.abspath(dir) + if dir not in sys.path: + sys.path.insert(0, dir) + else: + dir = os.getcwd() + if not dir in sys.path: + sys.path.insert(0, dir) + # check the IDLE settings configuration (but command line overrides) + edit_start = idleConf.GetOption('main', 'General', + 'editor-on-startup', type='bool') + enable_edit = enable_edit or edit_start + enable_shell = enable_shell or not enable_edit + # start editor and/or shell windows: + + # set application icon + icondir = os.path.join(os.path.dirname(__file__), 'Icons') + if system() == 'Windows': + iconfile = os.path.join(icondir, 'idle.ico') + root.wm_iconbitmap(default=iconfile) + elif TkVersion >= 8.5: + ext = '.png' if TkVersion >= 8.6 else '.gif' + iconfiles = [os.path.join(icondir, 'idle_%d%s' % (size, ext)) + for size in (16, 32, 48)] + icons = [PhotoImage(file=iconfile) for iconfile in iconfiles] + root.tk.call('wm', 'iconphoto', str(root), "-default", *icons) + + fixwordbreaks(root) + root.withdraw() + flist = PyShellFileList(root) + macosxSupport.setupApp(root, flist) + + if macosxSupport.isAquaTk(): + # There are some screwed up <2> class bindings for text + # widgets defined in Tk which we need to do away with. + # See issue #24801. + root.unbind_class('Text', '') + root.unbind_class('Text', '') + root.unbind_class('Text', '<>') + + if enable_edit: + if not (cmd or script): + for filename in args[:]: + if flist.open(filename) is None: + # filename is a directory actually, disconsider it + args.remove(filename) + if not args: + flist.new() + + if enable_shell: + shell = flist.open_shell() + if not shell: + return # couldn't open shell + if macosxSupport.isAquaTk() and flist.dict: + # On OSX: when the user has double-clicked on a file that causes + # IDLE to be launched the shell window will open just in front of + # the file she wants to see. Lower the interpreter window when + # there are open files. + shell.top.lower() + else: + shell = flist.pyshell + + # Handle remaining options. If any of these are set, enable_shell + # was set also, so shell must be true to reach here. + if debug: + shell.open_debugger() + if startup: + filename = os.environ.get("IDLESTARTUP") or \ + os.environ.get("PYTHONSTARTUP") + if filename and os.path.isfile(filename): + shell.interp.execfile(filename) + if cmd or script: + shell.interp.runcommand("""if 1: + import sys as _sys + _sys.argv = %r + del _sys + \n""" % (sys.argv,)) + if cmd: + shell.interp.execsource(cmd) + elif script: + shell.interp.prepend_syspath(script) + shell.interp.execfile(script) + elif shell: + # If there is a shell window and no cmd or script in progress, + # check for problematic OS X Tk versions and print a warning + # message in the IDLE shell window; this is less intrusive + # than always opening a separate window. + tkversionwarning = macosxSupport.tkVersionWarning(root) + if tkversionwarning: + shell.interp.runcommand("print('%s')" % tkversionwarning) + + while flist.inversedict: # keep IDLE running while files are open. + root.mainloop() + root.destroy() + capture_warnings(False) + +if __name__ == "__main__": + sys.modules['PyShell'] = sys.modules['__main__'] + main() + +capture_warnings(False) # Make sure turned off; see issue 18081 diff --git a/build/lib/moosegui/__init__.py b/build/lib/moosegui/__init__.py new file mode 100644 index 0000000..8aa84f1 --- /dev/null +++ b/build/lib/moosegui/__init__.py @@ -0,0 +1 @@ +from moosegui.main import main diff --git a/build/lib/moosegui/_globals.py b/build/lib/moosegui/_globals.py new file mode 100644 index 0000000..509c58f --- /dev/null +++ b/build/lib/moosegui/_globals.py @@ -0,0 +1,29 @@ +"""globals.py: + +Keep all GUI global option here. + +""" + +__author__ = "Me" +__copyright__ = "Copyright 2016, Me" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Me" +__email__ = "" +__status__ = "Development" + +import sys +import os + +# root +root_ = None + +# Main canvas. +canvas_ = None + +# Main canvas. +toolbar_ = None + +# Status bar +statusbar_ = None diff --git a/build/lib/moosegui/canvas.py b/build/lib/moosegui/canvas.py new file mode 100644 index 0000000..3bae5b4 --- /dev/null +++ b/build/lib/moosegui/canvas.py @@ -0,0 +1,71 @@ +""" +Add canvas + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import sys +import os +import logging + +import moosegui._globals +from moosegui.MooseCanvas import MooseCanvas + +try: + from Tkinter import * +except ImportError as e: + from tkinter import * + +class StatusBar(Frame): + + def __init__(self, master): + Frame.__init__(self, master) + self.label = Label(self, bd = 1, relief = SUNKEN, anchor = W) + self.label.config( text = 'LABEL' ) + self.label.grid( row = 2, column = 0, sticky = 'ew' ) + + def set(self, format, *args): + self.label.config(text=format % args) + self.label.update_idletasks() + + def clear(self): + self.label.config(text="") + self.label.update_idletasks() + +def update( ): + logging.info( '.' ) + + +def main( parent ): + """ + Added few frames. + + First frame is editor frame. By default take half of horizontal screen and + 80% of vertical screen. + + """ + + w, h = parent.winfo_screenwidth( ), parent.winfo_screenheight( ) + editCanvas = MooseCanvas( parent ) + # editCanvas.canvas.focus_set( ) + + # Add a statusbar + sbar = StatusBar( parent ) + sbar.grid( row = 3, column = 1, sticky = 'ew' ) + + sbar.bind( '', update ) + + _globals.statusbar_ = sbar + _globals.canvas_ = editCanvas + + +if __name__ == '__main__': + main() diff --git a/build/lib/moosegui/main.py b/build/lib/moosegui/main.py new file mode 100644 index 0000000..0a18a07 --- /dev/null +++ b/build/lib/moosegui/main.py @@ -0,0 +1,70 @@ +""" +Entry point. + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import sys + +try: + import Tkinter as tk +except ImportError as e: + import tkinter as tk + +import os +import traceback + +from moosegui.MooseWindow import MooseWindow +import moosegui.menus +import moosegui.canvas +import moosegui.toolbar +import moosegui._globals + +import logging +logging.basicConfig( level = logging.DEBUG ) + + +class Catcher: + def __init__(self, func, subst, widget): + self.func = func + self.subst = subst + self.widget = widget + + def __call__(self, *args): + try: + if self.subst: + args = apply(self.subst, args) + return apply(self.func, args) + except SystemExit as msg: + logging.info( "Existing ... %s" % msg ) + raise SystemExit + except: + traceback.print_exc( file = open('moosegui.log', 'a') ) + +tk.CallWrapper = Catcher + +def main( ): + root = MooseWindow( ) + root.resizable( width = False, height = False ) + _globals.root_ = root + + # Handle all menues. + menus.main( root ) + + # Add toolbar + toolbar.main( root ) + + # All frames + canvas.main( root ) + tk.mainloop( ) + +if __name__ == '__main__': + main() diff --git a/build/lib/moosegui/menus.py b/build/lib/moosegui/menus.py new file mode 100644 index 0000000..b5bf2ba --- /dev/null +++ b/build/lib/moosegui/menus.py @@ -0,0 +1,73 @@ +"""menus.py: + +Menu management. + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import sys +PY_MAJOR = int( sys.version_info.major ) +if PY_MAJOR == 2: + import Tkinter as tk +else: + import tkinter as tk + +import os +import logging + +menus_ = [ 'File', 'Insert' ] +menu_dict_ = { + "File" : [ ("New Model", "Ctrl+N", "Control-n" ) + , ("Load Model", "Ctrl+O", "Control-o") + , ("Exit", "Ctrl+Q", "Control-q") ] + , "Insert" : [ ( "CubeMesh", ) + , ( "CylMesh" , ) + , ( "Pool" , ) + , ( "BufPool", ) + , ( "Reac" , ) ] + } + +def callback( action, parent ): + logging.info( "Got action %s" % action ) + if action.lower() == 'exit': + raise SystemExit( "Exit command" ) + else: + logging.info( "TODO %s" % action ) + +def main( parent ): + """ + This function adds required menues + + """ + menu = tk.Menu( parent ) + for menuName in menus_ : + logging.info( "Adding menu %s" % menuName ) + thismenu = tk.Menu( menu ) + menu.add_cascade( label = menuName, menu = thismenu ) + for action in menu_dict_[ menuName ]: + shortcut, underline = '', 0 + cmd = action[0] + if len( action ) > 1: + shortcut, underline = action[1], 1 + shortKey = "<%s>" % action[2] + logging.debug( "Bidning key %s to action %s" % (shortKey, cmd)) + parent.bind( shortKey, lambda e, x=cmd: callback(x, parent) ) + + thismenu.add_command( label = action[0] + , command = lambda x=cmd: callback(x, parent) + , underline = underline + , accelerator = shortcut + ) + + parent.config( menu = menu ) + +if __name__ == '__main__': + main() diff --git a/build/lib/moosegui/pyshell.py b/build/lib/moosegui/pyshell.py new file mode 100644 index 0000000..e1eade1 --- /dev/null +++ b/build/lib/moosegui/pyshell.py @@ -0,0 +1,1538 @@ +#! /usr/bin/env python3 + +try: + from tkinter import * +except ImportError: + print("** IDLE can't import Tkinter.\n" + "Your Python may not be configured for Tk. **", file=sys.__stderr__) + sys.exit(1) +import tkinter.messagebox as tkMessageBox +if TkVersion < 8.5: + root = Tk() # otherwise create root in main + root.withdraw() + tkMessageBox.showerror("Idle Cannot Start", + "Idle requires tcl/tk 8.5+, not $s." % TkVersion, + parent=root) + sys.exit(1) + +from code import InteractiveInterpreter +import getopt +import io +import linecache +import os +import os.path +from platform import python_version, system +import re +import socket +import subprocess +import sys +import threading +import time +import tokenize +import warnings + +from idlelib import testing # bool value +from idlelib.colorizer import ColorDelegator +from idlelib.config import idleConf +from idlelib import debugger +from idlelib import debugger_r +from idlelib.editor import EditorWindow, fixwordbreaks +from idlelib.filelist import FileList +from idlelib import macosx +from idlelib.outwin import OutputWindow +from idlelib import rpc +from idlelib.run import idle_formatwarning, PseudoInputFile, PseudoOutputFile +from idlelib.undo import UndoDelegator + +HOST = '127.0.0.1' # python execution server on localhost loopback +PORT = 0 # someday pass in host, port for remote debug capability + +# Override warnings module to write to warning_stream. Initialize to send IDLE +# internal warnings to the console. ScriptBinding.check_syntax() will +# temporarily redirect the stream to the shell window to display warnings when +# checking user's code. +warning_stream = sys.__stderr__ # None, at least on Windows, if no console. + +def idle_showwarning( + message, category, filename, lineno, file=None, line=None): + """Show Idle-format warning (after replacing warnings.showwarning). + + The differences are the formatter called, the file=None replacement, + which can be None, the capture of the consequence AttributeError, + and the output of a hard-coded prompt. + """ + if file is None: + file = warning_stream + try: + file.write(idle_formatwarning( + message, category, filename, lineno, line=line)) + file.write(">>> ") + except (AttributeError, OSError): + pass # if file (probably __stderr__) is invalid, skip warning. + +_warnings_showwarning = None + +def capture_warnings(capture): + "Replace warning.showwarning with idle_showwarning, or reverse." + + global _warnings_showwarning + if capture: + if _warnings_showwarning is None: + _warnings_showwarning = warnings.showwarning + warnings.showwarning = idle_showwarning + else: + if _warnings_showwarning is not None: + warnings.showwarning = _warnings_showwarning + _warnings_showwarning = None + +capture_warnings(True) + +def extended_linecache_checkcache(filename=None, + orig_checkcache=linecache.checkcache): + """Extend linecache.checkcache to preserve the entries + + Rather than repeating the linecache code, patch it to save the + entries, call the original linecache.checkcache() + (skipping them), and then restore the saved entries. + + orig_checkcache is bound at definition time to the original + method, allowing it to be patched. + """ + cache = linecache.cache + save = {} + for key in list(cache): + if key[:1] + key[-1:] == '<>': + save[key] = cache.pop(key) + orig_checkcache(filename) + cache.update(save) + +# Patch linecache.checkcache(): +linecache.checkcache = extended_linecache_checkcache + + +class PyShellEditorWindow(EditorWindow): + "Regular text edit window in IDLE, supports breakpoints" + + def __init__(self, *args): + self.breakpoints = [] + EditorWindow.__init__(self, *args) + self.text.bind("<>", self.set_breakpoint_here) + self.text.bind("<>", self.clear_breakpoint_here) + self.text.bind("<>", self.flist.open_shell) + + self.breakpointPath = os.path.join(idleConf.GetUserCfgDir(), + 'breakpoints.lst') + # whenever a file is changed, restore breakpoints + def filename_changed_hook(old_hook=self.io.filename_change_hook, + self=self): + self.restore_file_breaks() + old_hook() + self.io.set_filename_change_hook(filename_changed_hook) + if self.io.filename: + self.restore_file_breaks() + self.color_breakpoint_text() + + rmenu_specs = [ + ("Cut", "<>", "rmenu_check_cut"), + ("Copy", "<>", "rmenu_check_copy"), + ("Paste", "<>", "rmenu_check_paste"), + (None, None, None), + ("Set Breakpoint", "<>", None), + ("Clear Breakpoint", "<>", None) + ] + + def color_breakpoint_text(self, color=True): + "Turn colorizing of breakpoint text on or off" + if self.io is None: + # possible due to update in restore_file_breaks + return + if color: + theme = idleConf.CurrentTheme() + cfg = idleConf.GetHighlight(theme, "break") + else: + cfg = {'foreground': '', 'background': ''} + self.text.tag_config('BREAK', cfg) + + def set_breakpoint(self, lineno): + text = self.text + filename = self.io.filename + text.tag_add("BREAK", "%d.0" % lineno, "%d.0" % (lineno+1)) + try: + self.breakpoints.index(lineno) + except ValueError: # only add if missing, i.e. do once + self.breakpoints.append(lineno) + try: # update the subprocess debugger + debug = self.flist.pyshell.interp.debugger + debug.set_breakpoint_here(filename, lineno) + except: # but debugger may not be active right now.... + pass + + def set_breakpoint_here(self, event=None): + text = self.text + filename = self.io.filename + if not filename: + text.bell() + return + lineno = int(float(text.index("insert"))) + self.set_breakpoint(lineno) + + def clear_breakpoint_here(self, event=None): + text = self.text + filename = self.io.filename + if not filename: + text.bell() + return + lineno = int(float(text.index("insert"))) + try: + self.breakpoints.remove(lineno) + except: + pass + text.tag_remove("BREAK", "insert linestart",\ + "insert lineend +1char") + try: + debug = self.flist.pyshell.interp.debugger + debug.clear_breakpoint_here(filename, lineno) + except: + pass + + def clear_file_breaks(self): + if self.breakpoints: + text = self.text + filename = self.io.filename + if not filename: + text.bell() + return + self.breakpoints = [] + text.tag_remove("BREAK", "1.0", END) + try: + debug = self.flist.pyshell.interp.debugger + debug.clear_file_breaks(filename) + except: + pass + + def store_file_breaks(self): + "Save breakpoints when file is saved" + # XXX 13 Dec 2002 KBK Currently the file must be saved before it can + # be run. The breaks are saved at that time. If we introduce + # a temporary file save feature the save breaks functionality + # needs to be re-verified, since the breaks at the time the + # temp file is created may differ from the breaks at the last + # permanent save of the file. Currently, a break introduced + # after a save will be effective, but not persistent. + # This is necessary to keep the saved breaks synched with the + # saved file. + # + # Breakpoints are set as tagged ranges in the text. + # Since a modified file has to be saved before it is + # run, and since self.breakpoints (from which the subprocess + # debugger is loaded) is updated during the save, the visible + # breaks stay synched with the subprocess even if one of these + # unexpected breakpoint deletions occurs. + breaks = self.breakpoints + filename = self.io.filename + try: + with open(self.breakpointPath, "r") as fp: + lines = fp.readlines() + except OSError: + lines = [] + try: + with open(self.breakpointPath, "w") as new_file: + for line in lines: + if not line.startswith(filename + '='): + new_file.write(line) + self.update_breakpoints() + breaks = self.breakpoints + if breaks: + new_file.write(filename + '=' + str(breaks) + '\n') + except OSError as err: + if not getattr(self.root, "breakpoint_error_displayed", False): + self.root.breakpoint_error_displayed = True + tkMessageBox.showerror(title='IDLE Error', + message='Unable to update breakpoint list:\n%s' + % str(err), + parent=self.text) + + def restore_file_breaks(self): + self.text.update() # this enables setting "BREAK" tags to be visible + if self.io is None: + # can happen if IDLE closes due to the .update() call + return + filename = self.io.filename + if filename is None: + return + if os.path.isfile(self.breakpointPath): + with open(self.breakpointPath, "r") as fp: + lines = fp.readlines() + for line in lines: + if line.startswith(filename + '='): + breakpoint_linenumbers = eval(line[len(filename)+1:]) + for breakpoint_linenumber in breakpoint_linenumbers: + self.set_breakpoint(breakpoint_linenumber) + + def update_breakpoints(self): + "Retrieves all the breakpoints in the current window" + text = self.text + ranges = text.tag_ranges("BREAK") + linenumber_list = self.ranges_to_linenumbers(ranges) + self.breakpoints = linenumber_list + + def ranges_to_linenumbers(self, ranges): + lines = [] + for index in range(0, len(ranges), 2): + lineno = int(float(ranges[index].string)) + end = int(float(ranges[index+1].string)) + while lineno < end: + lines.append(lineno) + lineno += 1 + return lines + +# XXX 13 Dec 2002 KBK Not used currently +# def saved_change_hook(self): +# "Extend base method - clear breaks if module is modified" +# if not self.get_saved(): +# self.clear_file_breaks() +# EditorWindow.saved_change_hook(self) + + def _close(self): + "Extend base method - clear breaks when module is closed" + self.clear_file_breaks() + EditorWindow._close(self) + + +class PyShellFileList(FileList): + "Extend base class: IDLE supports a shell and breakpoints" + + # override FileList's class variable, instances return PyShellEditorWindow + # instead of EditorWindow when new edit windows are created. + EditorWindow = PyShellEditorWindow + + pyshell = None + + def open_shell(self, event=None): + if self.pyshell: + self.pyshell.top.wakeup() + else: + self.pyshell = PyShell(self) + if self.pyshell: + if not self.pyshell.begin(): + return None + return self.pyshell + + +class ModifiedColorDelegator(ColorDelegator): + "Extend base class: colorizer for the shell window itself" + + def __init__(self): + ColorDelegator.__init__(self) + self.LoadTagDefs() + + def recolorize_main(self): + self.tag_remove("TODO", "1.0", "iomark") + self.tag_add("SYNC", "1.0", "iomark") + ColorDelegator.recolorize_main(self) + + def LoadTagDefs(self): + ColorDelegator.LoadTagDefs(self) + theme = idleConf.CurrentTheme() + self.tagdefs.update({ + "stdin": {'background':None,'foreground':None}, + "stdout": idleConf.GetHighlight(theme, "stdout"), + "stderr": idleConf.GetHighlight(theme, "stderr"), + "console": idleConf.GetHighlight(theme, "console"), + }) + + def removecolors(self): + # Don't remove shell color tags before "iomark" + for tag in self.tagdefs: + self.tag_remove(tag, "iomark", "end") + +class ModifiedUndoDelegator(UndoDelegator): + "Extend base class: forbid insert/delete before the I/O mark" + + def insert(self, index, chars, tags=None): + try: + if self.delegate.compare(index, "<", "iomark"): + self.delegate.bell() + return + except TclError: + pass + UndoDelegator.insert(self, index, chars, tags) + + def delete(self, index1, index2=None): + try: + if self.delegate.compare(index1, "<", "iomark"): + self.delegate.bell() + return + except TclError: + pass + UndoDelegator.delete(self, index1, index2) + + +class MyRPCClient(rpc.RPCClient): + + def handle_EOF(self): + "Override the base class - just re-raise EOFError" + raise EOFError + + +class ModifiedInterpreter(InteractiveInterpreter): + + def __init__(self, tkconsole): + self.tkconsole = tkconsole + locals = sys.modules['__main__'].__dict__ + InteractiveInterpreter.__init__(self, locals=locals) + self.save_warnings_filters = None + self.restarting = False + self.subprocess_arglist = None + self.port = PORT + self.original_compiler_flags = self.compile.compiler.flags + + _afterid = None + rpcclt = None + rpcsubproc = None + + def spawn_subprocess(self): + if self.subprocess_arglist is None: + self.subprocess_arglist = self.build_subprocess_arglist() + self.rpcsubproc = subprocess.Popen(self.subprocess_arglist) + + def build_subprocess_arglist(self): + assert (self.port!=0), ( + "Socket should have been assigned a port number.") + w = ['-W' + s for s in sys.warnoptions] + # Maybe IDLE is installed and is being accessed via sys.path, + # or maybe it's not installed and the idle.py script is being + # run from the IDLE source directory. + del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', + default=False, type='bool') + if __name__ == 'idlelib.pyshell': + command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) + else: + command = "__import__('run').main(%r)" % (del_exitf,) + return [sys.executable] + w + ["-c", command, str(self.port)] + + def start_subprocess(self): + addr = (HOST, self.port) + # GUI makes several attempts to acquire socket, listens for connection + for i in range(3): + time.sleep(i) + try: + self.rpcclt = MyRPCClient(addr) + break + except OSError: + pass + else: + self.display_port_binding_error() + return None + # if PORT was 0, system will assign an 'ephemeral' port. Find it out: + self.port = self.rpcclt.listening_sock.getsockname()[1] + # if PORT was not 0, probably working with a remote execution server + if PORT != 0: + # To allow reconnection within the 2MSL wait (cf. Stevens TCP + # V1, 18.6), set SO_REUSEADDR. Note that this can be problematic + # on Windows since the implementation allows two active sockets on + # the same address! + self.rpcclt.listening_sock.setsockopt(socket.SOL_SOCKET, + socket.SO_REUSEADDR, 1) + self.spawn_subprocess() + #time.sleep(20) # test to simulate GUI not accepting connection + # Accept the connection from the Python execution server + self.rpcclt.listening_sock.settimeout(10) + try: + self.rpcclt.accept() + except socket.timeout: + self.display_no_subprocess_error() + return None + self.rpcclt.register("console", self.tkconsole) + self.rpcclt.register("stdin", self.tkconsole.stdin) + self.rpcclt.register("stdout", self.tkconsole.stdout) + self.rpcclt.register("stderr", self.tkconsole.stderr) + self.rpcclt.register("flist", self.tkconsole.flist) + self.rpcclt.register("linecache", linecache) + self.rpcclt.register("interp", self) + self.transfer_path(with_cwd=True) + self.poll_subprocess() + return self.rpcclt + + def restart_subprocess(self, with_cwd=False, filename=''): + if self.restarting: + return self.rpcclt + self.restarting = True + # close only the subprocess debugger + debug = self.getdebugger() + if debug: + try: + # Only close subprocess debugger, don't unregister gui_adap! + debugger_r.close_subprocess_debugger(self.rpcclt) + except: + pass + # Kill subprocess, spawn a new one, accept connection. + self.rpcclt.close() + self.terminate_subprocess() + console = self.tkconsole + was_executing = console.executing + console.executing = False + self.spawn_subprocess() + try: + self.rpcclt.accept() + except socket.timeout: + self.display_no_subprocess_error() + return None + self.transfer_path(with_cwd=with_cwd) + console.stop_readline() + # annotate restart in shell window and mark it + console.text.delete("iomark", "end-1c") + tag = 'RESTART: ' + (filename if filename else 'Shell') + halfbar = ((int(console.width) -len(tag) - 4) // 2) * '=' + console.write("\n{0} {1} {0}".format(halfbar, tag)) + console.text.mark_set("restart", "end-1c") + console.text.mark_gravity("restart", "left") + if not filename: + console.showprompt() + # restart subprocess debugger + if debug: + # Restarted debugger connects to current instance of debug GUI + debugger_r.restart_subprocess_debugger(self.rpcclt) + # reload remote debugger breakpoints for all PyShellEditWindows + debug.load_breakpoints() + self.compile.compiler.flags = self.original_compiler_flags + self.restarting = False + return self.rpcclt + + def __request_interrupt(self): + self.rpcclt.remotecall("exec", "interrupt_the_server", (), {}) + + def interrupt_subprocess(self): + threading.Thread(target=self.__request_interrupt).start() + + def kill_subprocess(self): + if self._afterid is not None: + self.tkconsole.text.after_cancel(self._afterid) + try: + self.rpcclt.listening_sock.close() + except AttributeError: # no socket + pass + try: + self.rpcclt.close() + except AttributeError: # no socket + pass + self.terminate_subprocess() + self.tkconsole.executing = False + self.rpcclt = None + + def terminate_subprocess(self): + "Make sure subprocess is terminated" + try: + self.rpcsubproc.kill() + except OSError: + # process already terminated + return + else: + try: + self.rpcsubproc.wait() + except OSError: + return + + def transfer_path(self, with_cwd=False): + if with_cwd: # Issue 13506 + path = [''] # include Current Working Directory + path.extend(sys.path) + else: + path = sys.path + + self.runcommand("""if 1: + import sys as _sys + _sys.path = %r + del _sys + \n""" % (path,)) + + active_seq = None + + def poll_subprocess(self): + clt = self.rpcclt + if clt is None: + return + try: + response = clt.pollresponse(self.active_seq, wait=0.05) + except (EOFError, OSError, KeyboardInterrupt): + # lost connection or subprocess terminated itself, restart + # [the KBI is from rpc.SocketIO.handle_EOF()] + if self.tkconsole.closing: + return + response = None + self.restart_subprocess() + if response: + self.tkconsole.resetoutput() + self.active_seq = None + how, what = response + console = self.tkconsole.console + if how == "OK": + if what is not None: + print(repr(what), file=console) + elif how == "EXCEPTION": + if self.tkconsole.getvar("<>"): + self.remote_stack_viewer() + elif how == "ERROR": + errmsg = "pyshell.ModifiedInterpreter: Subprocess ERROR:\n" + print(errmsg, what, file=sys.__stderr__) + print(errmsg, what, file=console) + # we received a response to the currently active seq number: + try: + self.tkconsole.endexecuting() + except AttributeError: # shell may have closed + pass + # Reschedule myself + if not self.tkconsole.closing: + self._afterid = self.tkconsole.text.after( + self.tkconsole.pollinterval, self.poll_subprocess) + + debugger = None + + def setdebugger(self, debugger): + self.debugger = debugger + + def getdebugger(self): + return self.debugger + + def open_remote_stack_viewer(self): + """Initiate the remote stack viewer from a separate thread. + + This method is called from the subprocess, and by returning from this + method we allow the subprocess to unblock. After a bit the shell + requests the subprocess to open the remote stack viewer which returns a + static object looking at the last exception. It is queried through + the RPC mechanism. + + """ + self.tkconsole.text.after(300, self.remote_stack_viewer) + return + + def remote_stack_viewer(self): + from idlelib import debugobj_r + oid = self.rpcclt.remotequeue("exec", "stackviewer", ("flist",), {}) + if oid is None: + self.tkconsole.root.bell() + return + item = debugobj_r.StubObjectTreeItem(self.rpcclt, oid) + from idlelib.tree import ScrolledCanvas, TreeNode + top = Toplevel(self.tkconsole.root) + theme = idleConf.CurrentTheme() + background = idleConf.GetHighlight(theme, 'normal')['background'] + sc = ScrolledCanvas(top, bg=background, highlightthickness=0) + sc.frame.pack(expand=1, fill="both") + node = TreeNode(sc.canvas, None, item) + node.expand() + # XXX Should GC the remote tree when closing the window + + gid = 0 + + def execsource(self, source): + "Like runsource() but assumes complete exec source" + filename = self.stuffsource(source) + self.execfile(filename, source) + + def execfile(self, filename, source=None): + "Execute an existing file" + if source is None: + with tokenize.open(filename) as fp: + source = fp.read() + try: + code = compile(source, filename, "exec") + except (OverflowError, SyntaxError): + self.tkconsole.resetoutput() + print('*** Error in script or command!\n' + 'Traceback (most recent call last):', + file=self.tkconsole.stderr) + InteractiveInterpreter.showsyntaxerror(self, filename) + self.tkconsole.showprompt() + else: + self.runcode(code) + + def runsource(self, source): + "Extend base class method: Stuff the source in the line cache first" + filename = self.stuffsource(source) + self.more = 0 + self.save_warnings_filters = warnings.filters[:] + warnings.filterwarnings(action="error", category=SyntaxWarning) + # at the moment, InteractiveInterpreter expects str + assert isinstance(source, str) + #if isinstance(source, str): + # from idlelib import iomenu + # try: + # source = source.encode(iomenu.encoding) + # except UnicodeError: + # self.tkconsole.resetoutput() + # self.write("Unsupported characters in input\n") + # return + try: + # InteractiveInterpreter.runsource() calls its runcode() method, + # which is overridden (see below) + return InteractiveInterpreter.runsource(self, source, filename) + finally: + if self.save_warnings_filters is not None: + warnings.filters[:] = self.save_warnings_filters + self.save_warnings_filters = None + + def stuffsource(self, source): + "Stuff source in the filename cache" + filename = "" % self.gid + self.gid = self.gid + 1 + lines = source.split("\n") + linecache.cache[filename] = len(source)+1, 0, lines, filename + return filename + + def prepend_syspath(self, filename): + "Prepend sys.path with file's directory if not already included" + self.runcommand("""if 1: + _filename = %r + import sys as _sys + from os.path import dirname as _dirname + _dir = _dirname(_filename) + if not _dir in _sys.path: + _sys.path.insert(0, _dir) + del _filename, _sys, _dirname, _dir + \n""" % (filename,)) + + def showsyntaxerror(self, filename=None): + """Override Interactive Interpreter method: Use Colorizing + + Color the offending position instead of printing it and pointing at it + with a caret. + + """ + tkconsole = self.tkconsole + text = tkconsole.text + text.tag_remove("ERROR", "1.0", "end") + type, value, tb = sys.exc_info() + msg = getattr(value, 'msg', '') or value or "" + lineno = getattr(value, 'lineno', '') or 1 + offset = getattr(value, 'offset', '') or 0 + if offset == 0: + lineno += 1 #mark end of offending line + if lineno == 1: + pos = "iomark + %d chars" % (offset-1) + else: + pos = "iomark linestart + %d lines + %d chars" % \ + (lineno-1, offset-1) + tkconsole.colorize_syntax_error(text, pos) + tkconsole.resetoutput() + self.write("SyntaxError: %s\n" % msg) + tkconsole.showprompt() + + def showtraceback(self): + "Extend base class method to reset output properly" + self.tkconsole.resetoutput() + self.checklinecache() + InteractiveInterpreter.showtraceback(self) + if self.tkconsole.getvar("<>"): + self.tkconsole.open_stack_viewer() + + def checklinecache(self): + c = linecache.cache + for key in list(c.keys()): + if key[:1] + key[-1:] != "<>": + del c[key] + + def runcommand(self, code): + "Run the code without invoking the debugger" + # The code better not raise an exception! + if self.tkconsole.executing: + self.display_executing_dialog() + return 0 + if self.rpcclt: + self.rpcclt.remotequeue("exec", "runcode", (code,), {}) + else: + exec(code, self.locals) + return 1 + + def runcode(self, code): + "Override base class method" + if self.tkconsole.executing: + self.interp.restart_subprocess() + self.checklinecache() + if self.save_warnings_filters is not None: + warnings.filters[:] = self.save_warnings_filters + self.save_warnings_filters = None + debugger = self.debugger + try: + self.tkconsole.beginexecuting() + if not debugger and self.rpcclt is not None: + self.active_seq = self.rpcclt.asyncqueue("exec", "runcode", + (code,), {}) + elif debugger: + debugger.run(code, self.locals) + else: + exec(code, self.locals) + except SystemExit: + if not self.tkconsole.closing: + if tkMessageBox.askyesno( + "Exit?", + "Do you want to exit altogether?", + default="yes", + parent=self.tkconsole.text): + raise + else: + self.showtraceback() + else: + raise + except: + if use_subprocess: + print("IDLE internal error in runcode()", + file=self.tkconsole.stderr) + self.showtraceback() + self.tkconsole.endexecuting() + else: + if self.tkconsole.canceled: + self.tkconsole.canceled = False + print("KeyboardInterrupt", file=self.tkconsole.stderr) + else: + self.showtraceback() + finally: + if not use_subprocess: + try: + self.tkconsole.endexecuting() + except AttributeError: # shell may have closed + pass + + def write(self, s): + "Override base class method" + return self.tkconsole.stderr.write(s) + + def display_port_binding_error(self): + tkMessageBox.showerror( + "Port Binding Error", + "IDLE can't bind to a TCP/IP port, which is necessary to " + "communicate with its Python execution server. This might be " + "because no networking is installed on this computer. " + "Run IDLE with the -n command line switch to start without a " + "subprocess and refer to Help/IDLE Help 'Running without a " + "subprocess' for further details.", + parent=self.tkconsole.text) + + def display_no_subprocess_error(self): + tkMessageBox.showerror( + "Subprocess Startup Error", + "IDLE's subprocess didn't make connection. Either IDLE can't " + "start a subprocess or personal firewall software is blocking " + "the connection.", + parent=self.tkconsole.text) + + def display_executing_dialog(self): + tkMessageBox.showerror( + "Already executing", + "The Python Shell window is already executing a command; " + "please wait until it is finished.", + parent=self.tkconsole.text) + + +class PyShell(OutputWindow): + + shell_title = "Python " + python_version() + " Shell" + + # Override classes + ColorDelegator = ModifiedColorDelegator + UndoDelegator = ModifiedUndoDelegator + + # Override menus + menu_specs = [ + ("file", "_File"), + ("edit", "_Edit"), + ("debug", "_Debug"), + ("options", "_Options"), + ("windows", "_Window"), + ("help", "_Help"), + ] + + + # New classes + from idlelib.history import History + + def __init__(self, flist=None): + if use_subprocess: + ms = self.menu_specs + if ms[2][0] != "shell": + ms.insert(2, ("shell", "She_ll")) + self.interp = ModifiedInterpreter(self) + if flist is None: + root = Tk() + fixwordbreaks(root) + root.withdraw() + flist = PyShellFileList(root) + # + OutputWindow.__init__(self, flist, None, None) + # +## self.config(usetabs=1, indentwidth=8, context_use_ps1=1) + self.usetabs = True + # indentwidth must be 8 when using tabs. See note in EditorWindow: + self.indentwidth = 8 + self.context_use_ps1 = True + # + text = self.text + text.configure(wrap="char") + text.bind("<>", self.enter_callback) + text.bind("<>", self.linefeed_callback) + text.bind("<>", self.cancel_callback) + text.bind("<>", self.eof_callback) + text.bind("<>", self.open_stack_viewer) + text.bind("<>", self.toggle_debugger) + text.bind("<>", self.toggle_jit_stack_viewer) + if use_subprocess: + text.bind("<>", self.view_restart_mark) + text.bind("<>", self.restart_shell) + # + self.save_stdout = sys.stdout + self.save_stderr = sys.stderr + self.save_stdin = sys.stdin + from idlelib import iomenu + self.stdin = PseudoInputFile(self, "stdin", iomenu.encoding) + self.stdout = PseudoOutputFile(self, "stdout", iomenu.encoding) + self.stderr = PseudoOutputFile(self, "stderr", iomenu.encoding) + self.console = PseudoOutputFile(self, "console", iomenu.encoding) + if not use_subprocess: + sys.stdout = self.stdout + sys.stderr = self.stderr + sys.stdin = self.stdin + try: + # page help() text to shell. + import pydoc # import must be done here to capture i/o rebinding. + # XXX KBK 27Dec07 use TextViewer someday, but must work w/o subproc + pydoc.pager = pydoc.plainpager + except: + sys.stderr = sys.__stderr__ + raise + # + self.history = self.History(self.text) + # + self.pollinterval = 50 # millisec + + def get_standard_extension_names(self): + return idleConf.GetExtensions(shell_only=True) + + reading = False + executing = False + canceled = False + endoffile = False + closing = False + _stop_readline_flag = False + + def set_warning_stream(self, stream): + global warning_stream + warning_stream = stream + + def get_warning_stream(self): + return warning_stream + + def toggle_debugger(self, event=None): + if self.executing: + tkMessageBox.showerror("Don't debug now", + "You can only toggle the debugger when idle", + parent=self.text) + self.set_debugger_indicator() + return "break" + else: + db = self.interp.getdebugger() + if db: + self.close_debugger() + else: + self.open_debugger() + + def set_debugger_indicator(self): + db = self.interp.getdebugger() + self.setvar("<>", not not db) + + def toggle_jit_stack_viewer(self, event=None): + pass # All we need is the variable + + def close_debugger(self): + db = self.interp.getdebugger() + if db: + self.interp.setdebugger(None) + db.close() + if self.interp.rpcclt: + debugger_r.close_remote_debugger(self.interp.rpcclt) + self.resetoutput() + self.console.write("[DEBUG OFF]\n") + sys.ps1 = ">>> " + self.showprompt() + self.set_debugger_indicator() + + def open_debugger(self): + if self.interp.rpcclt: + dbg_gui = debugger_r.start_remote_debugger(self.interp.rpcclt, + self) + else: + dbg_gui = debugger.Debugger(self) + self.interp.setdebugger(dbg_gui) + dbg_gui.load_breakpoints() + sys.ps1 = "[DEBUG ON]\n>>> " + self.showprompt() + self.set_debugger_indicator() + + def beginexecuting(self): + "Helper for ModifiedInterpreter" + self.resetoutput() + self.executing = 1 + + def endexecuting(self): + "Helper for ModifiedInterpreter" + self.executing = 0 + self.canceled = 0 + self.showprompt() + + def close(self): + "Extend EditorWindow.close()" + if self.executing: + response = tkMessageBox.askokcancel( + "Kill?", + "Your program is still running!\n Do you want to kill it?", + default="ok", + parent=self.text) + if response is False: + return "cancel" + self.stop_readline() + self.canceled = True + self.closing = True + return EditorWindow.close(self) + + def _close(self): + "Extend EditorWindow._close(), shut down debugger and execution server" + self.close_debugger() + if use_subprocess: + self.interp.kill_subprocess() + # Restore std streams + sys.stdout = self.save_stdout + sys.stderr = self.save_stderr + sys.stdin = self.save_stdin + # Break cycles + self.interp = None + self.console = None + self.flist.pyshell = None + self.history = None + EditorWindow._close(self) + + def ispythonsource(self, filename): + "Override EditorWindow method: never remove the colorizer" + return True + + def short_title(self): + return self.shell_title + + COPYRIGHT = \ + 'Type "copyright", "credits" or "license()" for more information.' + + def begin(self): + self.text.mark_set("iomark", "insert") + self.resetoutput() + if use_subprocess: + nosub = '' + client = self.interp.start_subprocess() + if not client: + self.close() + return False + else: + nosub = ("==== No Subprocess ====\n\n" + + "WARNING: Running IDLE without a Subprocess is deprecated\n" + + "and will be removed in a later version. See Help/IDLE Help\n" + + "for details.\n\n") + sys.displayhook = rpc.displayhook + + self.write("Python %s on %s\n%s\n%s" % + (sys.version, sys.platform, self.COPYRIGHT, nosub)) + self.text.focus_force() + self.showprompt() + import tkinter + tkinter._default_root = None # 03Jan04 KBK What's this? + return True + + def stop_readline(self): + if not self.reading: # no nested mainloop to exit. + return + self._stop_readline_flag = True + self.top.quit() + + def readline(self): + save = self.reading + try: + self.reading = 1 + self.top.mainloop() # nested mainloop() + finally: + self.reading = save + if self._stop_readline_flag: + self._stop_readline_flag = False + return "" + line = self.text.get("iomark", "end-1c") + if len(line) == 0: # may be EOF if we quit our mainloop with Ctrl-C + line = "\n" + self.resetoutput() + if self.canceled: + self.canceled = 0 + if not use_subprocess: + raise KeyboardInterrupt + if self.endoffile: + self.endoffile = 0 + line = "" + return line + + def isatty(self): + return True + + def cancel_callback(self, event=None): + try: + if self.text.compare("sel.first", "!=", "sel.last"): + return # Active selection -- always use default binding + except: + pass + if not (self.executing or self.reading): + self.resetoutput() + self.interp.write("KeyboardInterrupt\n") + self.showprompt() + return "break" + self.endoffile = 0 + self.canceled = 1 + if (self.executing and self.interp.rpcclt): + if self.interp.getdebugger(): + self.interp.restart_subprocess() + else: + self.interp.interrupt_subprocess() + if self.reading: + self.top.quit() # exit the nested mainloop() in readline() + return "break" + + def eof_callback(self, event): + if self.executing and not self.reading: + return # Let the default binding (delete next char) take over + if not (self.text.compare("iomark", "==", "insert") and + self.text.compare("insert", "==", "end-1c")): + return # Let the default binding (delete next char) take over + if not self.executing: + self.resetoutput() + self.close() + else: + self.canceled = 0 + self.endoffile = 1 + self.top.quit() + return "break" + + def linefeed_callback(self, event): + # Insert a linefeed without entering anything (still autoindented) + if self.reading: + self.text.insert("insert", "\n") + self.text.see("insert") + else: + self.newline_and_indent_event(event) + return "break" + + def enter_callback(self, event): + if self.executing and not self.reading: + return # Let the default binding (insert '\n') take over + # If some text is selected, recall the selection + # (but only if this before the I/O mark) + try: + sel = self.text.get("sel.first", "sel.last") + if sel: + if self.text.compare("sel.last", "<=", "iomark"): + self.recall(sel, event) + return "break" + except: + pass + # If we're strictly before the line containing iomark, recall + # the current line, less a leading prompt, less leading or + # trailing whitespace + if self.text.compare("insert", "<", "iomark linestart"): + # Check if there's a relevant stdin range -- if so, use it + prev = self.text.tag_prevrange("stdin", "insert") + if prev and self.text.compare("insert", "<", prev[1]): + self.recall(self.text.get(prev[0], prev[1]), event) + return "break" + next = self.text.tag_nextrange("stdin", "insert") + if next and self.text.compare("insert lineend", ">=", next[0]): + self.recall(self.text.get(next[0], next[1]), event) + return "break" + # No stdin mark -- just get the current line, less any prompt + indices = self.text.tag_nextrange("console", "insert linestart") + if indices and \ + self.text.compare(indices[0], "<=", "insert linestart"): + self.recall(self.text.get(indices[1], "insert lineend"), event) + else: + self.recall(self.text.get("insert linestart", "insert lineend"), event) + return "break" + # If we're between the beginning of the line and the iomark, i.e. + # in the prompt area, move to the end of the prompt + if self.text.compare("insert", "<", "iomark"): + self.text.mark_set("insert", "iomark") + # If we're in the current input and there's only whitespace + # beyond the cursor, erase that whitespace first + s = self.text.get("insert", "end-1c") + if s and not s.strip(): + self.text.delete("insert", "end-1c") + # If we're in the current input before its last line, + # insert a newline right at the insert point + if self.text.compare("insert", "<", "end-1c linestart"): + self.newline_and_indent_event(event) + return "break" + # We're in the last line; append a newline and submit it + self.text.mark_set("insert", "end-1c") + if self.reading: + self.text.insert("insert", "\n") + self.text.see("insert") + else: + self.newline_and_indent_event(event) + self.text.tag_add("stdin", "iomark", "end-1c") + self.text.update_idletasks() + if self.reading: + self.top.quit() # Break out of recursive mainloop() + else: + self.runit() + return "break" + + def recall(self, s, event): + # remove leading and trailing empty or whitespace lines + s = re.sub(r'^\s*\n', '' , s) + s = re.sub(r'\n\s*$', '', s) + lines = s.split('\n') + self.text.undo_block_start() + try: + self.text.tag_remove("sel", "1.0", "end") + self.text.mark_set("insert", "end-1c") + prefix = self.text.get("insert linestart", "insert") + if prefix.rstrip().endswith(':'): + self.newline_and_indent_event(event) + prefix = self.text.get("insert linestart", "insert") + self.text.insert("insert", lines[0].strip()) + if len(lines) > 1: + orig_base_indent = re.search(r'^([ \t]*)', lines[0]).group(0) + new_base_indent = re.search(r'^([ \t]*)', prefix).group(0) + for line in lines[1:]: + if line.startswith(orig_base_indent): + # replace orig base indentation with new indentation + line = new_base_indent + line[len(orig_base_indent):] + self.text.insert('insert', '\n'+line.rstrip()) + finally: + self.text.see("insert") + self.text.undo_block_stop() + + def runit(self): + line = self.text.get("iomark", "end-1c") + # Strip off last newline and surrounding whitespace. + # (To allow you to hit return twice to end a statement.) + i = len(line) + while i > 0 and line[i-1] in " \t": + i = i-1 + if i > 0 and line[i-1] == "\n": + i = i-1 + while i > 0 and line[i-1] in " \t": + i = i-1 + line = line[:i] + self.interp.runsource(line) + + def open_stack_viewer(self, event=None): + if self.interp.rpcclt: + return self.interp.remote_stack_viewer() + try: + sys.last_traceback + except: + tkMessageBox.showerror("No stack trace", + "There is no stack trace yet.\n" + "(sys.last_traceback is not defined)", + parent=self.text) + return + from idlelib.stackviewer import StackBrowser + StackBrowser(self.root, self.flist) + + def view_restart_mark(self, event=None): + self.text.see("iomark") + self.text.see("restart") + + def restart_shell(self, event=None): + "Callback for Run/Restart Shell Cntl-F6" + self.interp.restart_subprocess(with_cwd=True) + + def showprompt(self): + self.resetoutput() + try: + s = str(sys.ps1) + except: + s = "" + self.console.write(s) + self.text.mark_set("insert", "end-1c") + self.set_line_and_column() + self.io.reset_undo() + + def resetoutput(self): + source = self.text.get("iomark", "end-1c") + if self.history: + self.history.store(source) + if self.text.get("end-2c") != "\n": + self.text.insert("end-1c", "\n") + self.text.mark_set("iomark", "end-1c") + self.set_line_and_column() + + def write(self, s, tags=()): + if isinstance(s, str) and len(s) and max(s) > '\uffff': + # Tk doesn't support outputting non-BMP characters + # Let's assume what printed string is not very long, + # find first non-BMP character and construct informative + # UnicodeEncodeError exception. + for start, char in enumerate(s): + if char > '\uffff': + break + raise UnicodeEncodeError("UCS-2", char, start, start+1, + 'Non-BMP character not supported in Tk') + try: + self.text.mark_gravity("iomark", "right") + count = OutputWindow.write(self, s, tags, "iomark") + self.text.mark_gravity("iomark", "left") + except: + raise ###pass # ### 11Aug07 KBK if we are expecting exceptions + # let's find out what they are and be specific. + if self.canceled: + self.canceled = 0 + if not use_subprocess: + raise KeyboardInterrupt + return count + + def rmenu_check_cut(self): + try: + if self.text.compare('sel.first', '<', 'iomark'): + return 'disabled' + except TclError: # no selection, so the index 'sel.first' doesn't exist + return 'disabled' + return super().rmenu_check_cut() + + def rmenu_check_paste(self): + if self.text.compare('insert','<','iomark'): + return 'disabled' + return super().rmenu_check_paste() + + +def fix_x11_paste(root): + "Make paste replace selection on x11. See issue #5124." + if root._windowingsystem == 'x11': + for cls in 'Text', 'Entry', 'Spinbox': + root.bind_class( + cls, + '<>', + 'catch {%W delete sel.first sel.last}\n' + + root.bind_class(cls, '<>')) + + +usage_msg = """\ + +USAGE: idle [-deins] [-t title] [file]* + idle [-dns] [-t title] (-c cmd | -r file) [arg]* + idle [-dns] [-t title] - [arg]* + + -h print this help message and exit + -n run IDLE without a subprocess (DEPRECATED, + see Help/IDLE Help for details) + +The following options will override the IDLE 'settings' configuration: + + -e open an edit window + -i open a shell window + +The following options imply -i and will open a shell: + + -c cmd run the command in a shell, or + -r file run script from file + + -d enable the debugger + -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else + -t title set title of shell window + +A default edit window will be bypassed when -c, -r, or - are used. + +[arg]* are passed to the command (-c) or script (-r) in sys.argv[1:]. + +Examples: + +idle + Open an edit window or shell depending on IDLE's configuration. + +idle foo.py foobar.py + Edit the files, also open a shell if configured to start with shell. + +idle -est "Baz" foo.py + Run $IDLESTARTUP or $PYTHONSTARTUP, edit foo.py, and open a shell + window with the title "Baz". + +idle -c "import sys; print(sys.argv)" "foo" + Open a shell window and run the command, passing "-c" in sys.argv[0] + and "foo" in sys.argv[1]. + +idle -d -s -r foo.py "Hello World" + Open a shell window, run a startup script, enable the debugger, and + run foo.py, passing "foo.py" in sys.argv[0] and "Hello World" in + sys.argv[1]. + +echo "import sys; print(sys.argv)" | idle - "foobar" + Open a shell window, run the script piped in, passing '' in sys.argv[0] + and "foobar" in sys.argv[1]. +""" + +def main(): + global flist, root, use_subprocess + + capture_warnings(True) + use_subprocess = True + enable_shell = False + enable_edit = False + debug = False + cmd = None + script = None + startup = False + try: + opts, args = getopt.getopt(sys.argv[1:], "c:deihnr:st:") + except getopt.error as msg: + print("Error: %s\n%s" % (msg, usage_msg), file=sys.stderr) + sys.exit(2) + for o, a in opts: + if o == '-c': + cmd = a + enable_shell = True + if o == '-d': + debug = True + enable_shell = True + if o == '-e': + enable_edit = True + if o == '-h': + sys.stdout.write(usage_msg) + sys.exit() + if o == '-i': + enable_shell = True + if o == '-n': + print(" Warning: running IDLE without a subprocess is deprecated.", + file=sys.stderr) + use_subprocess = False + if o == '-r': + script = a + if os.path.isfile(script): + pass + else: + print("No script file: ", script) + sys.exit() + enable_shell = True + if o == '-s': + startup = True + enable_shell = True + if o == '-t': + PyShell.shell_title = a + enable_shell = True + if args and args[0] == '-': + cmd = sys.stdin.read() + enable_shell = True + # process sys.argv and sys.path: + for i in range(len(sys.path)): + sys.path[i] = os.path.abspath(sys.path[i]) + if args and args[0] == '-': + sys.argv = [''] + args[1:] + elif cmd: + sys.argv = ['-c'] + args + elif script: + sys.argv = [script] + args + elif args: + enable_edit = True + pathx = [] + for filename in args: + pathx.append(os.path.dirname(filename)) + for dir in pathx: + dir = os.path.abspath(dir) + if not dir in sys.path: + sys.path.insert(0, dir) + else: + dir = os.getcwd() + if dir not in sys.path: + sys.path.insert(0, dir) + # check the IDLE settings configuration (but command line overrides) + edit_start = idleConf.GetOption('main', 'General', + 'editor-on-startup', type='bool') + enable_edit = enable_edit or edit_start + enable_shell = enable_shell or not enable_edit + + # Setup root. Don't break user code run in IDLE process. + # Don't change environment when testing. + if use_subprocess and not testing: + NoDefaultRoot() + root = Tk(className="Idle") + root.withdraw() + + # set application icon + icondir = os.path.join(os.path.dirname(__file__), 'Icons') + if system() == 'Windows': + iconfile = os.path.join(icondir, 'idle.ico') + root.wm_iconbitmap(default=iconfile) + else: + ext = '.png' if TkVersion >= 8.6 else '.gif' + iconfiles = [os.path.join(icondir, 'idle_%d%s' % (size, ext)) + for size in (16, 32, 48)] + icons = [PhotoImage(master=root, file=iconfile) + for iconfile in iconfiles] + root.wm_iconphoto(True, *icons) + + # start editor and/or shell windows: + fixwordbreaks(root) + fix_x11_paste(root) + flist = PyShellFileList(root) + macosx.setupApp(root, flist) + + if enable_edit: + if not (cmd or script): + for filename in args[:]: + if flist.open(filename) is None: + # filename is a directory actually, disconsider it + args.remove(filename) + if not args: + flist.new() + + if enable_shell: + shell = flist.open_shell() + if not shell: + return # couldn't open shell + if macosx.isAquaTk() and flist.dict: + # On OSX: when the user has double-clicked on a file that causes + # IDLE to be launched the shell window will open just in front of + # the file she wants to see. Lower the interpreter window when + # there are open files. + shell.top.lower() + else: + shell = flist.pyshell + + # Handle remaining options. If any of these are set, enable_shell + # was set also, so shell must be true to reach here. + if debug: + shell.open_debugger() + if startup: + filename = os.environ.get("IDLESTARTUP") or \ + os.environ.get("PYTHONSTARTUP") + if filename and os.path.isfile(filename): + shell.interp.execfile(filename) + if cmd or script: + shell.interp.runcommand("""if 1: + import sys as _sys + _sys.argv = %r + del _sys + \n""" % (sys.argv,)) + if cmd: + shell.interp.execsource(cmd) + elif script: + shell.interp.prepend_syspath(script) + shell.interp.execfile(script) + elif shell: + # If there is a shell window and no cmd or script in progress, + # check for problematic OS X Tk versions and print a warning + # message in the IDLE shell window; this is less intrusive + # than always opening a separate window. + tkversionwarning = macosx.tkVersionWarning(root) + if tkversionwarning: + shell.interp.runcommand("print('%s')" % tkversionwarning) + + while flist.inversedict: # keep IDLE running while files are open. + root.mainloop() + root.destroy() + capture_warnings(False) + +if __name__ == "__main__": + sys.modules['pyshell'] = sys.modules['__main__'] + main() + +capture_warnings(False) # Make sure turned off; see issue 18081 diff --git a/build/lib/moosegui/toolbar.py b/build/lib/moosegui/toolbar.py new file mode 100644 index 0000000..735ce7e --- /dev/null +++ b/build/lib/moosegui/toolbar.py @@ -0,0 +1,74 @@ +"""toolbar.py: + +Add toolbar + +""" + +__author__ = "Me" +__copyright__ = "Copyright 2016, Me" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Me" +__email__ = "" +__status__ = "Development" + +import sys +import os +import logging + +try: + import Tkinter as tk + import ttk +except Exception as e: + import tkinter as tk + import tkinter.ttk as ttk + +from PIL import Image, ImageTk + +import moosegui._globals + +# After each section, put a separator. +toolbar = [['Cylinder', 'Cube'], ['Pool', 'BufPool'], ['Move', 'Exit']] + + +def iconRead(name): + imgFilePath = os.path.join('icons', '%s.png' % name) + img = Image.open(imgFilePath) + img = img.resize((20, 20), Image.ANTIALIAS) + # return tk.PhotoImage( file = imgFilePath ) + return ImageTk.PhotoImage(img) + +def btnCallback( btn ): + if btn.lower( ) == 'exit': + raise SystemExit + if btn.lower( ) == 'cube': + logging.debug( "Drawing cube and changing cursor " ) + _globals.root_.config( cursor = 'wait' ) + print( btn ) + +class ToolBar(tk.Frame): + + def __init__(self, root): + logging.info("Creating a toolbar") + tk.Frame.__init__(self, root ) + i = 0 + for tools in toolbar: + for tool in tools: + i += 1 + btnImg = iconRead(tool) + btn = tk.Button( self + , image=btnImg + , command = lambda x = tool : btnCallback( x ) + ) + btn.image = btnImg + btn.grid(row=i, column=0) + i += 1 + sep = ttk.Separator( root , orient = tk.VERTICAL ) + sep.grid(row=i, column=0 ) + + +def main(parent): + toolbar = ToolBar( parent ) + toolbar.grid( row = 1, column = 0, sticky = 'ns' ) + _globals.toolbar_ = toolbar diff --git a/config.py b/config.py deleted file mode 100644 index cf1a9a6..0000000 --- a/config.py +++ /dev/null @@ -1,232 +0,0 @@ -# config.py --- -# -# Filename: config.py -# Description: -# Author: Subhasis Ray -# Maintainer: -# Created: Sat Feb 13 16:07:56 2010 (+0530) -# Version: -# Last-Updated: Wed Nov 12 19:10:08 2014 (+0530) -# By: Subhasis Ray -# Update #: 369 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# Provides keys for accessing per-user settings. -# Provides initialization of several per-user variables for MooseGUI. -# As part of initialization, creates `~/.moose` and `~/moose` -# directories. -# -# - -# Change log: -# -# 2012-09-22 13:49:36 (+0530) Subha: cleaned up the initialization -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: - -import os -import sys -import tempfile -import logging -import errno -from PyQt4.Qt import Qt -from PyQt4 import QtGui, QtCore - -TEMPDIR = tempfile.gettempdir() -KEY_FIRSTTIME = 'firsttime' -# KEY_STATE_FILE = 'statefile' - -KEY_UNDO_LENGTH = 'main/undolength' -KEY_WINDOW_GEOMETRY = 'main/geometry' -KEY_WINDOW_LAYOUT = 'main/layout' -KEY_RUNTIME_AUTOHIDE = 'main/rtautohide' -KEY_DEMOS_DIR = 'main/demosdir' -KEY_DOCS_DIR = 'main/docsdir' -KEY_HOME_DIR = 'main/homedir' -KEY_ICON_DIR = 'main/icondir' -KEY_COLORMAP_DIR = 'main/colormapdir' -KEY_BIOMODEL_DIR = 'main/biomodelsdir' -KEY_LOCAL_DEMOS_DIR = 'main/localdemosdir' -KEY_MOOSE_LOCAL_DIR = 'main/localdir' -KEY_NUMPTHREADS = 'main/numpthreads' -KEY_LOCAL_BUILD = 'main/localbuild' -KEY_LAST_PLUGIN = 'main/lastplugin' - -# These are the keys for mode specific configuration. -# Ideally the default values should be provided by the plugin. -# We use the QSettings to remember the last values -KEY_KINETICS_SIMDT = 'kinetics/simdt' -KEY_KINETICS_PLOTDT = 'kinetics/plotdt' -KEY_ELECTRICAL_SIMDT = 'electrical/simdt' -KEY_ELECTRICAL_PLOTDT = 'electrical/plotdt' -KEY_SIMTIME = 'main/simtime' - -QT_VERSION = str(QtCore.QT_VERSION_STR).split('.') -QT_MAJOR_VERSION = int(QT_VERSION[0]) -QT_MINOR_VERSION = int(QT_VERSION[1]) - -MOOSE_DOC_URL = 'http://moose.ncbs.res.in/builtins_classes/moose_builtins.html' -MOOSE_REPORT_BUG_URL = 'http://sourceforge.net/tracker/?func=add&group_id=165660&atid=836272' -MOOSE_GUI_BUG_URL = 'https://github.com/BhallaLab/moose-gui/issues' -MOOSE_CORE_BUG_URL = 'https://github.com/BhallaLab/moose-core/issues' -MOOSE_DEMOS_DIR = '/usr/share/moose/Demos' -MOOSE_DOCS_DIR = '/usr/share/doc/moose' -MOOSE_GUI_DIR = os.path.dirname(os.path.abspath(__file__)) -MOOSE_PLUGIN_DIR = os.path.join(MOOSE_GUI_DIR, 'plugins') -NEUROKIT_PLUGIN_DIR = os.path.join(MOOSE_GUI_DIR, 'plugins/NeuroKit') -# MOOSE_CFG_DIR = os.path.join(os.environ['HOME'], '.moose') -MOOSE_LOCAL_DIR = os.path.join(os.environ['HOME'], 'moose') -MOOSE_NUMPTHREADS = '1' - -MOOSE_ABOUT_FILE = os.path.join(MOOSE_GUI_DIR, 'about.html') -MOOSE_UNDO_LENGTH = 128 # Arbitrary undo length -LOCAL_BUILD = False - -sys.path.append(os.path.join(MOOSE_PLUGIN_DIR)) - -class MooseSetting(dict): - """ - dict-like access to QSettings. - - This subclass of dict wraps a QSettings object and lets one set - and get values as Python strings rather than QVariant. - - This is supposed to be a singleton in the whole application (all - QSettings are with same parameters). - """ - _instance = None - def __new__(cls, *args, **kwargs): - # This is designed to check if the class has been - # instantiated, if so, returns the single instance, otherwise - # creates it. - if cls._instance is None: - cls._instance = super(MooseSetting, cls).__new__(cls, *args, **kwargs) - firsttime, errs = init_dirs() - for e in errs: - print e - QtCore.QCoreApplication.setOrganizationName('NCBS') - QtCore.QCoreApplication.setOrganizationDomain('ncbs.res.in') - QtCore.QCoreApplication.setApplicationName('MOOSE') - cls._instance.qsettings = QtCore.QSettings() - # If this is the first time, then set some defaults - cls._instance.qsettings.setValue(KEY_COLORMAP_DIR, os.path.join(MOOSE_GUI_DIR, 'colormaps')) - cls._instance.qsettings.setValue(KEY_BIOMODEL_DIR, os.path.join(MOOSE_GUI_DIR, 'bioModels')) - cls._instance.qsettings.setValue(KEY_ICON_DIR, os.path.join(MOOSE_GUI_DIR, 'icons')) - cls._instance.qsettings.setValue(KEY_NUMPTHREADS, '1') - cls._instance.qsettings.setValue(KEY_UNDO_LENGTH, str(MOOSE_UNDO_LENGTH)) - # These are to be checked at every run - cls._instance.qsettings.setValue(KEY_HOME_DIR, os.environ['HOME']) - cls._instance.qsettings.setValue(KEY_DEMOS_DIR, MOOSE_DEMOS_DIR) - cls._instance.qsettings.setValue(KEY_LOCAL_DEMOS_DIR, os.path.join(MOOSE_LOCAL_DIR, 'Demos/')) - cls._instance.qsettings.setValue(KEY_DOCS_DIR, MOOSE_DOCS_DIR) - cls._instance.qsettings.setValue(KEY_MOOSE_LOCAL_DIR, MOOSE_LOCAL_DIR) - cls._instance.qsettings.setValue(KEY_LOCAL_BUILD, LOCAL_BUILD) - os.environ['NUMPTHREADS'] = str(cls._instance.qsettings.value(KEY_NUMPTHREADS).toString()) - return cls._instance - - def __init__(self, *args, **kwargs): - super(MooseSetting, self).__init__(self, *args, **kwargs) - - def __iter__(self): - return (str(key) for key in self.qsettings.allKeys()) - - def __setitem__(self, key, value): - if isinstance(key, str): - self.qsettings.setValue(key, value) - else: - raise TypeError('Expect only strings as keys') - - def __getitem__(self, key): - return str(self.qsettings.value(key).toString()) - - def keys(self): - return [str(key) for key in self.qsettings.allKeys()] - - def values(self): - return [str(self.qsettings.value(key).toString()) for key in self.qsettings.allKeys()] - - def itervalues(self): - return (str(self.qsettings.value(key).toString()) for key in self.qsettings.allKeys()) - -def init_dirs(): - """Check if there is a `.moose` directory in user's home - directory. If not, we assume this to be the first run of MOOSE. - Then we try to create the `~/.moose` directory and `~/moose` - directory. - """ - firsttime = False - global MOOSE_DEMOS_DIR - global MOOSE_LOCAL_DIR - # global MOOSE_CFG_DIR - global MOOSE_DOCS_DIR - global LOCAL_BUILD - # If we have a Makefile above GUI directory, then this must be a - # locally built version - LOCAL_BUILD = os.access(os.path.join(MOOSE_GUI_DIR, '../Makefile'), os.R_OK) - errors = [] - ''' - moose_cfg_dir = os.path.join(os.environ['HOME'], '.moose') - if not os.path.exists(moose_cfg_dir): - firsttime = True - # try: - # # os.mkdir(moose_cfg_dir) - # # # MOOSE_CFG_DIR = moose_cfg_dir - # # print 'Created moose configuration directory:', moose_cfg_dir - # except OSError, e: - # errors.append(e) - # print e - if LOCAL_BUILD: - MOOSE_LOCAL_DIR = os.path.normpath(os.path.join(MOOSE_GUI_DIR, '..')) - MOOSE_DEMOS_DIR = os.path.join(MOOSE_LOCAL_DIR, 'Demos') - MOOSE_DOCS_DIR = os.path.join(MOOSE_LOCAL_DIR, 'Docs/user/py/_build/html/') - else: - MOOSE_LOCAL_DIR = os.path.join(os.environ['HOME'], 'moose') - if not os.path.exists(MOOSE_LOCAL_DIR): - try: - os.mkdir(MOOSE_LOCAL_DIR) - print 'Created local moose directory:', MOOSE_LOCAL_DIR - except OSError, e: - errors.append(e) - print e - if not os.access(MOOSE_DOCS_DIR, os.R_OK + os.X_OK): - print "Could not access Demos directory: %s" % (MOOSE_DOCS_DIR) - errors.append(OSError(errno.EACCES, 'Cannot access %s' % (MOOSE_DOCS_DIR))) - ''' - return firsttime, errors - -settings = MooseSetting() - -# LOG_FILENAME = os.path.join(TEMPDIR, 'moose.log') -LOG_LEVEL = logging.ERROR -# logging.basicConfig(filename=LOG_FILENAME, level=LOG_LEVEL, filemode='w', format='%(asctime)s %(levelname)s %(name)s %(filename)s %(funcName)s: %(lineno)d: %(message)s') -logging.basicConfig(stream=sys.stdout, level=LOG_LEVEL, filemode='w', format='%(asctime)s %(levelname)s %(name)s %(filename)s %(funcName)s: %(lineno)d: %(message)s') -LOGGER = logging.getLogger('moose') -BENCHMARK_LOGGER = logging.getLogger('moose.benchmark') -BENCHMARK_LOGGER.setLevel(logging.INFO) - -# -# config.py ends here diff --git a/data/Kholodenko.g b/data/Kholodenko.g new file mode 100644 index 0000000..f6d4c5a --- /dev/null +++ b/data/Kholodenko.g @@ -0,0 +1,528 @@ +//genesis +// kkit Version 11 flat dumpfile + +// Saved on Sun May 18 16:25:59 2014 + +include kkit {argv 1} + +FASTDT = 5e-05 +SIMDT = 0.005 +CONTROLDT = 10 +PLOTDT = 10 +MAXTIME = 6000 +TRANSIENT_TIME = 2 +VARIABLE_DT_FLAG = 1 +DEFAULT_VOL = 1.6667e-21 +VERSION = 11.0 +setfield /file/modpath value /home2/bhalla/scripts/modules +kparms + +//genesis + +initdump -version 3 -ignoreorphans 1 +simobjdump doqcsinfo filename accessname accesstype transcriber developer \ + citation species tissue cellcompartment methodology sources \ + model_implementation model_validation x y z +simobjdump table input output alloced step_mode stepsize x y z +simobjdump xtree path script namemode sizescale +simobjdump xcoredraw xmin xmax ymin ymax +simobjdump xtext editable +simobjdump xgraph xmin xmax ymin ymax overlay +simobjdump xplot pixflags script fg ysquish do_slope wy +simobjdump group xtree_fg_req xtree_textfg_req plotfield expanded movealone \ + link savename file version md5sum mod_save_flag x y z +simobjdump geometry size dim shape outside xtree_fg_req xtree_textfg_req x y \ + z +simobjdump kpool DiffConst CoInit Co n nInit mwt nMin vol slave_enable \ + geomname xtree_fg_req xtree_textfg_req x y z +simobjdump kreac kf kb notes xtree_fg_req xtree_textfg_req x y z +simobjdump kenz CoComplexInit CoComplex nComplexInit nComplex vol k1 k2 k3 \ + keepconc usecomplex notes xtree_fg_req xtree_textfg_req link x y z +simobjdump stim level1 width1 delay1 level2 width2 delay2 baselevel trig_time \ + trig_mode notes xtree_fg_req xtree_textfg_req is_running x y z +simobjdump xtab input output alloced step_mode stepsize notes editfunc \ + xtree_fg_req xtree_textfg_req baselevel last_x last_y is_running x y z +simobjdump kchan perm gmax Vm is_active use_nernst notes xtree_fg_req \ + xtree_textfg_req x y z +simobjdump transport input output alloced step_mode stepsize dt delay clock \ + kf xtree_fg_req xtree_textfg_req x y z +simobjdump proto x y z +simobjdump text str +simundump geometry /kinetics/geometry 0 1.6667e-21 3 sphere "" white black 0 \ + 0 0 +simundump text /kinetics/notes 0 "" +call /kinetics/notes LOAD \ +"" +simundump group /kinetics/MAPK 0 yellow black x 0 0 "" MAPK \ + /home2/bhalla/scripts/modules/MAPK_0.g 0 0 0 1 10 0 +simundump text /kinetics/MAPK/notes 0 \ + "This is the oscillatory MAPK model from Kholodenko 2000\nEur J. Biochem 267:1583-1588\nThe original model is formulated in terms of idealized\nMichaelis-Menten enzymes and the enzyme-substrate complex\nconcentrations are therefore assumed negligible. The\ncurrent implementation of the model uses explicit enzyme\nreactions involving substrates and is therefore an\napproximation to the Kholodenko...." +call /kinetics/MAPK/notes LOAD \ +"This is the oscillatory MAPK model from Kholodenko 2000" \ +"Eur J. Biochem 267:1583-1588" \ +"The original model is formulated in terms of idealized" \ +"Michaelis-Menten enzymes and the enzyme-substrate complex" \ +"concentrations are therefore assumed negligible. The" \ +"current implementation of the model uses explicit enzyme" \ +"reactions involving substrates and is therefore an" \ +"approximation to the Kholodenko model. The approximation is" \ +"greatly improved if the enzyme is flagged as Available" \ +"which is an option in Kinetikit. This flag means that the" \ +"enzyme protein concentration is not reduced even when it" \ +"is involved in a complex. However, the substrate protein" \ +"continues to participate in enzyme-substrate complexes" \ +"and its concentration is therefore affected. Overall," \ +"this model works almost the same as the Kholodenko model" \ +"but the peak MAPK-PP amplitudes are a little reduced and" \ +"the period of oscillations is about 10% longer." \ +"If the enzymes are not flagged as Available then the" \ +"oscillations commence only when the Km for enzyme 1" \ +"is set to 0.1 uM." +simundump kpool /kinetics/MAPK/MAPK 0 0 0.3 0.3 0.3 0.3 0 0 1 0 \ + /kinetics/geometry 35 yellow -8 -7 0 +simundump text /kinetics/MAPK/MAPK/notes 0 \ + "The total concn. of MAPK is 300nM \nfrom\nKholodenko, 2000." +call /kinetics/MAPK/MAPK/notes LOAD \ +"The total concn. of MAPK is 300nM " \ +"from" \ +"Kholodenko, 2000." +simundump kpool /kinetics/MAPK/MKKK 0 0 0.1 0.1 0.1 0.1 0 0 1 0 \ + /kinetics/geometry 16 yellow -8 5 0 +simundump text /kinetics/MAPK/MKKK/notes 0 \ + "The total concn. of MKKK is 100nM \nfrom\nKholodenko, 2000" +call /kinetics/MAPK/MKKK/notes LOAD \ +"The total concn. of MKKK is 100nM " \ +"from" \ +"Kholodenko, 2000" +simundump kpool /kinetics/MAPK/MKK 0 0 0.3 0.3 0.3 0.3 0 0 1 0 \ + /kinetics/geometry 60 yellow -8 -1 0 +simundump text /kinetics/MAPK/MKK/notes 0 \ + "The total concn. of MKK is 300nM \nfrom\nKholodenko,2000" +call /kinetics/MAPK/MKK/notes LOAD \ +"The total concn. of MKK is 300nM " \ +"from" \ +"Kholodenko,2000" +simundump kpool /kinetics/MAPK/int1 0 0 0.001 0.001 0.001 0.001 0 0 1 0 \ + /kinetics/geometry 30 yellow -4 4 0 +simundump text /kinetics/MAPK/int1/notes 0 \ + "This is the intermediate enzyme which catalyses the \ndephosphorylation of MKKK-P to MKKK. The concentration\nis set to 1 nM based on\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int1/notes LOAD \ +"This is the intermediate enzyme which catalyses the " \ +"dephosphorylation of MKKK-P to MKKK. The concentration" \ +"is set to 1 nM based on" \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/int1/2 0 0 0 0 0 0.001 156.25 1 0.25 0 1 "" red \ + 30 "" -4 5 0 +simundump text /kinetics/MAPK/int1/2/notes 0 \ + "Km is 8nM and Vmax is 0.25nM.s-1 \nfrom\nKholodenko, 2000." +call /kinetics/MAPK/int1/2/notes LOAD \ +"Km is 8nM and Vmax is 0.25nM.s-1 " \ +"from" \ +"Kholodenko, 2000." +simundump kpool /kinetics/MAPK/MKKK-P 0 0 0 0 0 0 0 0 1 0 /kinetics/geometry \ + 51 yellow 0 5 0 +simundump text /kinetics/MAPK/MKKK-P/notes 0 \ + "This is the phosphorylated form of MKKK which converts MKK\nto MKK-P and then to MKK-PP\nfrom\nKholodenko, 2000." +call /kinetics/MAPK/MKKK-P/notes LOAD \ +"This is the phosphorylated form of MKKK which converts MKK" \ +"to MKK-P and then to MKK-PP" \ +"from" \ +"Kholodenko, 2000." +simundump kenz /kinetics/MAPK/MKKK-P/3 0 0 0 0 0 0.001 8.3333 0.1 0.025 0 1 \ + "" red 51 "" -4 2 0 +simundump text /kinetics/MAPK/MKKK-P/3/notes 0 \ + "Km is 15 nM and Vmax is 0.025s-1\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/MKKK-P/3/notes LOAD \ +"Km is 15 nM and Vmax is 0.025s-1" \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/MKKK-P/4 0 0 0 0 0 0.001 8.3333 0.1 0.025 0 1 \ + "" red 51 "" 4 2 0 +simundump text /kinetics/MAPK/MKKK-P/4/notes 0 \ + "Km is 15nM and Vmax is 0.025s-1\nfrom \nKholodenko, 2000." +call /kinetics/MAPK/MKKK-P/4/notes LOAD \ +"Km is 15nM and Vmax is 0.025s-1" \ +"from " \ +"Kholodenko, 2000." +simundump kpool /kinetics/MAPK/int3 0 0 0.001 0.001 0.001 0.001 0 0 1 0 \ + /kinetics/geometry blue yellow -4 -2 0 +simundump text /kinetics/MAPK/int3/notes 0 \ + "This intermediate enzyme catalyses the dephosphorylation of\nMKK-P to MKK. The concentration is 1nM\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int3/notes LOAD \ +"This intermediate enzyme catalyses the dephosphorylation of" \ +"MKK-P to MKK. The concentration is 1nM" \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/int3/6 0 0 0 0 0 0.001 250 3 0.75 0 1 "" red \ + blue "" -4 -1 0 +simundump text /kinetics/MAPK/int3/6/notes 0 \ + "The Km is 15nM and the Vmax is 0.75nM.s-1\nfrom\nKholodenko 2000." +call /kinetics/MAPK/int3/6/notes LOAD \ +"The Km is 15nM and the Vmax is 0.75nM.s-1" \ +"from" \ +"Kholodenko 2000." +simundump kpool /kinetics/MAPK/int5 0 0 0.001 0.001 0.001 0.001 0 0 1 0 \ + /kinetics/geometry 1 yellow -4 -8 0 +simundump text /kinetics/MAPK/int5/notes 0 \ + "This catalyses the conversion of MAPK-P to MAPK. The \nconcenration is 1nM.\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int5/notes LOAD \ +"This catalyses the conversion of MAPK-P to MAPK. The " \ +"concenration is 1nM." \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/int5/10 0 0 0 0 0 0.001 166.67 2 0.5 0 1 "" red \ + 1 "" -4 -7 0 +simundump text /kinetics/MAPK/int5/10/notes 0 \ + "The Km is 15nM and Vmax is 0.5nM.s-1\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int5/10/notes LOAD \ +"The Km is 15nM and Vmax is 0.5nM.s-1" \ +"from" \ +"Kholodenko, 2000" +simundump kpool /kinetics/MAPK/MKK-P 0 0 0 0 0 0 0 0 1 0 /kinetics/geometry 5 \ + yellow 0 -1 0 +simundump text /kinetics/MAPK/MKK-P/notes 0 \ + "This is the single phoshorylated form of MKK.\nfrom\nKholodenko, 2000." +call /kinetics/MAPK/MKK-P/notes LOAD \ +"This is the single phoshorylated form of MKK." \ +"from" \ +"Kholodenko, 2000." +simundump kpool /kinetics/MAPK/MAPK-P 0 0 0 0 0 0 0 0 1 0 /kinetics/geometry \ + 55 yellow 0 -7 0 +simundump text /kinetics/MAPK/MAPK-P/notes 0 \ + "This is the single phopshorylated form of MAPK\nfrom\nKholodenko, 2000." +call /kinetics/MAPK/MAPK-P/notes LOAD \ +"This is the single phopshorylated form of MAPK" \ +"from" \ +"Kholodenko, 2000." +simundump kpool /kinetics/MAPK/int2 0 0 0.001 0.001 0.001 0.001 0 0 1 0 \ + /kinetics/geometry 2 yellow 4 -2 0 +simundump text /kinetics/MAPK/int2/notes 0 \ + "This intermediate enzyme which catalyses the dephosphorylation of\nMKK-PP to MKK-P. The concentration is 1nM.\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int2/notes LOAD \ +"This intermediate enzyme which catalyses the dephosphorylation of" \ +"MKK-PP to MKK-P. The concentration is 1nM." \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/int2/5 0 0 0 0 0 0.001 250 3 0.75 0 1 "" red 2 \ + "" 4 -1 0 +simundump text /kinetics/MAPK/int2/5/notes 0 \ + "The Km is 15nM and Vmax is 0.75nM.s-1 \nfrom\nKholodenko, 2000\n" +call /kinetics/MAPK/int2/5/notes LOAD \ +"The Km is 15nM and Vmax is 0.75nM.s-1 " \ +"from" \ +"Kholodenko, 2000" \ +"" +simundump kpool /kinetics/MAPK/int4 0 0 0.001 0.001 0.001 0.001 0 0 1 0 \ + /kinetics/geometry 17 yellow 4 -8 0 +simundump text /kinetics/MAPK/int4/notes 0 \ + "This intermediate enzyme catalyses the dephosphorylation of\nMAPK-PP to MAPK-P. The concentration is 1nM.\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int4/notes LOAD \ +"This intermediate enzyme catalyses the dephosphorylation of" \ +"MAPK-PP to MAPK-P. The concentration is 1nM." \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/int4/9 0 0 0 0 0 0.001 166.67 2 0.5 0 1 "" red \ + 17 "" 4 -7 0 +simundump text /kinetics/MAPK/int4/9/notes 0 \ + "The Km is 15nM and Vmax is 0.5nM.s-1 \nfrom\nKholodenko, 2000" +call /kinetics/MAPK/int4/9/notes LOAD \ +"The Km is 15nM and Vmax is 0.5nM.s-1 " \ +"from" \ +"Kholodenko, 2000" +simundump kpool /kinetics/MAPK/Ras-MKKKK 0 0 0.001 0.001 0.001 0.001 0 0 1 0 \ + /kinetics/geometry 11 yellow 6 8 0 +simundump text /kinetics/MAPK/Ras-MKKKK/notes 0 \ + "The concn. of Ras-MKKKK* is set to 1 nM implicitly\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/Ras-MKKKK/notes LOAD \ +"The concn. of Ras-MKKKK* is set to 1 nM implicitly" \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/Ras-MKKKK/1 0 0 0 0 0 0.001 1250 10 2.5 0 1 "" \ + red 11 "" -4 8 0 +simundump text /kinetics/MAPK/Ras-MKKKK/1/notes 0 \ + "The Km is 10nM and Vmax is 2.5nM sec^-1. We assume that\nthere is 1 nM of the Ras-MKKKK.\nFrom Kholodenko, 2000.\n\nIf the enzymes are not flagged as Available, then this\nKm should be set to 0.1 to obtain oscillations." +call /kinetics/MAPK/Ras-MKKKK/1/notes LOAD \ +"The Km is 10nM and Vmax is 2.5nM sec^-1. We assume that" \ +"there is 1 nM of the Ras-MKKKK." \ +"From Kholodenko, 2000." \ +"" \ +"If the enzymes are not flagged as Available, then this" \ +"Km should be set to 0.1 to obtain oscillations." +simundump kpool /kinetics/MAPK/inactiveRas-MKKK 0 0 0 0 0 0 0 0 1 0 \ + /kinetics/geometry 30 yellow 11 8 0 +simundump text /kinetics/MAPK/inactiveRas-MKKK/notes 0 \ + "This is the inactive form of Ras-MKKK. Based on the\nreaction scheme from Kholodenko 2000, this is equivalent\nto a binding of the MAPK-PP to the Ras. The amount of\nRas in the model is small enough that negligible amounts\nof MAPK are involved in this reaction. So it is a fair\napproximation to the negative feedback mechanism from\nKholodenko, 2000." +call /kinetics/MAPK/inactiveRas-MKKK/notes LOAD \ +"This is the inactive form of Ras-MKKK. Based on the" \ +"reaction scheme from Kholodenko 2000, this is equivalent" \ +"to a binding of the MAPK-PP to the Ras. The amount of" \ +"Ras in the model is small enough that negligible amounts" \ +"of MAPK are involved in this reaction. So it is a fair" \ +"approximation to the negative feedback mechanism from" \ +"Kholodenko, 2000." +simundump kreac /kinetics/MAPK/Neg_feedback 0 1 0.009 "" white yellow 11 2 0 +simundump text /kinetics/MAPK/Neg_feedback/notes 0 \ + "From Kholodenko, 2000 Eur J Biochem 267\nthe Kd is 9 nM. We use a rather fast Kf of 1/sec/uM\nso that equilibrium is maintained.\n" +call /kinetics/MAPK/Neg_feedback/notes LOAD \ +"From Kholodenko, 2000 Eur J Biochem 267" \ +"the Kd is 9 nM. We use a rather fast Kf of 1/sec/uM" \ +"so that equilibrium is maintained." \ +"" +simundump kpool /kinetics/MAPK/MKK-PP 0 0 0 0 0 0 0 0 1 0 /kinetics/geometry \ + 0 yellow 8 -1 0 +simundump text /kinetics/MAPK/MKK-PP/notes 0 \ + "This is the double phosphorylated and active form of MKK\nfrom\nKholodenko, 2000" +call /kinetics/MAPK/MKK-PP/notes LOAD \ +"This is the double phosphorylated and active form of MKK" \ +"from" \ +"Kholodenko, 2000" +simundump kenz /kinetics/MAPK/MKK-PP/7 0 0 0 0 0 0.001 8.3333 0.1 0.025 0 1 \ + "" red 0 "" -4 -4 0 +simundump text /kinetics/MAPK/MKK-PP/7/notes 0 \ + "The Km is 15nM which is 0.015uM Vmax is 0.025s-1\nfrom\nKholodenko, 2000.\n" +call /kinetics/MAPK/MKK-PP/7/notes LOAD \ +"The Km is 15nM which is 0.015uM Vmax is 0.025s-1" \ +"from" \ +"Kholodenko, 2000." \ +"" +simundump kenz /kinetics/MAPK/MKK-PP/8 0 0 0 0 0 0.001 8.3333 0.1 0.025 0 1 \ + "" red 0 "" 4 -4 0 +simundump text /kinetics/MAPK/MKK-PP/8/notes 0 \ + "The Km is 15nM which is 0.015uM and Vmax is 0.025s-1\nfrom\nKholodenko, 2000\n" +call /kinetics/MAPK/MKK-PP/8/notes LOAD \ +"The Km is 15nM which is 0.015uM and Vmax is 0.025s-1" \ +"from" \ +"Kholodenko, 2000" \ +"" +simundump kpool /kinetics/MAPK/MAPK-PP 0 0 0 0 0 0 0 0 1 0 /kinetics/geometry \ + 58 yellow 8 -7 0 +simundump text /kinetics/MAPK/MAPK-PP/notes 0 \ + "This is the double phosphorylated and active form of MAPK.\nfrom\nKholodenko, 2000." +call /kinetics/MAPK/MAPK-PP/notes LOAD \ +"This is the double phosphorylated and active form of MAPK." \ +"from" \ +"Kholodenko, 2000." +simundump text /kinetics/geometry/notes 0 "" +call /kinetics/geometry/notes LOAD \ +"" +simundump xgraph /graphs/conc1 0 0 6000 0 0.3 0 +simundump xgraph /graphs/conc2 0 0 6000 4.5157e-05 0.3 0 +simundump xplot /graphs/conc1/Ras-MKKKK.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 11 0 0 1 +simundump xplot /graphs/conc1/MKKK-P.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 51 0 0 1 +simundump xplot /graphs/conc1/MKK-PP.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 0 0 0 1 +simundump xplot /graphs/conc1/MAPK-PP.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 58 0 0 1 +simundump xgraph /moregraphs/conc3 0 0 6000 0 1 0 +simundump xgraph /moregraphs/conc4 0 0 6000 0 1 0 +simundump xcoredraw /edit/draw 0 -10 13 -10 12 +simundump xtree /edit/draw/tree 0 \ + /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \ + "edit_elm.D ; drag_from_edit.w " auto 0.6 +simundump xtext /file/notes 0 1 +xtextload /file/notes \ +"22 Jan 2002" \ +" " \ +" This model is based on Kholodenko, B.N." \ +" Eur. J. Biochem. 267, 1583-1588(2000)" \ +"" +addmsg /kinetics/MAPK/MKK-PP/7 /kinetics/MAPK/MAPK REAC sA B +addmsg /kinetics/MAPK/int5/10 /kinetics/MAPK/MAPK MM_PRD pA +addmsg /kinetics/MAPK/Ras-MKKKK/1 /kinetics/MAPK/MKKK REAC sA B +addmsg /kinetics/MAPK/int1/2 /kinetics/MAPK/MKKK MM_PRD pA +addmsg /kinetics/MAPK/MKKK-P/3 /kinetics/MAPK/MKK REAC sA B +addmsg /kinetics/MAPK/int3/6 /kinetics/MAPK/MKK MM_PRD pA +addmsg /kinetics/MAPK/int1 /kinetics/MAPK/int1/2 ENZYME n +addmsg /kinetics/MAPK/MKKK-P /kinetics/MAPK/int1/2 SUBSTRATE n +addmsg /kinetics/MAPK/Ras-MKKKK/1 /kinetics/MAPK/MKKK-P MM_PRD pA +addmsg /kinetics/MAPK/int1/2 /kinetics/MAPK/MKKK-P REAC sA B +addmsg /kinetics/MAPK/MKKK-P /kinetics/MAPK/MKKK-P/3 ENZYME n +addmsg /kinetics/MAPK/MKK /kinetics/MAPK/MKKK-P/3 SUBSTRATE n +addmsg /kinetics/MAPK/MKKK-P /kinetics/MAPK/MKKK-P/4 ENZYME n +addmsg /kinetics/MAPK/MKK-P /kinetics/MAPK/MKKK-P/4 SUBSTRATE n +addmsg /kinetics/MAPK/int3 /kinetics/MAPK/int3/6 ENZYME n +addmsg /kinetics/MAPK/MKK-P /kinetics/MAPK/int3/6 SUBSTRATE n +addmsg /kinetics/MAPK/int5 /kinetics/MAPK/int5/10 ENZYME n +addmsg /kinetics/MAPK/MAPK-P /kinetics/MAPK/int5/10 SUBSTRATE n +addmsg /kinetics/MAPK/MKKK-P/4 /kinetics/MAPK/MKK-P REAC sA B +addmsg /kinetics/MAPK/MKKK-P/3 /kinetics/MAPK/MKK-P MM_PRD pA +addmsg /kinetics/MAPK/int3/6 /kinetics/MAPK/MKK-P REAC sA B +addmsg /kinetics/MAPK/int2/5 /kinetics/MAPK/MKK-P MM_PRD pA +addmsg /kinetics/MAPK/MKK-PP/8 /kinetics/MAPK/MAPK-P REAC sA B +addmsg /kinetics/MAPK/MKK-PP/7 /kinetics/MAPK/MAPK-P MM_PRD pA +addmsg /kinetics/MAPK/int5/10 /kinetics/MAPK/MAPK-P REAC sA B +addmsg /kinetics/MAPK/int4/9 /kinetics/MAPK/MAPK-P MM_PRD pA +addmsg /kinetics/MAPK/int2 /kinetics/MAPK/int2/5 ENZYME n +addmsg /kinetics/MAPK/MKK-PP /kinetics/MAPK/int2/5 SUBSTRATE n +addmsg /kinetics/MAPK/int4 /kinetics/MAPK/int4/9 ENZYME n +addmsg /kinetics/MAPK/MAPK-PP /kinetics/MAPK/int4/9 SUBSTRATE n +addmsg /kinetics/MAPK/Neg_feedback /kinetics/MAPK/Ras-MKKKK REAC A B +addmsg /kinetics/MAPK/Ras-MKKKK /kinetics/MAPK/Ras-MKKKK/1 ENZYME n +addmsg /kinetics/MAPK/MKKK /kinetics/MAPK/Ras-MKKKK/1 SUBSTRATE n +addmsg /kinetics/MAPK/Neg_feedback /kinetics/MAPK/inactiveRas-MKKK REAC B A +addmsg /kinetics/MAPK/MAPK-PP /kinetics/MAPK/Neg_feedback SUBSTRATE n +addmsg /kinetics/MAPK/Ras-MKKKK /kinetics/MAPK/Neg_feedback SUBSTRATE n +addmsg /kinetics/MAPK/inactiveRas-MKKK /kinetics/MAPK/Neg_feedback PRODUCT n +addmsg /kinetics/MAPK/MKKK-P/4 /kinetics/MAPK/MKK-PP MM_PRD pA +addmsg /kinetics/MAPK/int2/5 /kinetics/MAPK/MKK-PP REAC sA B +addmsg /kinetics/MAPK/MKK-PP /kinetics/MAPK/MKK-PP/7 ENZYME n +addmsg /kinetics/MAPK/MAPK /kinetics/MAPK/MKK-PP/7 SUBSTRATE n +addmsg /kinetics/MAPK/MKK-PP /kinetics/MAPK/MKK-PP/8 ENZYME n +addmsg /kinetics/MAPK/MAPK-P /kinetics/MAPK/MKK-PP/8 SUBSTRATE n +addmsg /kinetics/MAPK/MKK-PP/8 /kinetics/MAPK/MAPK-PP MM_PRD pA +addmsg /kinetics/MAPK/int4/9 /kinetics/MAPK/MAPK-PP REAC sA B +addmsg /kinetics/MAPK/Neg_feedback /kinetics/MAPK/MAPK-PP REAC A B +addmsg /kinetics/MAPK/Ras-MKKKK /graphs/conc1/Ras-MKKKK.Co PLOT Co *Ras-MKKKK.Co *11 +addmsg /kinetics/MAPK/MKKK-P /graphs/conc1/MKKK-P.Co PLOT Co *MKKK-P.Co *51 +addmsg /kinetics/MAPK/MKK-PP /graphs/conc1/MKK-PP.Co PLOT Co *MKK-PP.Co *0 +addmsg /kinetics/MAPK/MAPK-PP /graphs/conc1/MAPK-PP.Co PLOT Co *MAPK-PP.Co *58 +enddump +// End of dump + +call /kinetics/MAPK/notes LOAD \ +"This is the oscillatory MAPK model from Kholodenko 2000" \ +"Eur J. Biochem 267:1583-1588" \ +"The original model is formulated in terms of idealized" \ +"Michaelis-Menten enzymes and the enzyme-substrate complex" \ +"concentrations are therefore assumed negligible. The" \ +"current implementation of the model uses explicit enzyme" \ +"reactions involving substrates and is therefore an" \ +"approximation to the Kholodenko model. The approximation is" \ +"greatly improved if the enzyme is flagged as Available" \ +"which is an option in Kinetikit. This flag means that the" \ +"enzyme protein concentration is not reduced even when it" \ +"is involved in a complex. However, the substrate protein" \ +"continues to participate in enzyme-substrate complexes" \ +"and its concentration is therefore affected. Overall," \ +"this model works almost the same as the Kholodenko model" \ +"but the peak MAPK-PP amplitudes are a little reduced and" \ +"the period of oscillations is about 10% longer." \ +"If the enzymes are not flagged as Available then the" \ +"oscillations commence only when the Km for enzyme 1" \ +"is set to 0.1 uM." +call /kinetics/MAPK/MAPK/notes LOAD \ +"The total concn. of MAPK is 300nM " \ +"from" \ +"Kholodenko, 2000." +call /kinetics/MAPK/MKKK/notes LOAD \ +"The total concn. of MKKK is 100nM " \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/MKK/notes LOAD \ +"The total concn. of MKK is 300nM " \ +"from" \ +"Kholodenko,2000" +call /kinetics/MAPK/int1/notes LOAD \ +"This is the intermediate enzyme which catalyses the " \ +"dephosphorylation of MKKK-P to MKKK. The concentration" \ +"is set to 1 nM based on" \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/int1/2/notes LOAD \ +"Km is 8nM and Vmax is 0.25nM.s-1 " \ +"from" \ +"Kholodenko, 2000." +call /kinetics/MAPK/MKKK-P/notes LOAD \ +"This is the phosphorylated form of MKKK which converts MKK" \ +"to MKK-P and then to MKK-PP" \ +"from" \ +"Kholodenko, 2000." +call /kinetics/MAPK/MKKK-P/3/notes LOAD \ +"Km is 15 nM and Vmax is 0.025s-1" \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/MKKK-P/4/notes LOAD \ +"Km is 15nM and Vmax is 0.025s-1" \ +"from " \ +"Kholodenko, 2000." +call /kinetics/MAPK/int3/notes LOAD \ +"This intermediate enzyme catalyses the dephosphorylation of" \ +"MKK-P to MKK. The concentration is 1nM" \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/int3/6/notes LOAD \ +"The Km is 15nM and the Vmax is 0.75nM.s-1" \ +"from" \ +"Kholodenko 2000." +call /kinetics/MAPK/int5/notes LOAD \ +"This catalyses the conversion of MAPK-P to MAPK. The " \ +"concenration is 1nM." \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/int5/10/notes LOAD \ +"The Km is 15nM and Vmax is 0.5nM.s-1" \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/MKK-P/notes LOAD \ +"This is the single phoshorylated form of MKK." \ +"from" \ +"Kholodenko, 2000." +call /kinetics/MAPK/MAPK-P/notes LOAD \ +"This is the single phopshorylated form of MAPK" \ +"from" \ +"Kholodenko, 2000." +call /kinetics/MAPK/int2/notes LOAD \ +"This intermediate enzyme which catalyses the dephosphorylation of" \ +"MKK-PP to MKK-P. The concentration is 1nM." \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/int2/5/notes LOAD \ +"The Km is 15nM and Vmax is 0.75nM.s-1 " \ +"from" \ +"Kholodenko, 2000" \ +"" +call /kinetics/MAPK/int4/notes LOAD \ +"This intermediate enzyme catalyses the dephosphorylation of" \ +"MAPK-PP to MAPK-P. The concentration is 1nM." \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/int4/9/notes LOAD \ +"The Km is 15nM and Vmax is 0.5nM.s-1 " \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/Ras-MKKKK/notes LOAD \ +"The concn. of Ras-MKKKK* is set to 1 nM implicitly" \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/Ras-MKKKK/1/notes LOAD \ +"The Km is 10nM and Vmax is 2.5nM sec^-1. We assume that" \ +"there is 1 nM of the Ras-MKKKK." \ +"From Kholodenko, 2000." \ +"" \ +"If the enzymes are not flagged as Available, then this" \ +"Km should be set to 0.1 to obtain oscillations." +call /kinetics/MAPK/inactiveRas-MKKK/notes LOAD \ +"This is the inactive form of Ras-MKKK. Based on the" \ +"reaction scheme from Kholodenko 2000, this is equivalent" \ +"to a binding of the MAPK-PP to the Ras. The amount of" \ +"Ras in the model is small enough that negligible amounts" \ +"of MAPK are involved in this reaction. So it is a fair" \ +"approximation to the negative feedback mechanism from" \ +"Kholodenko, 2000." +call /kinetics/MAPK/Neg_feedback/notes LOAD \ +"From Kholodenko, 2000 Eur J Biochem 267" \ +"the Kd is 9 nM. We use a rather fast Kf of 1/sec/uM" \ +"so that equilibrium is maintained." \ +"" +call /kinetics/MAPK/MKK-PP/notes LOAD \ +"This is the double phosphorylated and active form of MKK" \ +"from" \ +"Kholodenko, 2000" +call /kinetics/MAPK/MKK-PP/7/notes LOAD \ +"The Km is 15nM which is 0.015uM Vmax is 0.025s-1" \ +"from" \ +"Kholodenko, 2000." \ +"" +call /kinetics/MAPK/MKK-PP/8/notes LOAD \ +"The Km is 15nM which is 0.015uM and Vmax is 0.025s-1" \ +"from" \ +"Kholodenko, 2000" \ +"" +call /kinetics/MAPK/MAPK-PP/notes LOAD \ +"This is the double phosphorylated and active form of MAPK." \ +"from" \ +"Kholodenko, 2000." +complete_loading diff --git a/demos/Fig2_elecModels/Fig2A.py b/demos/Fig2_elecModels/Fig2A.py new file mode 100644 index 0000000..9f00a41 --- /dev/null +++ b/demos/Fig2_elecModels/Fig2A.py @@ -0,0 +1,527 @@ +#!/usr/bin/env python +#/********************************************************************** +#** This program is part of 'MOOSE', the +#** Messaging Object Oriented Simulation Environment. +#** Copyright (C) 2003-2014 Upinder S. Bhalla. and NCBS +#** It is made available under the terms of the +#** GNU Lesser General Public License version 2.1 +#** See the file COPYING.LIB for the full notice. +#**********************************************************************/ + +''' +This LIF network with Ca plasticity is based on: +David Higgins, Michael Graupner, Nicolas Brunel + Memory Maintenance in Synapses with Calcium-Based + Plasticity in the Presence of Background Activity + PLOS Computational Biology, 2014. + +Author: Aditya Gilra, NCBS, Bangalore, October, 2014. +''' + +## import modules and functions to be used +import numpy as np +import matplotlib.pyplot as plt +import random +import time +import moose + +np.random.seed(100) # set seed for reproducibility of simulations +random.seed(100) # set seed for reproducibility of simulations +moose.seed(100) # set seed for reproducibility of simulations + +############################################# +# All parameters as per: +# David Higgins, Michael Graupner, Nicolas Brunel +# Memory Maintenance in Synapses with Calcium-Based +# Plasticity in the Presence of Background Activity +# PLOS Computational Biology, 2014. +############################################# + +############################################# +# Neuron model +############################################# + +# equation: dv/dt = (1/taum)*(-(v-el)) + inp +# with spike when v>vt, reset to vr + +el = -70e-3 #V # Resting potential +vt = -50e-3 #V # Spiking threshold +Rm = 20e6 #Ohm # Only taum is needed, but LIF neuron accepts +Cm = 1e-9 #F # Rm and Cm and constructs taum=Rm*Cm +taum = Rm*Cm #s # Membrane time constant is 20 ms +vr = -60e-3 #V # Reset potential +Iinject = 11.5e-3/Rm # constant current injection into LIF neuron + # same as setting el=-70+15=-55 mV and inp=0 +noiseInj = True # inject noisy current into each cell: boolean +noiseInjSD = 5e-3/Rm #A # SD of noise added to 'current' + # SD*sqrt(taum) is used as noise current SD + +############################################# +# Network parameters: numbers +############################################# + +red_fact = 10 # reduction factor for N,C,J +N = 10000/red_fact # Total number of neurons +fexc = 0.8 # Fraction of exc neurons +NE = int(fexc*N) # Number of excitatory cells +NI = N-NE # Number of inhibitory cells + +############################################# +# Simulation parameters +############################################# + +simtime = 1200.0 #s # Simulation time +dt = 1e-3 #s # time step +plotDt = 1.0 #s # Time step for storing output. + +############################################# +# Network parameters: synapses (not for ExcInhNetBase) +############################################# + +## With each presynaptic spike in exc / inh neuron, +## J / -g*J is added to post-synaptic Vm -- delta-fn synapse +## Since LIF neuron used below is derived from Compartment class, +## conductance-based synapses (SynChan class) can also be used. + +C = 500/red_fact # Number of incoming connections on each neuron (exc or inh) + # 5% conn prob between any two neurons + # Since we reduced N from 10000 to 1000, C = 50 instead of 500 + # but we need to increase J by 10 to maintain total input per neuron +fC = fexc # fraction fC incoming connections are exc, rest inhibitory +J = 0.2e-3 #V # exc strength is J (in V as we add to voltage) + # Critical J is ~ 0.45e-3 V in paper for N = 10000, C = 1000 + # See what happens for J = 0.2e-3 V versus J = 0.8e-3 V +J *= red_fact # Multiply J by red_fact to compensate C/red_fact. +g = 4.0 # -gJ is the inh strength. For exc-inh balance g >~ f(1-f)=4 +syndelay = dt # synaptic delay: +refrT = 0.0 # s # absolute refractory time + +############################################# +# Ca Plasticity parameters: synapses (not for ExcInhNetBase) +############################################# + +CaPlasticity = True # set it True or False to turn on/off plasticity +tauCa = 22.6936e-3 # s # Ca decay time scale +tauSyn = 346.3615 # s # synaptic plasticity time scale +## in vitro values in Higgins et al 2014, faster plasticity +CaPre = 0.56175 # mM +CaPost = 1.2964 # mM +## in vivo values in Higgins et al 2014, slower plasticity +#CaPre = 0.33705 # mM +#CaPost = 0.74378 # mM +delayD = 4.6098e-3 # s # CaPre is added to Ca after this delay + # proxy for rise-time of NMDA +thetaD = 1.0 # mM # depression threshold for Ca +thetaP = 1.3 # mM # potentiation threshold for Ca +gammaD = 331.909 # factor for depression term +gammaP = 725.085 # factor for potentiation term + +eqWeight = 0.16 # initial synaptic weight + # gammaP/(gammaP+gammaD) = eq weight w/o noise + # but see eqn (22), noiseSD also appears + +bistable = True # if bistable is True, use bistable potential for weights +noisy = True # use noisy weight updates given by noiseSD +noiseSD = 3.3501 # if noisy, use noiseSD (3.3501 from Higgins et al 2014) +#noiseSD = 0.1 # if bistable==False, use a smaller noise than in Higgins et al 2014 + +############################################# +# Exc-Inh network base class without connections +############################################# + +class ExcInhNetBase: + """Simulates and plots LIF neurons (exc and inh separate). + Author: Aditya Gilra, NCBS, Bangalore, India, October 2014 + """ + + def __init__(self,N=N,fexc=fexc,el=el,vt=vt,Rm=Rm,Cm=Cm,vr=vr,\ + refrT=refrT,Iinject=Iinject): + """ Constructor of the class """ + + self.N = N # Total number of neurons + self.fexc = fexc # Fraction of exc neurons + self.NmaxExc = int(fexc*N) # max idx of exc neurons, rest inh + + self.el = el # Resting potential + self.vt = vt # Spiking threshold + self.taum = taum # Membrane time constant + self.vr = vr # Reset potential + self.refrT = refrT # Absolute refractory period + self.Rm = Rm # Membrane resistance + self.Cm = Cm # Membrane capacitance + self.Iinject = Iinject # constant input current + self.noiseInjSD = noiseInjSD # SD of injected noise + + self.simif = False # whether the simulation is complete + + self._setup_network() + + def __str__(self): + return "LIF network of %d neurons "\ + "having %d exc." % (self.N,self.NmaxExc) + + def _setup_network(self): + """Sets up the network (_init_network is enough)""" + self.network = moose.LIF( 'network', self.N ); + moose.le( '/network' ) + self.network.vec.Em = self.el + self.network.vec.thresh = self.vt + self.network.vec.refractoryPeriod = self.refrT + self.network.vec.Rm = self.Rm + self.network.vec.vReset = self.vr + self.network.vec.Cm = self.Cm + if not noiseInj: + self.network.vec.inject = self.Iinject + else: + ## inject a constant + noisy current + ## values are set in self.simulate() + self.noiseTables = moose.StimulusTable('noiseTables',self.N) + moose.connect( self.noiseTables, 'output', \ + self.network, 'setInject', 'OneToOne') + + def _init_network(self,v0=el): + """Initialises the network variables before simulation""" + self.network.vec.initVm = v0 + + def simulate(self,simtime=simtime,dt=dt,plotif=False,**kwargs): + + self.dt = dt + self.simtime = simtime + self.T = np.ceil(simtime/dt) + self.trange = np.arange(0,self.simtime,dt) + + for i in range(self.N): + if noiseInj: + ## Gaussian white noise SD added every dt interval should be + ## divided by sqrt(dt), as the later numerical integration + ## will multiply it by dt. + ## See the Euler-Maruyama method, numerical integration in + ## http://www.scholarpedia.org/article/Stochastic_dynamical_systems + self.noiseTables.vec[i].vector = self.Iinject + \ + np.random.normal( \ + scale=self.noiseInjSD*np.sqrt(self.Rm*self.Cm/self.dt), \ + size=int(self.T) + ) # scale = SD + self.noiseTables.vec[i].stepSize = 0 # use current time + # as x value for interpolation + self.noiseTables.vec[i].stopTime = self.simtime + + self._init_network(**kwargs) + if plotif: + self._init_plots() + + # moose simulation + #moose.useClock( 1, '/network', 'process' ) + #moose.setClock( 0, dt ) + #moose.setClock( 1, dt ) + #moose.setClock( 2, dt ) + #moose.setClock( 3, dt ) + #moose.setClock( 9, dt ) + ## Do need to set the dt for MOOSE clocks + for i in range(10): + moose.setClock( i, dt ) + moose.setClock( 18, plotDt ) + t1 = time.time() + print('reinit MOOSE -- takes a while ~20s.') + moose.reinit() + print(('reinit time t = ', time.time() - t1)) + t1 = time.time() + print('starting') + simadvance = self.simtime / 50.0 + for i in range( 50 ): + moose.start( simadvance ) + print(('at t = ', i * simadvance, 'realtime = ', time.time() - t1)) + #moose.start(self.simtime) + print(('runtime for ', self.simtime, 'sec, is t = ', time.time() - t1)) + + if plotif: + self._plot() + + def _init_plots(self): + ## make a few tables to store a few Vm-s + numVms = 10 + self.plots = moose.Table2( '/plotVms', numVms ) + ## draw numVms out of N neurons + nrnIdxs = random.sample(list(range(self.N)),numVms) + for i in range( numVms ): + moose.connect( self.network.vec[nrnIdxs[i]], 'VmOut', \ + self.plots.vec[i], 'input') + + ## make self.N tables to store spikes of all neurons + self.spikes = moose.Table2( '/plotSpikes', self.N ) + moose.connect( self.network, 'spikeOut', \ + self.spikes, 'input', 'OneToOne' ) + + ## make 2 tables to store spikes of all exc and all inh neurons + self.spikesExc = moose.Table2( '/plotSpikesAllExc' ) + for i in range(self.NmaxExc): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesExc, 'input' ) + self.spikesInh = moose.Table2( '/plotSpikesAllInh' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesInh, 'input' ) + + def _plot(self): + """ plots the spike raster for the simulated net""" + +############################################# +# Exc-Inh network class with Ca plasticity based connections +# (inherits from ExcInhNetBase) +############################################# + +class ExcInhNet(ExcInhNetBase): + """ Recurrent network simulation """ + + def __init__(self,J=J,incC=C,fC=fC,scaleI=g,syndelay=syndelay,**kwargs): + """Overloads base (parent) class""" + self.J = J # exc connection weight + self.incC = incC # number of incoming connections per neuron + self.fC = fC # fraction of exc incoming connections + self.excC = int(fC*incC)# number of exc incoming connections + self.scaleI = scaleI # inh weight is scaleI*J + self.syndelay = syndelay# synaptic delay + + # call the parent class constructor + ExcInhNetBase.__init__(self,**kwargs) + + def __str__(self): + return "LIF network of %d neurons "\ + "of which %d are exc." % (self.N,self.NmaxExc) + + def _init_network(self,**args): + ExcInhNetBase._init_network(self,**args) + + def _init_plots(self): + ExcInhNetBase._init_plots(self) + self.recN = 50 # number of neurons for which to record weights and Ca + if CaPlasticity: + ## make tables to store weights of recN exc synapses + ## for each post-synaptic exc neuron + self.weights = moose.Table2( '/plotWeights', self.excC*self.recN ) + for i in range(self.recN): # range(self.N) is too large + for j in range(self.excC): + moose.connect( self.weights.vec[self.excC*i+j], 'requestOut', + self.synsEE.vec[i*self.excC+j].synapse[0], 'getWeight') + self.CaTables = moose.Table2( '/plotCa', self.recN ) + for i in range(self.recN): # range(self.N) is too large + moose.connect( self.CaTables.vec[i], 'requestOut', + self.synsEE.vec[i*self.excC+j], 'getCa') + + def _setup_network(self): + ## Set up the neurons without connections + ExcInhNetBase._setup_network(self) + + ## Now, add in the connections... + ## Each pre-synaptic spike cause Vm of post-neuron to rise by + ## synaptic weight in one time step i.e. delta-fn synapse. + ## Since LIF neuron is derived from Compartment class, + ## conductance-based synapses (SynChan class) can also be used. + + ## E to E synapses can be plastic + ## Two ways to do this: + ## 1) Each LIF neuron has one incoming postsynaptic SynHandler, + ## which collects the activation from all presynaptic neurons, + ## but then a common Ca pool is used. + ## 2) Each LIF neuron has multiple postsyanptic SynHandlers, + ## one for each pre-synaptic neuron, i.e. one per synapse, + ## then each synapse has a different Ca pool. + ## Here we go with option 2) as per Higgins et al 2014 (Brunel private email) + ## separate SynHandler per EE synapse, thus NmaxExc*excC + if CaPlasticity: + self.synsEE = moose.GraupnerBrunel2012CaPlasticitySynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + else: + self.synsEE = moose.SimpleSynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + moose.useClock( 0, '/network/synsEE', 'process' ) + + ## I to E synapses are not plastic + self.synsIE = moose.SimpleSynHandler( '/network/synsIE', self.NmaxExc ) + ## all synapses to I neurons are not plastic + self.synsI = moose.SimpleSynHandler( '/network/synsI', self.N-self.NmaxExc ) + ## connect all SynHandlers to their respective neurons + for i in range(self.NmaxExc): + moose.connect( self.synsIE.vec[i], 'activationOut', \ + self.network.vec[i], 'activation' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.synsI.vec[i-self.NmaxExc], 'activationOut', \ + self.network.vec[i], 'activation' ) + + ## Connections from some Exc/Inh neurons to each Exc neuron + for i in range(0,self.NmaxExc): + self.synsIE.vec[i].numSynapses = self.incC-self.excC + + ## Connections from some Exc neurons to each Exc neuron + ## draw excC number of neuron indices out of NmaxExc neurons + preIdxs = random.sample(list(range(self.NmaxExc)),self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synidx = i*self.excC+synnum + synHand = self.synsEE.vec[synidx] + + ## connect each synhandler to the post-synaptic neuron + moose.connect( synHand, 'activationOut', \ + self.network.vec[i], 'activation' ) + ## important to set numSynapses = 1 for each synHandler, + ## doesn't create synapses if you set the full array of SynHandlers + synHand.numSynapses = 1 + + synij = synHand.synapse[0] + connectExcId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + if CaPlasticity: + ## set parameters for the Ca Plasticity SynHandler + ## have to be set for each SynHandler + ## doesn't set for full array at a time + synHand.CaInit = 0.0 + synHand.tauCa = tauCa + synHand.tauSyn = tauSyn + synHand.CaPre = CaPre + synHand.CaPost = CaPost + synHand.delayD = delayD + synHand.thetaD = thetaD + synHand.thetaP = thetaP + synHand.gammaD = gammaD + synHand.gammaP = gammaP + synHand.weightMax = 1.0 # bounds on the weight + synHand.weightMin = 0.0 + synHand.weightScale = \ + self.J*2.0 # 0.2 mV, weight*weightScale is activation + # typically weight <~ 0.5, so activation <~ J + synHand.noisy = noisy + synHand.noiseSD = noiseSD + synHand.bistable = bistable + + moose.connect( self.network.vec[i], \ + 'spikeOut', synHand, 'addPostSpike') + synij.weight = eqWeight # activation = weight*weightScale + # weightScale = 2*J + # weight <~ 0.5 + ## Randomly set 5% of them to be 1.0 + if np.random.uniform()<0.05: + synij.weight = 1.0 + else: + synij.weight = self.J # no weightScale here, activation = weight + + ## Connections from some Inh neurons to each Exc neuron + ## draw inhC=incC-excC number of neuron indices out of inhibitory neurons + preIdxs = random.sample(list(range(self.NmaxExc,self.N)),self.incC-self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsIE.vec[i].synapse[synnum] + connectInhId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = -self.scaleI*self.J # activation = weight + + ## Connections from some Exc/Inh neurons to each Inh neuron + for i in range(self.N-self.NmaxExc): + ## each neuron has incC number of synapses + self.synsI.vec[i].numSynapses = self.incC + + ## draw excC number of neuron indices out of NmaxExc neurons + preIdxs = random.sample(list(range(self.NmaxExc)),self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsI.vec[i].synapse[synnum] + connectExcId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = self.J # activation = weight + + ## draw inhC=incC-excC number of neuron indices out of inhibitory neurons + preIdxs = random.sample(list(range(self.NmaxExc,self.N)),self.incC-self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsI.vec[i].synapse[ self.excC + synnum ] + connectInhId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = -self.scaleI*self.J # activation = weight + + moose.useClock( 0, '/network/synsIE', 'process' ) + moose.useClock( 0, '/network/synsI', 'process' ) + +############################################# +# Analysis functions +############################################# + +def rate_from_spiketrain(spiketimes,fulltime,dt,tau=50e-3): + """ + Returns a rate series of spiketimes convolved with a Gaussian kernel; + all times must be in SI units. + """ + sigma = tau/2. + ## normalized Gaussian kernel, integral with dt is normed to 1 + ## to count as 1 spike smeared over a finite interval + norm_factor = 1./(np.sqrt(2.*np.pi)*sigma) + gauss_kernel = np.array([norm_factor*np.exp(-x**2/(2.*sigma**2))\ + for x in np.arange(-5.*sigma,5.*sigma+dt,dt)]) + kernel_len = len(gauss_kernel) + ## need to accommodate half kernel_len on either side of fulltime + rate_full = np.zeros(int(fulltime/dt)+kernel_len) + for spiketime in spiketimes: + idx = int(spiketime/dt) + rate_full[idx:idx+kernel_len] += gauss_kernel + ## only the middle fulltime part of the rate series + ## This is already in Hz, + ## since should have multiplied by dt for above convolution + ## and divided by dt to get a rate, so effectively not doing either. + return rate_full[kernel_len/2:kernel_len/2+int(fulltime/dt)] + +############################################# +# Make plots +############################################# + +def extra_plots(net): + ## extra plots apart from the spike rasters + ## individual neuron Vm-s + + timeseries = net.trange + ## individual neuron firing rates + + ## population firing rates + + ## Ca plasticity: weight vs time plots + if CaPlasticity: + ## Ca versus time in post-synaptic neurons + for i in range(net.recN): # range(net.N) is too large + net.CaTables.vec[i].xplot( 'ca.xplot', 'Ca_' + str(i) ) + + for i in range(net.recN): # range(net.N) is too large + for j in range(net.excC): + k = net.excC*i+j + net.weights.vec[k].xplot( 'wt.xplot', 'w_' + str(k) ) + + ## all EE weights are used for a histogram + weights = [ net.synsEE.vec[i*net.excC+j].synapse[0].weight \ + for i in range(net.NmaxExc) for j in range(net.excC) ] + histo, edges = np.histogram( weights, bins=100 ) + print() + print(histo) + print() + print(edges) + print() + + plt.figure() + plt.hist(weights, bins=100) + plt.title("Histogram of efficacies") + plt.xlabel("Efficacy (arb)") + plt.ylabel("# per bin") + +if __name__=='__main__': + ## ExcInhNetBase has unconnected neurons, + ## ExcInhNet connects them + ## Instantiate either ExcInhNetBase or ExcInhNet below + #net = ExcInhNetBase(N=N) + net = ExcInhNet(N=N) + print(net) + ## Important to distribute the initial Vm-s + ## else weak coupling gives periodic synchronous firing + net.simulate(simtime,plotif=True, v0=np.random.uniform(el-20e-3,vt,size=N)) + plt.figure() + extra_plots(net) + plt.show() + diff --git a/demos/Fig2_elecModels/Fig2A_analysis.py b/demos/Fig2_elecModels/Fig2A_analysis.py new file mode 100644 index 0000000..fadc704 --- /dev/null +++ b/demos/Fig2_elecModels/Fig2A_analysis.py @@ -0,0 +1,62 @@ +import os +import numpy as np +from pylab import * +from itertools import islice + +if not os.path.isfile('wx.xplot'): + print("Please run ./Fig2A.py to generate the data") + quit() + +fh = open('wt.xplot',mode='r') + +fulltime = 1200 #s +plotdt = 1 #s +numpts = int(fulltime/plotdt)+1 + +print('reading') +wts = [] +while True: + next_line = '' + while 'plotname' not in next_line: + next_line = fh.readline() + if next_line == '': break + if next_line == '': break + next_wt = [float(fh.readline()) for i in range(numpts)] + wts.append(next_wt) + print('weight',len(wts)) + + +hiAve = np.zeros( len( wts[0] ) ) +loAve = np.zeros( len( wts[0] ) ) +numHi = 0 +for i in wts: + if i[0] > 0.5: + hiAve += np.array( i ) + numHi += 1 + else: + loAve += np.array( i ) + + +hiAve /= numHi +loAve /= ( len( wts ) - numHi ) + +def dumpVec( f, name, vec ): + f.write( '/newplot\n' ) + f.write( '/plotname ' + name + '\n' ) + for i in vec: + f.write( str( i ) + '\n' ) + +f = open( 'averageOfxplots', 'w' ) +dumpVec( f, 'highAverage', hiAve ) +dumpVec( f, 'lowAverage', loAve ) +dumpVec( f, 'highExample', wts[4] ) +dumpVec( f, 'lowExample', wts[5] ) +f.close() + + +print('numHi = ', numHi, ' plotting...') +figure() +plot(transpose(wts)) +plot( hiAve, linewidth=4 ) +plot( loAve, linewidth=4 ) +show() diff --git a/demos/Fig2_elecModels/Fig2C.py b/demos/Fig2_elecModels/Fig2C.py new file mode 100644 index 0000000..90cb21a --- /dev/null +++ b/demos/Fig2_elecModels/Fig2C.py @@ -0,0 +1,356 @@ +######################################################################## +# This program is copyright (c) Upinder S. Bhalla, NCBS, 2015. +# It is licenced under the GPL 2.1 or higher. +# There is no warranty of any kind. You are welcome to make copies under +# the provisions of the GPL. +# This programme illustrates building a panel of multiscale models to +# test neuronal plasticity in different contexts. +######################################################################## +import numpy +import time +import pylab +import moose +from moose import neuroml +from PyQt5 import Qt, QtCore, QtGui +import matplotlib.pyplot as plt +import sys +import os +from moose.neuroml.ChannelML import ChannelML +sys.path.append('../../../Demos/util') +import rdesigneur as rd +import moogli + +PI = 3.14159265359 +useGssa = True +combineSegments = True +# Pick your favourite cell here. +#elecFileName = "ca1_minimal.p" +## Cell morphology from Bannister and Larkman J Neurophys 2015/NeuroMorpho +elecFileName = "h10.CNG.swc" +#elecFileName = "CA1.morph.xml" +#elecFileName = "VHC-neuron.CNG.swc" +synSpineList = [] +synDendList = [] +probeInterval = 0.1 +probeAmplitude = 1.0 +tetanusFrequency = 100.0 +tetanusAmplitude = 1000 +tetanusAmplitudeForSpines = 1000 +frameRunTime = 1e-3 # 1 ms +baselineTime = 0.05 +tetTime = 0.01 +postTetTime = 0.01 +runtime = baselineTime + tetTime + postTetTime + +def buildRdesigneur(): + ''' + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + ''' + cellProto = [ [ "./cells/" + elecFileName, "elec" ] ] + chanProto = [ + ['./chans/hd.xml'], \ + ['./chans/kap.xml'], \ + ['./chans/kad.xml'], \ + ['./chans/kdr.xml'], \ + ['./chans/na3.xml'], \ + ['./chans/nax.xml'], \ + ['./chans/CaConc.xml'], \ + ['./chans/Ca.xml'], \ + ['./chans/NMDA.xml'], \ + ['./chans/Glu.xml'] \ + ] + spineProto = [ \ + ['makeSpineProto()', 'spine' ] + ] + chemProto = [] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are: + # p, g, L, len, dia, maxP, maxG, maxL. + # where + # p = path distance from soma, threaded along dendrite + # g = geometrical distance from soma (shortest distance) + # L = electrotonic distance from soma: number of length constants + # len = length of dendritic compartment + # dia = diameter of dendritic compartment + # maxP = maximal value of 'p' for the cell + # maxG = maximal value of 'g' for the cell + # maxL = maximal value of 'L' for the cell + # + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + passiveDistrib = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", \ + "Em", "-58e-3", "initVm", "-65e-3" ], \ + [ ".", "#axon#", "RA", "0.5" ] \ + ] + chanDistrib = [ \ + ["hd", "#dend#,#apical#", "Gbar", "5e-2*(1+(p*3e4))" ], \ + ["kdr", "#", "Gbar", "p < 50e-6 ? 500 : 100" ], \ + ["na3", "#soma#,#dend#,#apical#", "Gbar", "250" ], \ + ["nax", "#soma#,#axon#", "Gbar", "1250" ], \ + ["kap", "#axon#,#soma#", "Gbar", "300" ], \ + ["kap", "#dend#,#apical#", "Gbar", \ + "300*(H(100-p*1e6)) * (1+(p*1e4))" ], \ + ["Ca_conc", "#soma#,#dend#,#apical#", "tau", "0.0133" ], \ + ["kad", "#soma#,#dend#,#apical#", "Gbar", \ + "300*H(p - 100e-6)*(1+p*1e4)" ], \ + ["Ca", "#dend#,#apical#", "Gbar", "p<160e-6? 10+ p*0.25e-6 : 50" ], \ + ["Ca", "#soma#", "Gbar", "10" ], \ + ["glu", "#dend#,#apical#", "Gbar", "200*H(p-200e-6)" ], \ + ["NMDA", "#dend#,#apical#", "Gbar", "2*H(p-200e-6)" ] \ + ] + spineDistrib = [ \ + ["spine", '#apical#', "spineSpacing", "20e-6", \ + "spineSpacingDistrib", "2e-6", \ + "angle", "0", \ + "angleDistrib", str( 2*PI ), \ + "size", "1", \ + "sizeDistrib", "0.5" ] \ + ] + chemDistrib = [] + + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField offset scale + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + rd.addSpineProto() # This adds a version with an LCa channel by default. + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + passiveDistrib = passiveDistrib, \ + spineDistrib = spineDistrib, \ + chanDistrib = chanDistrib, \ + chemDistrib = chemDistrib, \ + cellProto = cellProto, \ + chanProto = chanProto, \ + chemProto = chemProto, \ + adaptorList = adaptorList + ) + #spineProto = spineProto, \ + + return rdes + +def buildPlots( rdes ): + graphs = moose.Neutral( '/graphs' ) + vtab = moose.Table( '/graphs/VmTab' ) + moose.connect( vtab, 'requestOut', rdes.soma, 'getVm' ) + +def displayPlots(): + pylab.figure(1, figsize = (8,10 ) ) + pylab.subplot( 1,1,1) + for i in moose.wildcardFind( "/graphs/#VmTab" ): + t = numpy.arange( 0, i.vector.size, 1 ) * i.dt + pylab.plot( t, i.vector, label = i.name ) + pylab.xlabel( "Time (s)" ) + pylab.legend() + pylab.title( 'Vm' ) + + pylab.figure(2, figsize= (8,10)) + ax = pylab.subplot( 1,1,1 ) + neuron = moose.element( '/model/elec' ) + comptDistance = dict( list(zip( neuron.compartments, neuron.pathDistanceFromSoma )) ) + for i in moose.wildcardFind( '/library/#[ISA=ChanBase]' ): + chans = moose.wildcardFind( '/model/elec/#/' + i.name ) + print(i.name, len( chans )) + p = [ 1e6*comptDistance.get( j.parent, 0) for j in chans ] + Gbar = [ j.Gbar/(j.parent.length * j.parent.diameter * PI) for j in chans ] + if len( p ) > 2: + pylab.plot( p, Gbar, linestyle = 'None', marker = ".", label = i.name ) + sortedGbar = sorted(zip(p, Gbar), key=lambda x: x[0]) + ax.set_yscale( 'log' ) + pylab.xlabel( "Distance from soma (microns)" ) + pylab.ylabel( "Channel density (Seimens/sq mtr)" ) + pylab.legend() + pylab.title( 'Channel distribution' ) + pylab.show() + +def create_vm_viewer(rdes): + network = moogli.extensions.moose.read(rdes.elecid.path) + normalizer = moogli.utilities.normalizer(-0.08, + 0.02, + clipleft=True, + clipright=True) + colormap = moogli.colors.UniformColorMap([moogli.colors.Color(0.0, + 0.0, + 1.0, + 1.0), + moogli.colors.Color(1.0, + 1.0, + 0.0, + 0.1)]) + mapper = moogli.utilities.mapper(colormap, normalizer) + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + + def prelude(view): + view.pitch(PI/2) + view.zoom(0.4) + + def interlude(view): + moose.start(frameRunTime) + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + view.yaw(0.01) + currTime = moose.element('/clock').currentTime + if currTime < runtime: + deliverStim(currTime) + else: + view.stop() + + def postlude(view): + displayPlots() + + viewer = moogli.Viewer("vm-viewer") + viewer.attach_shapes(list(network.shapes.values())) + view = moogli.View("vm-view", + prelude=prelude, + interlude=interlude, + postlude=postlude) + viewer.attach_view(view) + return viewer + + +def create_ca_viewer(rdes): + network = moogli.extensions.moose.read(rdes.elecid.path) + ca_elements = [] + for compartment_path in list(network.shapes.keys()): + if moose.exists(compartment_path + '/Ca_conc'): + ca_elements.append(moose.element(compartment_path + '/Ca_conc')) + else: + ca_elements.append(moose.element('/library/Ca_conc')) + + normalizer = moogli.utilities.normalizer(0.0, + 0.002, + clipleft=True, + clipright=True) + colormap = moogli.colors.UniformColorMap([moogli.colors.Color(1.0, + 0.0, + 0.0, + 1.0), + moogli.colors.Color(0.0, + 1.0, + 1.0, + 0.1)]) + mapper = moogli.utilities.mapper(colormap, normalizer) + + cas = [element.Ca for element in ca_elements] + network.set("color", cas, mapper) + + def prelude(view): + view.pitch(PI/2) + view.zoom(0.4) + + def interlude(view): + moose.start(frameRunTime) + cas = [element.Ca for element in ca_elements] + network.set("color", cas, mapper) + view.yaw(0.01) + currTime = moose.element('/clock').currentTime + if currTime < runtime: + deliverStim(currTime) + else: + view.stop() + + viewer = moogli.Viewer("ca-viewer") + viewer.attach_shapes(list(network.shapes.values())) + view = moogli.View("ca-view", + prelude=prelude, + interlude=interlude) + viewer.attach_view(view) + return viewer + +def build3dDisplay(rdes): + print("building 3d Display") + app = QtGui.QApplication(sys.argv) + + vm_viewer = create_vm_viewer(rdes) + vm_viewer.resize(700, 900) + vm_viewer.show() + vm_viewer.start() + + ca_viewer = create_ca_viewer(rdes) + ca_viewer.resize(700, 900) + ca_viewer.show() + ca_viewer.start() + + return app.exec_() + + +def deliverStim( currTime ): + if currTime > baselineTime and currTime < baselineTime + tetTime: + # deliver tet stim + step = int ( (currTime - baselineTime) / frameRunTime ) + tetStep = int( 1.0 / (tetanusFrequency * frameRunTime ) ) + if step % tetStep == 0: + for i in synDendList: + i.activation( tetanusAmplitude ) + for i in synSpineList: + i.activation( tetanusAmplitudeForSpines ) + else: + # deliver probe stim + step = int (currTime / frameRunTime ) + probeStep = int( probeInterval / frameRunTime ) + if step % probeStep == 0: + print("Doing probe Stim at ", currTime) + for i in synSpineList: + i.activation( probeAmplitude ) + + +def main(): + global synSpineList + global synDendList + numpy.random.seed( 1234 ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + assert( moose.exists( '/model' ) ) + synSpineList = moose.wildcardFind( "/model/elec/#head#/glu,/model/elec/#head#/NMDA" ) + temp = set( moose.wildcardFind( "/model/elec/#/glu,/model/elec/#/NMDA" ) ) + + synDendList = list( temp - set( synSpineList ) ) + print("num spine, dend syns = ", len( synSpineList ), len( synDendList )) + moose.reinit() + #for i in moose.wildcardFind( '/model/elec/#apical#/#[ISA=CaConcBase]' ): + #print i.path, i.length, i.diameter, i.parent.length, i.parent.diameter + + buildPlots(rdes) + # Run for baseline, tetanus, and post-tetanic settling time + t1 = time.time() + build3dDisplay(rdes) + print('real time = ', time.time() - t1) + +if __name__ == '__main__': + main() diff --git a/demos/Fig2_elecModels/Fig2D.py b/demos/Fig2_elecModels/Fig2D.py new file mode 100644 index 0000000..5d7db8f --- /dev/null +++ b/demos/Fig2_elecModels/Fig2D.py @@ -0,0 +1,104 @@ +######################################################################### +## This program is part of 'MOOSE', the +## Messaging Object Oriented Simulation Environment. +## Copyright (C) 2015 Upinder S. Bhalla. and NCBS +## It is made available under the terms of the +## GNU Lesser General Public License version 2.1 +## See the file COPYING.LIB for the full notice. +######################################################################### +# This example illustrates loading a model from an SWC file, inserting +# spines, and viewing it. + +import moogli +import moose +from PyQt5 import Qt, QtCore, QtGui +import sys +import os +import rdesigneur as rd + +PI = 3.14159265358979 +frameRunTime = 0.0001 +runtime = 0.1 +inject = 15e-10 +simdt = 5e-5 +RM = 1.0 +RA = 1.0 +CM = 0.01 +# This is the expression used to set spine spacing: +spineSpacing = "dia * 2" +minSpacing = 0.1e-6 +spineSize = 1.0 +spineSizeDistrib = 0.5 +spineAngle = 0 +spineAngleDistrib = 2*PI + + +def create_vm_viewer(rdes): + network = moogli.extensions.moose.read(rdes.elecid.path, + vertices=10) + normalizer = moogli.utilities.normalizer(-0.08, + 0.02, + clipleft=True, + clipright=True) + colormap = moogli.colors.UniformColorMap([moogli.colors.Color(0.0, + 0.5, + 1.0, + 1.0), + moogli.colors.Color(1.0, + 0.0, + 0.0, + 0.9)]) + mapper = moogli.utilities.mapper(colormap, normalizer) + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + + def interlude(view): + moose.start(frameRunTime) + #vms = [moose.element(x).Vm for x in network.shapes.keys()] + #network.set("color", vms, mapper) + view.pitch(0.01) + currTime = moose.element('/clock').currentTime + if currTime >= runtime: + view.stop() + + viewer = moogli.Viewer("vm-viewer") + viewer.attach_shapes(list(network.shapes.values())) + view = moogli.View("vm-view", + interlude=interlude) + viewer.attach_view(view) + return viewer + + +def main(): + ######## Put your favourite cell model here ###### + ##This one is from PMID 19146814: Peng et al Neuron 2009 + filename = 'cells/K-18.CNG.swc' + moose.Neutral( '/library' ) + rdes = rd.rdesigneur( \ + cellProto = [[ filename, 'elec' ] ],\ + spineProto = [['makeSpineProto()', 'spine' ]] ,\ + spineDistrib = [ \ + ['spine', '#', \ + 'spacing', spineSpacing, \ + 'spacingDistrib', str( minSpacing ), \ + 'angle', str( spineAngle ), \ + 'angleDistrib', str( spineAngleDistrib ), \ + 'size', str( spineSize ), \ + 'sizeDistrib', str( spineSizeDistrib ) ] \ + ] \ + ) + rdes.buildModel('/model') + moose.reinit() + compts = moose.wildcardFind( "/model/elec/#[ISA=CompartmentBase]" ) + compts[0].inject = inject + + ################## Now we set up the display ######################## + print("Setting Up 3D Display") + app = QtGui.QApplication(sys.argv) + vm_viewer = create_vm_viewer(rdes) + vm_viewer.showMaximized() + vm_viewer.start() + return app.exec_() + +if __name__ == '__main__': + main() diff --git a/demos/Fig2_elecModels/Fig2E.py b/demos/Fig2_elecModels/Fig2E.py new file mode 100644 index 0000000..6cd3e13 --- /dev/null +++ b/demos/Fig2_elecModels/Fig2E.py @@ -0,0 +1,125 @@ +######################################################################### +## This program is part of 'MOOSE', the +## Messaging Object Oriented Simulation Environment. +## Copyright (C) 2015 Upinder S. Bhalla. and NCBS +## It is made available under the terms of the +## GNU Lesser General Public License version 2.1 +## See the file COPYING.LIB for the full notice. +######################################################################### +# This example illustrates loading a model from an SWC file, inserting +# channels, and running it. + +import moogli +import moose +from PyQt5 import Qt, QtCore, QtGui +import numpy +import pylab +import sys +import os +import rdesigneur as rd + +PI = 3.14159265358979 +frameRunTime = 0.0005 +runtime = 0.1 +inject = 1e-9 +chanProto_ = [ + ['./chans/KChannel_HH.xml'], + ['./chans/NaChannel_HH.xml'], + ['./chans/LeakConductance.xml'], + [ './chans/kdr.xml' ] + ] + +passiveDistrib_ = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", + "Em", "-58e-3", "initVm", "-65e-3" ] + , [ ".", "#axon#", "RA", "0.5" ] + ] + +chanDistrib_ = [ + [ "NaConductance", "#", "Gbar", "1200" ] + , [ "KConductance", "#", "Gbar", "360" ] + , [ "LeakConductance", "#", "Gbar", "3" ] + , [ "kdr", "#", "Gbar", "10" ] + ] + + +def create_vm_viewer(rdes, somaVm): + network = moogli.extensions.moose.read(rdes.elecid.path) + normalizer = moogli.utilities.normalizer(-0.08, + 0.02, + clipleft=True, + clipright=True) + colormap = moogli.colors.UniformColorMap([moogli.colors.Color(0.0, + 0.5, + 1.0, + 1.0), + moogli.colors.Color(1.0, + 0.0, + 0.0, + 0.9)]) + mapper = moogli.utilities.mapper(colormap, normalizer) + + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + + def prelude(view): + view.pitch(PI/2.0) + + def interlude(view): + moose.start(frameRunTime) + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + view.yaw(0.01) + currTime = moose.element('/clock').currentTime + if currTime >= runtime: + view.stop() + + def postlude(view): + pylab.plot(numpy.linspace(0, + runtime, + len(somaVm.vector)), + somaVm.vector * 1000) + pylab.xlabel("Time (s)") + pylab.ylabel("Vm (mV)") + pylab.show() + + viewer = moogli.Viewer("vm-viewer") + viewer.attach_shapes(list(network.shapes.values())) + view = moogli.View("vm-view", + prelude=prelude, + interlude=interlude, + postlude=postlude) + viewer.attach_view(view) + return viewer + + +def main(): + ######## Put your favourite cell model here ###### + ##This one is from PMID 22730554: Suo et al J. Mol Cell Biol 2012 + filename = 'cells/ko20x-07.CNG.swc' + moose.Neutral( '/library' ) + rdes = rd.rdesigneur( \ + cellProto = [[ filename, 'elec' ] ],\ + passiveDistrib = passiveDistrib_, + chanProto = chanProto_, + chanDistrib = chanDistrib_ + ) + rdes.buildModel( '/model' ) + moose.reinit() + + ################## Now we store plots ######################## + somaVm = moose.Table( '/somaVm' ) + moose.connect( somaVm, 'requestOut', rdes.soma, 'getVm' ) + ################## Now we set up the display ######################## + compts = moose.wildcardFind( "/model/elec/#[ISA=CompartmentBase]" ) + compts[0].inject = inject + + print("Setting Up 3D Display") + app = QtGui.QApplication(sys.argv) + vm_viewer = create_vm_viewer(rdes, somaVm) + vm_viewer.show() + vm_viewer.start() + return app.exec_() + +if __name__ == '__main__': + main() diff --git a/demos/Fig2_elecModels/cells/CA1.morph.xml b/demos/Fig2_elecModels/cells/CA1.morph.xml new file mode 100644 index 0000000..dcae7ae --- /dev/null +++ b/demos/Fig2_elecModels/cells/CA1.morph.xml @@ -0,0 +1,12535 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig2_elecModels/cells/K-18.CNG.swc b/demos/Fig2_elecModels/cells/K-18.CNG.swc new file mode 100644 index 0000000..c8c64e8 --- /dev/null +++ b/demos/Fig2_elecModels/cells/K-18.CNG.swc @@ -0,0 +1,1193 @@ +# Original file K-18.swc edited using StdSwc version 1.31 on 1/26/12. +# Irregularities and fixes documented in K-18.swc.std. See StdSwc1.31.doc for more information. +# +# Neurolucida to SWC conversion from L-Measure. Sridevi Polavaram: spolavar@gmu.edu +# Original fileName:C:\Users\praveen\Desktop\Master File Processing\Original\K-18.asc +# +# NEUROMANTIC V1.6.3 (1/26/2012 12:52:03 PM): Saved to K-18.swc.CNG.swc +1 1 2.67 1.55 -7.84 9.3275 -1 +2 1 2.67 10.87 -7.84 9.3275 1 +3 1 2.67 -7.77 -7.84 9.3275 1 +4 3 -4.16 8.32 -5.88 1.91 1 +5 3 -5.85 11.02 -5.88 1.575 4 +6 3 -8.89 16.3 -5.88 1.405 5 +7 3 -12.37 21.82 -5.88 1.405 6 +8 3 -14.4 25.42 -5.88 1.405 7 +9 3 -15.63 27.67 -4.9 1.405 8 +10 3 -16.76 29.13 -4.9 1.405 9 +11 3 -21.37 31.15 -4.9 0.845 10 +12 3 -23.96 32.72 -4.9 0.845 11 +13 3 -26.54 34.08 -4.9 0.845 12 +14 3 -26.77 34.19 -4.9 0.845 13 +15 3 -30.25 32.72 -4.9 0.675 14 +16 3 -32.28 31.49 -4.9 0.675 15 +17 3 -33.07 32.61 -3.92 0.225 16 +18 3 -35.88 27.78 -3.92 0.675 17 +19 3 -37.68 25.64 -3.92 0.675 18 +20 3 -41.95 24.29 -3.92 0.505 19 +21 3 -44.99 23.06 -3.92 0.505 20 +22 3 -46.45 23.39 -3.92 0.225 21 +23 3 -48.7 20.13 -3.92 0.45 22 +24 3 -51.4 16.98 -3.92 0.45 23 +25 3 -53.87 14.85 -3.92 0.45 24 +26 3 -54.32 14.28 -3.92 0.45 25 +27 3 -55.34 12.93 -4.9 0.395 26 +28 3 -58.71 12.15 -4.9 0.395 27 +29 3 -60.4 12.03 -4.9 0.28 28 +30 3 -62.65 11.81 -4.9 0.225 29 +31 3 -64.56 11.47 -4.9 0.225 30 +32 3 -37.56 19.12 -4.9 0.62 19 +33 3 -38.24 15.97 -4.9 0.56 32 +34 3 -38.58 14.51 -4.9 0.56 33 +35 3 -39.59 15.52 -4.9 0.395 34 +36 3 -39.81 10.91 -4.9 0.56 35 +37 3 -40.83 8.32 -4.9 0.56 36 +38 3 -42.29 6.19 -4.9 0.56 37 +39 3 -42.85 3.49 -4.9 0.56 38 +40 3 -42.96 1.12 -4.9 0.56 39 +41 3 -43.19 -0.11 -4.9 0.56 40 +42 3 -46.56 -2.81 -4.9 0.56 41 +43 3 -49.94 -5.96 -4.9 0.56 42 +44 3 -53.31 -7.31 -4.9 0.56 43 +45 3 -57.02 -8.77 -4.9 0.56 44 +46 3 -59.27 -9.56 -4.9 0.56 45 +47 3 -61.52 -12.03 -4.9 0.56 46 +48 3 -63.32 -14.06 -4.9 0.56 47 +49 3 -66.36 -14.85 -4.9 0.56 48 +50 3 -69.28 -15.3 -4.9 0.56 49 +51 3 -73.22 -15.75 -4.9 0.56 50 +52 3 -76.37 -18.22 -4.9 0.56 51 +53 3 -78.39 -19.12 -4.9 0.56 52 +54 3 -82.22 -18.55 -4.9 0.56 53 +55 3 -85.14 -18.89 -4.9 0.56 54 +56 3 -86.38 -18.89 -4.9 0.56 55 +57 3 -88.06 -20.47 -4.9 0.335 56 +58 3 -90.2 -22.72 -4.9 0.335 57 +59 3 -91.78 -23.84 -4.9 0.335 58 +60 3 -93.69 -25.42 -4.9 0.335 59 +61 3 -94.59 -26.21 -4.9 0.335 60 +62 3 -88.4 -16.07 -4.9 0.395 56 +63 3 -88.63 -13.72 -4.9 0.395 62 +64 3 -89.08 -12.15 -4.9 0.395 63 +65 3 -90.54 -11.58 -4.9 0.395 64 +66 3 -93.24 -12.82 -4.9 0.395 65 +67 3 -96.16 -13.05 -4.9 0.395 66 +68 3 -97.96 -11.58 -4.9 0.395 67 +69 3 -99.76 -10.57 -4.9 0.395 68 +70 3 -100.77 -11.47 -4.9 0.28 69 +71 3 -100.55 -10.11 -4.9 0.395 70 +72 3 -103.47 -9.67 -4.9 0.395 71 +73 3 -106.28 -9.67 -4.9 0.395 72 +74 3 -107.86 -10.01 -4.9 0.395 73 +75 3 -109.32 -11.02 -4.9 0.395 74 +76 3 -110.45 -11.47 -4.9 0.395 75 +77 3 -111.46 -11.92 -4.9 0.395 76 +78 3 -113.03 -11.92 -4.9 0.395 77 +79 3 -29.02 36.44 -4.9 0.73 14 +80 3 -30.59 36.22 -4.9 0.28 79 +81 3 -31.27 36.33 -4.9 0.28 80 +82 3 -31.72 36.33 -4.9 0.28 81 +83 3 -31.15 38.58 -4.9 0.73 79 +84 3 -32.28 39.59 -4.9 0.73 83 +85 3 -33.29 40.15 -4.9 0.73 84 +86 3 -33.29 40.26 -4.9 0.73 85 +87 3 -37.22 43.3 -4.9 0.62 86 +88 3 -39.47 44.88 -4.9 0.62 87 +89 3 -41.28 45.89 -4.9 0.62 88 +90 3 -44.2 47.91 -4.9 0.62 89 +91 3 -45.89 49.71 -4.9 0.62 90 +92 3 -49.04 52.75 -4.9 0.62 91 +93 3 -52.41 55.34 -4.9 0.62 92 +94 3 -58.26 59.16 -4.9 0.62 93 +95 3 -59.72 60.4 -4.9 0.62 94 +96 3 -60.96 61.52 -4.9 0.62 95 +97 3 -61.07 61.52 -4.9 0.62 96 +98 3 -59.95 62.53 -4.9 0.335 97 +99 3 -63.66 63.55 -4.9 0.62 98 +100 3 -65.01 64.9 -4.9 0.62 99 +101 3 -66.13 65.91 -4.9 0.62 100 +102 3 -66.23 66.02 -4.9 0.62 101 +103 3 -65.12 67.37 -4.9 0.335 102 +104 3 -68.38 67.81 -4.9 0.62 103 +105 3 -68.94 68.72 -4.9 0.62 104 +106 3 -72.88 69.06 -3.92 0.56 105 +107 3 -77.83 70.41 -3.92 0.56 106 +108 3 -81.77 71.64 -3.92 0.56 107 +109 3 -84.8 74.12 -4.9 0.56 108 +110 3 -87.39 76.37 -4.9 0.56 109 +111 3 -89.19 77.27 -4.9 0.56 110 +112 3 -89.64 77.48 -4.9 0.56 111 +113 3 -93.24 77.83 -4.9 0.56 112 +114 3 -97.06 77.94 -4.9 0.56 113 +115 3 -100.66 78.05 -4.9 0.56 114 +116 3 -103.25 78.05 -4.9 0.56 115 +117 3 -106.17 77.48 -4.9 0.56 116 +118 3 -106.96 77.04 -4.9 0.56 117 +119 3 -108.98 76.59 -4.9 0.56 118 +120 3 -110.78 76.7 -4.9 0.56 119 +121 3 -112.69 76.25 -4.9 0.56 120 +122 3 -90.54 82.33 -4.9 0.335 112 +123 3 -90.88 84.69 -4.9 0.335 122 +124 3 -90.09 89.64 -4.9 0.335 123 +125 3 -89.08 95.37 -4.9 0.335 124 +126 3 -88.74 99.2 -4.9 0.335 125 +127 3 -88.63 101.22 -4.9 0.335 126 +128 3 -88.4 104.82 -4.9 0.335 127 +129 3 -87.95 106.4 -4.9 0.335 128 +130 3 -87.95 108.08 -4.9 0.335 129 +131 3 -87.84 108.87 -4.9 0.335 130 +132 3 -87.84 109.21 -4.9 0.335 131 +133 3 -69.62 71.42 -4.9 0.62 105 +134 3 -70.41 74.34 -4.9 0.62 133 +135 3 -71.08 77.48 -3.92 0.62 134 +136 3 -70.86 79.84 -3.92 0.62 135 +137 3 -70.63 82.44 -4.9 0.62 136 +138 3 -71.08 85.36 -3.92 0.62 137 +139 3 -71.87 86.94 -3.92 0.62 138 +140 3 -72.77 90.65 -3.92 0.62 139 +141 3 -73.11 92.11 -3.92 0.62 140 +142 3 -75.69 91.89 -3.92 0.45 141 +143 3 -78.5 90.54 -3.92 0.45 142 +144 3 -79.84 90.31 -3.92 0.45 143 +145 3 -81.88 91.44 -3.92 0.45 144 +146 3 -83.34 92.56 -3.92 0.45 145 +147 3 -84.35 92.9 -3.92 0.45 146 +148 3 -84.69 92.9 -3.92 0.45 147 +149 3 -73.89 94.47 -3.92 0.45 141 +150 3 -74.23 96.5 -3.92 0.45 149 +151 3 -75.69 98.19 -3.92 0.45 150 +152 3 -76.25 98.41 -3.92 0.45 151 +153 3 -78.17 97.17 -3.92 0.28 152 +154 3 -78.84 96.16 -3.92 0.28 153 +155 3 -79.06 95.71 -3.92 0.28 154 +156 3 -78.5 102.01 -3.92 0.62 152 +157 3 -79.52 104.26 -3.92 0.62 156 +158 3 -79.4 108.08 -3.92 0.62 157 +159 3 -81.65 113.93 -3.92 0.62 158 +160 3 -82.44 115.28 -3.92 0.62 159 +161 3 -84.46 114.94 -3.92 0.505 160 +162 3 -86.49 114.94 -3.92 0.45 161 +163 3 -87.95 115.28 -3.92 0.45 162 +164 3 -89.08 115.39 -3.92 0.45 163 +165 3 -34.29 43.41 -4.9 0.45 86 +166 3 -35.09 45.33 -4.9 0.395 165 +167 3 -37.34 47.46 -4.9 0.395 166 +168 3 -39.14 50.16 -4.9 0.395 167 +169 3 -40.94 52.52 -4.9 0.395 168 +170 3 -41.39 53.76 -4.9 0.395 169 +171 3 -42.06 54.44 -4.9 0.395 170 +172 3 -47.01 56.01 -4.9 0.395 171 +173 3 -53.31 59.5 -4.9 0.395 172 +174 3 -56.12 62.65 -4.9 0.395 173 +175 3 -56.35 60.06 -4.9 0.28 174 +176 3 -58.48 55.56 -4.9 0.225 175 +177 3 -59.38 53.31 -4.9 0.225 176 +178 3 -60.51 51.51 -4.9 0.225 177 +179 3 -61.63 49.26 -4.9 0.225 178 +180 3 -58.37 66.58 -4.9 0.335 174 +181 3 -60.4 71.08 -4.9 0.335 180 +182 3 -63.21 75.34 -4.9 0.28 181 +183 3 -65.56 78.05 -4.9 0.28 182 +184 3 -70.41 83.23 -4.9 0.28 183 +185 3 -75.58 84.69 -4.9 0.28 184 +186 3 -80.3 85.93 -4.9 0.28 185 +187 3 -84.02 85.59 -5.88 0.28 186 +188 3 -88.96 85.7 -5.88 0.28 187 +189 3 -94.02 85.7 -5.88 0.28 188 +190 3 -96.61 86.38 -5.88 0.28 189 +191 3 -102.57 87.16 -5.88 0.28 190 +192 3 -106.73 88.29 -5.88 0.28 191 +193 3 -109.21 89.75 -5.88 0.28 192 +194 3 -110.78 91.66 -4.9 0.28 193 +195 3 -111.8 93.35 -4.9 0.28 194 +196 3 -111.91 94.25 -4.9 0.28 195 +197 3 -108.76 85.36 -5.88 0.28 191 +198 3 -111.8 84.02 -5.88 0.28 197 +199 3 -40.15 58.71 -4.9 0.335 171 +200 3 -38.35 62.53 -4.9 0.335 199 +201 3 -37.22 67.26 -4.9 0.335 200 +202 3 -37.45 71.42 -4.9 0.335 201 +203 3 -38.69 76.59 -4.9 0.335 202 +204 3 -40.38 79.63 -4.9 0.335 203 +205 3 -42.4 82.55 -4.9 0.335 204 +206 3 -42.85 84.13 -4.9 0.335 205 +207 3 -42.96 88.18 -4.9 0.335 206 +208 3 -42.63 91.44 -4.9 0.335 207 +209 3 -42.51 92.11 -4.9 0.335 208 +210 3 -42.74 97.62 -4.9 0.335 209 +211 3 -40.6 104.93 -3.92 0.335 210 +212 3 -39.03 110.56 -3.92 0.335 211 +213 3 -39.14 113.26 -3.92 0.335 212 +214 3 -38.35 114.94 -3.92 0.335 213 +215 3 -15.41 32.84 -4.9 0.955 10 +216 3 -15.07 34.08 -4.9 0.955 215 +217 3 -11.81 35.77 -3.92 0.395 216 +218 3 -8.32 39.81 -3.92 0.395 217 +219 3 -3.37 44.43 -3.92 0.395 218 +220 3 0.34 47.8 -3.92 0.395 219 +221 3 5.05 54.41 -4.9 0.335 220 +222 3 11.92 60.03 -4.9 0.335 221 +223 3 16.42 62.28 -4.9 0.335 222 +224 3 21.26 64.31 -4.9 0.335 223 +225 3 28.01 71.17 -4.9 0.335 224 +226 3 31.15 74.88 -4.9 0.335 225 +227 3 33.74 77.58 -3.92 0.335 226 +228 3 38.58 81.96 -3.92 0.335 227 +229 3 41.61 86.35 -3.92 0.335 228 +230 3 43.53 90.17 -3.92 0.335 229 +231 3 44.09 93.21 -3.92 0.335 230 +232 3 45.33 96.36 -3.92 0.335 231 +233 3 44.31 100.63 -3.92 0.335 232 +234 3 42.85 105.47 -3.92 0.335 233 +235 3 42.85 107.72 -3.92 0.335 234 +236 3 41.16 113.12 -3.92 0.335 235 +237 3 40.94 114.13 -3.92 0.335 236 +238 3 40.83 114.47 -3.92 0.335 237 +239 3 -14.51 39.7 -4.9 0.9 216 +240 3 -14.62 41.84 -4.9 0.9 239 +241 3 -16.3 43.3 -4.9 0.675 240 +242 3 -16.87 43.98 -4.9 0.675 241 +243 3 -18.45 43.08 -4.9 0.335 242 +244 3 -19.68 42.51 -4.9 0.335 243 +245 3 -20.02 48.02 -4.9 0.73 242 +246 3 -21.59 50.16 -4.9 0.73 245 +247 3 -23.62 51.96 -4.9 0.73 246 +248 3 -24.52 53.09 -4.9 0.73 247 +249 3 -28.12 53.87 -4.9 0.56 248 +250 3 -29.58 54.21 -4.9 0.56 249 +251 3 -30.93 56.12 -4.9 0.28 250 +252 3 -31.04 57.13 -4.9 0.28 251 +253 3 -31.27 57.92 -4.9 0.28 252 +254 3 -33.18 54.89 -4.9 0.395 250 +255 3 -36.33 54.77 -4.9 0.395 254 +256 3 -39.81 53.65 -4.9 0.395 255 +257 3 -44.65 54.32 -4.9 0.395 256 +258 3 -48.7 55.45 -4.9 0.395 257 +259 3 -52.3 56.12 -4.9 0.395 258 +260 3 -55.56 57.02 -4.9 0.395 259 +261 3 -57.7 56.91 -4.9 0.395 260 +262 3 -27.67 56.01 -4.9 0.675 248 +263 3 -31.27 58.93 -4.9 0.675 262 +264 3 -33.85 61.18 -4.9 0.675 263 +265 3 -34.42 62.31 -4.9 0.675 264 +266 3 -32.84 63.97 -3.92 0.395 265 +267 3 -31.94 64.42 -3.92 0.395 266 +268 3 -31.49 64.98 -3.92 0.395 267 +269 3 -37.34 65.31 -4.9 0.62 265 +270 3 -40.94 68.13 -4.9 0.62 269 +271 3 -42.85 69.93 -4.9 0.62 270 +272 3 -43.98 71.62 -4.9 0.62 271 +273 3 -44.2 72.29 -4.9 0.62 272 +274 3 -43.3 72.63 -3.92 0.395 273 +275 3 -46.68 74.88 -3.92 0.62 274 +276 3 -48.81 77.23 -3.92 0.62 275 +277 3 -50.95 78.93 -3.92 0.62 276 +278 3 -51.74 79.48 -4.9 0.62 277 +279 3 -53.31 77.23 -4.9 0.225 278 +280 3 -53.76 76.12 -4.9 0.225 279 +281 3 -54.32 75.89 -4.9 0.225 280 +282 3 -53.2 80.5 -4.9 0.62 278 +283 3 -57.36 79.26 -4.9 0.335 282 +284 3 -60.4 79.48 -4.9 0.335 283 +285 3 -63.88 78.7 -4.9 0.335 284 +286 3 -68.27 78.81 -4.9 0.335 285 +287 3 -73.22 79.04 -4.9 0.335 286 +288 3 -76.37 80.05 -4.9 0.335 287 +289 3 -80.64 79.83 -4.9 0.335 288 +290 3 -81.99 79.83 -4.9 0.335 289 +291 3 -84.35 79.38 -4.9 0.335 290 +292 3 -86.6 79.38 -4.9 0.335 291 +293 3 -90.76 81.96 -4.9 0.335 292 +294 3 -92.11 83.09 -4.9 0.335 293 +295 3 -93.13 83.88 -4.9 0.335 294 +296 3 -54.89 82.75 -4.9 0.62 282 +297 3 -55.67 83.88 -4.9 0.62 296 +298 3 -54.44 84.44 -4.9 0.335 297 +299 3 -58.6 86.24 -4.9 0.62 298 +300 3 -61.63 88.82 -4.9 0.62 299 +301 3 -63.21 89.61 -4.9 0.62 300 +302 3 -69.06 89.05 -4.9 0.62 301 +303 3 -73.22 88.94 -4.9 0.62 302 +304 3 -77.59 90.96 -4.9 0.62 303 +305 3 -82.1 93.55 -4.9 0.62 304 +306 3 -84.91 95.46 -4.9 0.62 305 +307 3 -90.76 96.58 -4.9 0.62 306 +308 3 -94.47 95.24 -4.9 0.62 307 +309 3 -95.37 95.01 -4.9 0.62 308 +310 3 -96.72 93.55 -4.9 0.335 309 +311 3 -99.2 93.55 -4.9 0.335 310 +312 3 -101.67 93.32 -4.9 0.335 311 +313 3 -99.65 95.12 -4.9 0.675 309 +314 3 -103.13 95.35 -4.9 0.675 313 +315 3 -105.83 95.12 -4.9 0.62 314 +316 3 -107.63 95.8 -4.9 0.62 315 +317 3 -110.11 94.34 -4.9 0.62 316 +318 3 -111.8 93.1 -4.9 0.62 317 +319 3 -112.69 93.21 -4.9 0.62 318 +320 3 -11.36 46.56 -4.9 0.845 240 +321 3 -10.01 49.15 -4.9 0.845 320 +322 3 -9.34 50.27 -4.9 0.845 321 +323 3 -8.1 56.35 -4.9 0.845 322 +324 3 -7.87 59.5 -4.9 0.73 323 +325 3 -7.99 62.53 -4.9 0.73 324 +326 3 -7.54 64.33 -4.9 0.73 325 +327 3 -9.44 65.34 -4.9 0.45 326 +328 3 -9.9 65.68 -4.9 0.45 327 +329 3 -10.91 66.13 -4.9 0.45 328 +330 3 -11.58 66.23 -4.9 0.45 329 +331 3 -5.4 69.39 -4.9 0.73 326 +332 3 -3.94 69.06 -4.9 0.335 331 +333 3 -4.61 72.2 -4.9 0.73 332 +334 3 -3.6 74.45 -5.88 0.73 333 +335 3 -4.61 75.47 -5.88 0.335 334 +336 3 -5.4 76.14 -5.88 0.335 335 +337 3 -6.3 76.59 -5.88 0.335 336 +338 3 -1.46 79.63 -4.9 0.845 334 +339 3 1.57 80.42 -4.9 0.45 338 +340 3 4.16 81.77 -4.9 0.45 339 +341 3 5.96 83.12 -4.9 0.335 340 +342 3 7.31 84.35 -3.92 0.335 341 +343 3 7.76 84.69 -3.92 0.335 342 +344 3 -0.11 83.23 -4.9 0.785 338 +345 3 0.73 85.7 -4.9 0.785 344 +346 3 1.14 86.94 -4.9 0.785 345 +347 3 1.57 88.18 -4.9 0.785 346 +348 3 9.97 87.5 -4.9 0.335 346 +349 3 2.36 89.98 -4.9 0.785 345 +350 3 2.59 89.98 -4.9 0.785 349 +351 3 -1.01 94.14 -4.9 0.62 350 +352 3 -3.15 96.39 -4.9 0.62 351 +353 3 -7.09 99.99 -3.92 0.62 352 +354 3 -8.32 101 -3.92 0.62 353 +355 3 -9.22 103.81 -3.92 0.56 354 +356 3 -10.11 106.62 -3.92 0.56 355 +357 3 -10.8 108.53 -3.92 0.56 356 +358 3 -13.05 110.56 -3.92 0.56 357 +359 3 -14.85 111.23 -3.92 0.56 358 +360 3 -16.07 111.8 -3.92 0.56 359 +361 3 -16.76 113.37 -3.92 0.505 360 +362 3 -17.77 114.61 -3.92 0.505 361 +363 3 -18.55 115.39 -3.92 0.505 362 +364 3 -18.89 110.33 -3.92 0.395 360 +365 3 -21.48 109.55 -3.92 0.395 364 +366 3 -22.72 109.55 -3.92 0.395 365 +367 3 -24.63 110.22 -3.92 0.335 366 +368 3 -26.21 110.56 -3.92 0.335 367 +369 3 -28.01 110.11 -3.92 0.335 368 +370 3 -30.14 108.76 -3.92 0.335 369 +371 3 -34.64 108.53 -3.92 0.335 370 +372 3 -36.22 107.41 -3.92 0.335 371 +373 3 -38.46 104.93 -3.92 0.28 372 +374 3 -39.14 104.48 -3.92 0.28 373 +375 3 -25.31 106.4 -3.92 0.28 366 +376 3 -26.88 105.27 -3.92 0.28 375 +377 3 -28.79 105.38 -3.92 0.28 376 +378 3 -29.35 105.72 -3.92 0.28 377 +379 3 -30.14 105.72 -3.92 0.28 378 +380 3 9 94.36 -4.9 0.73 350 +381 3 10.23 95.26 -4.9 0.73 380 +382 3 10.68 95.82 -4.9 0.73 381 +383 3 12.37 94.59 -4.9 0.28 382 +384 3 14.62 93.35 -4.9 0.28 383 +385 3 16.2 93.13 -4.9 0.28 384 +386 3 18.78 92.56 -4.9 0.28 385 +387 3 20.36 91.44 -4.9 0.28 386 +388 3 13.05 99.09 -3.92 0.73 382 +389 3 14.4 102.46 -3.92 0.62 388 +390 3 12.03 103.13 -3.92 0.45 389 +391 3 10.23 103.36 -3.92 0.45 390 +392 3 7.2 104.03 -3.92 0.45 391 +393 3 6.3 104.03 -3.92 0.45 392 +394 3 15.18 104.26 -3.92 0.73 389 +395 3 14.4 107.86 -3.92 0.45 394 +396 3 14.28 110.33 -3.92 0.45 395 +397 3 14.17 111.12 -3.92 0.45 396 +398 3 13.95 112.25 -3.92 0.45 397 +399 3 13.5 113.37 -3.92 0.45 398 +400 3 13.05 114.49 -3.92 0.45 399 +401 3 12.6 115.28 -3.92 0.45 400 +402 3 17.43 111.8 -3.92 0.395 397 +403 3 20.36 113.26 -3.92 0.395 402 +404 3 22.49 114.16 -3.92 0.395 403 +405 3 23.96 114.61 -3.92 0.395 404 +406 3 24.86 114.94 -3.92 0.395 405 +407 3 18.11 106.28 -3.92 0.62 394 +408 3 20.13 108.08 -3.92 0.62 407 +409 3 22.16 109.88 -3.92 0.62 408 +410 3 23.62 111.46 -3.92 0.62 409 +411 3 23.73 112.69 -3.92 0.62 410 +412 3 24.86 114.16 -3.92 0.62 411 +413 3 25.64 115.06 -3.92 0.62 412 +414 3 26.09 115.51 -3.92 0.62 413 +415 3 2.81 82.1 -4.9 0.335 344 +416 3 4.84 80.75 -4.9 0.335 415 +417 3 5.62 80.19 -4.9 0.335 416 +418 3 -3.07 51.53 -4.9 0.845 322 +419 3 -9.6 56.25 -4.9 0.335 418 +420 3 -15.67 60.75 -4.9 0.335 419 +421 3 -20.17 62.33 -4.9 0.335 420 +422 3 1.01 53.2 -4.9 0.62 418 +423 3 5.17 54.1 -4.9 0.62 422 +424 3 12.26 58.93 -4.9 0.62 423 +425 3 15.97 61.3 -4.9 0.62 424 +426 3 23.84 66.58 -4.9 0.62 425 +427 3 28.57 70.18 -4.9 0.62 426 +428 3 32.84 72.31 -4.9 0.62 427 +429 3 35.99 72.98 -4.9 0.62 428 +430 3 40.38 74.01 -4.9 0.62 429 +431 3 46 77.04 -3.92 0.62 430 +432 3 48.25 79.84 -3.92 0.56 431 +433 3 49.82 82.1 -3.92 0.56 432 +434 3 51.4 86.71 -3.92 0.56 433 +435 3 53.42 90.09 -3.92 0.505 434 +436 3 55.56 93.57 -3.92 0.505 435 +437 3 59.61 96.84 -2.94 0.505 436 +438 3 63.55 100.32 -2.94 0.505 437 +439 3 66.92 103.25 -2.94 0.505 438 +440 3 69.28 105.27 -2.94 0.505 439 +441 3 70.97 107.97 -2.94 0.505 440 +442 3 71.08 107.94 -2.94 0.505 441 +443 3 71.64 109.32 -2.94 0.505 442 +444 3 71.87 110 -2.94 0.505 443 +445 3 73.67 112.33 -2.94 0.335 444 +446 3 74.9 114.8 -2.94 0.335 445 +447 3 75.23 115.25 -2.94 0.335 446 +448 3 75.23 108.28 -2.94 0.335 442 +449 3 79.52 110.08 -2.94 0.335 448 +450 3 83.57 113.12 -2.94 0.335 449 +451 3 84.24 113.91 -2.94 0.335 450 +452 3 11.7 -3.15 -4.9 0.675 1 +453 3 12.71 -6.97 -4.9 0.73 452 +454 3 12.26 -11.02 -3.92 0.73 453 +455 3 12.48 -13.72 -3.92 0.62 454 +456 3 12.37 -16.42 -3.92 0.62 455 +457 3 11.81 -19.23 -3.92 0.62 456 +458 3 9.34 -24.07 -3.92 0.62 457 +459 3 6.41 -31.49 -3.92 0.62 458 +460 3 4.26 -30.93 -3.92 0.45 459 +461 3 0.79 -31.49 -3.92 0.45 460 +462 3 -3.94 -33.74 -3.92 0.45 461 +463 3 -5.17 -34.64 -3.92 0.45 462 +464 3 -6.64 -35.09 -3.92 0.45 463 +465 3 2.02 -41.84 -3.92 0.45 459 +466 3 2.02 -42.4 -3.92 0.45 465 +467 3 3.15 -43.53 -3.92 0.45 466 +468 3 4.05 -44.2 -3.92 0.45 467 +469 3 5.05 -44.43 -3.92 0.45 468 +470 3 0.11 -46.68 -3.92 0.45 466 +471 3 0 -48.92 -3.92 0.45 470 +472 3 -0.22 -50.72 -3.92 0.45 471 +473 3 -1.69 -52.64 -3.92 0.45 472 +474 3 -5.74 -58.03 -3.92 0.45 473 +475 3 -10.01 -65.91 -3.92 0.45 474 +476 3 -11.02 -70.29 -3.92 0.45 475 +477 3 -12.03 -74.9 -3.92 0.45 476 +478 3 -11.92 -77.38 -3.92 0.45 477 +479 3 -11.02 -78.84 -3.92 0.45 478 +480 3 -11.92 -80.53 -4.9 0.395 479 +481 3 -11.7 -82.89 -4.9 0.395 480 +482 3 -12.48 -85.7 -4.9 0.28 481 +483 3 -13.95 -89.64 -4.9 0.28 482 +484 3 -14.73 -92 -4.9 0.28 483 +485 3 -15.41 -93.35 -4.9 0.28 484 +486 3 11.25 5.17 -4.9 0.73 1 +487 3 13.83 8.44 -4.9 0.73 486 +488 3 15.97 11.81 -4.9 0.73 487 +489 3 16.3 13.72 -4.9 0.62 488 +490 3 12.82 17.66 -4.9 0.505 489 +491 3 9.56 19.91 -4.9 0.45 490 +492 3 6.86 22.49 -4.9 0.45 491 +493 3 4.61 25.64 -4.9 0.45 492 +494 3 2.14 28.57 -4.9 0.45 493 +495 3 -0.56 30.37 -4.9 0.45 494 +496 3 -3.26 32.17 -4.9 0.45 495 +497 3 -6.52 34.86 -4.9 0.45 496 +498 3 -10.23 37.68 -4.9 0.45 497 +499 3 -12.03 37.68 -4.9 0.45 498 +500 3 -13.61 39.14 -4.9 0.395 499 +501 3 18.45 18.55 -4.9 0.62 489 +502 3 20.47 25.76 -4.9 0.62 501 +503 3 20.81 29.24 -4.9 0.62 502 +504 3 20.23 33.29 -4.9 0.56 503 +505 3 18.78 37.9 -4.9 0.56 504 +506 3 18.11 42.18 -3.92 0.45 505 +507 3 18.11 45.21 -3.92 0.45 506 +508 3 19.57 49.26 -3.92 0.45 507 +509 3 21.37 51.17 -3.92 0.45 508 +510 3 23.51 52.86 -3.92 0.45 509 +511 3 28.45 53.31 -4.9 0.45 510 +512 3 32.61 54.89 -4.9 0.45 511 +513 3 34.97 55.56 -5.88 0.45 512 +514 3 40.6 55.79 -6.86 0.45 513 +515 3 44.2 57.13 -6.86 0.45 514 +516 3 46.45 60.73 -4.9 0.45 515 +517 3 46.23 63.43 -4.9 0.45 516 +518 3 45.66 68.61 -4.9 0.45 517 +519 3 46.23 73.33 -4.9 0.45 518 +520 3 47.91 76.59 -4.9 0.45 519 +521 3 49.04 80.42 -4.9 0.45 520 +522 3 49.71 83.99 -3.92 0.45 521 +523 3 -8.55 1.57 -4.9 1.63 1 +524 3 -11.02 0.22 -4.9 1.63 523 +525 3 -16.07 -8.21 -4.9 0.73 524 +526 3 -16.64 -9 -4.9 0.73 525 +527 3 -34.9 -18.63 -4.9 0.73 526 +528 3 -35.55 -18.97 -4.9 0.73 527 +529 3 -36.19 -19.31 -4.9 0.73 528 +530 3 -37.49 -20 -4.9 0.73 529 +531 3 -17.88 -13.16 -4.9 0.675 529 +532 3 -18.67 -16.42 -4.9 0.675 531 +533 3 -20.02 -18.89 -4.9 0.62 532 +534 3 -22.61 -22.72 -4.9 0.62 533 +535 3 -26.32 -28.57 -4.9 0.62 534 +536 3 -28.01 -30.93 -4.9 0.62 535 +537 3 -28.9 -37.34 -4.9 0.505 536 +538 3 -26.66 -38.69 -4.9 0.28 537 +539 3 -23.39 -41.39 -4.9 0.28 538 +540 3 -19.91 -44.31 -4.9 0.28 539 +541 3 -32.5 -47.01 -4.9 0.505 537 +542 3 -34.29 -50.5 -4.9 0.505 541 +543 3 -35.99 -52.75 -4.9 0.505 542 +544 3 -37.22 -58.6 -4.9 0.505 543 +545 3 -37.56 -61.18 -5.88 0.505 544 +546 3 -38.9 -68.38 -5.88 0.505 545 +547 3 -39.03 -71.64 -5.88 0.45 546 +548 3 -39.59 -75.92 -4.9 0.395 547 +549 3 -38.79 -80.53 -4.9 0.395 548 +550 3 -37.45 -84.8 -4.9 0.395 549 +551 3 -35.43 -90.88 -4.9 0.395 550 +552 3 -34.08 -99.65 -4.9 0.395 551 +553 3 -33.63 -100.44 -4.9 0.395 552 +554 3 -44.31 -72.2 -4.9 0.395 546 +555 3 -46.11 -75.23 -4.9 0.395 554 +556 3 -49.6 -74.68 -4.9 0.225 555 +557 3 -51.4 -74.79 -4.9 0.225 556 +558 3 -53.65 -74.9 -4.9 0.225 557 +559 3 -48.92 -80.53 -4.9 0.45 555 +560 3 -50.61 -83.9 -4.9 0.45 559 +561 3 -52.75 -88.63 -4.9 0.45 560 +562 3 -53.09 -92.68 -4.9 0.45 561 +563 3 -52.52 -97.74 -4.9 0.45 562 +564 3 -53.54 -102.57 -4.9 0.45 563 +565 3 -53.65 -103.92 -4.9 0.45 564 +566 3 -54.32 -107.52 -4.9 0.395 565 +567 3 -34.42 -33.52 -4.9 0.395 536 +568 3 -36.33 -35.2 -4.9 0.395 567 +569 3 -37.11 -35.54 -4.9 0.395 568 +570 3 -37.79 -38.24 -4.9 0.28 569 +571 3 -38.01 -39.14 -4.9 0.28 570 +572 3 -44.31 -38.9 -4.9 0.395 569 +573 3 -48.02 -40.26 -4.9 0.395 572 +574 3 -50.16 -41.39 -4.9 0.395 573 +575 3 -50.84 -41.73 -4.9 0.395 574 +576 3 -50.27 -44.31 -4.9 0.225 575 +577 3 -49.71 -46.56 -4.9 0.225 576 +578 3 -49.94 -47.69 -4.9 0.225 577 +579 3 -58.15 -43.64 -4.9 0.395 575 +580 3 -59.95 -44.54 -4.9 0.395 579 +581 3 -62.76 -44.88 -4.9 0.395 580 +582 3 -65.56 -44.76 -4.9 0.395 581 +583 3 -68.04 -44.43 -4.9 0.395 582 +584 3 -71.08 -46.23 -4.9 0.395 583 +585 3 -75.02 -48.92 -4.9 0.395 584 +586 3 -77.15 -49.71 -4.9 0.395 585 +587 3 -79.84 -51.17 -4.9 0.395 586 +588 3 -81.43 -51.51 -4.9 0.395 587 +589 3 -81.99 -52.07 -4.9 0.395 588 +590 3 -82.22 -52.75 -4.9 0.395 589 +591 3 -82.67 -54.44 -4.9 0.395 590 +592 3 -83 -55.22 -4.9 0.395 591 +593 3 -32.09 -24.5 -4.9 0.335 528 +594 3 -38.46 -20.27 -4.9 0.505 527 +595 3 -43.64 -23.42 -4.9 0.505 594 +596 3 -47.24 -26.01 -4.9 0.505 595 +597 3 -48.02 -29.61 -4.9 0.505 596 +598 3 -50.61 -32.19 -4.9 0.505 597 +599 3 -51.4 -32.97 -4.9 0.505 598 +600 3 -50.27 -33.99 -4.9 0.335 599 +601 3 -59.16 -41.19 -4.9 0.505 600 +602 3 -61.52 -44.23 -4.9 0.45 601 +603 3 -64.9 -48.05 -4.9 0.45 602 +604 3 -67.7 -50.75 -4.9 0.45 603 +605 3 -71.53 -49.18 -3.92 0.335 604 +606 3 -76.37 -44.9 -3.92 0.335 605 +607 3 -80.64 -42.43 -3.92 0.335 606 +608 3 -83.9 -40.18 -3.92 0.335 607 +609 3 -91.21 -41.53 -3.92 0.335 608 +610 3 -93.91 -42.09 -4.9 0.335 609 +611 3 -99.2 -41.3 -4.9 0.335 610 +612 3 -102.91 -38.15 -4.9 0.335 611 +613 3 -105.61 -36.79 -5.88 0.335 612 +614 3 -108.53 -36.13 -4.9 0.335 613 +615 3 -111.12 -35.34 -4.9 0.335 614 +616 3 -112.36 -35.22 -4.9 0.335 615 +617 3 -74.34 -57.16 -4.9 0.335 604 +618 3 -76.14 -59.97 -4.9 0.335 617 +619 3 -75.13 -63.01 -4.9 0.225 618 +620 3 -74.91 -68.41 -4.9 0.225 619 +621 3 -73.44 -72.23 -4.9 0.225 620 +622 3 -72.31 -77.06 -4.9 0.225 621 +623 3 -69.17 -82.36 -4.9 0.225 622 +624 3 -63.55 -87.19 -4.9 0.225 623 +625 3 -62.53 -87.53 -4.9 0.225 624 +626 3 -61.86 -87.87 -4.9 0.225 625 +627 3 -79.63 -66.38 -4.9 0.395 618 +628 3 -79.97 -67.28 -4.9 0.395 627 +629 3 -80.19 -70.2 -4.9 0.225 628 +630 3 -81.54 -72.23 -4.9 0.225 629 +631 3 -84.58 -75.83 -4.9 0.225 630 +632 3 -86.15 -77.18 -4.9 0.225 631 +633 3 -87.61 -77.86 -4.9 0.225 632 +634 3 -87.95 -78.08 -4.9 0.225 633 +635 3 -87.16 -70.2 -4.9 0.225 628 +636 3 -91.44 -72.8 -4.9 0.225 635 +637 3 -99.2 -78.76 -4.9 0.225 636 +638 3 -102.8 -82.8 -4.9 0.225 637 +639 3 -106.62 -89.22 -4.9 0.225 638 +640 3 -106.4 -92.93 -4.9 0.225 639 +641 3 -106.73 -97.99 -4.9 0.225 640 +642 3 -104.71 -102.37 -4.9 0.225 641 +643 3 -103.7 -103.5 -4.9 0.225 642 +644 3 -19.68 -9.22 -4.9 0.45 526 +645 3 -21.59 -11.13 -4.9 0.45 644 +646 3 -24.86 -16.87 -4.9 0.45 645 +647 3 -27.33 -21.26 -4.9 0.45 646 +648 3 -30.37 -23.84 -4.9 0.45 647 +649 3 -33.74 -26.77 -3.92 0.45 648 +650 3 -36.54 -28.34 -3.92 0.45 649 +651 3 -38.46 -27.44 -3.92 0.335 650 +652 3 -39.59 -26.66 -3.92 0.335 651 +653 3 -40.15 -26.32 -3.92 0.335 652 +654 3 -38.01 -31.27 -3.92 0.335 650 +655 3 -38.79 -34.75 -3.92 0.335 654 +656 3 -41.39 -38.35 -3.92 0.335 655 +657 3 -45.89 -41.95 -3.92 0.335 656 +658 3 -49.26 -44.99 -3.92 0.335 657 +659 3 -52.19 -47.57 -4.9 0.335 658 +660 3 14.17 0.34 -4.9 1.575 1 +661 3 16.76 0.22 -4.9 1.575 660 +662 3 19.37 -0.72 -4.61 1.01 661 +663 3 21.98 -1.67 -4.33 1.01 662 +664 3 25.76 -3.04 -3.92 1.01 663 +665 3 25.42 -5.29 -3.92 0.225 664 +666 3 32.04 -4.5 -3.92 1.01 665 +667 3 37.68 -7.09 -3.92 1.01 666 +668 3 42.06 -9 -3.92 1.01 667 +669 3 44.31 -12.71 -3.92 0.62 668 +670 3 46 -13.83 -3.92 0.62 669 +671 3 50.05 -19.12 -3.92 0.62 670 +672 3 50.95 -20.92 -3.92 0.62 671 +673 3 52.52 -26.54 -3.92 0.62 672 +674 3 55.79 -31.83 -3.92 0.73 673 +675 3 56.35 -32.61 -3.92 0.73 674 +676 3 63.43 -37.68 -3.92 0.62 675 +677 3 66.02 -39.36 -3.92 0.62 676 +678 3 73.22 -39.47 -3.92 0.56 677 +679 3 79.52 -39.14 -3.92 0.56 678 +680 3 80.53 -39.03 -3.92 0.56 679 +681 3 84.02 -34.86 -3.92 0.56 680 +682 3 86.26 -32.5 -3.92 0.56 681 +683 3 89.86 -26.88 -3.92 0.505 682 +684 3 91.78 -23.06 -3.92 0.505 683 +685 3 95.94 -18.32 -3.92 0.505 684 +686 3 98.07 -16.42 -3.92 0.505 685 +687 3 100.1 -14.85 -3.92 0.505 686 +688 3 100.55 -13.95 -3.92 0.505 687 +689 3 100.89 -13.61 -3.92 0.505 688 +690 3 88.85 -32.72 -3.92 0.335 682 +691 3 91.21 -32.72 -3.92 0.335 690 +692 3 83.45 -39.36 -3.92 0.56 680 +693 3 83.57 -40.94 -3.92 0.28 692 +694 3 85.93 -39.59 -3.92 0.56 693 +695 3 89.64 -41.05 -3.92 0.56 694 +696 3 96.72 -44.43 -3.92 0.56 695 +697 3 99.87 -46.9 -4.9 0.56 696 +698 3 102.57 -48.81 -4.9 0.56 697 +699 3 105.16 -50.61 -4.9 0.56 698 +700 3 109.66 -52.19 -4.9 0.56 699 +701 3 112.69 -54.1 -4.9 0.56 700 +702 3 115.96 -55.22 -4.9 0.56 701 +703 3 116.97 -55.56 -4.9 0.56 702 +704 3 66.02 -42.63 -3.92 0.45 677 +705 3 65.34 -44.54 -3.92 0.45 704 +706 3 67.37 -46.45 -3.92 0.45 705 +707 3 68.16 -46.79 -3.92 0.45 706 +708 3 70.97 -51.51 -3.92 0.395 707 +709 3 73.44 -54.89 -3.92 0.395 708 +710 3 76.59 -61.3 -3.92 0.395 709 +711 3 77.72 -60.73 -3.92 0.395 710 +712 3 76.7 -64.22 -3.92 0.395 711 +713 3 76.25 -67.7 -3.92 0.395 712 +714 3 76.37 -68.72 -3.92 0.395 713 +715 3 80.19 -71.08 -2.94 0.505 714 +716 3 82.89 -71.08 -2.94 0.505 715 +717 3 85.93 -72.31 -2.94 0.505 716 +718 3 90.31 -74.12 -2.94 0.505 717 +719 3 94.02 -75.23 -2.94 0.505 718 +720 3 97.06 -74.45 -2.94 0.505 719 +721 3 101.67 -74.01 -2.94 0.395 720 +722 3 104.82 -74.12 -2.94 0.395 721 +723 3 108.2 -75.34 -2.94 0.395 722 +724 3 110.78 -76.37 -2.94 0.395 723 +725 3 113.03 -77.27 -2.94 0.395 724 +726 3 114.38 -77.83 -2.94 0.395 725 +727 3 115.39 -78.28 -2.94 0.395 726 +728 3 98.07 -72.66 -2.94 0.335 720 +729 3 98.3 -71.53 -2.94 0.335 728 +730 3 73.56 -70.06 -2.94 0.395 714 +731 3 69.84 -73.11 -2.94 0.395 730 +732 3 68.04 -73.56 -2.94 0.395 731 +733 3 66.13 -73.78 -2.94 0.395 732 +734 3 69.06 -44.65 -2.94 0.28 707 +735 3 69.06 -43.53 -2.94 0.225 734 +736 3 69.06 -42.51 -2.94 0.225 735 +737 3 54.55 -36.54 -3.92 0.56 675 +738 3 53.76 -41.5 -3.92 0.56 737 +739 3 53.87 -46.68 -3.92 0.56 738 +740 3 53.76 -48.47 -3.92 0.56 739 +741 3 52.75 -53.76 -3.92 0.395 740 +742 3 53.65 -55.9 -3.92 0.395 741 +743 3 53.87 -58.48 -3.92 0.395 742 +744 3 53.42 -59.95 -3.92 0.395 743 +745 3 53.09 -62.98 -3.92 0.395 744 +746 3 53.09 -64.56 -3.92 0.395 745 +747 3 51.4 -50.72 -3.92 0.395 740 +748 3 50.84 -52.64 -3.92 0.395 747 +749 3 50.39 -53.76 -3.92 0.395 748 +750 3 51.85 -66.36 -3.92 0.395 749 +751 3 53.09 -68.38 -3.92 0.335 750 +752 3 53.87 -72.31 -4.9 0.335 751 +753 3 55.22 -74.68 -4.9 0.335 752 +754 3 55.34 -78.5 -4.9 0.335 753 +755 3 56.46 -81.77 -4.9 0.335 754 +756 3 56.46 -82.55 -4.9 0.335 755 +757 3 51.17 -29.58 -3.92 0.45 673 +758 3 50.16 -32.28 -3.92 0.45 757 +759 3 48.92 -35.54 -3.92 0.45 758 +760 3 49.37 -41.16 -3.92 0.45 759 +761 3 48.36 -45.89 -3.92 0.45 760 +762 3 46.45 -48.7 -3.92 0.395 761 +763 3 43.41 -51.96 -3.92 0.395 762 +764 3 39.7 -53.42 -3.92 0.395 763 +765 3 36.67 -54.89 -3.92 0.395 764 +766 3 33.74 -56.68 -3.92 0.395 765 +767 3 32.28 -58.03 -3.92 0.395 766 +768 3 31.72 -58.48 -3.92 0.395 767 +769 3 43.98 -46.34 -2.94 0.335 761 +770 3 40.94 -47.91 -2.94 0.335 769 +771 3 40.15 -48.47 -2.94 0.335 770 +772 3 54.1 -20.23 -3.92 0.45 672 +773 3 56.8 -19.01 -3.92 0.45 772 +774 3 60.73 -17.21 -3.92 0.45 773 +775 3 61.52 -14.06 -3.92 0.45 774 +776 3 62.2 -12.15 -3.92 0.45 775 +777 3 62.2 -11.36 -3.92 0.45 776 +778 3 46.79 -12.6 -3.92 0.335 670 +779 3 47.69 -12.03 -3.92 0.335 778 +780 3 50.5 -6.52 -3.92 0.73 668 +781 3 52.3 -6.19 -4.9 0.73 780 +782 3 52.64 -7.2 -3.92 0.395 781 +783 3 56.57 -4.38 -3.92 0.73 782 +784 3 61.07 -8.66 -3.92 0.505 783 +785 3 62.76 -12.15 -3.92 0.505 784 +786 3 63.43 -14.85 -3.92 0.505 785 +787 3 63.43 -16.42 -3.92 0.395 786 +788 3 66.81 -19.46 -3.92 0.395 787 +789 3 70.86 -25.64 -3.92 0.395 788 +790 3 72.43 -29.02 -3.92 0.395 789 +791 3 74.68 -32.04 -2.94 0.395 790 +792 3 75.8 -36.44 -2.94 0.395 791 +793 3 76.03 -41.16 -2.94 0.395 792 +794 3 76.25 -49.04 -2.94 0.395 793 +795 3 75.13 -52.41 -2.94 0.395 794 +796 3 74.12 -55.9 -2.94 0.395 795 +797 3 73.22 -57.25 -2.94 0.395 796 +798 3 73.33 -27.67 -3.92 0.395 790 +799 3 74.01 -26.66 -3.92 0.395 798 +800 3 74.23 -25.42 -3.92 0.395 799 +801 3 67.59 -13.61 -3.92 0.335 786 +802 3 69.62 -16.3 -3.92 0.335 801 +803 3 69.17 -19.68 -3.92 0.28 802 +804 3 68.61 -24.97 -3.92 0.28 803 +805 3 68.38 -28.23 -3.92 0.28 804 +806 3 69.28 -32.28 -3.92 0.28 805 +807 3 69.39 -34.08 -3.92 0.28 806 +808 3 69.39 -35.99 -3.92 0.28 807 +809 3 69.39 -37.45 -3.92 0.28 808 +810 3 68.94 -38.35 -3.92 0.28 809 +811 3 60.17 -1.35 -3.92 0.62 783 +812 3 63.77 1.35 -3.92 0.62 811 +813 3 69.17 5.74 -3.92 0.62 812 +814 3 72.98 6.97 -3.92 0.62 813 +815 3 78.73 9.11 -3.92 0.56 814 +816 3 84.46 11.36 -3.92 0.56 815 +817 3 85.93 12.03 -3.92 0.56 816 +818 3 89.64 15.63 -3.92 0.62 817 +819 3 90.88 16.3 -3.92 0.62 818 +820 3 95.37 16.42 -3.92 0.62 819 +821 3 99.42 21.03 -4.9 0.395 820 +822 3 103.7 24.86 -4.9 0.395 821 +823 3 109.43 30.37 -4.9 0.395 822 +824 3 112.92 33.97 -3.92 0.395 823 +825 3 115.73 36.22 -3.92 0.395 824 +826 3 115.96 36.89 -3.92 0.395 825 +827 3 116.18 38.13 -3.92 0.395 826 +828 3 116.18 39.25 -3.92 0.395 827 +829 3 116.82 42.98 -2.94 0.335 828 +830 3 130.54 45.23 -2.94 0.335 829 +831 3 99.76 16.2 -2.94 0.395 820 +832 3 103.02 16.98 -2.94 0.395 831 +833 3 106.4 18.32 -2.94 0.395 832 +834 3 110.22 19.12 -2.94 0.395 833 +835 3 112.81 19.23 -2.94 0.395 834 +836 3 114.61 18.11 -2.94 0.395 835 +837 3 115.06 17.32 -2.94 0.395 836 +838 3 89.86 22.38 -4.9 0.56 819 +839 3 88.74 25.87 -2.94 0.505 838 +840 3 88.29 29.92 -2.94 0.505 839 +841 3 90.31 33.97 -2.94 0.505 840 +842 3 91.44 38.35 -2.94 0.505 841 +843 3 91.89 43.3 -3.92 0.505 842 +844 3 91.1 45.55 -3.92 0.505 843 +845 3 90.54 49.37 -2.94 0.56 844 +846 3 88.74 53.31 -2.94 0.56 845 +847 3 88.06 58.15 -2.94 0.56 846 +848 3 88.85 62.42 -2.94 0.56 847 +849 3 88.63 67.26 -2.94 0.505 848 +850 3 88.74 69.51 -2.94 0.45 849 +851 3 89.64 73.11 -2.94 0.45 850 +852 3 90.2 77.15 -1.96 0.45 851 +853 3 90.54 80.64 -1.96 0.45 852 +854 3 90.99 84.91 -2.94 0.45 853 +855 3 91.89 89.3 -2.94 0.395 854 +856 3 93.01 93.24 -2.94 0.335 855 +857 3 95.15 96.16 -2.94 0.335 856 +858 3 95.94 97.51 -2.94 0.335 857 +859 3 89.41 44.76 -2.94 0.335 844 +860 3 87.39 42.51 -2.94 0.335 859 +861 3 86.49 41.84 -2.94 0.335 860 +862 3 88.18 8.44 -2.94 0.395 817 +863 3 89.64 6.19 -2.94 0.395 862 +864 3 88.74 2.36 -1.96 0.395 863 +865 3 88.96 0.67 -2.94 0.395 864 +866 3 88.63 -1.24 -2.94 0.395 865 +867 3 89.53 -4.61 -2.94 0.395 866 +868 3 66.47 6.19 -3.92 0.395 812 +869 3 67.81 6.3 -3.92 0.395 868 +870 3 69.95 12.48 -3.92 0.395 869 +871 3 72.43 16.98 -3.92 0.395 870 +872 3 74.23 15.86 -3.92 0.395 871 +873 3 74.34 23.39 -3.92 0.395 872 +874 3 75.69 27.67 -3.92 0.395 873 +875 3 76.48 29.69 -3.92 0.395 874 +876 3 76.7 31.04 -3.92 0.395 875 +877 3 77.04 32.04 -3.92 0.395 876 +878 3 39.7 -5.51 -3.92 0.335 667 +879 3 40.83 -3.37 -3.92 0.335 878 +880 3 40.71 -1.8 -3.92 0.225 879 +881 3 39.7 -0.67 -3.92 0.225 880 +882 3 41.84 -2.92 -3.92 0.225 879 +883 3 43.08 -3.49 -3.92 0.225 882 +884 3 43.64 -3.6 -3.92 0.225 883 +885 3 33.18 -2.14 -3.92 0.56 666 +886 3 33.4 -1.35 -3.92 0.56 885 +887 3 37.11 -0.22 -3.92 0.395 886 +888 3 39.93 2.14 -3.92 0.395 887 +889 3 41.95 3.94 -3.92 0.395 888 +890 3 43.3 4.95 -3.92 0.395 889 +891 3 31.15 1.01 -2.94 0.45 886 +892 3 29.58 2.47 -2.94 0.335 891 +893 3 28.12 3.94 -2.94 0.335 892 +894 3 27.78 4.95 -2.94 0.335 893 +895 3 28.68 -0.67 -3.92 0.45 663 +896 3 34.64 0.34 -4.9 0.45 895 +897 3 39.7 0.79 -3.92 0.45 896 +898 3 40.83 0.67 -3.92 0.45 897 +899 3 43.08 5.29 -3.92 0.45 898 +900 3 45.78 9.22 -2.94 0.45 899 +901 3 48.59 14.28 -2.94 0.395 900 +902 3 49.04 15.86 -2.94 0.395 901 +903 3 48.59 18.32 -2.94 0.395 902 +904 3 48.81 18.89 -2.94 0.395 903 +905 3 47.35 18.89 -1.96 0.28 904 +906 3 51.06 23.17 -2.94 0.45 905 +907 3 57.36 29.24 -2.94 0.45 906 +908 3 64.9 40.85 -3.92 0.45 907 +909 3 64.78 42.2 -3.92 0.45 908 +910 3 43.98 -0.79 -4.9 0.395 898 +911 3 46.11 -1.91 -4.9 0.395 910 +912 3 50.84 -3.15 -4.9 0.395 911 +913 3 58.37 -1.57 -4.9 0.395 912 +914 3 60.73 0.11 -4.9 0.395 913 +915 3 65.68 1.01 -4.9 0.395 914 +916 3 69.17 0.45 -4.9 0.395 915 +917 3 72.31 0.22 -4.9 0.335 916 +918 3 73.22 -0.11 -4.9 0.335 917 +919 3 22.04 -7.99 -4.9 0.73 662 +920 3 23.39 -11.7 -4.9 0.675 919 +921 3 25.42 -14.96 -4.9 0.62 920 +922 3 26.54 -17.43 -4.9 0.62 921 +923 3 25.64 -21.03 -4.9 0.62 922 +924 3 24.18 -25.53 -4.9 0.62 923 +925 3 22.94 -29.13 -4.9 0.62 924 +926 3 25.76 -34.08 -4.9 0.62 925 +927 3 29.13 -37.11 -4.9 0.62 926 +928 3 30.59 -36.67 -3.92 0.395 927 +929 3 31.38 -40.04 -3.92 0.62 928 +930 3 35.99 -43.75 -3.92 0.62 929 +931 3 41.5 -46.9 -3.92 0.62 930 +932 3 46.56 -50.95 -3.92 0.62 931 +933 3 50.72 -54.66 -3.92 0.62 932 +934 3 51.29 -64.02 -3.92 0.62 933 +935 3 49.94 -67.73 -3.92 0.56 934 +936 3 48.59 -70.31 -3.92 0.505 935 +937 3 49.71 -74.59 -3.92 0.505 936 +938 3 51.29 -80.44 -3.92 0.505 937 +939 3 56.24 -83.36 -3.92 0.505 938 +940 3 61.52 -84.6 -3.92 0.505 939 +941 3 66.36 -85.27 -3.92 0.505 940 +942 3 69.84 -85.72 -3.92 0.335 941 +943 3 71.53 -85.72 -3.92 0.335 942 +944 3 73.22 -85.72 -3.92 0.335 943 +945 3 75.47 -86.29 -2.94 0.335 944 +946 3 67.93 -83.48 -3.92 0.335 941 +947 3 68.27 -82.24 -3.92 0.335 946 +948 3 21.37 4.84 -4.9 0.955 661 +949 3 26.43 10.23 -4.9 0.955 948 +950 3 31.49 14.96 -4.9 0.955 949 +951 3 33.29 16.98 -4.9 0.955 950 +952 3 34.64 15.63 -4.9 0.225 951 +953 3 36.44 19.91 -4.9 0.955 952 +954 3 35.77 21.82 -4.9 0.45 953 +955 3 39.93 23.28 -3.92 0.9 954 +956 3 37.34 26.32 -3.92 0.45 955 +957 3 33.97 29.35 -3.92 0.45 956 +958 3 33.07 30.93 -3.92 0.45 957 +959 3 32.5 31.49 -4.9 0.45 958 +960 3 30.48 31.6 -3.92 0.28 959 +961 3 29.13 31.38 -3.92 0.28 960 +962 3 29.8 35.2 -4.9 0.45 959 +963 3 27.11 37.34 -4.9 0.45 962 +964 3 20.92 39.14 -4.9 0.45 963 +965 3 17.55 39.36 -4.9 0.45 964 +966 3 16.07 39.81 -4.9 0.45 965 +967 3 15.3 42.51 -4.9 0.395 966 +968 3 14.85 44.65 -4.9 0.395 967 +969 3 15.3 45.21 -4.9 0.395 968 +970 3 12.03 39.03 -4.9 0.395 966 +971 3 7.54 38.35 -4.9 0.395 970 +972 3 3.15 38.69 -4.9 0.395 971 +973 3 0.67 39.14 -4.9 0.395 972 +974 3 -1.24 39.7 -4.9 0.395 973 +975 3 -2.47 40.26 -4.9 0.395 974 +976 3 43.75 26.54 -3.92 0.73 955 +977 3 49.37 26.21 -3.92 0.56 976 +978 3 52.86 26.21 -3.92 0.56 977 +979 3 58.26 26.09 -3.92 0.56 978 +980 3 63.1 26.77 -3.92 0.56 979 +981 3 67.37 26.88 -3.92 0.56 980 +982 3 71.64 28.34 -3.92 0.56 981 +983 3 75.47 31.6 -3.92 0.56 982 +984 3 77.83 32.95 -3.92 0.56 983 +985 3 86.26 33.4 -3.92 0.56 984 +986 3 89.98 33.52 -3.92 0.56 985 +987 3 94.14 32.95 -3.92 0.505 986 +988 3 98.86 31.6 -3.92 0.45 987 +989 3 100.77 30.93 -3.92 0.45 988 +990 3 101.45 30.37 -3.92 0.45 989 +991 3 44.43 28.01 -3.92 0.73 976 +992 3 38.9 28.79 -3.92 0.45 991 +993 3 37.68 28.34 -3.92 0.45 992 +994 3 37.11 26.99 -3.92 0.335 993 +995 3 36.89 26.21 -3.92 0.335 994 +996 3 33.74 28.23 -3.92 0.395 993 +997 3 32.28 28.01 -3.92 0.395 996 +998 3 33.29 26.99 -3.92 0.335 997 +999 3 33.74 25.98 -3.92 0.335 998 +1000 3 28.34 26.32 -2.94 0.45 997 +1001 3 24.86 25.08 -2.94 0.45 1000 +1002 3 22.72 23.28 -2.94 0.45 1001 +1003 3 20.81 21.48 -2.94 0.45 1002 +1004 3 15.97 19.12 -3.92 0.45 1003 +1005 3 13.61 18.32 -3.92 0.45 1004 +1006 3 12.48 18.32 -3.92 0.45 1005 +1007 3 8.44 17.88 -3.92 0.335 1006 +1008 3 6.19 17.88 -3.92 0.335 1007 +1009 3 4.95 17.77 -3.92 0.335 1008 +1010 3 7.87 15.18 -3.92 0.335 1006 +1011 3 4.26 14.28 -3.92 0.335 1010 +1012 3 1.35 12.37 -3.92 0.335 1011 +1013 3 0.11 11.47 -3.92 0.335 1012 +1014 3 -1.35 10.91 -3.92 0.335 1013 +1015 3 -2.25 10.35 -3.92 0.335 1014 +1016 3 49.37 34.15 -3.92 0.675 991 +1017 3 47.18 36.28 -3.92 0.45 1016 +1018 3 45.89 37.54 -3.92 0.45 1017 +1019 3 41.28 42.15 -3.92 0.45 1018 +1020 3 39.14 43.95 -3.92 0.45 1019 +1021 3 36.89 45.41 -3.92 0.45 1020 +1022 3 36.33 45.75 -3.92 0.45 1021 +1023 3 35.43 44.74 -2.94 0.28 1022 +1024 3 34.19 48.11 -3.92 0.45 1023 +1025 3 30.93 51.48 -3.92 0.45 1024 +1026 3 28.34 52.95 -3.92 0.45 1025 +1027 3 22.49 53.62 -3.92 0.45 1026 +1028 3 20.36 54.97 -3.92 0.45 1027 +1029 3 18.32 55.65 -3.92 0.45 1028 +1030 3 16.2 57.45 -3.92 0.45 1029 +1031 3 16.2 60.48 -3.92 0.45 1030 +1032 3 16.3 63.97 -3.92 0.395 1031 +1033 3 14.96 66.56 -2.94 0.395 1032 +1034 3 12.93 68.02 -2.94 0.395 1033 +1035 3 10.46 69.48 -2.94 0.395 1034 +1036 3 7.65 70.04 -2.94 0.395 1035 +1037 3 5.51 72.18 -2.94 0.395 1036 +1038 3 4.16 80.39 -2.94 0.395 1037 +1039 3 3.82 83.54 -2.94 0.335 1038 +1040 3 3.82 84.21 -3.92 0.335 1039 +1041 3 3.71 84.66 -3.92 0.335 1040 +1042 3 49.94 34.95 -3.92 0.73 1017 +1043 3 49.71 31.01 -3.92 0.505 1042 +1044 3 50.05 27.64 -3.92 0.45 1043 +1045 3 51.74 24.38 -3.92 0.45 1044 +1046 3 55.45 21.68 -3.92 0.45 1045 +1047 3 58.6 18.42 -3.92 0.45 1046 +1048 3 62.08 15.72 -3.92 0.45 1047 +1049 3 64.11 13.24 -3.92 0.45 1048 +1050 3 64.9 10.55 -3.92 0.45 1049 +1051 3 62.98 7.62 -3.92 0.45 1050 +1052 3 61.63 4.01 -4.9 0.45 1051 +1053 3 61.75 1.1 -4.9 0.45 1052 +1054 3 61.52 -0.7 -4.9 0.45 1053 +1055 3 61.52 -1.6 -4.9 0.45 1054 +1056 3 52.3 38.76 -3.92 0.73 1016 +1057 3 52.75 39.65 -3.92 0.73 1056 +1058 3 52.75 41.23 -3.92 0.675 1057 +1059 3 52.75 42.81 -3.92 0.675 1058 +1060 3 53.42 46.63 -3.92 0.675 1059 +1061 3 53.99 50 -3.92 0.675 1060 +1062 3 54.32 51.24 -3.92 0.675 1061 +1063 3 49.6 55.18 -3.92 0.505 1062 +1064 3 46.45 57.31 -3.92 0.505 1063 +1065 3 42.51 59.45 -3.92 0.505 1064 +1066 3 40.04 60.69 -3.92 0.505 1065 +1067 3 39.47 60.91 -3.92 0.505 1066 +1068 3 38.58 64.84 -3.92 0.395 1067 +1069 3 37.34 69.45 -3.92 0.395 1068 +1070 3 36.44 71.37 -2.94 0.395 1069 +1071 3 33.63 73.73 -3.92 0.395 1070 +1072 3 32.28 74.75 -3.92 0.395 1071 +1073 3 31.94 75.08 -3.92 0.395 1072 +1074 3 33.4 80.5 -3.92 0.335 1073 +1075 3 37.45 84.33 -3.92 0.335 1074 +1076 3 42.18 88.04 -2.94 0.28 1075 +1077 3 45.21 90.17 -2.94 0.28 1076 +1078 3 45.89 90.29 -2.94 0.28 1077 +1079 3 46.11 90.51 -2.94 0.28 1078 +1080 3 50.16 88.49 -2.94 0.28 1079 +1081 3 54.89 85.23 -2.94 0.28 1080 +1082 3 60.62 83.54 -2.94 0.28 1081 +1083 3 73.78 86.24 -2.94 0.28 1082 +1084 3 81.43 89.39 -2.94 0.28 1083 +1085 3 85.03 90.51 -2.94 0.28 1084 +1086 3 92.56 93.77 -2.94 0.28 1085 +1087 3 105.72 97.82 -2.94 0.28 1086 +1088 3 110 98.27 -2.94 0.28 1087 +1089 3 113.59 98.83 -2.94 0.28 1088 +1090 3 115.06 98.95 -2.94 0.28 1089 +1091 3 49.6 101.87 -2.94 0.28 1079 +1092 3 49.82 103.33 -2.94 0.28 1091 +1093 3 49.82 104.79 -2.94 0.28 1092 +1094 3 49.82 105.69 -2.94 0.28 1093 +1095 3 36.33 57.76 -3.92 0.45 1067 +1096 3 34.42 55.18 -3.92 0.45 1095 +1097 3 33.18 53.27 -3.92 0.45 1096 +1098 3 33.52 52.14 -3.92 0.45 1097 +1099 3 60.17 58.44 -3.92 0.62 1062 +1100 3 62.2 61.48 -3.92 0.62 1099 +1101 3 67.26 65.3 -3.92 0.62 1100 +1102 3 71.53 70.02 -3.92 0.62 1101 +1103 3 72.31 71.15 -3.92 0.62 1102 +1104 3 71.53 71.81 -3.92 0.395 1103 +1105 3 76.93 74.97 -3.92 0.62 1104 +1106 3 84.58 80.7 -3.92 0.62 1105 +1107 3 88.85 84.53 -2.94 0.62 1106 +1108 3 93.35 91.39 -2.94 0.62 1107 +1109 3 98.86 96.79 -2.94 0.62 1108 +1110 3 103.7 101.85 -2.94 0.62 1109 +1111 3 104.26 102.42 -2.94 0.62 1110 +1112 3 106.17 103.76 -2.94 0.395 1111 +1113 3 107.97 105.11 -2.94 0.395 1112 +1114 3 108.31 105.34 -2.94 0.395 1113 +1115 3 103.92 106.8 -2.94 0.505 1111 +1116 3 103.25 109.5 -2.94 0.505 1115 +1117 3 103.13 110.96 -2.94 0.505 1116 +1118 3 104.71 113.44 -3.92 0.505 1117 +1119 3 107.41 114.9 -3.92 0.505 1118 +1120 3 110.11 115.01 -3.92 0.505 1119 +1121 3 114.04 115.12 -3.92 0.505 1120 +1122 3 115.51 115.12 -3.92 0.505 1121 +1123 3 102.69 113.1 -2.94 0.45 1117 +1124 3 102.24 114.79 -2.94 0.335 1123 +1125 3 101.9 115.57 -2.94 0.335 1124 +1126 3 60.62 67.55 -3.92 0.56 1100 +1127 3 59.95 70.02 -3.92 0.56 1126 +1128 3 59.95 70.47 -3.92 0.56 1127 +1129 3 57.81 69.45 -3.92 0.335 1128 +1130 3 56.01 68.79 -3.92 0.335 1129 +1131 3 54.77 68.34 -3.92 0.335 1130 +1132 3 54.32 68.11 -3.92 0.335 1131 +1133 3 60.06 73.62 -2.94 0.505 1128 +1134 3 61.75 76.43 -2.94 0.505 1133 +1135 3 62.53 79.36 -2.94 0.505 1134 +1136 3 64.67 82.73 -2.94 0.505 1135 +1137 3 67.59 86.22 -2.94 0.505 1136 +1138 3 68.83 87.57 -2.94 0.505 1137 +1139 3 70.18 91.51 -2.94 0.505 1138 +1140 3 70.63 94.77 -2.94 0.505 1139 +1141 3 72.66 98.59 -2.94 0.505 1140 +1142 3 73.11 99.83 -2.94 0.505 1141 +1143 3 76.25 104.1 -2.94 0.505 1142 +1144 3 76.25 106.8 -2.94 0.505 1143 +1145 3 77.48 109.05 -3.92 0.505 1144 +1146 3 79.63 112.54 -3.92 0.505 1145 +1147 3 81.2 114.56 -3.92 0.505 1146 +1148 3 82.1 115.8 -3.92 0.505 1147 +1149 3 45.96 45.9 -3.92 0.335 1058 +1150 3 60.4 41.57 -3.92 0.62 1057 +1151 3 62.87 42.13 -3.92 0.62 1150 +1152 3 65.56 39.88 -3.92 0.45 1151 +1153 3 67.37 39.09 -3.92 0.45 1152 +1154 3 70.73 39.88 -3.92 0.45 1153 +1155 3 73.56 39.43 -3.92 0.45 1154 +1156 3 76.14 38.31 -3.92 0.45 1155 +1157 3 76.59 38.08 -3.92 0.45 1156 +1158 3 77.59 36.61 -3.92 0.28 1157 +1159 3 79.29 35.61 -3.92 0.28 1158 +1160 3 80.42 34.93 -3.92 0.28 1159 +1161 3 80.64 38.31 -3.92 0.505 1157 +1162 3 81.43 38.31 -3.92 0.505 1161 +1163 3 83.12 38.19 -3.92 0.395 1162 +1164 3 84.91 36.72 -3.92 0.395 1163 +1165 3 85.48 36.06 -3.92 0.395 1164 +1166 3 84.02 35.95 -3.92 0.395 1162 +1167 3 85.93 34.47 -3.92 0.395 1166 +1168 3 86.38 33.92 -3.92 0.395 1167 +1169 3 68.16 44.61 -3.92 0.675 1151 +1170 3 69.39 44.83 -3.92 0.675 1169 +1171 3 69.84 47.19 -3.92 0.335 1170 +1172 3 69.95 48.88 -3.92 0.335 1171 +1173 3 75.69 45.84 -3.92 0.73 1170 +1174 3 78.28 46.97 -3.92 0.675 1173 +1175 3 79.4 45.17 -2.94 0.335 1174 +1176 3 83.57 49.67 -3.92 0.675 1175 +1177 3 88.74 52.7 -3.92 0.675 1176 +1178 3 94.59 57.31 -3.92 0.62 1177 +1179 3 96.84 61.59 -3.92 0.62 1178 +1180 3 99.76 67.66 -2.94 0.56 1179 +1181 3 103.25 75.76 -2.94 0.56 1180 +1182 3 107.52 82.28 -3.92 0.56 1181 +1183 3 111.8 87.23 -3.92 0.56 1182 +1184 3 113.26 88.24 -3.92 0.56 1183 +1185 3 115.62 89.26 -3.92 0.56 1184 +1186 3 116.52 89.48 -3.92 0.56 1185 diff --git a/demos/Fig2_elecModels/cells/VHC-neuron.CNG.swc b/demos/Fig2_elecModels/cells/VHC-neuron.CNG.swc new file mode 100644 index 0000000..3a7b77c --- /dev/null +++ b/demos/Fig2_elecModels/cells/VHC-neuron.CNG.swc @@ -0,0 +1,3022 @@ +# Original file VHC-neuron.swc edited using StdSwc version 1.31 on 2/28/13. +# Irregularities and fixes documented in VHC-neuron.swc.std. See StdSwc1.31.doc for more information. +# +# Neurolucida to SWC conversion from L-Measure. Sridevi Polavaram: spolavar@gmu.edu +# Original fileName:C:\Users\praveen\Desktop\DataProcessing\CurrentArchives\Processing\Johnston\ASC\VHC-neuron.asc +#The original file has a single soma contour that is averaged into 3 soma points +1 1 0.0 0.0 0.0 8.88119 -1 +2 1 0.35 -8.83 -0.87 8.88119 1 +3 1 -0.35 8.83 0.87 8.88119 1 +4 3 0.67 -4.33 -2.18 2.165 1 +5 3 -0.09 -6.62 -2.34 1.84 4 +6 3 -1.76 -8.01 -2.31 1.405 5 +7 3 -2.97 -8.02 -2.2 1.405 6 +8 3 -3.39 -8.37 -2.2 1.405 7 +9 3 -3.48 -8.5 -2.2 1.405 8 +10 3 -3.53 -8.81 -3.1 1.19 9 +11 3 -3.61 -9.04 -3.55 1.19 10 +12 3 -4.27 -8.08 -3.52 0.11 11 +13 3 -5.31 -7.95 -3.18 0.11 12 +14 3 -5.47 -8.42 -3.21 0.54 13 +15 3 -6.69 -8.42 -3.11 0.54 14 +16 3 -7.0 -7.52 -2.98 0.54 15 +17 3 -8.21 -7.23 -2.84 0.54 16 +18 3 -8.66 -7.68 -2.85 0.54 17 +19 3 -9.28 -8.31 -2.85 0.54 18 +20 3 -9.73 -9.06 -2.88 0.54 19 +21 3 -10.03 -10.29 -2.97 0.54 20 +22 3 -10.03 -10.88 -3.03 0.54 21 +23 3 -10.18 -11.95 -3.12 0.54 22 +24 3 -10.63 -12.42 -3.13 0.54 23 +25 3 -10.94 -13.64 -3.22 0.54 24 +26 3 -11.39 -14.1 -3.22 0.54 25 +27 3 -11.68 -15.01 -3.28 0.54 26 +28 3 -12.22 -15.99 -4.24 0.65 27 +29 3 -12.53 -16.61 -4.26 0.65 28 +30 3 -12.98 -17.36 -4.31 0.65 29 +31 3 -13.66 -18.21 -5.16 0.54 30 +32 3 -14.88 -18.82 -5.11 0.54 31 +33 3 -16.85 -19.3 -4.97 0.54 32 +34 3 -17.61 -20.37 -5.0 0.54 33 +35 3 -17.76 -22.05 -5.16 0.54 34 +36 3 -17.6 -22.81 -5.25 0.54 35 +37 3 -17.44 -24.17 -5.39 0.54 36 +38 3 -17.74 -25.1 -5.45 0.54 37 +39 3 -19.12 -25.86 -5.4 0.54 38 +40 3 -20.94 -25.87 -5.24 0.54 39 +41 3 -22.15 -25.9 -5.05 0.54 40 +42 3 -22.3 -26.96 -5.14 0.54 41 +43 3 -22.29 -27.57 -5.19 0.54 42 +44 3 -22.44 -28.04 -5.22 0.54 43 +45 3 -22.94 -27.75 -6.06 0.435 44 +46 3 -23.25 -28.36 -6.09 0.435 45 +47 3 -23.56 -29.27 -6.23 0.435 46 +48 3 -24.05 -29.99 -6.72 0.435 47 +49 3 -24.86 -30.7 -7.31 0.435 48 +50 3 -26.08 -31.33 -7.26 0.435 49 +51 3 -27.75 -31.18 -7.09 0.435 50 +52 3 -29.32 -31.45 -7.5 0.435 51 +53 3 -30.27 -31.72 -7.89 0.435 52 +54 3 -31.81 -31.43 -7.79 0.435 53 +55 3 -33.73 -30.72 -8.68 0.435 54 +56 3 -34.98 -30.41 -8.84 0.435 55 +57 3 -35.25 -30.43 -10.1 0.54 56 +58 3 -36.17 -31.34 -10.26 0.54 57 +59 3 -37.55 -32.11 -10.29 0.54 58 +60 3 -38.19 -32.68 -10.73 0.54 59 +61 3 -38.5 -33.59 -10.86 0.54 60 +62 3 -39.6 -34.93 -11.27 0.54 61 +63 3 -40.35 -36.61 -11.37 0.54 62 +64 3 -41.27 -37.83 -11.48 0.54 63 +65 3 -41.72 -38.58 -11.59 0.54 64 +66 3 -42.19 -39.04 -11.66 0.54 65 +67 3 -42.37 -39.46 -11.98 0.54 66 +68 3 -42.4 -39.43 -12.36 0.54 67 +69 3 -43.94 -40.64 -12.57 0.54 68 +70 3 -45.25 -41.77 -13.61 0.54 69 +71 3 -46.49 -43.28 -13.86 0.54 70 +72 3 -47.71 -44.49 -13.96 0.54 71 +73 3 -48.47 -45.27 -13.96 0.54 72 +74 3 -49.24 -46.32 -14.14 0.54 73 +75 3 -50.18 -47.81 -14.57 0.54 74 +76 3 -52.32 -49.34 -14.68 0.54 75 +77 3 -53.07 -50.1 -14.68 0.54 76 +78 3 -53.41 -50.69 -15.09 0.54 77 +79 3 -53.87 -51.44 -15.19 0.54 78 +80 3 -54.81 -52.33 -15.5 0.54 79 +81 3 -56.05 -53.53 -15.8 0.54 80 +82 3 -57.73 -54.0 -15.77 0.54 81 +83 3 -59.85 -54.92 -15.66 0.54 82 +84 3 -61.23 -56.61 -15.78 0.54 83 +85 3 -62.89 -58.3 -15.79 0.54 84 +86 3 -66.39 -60.61 -15.69 0.54 85 +87 3 -67.76 -61.99 -15.7 0.54 86 +88 3 -68.97 -63.22 -15.7 0.54 87 +89 3 -71.85 -64.3 -15.55 0.54 88 +90 3 -73.99 -64.64 -15.38 0.54 89 +91 3 -75.81 -64.35 -15.19 0.54 90 +92 3 -79.65 -65.1 -15.35 0.54 91 +93 3 -82.24 -64.37 -15.04 0.54 92 +94 3 -84.53 -64.23 -14.82 0.54 93 +95 3 -86.41 -64.78 -15.39 0.54 94 +96 3 -88.69 -65.57 -15.26 0.54 95 +97 3 -90.98 -66.66 -15.15 0.54 96 +98 3 -92.87 -67.8 -16.07 0.54 97 +99 3 -93.53 -69.89 -16.73 0.54 98 +100 3 -95.82 -71.88 -16.79 0.54 99 +101 3 -96.87 -73.56 -16.87 0.54 100 +102 3 -97.85 -75.31 -17.77 0.54 101 +103 3 -98.47 -76.52 -17.99 0.54 102 +104 3 -98.16 -77.74 -18.06 0.54 103 +105 3 -98.09 -78.42 -17.38 0.54 104 +106 3 -97.89 -79.23 -16.87 0.54 105 +107 3 -98.75 -80.5 -16.54 0.54 106 +108 3 -99.36 -81.41 -16.57 0.54 107 +109 3 -99.32 -83.28 -16.31 0.54 108 +110 3 -100.2 -86.04 -16.34 0.54 109 +111 3 -99.59 -88.77 -16.67 0.54 110 +112 3 -99.27 -90.91 -16.82 0.54 111 +113 3 -98.62 -92.16 -16.55 0.54 112 +114 3 -98.46 -93.83 -16.73 0.54 113 +115 3 -98.58 -94.93 -16.45 0.54 114 +116 3 -98.4 -96.01 -16.42 0.54 115 +117 3 -98.69 -96.93 -16.4 0.54 116 +118 3 -22.3 -29.09 -5.42 0.54 44 +119 3 -21.83 -31.67 -5.72 0.54 118 +120 3 -20.61 -34.99 -6.22 0.54 119 +121 3 -19.89 -36.61 -6.91 0.54 120 +122 3 -19.46 -38.24 -7.56 0.54 121 +123 3 -19.16 -39.45 -7.78 0.54 122 +124 3 -18.65 -40.57 -7.25 0.54 123 +125 3 -17.05 -42.46 -6.82 0.54 124 +126 3 -16.58 -44.14 -6.97 0.54 125 +127 3 -16.87 -45.37 -6.98 0.54 126 +128 3 -16.66 -45.58 -6.26 0.54 127 +129 3 -17.25 -47.1 -6.35 0.54 128 +130 3 -18.32 -47.57 -6.3 0.54 129 +131 3 -19.05 -48.38 -6.01 0.54 130 +132 3 -20.1 -49.46 -5.87 0.54 131 +133 3 -20.55 -51.43 -6.02 0.54 132 +134 3 -21.15 -53.57 -6.17 0.54 133 +135 3 -22.35 -55.72 -6.2 0.54 134 +136 3 -23.41 -57.41 -6.27 0.54 135 +137 3 -24.16 -59.09 -6.36 0.54 136 +138 3 -25.52 -59.88 -6.16 0.54 137 +139 3 -26.42 -60.8 -6.08 0.54 138 +140 3 -27.46 -61.9 -5.8 0.54 139 +141 3 -28.2 -64.21 -5.88 0.54 140 +142 3 -28.5 -66.33 -6.07 0.54 141 +143 3 -29.72 -67.87 -6.1 0.54 142 +144 3 -31.08 -68.64 -6.05 0.54 143 +145 3 -32.76 -70.63 -6.09 0.54 144 +146 3 -33.19 -72.63 -6.16 0.54 145 +147 3 -33.8 -75.05 -6.34 0.54 146 +148 3 -33.71 -76.04 -5.62 0.54 147 +149 3 -35.03 -77.17 -6.74 0.54 148 +150 3 -36.24 -79.02 -6.8 0.54 149 +151 3 -37.19 -80.5 -7.25 0.54 150 +152 3 -37.41 -81.78 -8.26 0.54 151 +153 3 -37.85 -84.68 -8.5 0.54 152 +154 3 -38.77 -88.03 -8.81 0.54 153 +155 3 -38.91 -90.01 -9.0 0.54 154 +156 3 -39.06 -91.68 -9.15 0.54 155 +157 3 -38.76 -93.18 -9.47 0.54 156 +158 3 -38.8 -94.06 -9.93 0.54 157 +159 3 -39.48 -94.59 -10.83 0.54 158 +160 3 -41.17 -96.26 -10.99 0.54 159 +161 3 -41.54 -97.09 -11.87 0.54 160 +162 3 -41.81 -97.74 -13.11 0.54 161 +163 3 -41.84 -99.24 -11.97 0.54 162 +164 3 -42.03 -99.98 -10.67 0.54 163 +165 3 -41.98 -100.61 -10.44 0.54 164 +166 3 -42.73 -102.6 -10.48 0.54 165 +167 3 -42.57 -105.2 -10.68 0.54 166 +168 3 -42.71 -106.56 -10.8 0.54 167 +169 3 -43.6 -108.43 -10.59 0.54 168 +170 3 -44.18 -109.97 -10.46 0.54 169 +171 3 -44.24 -110.81 -9.71 0.54 170 +172 3 -44.24 -112.04 -9.68 0.54 171 +173 3 -44.52 -113.29 -9.54 0.54 172 +174 3 -44.93 -114.69 -9.33 0.54 173 +175 3 -44.89 -116.26 -9.04 0.54 174 +176 3 -44.68 -117.66 -8.75 0.54 175 +177 3 -44.39 -119.19 -8.84 0.54 176 +178 3 -43.91 -120.55 -9.02 0.54 177 +179 3 -43.89 -120.9 -8.69 0.54 178 +180 3 -42.63 -122.13 -8.62 0.54 179 +181 3 -41.35 -123.71 -8.14 0.54 180 +182 3 -40.56 -125.39 -8.29 0.54 181 +183 3 -39.95 -126.59 -8.46 0.54 182 +184 3 -39.34 -128.42 -8.63 0.54 183 +185 3 -38.71 -130.56 -8.81 0.54 184 +186 3 -38.07 -131.8 -8.62 0.54 185 +187 3 -37.6 -132.87 -8.68 0.54 186 +188 3 -37.59 -134.08 -8.74 0.54 187 +189 3 -37.59 -135.0 -8.83 0.54 188 +190 3 -37.43 -135.76 -8.92 0.54 189 +191 3 -36.82 -136.67 -9.06 0.54 190 +192 3 -36.05 -138.64 -9.32 0.54 191 +193 3 -35.9 -140.01 -9.47 0.54 192 +194 3 -36.34 -141.07 -9.54 0.54 193 +195 3 -37.05 -141.51 -9.36 0.435 194 +196 3 -37.96 -142.43 -9.36 0.435 195 +197 3 -39.64 -142.9 -9.25 0.435 196 +198 3 -41.44 -143.55 -9.01 0.435 197 +199 3 -42.34 -144.48 -8.86 0.435 198 +200 3 -43.11 -144.62 -8.95 0.435 199 +201 3 -43.6 -145.36 -9.28 0.435 200 +202 3 -43.94 -145.63 -9.65 0.435 201 +203 3 -44.28 -146.19 -10.13 0.435 202 +204 3 -44.99 -146.71 -11.25 0.435 203 +205 3 -45.66 -147.56 -11.88 0.435 204 +206 3 -45.84 -148.59 -12.34 0.435 205 +207 3 -46.13 -150.11 -12.46 0.435 206 +208 3 -46.59 -151.48 -12.62 0.435 207 +209 3 -46.59 -152.7 -12.74 0.435 208 +210 3 -46.42 -154.06 -12.89 0.435 209 +211 3 -46.6 -154.8 -13.25 0.435 210 +212 3 -46.15 -155.85 -13.47 0.435 211 +213 3 -45.85 -157.07 -13.61 0.435 212 +214 3 -46.02 -157.81 -13.9 0.435 213 +215 3 -46.02 -158.71 -14.14 0.435 214 +216 3 -46.22 -159.72 -14.67 0.435 215 +217 3 -46.53 -160.34 -14.78 0.435 216 +218 3 -46.83 -160.94 -14.81 0.435 217 +219 3 -46.99 -161.4 -14.84 0.435 218 +220 3 -47.04 -161.94 -15.64 0.435 219 +221 3 -47.65 -162.54 -15.73 0.435 220 +222 3 -48.11 -163.01 -15.73 0.435 221 +223 3 -48.42 -163.32 -15.73 0.435 222 +224 3 -48.62 -163.71 -16.28 0.435 223 +225 3 -48.31 -165.22 -16.53 0.435 224 +226 3 -47.25 -165.67 -16.67 0.435 225 +227 3 -3.29 -10.26 -4.74 1.19 10 +228 3 -2.54 -10.99 -5.1 1.08 227 +229 3 -1.93 -11.9 -5.24 0.865 228 +230 3 -1.81 -12.92 -5.81 0.65 229 +231 3 -1.21 -13.83 -5.95 0.65 230 +232 3 -1.2 -14.74 -6.04 0.65 231 +233 3 -1.8 -15.96 -6.11 0.65 232 +234 3 -2.26 -16.71 -6.22 0.65 233 +235 3 -3.79 -17.95 -6.19 0.65 234 +236 3 -4.84 -19.93 -6.3 0.65 235 +237 3 -5.14 -20.55 -6.33 0.435 236 +238 3 -6.2 -22.22 -6.39 0.435 237 +239 3 -6.34 -23.59 -6.51 0.435 238 +240 3 -5.58 -24.95 -6.72 0.435 239 +241 3 -4.67 -27.09 -7.01 0.435 240 +242 3 -4.2 -29.67 -7.3 0.435 241 +243 3 -4.2 -30.88 -7.42 0.435 242 +244 3 -3.89 -32.39 -7.6 0.435 243 +245 3 -2.46 -33.18 -8.94 0.435 244 +246 3 -1.39 -33.63 -9.08 0.435 245 +247 3 -0.03 -34.37 -9.35 0.435 246 +248 3 1.17 -35.88 -9.61 0.435 247 +249 3 2.25 -38.15 -9.94 0.435 248 +250 3 3.18 -40.28 -10.23 0.435 249 +251 3 3.48 -41.49 -10.37 0.435 250 +252 3 4.85 -42.85 -10.63 0.435 251 +253 3 6.49 -42.62 -11.29 0.435 252 +254 3 8.21 -43.42 -12.58 0.435 253 +255 3 9.59 -44.79 -11.18 0.435 254 +256 3 10.7 -45.29 -10.8 0.435 255 +257 3 11.5 -46.08 -10.51 0.435 256 +258 3 11.97 -47.16 -10.5 0.435 257 +259 3 13.08 -48.25 -10.26 0.435 258 +260 3 13.0 -48.78 -9.54 0.435 259 +261 3 12.87 -49.57 -9.46 0.435 260 +262 3 12.76 -50.06 -9.04 0.435 261 +263 3 12.82 -51.04 -8.45 0.435 262 +264 3 13.34 -52.46 -7.97 0.435 263 +265 3 13.53 -52.95 -7.73 0.435 264 +266 3 13.55 -53.89 -7.6 0.435 265 +267 3 13.56 -54.5 -7.58 0.435 266 +268 3 -4.18 -10.16 -2.3 0.755 9 +269 3 -5.4 -11.08 -2.28 0.65 268 +270 3 -6.46 -12.15 -2.28 0.65 269 +271 3 -7.06 -13.68 -2.38 0.65 270 +272 3 -7.51 -15.67 -2.45 0.65 271 +273 3 -7.34 -17.65 -2.66 0.65 272 +274 3 -6.43 -19.76 -2.95 0.65 273 +275 3 -5.66 -21.74 -3.21 0.65 274 +276 3 -5.04 -24.47 -3.53 0.65 275 +277 3 -4.42 -25.98 -3.75 0.65 276 +278 3 -4.72 -27.19 -3.83 0.65 277 +279 3 -5.34 -27.81 -3.84 0.65 278 +280 3 -6.55 -27.83 -3.72 0.65 279 +281 3 -7.47 -29.36 -3.79 0.65 280 +282 3 -7.71 -30.46 -3.88 0.65 281 +283 3 -7.85 -30.94 -2.1 0.435 282 +284 3 -8.31 -31.4 -2.1 0.435 283 +285 3 -8.76 -31.87 -2.1 0.435 284 +286 3 -9.26 -32.27 -2.63 0.435 285 +287 3 -9.8 -32.65 -3.44 0.435 286 +288 3 -10.28 -33.09 -3.67 0.435 287 +289 3 -10.55 -33.42 -3.44 0.435 288 +290 3 -10.84 -33.75 -3.23 0.435 289 +291 3 -10.83 -34.36 -3.22 0.435 290 +292 3 -10.5 -34.69 -3.06 0.435 291 +293 3 -9.99 -35.2 -2.47 0.435 292 +294 3 -9.77 -35.72 -1.86 0.435 293 +295 3 -8.83 -36.34 -1.86 0.435 294 +296 3 -8.98 -37.42 -1.86 0.435 295 +297 3 -9.13 -38.17 -1.92 0.435 296 +298 3 -9.44 -38.79 -1.95 0.435 297 +299 3 -10.19 -39.56 -1.89 0.435 298 +300 3 -10.33 -40.33 -1.88 0.435 299 +301 3 -10.62 -41.25 -1.87 0.435 300 +302 3 -10.93 -41.86 -1.9 0.435 301 +303 3 -11.04 -42.96 -1.61 0.435 302 +304 3 -10.29 -43.39 -3.53 0.435 303 +305 3 -10.28 -44.0 -3.52 0.435 304 +306 3 -7.61 -30.42 -3.89 0.54 282 +307 3 -6.54 -31.79 -4.11 0.54 306 +308 3 -5.85 -33.07 -3.47 0.54 307 +309 3 -6.0 -34.45 -3.59 0.54 308 +310 3 -7.37 -35.22 -3.55 0.54 309 +311 3 -7.21 -37.19 -3.75 0.54 310 +312 3 -6.22 -38.47 -4.87 0.54 311 +313 3 -5.61 -39.97 -5.07 0.54 312 +314 3 -6.21 -41.81 -5.21 0.54 313 +315 3 -5.85 -42.47 -4.77 0.435 314 +316 3 -5.24 -43.37 -4.91 0.435 315 +317 3 -4.62 -45.49 -5.17 0.435 316 +318 3 -4.17 -46.86 -5.35 0.435 317 +319 3 -3.56 -47.46 -5.47 0.435 318 +320 3 -2.5 -47.3 -5.55 0.435 319 +321 3 -1.73 -47.43 -5.72 0.435 320 +322 3 -1.12 -48.96 -5.92 0.435 321 +323 3 -1.58 -50.03 -5.98 0.435 322 +324 3 -1.42 -51.69 -6.15 0.435 323 +325 3 -0.66 -53.05 -6.36 0.435 324 +326 3 0.4 -54.4 -6.66 0.435 325 +327 3 1.17 -55.16 -6.81 0.435 326 +328 3 0.71 -56.23 -6.87 0.435 327 +329 3 0.33 -56.76 -7.79 0.435 328 +330 3 -0.32 -58.22 -8.39 0.435 329 +331 3 -1.38 -59.61 -8.44 0.435 330 +332 3 -1.83 -60.98 -8.53 0.435 331 +333 3 -1.82 -62.5 -8.67 0.435 332 +334 3 -1.82 -64.32 -8.86 0.435 333 +335 3 -1.2 -65.54 -9.03 0.435 334 +336 3 0.0 -66.74 -9.26 0.435 335 +337 3 0.47 -68.12 -9.43 0.435 336 +338 3 0.32 -68.57 -9.46 0.435 337 +339 3 0.01 -69.48 -9.53 0.435 338 +340 3 0.02 -70.4 -9.62 0.435 339 +341 3 0.78 -71.76 -9.82 0.435 340 +342 3 1.7 -72.97 -10.02 0.435 341 +343 3 2.45 -74.0 -10.42 0.435 342 +344 3 1.99 -75.37 -10.59 0.435 343 +345 3 1.98 -75.98 -10.65 0.435 344 +346 3 2.75 -77.03 -10.82 0.435 345 +347 3 3.06 -78.25 -10.97 0.435 346 +348 3 2.76 -78.86 -11.0 0.435 347 +349 3 2.15 -79.78 -11.03 0.435 348 +350 3 2.61 -81.14 -11.21 0.435 349 +351 3 3.98 -81.27 -11.35 0.435 350 +352 3 4.44 -81.73 -11.44 0.435 351 +353 3 4.9 -82.79 -11.58 0.435 352 +354 3 5.05 -84.17 -11.73 0.435 353 +355 3 5.11 -85.41 -13.06 0.435 354 +356 3 4.51 -86.03 -13.07 0.435 355 +357 3 4.05 -87.08 -13.13 0.435 356 +358 3 5.87 -87.99 -13.39 0.435 357 +359 3 6.94 -89.34 -13.62 0.435 358 +360 3 7.26 -89.66 -15.19 0.435 359 +361 3 7.41 -90.71 -15.31 0.435 360 +362 3 7.27 -91.78 -15.4 0.435 361 +363 3 6.96 -92.39 -15.43 0.435 362 +364 3 6.97 -93.61 -15.55 0.435 363 +365 3 7.89 -94.51 -15.72 0.435 364 +366 3 8.9 -95.81 -16.63 0.435 365 +367 3 9.5 -97.01 -16.87 0.435 366 +368 3 9.78 -97.89 -17.28 0.435 367 +369 3 10.05 -99.68 -17.87 0.435 368 +370 3 10.22 -101.04 -18.02 0.435 369 +371 3 11.12 -101.33 -18.2 0.435 370 +372 3 12.8 -101.77 -18.4 0.435 371 +373 3 13.56 -102.83 -18.57 0.435 372 +374 3 13.72 -104.5 -18.75 0.435 373 +375 3 14.47 -105.55 -19.0 0.435 374 +376 3 15.39 -106.77 -19.2 0.435 375 +377 3 16.61 -108.57 -19.48 0.435 376 +378 3 17.38 -110.24 -19.72 0.435 377 +379 3 18.45 -112.52 -20.04 0.435 378 +380 3 19.52 -114.78 -20.36 0.435 379 +381 3 21.03 -116.57 -20.9 0.435 380 +382 3 21.89 -118.02 -21.88 0.435 381 +383 3 22.81 -119.53 -22.12 0.435 382 +384 3 24.02 -120.73 -22.34 0.435 383 +385 3 25.54 -121.63 -22.57 0.435 384 +386 3 27.84 -123.58 -22.97 0.435 385 +387 3 29.06 -125.1 -23.23 0.435 386 +388 3 28.92 -127.99 -23.5 0.435 387 +389 3 29.37 -129.34 -23.68 0.435 388 +390 3 29.07 -130.27 -23.81 0.435 389 +391 3 30.9 -131.15 -24.06 0.435 390 +392 3 31.66 -132.83 -24.3 0.435 391 +393 3 32.58 -134.34 -24.53 0.435 392 +394 3 33.65 -135.38 -24.73 0.435 393 +395 3 33.96 -136.6 -24.88 0.435 394 +396 3 35.33 -138.86 -25.23 0.435 395 +397 3 35.84 -140.11 -25.48 0.435 396 +398 3 36.6 -141.17 -25.65 0.435 397 +399 3 37.52 -142.08 -25.82 0.435 398 +400 3 39.34 -142.96 -26.08 0.435 399 +401 3 40.03 -144.86 -27.15 0.435 400 +402 3 40.8 -146.82 -27.42 0.435 401 +403 3 42.11 -148.41 -28.45 0.435 402 +404 3 42.11 -149.32 -28.54 0.435 403 +405 3 42.07 -149.87 -29.12 0.435 404 +406 3 42.82 -151.24 -29.39 0.435 405 +407 3 44.05 -151.83 -29.57 0.435 406 +408 3 45.05 -152.2 -30.46 0.435 407 +409 3 45.07 -152.83 -31.95 0.435 408 +410 3 44.94 -153.0 -33.4 0.435 409 +411 3 45.09 -154.36 -33.54 0.435 410 +412 3 46.16 -156.02 -33.87 0.435 411 +413 3 47.23 -157.98 -34.17 0.435 412 +414 3 49.06 -160.71 -34.6 0.435 413 +415 3 49.67 -162.22 -34.8 0.435 414 +416 3 50.75 -162.66 -34.94 0.435 415 +417 3 51.97 -163.86 -35.17 0.435 416 +418 3 52.73 -165.53 -35.49 0.435 417 +419 3 53.95 -166.73 -35.79 0.435 418 +420 3 56.12 -167.07 -37.08 0.435 419 +421 3 57.77 -167.77 -37.76 0.435 420 +422 3 59.29 -169.59 -38.07 0.435 421 +423 3 60.21 -170.79 -38.27 0.435 422 +424 3 61.11 -171.07 -38.53 0.435 423 +425 3 61.46 -172.32 -39.9 0.435 424 +426 3 61.73 -172.88 -40.37 0.435 425 +427 3 61.98 -174.03 -41.25 0.435 426 +428 3 62.36 -175.0 -42.21 0.435 427 +429 3 62.89 -176.75 -43.26 0.435 428 +430 3 63.65 -178.11 -43.54 0.435 429 +431 3 64.27 -179.61 -43.75 0.435 430 +432 3 64.73 -180.38 -43.87 0.435 431 +433 3 65.79 -181.11 -44.04 0.435 432 +434 3 66.86 -181.57 -44.18 0.435 433 +435 3 68.38 -180.94 -44.26 0.435 434 +436 3 68.69 -180.64 -44.26 0.435 435 +437 3 68.53 -180.47 -46.04 0.435 436 +438 3 68.0 -179.64 -46.59 0.435 437 +439 3 -7.29 -42.58 -5.25 0.435 314 +440 3 -8.04 -43.04 -5.22 0.435 439 +441 3 -9.1 -45.63 -5.38 0.435 440 +442 3 -7.72 -48.2 -5.76 0.435 441 +443 3 -7.1 -50.64 -6.05 0.435 442 +444 3 -7.7 -51.86 -6.05 0.435 443 +445 3 -9.02 -52.67 -5.62 0.435 444 +446 3 -9.47 -53.15 -5.47 0.435 445 +447 3 -10.07 -53.77 -5.41 0.435 446 +448 3 -9.61 -54.83 -5.55 0.435 447 +449 3 -9.46 -55.59 -5.64 0.435 448 +450 3 -10.07 -56.21 -5.65 0.435 449 +451 3 -11.44 -56.36 -5.54 0.435 450 +452 3 -12.35 -57.28 -5.54 0.435 451 +453 3 -12.49 -57.74 -5.57 0.435 452 +454 3 -12.6 -58.26 -5.08 0.435 453 +455 3 -12.59 -59.47 -5.19 0.435 454 +456 3 -12.13 -61.45 -5.36 0.435 455 +457 3 -12.12 -62.66 -5.48 0.435 456 +458 3 -13.18 -63.13 -5.43 0.435 457 +459 3 -13.79 -64.05 -5.46 0.435 458 +460 3 -14.7 -65.88 -5.56 0.435 459 +461 3 -14.54 -67.86 -5.76 0.435 460 +462 3 -14.05 -69.56 -5.67 0.435 461 +463 3 -13.28 -70.32 -5.73 0.435 462 +464 3 -12.67 -71.52 -5.92 0.435 463 +465 3 -12.66 -72.75 -6.03 0.435 464 +466 3 -12.95 -73.97 -6.05 0.435 465 +467 3 -12.96 -75.19 -6.17 0.435 466 +468 3 -13.05 -75.7 -5.67 0.435 467 +469 3 -13.36 -76.3 -5.71 0.435 468 +470 3 -13.35 -76.61 -5.67 0.435 469 +471 3 -13.8 -77.68 -5.73 0.435 470 +472 3 -4.13 -8.82 -3.75 0.11 8 +473 3 -5.04 -9.14 -3.56 0.11 472 +474 3 -5.17 -9.91 -3.62 0.11 473 +475 3 -5.4 -9.38 -4.23 0.65 474 +476 3 -6.03 -9.39 -4.32 0.65 475 +477 3 -7.57 -9.66 -4.59 0.65 476 +478 3 -9.11 -9.96 -4.69 0.65 477 +479 3 -11.24 -10.59 -4.56 0.65 478 +480 3 -13.07 -11.2 -4.52 0.65 479 +481 3 -14.78 -12.25 -4.85 0.65 480 +482 3 -15.69 -13.17 -4.93 0.54 481 +483 3 -16.79 -14.8 -5.44 0.54 482 +484 3 -17.3 -15.82 -6.03 0.54 483 +485 3 -17.49 -16.53 -6.61 0.54 484 +486 3 -18.03 -16.92 -7.43 0.54 485 +487 3 -18.49 -17.35 -7.58 0.54 486 +488 3 -20.18 -16.91 -7.45 0.54 487 +489 3 -22.02 -17.51 -7.64 0.54 488 +490 3 -23.12 -17.93 -7.96 0.54 489 +491 3 -24.34 -18.55 -7.9 0.54 490 +492 3 -25.12 -18.67 -9.82 0.54 491 +493 3 -25.19 -19.23 -10.54 0.54 492 +494 3 -25.88 -18.84 -11.35 0.54 493 +495 3 -27.71 -17.94 -11.09 0.54 494 +496 3 -28.76 -18.42 -10.97 0.54 495 +497 3 -29.45 -18.34 -11.73 0.54 496 +498 3 -31.51 -17.81 -12.39 0.54 497 +499 3 -33.03 -18.12 -12.35 0.54 498 +500 3 -35.21 -17.8 -12.65 0.54 499 +501 3 -37.66 -17.18 -12.52 0.54 500 +502 3 -40.65 -16.07 -13.04 0.54 501 +503 3 -41.66 -16.27 -14.1 0.54 502 +504 3 -43.19 -16.58 -14.07 0.54 503 +505 3 -46.23 -17.82 -13.91 0.54 504 +506 3 -49.43 -18.6 -13.84 0.54 505 +507 3 -52.13 -18.96 -14.91 0.54 506 +508 3 -54.57 -19.28 -14.71 0.54 507 +509 3 -57.24 -18.15 -15.33 0.54 508 +510 3 -60.0 -18.47 -15.2 0.54 509 +511 3 -60.98 -18.7 -15.96 0.54 510 +512 3 -61.98 -18.92 -16.94 0.54 511 +513 3 -63.16 -19.26 -18.08 0.54 512 +514 3 -63.47 -19.57 -18.16 0.54 513 +515 3 -64.11 -20.15 -18.53 0.54 514 +516 3 -64.76 -20.11 -18.92 0.54 515 +517 3 -65.52 -20.87 -18.92 0.54 516 +518 3 -65.65 -21.05 -20.29 0.54 517 +519 3 -65.8 -21.49 -20.48 0.54 518 +520 3 -66.24 -21.66 -21.89 0.54 519 +521 3 -66.09 -21.81 -21.84 0.54 520 +522 3 -65.97 -21.94 -22.24 0.54 521 +523 3 -66.03 -21.87 -22.91 0.54 522 +524 3 -65.79 -22.1 -23.72 0.54 523 +525 3 -65.66 -22.21 -24.11 0.54 524 +526 3 -65.56 -22.92 -24.72 0.54 525 +527 3 -65.5 -23.29 -25.67 0.54 526 +528 3 -65.7 -23.68 -26.37 0.54 527 +529 3 -65.88 -24.11 -26.69 0.54 528 +530 3 -65.95 -24.34 -27.47 0.54 529 +531 3 -66.0 -24.89 -28.04 0.54 530 +532 3 -66.14 -24.75 -29.53 0.54 531 +533 3 -66.17 -25.01 -30.08 0.54 532 +534 3 -66.41 -25.36 -31.07 0.54 533 +535 3 -66.47 -25.93 -31.66 0.54 534 +536 3 -67.13 -26.47 -32.33 0.54 535 +537 3 -67.32 -26.9 -32.73 0.54 536 +538 3 -67.71 -27.11 -33.62 0.54 537 +539 3 -68.11 -27.31 -34.74 0.54 538 +540 3 -68.29 -27.74 -35.07 0.54 539 +541 3 -68.48 -28.16 -35.55 0.54 540 +542 3 -68.82 -29.04 -35.97 0.54 541 +543 3 -65.85 -20.54 -20.83 0.54 517 +544 3 -66.61 -20.69 -20.77 0.54 543 +545 3 -68.01 -20.83 -20.97 0.54 544 +546 3 -69.3 -20.45 -21.72 0.54 545 +547 3 -71.02 -20.27 -21.99 0.54 546 +548 3 -71.91 -20.3 -23.28 0.54 547 +549 3 -73.47 -20.56 -23.68 0.54 548 +550 3 -75.26 -20.3 -24.77 0.54 549 +551 3 -77.1 -20.02 -24.66 0.54 550 +552 3 -78.96 -19.68 -24.82 0.54 551 +553 3 -80.73 -19.46 -25.63 0.54 552 +554 3 -82.71 -20.23 -25.59 0.54 553 +555 3 -84.53 -20.25 -25.42 0.54 554 +556 3 -86.26 -19.76 -25.75 0.54 555 +557 3 -87.79 -18.56 -25.49 0.54 556 +558 3 -89.16 -17.5 -25.26 0.54 557 +559 3 -90.21 -17.06 -25.04 0.54 558 +560 3 -92.19 -16.62 -24.81 0.54 559 +561 3 -93.6 -16.14 -25.02 0.54 560 +562 3 -94.25 -15.81 -25.3 0.54 561 +563 3 -96.38 -14.92 -25.02 0.54 562 +564 3 -24.5 -18.09 -7.92 0.54 491 +565 3 -26.66 -18.39 -8.06 0.54 564 +566 3 -28.03 -19.16 -8.08 0.54 565 +567 3 -29.48 -19.84 -8.99 0.54 566 +568 3 -29.94 -20.9 -9.13 0.54 567 +569 3 -30.25 -21.2 -9.13 0.54 568 +570 3 -31.18 -21.5 -7.63 0.54 569 +571 3 -32.1 -21.52 -7.55 0.54 570 +572 3 -34.69 -21.09 -7.28 0.54 571 +573 3 -38.04 -20.2 -6.96 0.54 572 +574 3 -40.66 -19.74 -6.9 0.54 573 +575 3 -41.28 -20.34 -7.05 0.54 574 +576 3 -43.0 -20.75 -7.53 0.54 575 +577 3 -43.16 -20.9 -7.68 0.54 576 +578 3 -43.07 -21.29 -6.75 0.54 577 +579 3 -43.92 -21.67 -5.95 0.54 578 +580 3 -45.55 -22.49 -5.42 0.54 579 +581 3 -47.53 -23.89 -5.38 0.54 580 +582 3 -49.35 -23.9 -5.14 0.54 581 +583 3 -52.08 -25.15 -5.0 0.54 582 +584 3 -53.9 -26.08 -4.92 0.54 583 +585 3 -55.41 -27.31 -4.77 0.54 584 +586 3 -57.2 -27.98 -4.36 0.54 585 +587 3 -59.45 -28.48 -3.9 0.54 586 +588 3 -61.09 -28.99 -3.41 0.54 587 +589 3 -63.5 -29.65 -2.96 0.54 588 +590 3 -65.78 -29.51 -2.73 0.54 589 +591 3 -69.56 -29.72 -2.18 0.54 590 +592 3 -71.53 -29.6 -1.84 0.54 591 +593 3 -73.15 -29.53 -0.99 0.54 592 +594 3 -73.43 -30.78 -0.87 0.54 593 +595 3 -74.0 -31.43 -0.5 0.54 594 +596 3 -76.57 -30.69 -0.12 0.54 595 +597 3 -79.45 -31.49 0.14 0.54 596 +598 3 -81.74 -31.97 0.31 0.54 597 +599 3 -84.31 -32.46 0.65 0.54 598 +600 3 -85.67 -33.25 0.84 0.54 599 +601 3 -87.01 -33.45 1.25 0.54 600 +602 3 -89.27 -33.94 1.64 0.54 601 +603 3 -90.76 -34.9 1.98 0.54 602 +604 3 -92.58 -36.14 2.12 0.54 603 +605 3 -93.74 -36.8 2.6 0.54 604 +606 3 -96.02 -37.9 2.78 0.54 605 +607 3 -96.78 -38.67 2.78 0.54 606 +608 3 -30.41 -22.58 -9.26 0.54 569 +609 3 -31.31 -24.71 -9.38 0.54 608 +610 3 -32.21 -26.85 -9.5 0.54 609 +611 3 -32.21 -28.06 -9.63 0.54 610 +612 3 -32.23 -28.94 -10.01 0.54 611 +613 3 -32.43 -29.97 -10.55 0.54 612 +614 3 -33.03 -31.18 -10.68 0.54 613 +615 3 -33.72 -32.01 -11.69 0.54 614 +616 3 -34.8 -32.47 -11.71 0.54 615 +617 3 -35.85 -33.55 -11.71 0.54 616 +618 3 -36.47 -34.77 -11.77 0.54 617 +619 3 -36.15 -36.29 -11.95 0.54 618 +620 3 -36.42 -36.55 -11.96 0.54 619 +621 3 -36.57 -37.32 -10.35 0.65 620 +622 3 -36.91 -37.59 -10.73 0.65 621 +623 3 -37.01 -37.49 -11.77 0.65 622 +624 3 -37.15 -37.96 -10.06 0.65 623 +625 3 -37.58 -38.45 -9.76 0.65 624 +626 3 -38.43 -38.82 -9.11 0.65 625 +627 3 -38.88 -39.29 -9.04 0.65 626 +628 3 -39.78 -39.01 -8.85 0.65 627 +629 3 -40.55 -38.86 -8.77 0.54 628 +630 3 -41.77 -38.87 -8.65 0.54 629 +631 3 -42.51 -39.64 -8.51 0.54 630 +632 3 -43.42 -40.58 -8.45 0.54 631 +633 3 -43.39 -42.11 -8.45 0.54 632 +634 3 -43.69 -42.74 -8.4 0.54 633 +635 3 -44.43 -43.52 -8.19 0.54 634 +636 3 -45.94 -43.85 -8.0 0.54 635 +637 3 -47.62 -43.72 -7.76 0.54 636 +638 3 -48.63 -44.23 -7.27 0.54 637 +639 3 -49.35 -45.04 -6.76 0.54 638 +640 3 -50.21 -45.4 -6.26 0.54 639 +641 3 -50.79 -46.05 -5.96 0.54 640 +642 3 -51.85 -47.74 -5.94 0.54 641 +643 3 -53.06 -48.36 -5.9 0.54 642 +644 3 -54.11 -49.45 -5.69 0.54 643 +645 3 -55.62 -50.38 -5.63 0.54 644 +646 3 -56.5 -51.33 -5.34 0.54 645 +647 3 -57.4 -51.64 -5.21 0.54 646 +648 3 -59.23 -50.75 -4.95 0.54 647 +649 3 -59.97 -51.54 -4.75 0.54 648 +650 3 -61.03 -52.62 -4.67 0.54 649 +651 3 -62.84 -53.27 -4.34 0.54 650 +652 3 -63.74 -54.5 -4.3 0.54 651 +653 3 -64.65 -55.42 -4.31 0.54 652 +654 3 -65.71 -55.88 -4.26 0.54 653 +655 3 -67.38 -55.75 -4.09 0.54 654 +656 3 -69.97 -56.54 -3.92 0.54 655 +657 3 -71.02 -58.52 -4.02 0.54 656 +658 3 -71.77 -59.29 -3.96 0.54 657 +659 3 -71.92 -60.98 -4.11 0.54 658 +660 3 -72.07 -62.04 -4.19 0.54 659 +661 3 -72.51 -62.82 -4.0 0.54 660 +662 3 -74.79 -62.7 -3.7 0.54 661 +663 3 -76.29 -63.03 -3.52 0.54 662 +664 3 -76.89 -63.65 -3.38 0.54 663 +665 3 -77.75 -64.63 -2.87 0.54 664 +666 3 -78.35 -65.25 -2.79 0.54 665 +667 3 -79.26 -66.17 -2.79 0.54 666 +668 3 -80.78 -66.49 -2.61 0.54 667 +669 3 -81.84 -67.57 -2.63 0.54 668 +670 3 -82.9 -68.64 -2.63 0.54 669 +671 3 -85.03 -68.97 -2.46 0.54 670 +672 3 -86.1 -70.04 -2.47 0.54 671 +673 3 -87.15 -70.52 -2.34 0.54 672 +674 3 -87.87 -71.62 -2.08 0.54 673 +675 3 -88.17 -71.94 -1.93 0.54 674 +676 3 -88.62 -72.4 -1.93 0.54 675 +677 3 -89.21 -73.02 -1.87 0.54 676 +678 3 -90.59 -73.18 -1.75 0.54 677 +679 3 -92.27 -73.35 -1.62 0.54 678 +680 3 -93.03 -74.13 -1.63 0.54 679 +681 3 -93.63 -74.73 -1.63 0.54 680 +682 3 -94.37 -75.52 -1.49 0.54 681 +683 3 -94.98 -76.74 -1.47 0.54 682 +684 3 -95.28 -77.66 -1.53 0.54 683 +685 3 -95.57 -78.28 -1.49 0.54 684 +686 3 -96.18 -79.2 -1.53 0.54 685 +687 3 -96.63 -79.96 -1.56 0.54 686 +688 3 -98.31 -79.81 -1.39 0.54 687 +689 3 -99.52 -79.83 -1.28 0.54 688 +690 3 -100.5 -80.4 -0.26 0.65 689 +691 3 -101.37 -81.06 0.2 0.65 690 +692 3 -101.93 -81.71 0.64 0.65 691 +693 3 -104.5 -82.22 1.12 0.65 692 +694 3 -107.38 -82.71 1.34 0.65 693 +695 3 -108.58 -83.33 1.48 0.65 694 +696 3 -110.26 -84.42 1.53 0.435 695 +697 3 -112.24 -84.59 1.69 0.435 696 +698 3 -113.74 -84.92 1.94 0.435 697 +699 3 -115.1 -86.3 2.09 0.435 698 +700 3 -115.4 -86.62 2.09 0.65 699 +701 3 -116.47 -87.09 2.14 0.65 700 +702 3 -117.67 -88.32 2.2 0.65 701 +703 3 -118.11 -89.99 2.08 0.65 702 +704 3 -117.51 -90.91 1.93 0.65 703 +705 3 -116.44 -91.96 1.81 0.65 704 +706 3 -116.38 -93.84 2.08 0.65 705 +707 3 -116.38 -94.75 2.06 0.65 706 +708 3 -116.66 -95.39 2.17 0.65 707 +709 3 -116.82 -95.84 2.22 0.65 708 +710 3 -117.38 -95.88 2.65 0.65 709 +711 3 -117.21 -97.57 2.55 0.65 710 +712 3 -117.31 -98.69 3.06 0.65 711 +713 3 -117.87 -99.35 3.56 0.65 712 +714 3 -118.31 -99.82 3.64 0.65 713 +715 3 -119.48 -99.89 4.34 0.65 714 +716 3 -119.79 -100.19 4.34 0.65 715 +717 3 -120.37 -100.84 4.64 0.65 716 +718 3 -121.26 -101.77 4.78 0.65 717 +719 3 -121.57 -102.09 4.78 0.65 718 +720 3 -122.02 -102.54 4.78 0.65 719 +721 3 -123.54 -102.26 5.02 0.65 720 +722 3 -124.3 -102.42 5.07 0.65 721 +723 3 -124.59 -102.74 5.14 0.65 722 +724 3 -124.74 -103.2 5.11 0.65 723 +725 3 -36.35 -37.31 -10.9 0.54 620 +726 3 -35.82 -37.83 -10.25 0.54 725 +727 3 -35.54 -38.11 -10.45 0.54 726 +728 3 -35.25 -38.41 -9.06 0.54 727 +729 3 -34.88 -38.78 -8.38 0.54 728 +730 3 -34.45 -39.82 -7.17 0.54 729 +731 3 -34.43 -40.75 -7.11 0.54 730 +732 3 -34.99 -42.63 -6.71 0.54 731 +733 3 -35.37 -44.07 -6.05 0.54 732 +734 3 -35.66 -44.7 -5.94 0.54 733 +735 3 -35.61 -45.35 -5.55 0.54 734 +736 3 -35.72 -46.45 -5.27 0.54 735 +737 3 -36.02 -47.07 -5.22 0.54 736 +738 3 -36.42 -47.6 -4.63 0.54 737 +739 3 -36.87 -48.68 -4.55 0.54 738 +740 3 -37.46 -49.3 -4.4 0.54 739 +741 3 -37.74 -49.94 -4.22 0.54 740 +742 3 -38.08 -51.13 -3.09 0.54 741 +743 3 -37.89 -52.21 -2.84 0.54 742 +744 3 -38.14 -53.2 -2.31 0.54 743 +745 3 -38.38 -54.17 -1.7 0.54 744 +746 3 -38.36 -55.11 -1.64 0.54 745 +747 3 -38.5 -55.57 -1.52 0.54 746 +748 3 -38.49 -55.89 -1.4 0.54 747 +749 3 -38.75 -56.54 -1.06 0.54 748 +750 3 -39.46 -57.36 -0.54 0.54 749 +751 3 -40.96 -57.7 -0.14 0.54 750 +752 3 -42.01 -57.87 0.0 0.54 751 +753 3 -42.45 -58.35 0.23 0.54 752 +754 3 -43.05 -58.98 0.29 0.54 753 +755 3 6.7 -3.75 -5.33 0.865 1 +756 3 7.16 -4.21 -5.41 0.865 755 +757 3 8.22 -4.04 -5.49 0.865 756 +758 3 9.44 -4.63 -5.66 0.865 757 +759 3 10.51 -5.08 -5.81 0.865 758 +760 3 11.58 -6.45 -6.04 0.865 759 +761 3 12.35 -7.2 -6.18 0.54 760 +762 3 14.62 -7.02 -6.37 0.54 761 +763 3 16.16 -7.01 -6.52 0.54 762 +764 3 16.73 -7.29 -5.23 0.54 763 +765 3 17.34 -7.28 -5.29 0.54 764 +766 3 18.42 -6.85 -3.46 0.54 765 +767 3 19.63 -5.01 -3.39 0.54 766 +768 3 20.89 -4.13 -4.55 0.54 767 +769 3 22.56 -3.66 -4.66 0.54 768 +770 3 23.48 -3.35 -4.72 0.54 769 +771 3 24.39 -2.42 -4.71 0.54 770 +772 3 25.0 -1.82 -4.71 0.54 771 +773 3 27.48 -1.23 -6.0 0.54 772 +774 3 29.0 -1.51 -6.17 0.54 773 +775 3 29.91 -0.59 -6.17 0.54 774 +776 3 31.13 0.63 -6.16 0.54 775 +777 3 32.73 1.79 -6.95 0.54 776 +778 3 34.85 3.33 -7.0 0.54 777 +779 3 36.38 4.25 -7.05 0.54 778 +780 3 39.25 5.95 -7.15 0.54 779 +781 3 41.7 6.88 -7.28 0.54 780 +782 3 44.17 7.47 -8.52 0.54 781 +783 3 45.54 7.95 -8.75 0.54 782 +784 3 46.67 8.34 -7.98 0.54 783 +785 3 48.22 8.32 -7.82 0.54 784 +786 3 49.47 8.61 -7.53 0.54 785 +787 3 50.45 8.24 -6.98 0.54 786 +788 3 52.97 7.87 -6.34 0.54 787 +789 3 54.85 8.43 -5.78 0.54 788 +790 3 56.74 8.68 -5.18 0.54 789 +791 3 58.14 9.43 -5.0 0.54 790 +792 3 59.39 9.7 -4.63 0.54 791 +793 3 60.79 10.44 -4.32 0.54 792 +794 3 62.66 10.41 -4.04 0.54 793 +795 3 65.9 10.85 -3.76 0.54 794 +796 3 18.25 -7.88 -5.43 0.54 765 +797 3 19.2 -8.81 -5.31 0.54 796 +798 3 19.5 -10.04 -5.37 0.54 797 +799 3 19.68 -10.81 -5.32 0.54 798 +800 3 21.72 -13.13 -5.06 0.54 799 +801 3 23.56 -14.94 -5.4 0.54 800 +802 3 24.81 -16.17 -5.41 0.54 801 +803 3 26.03 -18.3 -5.59 0.54 802 +804 3 26.38 -18.96 -5.23 0.54 803 +805 3 26.56 -19.43 -5.06 0.54 804 +806 3 26.58 -20.67 -5.03 0.54 805 +807 3 26.88 -21.57 -5.14 0.54 806 +808 3 27.2 -22.79 -5.22 0.54 807 +809 3 27.99 -23.57 -5.13 0.54 808 +810 3 29.55 -24.49 -4.99 0.54 809 +811 3 31.08 -24.2 -5.03 0.54 810 +812 3 33.23 -23.6 -4.79 0.54 811 +813 3 34.92 -24.35 -4.94 0.54 812 +814 3 36.3 -25.12 -4.99 0.54 813 +815 3 37.35 -25.55 -5.28 0.54 814 +816 3 38.39 -25.36 -5.66 0.54 815 +817 3 39.69 -25.1 -6.6 0.54 816 +818 3 41.21 -25.7 -6.8 0.54 817 +819 3 41.11 -26.5 -8.07 0.435 818 +820 3 41.28 -26.98 -7.9 0.435 819 +821 3 41.37 -27.36 -8.7 0.435 820 +822 3 41.43 -27.72 -9.65 0.435 821 +823 3 41.51 -28.11 -10.53 0.435 822 +824 3 41.7 -28.58 -11.96 0.435 823 +825 3 43.52 -30.38 -12.38 0.435 824 +826 3 44.59 -31.74 -12.61 0.435 825 +827 3 45.81 -34.47 -13.0 0.435 826 +828 3 48.56 -36.26 -13.42 0.435 827 +829 3 49.79 -38.08 -13.71 0.435 828 +830 3 50.69 -39.29 -13.91 0.435 829 +831 3 50.1 -40.51 -13.97 0.435 830 +832 3 47.97 -41.44 -13.87 0.435 831 +833 3 47.06 -42.66 -13.91 0.435 832 +834 3 47.67 -44.48 -14.14 0.435 833 +835 3 49.35 -44.92 -14.33 0.435 834 +836 3 50.37 -45.02 -14.96 0.435 835 +837 3 50.05 -46.22 -15.28 0.435 836 +838 3 49.9 -47.27 -15.45 0.435 837 +839 3 49.75 -49.25 -15.62 0.435 838 +840 3 49.75 -50.47 -15.74 0.435 839 +841 3 49.59 -51.52 -15.98 0.435 840 +842 3 49.53 -52.98 -16.73 0.435 841 +843 3 49.98 -54.33 -17.05 0.435 842 +844 3 50.87 -55.81 -17.58 0.435 843 +845 3 51.79 -57.63 -17.85 0.435 844 +846 3 52.1 -59.75 -18.15 0.435 845 +847 3 52.26 -62.03 -18.38 0.435 846 +848 3 52.85 -62.92 -18.67 0.435 847 +849 3 53.77 -63.52 -18.91 0.435 848 +850 3 54.58 -65.83 -20.41 0.435 849 +851 3 54.57 -67.64 -20.66 0.435 850 +852 3 54.7 -69.58 -21.25 0.435 851 +853 3 54.93 -71.32 -22.26 0.435 852 +854 3 56.08 -72.45 -23.31 0.435 853 +855 3 57.4 -74.07 -24.12 0.435 854 +856 3 58.83 -75.75 -25.63 0.435 855 +857 3 61.87 -78.15 -26.21 0.435 856 +858 3 63.91 -79.24 -27.57 0.435 857 +859 3 66.44 -81.15 -28.52 0.435 858 +860 3 67.97 -82.65 -28.87 0.435 859 +861 3 68.9 -84.76 -29.17 0.435 860 +862 3 70.27 -86.12 -29.43 0.435 861 +863 3 72.7 -86.41 -29.68 0.435 862 +864 3 74.37 -87.44 -30.09 0.435 863 +865 3 76.32 -89.68 -30.79 0.435 864 +866 3 77.64 -91.58 -31.71 0.435 865 +867 3 77.81 -92.34 -33.31 0.435 866 +868 3 78.38 -93.21 -33.98 0.435 867 +869 3 79.18 -94.29 -35.44 0.435 868 +870 3 80.02 -95.42 -36.38 0.435 869 +871 3 79.7 -97.22 -36.84 0.435 870 +872 3 79.68 -100.23 -37.49 0.435 871 +873 3 81.27 -104.22 -39.09 0.435 872 +874 3 82.94 -106.47 -39.54 0.435 873 +875 3 84.3 -108.12 -39.98 0.435 874 +876 3 84.22 -110.15 -41.09 0.435 875 +877 3 83.92 -111.99 -41.3 0.435 876 +878 3 83.01 -114.72 -41.57 0.435 877 +879 3 83.16 -115.79 -41.69 0.435 878 +880 3 84.18 -117.08 -42.58 0.435 879 +881 3 85.78 -118.66 -43.64 0.435 880 +882 3 86.0 -120.08 -44.85 0.435 881 +883 3 86.26 -120.62 -45.54 0.435 882 +884 3 87.14 -121.81 -45.96 0.435 883 +885 3 88.82 -122.26 -46.16 0.435 884 +886 3 89.68 -124.0 -47.16 0.435 885 +887 3 89.84 -126.28 -47.4 0.435 886 +888 3 91.66 -128.08 -47.83 0.435 887 +889 3 93.26 -128.44 -48.84 0.435 888 +890 3 94.76 -128.1 -49.18 0.435 889 +891 3 95.21 -128.56 -49.26 0.435 890 +892 3 41.61 -25.79 -7.52 0.54 818 +893 3 44.26 -26.59 -8.82 0.54 892 +894 3 46.54 -26.4 -9.01 0.54 893 +895 3 48.66 -26.67 -9.47 0.54 894 +896 3 50.33 -27.72 -9.72 0.54 895 +897 3 52.09 -28.24 -10.61 0.54 896 +898 3 54.16 -29.07 -11.64 0.54 897 +899 3 55.53 -29.2 -11.78 0.54 898 +900 3 56.54 -30.2 -10.99 0.54 899 +901 3 58.49 -30.93 -9.81 0.54 900 +902 3 60.79 -32.89 -10.21 0.54 901 +903 3 63.02 -34.5 -9.37 0.54 902 +904 3 65.02 -35.86 -9.6 0.54 903 +905 3 66.69 -37.83 -9.95 0.54 904 +906 3 67.76 -39.18 -10.18 0.54 905 +907 3 69.76 -41.14 -10.55 0.54 906 +908 3 71.64 -42.09 -10.14 0.54 907 +909 3 72.86 -43.0 -10.35 0.54 908 +910 3 73.48 -43.9 -10.49 0.54 909 +911 4 -2.36 9.28 -0.57 4.11 1 +912 4 -2.99 13.54 -0.1 3.14 911 +913 4 -3.77 16.72 0.27 2.49 912 +914 4 -4.07 19.45 0.57 1.73 913 +915 4 -4.39 21.59 0.8 1.515 914 +916 4 -5.0 23.4 1.12 1.405 915 +917 4 -5.16 25.07 1.3 1.405 916 +918 4 -5.16 26.28 1.42 1.405 917 +919 4 -5.46 27.8 1.66 1.405 918 +920 4 -5.05 29.49 3.08 1.73 919 +921 4 -4.75 31.94 3.29 1.73 920 +922 4 -5.06 34.06 3.52 1.73 921 +923 4 -5.52 36.34 3.79 1.73 922 +924 4 -5.87 38.81 3.61 1.405 923 +925 4 -5.8 40.87 2.97 1.405 924 +926 4 -5.82 42.7 3.08 1.19 925 +927 4 -5.37 44.38 3.2 1.19 926 +928 4 -5.22 46.05 3.35 1.19 927 +929 4 -4.31 47.89 3.45 1.19 928 +930 4 -3.71 50.02 3.6 1.19 929 +931 4 -2.65 51.7 3.67 1.19 930 +932 4 -1.75 54.45 3.84 1.19 931 +933 4 -1.45 55.98 3.97 1.19 932 +934 4 -1.43 57.49 2.68 1.19 933 +935 4 -1.34 58.92 3.72 1.19 934 +936 4 -1.66 60.43 3.97 1.19 935 +937 4 -1.36 61.35 3.97 1.19 936 +938 4 -2.03 62.01 3.48 1.19 937 +939 4 -2.42 63.01 2.71 1.19 938 +940 4 -2.68 62.9 3.33 0.54 939 +941 4 -3.28 62.89 3.38 0.54 940 +942 4 -3.26 62.88 3.53 0.54 941 +943 4 -3.2 62.81 4.27 0.54 942 +944 4 -3.18 62.79 4.49 0.54 943 +945 4 -3.56 62.84 5.44 0.54 944 +946 4 -3.5 62.49 6.01 0.54 945 +947 4 -3.44 62.43 6.67 0.54 946 +948 4 -3.33 62.31 7.86 0.54 947 +949 4 -3.13 62.11 8.28 0.54 948 +950 4 -3.12 61.49 8.37 0.54 949 +951 4 -3.11 60.57 8.28 0.54 950 +952 4 -3.24 59.47 8.56 0.54 951 +953 4 -3.23 58.56 8.47 0.54 952 +954 4 -3.22 57.95 8.48 0.54 953 +955 4 -3.81 57.02 8.53 0.54 954 +956 4 -4.11 56.71 8.6 0.54 955 +957 4 -5.02 57.0 8.79 0.54 956 +958 4 -5.55 57.5 9.87 0.54 957 +959 4 -6.0 58.57 10.01 0.65 958 +960 4 -6.76 59.01 10.12 0.65 959 +961 4 -7.3 58.93 10.92 0.65 960 +962 4 -8.11 58.83 10.45 0.65 961 +963 4 -8.11 60.05 8.99 0.65 962 +964 4 -7.92 60.48 7.8 0.65 963 +965 4 -9.09 61.64 6.89 0.65 964 +966 4 -9.86 62.4 6.89 0.65 965 +967 4 -11.04 63.28 5.79 0.65 966 +968 4 -12.6 63.9 5.7 0.65 967 +969 4 -14.08 64.45 4.69 0.65 968 +970 4 -14.86 65.22 4.75 0.65 969 +971 4 -16.53 66.26 5.01 0.65 970 +972 4 -17.44 67.16 5.18 0.65 971 +973 4 -17.75 67.47 5.24 0.65 972 +974 4 -18.66 67.76 5.35 0.65 973 +975 4 -19.88 68.37 5.52 0.65 974 +976 4 -21.15 69.63 5.15 0.65 975 +977 4 -21.96 71.62 5.12 0.65 976 +978 4 -22.38 72.05 3.84 0.65 977 +979 4 -22.04 73.24 2.8 0.65 978 +980 4 -22.69 73.88 2.38 0.435 979 +981 4 -23.76 74.94 2.66 0.435 980 +982 4 -23.91 76.0 2.78 0.54 981 +983 4 -24.22 77.83 2.98 0.54 982 +984 4 -24.36 79.48 3.24 0.54 983 +985 4 -24.22 80.86 3.28 0.54 984 +986 4 -24.13 81.98 2.78 0.54 985 +987 4 -24.25 83.31 1.79 0.54 986 +988 4 -23.93 84.83 0.32 0.54 987 +989 4 -24.03 85.56 -0.72 0.54 988 +990 4 -23.99 87.04 -1.8 0.54 989 +991 4 -24.53 88.18 -2.39 0.54 990 +992 4 -25.3 89.55 -4.0 0.54 991 +993 4 -25.85 91.31 -4.69 0.54 992 +994 4 -26.54 93.82 -5.29 0.54 993 +995 4 -26.94 96.94 -5.77 0.54 994 +996 4 -26.5 99.86 -5.68 0.54 995 +997 4 -25.4 101.2 -6.86 0.54 996 +998 4 -24.5 102.74 -6.87 0.54 997 +999 4 -24.36 105.01 -6.66 0.54 998 +1000 4 -23.75 105.63 -6.73 0.54 999 +1001 4 -22.53 105.95 -6.81 0.54 1000 +1002 4 -21.96 106.6 -7.18 0.54 1001 +1003 4 -21.07 107.54 -7.4 0.54 1002 +1004 4 -20.88 107.97 -8.66 0.54 1003 +1005 4 -20.98 108.68 -9.57 0.54 1004 +1006 4 -21.55 110.15 -10.59 0.54 1005 +1007 4 -22.0 110.61 -12.0 0.54 1006 +1008 4 -22.54 110.53 -12.87 0.54 1007 +1009 4 -23.53 110.0 -13.74 0.54 1008 +1010 4 -24.05 109.62 -14.48 0.54 1009 +1011 4 -24.55 108.9 -15.04 0.54 1010 +1012 4 -24.91 108.66 -15.7 0.54 1011 +1013 4 -25.63 108.16 -16.9 0.54 1012 +1014 4 -27.38 107.78 -17.6 0.54 1013 +1015 4 -29.09 107.35 -18.02 0.54 1014 +1016 4 -30.38 106.79 -18.63 0.54 1015 +1017 4 -31.99 105.66 -19.65 0.54 1016 +1018 4 -33.92 105.15 -20.66 0.54 1017 +1019 4 -35.31 105.02 -20.85 0.54 1018 +1020 4 -36.26 104.14 -21.23 0.54 1019 +1021 4 -37.38 103.73 -21.84 0.54 1020 +1022 4 -38.82 103.03 -22.53 0.54 1021 +1023 4 -39.89 102.56 -22.55 0.54 1022 +1024 4 -21.12 73.85 2.77 0.435 979 +1025 4 -20.74 75.31 2.04 0.435 1024 +1026 4 -21.43 75.38 1.21 0.54 1025 +1027 4 -22.5 76.74 1.44 0.54 1026 +1028 4 -24.34 77.95 1.72 0.54 1027 +1029 4 -25.85 78.23 1.89 0.54 1028 +1030 4 -27.46 79.21 1.31 0.54 1029 +1031 4 -29.09 80.52 0.37 0.54 1030 +1032 4 -30.73 81.25 -0.68 0.54 1031 +1033 4 -31.11 81.93 -1.33 0.54 1032 +1034 4 -32.04 82.54 -1.34 0.54 1033 +1035 4 -32.62 83.11 -2.51 0.54 1034 +1036 4 -33.03 83.23 -3.67 0.54 1035 +1037 4 -33.66 83.85 -3.79 0.54 1036 +1038 4 -34.42 84.31 -5.41 0.54 1037 +1039 4 -34.98 84.86 -4.7 0.54 1038 +1040 4 -35.5 85.38 -5.28 0.54 1039 +1041 4 -36.26 86.44 -6.7 0.54 1040 +1042 4 -36.87 87.35 -6.55 0.54 1041 +1043 4 -38.48 88.04 -7.4 0.54 1042 +1044 4 -40.59 88.91 -8.48 0.54 1043 +1045 4 -42.74 89.84 -8.4 0.54 1044 +1046 4 -44.31 90.47 -8.73 0.54 1045 +1047 4 -45.65 92.4 -9.63 0.54 1046 +1048 4 -46.08 93.44 -10.85 0.54 1047 +1049 4 -2.27 64.69 2.78 1.19 939 +1050 4 -1.98 65.92 2.81 1.19 1049 +1051 4 -1.53 66.99 2.87 1.19 1050 +1052 4 -0.62 69.11 3.05 1.19 1051 +1053 4 -0.92 70.01 3.25 1.19 1052 +1054 4 -1.19 71.49 3.88 1.19 1053 +1055 4 -2.26 72.5 4.08 1.19 1054 +1056 4 -1.69 72.84 5.34 0.54 1055 +1057 4 -1.53 73.28 5.59 0.54 1056 +1058 4 -1.03 73.39 5.93 0.54 1057 +1059 4 -0.89 74.16 5.91 0.54 1058 +1060 4 -0.13 75.84 6.01 0.54 1059 +1061 4 0.46 77.68 6.13 0.54 1060 +1062 4 0.91 78.75 6.19 0.54 1061 +1063 4 0.02 79.93 6.69 0.54 1062 +1064 4 -0.87 80.82 6.94 0.54 1063 +1065 4 -1.18 83.25 7.21 0.54 1064 +1066 4 -1.14 84.41 7.93 0.54 1065 +1067 4 -1.51 85.09 7.27 0.54 1066 +1068 4 -1.52 85.99 7.43 0.54 1067 +1069 4 -1.73 86.82 6.85 0.54 1068 +1070 4 -1.93 87.64 6.35 0.54 1069 +1071 4 -2.29 88.0 5.81 0.54 1070 +1072 4 -2.37 88.68 5.06 0.54 1071 +1073 4 -2.92 89.83 4.23 0.54 1072 +1074 4 -2.86 90.69 3.33 0.54 1073 +1075 4 -3.25 91.68 2.62 0.54 1074 +1076 4 -3.31 92.36 2.02 0.54 1075 +1077 4 -4.27 94.22 1.77 0.54 1076 +1078 4 -4.28 95.44 1.89 0.54 1077 +1079 4 -4.44 96.5 1.92 0.54 1078 +1080 4 -4.95 97.32 1.45 0.54 1079 +1081 4 -4.83 98.72 1.35 0.54 1080 +1082 4 -5.2 99.99 0.83 0.54 1081 +1083 4 -5.57 101.57 0.34 0.54 1082 +1084 4 -5.51 102.44 -0.64 0.54 1083 +1085 4 -6.15 102.16 -2.57 0.54 1084 +1086 4 -6.45 102.17 -2.54 0.54 1085 +1087 4 -7.51 102.61 -2.4 0.54 1086 +1088 4 -7.83 103.82 -2.26 0.54 1087 +1089 4 -7.82 104.73 -2.09 0.54 1088 +1090 4 -7.83 105.65 -1.99 0.54 1089 +1091 4 -8.17 106.6 -2.4 0.54 1090 +1092 4 -8.11 107.45 -3.15 0.54 1091 +1093 4 -8.11 108.07 -4.84 0.54 1092 +1094 4 -8.42 108.38 -6.45 0.54 1093 +1095 4 -9.37 109.01 -6.67 0.54 1094 +1096 4 -9.37 110.83 -6.43 0.54 1095 +1097 4 -9.28 112.27 -6.96 0.54 1096 +1098 4 -9.84 112.83 -7.99 0.54 1097 +1099 4 -10.31 113.3 -8.13 0.54 1098 +1100 4 -11.46 115.96 -8.6 0.54 1099 +1101 4 -11.75 118.36 -9.69 0.54 1100 +1102 4 -11.68 120.11 -10.37 0.54 1101 +1103 4 -11.17 122.05 -11.21 0.54 1102 +1104 4 -12.02 123.2 -12.0 0.54 1103 +1105 4 -13.35 125.12 -12.89 0.54 1104 +1106 4 -12.85 126.46 -13.87 0.54 1105 +1107 4 -12.1 127.24 -14.02 0.54 1106 +1108 4 -10.88 129.37 -13.91 0.54 1107 +1109 4 -10.66 131.88 -14.45 0.54 1108 +1110 4 -10.24 134.8 -14.5 0.54 1109 +1111 4 -9.71 136.09 -15.19 0.54 1110 +1112 4 -9.21 137.74 -16.28 0.54 1111 +1113 4 -8.85 139.52 -17.12 0.54 1112 +1114 4 -8.37 140.88 -18.47 0.54 1113 +1115 4 -8.15 142.17 -19.2 0.54 1114 +1116 4 -7.47 143.03 -20.17 0.54 1115 +1117 4 -6.98 143.76 -21.34 0.54 1116 +1118 4 -6.3 144.62 -22.15 0.54 1117 +1119 4 -5.65 145.49 -23.34 0.54 1118 +1120 4 -4.55 146.83 -24.52 0.54 1119 +1121 4 -4.03 147.56 -25.56 0.54 1120 +1122 4 -3.49 148.24 -26.29 0.54 1121 +1123 4 -2.86 149.13 -27.56 0.54 1122 +1124 4 -1.65 150.97 -27.55 0.54 1123 +1125 4 -1.2 152.35 -29.06 0.54 1124 +1126 4 0.46 154.05 -29.11 0.54 1125 +1127 4 -2.56 72.54 4.11 1.19 1055 +1128 4 -4.2 74.16 4.79 1.08 1127 +1129 4 -5.12 75.06 5.04 1.08 1128 +1130 4 -5.32 75.9 5.51 0.54 1129 +1131 4 -4.55 76.67 5.52 0.54 1130 +1132 4 -2.73 76.99 5.39 0.54 1131 +1133 4 0.29 77.02 5.11 0.54 1132 +1134 4 2.09 76.76 4.54 0.54 1133 +1135 4 4.1 76.3 4.61 0.54 1134 +1136 4 6.44 75.81 4.88 0.54 1135 +1137 4 9.03 74.46 4.59 0.54 1136 +1138 4 11.15 73.57 4.3 0.54 1137 +1139 4 12.56 73.4 4.45 0.54 1138 +1140 4 14.72 72.48 4.46 0.54 1139 +1141 4 16.24 71.58 4.24 0.54 1140 +1142 4 17.65 70.18 4.35 0.54 1141 +1143 4 20.1 68.37 4.02 0.54 1142 +1144 4 21.94 68.38 4.0 0.54 1143 +1145 4 23.51 68.34 4.38 0.54 1144 +1146 4 24.77 68.32 4.65 0.54 1145 +1147 4 26.58 68.03 4.45 0.54 1146 +1148 4 28.73 66.83 4.21 0.54 1147 +1149 4 31.16 67.15 4.02 0.54 1148 +1150 4 34.23 66.84 4.01 0.54 1149 +1151 4 37.46 65.47 3.95 0.54 1150 +1152 4 39.76 65.63 3.9 0.54 1151 +1153 4 42.35 65.8 3.76 0.54 1152 +1154 4 45.1 66.44 3.64 0.54 1153 +1155 4 46.65 66.11 3.77 0.54 1154 +1156 4 49.09 64.29 3.45 0.54 1155 +1157 4 51.69 62.65 3.05 0.54 1156 +1158 4 53.37 63.12 2.94 0.54 1157 +1159 4 55.18 64.05 2.86 0.54 1158 +1160 4 62.55 62.92 2.23 0.54 1159 +1161 4 66.81 62.05 1.75 0.54 1160 +1162 4 69.42 61.89 1.79 0.54 1161 +1163 4 70.71 61.85 2.34 0.54 1162 +1164 4 71.95 60.62 2.34 0.54 1163 +1165 4 74.38 60.03 2.06 0.54 1164 +1166 4 76.51 60.05 1.87 0.54 1165 +1167 4 76.74 59.83 2.57 0.54 1166 +1168 4 78.33 59.47 3.22 0.54 1167 +1169 4 79.02 58.79 3.85 0.54 1168 +1170 4 79.24 58.56 4.57 0.54 1169 +1171 4 79.18 57.1 5.41 0.54 1170 +1172 4 78.9 56.15 5.64 0.54 1171 +1173 4 78.68 55.45 6.5 0.54 1172 +1174 4 78.42 55.1 6.94 0.54 1173 +1175 4 78.14 54.47 7.21 0.54 1174 +1176 4 -6.09 76.33 6.23 1.08 1129 +1177 4 -6.97 77.79 6.92 1.08 1176 +1178 4 -6.79 78.22 7.24 1.08 1177 +1179 4 -6.31 79.27 7.52 1.08 1178 +1180 4 -5.77 79.63 8.49 1.08 1179 +1181 4 -5.31 80.69 8.77 1.08 1180 +1182 4 -4.24 82.37 8.85 1.08 1181 +1183 4 -3.78 82.82 8.93 1.08 1182 +1184 4 -3.8 83.87 9.55 1.08 1183 +1185 4 -3.8 86.0 9.76 1.08 1184 +1186 4 -4.21 87.32 8.86 1.08 1185 +1187 4 -4.67 88.38 9.02 1.08 1186 +1188 4 -5.57 89.89 7.73 1.405 1187 +1189 4 -6.18 91.4 7.93 1.405 1188 +1190 4 -6.29 92.12 8.47 1.3 1189 +1191 4 -6.35 92.48 8.73 1.3 1190 +1192 4 -5.43 91.69 7.22 0.11 1191 +1193 4 -4.97 92.16 7.3 0.435 1192 +1194 4 -4.52 93.52 7.4 0.435 1193 +1195 4 -3.75 95.19 7.49 0.435 1194 +1196 4 -2.85 96.11 7.56 0.435 1195 +1197 4 -1.34 96.74 7.48 0.435 1196 +1198 4 -0.13 96.77 7.22 0.435 1197 +1199 4 1.04 97.42 6.81 0.435 1198 +1200 4 2.99 98.23 6.32 0.435 1199 +1201 4 4.03 99.03 6.08 0.435 1200 +1202 4 5.07 100.41 5.96 0.435 1201 +1203 4 6.42 101.2 5.77 0.435 1202 +1204 4 8.85 102.46 5.52 0.435 1203 +1205 4 9.2 103.02 4.48 0.435 1204 +1206 4 10.99 103.99 3.95 0.435 1205 +1207 4 12.96 105.69 3.94 0.435 1206 +1208 4 15.08 107.22 3.81 0.435 1207 +1209 4 16.37 108.09 2.95 0.435 1208 +1210 4 18.6 109.22 2.32 0.435 1209 +1211 4 21.77 110.34 1.91 0.435 1210 +1212 4 23.85 111.03 1.18 0.435 1211 +1213 4 26.71 111.84 0.7 0.435 1212 +1214 4 29.14 113.08 0.59 0.435 1213 +1215 4 31.56 113.73 0.21 0.435 1214 +1216 4 33.64 114.71 -0.4 0.435 1215 +1217 4 35.75 115.65 -0.58 0.435 1216 +1218 4 39.1 117.21 -0.74 0.435 1217 +1219 4 41.37 119.2 -0.75 0.435 1218 +1220 4 43.96 120.89 -0.83 0.435 1219 +1221 4 47.91 123.37 -0.95 0.435 1220 +1222 4 50.77 124.17 -1.29 0.435 1221 +1223 4 52.39 123.8 -2.23 0.435 1222 +1224 4 55.57 123.99 -2.59 0.435 1223 +1225 4 58.26 124.68 -3.29 0.435 1224 +1226 4 61.6 125.33 -3.62 0.435 1225 +1227 4 65.79 126.35 -4.59 0.435 1226 +1228 4 69.02 127.72 -6.04 0.435 1227 +1229 4 72.83 127.0 -6.53 0.435 1228 +1230 4 77.43 127.39 -7.0 0.435 1229 +1231 4 81.36 128.35 -7.33 0.435 1230 +1232 4 84.07 129.01 -7.82 0.435 1231 +1233 4 86.66 128.58 -8.11 0.435 1232 +1234 4 88.95 128.75 -8.3 0.435 1233 +1235 4 90.32 128.61 -8.44 0.435 1234 +1236 4 -6.92 93.64 8.6 1.3 1190 +1237 4 -6.7 94.03 9.3 1.3 1236 +1238 4 -7.6 95.22 9.65 1.3 1237 +1239 4 -8.01 95.74 9.74 1.3 1238 +1240 4 -6.77 95.72 9.93 0.435 1239 +1241 4 -6.3 95.85 10.13 0.435 1240 +1242 4 -5.99 96.17 10.13 0.435 1241 +1243 4 -5.56 96.37 9.72 0.435 1242 +1244 4 -5.11 96.52 9.7 0.435 1243 +1245 4 -3.65 97.2 9.02 0.435 1244 +1246 4 -3.22 96.78 8.64 0.435 1245 +1247 4 -1.59 96.69 7.95 0.435 1246 +1248 4 0.06 96.27 7.54 0.435 1247 +1249 4 0.75 95.59 6.65 0.435 1248 +1250 4 1.95 94.41 6.19 0.435 1249 +1251 4 3.43 93.55 5.52 0.435 1250 +1252 4 4.94 93.58 5.16 0.435 1251 +1253 4 6.69 93.67 4.25 0.435 1252 +1254 4 7.39 93.9 3.52 0.435 1253 +1255 4 7.55 94.05 1.94 0.435 1254 +1256 4 7.86 93.75 1.95 0.435 1255 +1257 4 8.62 93.6 1.87 0.435 1256 +1258 4 8.47 93.76 0.24 0.435 1257 +1259 4 8.55 93.69 -0.6 0.435 1258 +1260 4 8.65 93.28 -1.17 0.435 1259 +1261 4 8.86 93.09 -2.27 0.435 1260 +1262 4 9.6 92.98 -2.73 0.435 1261 +1263 4 10.35 92.85 -2.97 0.435 1262 +1264 4 11.04 93.07 -3.62 0.435 1263 +1265 4 12.22 92.49 0.75 0.435 1264 +1266 4 12.37 91.72 0.66 0.435 1265 +1267 4 12.64 91.46 0.24 0.435 1266 +1268 4 12.07 91.13 -1.02 0.435 1267 +1269 4 12.68 90.22 -1.24 0.435 1268 +1270 4 13.27 89.64 -1.58 0.435 1269 +1271 4 13.77 88.24 -2.98 0.435 1270 +1272 4 14.83 87.19 -3.25 0.435 1271 +1273 4 15.9 86.75 -3.39 0.435 1272 +1274 4 16.34 85.41 -3.71 0.435 1273 +1275 4 16.74 84.41 -4.6 0.435 1274 +1276 4 17.49 83.36 -4.85 0.435 1275 +1277 4 17.74 82.52 -5.71 0.435 1276 +1278 4 17.35 81.99 -6.48 0.435 1277 +1279 4 16.73 81.39 -6.71 0.435 1278 +1280 4 16.61 80.62 -8.14 0.435 1279 +1281 4 16.89 79.13 -8.68 0.435 1280 +1282 4 17.51 77.92 -8.85 0.435 1281 +1283 4 17.9 76.92 -9.67 0.435 1282 +1284 4 18.34 75.89 -10.12 0.435 1283 +1285 4 18.93 75.3 -10.39 0.435 1284 +1286 4 19.68 75.17 -10.54 0.435 1285 +1287 4 20.75 75.34 -10.7 0.435 1286 +1288 4 21.77 74.33 -11.35 0.435 1287 +1289 4 22.35 73.44 -11.79 0.435 1288 +1290 4 22.45 73.35 -12.41 0.435 1289 +1291 4 22.72 71.88 -13.03 0.435 1290 +1292 4 23.1 69.68 -14.19 0.435 1291 +1293 4 24.33 68.48 -14.42 0.435 1292 +1294 4 24.92 67.6 -14.79 0.435 1293 +1295 4 26.7 66.45 -15.59 0.435 1294 +1296 4 27.74 64.82 -16.14 0.435 1295 +1297 4 30.33 61.95 -16.75 0.435 1296 +1298 4 32.47 60.45 -17.09 0.435 1297 +1299 4 33.38 59.54 -17.26 0.435 1298 +1300 4 35.28 56.77 -18.68 0.435 1299 +1301 4 35.84 55.31 -19.42 0.435 1300 +1302 4 36.6 54.26 -19.66 0.435 1301 +1303 4 37.2 53.36 -19.88 0.435 1302 +1304 4 37.67 52.92 -19.97 0.435 1303 +1305 4 38.06 52.53 -20.8 0.435 1304 +1306 4 38.49 52.1 -21.18 0.435 1305 +1307 4 -8.0 96.22 10.54 1.3 1239 +1308 4 -8.91 97.42 10.82 1.3 1307 +1309 4 -10.54 98.52 11.08 1.3 1308 +1310 4 -11.37 99.05 12.03 0.54 1309 +1311 4 -12.45 99.8 12.2 0.54 1310 +1312 4 -13.21 100.55 12.35 0.54 1311 +1313 4 -14.17 100.6 11.92 0.54 1312 +1314 4 -15.54 101.05 12.01 0.54 1313 +1315 4 -16.17 102.27 12.04 0.54 1314 +1316 4 -17.05 103.14 12.59 0.54 1315 +1317 4 -19.02 105.37 13.29 0.54 1316 +1318 4 -19.32 106.29 13.4 0.54 1317 +1319 4 -19.78 107.34 13.55 0.54 1318 +1320 4 -20.55 109.01 13.79 0.54 1319 +1321 4 -20.8 108.95 14.41 0.54 1320 +1322 4 -21.56 109.39 14.52 0.54 1321 +1323 4 -22.61 109.53 14.7 0.54 1322 +1324 4 -23.57 109.86 14.45 0.54 1323 +1325 4 -24.08 110.37 13.94 0.54 1324 +1326 4 -23.72 112.15 13.02 0.54 1325 +1327 4 -24.34 112.46 13.03 0.54 1326 +1328 4 -25.41 113.81 13.26 0.54 1327 +1329 4 -26.93 116.54 13.67 0.54 1328 +1330 4 -27.6 119.31 13.54 0.54 1329 +1331 4 -27.31 120.86 13.51 0.54 1330 +1332 4 -26.83 122.22 12.17 0.54 1331 +1333 4 -27.15 123.13 12.22 0.54 1332 +1334 4 -28.01 125.51 11.47 0.54 1333 +1335 4 -27.85 127.77 10.24 0.54 1334 +1336 4 -28.01 129.17 8.65 0.54 1335 +1337 4 -28.25 130.01 7.85 0.54 1336 +1338 4 -29.16 130.9 8.1 0.54 1337 +1339 4 -30.38 132.72 8.38 0.54 1338 +1340 4 -30.99 133.33 6.83 0.54 1339 +1341 4 -32.18 136.02 6.0 0.54 1340 +1342 4 -33.32 138.37 5.49 0.54 1341 +1343 4 -33.63 140.51 5.67 0.54 1342 +1344 4 -35.17 143.23 6.07 0.54 1343 +1345 4 -35.5 145.38 6.08 0.54 1344 +1346 4 -35.76 148.97 5.47 0.54 1345 +1347 4 -35.49 152.03 5.45 0.54 1346 +1348 4 -35.46 155.97 4.54 0.54 1347 +1349 4 -36.39 158.7 4.9 0.54 1348 +1350 4 -37.16 162.49 5.33 0.54 1349 +1351 4 -38.67 165.51 4.26 0.54 1350 +1352 4 -40.46 167.59 3.49 0.54 1351 +1353 4 -40.73 169.07 2.37 0.54 1352 +1354 4 -41.1 170.05 1.83 0.54 1353 +1355 4 -42.23 171.76 1.5 0.54 1354 +1356 4 -43.65 173.48 1.26 0.54 1355 +1357 4 -44.41 174.23 1.4 0.54 1356 +1358 4 -44.59 175.64 -0.4 0.54 1357 +1359 4 -44.76 177.91 -0.16 0.54 1358 +1360 4 -44.15 180.04 -0.01 0.54 1359 +1361 4 -43.85 182.49 0.19 0.54 1360 +1362 4 -44.5 184.95 0.18 0.54 1361 +1363 4 -45.07 187.94 -0.59 0.54 1362 +1364 4 -44.92 190.53 -1.94 0.54 1363 +1365 4 -44.75 191.57 -0.05 0.54 1364 +1366 4 -45.06 191.87 -0.06 0.54 1365 +1367 4 -44.43 192.47 0.09 0.54 1366 +1368 4 -46.08 176.81 1.81 0.54 1357 +1369 4 -49.45 181.64 1.0 0.54 1368 +1370 4 -50.39 182.55 2.54 0.54 1369 +1371 4 -52.84 184.97 3.01 0.54 1370 +1372 4 -54.24 188.18 3.14 0.54 1371 +1373 4 -10.13 99.23 11.11 1.19 1309 +1374 4 -10.86 100.86 11.71 1.08 1373 +1375 4 -10.7 100.97 11.71 1.08 1374 +1376 4 -11.55 100.89 12.54 0.54 1375 +1377 4 -12.46 101.19 12.65 0.54 1376 +1378 4 -13.07 101.79 12.77 0.54 1377 +1379 4 -13.83 102.54 12.91 0.54 1378 +1380 4 -14.44 103.15 13.02 0.54 1379 +1381 4 -15.2 104.51 13.22 0.54 1380 +1382 4 -15.97 106.78 13.51 0.54 1381 +1383 4 -15.22 108.15 13.58 0.54 1382 +1384 4 -15.22 109.07 13.67 0.54 1383 +1385 4 -15.45 110.22 12.9 0.54 1384 +1386 4 -16.38 111.13 13.0 0.54 1385 +1387 4 -17.15 112.5 13.2 0.54 1386 +1388 4 -18.07 114.61 13.5 0.54 1387 +1389 4 -18.84 116.58 13.76 0.54 1388 +1390 4 -19.91 119.16 14.11 0.54 1389 +1391 4 -20.09 122.07 14.18 0.54 1390 +1392 4 -20.92 123.8 13.74 0.54 1391 +1393 4 -21.25 125.64 13.81 0.54 1392 +1394 4 -22.16 128.37 14.07 0.54 1393 +1395 4 -23.4 130.48 14.39 0.54 1394 +1396 4 -24.92 133.22 14.8 0.54 1395 +1397 4 -26.92 135.79 15.17 0.54 1396 +1398 4 -29.09 138.84 15.37 0.54 1397 +1399 4 -29.71 140.97 15.55 0.54 1398 +1400 4 -31.13 144.79 15.68 0.54 1399 +1401 4 -31.29 147.39 15.86 0.54 1400 +1402 4 -32.47 150.38 15.14 0.54 1401 +1403 4 -33.09 152.81 15.43 0.54 1402 +1404 4 -32.94 154.79 15.61 0.54 1403 +1405 4 -34.16 155.99 15.84 0.54 1404 +1406 4 -35.44 156.94 15.45 0.54 1405 +1407 4 -36.97 157.54 15.58 0.54 1406 +1408 4 -38.05 158.61 15.78 0.54 1407 +1409 4 -38.2 160.89 16.01 0.54 1408 +1410 4 -39.55 162.96 16.26 0.54 1409 +1411 4 -39.86 165.09 16.5 0.54 1410 +1412 4 -40.93 167.05 16.78 0.54 1411 +1413 4 -42.35 169.06 16.59 0.54 1412 +1414 4 -43.42 171.33 16.91 0.54 1413 +1415 4 -44.51 173.92 17.18 0.54 1414 +1416 4 -44.51 175.75 17.36 0.54 1415 +1417 4 -45.66 179.31 16.98 0.54 1416 +1418 4 -46.89 181.43 17.31 0.54 1417 +1419 4 -48.12 185.38 17.72 0.54 1418 +1420 4 -48.44 189.33 18.14 0.54 1419 +1421 4 -49.21 191.61 18.43 0.54 1420 +1422 4 -49.37 193.89 18.67 0.54 1421 +1423 4 -48.8 196.05 18.52 0.54 1422 +1424 4 -48.59 197.98 17.64 0.54 1423 +1425 4 -49.06 199.95 17.8 0.54 1424 +1426 4 -49.67 201.17 17.98 0.54 1425 +1427 4 -49.29 205.94 17.8 0.54 1426 +1428 4 -50.12 208.29 17.43 0.54 1427 +1429 4 -50.05 209.74 16.66 0.54 1428 +1430 4 -50.52 211.72 16.81 0.54 1429 +1431 4 -51.59 214.3 17.16 0.54 1430 +1432 4 -51.95 216.77 16.99 0.54 1431 +1433 4 -51.85 218.19 16.59 0.54 1432 +1434 4 -51.41 220.79 16.73 0.54 1433 +1435 4 -51.44 221.73 16.52 0.54 1434 +1436 4 -51.19 223.31 16.04 0.54 1435 +1437 4 -10.4 102.22 11.88 1.08 1375 +1438 4 -9.64 102.99 11.89 1.08 1437 +1439 4 -8.89 104.97 12.08 1.08 1438 +1440 4 -8.74 106.95 12.26 1.08 1439 +1441 4 -8.24 109.18 12.96 0.975 1440 +1442 4 -7.33 111.62 13.19 0.975 1441 +1443 4 -7.03 112.84 13.28 0.975 1442 +1444 4 -6.11 112.65 14.32 0.65 1443 +1445 4 -5.35 112.5 14.23 0.65 1444 +1446 4 -4.89 112.05 14.15 0.65 1445 +1447 4 -5.04 110.98 14.06 0.65 1446 +1448 4 -4.58 109.62 13.89 0.435 1447 +1449 4 -3.51 108.26 13.65 0.435 1448 +1450 4 -2.19 106.34 12.81 0.435 1449 +1451 4 -1.4 105.26 12.86 0.435 1450 +1452 4 -0.76 104.63 13.11 0.54 1451 +1453 4 0.21 103.36 13.59 0.54 1452 +1454 4 0.57 102.09 13.96 0.54 1453 +1455 4 1.41 100.65 14.64 0.54 1454 +1456 4 1.88 99.27 14.47 0.54 1455 +1457 4 2.21 98.33 14.65 0.54 1456 +1458 4 2.57 97.38 15.13 0.54 1457 +1459 4 2.89 96.46 15.08 0.54 1458 +1460 4 3.2 95.23 15.0 0.54 1459 +1461 4 3.81 94.63 14.89 0.54 1460 +1462 4 5.05 92.81 14.75 0.54 1461 +1463 4 5.54 92.32 14.96 0.54 1462 +1464 4 6.32 90.95 14.91 0.54 1463 +1465 4 6.78 89.56 14.89 0.54 1464 +1466 4 7.3 88.75 15.36 0.54 1465 +1467 4 7.46 88.3 15.37 0.54 1466 +1468 4 -7.18 114.81 13.56 0.975 1443 +1469 4 -8.4 116.92 13.89 0.975 1468 +1470 4 -9.63 119.35 14.24 0.975 1469 +1471 4 -11.16 122.06 14.65 0.975 1470 +1472 4 -11.68 123.48 15.96 0.975 1471 +1473 4 -12.43 124.23 16.1 0.975 1472 +1474 4 -12.83 124.88 16.2 0.975 1473 +1475 4 -12.98 124.12 14.48 0.54 1474 +1476 4 -13.43 123.36 14.45 0.54 1475 +1477 4 -13.12 122.14 14.29 0.54 1476 +1478 4 -12.82 121.54 14.21 0.435 1477 +1479 4 -13.12 120.02 14.09 0.435 1478 +1480 4 -13.12 119.41 14.03 0.435 1479 +1481 4 -13.11 118.19 13.92 0.435 1480 +1482 4 -13.12 116.97 13.79 0.435 1481 +1483 4 -12.96 116.52 13.73 0.435 1482 +1484 4 -12.65 115.62 13.62 0.435 1483 +1485 4 -12.49 115.15 13.56 0.435 1484 +1486 4 -13.5 126.51 16.42 0.975 1474 +1487 4 -14.27 128.76 16.8 0.975 1486 +1488 4 -14.12 131.35 17.03 0.975 1487 +1489 4 -13.67 132.73 17.12 0.975 1488 +1490 4 -12.92 135.01 17.28 0.975 1489 +1491 4 -13.22 136.23 17.43 1.08 1490 +1492 4 -13.7 139.11 17.76 1.08 1491 +1493 4 -13.55 141.09 17.93 1.08 1492 +1494 4 -14.31 142.46 18.13 1.08 1493 +1495 4 -15.08 144.43 18.4 1.08 1494 +1496 4 -15.85 146.39 18.66 1.08 1495 +1497 4 -16.31 147.77 18.84 1.08 1496 +1498 4 -16.16 150.04 19.05 1.08 1497 +1499 4 -14.95 150.66 19.0 1.08 1498 +1500 4 -13.58 151.74 18.97 1.08 1499 +1501 4 -13.12 152.8 19.03 1.08 1500 +1502 4 -12.97 154.78 19.29 1.08 1501 +1503 4 -11.31 158.28 19.47 1.08 1502 +1504 4 -11.32 162.24 19.86 1.08 1503 +1505 4 -10.83 162.78 19.87 1.08 1504 +1506 4 -11.36 162.68 20.73 0.65 1505 +1507 4 -11.81 163.75 20.88 0.65 1506 +1508 4 -12.24 164.17 21.34 0.65 1507 +1509 4 -12.68 164.59 21.64 0.65 1508 +1510 4 -13.29 164.59 21.63 0.65 1509 +1511 4 -13.7 165.61 22.23 0.65 1510 +1512 4 -14.28 166.17 22.79 0.65 1511 +1513 4 -14.49 166.37 23.89 0.65 1512 +1514 4 -14.78 168.17 24.39 0.65 1513 +1515 4 -15.17 169.17 23.53 0.435 1514 +1516 4 -15.63 170.83 23.82 0.435 1515 +1517 4 -15.93 172.06 22.23 0.435 1516 +1518 4 -16.16 172.88 21.58 0.435 1517 +1519 4 -16.22 174.47 21.2 0.435 1518 +1520 4 -16.27 176.03 20.83 0.54 1519 +1521 4 -16.43 178.01 21.05 0.54 1520 +1522 4 -16.93 179.72 20.8 0.54 1521 +1523 4 -17.55 181.55 20.96 0.54 1522 +1524 4 -18.77 183.36 21.25 0.54 1523 +1525 4 -18.47 185.5 21.43 0.54 1524 +1526 4 -17.72 187.48 21.55 0.54 1525 +1527 4 -18.03 189.0 21.73 0.54 1526 +1528 4 -19.3 191.46 21.63 0.54 1527 +1529 4 -18.91 193.2 21.09 0.54 1528 +1530 4 -18.65 195.37 20.9 0.54 1529 +1531 4 -18.39 198.45 20.79 0.54 1530 +1532 4 -19.05 201.54 20.63 0.54 1531 +1533 4 -19.92 203.6 19.93 0.54 1532 +1534 4 -20.71 205.91 19.86 0.54 1533 +1535 4 -21.75 208.16 18.88 0.54 1534 +1536 4 -21.61 209.84 18.95 0.54 1535 +1537 4 -22.45 211.58 18.37 0.54 1536 +1538 4 -24.56 213.98 17.36 0.54 1537 +1539 4 -26.24 215.33 17.65 0.54 1538 +1540 4 -27.77 216.85 17.94 0.54 1539 +1541 4 -29.3 218.97 18.28 0.54 1540 +1542 4 -31.19 220.23 17.83 0.54 1541 +1543 4 -33.94 222.94 18.35 0.54 1542 +1544 4 -35.63 224.61 18.58 0.54 1543 +1545 4 -36.53 226.41 17.41 0.54 1544 +1546 4 -37.71 229.4 16.6 0.54 1545 +1547 4 -38.66 230.29 16.7 0.54 1546 +1548 4 -39.74 231.03 16.87 0.54 1547 +1549 4 -40.73 232.02 16.22 0.54 1548 +1550 4 -40.98 234.4 15.51 0.54 1549 +1551 4 -41.28 237.74 14.26 0.54 1550 +1552 4 -42.13 239.8 13.65 0.54 1551 +1553 4 -41.6 241.71 12.87 0.54 1552 +1554 4 -41.19 243.74 12.65 0.54 1553 +1555 4 -41.33 245.7 11.34 0.54 1554 +1556 4 -42.81 248.37 10.68 0.54 1555 +1557 4 -43.38 251.37 9.9 0.54 1556 +1558 4 -44.94 256.24 10.29 0.54 1557 +1559 4 -45.75 259.78 10.26 0.54 1558 +1560 4 -46.31 261.56 9.27 0.54 1559 +1561 4 -46.66 264.63 9.37 0.54 1560 +1562 4 -46.86 266.34 9.03 0.54 1561 +1563 4 -47.79 269.09 9.24 0.54 1562 +1564 4 -48.3 273.22 9.38 0.54 1563 +1565 4 -48.53 275.89 8.76 0.54 1564 +1566 4 -49.27 277.53 8.83 0.54 1565 +1567 4 -11.65 164.37 20.09 1.08 1505 +1568 4 -11.89 164.43 20.12 1.08 1567 +1569 4 -11.64 167.11 20.37 1.08 1568 +1570 4 -11.65 169.85 20.63 0.865 1569 +1571 4 -11.81 173.65 21.02 0.865 1570 +1572 4 -11.53 177.92 21.41 0.865 1571 +1573 4 -11.39 180.56 21.73 0.975 1572 +1574 4 -10.79 183.0 21.92 0.975 1573 +1575 4 -10.02 185.58 22.09 0.975 1574 +1576 4 -9.42 188.02 22.28 0.975 1575 +1577 4 -11.12 192.11 22.84 0.975 1576 +1578 4 -11.1 193.92 23.23 0.975 1577 +1579 4 -12.33 196.94 23.64 0.975 1578 +1580 4 -13.26 199.97 24.02 0.975 1579 +1581 4 -13.87 202.4 24.39 1.08 1580 +1582 4 -13.72 205.59 24.7 1.08 1581 +1583 4 -13.93 207.02 24.32 1.08 1582 +1584 4 -12.94 206.93 25.95 0.54 1583 +1585 4 -12.18 207.4 25.86 0.54 1584 +1586 4 -11.91 207.12 27.17 0.54 1585 +1587 4 -10.96 207.38 27.57 0.54 1586 +1588 4 -9.48 207.43 28.64 0.65 1587 +1589 4 -8.25 208.04 28.81 0.65 1588 +1590 4 -6.69 208.91 29.13 0.65 1589 +1591 4 -4.35 209.96 29.62 0.65 1590 +1592 4 -1.76 211.63 29.7 0.65 1591 +1593 4 1.57 213.79 29.6 0.65 1592 +1594 4 5.23 215.65 29.52 0.65 1593 +1595 4 8.0 217.15 29.86 0.65 1594 +1596 4 9.85 218.04 30.15 0.65 1595 +1597 4 10.79 218.33 30.33 0.65 1596 +1598 4 12.77 219.72 30.28 0.65 1597 +1599 4 14.44 221.11 30.33 0.65 1598 +1600 4 15.07 222.0 29.01 0.65 1599 +1601 4 15.08 221.98 29.16 0.65 1600 +1602 4 15.85 222.44 29.13 0.65 1601 +1603 4 15.8 222.5 28.61 0.65 1602 +1604 4 16.63 222.9 27.66 0.65 1603 +1605 4 16.85 223.59 26.8 0.65 1604 +1606 4 17.56 224.1 26.26 0.65 1605 +1607 4 17.52 224.53 26.3 0.65 1606 +1608 4 18.05 224.3 27.14 0.54 1607 +1609 4 18.36 224.0 27.0 0.54 1608 +1610 4 18.75 223.6 27.91 0.54 1609 +1611 4 19.28 223.68 28.78 0.54 1610 +1612 4 19.95 223.62 29.31 0.54 1611 +1613 4 20.91 223.89 29.78 0.54 1612 +1614 4 21.74 224.28 30.42 0.54 1613 +1615 4 22.2 224.73 30.51 0.54 1614 +1616 4 22.58 224.35 31.34 0.54 1615 +1617 4 22.5 225.33 32.27 0.54 1616 +1618 4 22.65 226.7 32.39 0.54 1617 +1619 4 22.5 227.76 32.58 0.54 1618 +1620 4 22.13 228.12 33.63 0.54 1619 +1621 4 21.74 228.49 34.46 0.54 1620 +1622 4 22.51 230.77 34.77 0.435 1621 +1623 4 23.87 233.07 34.86 0.435 1622 +1624 4 24.09 234.37 35.65 0.435 1623 +1625 4 23.78 237.4 36.05 0.435 1624 +1626 4 23.93 239.37 36.31 0.435 1625 +1627 4 24.38 241.05 36.42 0.435 1626 +1628 4 24.35 243.21 36.34 0.435 1627 +1629 4 24.32 245.05 36.3 0.435 1628 +1630 4 24.27 248.13 36.29 0.435 1629 +1631 4 24.72 251.63 36.53 0.435 1630 +1632 4 25.42 255.5 36.24 0.435 1631 +1633 4 25.34 256.48 35.58 0.435 1632 +1634 4 24.67 258.68 35.17 0.435 1633 +1635 4 25.39 260.99 35.03 0.435 1634 +1636 4 26.22 264.73 34.48 0.435 1635 +1637 4 27.38 266.0 34.05 0.435 1636 +1638 4 28.74 268.61 34.1 0.435 1637 +1639 4 27.51 271.35 34.41 0.435 1638 +1640 4 26.51 273.54 33.88 0.54 1639 +1641 4 25.68 274.37 33.29 0.54 1640 +1642 4 25.67 275.29 33.3 0.54 1641 +1643 4 24.52 224.25 32.36 0.54 1616 +1644 4 25.58 225.03 32.34 0.54 1643 +1645 4 26.86 225.88 32.98 0.54 1644 +1646 4 27.65 227.83 33.4 0.54 1645 +1647 4 27.64 230.27 33.72 0.54 1646 +1648 4 27.35 231.76 34.04 0.54 1647 +1649 4 28.88 232.96 34.32 0.54 1648 +1650 4 29.8 233.58 34.3 0.54 1649 +1651 4 30.74 234.17 34.64 0.54 1650 +1652 4 31.12 234.08 35.5 0.54 1651 +1653 4 32.67 234.68 35.64 0.54 1652 +1654 4 35.62 235.72 36.07 0.54 1653 +1655 4 36.39 236.46 36.23 0.54 1654 +1656 4 36.88 238.11 36.8 0.54 1655 +1657 4 37.07 240.02 37.57 0.54 1656 +1658 4 38.75 242.32 37.72 0.54 1657 +1659 4 40.57 244.76 37.86 0.54 1658 +1660 4 42.41 245.96 38.05 0.54 1659 +1661 4 46.98 248.44 37.87 0.54 1660 +1662 4 50.48 250.76 37.84 0.54 1661 +1663 4 53.24 252.27 38.04 0.54 1662 +1664 4 55.08 252.88 38.08 0.54 1663 +1665 4 56.44 253.65 38.02 0.54 1664 +1666 4 58.12 254.42 38.02 0.54 1665 +1667 4 59.18 255.19 38.0 0.54 1666 +1668 4 19.34 225.08 25.73 0.435 1607 +1669 4 21.17 226.01 25.66 0.435 1668 +1670 4 22.34 226.98 25.19 0.435 1669 +1671 4 23.82 227.94 24.69 0.54 1670 +1672 4 26.39 231.16 24.77 0.54 1671 +1673 4 28.48 232.75 24.27 0.54 1672 +1674 4 30.77 232.92 24.09 0.54 1673 +1675 4 32.74 232.18 23.83 0.54 1674 +1676 4 36.09 232.51 23.55 0.54 1675 +1677 4 38.92 233.14 23.2 0.435 1676 +1678 4 43.64 234.84 22.93 0.435 1677 +1679 4 47.43 237.48 22.84 0.435 1678 +1680 4 49.28 238.68 21.43 0.54 1679 +1681 4 51.85 241.3 21.44 0.54 1680 +1682 4 53.21 245.11 21.69 0.54 1681 +1683 4 53.26 248.1 20.92 0.54 1682 +1684 4 53.55 250.24 21.03 0.54 1683 +1685 4 55.83 253.76 21.16 0.54 1684 +1686 4 57.48 256.67 21.29 0.54 1685 +1687 4 57.79 257.58 21.36 0.54 1686 +1688 4 57.93 261.07 21.68 0.54 1687 +1689 4 59.6 263.37 21.75 0.54 1688 +1690 4 60.48 264.32 21.46 0.54 1689 +1691 4 62.1 265.14 20.85 0.54 1690 +1692 4 63.89 264.6 20.18 0.54 1691 +1693 4 65.71 264.63 20.01 0.54 1692 +1694 4 -14.08 209.9 24.62 1.08 1583 +1695 4 -13.95 213.4 24.94 1.08 1694 +1696 4 -13.35 216.14 25.16 1.08 1695 +1697 4 -13.66 218.28 25.39 1.08 1696 +1698 4 -15.03 220.84 25.77 1.08 1697 +1699 4 -16.41 222.8 26.09 1.08 1698 +1700 4 -17.17 224.47 26.32 1.08 1699 +1701 4 -17.34 227.36 26.62 1.08 1700 +1702 4 -17.19 231.16 26.98 1.08 1701 +1703 4 -16.75 234.36 27.25 1.08 1702 +1704 4 -17.18 237.23 26.29 1.08 1703 +1705 4 -17.48 239.02 26.71 1.08 1704 +1706 4 -18.11 240.86 26.64 1.08 1705 +1707 4 -18.39 242.66 25.57 1.08 1706 +1708 4 -19.02 243.14 26.35 0.65 1707 +1709 4 -20.33 243.83 25.56 0.65 1708 +1710 4 -21.29 244.15 26.89 0.65 1709 +1711 4 -21.74 243.98 28.65 0.65 1710 +1712 4 -23.19 244.51 29.59 0.65 1711 +1713 4 -26.02 245.48 30.62 0.65 1712 +1714 4 -27.69 246.81 31.06 0.65 1713 +1715 4 -30.05 248.52 32.35 0.65 1714 +1716 4 -31.28 249.74 32.58 0.65 1715 +1717 4 -32.6 251.04 33.28 0.65 1716 +1718 4 -34.58 253.61 33.8 0.65 1717 +1719 4 -36.41 254.2 34.03 0.65 1718 +1720 4 -39.15 255.38 34.46 0.65 1719 +1721 4 -41.74 257.03 34.86 0.65 1720 +1722 4 -44.48 258.52 35.26 0.65 1721 +1723 4 -46.01 260.03 35.63 0.54 1722 +1724 4 -47.21 260.01 35.74 0.54 1723 +1725 4 -49.35 261.21 36.12 0.54 1724 +1726 4 -51.02 263.16 36.47 0.54 1725 +1727 4 -53.63 266.04 36.99 0.54 1726 +1728 4 -56.67 268.74 37.53 0.54 1727 +1729 4 -58.05 271.32 37.92 0.54 1728 +1730 4 -59.43 274.2 38.32 0.54 1729 +1731 4 -60.5 276.46 38.65 0.54 1730 +1732 4 -61.58 279.35 39.02 0.54 1731 +1733 4 -63.56 280.08 39.28 0.54 1732 +1734 4 -65.24 281.44 39.56 0.54 1733 +1735 4 -67.53 283.39 39.97 0.54 1734 +1736 4 -68.7 284.54 40.79 0.54 1735 +1737 4 -70.06 287.11 41.25 0.54 1736 +1738 4 -70.49 288.73 41.9 0.54 1737 +1739 4 -70.46 290.23 42.35 0.54 1738 +1740 4 -69.8 290.77 43.02 0.54 1739 +1741 4 -69.26 291.15 43.84 0.54 1740 +1742 4 -70.31 292.18 44.26 0.54 1741 +1743 4 -71.52 293.38 44.64 0.54 1742 +1744 4 -71.68 295.35 44.85 0.54 1743 +1745 4 -71.81 296.69 45.29 0.54 1744 +1746 4 -73.02 297.58 45.64 0.54 1745 +1747 4 -74.21 297.85 46.0 0.54 1746 +1748 4 -75.86 299.17 46.58 0.54 1747 +1749 4 -76.45 299.76 46.92 0.54 1748 +1750 4 -77.45 300.75 47.79 0.54 1749 +1751 4 -77.62 301.18 49.51 0.54 1750 +1752 4 -78.53 301.79 49.65 0.54 1751 +1753 4 -78.86 302.11 51.08 0.54 1752 +1754 4 -79.29 302.22 51.51 0.54 1753 +1755 4 -17.79 245.71 25.81 1.08 1707 +1756 4 -17.95 247.99 26.05 1.08 1755 +1757 4 -17.21 249.38 25.88 1.08 1756 +1758 4 -16.46 251.67 26.03 1.08 1757 +1759 4 -16.93 253.35 26.17 1.08 1758 +1760 4 -18.15 255.17 26.46 1.08 1759 +1761 4 -19.82 258.34 25.41 1.08 1760 +1762 4 -20.59 260.91 25.73 1.08 1761 +1763 4 -20.91 263.96 26.06 1.08 1762 +1764 4 -20.63 268.83 26.42 1.08 1763 +1765 4 -20.07 271.27 26.55 1.19 1764 +1766 4 -19.33 274.16 26.75 1.19 1765 +1767 4 -19.33 275.38 26.88 1.19 1766 +1768 4 -19.12 276.58 28.11 0.865 1767 +1769 4 -19.42 278.11 28.28 0.865 1768 +1770 4 -19.72 279.01 28.47 0.865 1769 +1771 4 -20.34 279.62 28.51 0.865 1770 +1772 4 -20.67 280.85 30.11 0.865 1771 +1773 4 -21.56 281.73 30.43 0.865 1772 +1774 4 -21.99 283.36 31.15 0.865 1773 +1775 4 -23.18 284.53 31.67 0.865 1774 +1776 4 -23.79 286.34 31.99 0.865 1775 +1777 4 -25.13 287.66 32.62 0.865 1776 +1778 4 -26.51 289.01 32.88 0.865 1777 +1779 4 -27.87 291.27 33.3 0.865 1778 +1780 4 -28.64 293.86 33.63 0.865 1779 +1781 4 -28.65 296.29 33.86 0.865 1780 +1782 4 -28.8 298.55 34.24 0.865 1781 +1783 4 -28.79 300.07 34.47 0.865 1782 +1784 4 -30.47 303.85 35.07 0.865 1783 +1785 4 -31.85 307.03 35.51 0.865 1784 +1786 4 -32.63 310.21 35.89 0.865 1785 +1787 4 -34.3 312.78 36.3 0.865 1786 +1788 4 -36.6 315.05 36.73 0.865 1787 +1789 4 -37.54 315.89 37.05 0.865 1788 +1790 4 -38.92 318.77 37.46 0.865 1789 +1791 4 -40.3 321.64 37.86 0.865 1790 +1792 4 -42.89 323.29 38.26 0.865 1791 +1793 4 -44.42 326.01 38.68 0.865 1792 +1794 4 -46.11 329.51 39.17 0.865 1793 +1795 4 -47.21 332.39 40.99 0.865 1794 +1796 4 -47.72 334.12 40.59 0.865 1795 +1797 4 -48.34 335.36 38.88 0.865 1796 +1798 4 -49.4 337.62 37.77 0.865 1797 +1799 4 -50.47 338.68 37.9 0.865 1798 +1800 4 -52.63 341.41 38.28 0.865 1799 +1801 4 -54.76 344.73 38.8 0.865 1800 +1802 4 -55.43 349.03 38.75 0.865 1801 +1803 4 -55.94 352.55 38.84 0.865 1802 +1804 4 -55.08 356.27 38.6 0.865 1803 +1805 4 -54.71 359.25 37.95 0.865 1804 +1806 4 -55.34 362.0 38.2 0.865 1805 +1807 4 -54.82 365.14 37.47 0.865 1806 +1808 4 -53.38 368.86 36.95 0.865 1807 +1809 4 -52.37 372.41 36.67 0.865 1808 +1810 4 -51.94 375.04 35.07 0.865 1809 +1811 4 -50.47 378.74 34.92 0.865 1810 +1812 4 -49.98 381.91 33.91 0.865 1811 +1813 4 -50.57 382.78 32.75 0.865 1812 +1814 4 -51.17 383.99 32.93 0.865 1813 +1815 4 -51.52 384.33 32.99 0.435 1814 +1816 4 -51.82 384.93 33.08 0.865 1815 +1817 4 -51.5 387.06 31.89 0.865 1816 +1818 4 -51.65 388.73 32.07 0.865 1817 +1819 4 -52.87 389.93 32.3 0.865 1818 +1820 4 -54.06 390.8 31.21 0.865 1819 +1821 4 -55.81 392.23 30.67 0.865 1820 +1822 4 -55.97 393.0 30.69 0.865 1821 +1823 4 -56.94 395.16 30.47 0.865 1822 +1824 4 -57.4 396.54 30.57 0.865 1823 +1825 4 -57.73 398.37 30.7 1.3 1824 +1826 4 -57.88 400.03 30.89 0.975 1825 +1827 4 -58.48 403.06 29.79 0.975 1826 +1828 4 -58.77 404.3 29.93 0.975 1827 +1829 4 -59.79 404.09 30.46 0.54 1828 +1830 4 -61.01 403.47 30.52 0.54 1829 +1831 4 -62.07 403.92 30.66 0.54 1830 +1832 4 -63.75 404.36 30.86 0.54 1831 +1833 4 -65.44 405.12 31.02 0.54 1832 +1834 4 -66.97 405.74 29.4 0.54 1833 +1835 4 -68.34 407.08 29.66 0.54 1834 +1836 4 -69.56 408.3 29.89 0.54 1835 +1837 4 -70.93 408.73 30.06 0.54 1836 +1838 4 -72.2 409.67 29.88 0.54 1837 +1839 4 -72.78 409.97 28.45 0.54 1838 +1840 4 -73.63 409.59 27.59 0.54 1839 +1841 4 -74.09 409.46 25.81 0.54 1840 +1842 4 -74.35 409.11 24.59 0.54 1841 +1843 4 -74.54 408.99 24.21 0.54 1842 +1844 4 -74.69 408.54 24.18 0.54 1843 +1845 4 -58.94 404.74 29.92 0.975 1828 +1846 4 -58.5 407.04 30.03 0.975 1845 +1847 4 -58.83 408.88 28.42 0.975 1846 +1848 4 -59.16 410.74 26.67 0.975 1847 +1849 4 -60.12 411.68 26.4 0.975 1848 +1850 4 -62.36 413.31 25.56 0.975 1849 +1851 4 -63.03 415.56 24.85 0.975 1850 +1852 4 -63.49 417.54 25.08 0.865 1851 +1853 4 -64.8 419.45 24.42 0.865 1852 +1854 4 -64.81 420.98 22.83 0.865 1853 +1855 4 -64.64 422.34 21.5 0.865 1854 +1856 4 -64.51 423.12 21.34 0.865 1855 +1857 4 -64.07 423.6 21.2 0.865 1856 +1858 4 -64.23 425.88 19.85 0.865 1857 +1859 4 -64.97 427.53 18.64 0.865 1858 +1860 4 -64.91 430.2 17.92 0.865 1859 +1861 4 -65.28 432.71 15.85 0.865 1860 +1862 4 -65.7 433.72 16.59 0.865 1861 +1863 4 -66.37 435.91 16.1 0.865 1862 +1864 4 -66.93 437.69 15.27 0.865 1863 +1865 4 -67.17 439.14 14.53 0.865 1864 +1866 4 -68.16 439.81 13.86 0.865 1865 +1867 4 -69.28 441.53 13.6 0.865 1866 +1868 4 -70.9 442.84 12.82 0.865 1867 +1869 4 -71.75 444.29 12.06 0.865 1868 +1870 4 -72.49 445.63 10.97 0.865 1869 +1871 4 -73.83 446.97 9.79 0.865 1870 +1872 4 -74.39 448.11 9.04 0.865 1871 +1873 4 -75.42 449.76 7.94 0.865 1872 +1874 4 -75.89 450.83 8.01 0.865 1873 +1875 4 -77.1 451.73 8.21 0.865 1874 +1876 4 -78.48 453.7 8.46 0.865 1875 +1877 4 -79.04 456.07 7.75 0.865 1876 +1878 4 -77.54 459.43 7.94 0.865 1877 +1879 4 -75.96 462.44 7.03 0.865 1878 +1880 4 -75.44 465.57 6.45 0.865 1879 +1881 4 -75.68 468.54 5.86 0.865 1880 +1882 4 -75.19 470.47 4.87 0.865 1881 +1883 4 -74.8 472.53 4.29 0.865 1882 +1884 4 -74.42 474.28 3.66 0.865 1883 +1885 4 -74.74 475.39 3.8 0.865 1884 +1886 4 -75.42 475.77 3.06 0.435 1885 +1887 4 -75.88 476.23 3.15 0.435 1886 +1888 4 -76.82 476.55 2.96 0.435 1887 +1889 4 -77.28 476.1 2.81 0.435 1888 +1890 4 -77.61 476.43 2.65 0.54 1889 +1891 4 -79.59 477.17 2.91 0.54 1890 +1892 4 -79.9 478.69 3.08 0.54 1891 +1893 4 -80.67 479.16 1.38 0.54 1892 +1894 4 -81.7 479.26 0.28 0.54 1893 +1895 4 -82.29 479.55 -1.07 0.54 1894 +1896 4 -82.72 479.38 -2.55 0.54 1895 +1897 4 -83.65 479.7 -2.52 0.54 1896 +1898 4 -85.11 480.23 -3.31 0.54 1897 +1899 4 -85.96 480.46 -4.12 0.54 1898 +1900 4 -86.59 481.1 -4.37 0.54 1899 +1901 4 -87.51 481.41 -5.92 0.54 1900 +1902 4 -87.66 481.58 -7.71 0.54 1901 +1903 4 -88.41 482.0 -8.96 0.54 1902 +1904 4 -89.13 482.72 -10.02 0.54 1903 +1905 4 -89.85 483.45 -11.17 0.54 1904 +1906 4 -73.88 475.57 3.05 0.865 1885 +1907 4 -73.79 477.62 2.57 0.865 1906 +1908 4 -73.62 479.27 1.28 0.865 1907 +1909 4 -74.82 481.66 0.33 0.865 1908 +1910 4 -74.93 483.61 -0.73 0.865 1909 +1911 4 -74.02 485.14 -0.67 0.865 1910 +1912 4 -72.32 487.12 -1.93 0.865 1911 +1913 4 -71.11 490.18 -3.4 0.865 1912 +1914 4 -71.5 492.69 -4.03 0.865 1913 +1915 4 -71.93 494.64 -5.08 0.865 1914 +1916 4 -71.81 496.33 -5.15 0.865 1915 +1917 4 -72.31 498.87 -6.06 0.865 1916 +1918 4 -71.64 499.73 -7.03 0.865 1917 +1919 4 -70.64 503.6 -7.28 0.865 1918 +1920 4 -69.15 505.47 -7.6 0.865 1919 +1921 4 -69.42 508.16 -8.46 0.865 1920 +1922 4 -70.29 509.94 -9.33 0.865 1921 +1923 4 -70.46 511.32 -9.41 0.865 1922 +1924 4 -70.53 513.51 -9.87 0.865 1923 +1925 4 -70.27 516.0 -10.1 0.865 1924 +1926 4 -71.33 518.26 -11.23 0.865 1925 +1927 4 -71.95 520.08 -11.07 0.865 1926 +1928 4 -72.93 522.29 -11.58 0.865 1927 +1929 4 -73.88 523.83 -13.25 0.865 1928 +1930 4 -73.89 525.66 -13.14 0.865 1929 +1931 4 -73.9 529.32 -14.44 0.865 1930 +1932 4 -73.97 529.39 -15.19 0.865 1931 +1933 4 -73.61 531.16 -16.03 0.865 1932 +1934 4 -73.7 533.69 -16.76 0.865 1933 +1935 4 -73.7 535.51 -18.1 0.865 1934 +1936 4 -73.96 537.29 -19.03 0.865 1935 +1937 4 -74.53 539.99 -19.92 0.865 1936 +1938 4 -74.15 542.65 -20.53 0.865 1937 +1939 4 -72.95 545.1 -20.4 0.865 1938 +1940 4 -72.42 548.52 -20.86 0.865 1939 +1941 4 -71.81 551.27 -22.32 0.865 1940 +1942 4 -70.81 554.24 -22.81 0.865 1941 +1943 4 -70.18 556.94 -23.82 0.865 1942 +1944 4 -68.51 558.96 -25.51 0.865 1943 +1945 4 -67.91 560.48 -25.41 0.865 1944 +1946 4 -66.61 561.93 -26.07 0.865 1945 +1947 4 -65.91 563.36 -26.6 0.865 1946 +1948 4 -65.22 566.04 -27.24 0.865 1947 +1949 4 -65.31 567.95 -27.88 0.865 1948 +1950 4 -65.54 570.59 -28.28 0.865 1949 +1951 4 -66.56 574.04 -28.98 0.865 1950 +1952 4 -67.53 578.34 -29.0 0.865 1951 +1953 4 -68.36 581.65 -28.75 0.865 1952 +1954 4 -68.66 585.6 -28.34 0.865 1953 +1955 4 -68.84 588.5 -28.19 0.865 1954 +1956 4 -69.31 591.09 -27.98 0.865 1955 +1957 4 -70.14 594.33 -28.18 0.865 1956 +1958 4 -70.38 596.7 -28.84 0.865 1957 +1959 4 -70.16 598.92 -29.55 0.865 1958 +1960 4 -69.48 600.67 -30.2 0.865 1959 +1961 4 -68.03 601.97 -30.88 0.865 1960 +1962 4 -67.78 602.91 -30.89 0.54 1961 +1963 4 -66.57 605.06 -30.8 0.54 1962 +1964 4 -66.17 605.58 -31.46 0.54 1963 +1965 4 -65.24 606.49 -32.89 0.54 1964 +1966 4 -63.43 608.04 -33.05 0.54 1965 +1967 4 -62.07 608.82 -33.11 0.54 1966 +1968 4 -59.79 609.9 -33.21 0.54 1967 +1969 4 -58.44 610.39 -33.51 0.54 1968 +1970 4 -56.47 611.48 -33.66 0.54 1969 +1971 4 -54.88 612.34 -34.57 0.54 1970 +1972 4 -54.03 612.73 -35.37 0.54 1971 +1973 4 -53.88 612.57 -35.39 0.54 1972 +1974 4 -54.3 613.0 -36.6 0.435 1973 +1975 4 -54.77 613.47 -36.66 0.435 1974 +1976 4 -55.42 613.78 -36.87 0.435 1975 +1977 4 -54.82 614.42 -37.02 0.435 1976 +1978 4 -55.23 614.83 -38.06 0.435 1977 +1979 4 -54.75 615.58 -39.47 0.435 1978 +1980 4 -54.58 616.63 -40.82 0.435 1979 +1981 4 -54.26 617.24 -42.31 0.435 1980 +1982 4 -54.19 617.48 -43.27 0.435 1981 +1983 4 -54.01 617.91 -44.46 0.435 1982 +1984 4 -53.71 618.53 -46.17 0.435 1983 +1985 4 -53.72 619.75 -46.12 0.435 1984 +1986 4 -53.51 621.68 -47.01 0.435 1985 +1987 4 -53.61 623.29 -47.75 0.435 1986 +1988 4 -53.55 625.07 -48.56 0.435 1987 +1989 4 -54.08 626.8 -49.1 0.435 1988 +1990 4 -54.38 628.63 -50.49 0.435 1989 +1991 4 -54.53 630.0 -51.93 0.435 1990 +1992 4 -54.96 632.25 -52.94 0.435 1991 +1993 4 -56.33 633.9 -52.66 0.435 1992 +1994 4 -56.39 634.89 -53.24 0.435 1993 +1995 4 -56.05 635.78 -54.47 0.435 1994 +1996 4 -55.39 636.34 -55.54 0.435 1995 +1997 4 -52.58 613.43 -36.26 0.54 1973 +1998 4 -51.09 614.37 -36.53 0.54 1997 +1999 4 -50.09 615.5 -37.11 0.54 1998 +2000 4 -47.89 617.89 -37.98 0.54 1999 +2001 4 -46.31 618.77 -39.1 0.54 2000 +2002 4 -43.9 620.02 -39.29 0.54 2001 +2003 4 -41.36 621.45 -39.9 0.54 2002 +2004 4 -39.1 623.18 -40.18 0.54 2003 +2005 4 -36.98 625.03 -40.27 0.54 2004 +2006 4 -36.05 626.84 -41.62 0.54 2005 +2007 4 -32.96 629.26 -42.65 0.54 2006 +2008 4 -31.82 631.17 -43.39 0.54 2007 +2009 4 -30.72 634.63 -44.3 0.54 2008 +2010 4 -29.79 636.45 -45.57 0.54 2009 +2011 4 -28.27 637.99 -45.63 0.54 2010 +2012 4 -26.39 639.78 -46.68 0.54 2011 +2013 4 -24.2 640.96 -47.76 0.54 2012 +2014 4 -22.17 641.99 -48.83 0.54 2013 +2015 4 -21.01 642.38 -49.66 0.54 2014 +2016 4 -20.54 642.82 -51.09 0.54 2015 +2017 4 -19.07 644.42 -51.67 0.54 2016 +2018 4 -18.46 645.94 -53.09 0.54 2017 +2019 4 -16.92 649.28 -54.34 0.54 2018 +2020 4 -15.61 651.63 -54.77 0.54 2019 +2021 4 -14.71 653.18 -56.51 0.54 2020 +2022 4 -13.13 656.16 -57.13 0.54 2021 +2023 4 -11.23 657.33 -58.09 0.54 2022 +2024 4 -9.11 658.88 -58.21 0.54 2023 +2025 4 -7.68 660.51 -59.17 0.54 2024 +2026 4 -6.55 662.44 -59.99 0.54 2025 +2027 4 -5.71 664.02 -60.6 0.54 2026 +2028 4 -5.26 665.1 -60.61 0.54 2027 +2029 4 -3.83 667.32 -61.35 0.54 2028 +2030 4 -3.0 668.95 -62.25 0.54 2029 +2031 4 -1.86 672.08 -62.89 0.54 2030 +2032 4 -1.23 674.79 -63.89 0.54 2031 +2033 4 1.18 677.26 -64.02 0.54 2032 +2034 4 4.06 679.87 -64.02 0.54 2033 +2035 4 5.35 680.42 -65.0 0.54 2034 +2036 4 7.82 681.93 -66.22 0.54 2035 +2037 4 10.21 684.13 -66.68 0.54 2036 +2038 4 10.36 684.6 -68.46 0.54 2037 +2039 4 -68.53 604.57 -30.88 0.865 1961 +2040 4 -69.08 609.08 -31.45 0.865 2039 +2041 4 -69.0 614.17 -31.57 0.865 2040 +2042 4 -68.42 616.32 -31.57 0.865 2041 +2043 4 -67.21 619.67 -31.35 0.865 2042 +2044 4 -66.84 625.07 -31.61 0.865 2043 +2045 4 -67.06 630.75 -31.56 0.865 2044 +2046 4 -66.61 633.94 -31.3 0.865 2045 +2047 4 -66.46 637.44 -30.97 0.865 2046 +2048 4 -65.59 640.58 -30.89 0.54 2047 +2049 4 -65.91 644.53 -30.47 0.54 2048 +2050 4 -64.24 649.25 -30.18 0.54 2049 +2051 4 -62.58 652.77 -29.98 0.54 2050 +2052 4 -61.12 655.25 -28.66 0.54 2051 +2053 4 -59.15 659.67 -28.34 0.54 2052 +2054 4 -56.11 663.66 -28.23 0.54 2053 +2055 4 -53.24 668.4 -28.03 0.54 2054 +2056 4 -51.27 673.13 -27.75 0.54 2055 +2057 4 -50.07 679.22 -27.27 0.54 2056 +2058 4 -49.03 684.55 -26.77 0.54 2057 +2059 4 -48.58 689.26 -26.35 0.54 2058 +2060 4 -47.95 693.21 -25.72 0.54 2059 +2061 4 -47.12 696.32 -26.25 0.54 2060 +2062 4 -45.22 698.92 -28.14 0.54 2061 +2063 4 -43.1 701.08 -28.13 0.54 2062 +2064 4 -42.34 703.36 -27.97 0.54 2063 +2065 4 -40.37 706.27 -27.87 0.54 2064 +2066 4 -38.4 709.47 -27.74 0.54 2065 +2067 4 -36.9 713.44 -27.49 0.54 2066 +2068 4 -35.53 717.56 -27.21 0.54 2067 +2069 4 -34.18 720.16 -27.09 0.54 2068 +2070 4 -30.1 723.41 -25.71 0.54 2069 +2071 4 -26.09 725.2 -25.22 0.54 2070 +2072 4 -22.39 726.69 -24.74 0.54 2071 +2073 4 -19.04 728.84 -24.76 0.54 2072 +2074 4 -17.81 729.46 -24.74 0.54 2073 +2075 4 -15.69 732.52 -24.64 0.54 2074 +2076 4 -14.33 735.11 -24.51 0.54 2075 +2077 4 -13.19 736.11 -23.68 0.54 2076 +2078 4 -11.21 738.41 -23.57 0.54 2077 +2079 4 -9.54 739.49 -23.62 0.54 2078 +2080 4 -7.73 740.42 -23.69 0.54 2079 +2081 4 -17.36 277.69 26.92 1.19 1767 +2082 4 -15.39 280.28 26.99 1.19 2081 +2083 4 -13.39 282.85 25.84 1.19 2082 +2084 4 -11.82 284.96 24.78 1.19 2083 +2085 4 -10.56 287.07 23.65 1.19 2084 +2086 4 -8.93 289.09 23.25 1.19 2085 +2087 4 -8.11 290.11 22.28 1.19 2086 +2088 4 -6.9 291.04 22.26 1.19 2087 +2089 4 -5.65 291.83 23.13 0.755 2088 +2090 4 -4.02 293.26 22.67 0.755 2089 +2091 4 -3.27 294.64 22.73 0.755 2090 +2092 4 -2.78 296.0 21.38 1.08 2091 +2093 4 -1.73 298.6 21.55 1.08 2092 +2094 4 -1.02 300.03 21.09 1.08 2093 +2095 4 -0.04 301.18 20.27 1.08 2094 +2096 4 0.25 302.69 20.4 1.08 2095 +2097 4 0.7 304.37 20.52 1.08 2096 +2098 4 1.14 306.06 20.49 1.08 2097 +2099 4 1.18 307.56 19.43 1.08 2098 +2100 4 1.39 309.18 18.43 1.08 2099 +2101 4 1.89 310.03 17.56 0.755 2100 +2102 4 2.2 310.34 17.63 0.755 2101 +2103 4 3.12 311.24 17.78 0.755 2102 +2104 4 4.06 312.43 18.12 1.08 2103 +2105 4 4.95 313.69 17.94 1.08 2104 +2106 4 5.14 314.72 16.74 1.08 2105 +2107 4 4.92 316.75 16.35 1.08 2106 +2108 4 4.92 318.58 16.53 1.08 2107 +2109 4 4.84 319.58 15.73 1.08 2108 +2110 4 5.23 322.22 15.42 1.08 2109 +2111 4 5.35 324.83 15.36 1.08 2110 +2112 4 5.76 326.25 15.0 1.08 2111 +2113 4 6.0 327.82 14.61 1.08 2112 +2114 4 6.98 329.6 13.71 1.08 2113 +2115 4 7.27 332.96 13.94 1.08 2114 +2116 4 7.1 335.85 14.23 1.08 2115 +2117 4 7.55 338.44 14.45 1.08 2116 +2118 4 7.7 341.33 14.71 0.975 2117 +2119 4 7.32 344.13 14.27 0.975 2118 +2120 4 7.16 346.12 14.47 0.975 2119 +2121 4 5.72 348.74 14.18 0.975 2120 +2122 4 4.94 351.03 14.4 0.865 2121 +2123 4 4.62 354.67 14.78 0.865 2122 +2124 4 5.08 357.26 15.0 0.865 2123 +2125 4 6.28 359.11 14.99 0.865 2124 +2126 4 8.1 360.65 14.98 0.865 2125 +2127 4 9.61 362.79 14.96 0.865 2126 +2128 4 10.51 365.85 15.18 0.865 2127 +2129 4 10.8 370.41 15.6 0.865 2128 +2130 4 11.28 374.18 14.71 0.865 2129 +2131 4 12.49 378.15 14.98 0.865 2130 +2132 4 13.09 380.89 15.2 0.865 2131 +2133 4 14.89 386.39 15.5 0.865 2132 +2134 4 16.25 389.6 15.69 0.865 2133 +2135 4 16.25 392.64 15.98 0.865 2134 +2136 4 17.15 395.08 16.21 0.865 2135 +2137 4 18.52 397.07 16.28 0.865 2136 +2138 4 19.73 399.51 16.41 0.865 2137 +2139 4 20.78 402.41 16.59 0.865 2138 +2140 4 20.61 407.73 17.12 0.865 2139 +2141 4 20.7 411.29 16.79 0.865 2140 +2142 4 20.14 414.87 16.27 0.755 2141 +2143 4 19.98 419.9 16.78 0.755 2142 +2144 4 19.66 422.93 17.11 0.755 2143 +2145 4 18.58 425.81 17.49 0.755 2144 +2146 4 18.43 427.18 17.64 0.755 2145 +2147 4 18.88 429.77 17.85 0.755 2146 +2148 4 17.97 431.28 18.08 0.755 2147 +2149 4 16.43 432.48 18.34 0.755 2148 +2150 4 15.96 433.55 18.34 0.755 2149 +2151 4 16.2 436.36 17.98 0.755 2150 +2152 4 17.27 438.02 18.2 0.755 2151 +2153 4 18.34 440.93 18.45 0.755 2152 +2154 4 18.82 442.56 18.88 0.755 2153 +2155 4 18.97 443.93 19.07 0.755 2154 +2156 4 19.27 447.27 19.44 0.755 2155 +2157 4 19.56 450.62 19.74 0.755 2156 +2158 4 20.19 453.33 20.25 0.755 2157 +2159 4 20.94 455.3 20.45 0.755 2158 +2160 4 21.4 457.6 20.64 0.755 2159 +2161 4 22.46 458.97 20.67 0.755 2160 +2162 4 25.04 462.1 21.2 0.755 2161 +2163 4 26.55 466.07 21.44 0.755 2162 +2164 4 27.91 470.5 21.74 0.755 2163 +2165 4 27.89 473.84 22.08 0.755 2164 +2166 4 27.73 475.52 22.25 0.755 2165 +2167 4 28.04 477.66 23.95 0.54 2166 +2168 4 28.02 479.2 24.02 0.54 2167 +2169 4 29.08 480.27 24.02 0.54 2168 +2170 4 29.8 481.69 23.72 0.54 2169 +2171 4 29.64 483.05 23.79 0.54 2170 +2172 4 29.79 484.42 23.99 0.54 2171 +2173 4 29.53 485.89 24.61 0.54 2172 +2174 4 28.98 486.44 25.39 0.54 2173 +2175 4 29.01 488.22 26.02 0.54 2174 +2176 4 28.58 489.55 26.49 0.54 2175 +2177 4 28.94 490.01 26.5 0.54 2176 +2178 4 28.57 490.08 27.45 0.54 2177 +2179 4 27.96 490.68 27.56 0.54 2178 +2180 4 28.41 492.04 27.65 0.54 2179 +2181 4 28.56 494.01 27.91 0.54 2180 +2182 4 29.32 496.3 28.06 0.54 2181 +2183 4 29.76 496.79 27.91 0.54 2182 +2184 4 30.51 498.77 28.04 0.54 2183 +2185 4 30.47 500.33 27.82 0.54 2184 +2186 4 30.32 501.09 27.91 0.54 2185 +2187 4 30.97 501.65 28.36 0.54 2186 +2188 4 31.5 502.03 29.25 0.54 2187 +2189 4 32.59 503.08 29.56 0.54 2188 +2190 4 33.5 503.69 29.54 0.54 2189 +2191 4 34.15 504.26 29.9 0.54 2190 +2192 4 33.99 506.54 30.22 0.54 2191 +2193 4 33.84 508.21 30.4 0.54 2192 +2194 4 33.53 509.12 30.59 0.54 2193 +2195 4 35.06 509.43 30.48 0.435 2194 +2196 4 35.97 511.57 30.68 0.435 2195 +2197 4 37.18 513.69 30.85 0.435 2196 +2198 4 37.04 514.75 31.04 0.435 2197 +2199 4 37.19 516.41 31.26 0.435 2198 +2200 4 38.28 518.06 31.71 0.435 2199 +2201 4 39.65 519.14 31.68 0.435 2200 +2202 4 41.49 521.57 31.98 0.435 2201 +2203 4 41.85 521.81 32.65 0.435 2202 +2204 4 43.07 522.74 32.63 0.435 2203 +2205 4 44.13 523.8 32.7 0.435 2204 +2206 4 45.06 524.72 32.86 0.435 2205 +2207 4 45.85 526.67 33.28 0.435 2206 +2208 4 47.11 528.13 33.91 0.54 2207 +2209 4 48.02 529.06 33.99 0.54 2208 +2210 4 48.39 529.9 34.73 0.54 2209 +2211 4 48.13 531.37 35.42 0.54 2210 +2212 4 48.64 533.6 36.19 0.54 2211 +2213 4 49.72 534.64 36.58 0.54 2212 +2214 4 50.83 536.28 37.09 0.54 2213 +2215 4 51.47 537.45 37.59 0.54 2214 +2216 4 51.81 539.24 38.2 0.54 2215 +2217 4 51.83 540.13 38.5 0.54 2216 +2218 4 51.84 541.34 38.7 0.54 2217 +2219 4 52.15 542.24 38.83 0.54 2218 +2220 4 52.33 543.59 39.32 0.54 2219 +2221 4 53.6 545.36 39.99 0.54 2220 +2222 4 54.28 545.89 40.81 0.54 2221 +2223 4 55.34 546.35 40.83 0.54 2222 +2224 4 56.13 546.78 41.09 0.54 2223 +2225 4 56.77 547.36 41.39 0.54 2224 +2226 4 57.57 548.09 41.93 0.54 2225 +2227 4 57.56 550.21 42.21 0.54 2226 +2228 4 57.72 551.28 42.29 0.54 2227 +2229 4 57.57 552.32 42.56 0.54 2228 +2230 4 58.03 553.09 42.6 0.54 2229 +2231 4 58.34 553.99 42.74 0.54 2230 +2232 4 59.13 554.73 43.11 0.54 2231 +2233 4 59.45 555.63 43.32 0.54 2232 +2234 4 59.32 556.35 43.7 0.54 2233 +2235 4 59.47 558.03 43.94 0.54 2234 +2236 4 58.88 558.3 44.17 0.54 2235 +2237 4 29.04 490.61 26.63 0.54 2177 +2238 4 29.72 492.36 27.64 0.54 2237 +2239 4 30.65 494.47 27.99 0.54 2238 +2240 4 32.98 497.63 28.69 0.54 2239 +2241 4 34.1 499.26 29.35 0.54 2240 +2242 4 34.53 499.43 29.09 0.54 2241 +2243 4 35.37 501.32 28.6 0.54 2242 +2244 4 36.74 502.7 28.61 0.54 2243 +2245 4 37.77 504.43 28.3 0.54 2244 +2246 4 38.65 506.3 28.03 0.54 2245 +2247 4 39.81 507.26 27.49 0.54 2246 +2248 4 41.92 509.73 27.45 0.54 2247 +2249 4 42.23 511.56 27.6 0.54 2248 +2250 4 43.71 512.51 27.26 0.54 2249 +2251 4 44.78 513.28 27.24 0.54 2250 +2252 4 46.29 515.73 27.34 0.54 2251 +2253 4 47.49 518.78 27.44 0.54 2252 +2254 4 48.37 519.74 27.16 0.54 2253 +2255 4 49.59 521.58 27.15 0.54 2254 +2256 4 51.09 522.81 27.13 0.54 2255 +2257 4 51.84 523.29 27.02 0.54 2256 +2258 4 52.76 524.21 26.97 0.54 2257 +2259 4 53.56 524.62 27.46 0.54 2258 +2260 4 54.52 525.19 28.03 0.54 2259 +2261 4 56.24 527.44 28.55 0.54 2260 +2262 4 57.33 528.46 29.0 0.54 2261 +2263 4 58.44 530.41 29.61 0.54 2262 +2264 4 59.99 533.42 30.14 0.54 2263 +2265 4 60.91 535.55 30.41 0.54 2264 +2266 4 61.08 536.92 29.03 0.54 2265 +2267 4 59.7 537.66 29.22 0.54 2266 +2268 4 59.23 538.12 29.16 0.54 2267 +2269 4 59.76 538.5 29.98 0.54 2268 +2270 4 59.88 539.59 29.85 0.54 2269 +2271 4 59.98 539.81 29.25 0.54 2270 +2272 4 59.62 540.17 28.64 0.54 2271 +2273 4 59.29 540.5 28.4 0.54 2272 +2274 4 59.24 541.17 27.94 0.54 2273 +2275 4 59.32 541.68 27.3 0.54 2274 +2276 4 58.81 542.19 26.79 0.54 2275 +2277 4 58.14 543.48 26.23 0.54 2276 +2278 4 58.07 544.76 25.76 0.54 2277 +2279 4 58.32 546.03 25.25 0.54 2278 +2280 4 58.55 547.32 24.67 0.54 2279 +2281 4 58.82 547.67 24.22 0.54 2280 +2282 4 59.4 548.3 24.01 0.54 2281 +2283 4 60.73 549.42 23.54 0.54 2282 +2284 4 61.76 549.92 23.19 0.54 2283 +2285 4 63.43 551.0 23.07 0.54 2284 +2286 4 64.13 552.74 22.58 0.54 2285 +2287 4 64.24 553.84 22.29 0.54 2286 +2288 4 65.11 554.8 21.85 0.54 2287 +2289 4 65.65 555.19 21.08 0.54 2288 +2290 4 66.55 555.81 20.98 0.54 2289 +2291 4 67.24 556.66 20.24 0.54 2290 +2292 4 67.35 556.86 19.72 0.54 2291 +2293 4 68.34 558.0 18.99 0.54 2292 +2294 4 69.21 559.57 18.62 0.54 2293 +2295 4 70.23 560.4 18.14 0.54 2294 +2296 4 70.45 560.79 17.17 0.54 2295 +2297 4 70.86 561.29 16.81 0.54 2296 +2298 4 71.45 561.94 16.52 0.54 2297 +2299 4 72.6 563.83 15.99 0.54 2298 +2300 4 72.7 565.56 15.61 0.54 2299 +2301 4 73.54 568.06 15.03 0.54 2300 +2302 4 74.38 568.75 14.34 0.54 2301 +2303 4 74.67 569.39 12.56 0.54 2302 +2304 4 75.73 570.17 12.39 0.54 2303 +2305 4 76.89 571.45 11.81 0.54 2304 +2306 4 77.94 573.13 11.87 0.54 2305 +2307 4 78.76 575.36 11.1 0.54 2306 +2308 4 79.3 576.06 10.3 0.54 2307 +2309 4 80.31 577.19 9.71 0.54 2308 +2310 4 81.31 578.93 9.17 0.54 2309 +2311 4 82.86 579.76 8.13 0.54 2310 +2312 4 83.76 583.11 8.38 0.54 2311 +2313 4 83.89 585.4 8.52 0.54 2312 +2314 4 83.09 588.03 8.39 0.54 2313 +2315 4 82.89 591.55 8.53 0.54 2314 +2316 4 82.42 594.13 8.74 0.54 2315 +2317 4 82.09 597.81 8.83 0.54 2316 +2318 4 80.69 599.8 8.85 0.54 2317 +2319 4 79.69 600.78 8.21 0.54 2318 +2320 4 26.36 477.48 22.58 0.755 2166 +2321 4 24.42 479.08 23.43 0.755 2320 +2322 4 23.06 481.64 23.96 0.755 2321 +2323 4 21.95 482.74 23.71 0.755 2322 +2324 4 21.76 484.24 25.7 0.755 2323 +2325 4 21.44 485.15 25.82 0.755 2324 +2326 4 21.44 488.19 26.11 0.755 2325 +2327 4 22.34 490.02 26.21 0.54 2326 +2328 4 23.55 491.86 26.27 0.54 2327 +2329 4 24.7 492.57 25.41 0.54 2328 +2330 4 26.64 493.37 25.0 0.54 2329 +2331 4 28.16 494.6 24.99 0.54 2330 +2332 4 29.82 496.6 25.02 0.54 2331 +2333 4 31.5 499.79 25.33 0.54 2332 +2334 4 35.02 503.9 25.71 0.54 2333 +2335 4 36.39 505.89 25.78 0.54 2334 +2336 4 37.44 507.57 25.85 0.54 2335 +2337 4 39.27 508.79 25.87 0.54 2336 +2338 4 41.55 511.1 25.89 0.54 2337 +2339 4 43.37 512.94 25.89 0.54 2338 +2340 4 45.21 515.97 26.41 0.54 2339 +2341 4 46.45 518.1 26.65 0.54 2340 +2342 4 47.53 519.74 27.02 0.54 2341 +2343 4 48.62 522.01 27.43 0.54 2342 +2344 4 50.17 523.2 27.78 0.54 2343 +2345 4 50.85 523.74 28.6 0.54 2344 +2346 4 51.93 524.48 28.81 0.54 2345 +2347 4 53.46 526.01 28.88 0.54 2346 +2348 4 56.05 529.52 29.14 0.54 2347 +2349 4 57.74 531.78 29.58 0.54 2348 +2350 4 58.99 534.18 30.08 0.54 2349 +2351 4 59.92 536.9 30.63 0.54 2350 +2352 4 60.03 537.4 31.74 0.54 2351 +2353 4 59.3 538.72 32.39 0.54 2352 +2354 4 58.51 539.21 30.61 0.54 2353 +2355 4 58.69 540.25 29.33 0.54 2354 +2356 4 58.29 541.25 28.49 0.54 2355 +2357 4 58.14 542.0 28.57 0.54 2356 +2358 4 57.79 542.95 28.32 0.54 2357 +2359 4 57.57 544.41 27.59 0.54 2358 +2360 4 57.43 545.47 26.19 0.54 2359 +2361 4 57.68 547.64 25.92 0.54 2360 +2362 4 58.55 549.2 25.61 0.54 2361 +2363 4 60.81 550.32 25.21 0.54 2362 +2364 4 62.55 551.33 24.39 0.54 2363 +2365 4 64.07 552.86 24.33 0.54 2364 +2366 4 64.52 555.77 24.57 0.54 2365 +2367 4 66.41 556.93 23.6 0.54 2366 +2368 4 67.27 557.6 23.06 0.54 2367 +2369 4 69.63 560.75 22.39 0.54 2368 +2370 4 70.56 562.25 21.01 0.54 2369 +2371 4 71.46 562.88 19.26 0.54 2370 +2372 4 71.6 564.27 19.3 0.54 2371 +2373 4 72.57 565.75 18.3 0.54 2372 +2374 4 72.91 568.45 17.39 0.54 2373 +2375 4 73.87 569.02 16.15 0.54 2374 +2376 4 74.26 569.56 15.34 0.54 2375 +2377 4 74.92 571.33 14.54 0.54 2376 +2378 4 76.82 573.71 13.77 0.54 2377 +2379 4 77.18 574.27 12.73 0.54 2378 +2380 4 78.21 575.39 12.36 0.54 2379 +2381 4 79.55 577.99 12.43 0.54 2380 +2382 4 80.96 580.25 11.3 0.54 2381 +2383 4 81.84 581.2 11.02 0.54 2382 +2384 4 82.74 582.73 11.0 0.54 2383 +2385 4 82.67 584.93 10.54 0.54 2384 +2386 4 82.51 588.13 10.79 0.54 2385 +2387 4 81.97 591.69 10.44 0.54 2386 +2388 4 81.88 593.0 9.67 0.54 2387 +2389 4 81.54 596.06 9.69 0.54 2388 +2390 4 81.34 597.5 9.25 0.54 2389 +2391 4 80.58 599.45 8.0 0.54 2390 +2392 4 79.34 601.89 8.2 0.54 2391 +2393 4 78.44 602.79 6.85 0.54 2392 +2394 4 20.72 483.94 23.94 0.755 2323 +2395 4 19.2 485.14 24.21 0.755 2394 +2396 4 16.73 486.68 24.28 0.755 2395 +2397 4 15.18 489.43 24.38 0.755 2396 +2398 4 14.35 490.85 23.92 0.755 2397 +2399 4 12.92 492.26 23.58 0.755 2398 +2400 4 11.82 493.95 23.63 0.755 2399 +2401 4 9.92 496.43 23.29 0.755 2400 +2402 4 7.41 498.92 23.01 0.755 2401 +2403 4 5.5 501.41 22.6 0.755 2402 +2404 4 4.59 502.93 22.83 0.755 2403 +2405 4 3.9 503.93 22.08 0.755 2404 +2406 4 3.28 506.96 22.44 0.755 2405 +2407 4 1.99 508.53 22.03 0.755 2406 +2408 4 -0.01 509.91 22.05 0.755 2407 +2409 4 -1.77 511.36 21.36 0.755 2408 +2410 4 -4.16 512.8 20.74 0.755 2409 +2411 4 -6.66 514.37 20.37 0.755 2410 +2412 4 -9.32 516.4 20.06 0.755 2411 +2413 4 -11.82 518.26 19.87 0.755 2412 +2414 4 -14.28 520.09 20.05 0.755 2413 +2415 4 -16.46 522.25 20.0 0.755 2414 +2416 4 -18.6 524.05 20.3 0.755 2415 +2417 4 -20.89 525.7 20.67 0.755 2416 +2418 4 -23.94 527.8 21.16 0.755 2417 +2419 4 -26.93 529.84 20.72 0.755 2418 +2420 4 -29.22 531.8 21.05 0.755 2419 +2421 4 -29.98 534.08 21.35 0.755 2420 +2422 4 -30.75 534.84 20.96 0.755 2421 +2423 4 -31.21 536.5 21.16 0.755 2422 +2424 4 -30.76 540.01 21.46 0.755 2423 +2425 4 -30.25 542.53 20.68 0.755 2424 +2426 4 -30.3 545.32 20.51 0.755 2425 +2427 4 -30.29 546.84 19.14 0.755 2426 +2428 4 -30.31 549.89 19.29 0.755 2427 +2429 4 -29.75 552.96 19.23 0.755 2428 +2430 4 -30.09 554.54 18.9 0.755 2429 +2431 4 -31.06 556.7 18.74 0.755 2430 +2432 4 -32.64 557.96 18.4 0.755 2431 +2433 4 -32.86 561.2 18.21 0.755 2432 +2434 4 -33.38 564.45 17.96 0.755 2433 +2435 4 -34.04 566.93 17.68 0.755 2434 +2436 4 -33.96 570.49 17.41 0.755 2435 +2437 4 -33.17 573.98 16.38 0.755 2436 +2438 4 -32.45 577.82 16.32 0.755 2437 +2439 4 -32.12 579.92 15.2 0.755 2438 +2440 4 -32.25 582.78 14.22 0.755 2439 +2441 4 -32.01 584.97 13.8 0.755 2440 +2442 4 -31.58 586.68 13.62 0.755 2441 +2443 4 -30.45 589.2 12.94 0.755 2442 +2444 4 -29.95 590.83 11.99 0.755 2443 +2445 4 -29.68 592.4 11.66 0.755 2444 +2446 4 -29.88 595.32 11.58 0.755 2445 +2447 4 -29.65 597.51 11.17 0.755 2446 +2448 4 -28.28 599.5 11.17 0.755 2447 +2449 4 -26.84 601.72 10.49 0.755 2448 +2450 4 -27.0 604.61 10.79 0.755 2449 +2451 4 -26.27 606.94 10.56 0.755 2450 +2452 4 -25.77 609.69 10.64 0.755 2451 +2453 4 -26.39 612.12 10.93 0.755 2452 +2454 4 -27.3 614.54 11.26 0.755 2453 +2455 4 -28.75 616.58 10.76 0.755 2454 +2456 4 -29.58 619.82 10.55 0.755 2455 +2457 4 -29.82 622.48 10.07 0.755 2456 +2458 4 -30.14 625.24 10.14 0.755 2457 +2459 4 -31.18 628.09 9.23 0.755 2458 +2460 4 -31.97 631.59 9.5 0.755 2459 +2461 4 -33.21 634.65 9.68 0.755 2460 +2462 4 -34.46 637.08 9.95 0.755 2461 +2463 4 -34.52 640.79 9.65 0.755 2462 +2464 4 -35.78 643.25 9.62 0.755 2463 +2465 4 -36.33 645.32 8.9 0.755 2464 +2466 4 -37.28 647.47 8.89 0.755 2465 +2467 4 -38.71 650.71 8.74 0.755 2466 +2468 4 -39.06 654.69 8.85 0.755 2467 +2469 4 -38.94 658.81 9.09 0.755 2468 +2470 4 -38.69 661.92 8.7 0.755 2469 +2471 4 -38.58 665.73 8.9 0.755 2470 +2472 4 -38.48 669.28 8.79 0.755 2471 +2473 4 -36.45 674.25 8.18 0.755 2472 +2474 4 -35.23 677.91 8.42 0.755 2473 +2475 4 -35.36 680.69 7.11 0.755 2474 +2476 4 -35.11 684.39 6.85 0.755 2475 +2477 4 -35.23 686.32 7.57 0.755 2476 +2478 4 -35.07 688.29 7.83 0.755 2477 +2479 4 -35.04 690.69 6.85 0.755 2478 +2480 4 -34.86 693.24 5.88 0.755 2479 +2481 4 -34.95 696.08 5.1 0.755 2480 +2482 4 -35.02 698.27 4.64 0.755 2481 +2483 4 -34.65 700.63 4.07 0.755 2482 +2484 4 -34.07 703.1 3.9 0.755 2483 +2485 4 -32.44 705.74 2.11 0.755 2484 +2486 4 -30.6 706.97 2.06 0.755 2485 +2487 4 -28.65 708.68 1.9 0.755 2486 +2488 4 -27.71 709.59 0.45 0.755 2487 +2489 4 -25.75 710.99 0.26 0.755 2488 +2490 4 -24.15 712.43 -0.41 0.755 2489 +2491 4 -21.64 713.91 -1.26 0.755 2490 +2492 4 -20.49 715.5 -1.96 0.755 2491 +2493 4 -19.15 716.91 -2.25 0.755 2492 +2494 4 -17.57 718.38 -3.09 0.755 2493 +2495 4 -15.77 719.65 -3.57 0.755 2494 +2496 4 -14.31 720.93 -4.04 0.755 2495 +2497 4 -13.02 722.09 -4.96 0.755 2496 +2498 4 -12.3 722.91 -5.48 0.755 2497 +2499 4 0.45 311.01 18.62 0.975 2100 +2500 4 -0.41 312.78 17.74 0.975 2499 +2501 4 -1.24 313.6 17.23 0.975 2500 +2502 4 -1.75 314.11 16.64 0.975 2501 +2503 4 -1.81 316.3 16.33 0.975 2502 +2504 4 -1.73 318.05 15.65 0.975 2503 +2505 4 -2.05 319.58 15.76 0.975 2504 +2506 4 -2.58 321.63 15.25 0.975 2505 +2507 4 -3.23 322.86 15.13 0.975 2506 +2508 4 -4.25 324.19 14.06 0.865 2507 +2509 4 -5.18 325.71 14.3 0.865 2508 +2510 4 -5.49 328.14 14.56 0.865 2509 +2511 4 -4.58 331.49 14.81 0.865 2510 +2512 4 -3.58 333.83 14.42 0.865 2511 +2513 4 -3.49 335.87 13.94 0.865 2512 +2514 4 -3.81 338.62 14.08 0.865 2513 +2515 4 -5.36 341.96 14.47 0.865 2514 +2516 4 -6.25 344.68 13.45 0.865 2515 +2517 4 -7.41 347.64 12.94 0.865 2516 +2518 4 -8.21 349.66 12.76 0.865 2517 +2519 4 -9.21 351.85 12.23 0.865 2518 +2520 4 -9.95 353.8 11.13 0.865 2519 +2521 4 -10.57 356.85 11.42 0.865 2520 +2522 4 -11.34 358.81 11.68 0.865 2521 +2523 4 -12.0 361.28 11.53 0.865 2522 +2524 4 -14.22 363.19 11.01 0.865 2523 +2525 4 -15.83 365.69 10.49 0.865 2524 +2526 4 -18.06 369.41 10.07 0.865 2525 +2527 4 -19.29 373.04 10.54 0.865 2526 +2528 4 -22.14 377.07 10.14 0.865 2527 +2529 4 -23.1 379.24 9.98 0.865 2528 +2530 4 -23.53 380.89 8.84 0.865 2529 +2531 4 -23.88 383.35 8.72 0.865 2530 +2532 4 -24.53 387.03 8.77 0.865 2531 +2533 4 -24.08 389.32 8.95 0.865 2532 +2534 4 -24.09 391.45 9.16 0.865 2533 +2535 4 -24.86 394.03 9.48 0.865 2534 +2536 4 -25.48 395.85 8.05 0.865 2535 +2537 4 -26.13 397.42 7.81 0.865 2536 +2538 4 -26.68 399.8 7.1 0.865 2537 +2539 4 -26.49 400.51 6.33 0.865 2538 +2540 4 -25.58 402.04 6.39 0.865 2539 +2541 4 -24.74 402.73 7.22 0.865 2540 +2542 4 -24.29 404.69 7.51 0.865 2541 +2543 4 -23.23 406.69 7.6 0.755 2542 +2544 4 -22.88 408.46 8.29 0.755 2543 +2545 4 -22.43 409.53 8.35 0.755 2544 +2546 4 -21.7 410.33 8.05 0.755 2545 +2547 4 -20.98 411.14 7.53 0.755 2546 +2548 4 -20.3 412.0 6.66 0.755 2547 +2549 4 -19.27 412.5 6.31 0.755 2548 +2550 4 -18.52 412.96 6.2 0.865 2549 +2551 4 -17.16 414.95 6.27 0.865 2550 +2552 4 -15.9 417.06 5.15 0.865 2551 +2553 4 -14.49 419.23 4.55 0.865 2552 +2554 4 -14.04 422.43 4.83 0.865 2553 +2555 4 -13.9 425.02 3.32 0.865 2554 +2556 4 -14.02 426.97 2.32 0.865 2555 +2557 4 -14.02 429.4 1.04 0.865 2556 +2558 4 -13.44 431.27 0.72 0.865 2557 +2559 4 -12.65 432.3 -0.38 0.865 2558 +2560 4 -11.8 433.29 -1.12 0.865 2559 +2561 4 -10.33 434.26 -1.62 0.865 2560 +2562 4 -9.34 435.12 -2.54 0.865 2561 +2563 4 -7.91 435.84 -3.57 0.865 2562 +2564 4 -6.58 436.96 -3.96 0.865 2563 +2565 4 -5.57 439.61 -4.4 0.865 2564 +2566 4 -5.38 440.92 -5.34 0.865 2565 +2567 4 -4.84 441.91 -6.06 0.865 2566 +2568 4 -4.81 443.41 -7.21 0.865 2567 +2569 4 -4.87 444.69 -7.75 0.865 2568 +2570 4 -5.13 445.57 -8.86 0.865 2569 +2571 4 -5.01 446.65 -8.98 0.865 2570 +2572 4 -4.96 447.81 -9.93 0.865 2571 +2573 4 -5.06 449.15 -10.93 0.865 2572 +2574 4 -4.75 449.29 -11.62 0.54 2573 +2575 4 -3.29 449.98 -12.38 0.54 2574 +2576 4 -2.58 450.49 -13.0 0.54 2575 +2577 4 -2.33 450.54 -13.46 0.54 2576 +2578 4 -1.64 451.07 -14.22 0.54 2577 +2579 4 -0.5 452.39 -15.11 0.54 2578 +2580 4 -0.14 453.85 -15.99 0.54 2579 +2581 4 -0.05 454.99 -16.57 0.54 2580 +2582 4 0.18 455.67 -17.28 0.54 2581 +2583 4 0.48 455.98 -17.35 0.54 2582 +2584 4 0.13 456.62 -17.63 0.54 2583 +2585 4 0.62 457.37 -18.97 0.54 2584 +2586 4 -0.14 458.15 -20.56 0.54 2585 +2587 4 -0.75 459.36 -22.05 0.54 2586 +2588 4 -1.78 460.98 -22.94 0.54 2587 +2589 4 -1.54 462.27 -23.57 0.54 2588 +2590 4 -0.84 464.32 -24.05 0.54 2589 +2591 4 -1.11 464.9 -25.33 0.54 2590 +2592 4 -0.49 465.5 -25.11 0.54 2591 +2593 4 -0.34 466.55 -24.94 0.54 2592 +2594 4 -0.49 467.31 -26.45 0.54 2593 +2595 4 -0.39 468.13 -26.97 0.54 2594 +2596 4 -0.74 470.01 -27.28 0.54 2595 +2597 4 -0.97 470.83 -27.87 0.54 2596 +2598 4 -1.67 472.13 -28.58 0.54 2597 +2599 4 -0.75 473.06 -28.65 0.54 2598 +2600 4 0.2 473.93 -29.71 0.54 2599 +2601 4 0.79 474.26 -29.96 0.54 2600 +2602 4 2.11 475.08 -30.54 0.54 2601 +2603 4 2.81 475.31 -31.25 0.54 2602 +2604 4 3.67 475.98 -31.81 0.54 2603 +2605 4 5.03 477.05 -31.82 0.54 2604 +2606 4 5.69 477.93 -32.93 0.54 2605 +2607 4 6.67 479.09 -33.81 0.54 2606 +2608 4 7.67 481.74 -34.25 0.54 2607 +2609 4 8.44 482.82 -35.8 0.54 2608 +2610 4 9.07 484.33 -37.16 0.54 2609 +2611 4 9.71 485.22 -38.41 0.54 2610 +2612 4 10.16 485.67 -38.41 0.54 2611 +2613 4 11.12 486.86 -39.51 0.54 2612 +2614 4 11.62 487.59 -40.69 0.54 2613 +2615 4 12.5 488.85 -40.96 0.54 2614 +2616 4 13.86 490.84 -40.89 0.54 2615 +2617 4 14.78 491.76 -40.88 0.54 2616 +2618 4 15.2 492.24 -41.18 0.54 2617 +2619 4 15.27 493.08 -41.94 0.54 2618 +2620 4 16.1 493.79 -42.86 0.54 2619 +2621 4 16.49 494.33 -43.6 0.54 2620 +2622 4 16.5 494.62 -45.07 0.54 2621 +2623 4 17.73 495.24 -45.13 0.54 2622 +2624 4 18.31 495.88 -45.34 0.54 2623 +2625 4 18.85 496.56 -46.09 0.54 2624 +2626 4 19.69 497.56 -46.82 0.54 2625 +2627 4 20.38 498.39 -47.49 0.54 2626 +2628 4 21.06 499.85 -48.25 0.54 2627 +2629 4 21.6 501.14 -48.84 0.54 2628 +2630 4 22.39 502.73 -48.76 0.54 2629 +2631 4 22.61 503.49 -49.38 0.54 2630 +2632 4 23.96 504.88 -49.45 0.54 2631 +2633 4 25.57 508.45 -49.93 0.54 2632 +2634 4 26.97 511.91 -50.78 0.54 2633 +2635 4 27.71 513.93 -50.89 0.54 2634 +2636 4 28.54 515.53 -51.56 0.54 2635 +2637 4 28.97 516.64 -51.94 0.54 2636 +2638 4 29.65 518.08 -52.54 0.54 2637 +2639 4 30.79 519.69 -53.39 0.54 2638 +2640 4 32.95 523.04 -54.55 0.54 2639 +2641 4 33.78 525.84 -55.04 0.54 2640 +2642 4 34.99 529.21 -56.49 0.54 2641 +2643 4 35.75 531.81 -57.97 0.54 2642 +2644 4 36.13 533.87 -58.56 0.54 2643 +2645 4 35.91 537.95 -58.37 0.54 2644 +2646 4 36.37 539.31 -59.71 0.54 2645 +2647 4 37.22 541.51 -60.26 0.54 2646 +2648 4 37.72 543.15 -61.28 0.54 2647 +2649 4 38.29 543.73 -61.27 0.54 2648 +2650 4 38.41 544.21 -61.54 0.11 2649 +2651 4 37.6 545.31 -61.8 0.435 2650 +2652 4 36.83 548.18 -61.46 0.435 2651 +2653 4 36.22 550.02 -61.31 0.435 2652 +2654 4 35.87 550.37 -61.69 0.435 2653 +2655 4 35.35 553.01 -61.99 0.435 2654 +2656 4 34.88 554.08 -61.91 0.435 2655 +2657 4 35.14 556.25 -62.18 0.435 2656 +2658 4 35.21 557.09 -63.01 0.435 2657 +2659 4 35.17 557.73 -63.25 0.435 2658 +2660 4 35.41 559.32 -63.79 0.435 2659 +2661 4 35.81 559.85 -64.46 0.435 2660 +2662 4 35.76 560.51 -64.85 0.435 2661 +2663 4 36.27 561.21 -65.89 0.435 2662 +2664 4 36.21 562.19 -66.39 0.435 2663 +2665 4 36.15 562.25 -67.05 0.435 2664 +2666 4 36.99 563.24 -67.71 0.435 2665 +2667 4 38.29 565.32 -68.54 0.435 2666 +2668 4 38.96 565.85 -67.72 0.435 2667 +2669 4 39.41 566.93 -67.72 0.435 2668 +2670 4 39.67 567.27 -68.17 0.435 2669 +2671 4 39.73 567.54 -69.29 0.435 2670 +2672 4 40.12 568.06 -69.95 0.435 2671 +2673 4 40.64 568.76 -70.84 0.435 2672 +2674 4 40.89 569.12 -71.43 0.435 2673 +2675 4 41.23 569.41 -72.72 0.435 2674 +2676 4 42.55 570.23 -73.3 0.435 2675 +2677 4 43.04 570.96 -74.47 0.435 2676 +2678 4 44.59 571.87 -75.89 0.435 2677 +2679 4 46.21 572.71 -76.57 0.435 2678 +2680 4 47.96 574.0 -77.28 0.435 2679 +2681 4 48.98 574.52 -77.86 0.435 2680 +2682 4 49.68 575.06 -78.69 0.435 2681 +2683 4 51.18 576.3 -78.86 0.435 2682 +2684 4 52.38 576.63 -79.02 0.435 2683 +2685 4 53.07 576.56 -79.84 0.435 2684 +2686 4 53.63 576.92 -80.4 0.435 2685 +2687 4 54.5 577.58 -80.94 0.435 2686 +2688 4 38.92 545.0 -61.35 0.54 2649 +2689 4 39.59 545.86 -62.32 0.54 2688 +2690 4 39.83 547.44 -62.8 0.54 2689 +2691 4 40.2 548.91 -63.59 0.54 2690 +2692 4 39.93 549.79 -64.76 0.54 2691 +2693 4 40.73 551.11 -64.25 0.54 2692 +2694 4 42.55 552.96 -64.25 0.54 2693 +2695 4 44.21 554.65 -64.3 0.54 2694 +2696 4 44.58 555.52 -65.24 0.54 2695 +2697 4 45.64 557.2 -65.18 0.54 2696 +2698 4 46.81 559.99 -66.97 0.54 2697 +2699 4 48.13 562.04 -67.51 0.54 2698 +2700 4 49.0 564.21 -67.81 0.54 2699 +2701 4 50.03 565.33 -68.19 0.54 2700 +2702 4 50.9 566.28 -68.55 0.54 2701 +2703 4 52.68 567.85 -68.94 0.54 2702 +2704 4 56.02 571.54 -68.89 0.54 2703 +2705 4 58.84 573.92 -69.67 0.54 2704 +2706 4 60.43 575.37 -70.44 0.54 2705 +2707 4 61.6 576.65 -70.87 0.54 2706 +2708 4 63.19 579.03 -71.7 0.54 2707 +2709 4 63.94 579.81 -71.76 0.54 2708 +2710 4 65.4 581.1 -72.45 0.54 2709 +2711 4 66.7 581.94 -73.17 0.54 2710 +2712 4 69.07 583.76 -73.37 0.54 2711 +2713 4 70.55 584.43 -73.95 0.54 2712 +2714 4 72.2 585.53 -74.23 0.54 2713 +2715 4 73.5 586.37 -74.95 0.54 2714 +2716 4 74.67 587.34 -75.5 0.54 2715 +2717 4 76.08 588.98 -76.59 0.54 2716 +2718 4 78.19 590.26 -76.9 0.54 2717 +2719 4 79.84 591.64 -76.99 0.54 2718 +2720 4 80.71 592.31 -77.6 0.54 2719 +2721 4 82.15 593.33 -78.55 0.54 2720 +2722 4 82.64 594.06 -79.73 0.54 2721 +2723 4 84.0 594.84 -79.86 0.54 2722 +2724 4 84.73 595.34 -80.26 0.54 2723 +2725 4 85.78 596.12 -80.35 0.54 2724 +2726 4 86.62 596.81 -81.11 0.54 2725 +2727 4 -5.68 450.37 -10.83 0.755 2573 +2728 4 -7.62 451.97 -11.56 0.755 2727 +2729 4 -8.69 452.12 -11.59 0.755 2728 +2730 4 -10.72 453.23 -11.83 0.755 2729 +2731 4 -11.21 454.92 -11.91 0.755 2730 +2732 4 -12.07 457.6 -12.63 0.755 2731 +2733 4 -12.78 459.52 -13.43 0.755 2732 +2734 4 -13.79 461.13 -14.09 0.755 2733 +2735 4 -14.92 462.85 -14.51 0.755 2734 +2736 4 -16.0 466.65 -14.1 0.755 2735 +2737 4 -17.08 471.05 -13.58 0.65 2736 +2738 4 -17.55 473.64 -13.28 0.65 2737 +2739 4 -18.17 476.06 -12.99 0.65 2738 +2740 4 -18.93 477.41 -12.79 0.65 2739 +2741 4 -18.92 478.03 -12.72 0.65 2740 +2742 4 -19.99 479.08 -12.52 0.65 2741 +2743 4 -20.0 481.22 -12.32 0.65 2742 +2744 4 -20.47 484.1 -11.99 0.65 2743 +2745 4 -21.39 487.12 -11.61 0.65 2744 +2746 4 -22.53 489.47 -12.03 0.65 2745 +2747 4 -23.69 491.23 -12.66 0.65 2746 +2748 4 -25.08 494.72 -12.35 0.65 2747 +2749 4 -26.47 498.82 -11.82 0.65 2748 +2750 4 -27.38 501.55 -11.47 0.65 2749 +2751 4 -28.46 503.51 -11.17 0.65 2750 +2752 4 -29.07 504.49 -11.02 0.65 2751 +2753 4 -28.35 504.98 -11.42 0.54 2752 +2754 4 -27.59 505.75 -11.41 0.54 2753 +2755 4 -26.52 506.52 -11.44 0.54 2754 +2756 4 -25.61 507.43 -11.43 0.54 2755 +2757 4 -25.62 508.66 -11.31 0.54 2756 +2758 4 -25.5 509.45 -11.63 0.54 2757 +2759 4 -24.78 510.86 -11.86 0.54 2758 +2760 4 -24.04 512.26 -12.01 0.54 2759 +2761 4 -22.72 514.91 -12.41 0.54 2760 +2762 4 -21.39 515.71 -12.76 0.54 2761 +2763 4 -20.04 517.11 -12.96 0.54 2762 +2764 4 -18.72 518.54 -13.41 0.54 2763 +2765 4 -17.36 519.63 -13.58 0.54 2764 +2766 4 -16.54 521.23 -14.33 0.54 2765 +2767 4 -15.85 523.9 -14.89 0.54 2766 +2768 4 -15.57 526.04 -14.86 0.54 2767 +2769 4 -14.71 528.24 -15.25 0.54 2768 +2770 4 -14.13 529.49 -15.49 0.54 2769 +2771 4 -11.55 531.19 -15.62 0.54 2770 +2772 4 -9.73 533.95 -15.53 0.54 2771 +2773 4 -8.89 536.13 -15.92 0.54 2772 +2774 4 -8.8 538.78 -16.35 0.54 2773 +2775 4 -7.45 543.52 -16.1 0.54 2774 +2776 4 -7.16 546.86 -15.79 0.54 2775 +2777 4 -6.71 550.38 -15.49 0.54 2776 +2778 4 -6.26 552.04 -15.37 0.54 2777 +2779 4 -6.58 554.78 -15.08 0.54 2778 +2780 4 -6.43 557.07 -14.86 0.54 2779 +2781 4 -5.68 559.05 -14.74 0.54 2780 +2782 4 -4.0 560.12 -14.79 0.54 2781 +2783 4 -3.71 562.26 -14.61 0.54 2782 +2784 4 -3.24 565.75 -14.08 0.54 2783 +2785 4 -3.1 568.93 -13.79 0.54 2784 +2786 4 -2.49 570.47 -13.69 0.54 2785 +2787 4 -2.65 573.04 -13.35 0.54 2786 +2788 4 -3.35 576.46 -12.2 0.54 2787 +2789 4 -3.06 579.81 -11.9 0.54 2788 +2790 4 -1.85 581.94 -11.8 0.54 2789 +2791 4 -0.34 585.61 -11.58 0.54 2790 +2792 4 1.06 590.57 -10.55 0.54 2791 +2793 4 1.36 592.1 -10.43 0.54 2792 +2794 4 2.42 593.18 -10.43 0.54 2793 +2795 4 3.33 594.09 -10.42 0.54 2794 +2796 4 4.09 596.99 -10.21 0.54 2795 +2797 4 5.18 601.67 -9.4 0.54 2796 +2798 4 6.39 605.03 -9.1 0.54 2797 +2799 4 8.17 608.71 -7.63 0.54 2798 +2800 4 8.66 611.57 -6.94 0.54 2799 +2801 4 8.85 612.9 -6.37 0.54 2800 +2802 4 8.73 614.22 -5.85 0.54 2801 +2803 4 8.63 615.53 -5.1 0.54 2802 +2804 4 8.21 617.15 -4.3 0.54 2803 +2805 4 7.77 618.49 -3.91 0.54 2804 +2806 4 -29.22 505.49 -10.91 0.65 2752 +2807 4 -30.38 510.28 -11.25 0.65 2806 +2808 4 -30.54 512.56 -11.01 0.65 2807 +2809 4 -31.88 517.53 -11.53 0.65 2808 +2810 4 -32.81 520.25 -11.18 0.65 2809 +2811 4 -34.59 524.5 -10.76 0.65 2810 +2812 4 -35.11 527.47 -11.17 0.65 2811 +2813 4 -36.54 531.0 -11.15 0.65 2812 +2814 4 -37.46 534.04 -12.51 0.65 2813 +2815 4 -38.11 536.8 -12.49 0.65 2814 +2816 4 -39.15 539.05 -13.45 0.65 2815 +2817 4 -39.8 541.51 -13.53 0.65 2816 +2818 4 -41.08 544.31 -13.82 0.65 2817 +2819 4 -43.01 547.42 -14.25 0.65 2818 +2820 4 -43.05 550.19 -14.34 0.65 2819 +2821 4 -43.57 552.83 -14.65 0.65 2820 +2822 4 -44.35 554.81 -14.47 0.65 2821 +2823 4 -45.33 556.4 -14.97 0.65 2822 +2824 4 -45.18 558.68 -14.83 0.65 2823 +2825 4 -45.56 560.87 -15.27 0.65 2824 +2826 4 -46.54 563.05 -15.64 0.65 2825 +2827 4 -47.8 564.91 -15.72 0.65 2826 +2828 4 -48.62 566.93 -15.99 0.65 2827 +2829 4 -49.69 569.52 -15.7 0.65 2828 +2830 4 -51.23 572.23 -15.3 0.65 2829 +2831 4 -52.47 575.28 -15.03 0.65 2830 +2832 4 -52.71 577.04 -15.75 0.65 2831 +2833 4 -52.46 581.04 -15.91 0.65 2832 +2834 4 -52.79 585.91 -15.41 0.65 2833 +2835 4 -53.43 588.98 -15.36 0.65 2834 +2836 4 -54.13 591.48 -15.95 0.65 2835 +2837 4 -54.63 593.8 -16.06 0.65 2836 +2838 4 -55.34 595.72 -16.87 0.65 2837 +2839 4 -56.04 597.02 -17.65 0.65 2838 +2840 4 -56.59 599.4 -18.27 0.65 2839 +2841 4 -58.6 603.8 -17.89 0.65 2840 +2842 4 -59.74 607.65 -17.79 0.65 2841 +2843 4 -61.44 612.95 -17.11 0.65 2842 +2844 4 -62.51 614.61 -16.85 0.65 2843 +2845 4 -64.65 617.03 -16.41 0.65 2844 +2846 4 -66.74 620.92 -16.99 0.65 2845 +2847 4 -68.28 626.39 -16.31 0.65 2846 +2848 4 -69.9 630.41 -16.74 0.65 2847 +2849 4 -70.57 634.1 -16.78 0.65 2848 +2850 4 -72.15 636.28 -17.02 0.65 2849 +2851 4 -74.14 639.76 -16.5 0.65 2850 +2852 4 -76.29 642.78 -16.08 0.65 2851 +2853 4 -80.28 645.82 -15.8 0.65 2852 +2854 4 -83.81 648.7 -15.27 0.65 2853 +2855 4 -86.4 652.46 -14.66 0.65 2854 +2856 4 -86.7 653.63 -16.33 0.65 2855 +2857 4 -88.69 656.8 -15.83 0.65 2856 +2858 4 -90.16 660.37 -16.26 0.65 2857 +2859 4 -90.83 664.69 -16.31 0.65 2858 +2860 4 -92.21 668.77 -15.78 0.65 2859 +2861 4 -92.89 672.19 -16.15 0.65 2860 +2862 4 -94.32 674.81 -16.28 0.65 2861 +2863 4 -95.39 676.78 -15.99 0.65 2862 +2864 4 -96.13 678.12 -17.23 0.65 2863 +2865 4 -97.23 680.42 -17.13 0.65 2864 +2866 4 -98.4 681.58 -18.04 0.65 2865 +2867 4 -99.66 684.65 -18.01 0.65 2866 +2868 4 -100.65 686.24 -18.59 0.65 2867 +2869 4 -101.65 687.22 -19.15 0.65 2868 +2870 4 -101.87 688.35 -19.78 0.65 2869 +2871 4 -102.17 690.47 -19.47 0.65 2870 +2872 4 -102.02 693.06 -19.23 0.65 2871 +2873 4 -102.79 694.41 -19.03 0.65 2872 +2874 4 -103.4 696.84 -18.74 0.65 2873 +2875 4 -103.41 699.89 -18.43 0.65 2874 +2876 4 -103.28 701.26 -18.4 0.65 2875 +2877 4 -102.84 703.86 -18.25 0.65 2876 +2878 4 -102.62 706.68 -18.84 0.65 2877 +2879 4 -102.17 708.97 -18.65 0.65 2878 +2880 4 -101.57 712.62 -18.36 0.65 2879 +2881 4 -101.12 716.13 -18.05 0.65 2880 +2882 4 -101.59 719.31 -17.7 0.65 2881 +2883 4 -101.45 723.13 -17.34 0.65 2882 +2884 4 -100.55 727.08 -17.04 0.65 2883 +2885 4 -99.54 730.7 -16.84 0.65 2884 +2886 4 -99.0 736.53 -16.86 0.65 2885 +2887 4 -98.71 738.97 -16.65 0.65 2886 +2888 4 -97.84 739.93 -17.09 0.65 2887 +2889 4 -96.18 741.32 -17.26 0.65 2888 +2890 4 -94.52 743.93 -17.16 0.65 2889 +2891 4 -93.56 748.14 -17.82 0.65 2890 +2892 4 -93.31 750.02 -18.19 0.65 2891 +2893 4 -92.56 752.01 -18.14 0.65 2892 +2894 4 -91.61 753.82 -19.26 0.65 2893 +2895 4 -90.7 754.74 -19.33 0.65 2894 +2896 4 -103.71 688.65 -19.73 0.65 2869 +2897 4 -105.4 690.34 -19.64 0.65 2896 +2898 4 -107.22 692.14 -20.81 0.65 2897 +2899 4 -108.98 692.97 -21.48 0.65 2898 +2900 4 -110.42 694.08 -21.92 0.65 2899 +2901 4 -112.79 695.52 -22.47 0.65 2900 +2902 4 -114.23 696.65 -22.99 0.65 2901 +2903 4 -115.02 697.43 -23.2 0.65 2902 +2904 4 -116.57 700.18 -23.02 0.65 2903 +2905 4 -117.92 701.51 -24.12 0.65 2904 +2906 4 -118.68 703.48 -23.87 0.65 2905 +2907 4 -119.14 706.06 -23.57 0.65 2906 +2908 4 -118.3 710.09 -23.85 0.65 2907 +2909 4 -117.2 712.04 -24.91 0.65 2908 +2910 4 -116.16 715.54 -24.73 0.65 2909 +2911 4 -115.67 719.32 -25.62 0.65 2910 +2912 4 -115.32 721.72 -26.63 0.65 2911 +2913 4 -114.96 723.78 -27.29 0.65 2912 +2914 4 -114.38 725.05 -27.67 0.65 2913 +2915 4 -113.51 726.6 -27.98 0.65 2914 +2916 4 -113.22 728.44 -27.91 0.65 2915 +2917 4 -112.84 730.5 -28.49 0.65 2916 +2918 4 -27.98 401.37 6.92 0.65 2538 +2919 4 -29.04 402.74 7.15 0.65 2918 +2920 4 -31.79 405.45 7.68 0.65 2919 +2921 4 -34.06 407.7 6.67 0.65 2920 +2922 4 -35.9 409.5 7.01 0.65 2921 +2923 4 -38.35 411.92 7.41 0.65 2922 +2924 4 -41.44 414.68 7.43 0.65 2923 +2925 4 -46.14 419.63 7.14 0.65 2924 +2926 4 -48.43 422.49 7.62 0.65 2925 +2927 4 -48.54 425.34 6.78 0.65 2926 +2928 4 -48.64 428.77 6.22 0.65 2927 +2929 4 -48.07 430.64 5.89 0.65 2928 +2930 4 -47.63 433.53 6.06 0.54 2929 +2931 4 -47.99 435.73 5.77 0.54 2930 +2932 4 -48.6 437.55 4.35 0.54 2931 +2933 4 -49.3 438.85 3.63 0.54 2932 +2934 4 -49.29 439.74 5.46 0.54 2933 +2935 4 -50.1 440.54 5.16 0.54 2934 +2936 4 -50.96 441.39 4.26 0.54 2935 +2937 4 -51.52 442.86 3.39 0.54 2936 +2938 4 -52.49 444.74 3.07 0.54 2937 +2939 4 -53.85 447.31 1.86 0.54 2938 +2940 4 -54.82 448.87 1.56 0.54 2939 +2941 4 -54.78 450.35 0.58 0.54 2940 +2942 4 -55.02 452.7 0.0 0.54 2941 +2943 4 -55.12 454.94 -0.91 0.54 2942 +2944 4 -55.78 456.2 -1.17 0.54 2943 +2945 4 -57.93 457.42 -1.09 0.54 2944 +2946 4 -60.72 460.18 -1.02 0.54 2945 +2947 4 -61.87 463.13 -1.44 0.54 2946 +2948 4 -62.44 464.91 -2.35 0.54 2947 +2949 4 -62.81 466.19 -2.88 0.54 2948 +2950 4 -62.67 466.98 -3.04 0.54 2949 +2951 4 -5.99 292.26 22.29 0.865 2088 +2952 4 -5.25 294.24 22.42 0.865 2951 +2953 4 -4.94 296.38 22.6 0.865 2952 +2954 4 -3.89 299.58 22.82 0.865 2953 +2955 4 -1.99 302.56 22.11 0.865 2954 +2956 4 -0.94 304.26 22.18 0.865 2955 +2957 4 -0.79 306.85 22.41 0.865 2956 +2958 4 -1.4 310.18 22.8 0.865 2957 +2959 4 -2.07 313.26 24.29 0.865 2958 +2960 4 -1.92 315.84 24.61 0.865 2959 +2961 4 -2.08 318.11 24.91 0.865 2960 +2962 4 -2.39 321.15 25.24 0.865 2961 +2963 4 -3.31 324.17 25.7 0.865 2962 +2964 4 -4.07 326.74 26.09 0.65 2963 +2965 4 -6.04 328.69 26.61 0.65 2964 +2966 4 -7.57 332.02 27.16 0.65 2965 +2967 4 -8.07 332.51 28.39 0.65 2966 +2968 4 -9.45 333.87 28.64 0.65 2967 +2969 4 -11.59 335.97 29.04 0.65 2968 +2970 4 -12.81 339.01 29.46 0.65 2969 +2971 4 -14.35 342.33 29.92 0.65 2970 +2972 4 -16.34 344.9 30.36 0.65 2971 +2973 4 -18.01 346.25 30.64 0.65 2972 +2974 4 -19.26 348.09 32.3 0.65 2973 +2975 4 -19.83 349.85 33.05 0.65 2974 +2976 4 -20.38 351.0 33.9 0.65 2975 +2977 4 -21.41 352.01 34.62 0.65 2976 +2978 4 -21.71 352.9 34.81 0.65 2977 +2979 4 -21.97 353.78 35.37 0.65 2978 +2980 4 -21.82 356.05 35.65 0.65 2979 +2981 4 -21.83 358.78 35.92 0.65 2980 +2982 4 -21.29 360.38 36.93 0.65 2981 +2983 4 -20.75 362.49 38.54 0.65 2982 +2984 4 -19.8 363.97 39.11 0.65 2983 +2985 4 -19.08 364.47 40.23 0.65 2984 +2986 4 -18.66 364.64 41.56 0.65 2985 +2987 4 -18.04 365.84 41.93 0.65 2986 +2988 4 -17.67 365.79 42.5 0.65 2987 +2989 4 -17.2 365.91 44.37 0.65 2988 +2990 4 -6.61 91.18 9.77 0.435 1189 +2991 4 -7.98 91.62 9.94 0.435 2990 +2992 4 -8.7 91.42 10.44 0.435 2991 +2993 4 -8.69 91.11 10.56 0.65 2992 +2994 4 -8.95 90.75 11.08 0.65 2993 +2995 4 -8.89 90.09 11.62 0.65 2994 +2996 4 -9.16 89.43 11.96 0.65 2995 +2997 4 -9.56 88.31 12.41 0.65 2996 +2998 4 -9.55 87.99 12.53 0.65 2997 +2999 4 -9.83 87.06 12.69 0.65 2998 +3000 4 -9.81 86.44 12.78 0.65 2999 +3001 4 -9.77 86.09 13.2 0.65 3000 +3002 4 -9.87 85.27 13.65 0.65 3001 +3003 4 -9.68 84.79 13.89 0.65 3002 +3004 4 -9.21 84.32 13.95 0.65 3003 +3005 4 -8.85 83.96 14.57 0.65 3004 +3006 4 -8.62 83.72 15.35 0.65 3005 +3007 4 -8.21 83.31 16.42 0.65 3006 +3008 4 -7.9 82.7 16.39 0.65 3007 +3009 4 -7.85 82.04 16.93 0.65 3008 +3010 4 -7.79 81.68 17.42 0.65 3009 +3011 4 -7.91 80.57 17.78 0.435 3010 +3012 4 -7.99 80.05 18.49 0.435 3011 +3013 4 -7.97 79.73 18.53 0.435 3012 +3014 4 -8.26 79.11 18.65 0.435 3013 +3015 4 -8.4 78.63 18.84 0.435 3014 +3016 4 -8.68 78.0 18.96 0.435 3015 diff --git a/demos/Fig2_elecModels/cells/ca1_minimal.p b/demos/Fig2_elecModels/cells/ca1_minimal.p new file mode 100644 index 0000000..4395d62 --- /dev/null +++ b/demos/Fig2_elecModels/cells/ca1_minimal.p @@ -0,0 +1,58 @@ +// genesis +// cell parameter file for the 1991 Traub CA1 hippocampal cell +// "phi" parameter reduced by e-3 +*cartesian +*relative + +*set_global RM 1.0 //ohm*m^2 +*set_global RA 1.0 //ohm*m +*set_global CM 0.03 //F/m^2 +*set_global EREST_ACT -0.06 // volts + +// The format for each compartment parameter line is : +// name parent x y z d ch dens ... +// For channels, "dens" = maximum conductance per unit area of compartment + + +dend_3 none 0 220 0 3.84 +dend_5 . 0 220 0 3.84 +dend_6 . 0 220 0 3.84 +dend_8 . 0 110 0 3.84 + +soma dend_8 0 125 0 8.46 + + +apical_10 soma 0 120 0 4.0 +apical_11 apical_10 0 120 0 3 +apical_12 apical_11 0 120 0 3 +apical_13 apical_12 0 120 0 2.6 +apical_14 apical_13 0 120 0 2.6 +apical_15 apical_14 0 120 0 2.6 +apical_16 apical_15 0 120 0 2.6 +apical_17 apical_16 0 120 0 2.6 +apical_18 apical_17 0 120 0 2.6 +apical_19 apical_18 0 120 0 2.6 + +apical_11_1 apical_10 -60 60 0 2 +apical_11_2 apical_11_1 -60 60 0 1.8 +apical_11_3 apical_11_2 0 80 0 1.5 +apical_11_4 apical_11_3 0 80 0 1.5 + +apical_13_1 apical_12 40 40 0 1.0 +apical_13_2 apical_13_1 40 40 0 1.0 + +apical_14_1 apical_13_2 0 10 0 1.0 +apical_14_2 . 0 10 0 1.0 +apical_14_3 . 0 10 0 1.0 +apical_14_4 . 0 10 0 1.0 +apical_14_5 . 0 10 0 1.0 +apical_14_6 . 0 10 0 1.0 +apical_14_7 . 0 10 0 1.0 +apical_14_8 . 0 10 0 1.0 +apical_14_9 . 0 10 0 1.0 +apical_14_10 . 0 10 0 1.0 +apical_14_11 . 0 10 0 1.0 +apical_14_12 . 0 10 0 1.0 +apical_14_13 . 0 10 0 1.0 +apical_15_1 . 0 30 0 1.0 +apical_15_2 . 0 60 0 1.0 diff --git a/demos/Fig2_elecModels/cells/h10.CNG.swc b/demos/Fig2_elecModels/cells/h10.CNG.swc new file mode 100644 index 0000000..554dbe2 --- /dev/null +++ b/demos/Fig2_elecModels/cells/h10.CNG.swc @@ -0,0 +1,226 @@ +# Original file h10.swc edited by Duncan Donohue using StdSwc version 1.21 on 9/6/05. +# Irregularities and fixes documented in h10.swc.std. See StdSwc1.21.doc for more information. +# +#---------------------------------------------------------------------- +# This file was obtained using ban2swc.pl on file h10.txt +# (Jose Ambros-Ingerson, jose@kiubo.net): Sun Oct 19 18:38:56 2003 +#---------------------------------------------------------------------- +# ORIGINAL_SOURCE +# CREATURE +# REGION +# FIELD/LAYER +# TYPE +# CONTRIBUTOR +# REFERENCE +# RAW +# EXTRAS +# SOMA_AREA +# SHRINKAGE_CORRECTION +# VERSION_NUMBER +# VERSION_DATE +# ********************************************* +# SCALE 1.0 1.0 1.0 + 1 1 0. 23. 0. 3.35 -1 + 2 1 0. 18. 0. 2.5 1 + 3 1 0. 0. 0. 1.058 2 + 4 3 -4.157 -2.778 0. 0.6 3 + 5 3 -5.925 -3.510 -4.62 0.55 4 + 6 3 -15.47 -7.464 -29.560 0.4 5 + 7 3 -23.89 -9.139 -72.72 0.4 6 + 8 3 -24.39 -13.43 -83.51 0.350 6 + 9 3 -9.814 -5.121 -14.780 0.5 5 + 10 3 -15.81 -6.313 -23.93 0.5 9 + 11 3 -65.94 -16.29 -100.4 0.4 10 + 12 3 -54.5 -14.01 -82.960 0.4 10 + 13 3 -17.2 -10.06 -28.09 0.4 9 + 14 3 -78.64 -51.11 -138.70 0.4 13 + 15 3 -41.69 -26.42 -72.15 0.350 13 + 16 3 -10.11 -8.731 -20.330 0.45 4 + 17 3 -14.44 -13.06 -35.11 0.350 16 + 18 3 -26.61 -21.19 -108.7 0.3 17 + 19 3 -24.2 -27.66 -123.4 0.3 17 + 20 3 -32.3 -30.92 -96.08 0.350 16 + 21 3 -45.7 -39.87 -120.2 0.3 20 + 22 3 -56.99 -67.88 -162.60 0.350 20 + 23 3 -8.889 -13.3 0. 0.65 3 + 24 3 -11.39 -15.8 -3.54 0.55 23 + 25 3 -19.39 -23.8 -14.85 0.5 24 + 26 3 -21.7 -25.35 -19.01 0.45 25 + 27 3 -33.25 -33.06 -39.79 0.4 26 + 28 3 -64.36 -45.95 -121.10 0.350 27 + 29 3 -53.54 -53.36 -109.10 0.350 27 + 30 3 -26.32 -28.43 -27.32 0.4 26 + 31 3 -68.78 -46.02 -73.28 0.3 30 + 32 3 -71.820 -73.93 -91.67 0.350 30 + 33 3 -59.82 -84.320 -123.80 0.350 25 + 34 3 -84.52 -121.30 -190.3 0.25 33 + 35 3 -34.39 -38.80 -36.06 0.350 24 + 36 3 -96.61 -80.38 -86.06 0.3 35 + 37 3 -93.98 -128. -107.7 0.3 35 + 38 3 -15.65 -29.64 -17.68 0.5 23 + 39 3 -17.01 -32.9 -21.21 0.5 38 + 40 3 -21.95 -40.29 -34.52 0.4 39 + 41 3 -50.03 -82.33 -110.2 0.3 40 + 42 3 -49.730 -81.87 -109.30 0.350 40 + 43 3 -22.75 -61.78 -65.28 0.3 39 + 44 3 -37.30 -81.9 -74.25 0.3 38 + 45 3 -2.146 -10.790 0. 0.75 3 + 46 3 -24.77 -65.42 -24.490 0.350 45 + 47 3 -54.47 -137.1 -56.64 0.350 46 + 48 3 -55.18 -138.8 -57.4 0.350 46 + 49 3 -2.146 -20.95 -4.21 0.6 45 + 50 3 -2.146 -35.730 -10.33 0.45 49 + 51 3 -22.75 -139.3 -80.89 0.3 50 + 52 3 29. -192.3 -117. 0.350 50 + 53 3 -2.146 -25.57 -6.12 0.55 49 + 54 3 -3.103 -30.38 -7.10 0.5 53 + 55 3 -49.410 -263.2 -54.31 0.350 54 + 56 3 -22.05 -125.60 -26.41 0.3 54 + 57 3 16.990 -121.80 -25.63 0.3 53 + 58 3 2.146 -10.790 0. 0.65 3 + 59 3 2.146 -20.79 0. 0.4 58 + 60 3 2.146 -235.8 0. 0.350 59 + 61 3 2.146 -250.8 0. 0.25 60 + 62 3 4.059 -15.41 0. 0.4 58 + 63 3 8.269 -25.57 0. 0.350 62 + 64 3 35.63 -163.10 -27.90 0.4 63 + 65 3 45.32 -81.02 -13.27 0.3 63 + 66 3 20.13 -54.21 0. 0.350 62 + 67 3 35.25 -130.20 15.41 0.3 66 + 68 3 78.98 -142.3 21.07 0.350 66 + 69 3 8.889 -13.3 0. 0.6 3 + 70 3 16.67 -32.08 8.42 0.5 69 + 71 3 24.45 -50.86 16.84 0.45 70 + 72 3 49.32 -175.9 42.2 0.350 71 + 73 3 84.38 -140.6 38.30 0.350 71 + 74 3 42.45 -141.4 78.51 0.4 70 + 75 3 48.94 -174. 100.7 0.3 74 + 76 3 16.080 -20.490 4.21 0.4 69 + 77 3 99.04 -103.5 52.81 0.3 76 + 78 3 41.550 -45.97 19.13 0.3 76 + 79 3 63.71 -109.60 64.06 0.3 78 + 80 3 75.26 -126.9 77.95 0.2 79 + 81 3 18.29 -12.22 0. 0.6 3 + 82 3 20.79 -14.72 3.54 0.55 81 + 83 3 26.29 -20.22 11.31 0.5 82 + 84 3 101.10 -132.20 101.30 0.350 83 + 85 3 97.5 -67.8 68.54 0.3 83 + 86 3 47.29 -41.22 41.01 0.25 82 + 87 3 21.56 -13.58 3.54 0.5 81 + 88 3 28.09 -16.28 10.61 0.45 87 + 89 3 122.10 -79.11 86.16 0.3 88 + 90 3 85.99 -27.8 50.050 0.3 88 + 91 3 43.12 -22.51 26.87 0.4 87 + 92 3 75.45 -44.11 85.070 0.350 91 + 93 3 97.61 -33.34 110. 0.350 91 + 94 4 0. 41. 0. 2.550 1 + 95 4 0. 127. 0. 0.3 94 + 96 4 5.932 70.820 -6.05 2.25 94 + 97 4 18.37 133.3 -18.73 1.25 96 + 98 4 26.63 153.3 -23.02 0.6 97 + 99 4 56.65 225.8 -38.63 0.3 98 + 100 4 29.63 160.5 -24.580 0.6 98 + 101 4 91.850 253.70 -24.580 0.350 100 + 102 4 63.97 333.1 -24.580 0.350 100 + 103 4 18.37 142.20 -20.48 1.25 97 + 104 4 18.37 145.1 -21.07 1.25 103 + 105 4 28.28 195. -42.12 0.45 104 + 106 4 33.69 222.10 -53.6 0.350 105 + 107 4 39.1 249.3 -65.08 0.25 106 + 108 4 17.47 149.6 -22.98 1.25 104 + 109 4 4.851 213.10 -49.77 0.5 108 + 110 4 -10.07 288.1 -100.9 0.350 109 + 111 4 15.85 157.8 -26.43 1.25 108 + 112 4 15.85 182.3 -31.3 0.5 111 + 113 4 15.85 235.3 -41.84 0.350 112 + 114 4 15.85 272.2 -57.15 0.3 113 + 115 4 15.85 195.10 -33.84 0.350 112 + 116 4 30.09 266.7 -33.84 0.3 115 + 117 4 0.2380 273.5 -33.84 0.3 115 + 118 4 11.72 167.8 -28.57 1.25 111 + 119 4 3.46 187.70 -32.87 1.25 118 + 120 4 -0.506 207.60 -41.28 1.25 119 + 121 4 -3.39 222.10 -47.410 1.25 120 + 122 4 -3.39 223.8 -48.52 1.25 121 + 123 4 -3.39 247.10 -64.070 0.45 122 + 124 4 1.439 271.40 -88.820 0.3 123 + 125 4 -16.080 310.90 -129.1 0.350 123 + 126 4 -3.39 248.70 -65.19 1.25 122 + 127 4 -3.209 249.70 -65.570 1.25 126 + 128 4 1.297 272.3 -75.14 0.5 127 + 129 4 12. 326.1 -111.80 0.350 128 + 130 4 -0.506 263.2 -71.31 1.25 127 + 131 4 0.2450 265.1 -71.7 0.6 130 + 132 4 3.623 273.2 -73.45 0.55 131 + 133 4 46.230 337. -105.2 0.3 132 + 134 4 22.55 368.40 -113.60 0.350 132 + 135 4 19.01 310.40 -81.45 0.45 131 + 136 4 42.74 367.6 -81.45 0.350 135 + 137 4 -0.506 280.90 -74.820 1.25 130 + 138 4 -0.506 284.8 -75.60 0.850 137 + 139 4 14.450 360. -107.4 0.4 138 + 140 4 18.06 378.1 -115. 0.3 139 + 141 4 -14.02 352.8 -104.30 0.850 138 + 142 4 -20.330 384.5 -117.7 0.70 141 + 143 4 -20.330 441.8 -141.4 0.70 142 + 144 4 -20.330 494.40 -163.20 0.45 143 + 145 4 -20.330 544.30 -196.60 0.350 144 + 146 4 -20.330 582.6 -222.10 0.3 145 + 147 4 -20.330 622.5 -248.8 0.3 145 + 148 4 -20.330 462.1 -149.8 0.6 143 + 149 4 -7.321 527.5 -163.10 0.45 148 + 150 4 -1.389 557.30 -169.20 0.350 149 + 151 4 21.51 612.6 -181.10 0.3 150 + 152 4 -1.389 630.90 -183.8 0.25 150 + 153 4 -36.6 543.9 -166.4 0.6 148 + 154 4 -46.36 592.9 -176.4 0.350 153 + 155 4 -46.36 669.6 -208.10 0.25 154 + 156 4 -74.99 662.1 -207.4 0.25 154 + 157 4 -44.44 583.30 -174.4 0.5 153 + 158 4 -44.44 665.30 -174.4 0.350 157 + 159 4 -44.44 705.30 -174.4 0.25 158 + 160 4 -87.3 686.80 -174.4 0.350 157 + 161 4 -121.7 769.90 -174.4 0.25 160 + 162 4 -32.71 414.40 -131.1 0.45 142 + 163 4 -85.74 542.4 -188.5 0.350 162 + 164 4 -120. 625.2 -225.60 0.3 163 + 165 4 -137.4 667. -244.4 0.25 164 + 166 4 -132.4 655.1 -239. 0.2 164 + 167 4 -0.506 290.7 -76.77 0.9 137 + 168 4 6.713 327. -76.77 0.8 167 + 169 4 8.664 336.8 -76.77 0.6 168 + 170 4 12.49 356. -80.67 0.5 169 + 171 4 21.48 401.3 -89.84 0.350 170 + 172 4 13.74 362.3 -76.77 0.5 168 + 173 4 23.12 385. -71.89 0.25 172 + 174 4 13.74 396.6 -69.94 0.350 172 + 175 4 -20.6 391.70 -76.77 0.350 167 + 176 4 -15.83 311.3 -91.59 0.4 126 + 177 4 -28.44 374.70 -118.4 0.3 176 + 178 4 -14.84 249.8 -67.41 0.45 121 + 179 4 -37.12 303.6 -106.30 0.350 178 + 180 4 -55.25 347.3 -138. 0.3 178 + 181 4 -3.209 221.20 -47.02 0.45 120 + 182 4 -3.209 356.6 -73.95 0.350 181 + 183 4 -31.36 289.2 -61.660 0.350 181 + 184 4 -11.94 210.70 -44.35 0.6 119 + 185 4 -36.06 246.9 -62.33 0.5 184 + 186 4 -67.18 322. -96.01 0.3 185 + 187 4 -81.14 291.90 -88.74 0.3 185 + 188 4 1.208 193.10 -34.04 0.4 118 + 189 4 -21.42 306.90 -34.04 0.3 188 + 190 4 -77.13 310.40 -34.04 0.350 188 + 191 4 18.37 165.70 -25.17 0.5 103 + 192 4 25.78 203. -25.17 0.350 191 + 193 4 56.22 356. -25.17 0.3 192 + 194 4 50.36 326.6 -25.17 0.3 192 + 195 4 16.22 176.5 -25.17 0.350 191 + 196 4 -10.31 309.90 -25.17 0.350 195 + 197 4 2.957 243.20 -25.17 0.3 195 + 198 4 -2.105 51.58 -2.15 0.350 94 + 199 4 -20.09 142. -20.48 0.350 198 + 200 4 -3.061 56.39 -3.12 0.3 198 + 201 4 -3.061 76.39 -3.12 0.3 200 + 202 4 -3.061 142.4 -3.12 0.3 201 + 203 4 -3.061 167.4 -3.12 0.3 201 + 204 4 -32.910 128.5 -3.12 0.3 200 diff --git a/demos/Fig2_elecModels/cells/ko20x-07.CNG.swc b/demos/Fig2_elecModels/cells/ko20x-07.CNG.swc new file mode 100644 index 0000000..066eaf4 --- /dev/null +++ b/demos/Fig2_elecModels/cells/ko20x-07.CNG.swc @@ -0,0 +1,165 @@ +# Original file ko20x-07.swc edited using StdSwc version 1.31 on 7/9/13. +# Irregularities and fixes documented in ko20x-07.swc.std. See StdSwc1.31.doc for more information. +# +# SWC to SWC conversion from L-Measure. Sridevi Polavaram: spolavar@gmu.edu +# Original fileName:C:\Users\praveen\Desktop\Uzma\NewArchives\ToBeProcessed\WuOriginal\NeuroMorph files\Hippocampal CA1 Neuron\Wu test file\Before L measure\ko20x-07-T1.swc +# +# Original neuron tracing performed in Neuromantic +# which was programmed by Darren Myatt (d.r.myatt@reading.ac.uk) +# See homepage at http://www.rdg.ac.uk/Neuromantic +# +# NEUROMANTIC V1.6.3 (2012-4-11 10:34:10): Saved to 20x-7.swc +# NEUROMANTIC V1.6.3 (6/19/2013 5:45:09 PM): Saved to ko20x-07-T1.swc +# NEUROMANTIC V1.6.3 (7/9/2013 2:47:31 PM): Saved to ko20x-07-T1.swc +1 1 0.0 0.0 0.0 13.655 -1 +2 1 10.4 -8.84 0.0 13.655 1 +3 1 -10.4 8.84 0.0 13.655 1 +4 4 3.38 17.23 0.0 3.5795 1 +5 4 6.39 30.42 -6.0 1.5 4 +6 4 5.47 41.7 -10.0 1.0 5 +7 4 4.56 52.98 -10.0 1.0 6 +8 4 5.28 61.55 -13.0 1.0 7 +9 4 4.36 72.83 -15.0 1.5 8 +10 4 3.45 84.1 -16.0 1.5 9 +11 4 -0.93 94.39 -18.0 1.5 10 +12 4 -5.96 103.91 -19.0 1.5 11 +13 4 -4.4 119.65 -22.0 2.0 12 +14 4 -5.96 130.16 -23.0 1.5 13 +15 4 -6.88 141.44 -24.0 1.5 14 +16 4 -4.39 154.41 -27.0 1.5 15 +17 4 -4.35 154.43 -36.0 0.18199 16 +18 4 -4.94 169.97 -27.0 2.0 17 +19 4 -5.86 181.25 -28.0 2.0 18 +20 4 -8.83 191.65 -28.0 1.5 19 +21 4 -13.86 201.17 -29.0 1.5 20 +22 4 -14.78 212.45 -29.0 1.5 21 +23 4 -11.35 222.66 -30.0 1.5 22 +24 4 -9.34 232.75 -30.0 1.0 23 +25 4 -6.33 239.38 -30.0 1.5 24 +26 4 -10.71 249.67 -29.0 1.5 25 +27 4 -12.92 259.42 -28.0 1.5 26 +28 4 -15.9 269.82 -27.0 1.5 27 +29 4 -16.81 281.1 -27.0 1.5 28 +30 4 -14.15 291.96 -27.0 1.5 29 +31 4 -11.48 302.81 -27.0 2.0 30 +32 4 -10.11 312.15 -32.0 2.0 31 +33 4 -3.64 319.77 -35.0 2.0 32 +34 4 6.1 321.98 -36.0 2.0 33 +35 4 12.58 329.6 -37.0 2.0 34 +36 4 16.01 339.81 -38.0 2.0 35 +37 4 17.07 344.16 -44.0 1.5 36 +38 4 19.09 354.25 -45.0 1.5 37 +39 4 15.47 363.89 -45.0 1.5 38 +40 4 9.14 371.89 -44.0 1.5 39 +41 4 1.52 378.36 -42.0 1.5 40 +42 4 -5.44 385.6 -42.0 1.5 41 +43 4 -8.42 396.0 -42.0 1.5 42 +44 4 -13.45 405.52 -42.0 1.0 43 +45 4 -19.12 414.28 -42.0 1.5 44 +46 4 -19.13 414.43 -42.0 0.10175 45 +47 4 -25.45 422.28 -41.0 1.0 46 +48 4 -26.14 430.74 -40.0 1.0 47 +49 4 -27.05 442.02 -39.0 1.0 48 +50 4 -27.21 452.65 -39.0 1.5 49 +51 4 -24.41 464.05 -45.0 2.4622 50 +52 4 -13.72 417.56 -42.0 1.0 46 +53 4 -7.24 425.18 -41.0 1.0 52 +54 4 -2.29 434.1 -39.0 1.0 53 +55 4 -0.27 444.19 -39.0 1.0 54 +56 4 -38.44 416.26 -47.0 1.5 45 +57 4 -49.07 416.11 -48.0 1.5 56 +58 4 29.79 362.22 -51.0 2.0 38 +59 4 40.31 363.78 -51.0 2.0 58 +60 4 50.71 366.75 -51.0 3.0 59 +61 4 4.09 285.64 -25.0 1.5 30 +62 4 13.65 281.45 -25.0 1.5 61 +63 4 -25.07 234.31 -30.0 1.5 23 +64 4 -32.69 240.79 -29.0 1.5 63 +65 4 -39.66 248.03 -29.0 1.0 64 +66 4 -46.64 255.26 -29.0 1.0 65 +67 4 7.5 173.82 -30.0 1.0 17 +68 4 12.26 182.9 -29.0 2.25 67 +69 4 -13.4 169.28 -36.0 2.0 16 +70 4 -21.02 175.76 -33.0 2.0 69 +71 4 -28.64 182.23 -36.0 2.5 70 +72 4 11.85 146.51 -28.0 1.5 15 +73 4 20.73 150.78 -28.0 3.5 72 +74 4 -16.78 130.17 -30.0 1.5207 14 +75 4 -20.5 130.04 -30.0 2.0 74 +76 3 4.32 -18.33 0.0 2.5 1 +77 3 7.16 -22.71 1.0 1.5 76 +78 3 13.49 -30.71 1.0 2.0 77 +79 3 21.76 -36.42 -3.0 2.0 78 +80 3 32.61 -39.09 -5.0 1.5 79 +81 3 43.47 -41.75 -6.0 1.5 80 +82 3 51.93 -41.06 -6.0 1.0 81 +83 3 62.56 -40.91 -6.0 1.0 82 +84 3 72.65 -42.93 -7.0 1.0 83 +85 3 82.75 -44.94 -7.0 1.0 84 +86 3 93.61 -47.61 -8.0 1.5 85 +87 3 103.29 -53.21 -8.0 1.5 86 +88 3 113.38 -55.22 -9.0 1.5 87 +89 3 122.3 -60.18 -9.0 1.5 88 +90 3 23.43 -48.35 3.0 1.0 79 +91 3 31.7 -54.06 4.0 1.0 90 +92 3 42.56 -56.72 4.0 1.0 91 +93 3 -1.45 -17.03 -1.0 2.1506 1 +94 3 -6.05 -25.91 0.0 1.5 93 +95 3 -11.0 -34.83 -2.0 1.0 94 +96 3 -19.76 -40.51 -1.0 1.0 95 +97 3 -27.76 -46.83 1.0 1.0 96 +98 3 -35.0 -53.81 2.0 1.0 97 +99 3 -40.18 -59.9 4.0 1.0 98 +100 3 -45.13 -68.82 5.0 1.0 99 +101 3 -50.08 -77.73 8.0 1.0 100 +102 3 -54.38 -85.89 10.0 1.0 101 +103 3 -54.99 -95.87 10.0 1.0 102 +104 3 -57.0 -105.96 11.0 1.0 103 +105 3 -41.81 -51.52 2.0 1.2693 98 +106 3 -49.15 -54.25 2.0 1.3333 105 +107 3 -6.96 -40.89 -5.0 1.0 95 +108 3 -2.58 -51.17 -7.0 1.0 107 +109 3 -1.01 -61.69 -10.0 1.0 108 +110 3 1.84 -70.68 -11.0 1.0 109 +111 3 -0.82 -81.53 -13.0 1.5 110 +112 3 -0.66 -92.16 -14.0 1.5 111 +113 3 -4.09 -102.37 -15.0 1.5 112 +114 3 -8.28 -111.94 -16.0 1.5 113 +115 3 -7.7 -118.98 -19.0 1.0 114 +116 3 -6.79 -130.26 -21.0 1.5 115 +117 3 -6.63 -140.89 -23.0 1.5 116 +118 3 -10.06 -151.1 -24.0 1.5 117 +119 3 5.42 -71.09 -11.0 2.5 109 +120 3 9.04 -80.73 -13.0 1.5 119 +121 3 11.25 -90.48 -14.0 1.5 120 +122 3 15.29 -96.54 -18.0 1.5 121 +123 3 20.97 -105.3 -24.0 1.5 122 +124 3 22.84 -110.83 -26.0 1.5 123 +125 3 20.82 -120.92 -26.0 1.5 124 +126 3 -12.14 -14.17 3.0 2.3049 1 +127 3 -23.12 -16.66 6.0 1.0 126 +128 3 -32.87 -18.87 6.0 1.0 127 +129 3 -42.39 -23.9 8.0 1.0 128 +130 3 -55.74 -25.45 5.0 1.0541 129 +131 3 -67.32 -24.15 5.0 1.3017 130 +132 3 -76.81 -32.49 5.0 1.2134 131 +133 3 -85.84 -33.34 5.0 2.1213 132 +134 3 -22.46 -26.18 11.0 1.8333 126 +135 3 -32.88 -40.51 13.0 1.2133 134 +136 3 -43.11 -47.14 12.0 1.0 135 +137 3 -51.92 -60.86 12.0 1.5092 136 +138 3 -14.02 -6.34 3.0 2.5739 1 +139 3 -30.43 -5.19 5.0 1.0 138 +140 3 -41.06 -5.35 5.0 1.0 139 +141 3 -51.04 -4.74 3.0 1.0 140 +142 3 -61.67 -4.89 2.0 1.0 141 +143 3 -71.65 -4.29 1.0 1.0 142 +144 3 -82.93 -5.2 0.0 1.0 143 +145 3 -94.21 -6.12 0.0 1.0 144 +146 3 -38.36 -15.29 7.0 1.3333 139 +147 3 -45.07 -18.56 7.0 0.89754 146 +148 3 -50.51 -15.69 7.0 1.1667 147 +149 3 -58.94 -18.15 7.0 1.2693 148 +150 3 -26.71 -13.17 9.0 0.84984 138 +151 3 -41.67 -26.91 9.0 1.3333 150 +152 3 -48.31 -28.28 9.0 0.89753 151 diff --git a/demos/Fig2_elecModels/chans/CA1.morph.xml b/demos/Fig2_elecModels/chans/CA1.morph.xml new file mode 100644 index 0000000..2a3815b --- /dev/null +++ b/demos/Fig2_elecModels/chans/CA1.morph.xml @@ -0,0 +1,12673 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ModelViewParmSubset_5 + + + + ModelViewParmSubset_5 + + + + + + soma_group + + + + soma_group + + + + + + ModelViewParmSubset_7 + + + + ModelViewParmSubset_7 + + + + + + axon_group + soma_group + + + + + + all + + + + + + ModelViewParmSubset_2 + + + + ModelViewParmSubset_2 + + + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + all + + + + + + + + dendrite_group + + + + + + + + + + dendrite_group + + + + + + + + + + dendrite_group + + + + + + + + all + + + + + + ModelViewParmSubset_2 + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + + + + all + + + + + + + all + + + + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/CA1.morph.xml.REMOVED.git-id b/demos/Fig2_elecModels/chans/CA1.morph.xml.REMOVED.git-id new file mode 100644 index 0000000..be0ea2f --- /dev/null +++ b/demos/Fig2_elecModels/chans/CA1.morph.xml.REMOVED.git-id @@ -0,0 +1 @@ +2a3815b394f8bcb4b6450081d9ba45d20abdf3cf \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/Ca.xml b/demos/Fig2_elecModels/chans/Ca.xml new file mode 100644 index 0000000..645161c --- /dev/null +++ b/demos/Fig2_elecModels/chans/Ca.xml @@ -0,0 +1,62 @@ + + + + + A channel from Maex, R and De Schutter, E. Synchronization of Golgi and Granule Cell Firing in a + Detailed Network Model of the Cerebellar Granule Cell Layer + + + + + + + Voltage-gated Ca2+ channel, based on Traub + + + + Traub, R. + + + Upi Bhalla + NCBS + bhalla - at - ncbs.res.in + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig2_elecModels/chans/CaConc.xml b/demos/Fig2_elecModels/chans/CaConc.xml new file mode 100644 index 0000000..fe10a98 --- /dev/null +++ b/demos/Fig2_elecModels/chans/CaConc.xml @@ -0,0 +1,36 @@ + + + + Ca pool + + + Signifies that the ion is involved in a process which alters its concentration + + + + + + + Upi Bhalla + + + + An expontially decaying pool of calcium + + + + Upi Bhalla + National Centre for Biological Sciences, Bangalore, India. + bhalla - at - ncbs.res.in + + + + + + + + + + + + diff --git a/demos/Fig2_elecModels/chans/DoubExpSyn.xml b/demos/Fig2_elecModels/chans/DoubExpSyn.xml new file mode 100644 index 0000000..58cc74e --- /dev/null +++ b/demos/Fig2_elecModels/chans/DoubExpSyn.xml @@ -0,0 +1,32 @@ + + + + ChannelML file describing a single synaptic mechanism + + + + + + + Simple example of a synaptic mechanism, which consists of a postsynaptic conductance which changes as + double exponential function of time. Mappings exist for NEURON and GENESIS. + + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Receptor properties + http://senselab.med.yale.edu/senselab/NeuronDB/receptors2.asp + + + + + + + + diff --git a/demos/Fig2_elecModels/chans/Generated.net.xml b/demos/Fig2_elecModels/chans/Generated.net.xml new file mode 100644 index 0000000..d2f3f34 --- /dev/null +++ b/demos/Fig2_elecModels/chans/Generated.net.xml @@ -0,0 +1,59 @@ + + + + + +Network structure (NeuroML 1.x) for project: CA1PyramidalCell saved with neuroConstruct v1.7.1 on: 11:29:49, 18-Jul-14 + +Cell Group: CA1_CG contains 1 cells + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/Glu.xml b/demos/Fig2_elecModels/chans/Glu.xml new file mode 100644 index 0000000..c1a7d7c --- /dev/null +++ b/demos/Fig2_elecModels/chans/Glu.xml @@ -0,0 +1,16 @@ + + + + + Glutamate receptor synchan, 2 ms tau. + + + + Simple double exponential waveform glu synapse + + + diff --git a/demos/Fig2_elecModels/chans/HChannel.xml b/demos/Fig2_elecModels/chans/HChannel.xml new file mode 100644 index 0000000..c1c91b4 --- /dev/null +++ b/demos/Fig2_elecModels/chans/HChannel.xml @@ -0,0 +1,73 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and l traces on single comp with current pulse + + Padraig Gleeson + + + + H current. Comment from original mod: I-h channel from Magee 1998 for distal dendrites + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + diff --git a/demos/Fig2_elecModels/chans/KChannel_HH.xml b/demos/Fig2_elecModels/chans/KChannel_HH.xml new file mode 100644 index 0000000..dfd1d3c --- /dev/null +++ b/demos/Fig2_elecModels/chans/KChannel_HH.xml @@ -0,0 +1,49 @@ + + + + ChannelML file containing a single Channel description + + + + + Equations adapted from HH paper for modern convention of external potential being zero + + Padraig Gleeson + + + + Simple example of K conductance in squid giant axon. Based on channel from Hodgkin and Huxley 1952 + + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + A. L. Hodgkin and A. F. Huxley, A quantitative description of membrane current and its application + to conduction and excitation in nerve, J. Physiol., vol. 117, pp. 500-544, 1952. + http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=12991237 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/LeakConductance.xml b/demos/Fig2_elecModels/chans/LeakConductance.xml new file mode 100644 index 0000000..c40270d --- /dev/null +++ b/demos/Fig2_elecModels/chans/LeakConductance.xml @@ -0,0 +1,17 @@ + + + + ChannelML file containing a single Channel description + + + + + + 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. + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/NMDA.xml b/demos/Fig2_elecModels/chans/NMDA.xml new file mode 100644 index 0000000..ce7e3dd --- /dev/null +++ b/demos/Fig2_elecModels/chans/NMDA.xml @@ -0,0 +1,16 @@ + + + + + NMDA receptor synchan, 20 ms tau. + + + + Simple double exponential waveform NMDA synapse + + + diff --git a/demos/Fig2_elecModels/chans/NaChannel_HH.xml b/demos/Fig2_elecModels/chans/NaChannel_HH.xml new file mode 100644 index 0000000..5e52c69 --- /dev/null +++ b/demos/Fig2_elecModels/chans/NaChannel_HH.xml @@ -0,0 +1,58 @@ + + + + ChannelML file containing a single Channel description + + + + + Equations adapted from HH paper for modern convention of external potential being zero + + Padraig Gleeson + + + + Simple example of Na conductance in squid giant axon. Based on channel from Hodgkin and Huxley 1952 + + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + A. L. Hodgkin and A. F. Huxley, A quantitative description of membrane current and + its application to conduction and excitation in nerve, J. Physiol., vol. 117, pp. 500-544, 1952. + http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=12991237 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/hd.xml b/demos/Fig2_elecModels/chans/hd.xml new file mode 100644 index 0000000..a882baa --- /dev/null +++ b/demos/Fig2_elecModels/chans/hd.xml @@ -0,0 +1,73 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and l traces on single comp with current pulse + + Padraig Gleeson + + + + H current. Comment from original mod: I-h channel from Magee 1998 for distal dendrites + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/kad.xml b/demos/Fig2_elecModels/chans/kad.xml new file mode 100644 index 0000000..bb7c5af --- /dev/null +++ b/demos/Fig2_elecModels/chans/kad.xml @@ -0,0 +1,84 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + A type K channel for distal dendrites. Comment from original mod: K-A channel from Klee Ficker and Heinemann, modified to account for Dax A Current, M.Migliore Jun 1997 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/kap.xml b/demos/Fig2_elecModels/chans/kap.xml new file mode 100644 index 0000000..58fdea0 --- /dev/null +++ b/demos/Fig2_elecModels/chans/kap.xml @@ -0,0 +1,86 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + A type K channel. Comment from original mod: K-A channel from Klee Ficker and Heinemann, + modified to account for Dax A Current --- M.Migliore Jun 1997, + modified to be used with cvode M.Migliore 2001 + + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/kdr.xml b/demos/Fig2_elecModels/chans/kdr.xml new file mode 100644 index 0000000..180c563 --- /dev/null +++ b/demos/Fig2_elecModels/chans/kdr.xml @@ -0,0 +1,75 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + Delayed rectifier K channel. Comment from original mod: K-DR channel, from Klee Ficker and Heinemann, + modified to account for Dax et al., M.Migliore 1997 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/na3.xml b/demos/Fig2_elecModels/chans/na3.xml new file mode 100644 index 0000000..94e9713 --- /dev/null +++ b/demos/Fig2_elecModels/chans/na3.xml @@ -0,0 +1,107 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + Note: the inactivation gate s is not included here as it was disabled in original mod file for Migliore et al. Changing the parameter below ar from 1 will not enable s! + + Padraig Gleeson + + + + Na channel. Comment from original mod: Na current, modified from Jeff Magee. M.Migliore may97, + added sh to account for higher threshold M.Migliore, Apr.2002 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig2_elecModels/chans/nax.xml b/demos/Fig2_elecModels/chans/nax.xml new file mode 100644 index 0000000..1225d6a --- /dev/null +++ b/demos/Fig2_elecModels/chans/nax.xml @@ -0,0 +1,88 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + Na channel for axon. Comment from original mod: Na current for axon. No slow inact. M.Migliore Jul. 1997, + added sh to account for higher threshold M.Migliore, Apr.2002 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + + + diff --git a/demos/Fig2_elecModels/chans/pas.xml b/demos/Fig2_elecModels/chans/pas.xml new file mode 100644 index 0000000..9abffeb --- /dev/null +++ b/demos/Fig2_elecModels/chans/pas.xml @@ -0,0 +1,17 @@ + + + + ChannelML file containing a single Channel description + + + + + + 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. + + + + + + \ No newline at end of file diff --git a/demos/Fig3_chemModels/Fig3ABC.g b/demos/Fig3_chemModels/Fig3ABC.g new file mode 100644 index 0000000..d784b24 --- /dev/null +++ b/demos/Fig3_chemModels/Fig3ABC.g @@ -0,0 +1,832 @@ +//genesis +// kkit Version 11 flat dumpfile + +// Saved on Sun May 18 16:56:17 2014 + +include kkit {argv 1} + +FASTDT = 5e-05 +SIMDT = 0.01 +CONTROLDT = 10 +PLOTDT = 10 +MAXTIME = 10000 +TRANSIENT_TIME = 2 +VARIABLE_DT_FLAG = 1 +DEFAULT_VOL = 3e-18 +VERSION = 11.0 +setfield /file/modpath value /home2/bhalla/scripts/modules +kparms + +//genesis + +initdump -version 3 -ignoreorphans 1 +simobjdump doqcsinfo filename accessname accesstype transcriber developer \ + citation species tissue cellcompartment methodology sources \ + model_implementation model_validation x y z +simobjdump table input output alloced step_mode stepsize x y z +simobjdump xtree path script namemode sizescale +simobjdump xcoredraw xmin xmax ymin ymax +simobjdump xtext editable +simobjdump xgraph xmin xmax ymin ymax overlay +simobjdump xplot pixflags script fg ysquish do_slope wy +simobjdump group xtree_fg_req xtree_textfg_req plotfield expanded movealone \ + link savename file version md5sum mod_save_flag x y z +simobjdump geometry size dim shape outside xtree_fg_req xtree_textfg_req x y \ + z +simobjdump kpool DiffConst CoInit Co n nInit mwt nMin vol slave_enable \ + geomname xtree_fg_req xtree_textfg_req x y z +simobjdump kreac kf kb notes xtree_fg_req xtree_textfg_req x y z +simobjdump kenz CoComplexInit CoComplex nComplexInit nComplex vol k1 k2 k3 \ + keepconc usecomplex notes xtree_fg_req xtree_textfg_req link x y z +simobjdump stim level1 width1 delay1 level2 width2 delay2 baselevel trig_time \ + trig_mode notes xtree_fg_req xtree_textfg_req is_running x y z +simobjdump xtab input output alloced step_mode stepsize notes editfunc \ + xtree_fg_req xtree_textfg_req baselevel last_x last_y is_running x y z +simobjdump kchan perm gmax Vm is_active use_nernst notes xtree_fg_req \ + xtree_textfg_req x y z +simobjdump transport input output alloced step_mode stepsize dt delay clock \ + kf xtree_fg_req xtree_textfg_req x y z +simobjdump proto x y z +simobjdump text str +simundump geometry /kinetics/geometry 0 3e-18 3 sphere "" white black 0 0 0 +simundump text /kinetics/notes 0 "" +call /kinetics/notes LOAD \ +"" +simundump group /kinetics/lac_gene 0 yellow black x 0 0 "" lac_gene \ + /home2/bhalla/scripts/modules/lac_gene_0.g 0 0 0 27 0 0 +simundump text /kinetics/lac_gene/notes 0 \ + "This is a group of reactions resulting in the production\nof Lac" +call /kinetics/lac_gene/notes LOAD \ +"This is a group of reactions resulting in the production" \ +"of Lac" +simundump kpool /kinetics/lac_gene/l_op_2nd_bound[1] 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 52 yellow 26 -12 0 +simundump text /kinetics/lac_gene/l_op_2nd_bound[1]/notes 0 \ + "it represents the promotor with both of its sites\n bound by the inhibitor" +call /kinetics/lac_gene/l_op_2nd_bound[1]/notes LOAD \ +"it represents the promotor with both of its sites" \ +" bound by the inhibitor" +simundump kenz /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1 0 0 0 \ + 0 0 1800 0.0024998 0.002 0.0005 0 1 "" red 52 "" 26 -11 0 +simundump text /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1/notes 0 \ + "Rates from\nBox 1 Elowitz et al Nature (2000)\n403: 335-338" +call /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al Nature (2000)" \ +"403: 335-338" +simundump kreac /kinetics/lac_gene/inhib_reac[1] 0 0.0055556 0.09 "" white \ + yellow 30 -13 0 +simundump text /kinetics/lac_gene/inhib_reac[1]/notes 0 \ + "It signifies the first binding of the repressor\n with the operator\n\nKf=1 /nM/sec\nKb=9 /sec\n\nBox 1 Elowitz et al Nature 2000 vol 403:335-338" +call /kinetics/lac_gene/inhib_reac[1]/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=9 /sec" \ +"" \ +"Box 1 Elowitz et al Nature 2000 vol 403:335-338" +simundump kpool /kinetics/lac_gene/l_op_1rst_bound 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 2 yellow 33 -12 0 +simundump text /kinetics/lac_gene/l_op_1rst_bound/notes 0 \ + "it represents the promotor with one of its sites\n bound by the inhibitor" +call /kinetics/lac_gene/l_op_1rst_bound/notes LOAD \ +"it represents the promotor with one of its sites" \ +" bound by the inhibitor" +simundump kenz /kinetics/lac_gene/l_op_1rst_bound/lac_transcription 0 0 0 0 0 \ + 1800 0.0024998 0.002 0.0005 0 1 "" red 2 "" 33 -10 0 +simundump text /kinetics/lac_gene/l_op_1rst_bound/lac_transcription/notes 0 \ + "Rates from\nBox 1 Elowitz et al Nature 2000\n403: 335-338" +call /kinetics/lac_gene/l_op_1rst_bound/lac_transcription/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al Nature 2000" \ +"403: 335-338" +simundump kreac /kinetics/lac_gene/inhib_reac 0 0.0055556 2.24 "" white \ + yellow 36 -13 0 +simundump text /kinetics/lac_gene/inhib_reac/notes 0 \ + "It signifies the first binding of the repressor\n with the operator\n\nKf = 1 /nM/sec\nKb = 224 /sec\n\nBox 1 Elowitz et al Nature 2000 vol 403:335-338" +call /kinetics/lac_gene/inhib_reac/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf = 1 /nM/sec" \ +"Kb = 224 /sec" \ +"" \ +"Box 1 Elowitz et al Nature 2000 vol 403:335-338" +simundump kpool /kinetics/lac_gene/lac_operator 0 0 0.022222 0.022222 40 40 0 \ + 0 1800 0 /kinetics/geometry 36 yellow 40 -12 0 +simundump text /kinetics/lac_gene/lac_operator/notes 0 \ + "The lac operator under normal conditions\n drives transcription of lac\n\nElowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/lac_gene/lac_operator/notes LOAD \ +"The lac operator under normal conditions" \ +" drives transcription of lac" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +simundump kenz /kinetics/lac_gene/lac_operator/lac_transcription2 0 0 0 0 0 \ + 1800 2.4998 2 0.5 0 1 "" red 36 "" 40 -11 0 +simundump text /kinetics/lac_gene/lac_operator/lac_transcription2/notes 0 \ + "Rates from\nBox 1 Elowitz et al (2000)\n403:335-338" +call /kinetics/lac_gene/lac_operator/lac_transcription2/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"403:335-338" +simundump kpool /kinetics/lac_gene/lac_mRNA 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 12 yellow 26 -8 0 +simundump text /kinetics/lac_gene/lac_mRNA/notes 0 \ + "The m-RNA transcribed by the lac operator\n\nElowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/lac_gene/lac_mRNA/notes LOAD \ +"The m-RNA transcribed by the lac operator" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +simundump kenz /kinetics/lac_gene/lac_mRNA/lac_translation 0 0 0 0 0 1800 \ + 0.83494 0.668 0.167 0 1 "" red 12 "" 20 -10 0 +simundump text /kinetics/lac_gene/lac_mRNA/lac_translation/notes 0 \ + "Rates from \nBox 1 Elowitz et al Nature (2000)\n403: 335-338" +call /kinetics/lac_gene/lac_mRNA/lac_translation/notes LOAD \ +"Rates from " \ +"Box 1 Elowitz et al Nature (2000)" \ +"403: 335-338" +simundump kpool /kinetics/lac_gene/lac 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 62 yellow 20 -15 0 +simundump text /kinetics/lac_gene/lac/notes 0 \ + "Lac translated from lac m-RNA\nDerived from Figure 1(c) stochastic version\n\nElowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/lac_gene/lac/notes LOAD \ +"Lac translated from lac m-RNA" \ +"Derived from Figure 1(c) stochastic version" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +simundump kpool /kinetics/lac_gene/degraded_lac 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 2 yellow 20 -19 0 +simundump text /kinetics/lac_gene/degraded_lac/notes 0 \ + "Degradation product of lac protein" +call /kinetics/lac_gene/degraded_lac/notes LOAD \ +"Degradation product of lac protein" +simundump kpool /kinetics/lac_gene/degraded_lac_mRNA 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 1 yellow 33 -8 0 +simundump text /kinetics/lac_gene/degraded_lac_mRNA/notes 0 \ + "Degradation product of lac m-RNA" +call /kinetics/lac_gene/degraded_lac_mRNA/notes LOAD \ +"Degradation product of lac m-RNA" +simundump kreac /kinetics/lac_gene/lac_mRNA_degradation 0 0.005775 0 "" white \ + yellow 29 -7 0 +simundump text /kinetics/lac_gene/lac_mRNA_degradation/notes 0 \ + "This reaction denotes the degradation of the Lac m-RNA,\n the half life of which is two minutes.\nt1/2=.693/k where k denotes kf" +call /kinetics/lac_gene/lac_mRNA_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac m-RNA," \ +" the half life of which is two minutes." \ +"t1/2=.693/k where k denotes kf" +simundump kreac /kinetics/lac_gene/lac_degradation 0 0.016666 0 "" white \ + yellow 20 -17 0 +simundump text /kinetics/lac_gene/lac_degradation/notes 0 \ + "This reaction denotes the degradation of the Lac\n the half life of which is ten minutes.\nt1/2=.693/k where k denotes kf\n\nNote: Rates had to scaled by approx 1.4 to get desired levels\n\nElowitz et al Nature 2000. Vol403 335-338" +call /kinetics/lac_gene/lac_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac" \ +" the half life of which is ten minutes." \ +"t1/2=.693/k where k denotes kf" \ +"" \ +"Note: Rates had to scaled by approx 1.4 to get desired levels" \ +"" \ +"Elowitz et al Nature 2000. Vol403 335-338" +simundump kpool /kinetics/lac_gene/AminoAcids 0 0 0.00055555 0.00055555 \ + 0.99999 0.99999 0 0 1800 4 /kinetics/geometry 52 yellow 20 -8 0 +simundump text /kinetics/lac_gene/AminoAcids/notes 0 "" +call /kinetics/lac_gene/AminoAcids/notes LOAD \ +"" +simundump kpool /kinetics/lac_gene/Nucleotides 0 0 0.00055555 0.00055555 \ + 0.99999 0.99999 0 0 1800 4 /kinetics/geometry 6 yellow 40 -8 0 +simundump text /kinetics/lac_gene/Nucleotides/notes 0 "" +call /kinetics/lac_gene/Nucleotides/notes LOAD \ +"" +simundump group /kinetics/TetR_gene 0 61 black x 0 0 "" TetR_gene \ + /home2/bhalla/scripts/modules/TetR_gene_0.g 0 0 0 -2 0 0 +simundump text /kinetics/TetR_gene/notes 0 \ + "This is a group of reactions resulting in the production\nof Tet R" +call /kinetics/TetR_gene/notes LOAD \ +"This is a group of reactions resulting in the production" \ +"of Tet R" +simundump kpool /kinetics/TetR_gene/l_op_2nd_bound[1] 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 46 61 -3 -12 0 +simundump text /kinetics/TetR_gene/l_op_2nd_bound[1]/notes 0 \ + "it represents the promotor with both of its sites\n bound by the inhibitor" +call /kinetics/TetR_gene/l_op_2nd_bound[1]/notes LOAD \ +"it represents the promotor with both of its sites" \ +" bound by the inhibitor" +simundump kenz /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1 0 0 \ + 0 0 0 1800 0.0024998 0.002 0.0005 0 1 "" red 46 "" -3 -11 0 +simundump text /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1/notes 0 \ + "Rates from \nBox 1 Elowitz et al (2000)\nNature 403:335-338" +call /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1/notes LOAD \ +"Rates from " \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +simundump kreac /kinetics/TetR_gene/inhib_reac[1] 0 0.0055556 0.09 "" white \ + 61 1 -13 0 +simundump text /kinetics/TetR_gene/inhib_reac[1]/notes 0 \ + "It signifies the first binding of the repressor\n with the operator\n\nKf = 1 /nM/sec\nKb = 9 /sec\n\nBox 1 Elowitz et al Nature 2000 vol 403:335-338" +call /kinetics/TetR_gene/inhib_reac[1]/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf = 1 /nM/sec" \ +"Kb = 9 /sec" \ +"" \ +"Box 1 Elowitz et al Nature 2000 vol 403:335-338" +simundump kpool /kinetics/TetR_gene/l_op_1rst_bound 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 2 61 4 -12 0 +simundump text /kinetics/TetR_gene/l_op_1rst_bound/notes 0 \ + "it represents the promotor with one of its sites\n bound by the inhibitor" +call /kinetics/TetR_gene/l_op_1rst_bound/notes LOAD \ +"it represents the promotor with one of its sites" \ +" bound by the inhibitor" +simundump kenz /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription 0 0 0 0 \ + 0 1800 0.0024998 0.002 0.0005 0 1 "" red 2 "" 4 -10 0 +simundump text /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription/notes 0 \ + "Rates from \nBox 1 Elowitz et al (2000)\nNature 403:335-338" +call /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription/notes LOAD \ +"Rates from " \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +simundump kreac /kinetics/TetR_gene/inhib_reac 0 0.0055556 2.24 "" white 61 7 \ + -13 0 +simundump text /kinetics/TetR_gene/inhib_reac/notes 0 \ + "It signifies the first binding of the repressor\n with the operator\n\nKf=1 /nM/sec\nKb=224 /sec\n\nBox1 Elowitz etal Nature 2000 vol 403:335-338" +call /kinetics/TetR_gene/inhib_reac/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=224 /sec" \ +"" \ +"Box1 Elowitz etal Nature 2000 vol 403:335-338" +simundump kpool /kinetics/TetR_gene/TetR 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 11 61 -9 -15 0 +simundump text /kinetics/TetR_gene/TetR/notes 0 \ + "Lac translated from lac m-RNA\nDerived from Figure 1(c) stochastic version\n\nElowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/TetR_gene/TetR/notes LOAD \ +"Lac translated from lac m-RNA" \ +"Derived from Figure 1(c) stochastic version" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +simundump kpool /kinetics/TetR_gene/degraded_TetR 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 2 61 -9 -19 0 +simundump text /kinetics/TetR_gene/degraded_TetR/notes 0 \ + "Degradation product of lac protein" +call /kinetics/TetR_gene/degraded_TetR/notes LOAD \ +"Degradation product of lac protein" +simundump kreac /kinetics/TetR_gene/TetR_degradation 0 0.01666 0 "" white 61 \ + -9 -17 0 +simundump text /kinetics/TetR_gene/TetR_degradation/notes 0 \ + "This reaction denotes the degradation of the Lac\n the half life of which is ten minutes.\nt1/2=.693/k where k denotes kf\n\nNote: Rates had to be scaled by 1.4 to get appropriate levels\n\nElowitz etal Nature 2000. Vol403 335-338" +call /kinetics/TetR_gene/TetR_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac" \ +" the half life of which is ten minutes." \ +"t1/2=.693/k where k denotes kf" \ +"" \ +"Note: Rates had to be scaled by 1.4 to get appropriate levels" \ +"" \ +"Elowitz etal Nature 2000. Vol403 335-338" +simundump kpool /kinetics/TetR_gene/TetR_mRNA 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 12 61 -3 -8 0 +simundump text /kinetics/TetR_gene/TetR_mRNA/notes 0 \ + "The m-RNA transcribed by the lac operator\n\nElowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/TetR_gene/TetR_mRNA/notes LOAD \ +"The m-RNA transcribed by the lac operator" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +simundump kenz /kinetics/TetR_gene/TetR_mRNA/TetR_translation 0 0 0 0 0 1800 \ + 0.83494 0.668 0.167 0 1 "" red 12 "" -9 -10 0 +simundump text /kinetics/TetR_gene/TetR_mRNA/TetR_translation/notes 0 \ + "Rates from\nBox 1 Elowitz et al (2000)\nNature 403:335-338" +call /kinetics/TetR_gene/TetR_mRNA/TetR_translation/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +simundump kreac /kinetics/TetR_gene/TetR_mRNA_degradation 0 0.005775 0 "" \ + white 61 1 -7 0 +simundump text /kinetics/TetR_gene/TetR_mRNA_degradation/notes 0 \ + "This reaction denotes the degradation of the Lac m-RNA,\n the half life of which is two minutes.\nt1/2=.693/k where k denotes kf" +call /kinetics/TetR_gene/TetR_mRNA_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac m-RNA," \ +" the half life of which is two minutes." \ +"t1/2=.693/k where k denotes kf" +simundump kpool /kinetics/TetR_gene/degraded_TetR_mRNA 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 1 61 4 -8 0 +simundump text /kinetics/TetR_gene/degraded_TetR_mRNA/notes 0 \ + "Degradation product of lac m-RNA" +call /kinetics/TetR_gene/degraded_TetR_mRNA/notes LOAD \ +"Degradation product of lac m-RNA" +simundump kpool /kinetics/TetR_gene/TetR_operator 0 0 0.022222 0.022222 40 40 \ + 0 0 1800 0 /kinetics/geometry 36 61 11 -12 0 +simundump text /kinetics/TetR_gene/TetR_operator/notes 0 \ + "The lac operator under normal conditions\n drives transcription of lac\n\nElowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/TetR_gene/TetR_operator/notes LOAD \ +"The lac operator under normal conditions" \ +" drives transcription of lac" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +simundump kenz /kinetics/TetR_gene/TetR_operator/TetR_transcription2 0 0 0 0 \ + 0 1800 2.4998 2 0.5 0 1 "" red 36 "" 11 -11 0 +simundump text /kinetics/TetR_gene/TetR_operator/TetR_transcription2/notes 0 \ + "Rates from\nBox 1 Elowitz et al (2000)\nNature 403:335-338" +call /kinetics/TetR_gene/TetR_operator/TetR_transcription2/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +simundump kpool /kinetics/TetR_gene/Nucleotides 0 0 0.00055555 0.00055555 \ + 0.99999 0.99999 0 0 1800 4 /kinetics/geometry blue 61 11 -8 0 +simundump text /kinetics/TetR_gene/Nucleotides/notes 0 "" +call /kinetics/TetR_gene/Nucleotides/notes LOAD \ +"" +simundump kpool /kinetics/TetR_gene/AminoAcids 0 0 0.00055555 0.00055555 \ + 0.99999 0.99999 0 0 1800 4 /kinetics/geometry blue 61 -9 -8 0 +simundump text /kinetics/TetR_gene/AminoAcids/notes 0 "" +call /kinetics/TetR_gene/AminoAcids/notes LOAD \ +"" +simundump group /kinetics/Lcl 0 15 black x 0 0 "" yellow \ + /home2/bhalla/scripts/modules/yellow_0.g 0 0 0 56 0 0 +simundump text /kinetics/Lcl/notes 0 \ + "This is a group of reactions resulting in the production\nof Lambda cl" +call /kinetics/Lcl/notes LOAD \ +"This is a group of reactions resulting in the production" \ +"of Lambda cl" +simundump kpool /kinetics/Lcl/l_op_2nd_bound[1] 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 52 15 55 -12 0 +simundump text /kinetics/Lcl/l_op_2nd_bound[1]/notes 0 \ + "it represents the promotor with both of its sites\n bound by the inhibitor" +call /kinetics/Lcl/l_op_2nd_bound[1]/notes LOAD \ +"it represents the promotor with both of its sites" \ +" bound by the inhibitor" +simundump kenz /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1 0 0 0 0 0 \ + 1800 0.0024998 0.002 0.0005 0 1 "" red 52 "" 55 -11 0 +simundump text /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1/notes 0 "" +call /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1/notes LOAD \ +"" +simundump kreac /kinetics/Lcl/inhib_reac[1] 0 0.0055556 0.09 "" white 15 59 \ + -13 0 +simundump text /kinetics/Lcl/inhib_reac[1]/notes 0 \ + "It signifies the first binding of the repressor\n with the operator\n\nKf=1 /nM/sec\nKb=9 /sec\n\nBox1 Elowitz etal Nature 2000 vol 403:335-338" +call /kinetics/Lcl/inhib_reac[1]/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=9 /sec" \ +"" \ +"Box1 Elowitz etal Nature 2000 vol 403:335-338" +simundump kpool /kinetics/Lcl/l_op_1rst_bound 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 2 15 62 -12 0 +simundump text /kinetics/Lcl/l_op_1rst_bound/notes 0 \ + "it represents the promotor with one of its sites\n bound by the inhibitor" +call /kinetics/Lcl/l_op_1rst_bound/notes LOAD \ +"it represents the promotor with one of its sites" \ +" bound by the inhibitor" +simundump kenz /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription 0 0 0 0 0 1800 \ + 0.0024998 0.002 0.0005 0 1 "" red 2 "" 62 -10 0 +simundump text /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription/notes 0 \ + "Rates from\nBox 1 Elowitz et al (2000)\nNature 403:335-338" +call /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +simundump kreac /kinetics/Lcl/inhib_reac 0 0.0055556 2.24 "" white 15 65 -13 \ + 0 +simundump text /kinetics/Lcl/inhib_reac/notes 0 \ + "It signifies the first binding of the repressor\n with the operator\n\nKf=1 /nM/sec\nKb=224 /sec\n\nBox1 Elowitz etal Nature 2000 vol 403:335-338" +call /kinetics/Lcl/inhib_reac/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=224 /sec" \ +"" \ +"Box1 Elowitz etal Nature 2000 vol 403:335-338" +simundump kpool /kinetics/Lcl/AminoAcids 0 0 0.00055555 0.00055555 0.99999 \ + 0.99999 0 0 1800 4 /kinetics/geometry 52 15 48 -8 0 +simundump text /kinetics/Lcl/AminoAcids/notes 0 "" +call /kinetics/Lcl/AminoAcids/notes LOAD \ +"" +simundump kpool /kinetics/Lcl/Nucleotides 0 0 0.00055555 0.00055555 0.99999 \ + 0.99999 0 0 1800 4 /kinetics/geometry 6 15 69 -8 0 +simundump text /kinetics/Lcl/Nucleotides/notes 0 "" +call /kinetics/Lcl/Nucleotides/notes LOAD \ +"" +simundump kreac /kinetics/Lcl/Lcl_mRNA_degradation 0 0.005775 0 "" white 15 \ + 58 -7 0 +simundump text /kinetics/Lcl/Lcl_mRNA_degradation/notes 0 \ + "This reaction denotes the degradation of the Lac m-RNA,\n the half life of which is two minutes.\nt1/2=.693/k where k denotes kf" +call /kinetics/Lcl/Lcl_mRNA_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac m-RNA," \ +" the half life of which is two minutes." \ +"t1/2=.693/k where k denotes kf" +simundump kpool /kinetics/Lcl/Lcl_mRNA 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 5 15 55 -8 0 +simundump text /kinetics/Lcl/Lcl_mRNA/notes 0 \ + "The m-RNA transcribed by the lac operator\n\nElowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/Lcl/Lcl_mRNA/notes LOAD \ +"The m-RNA transcribed by the lac operator" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +simundump kenz /kinetics/Lcl/Lcl_mRNA/Lcl_translation 0 0 0 0 0 1800 0.83494 \ + 0.668 0.167 0 1 "" red 5 "" 48 -10 0 +simundump text /kinetics/Lcl/Lcl_mRNA/Lcl_translation/notes 0 \ + "Rates from\nBox 1 Elowitz et al (2003)\nNature 403:335-338" +call /kinetics/Lcl/Lcl_mRNA/Lcl_translation/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2003)" \ +"Nature 403:335-338" +simundump kpool /kinetics/Lcl/Lcl 0 0 0.055555 0.055555 99.999 99.999 0 0 \ + 1800 0 /kinetics/geometry 24 15 48 -15 0 +simundump text /kinetics/Lcl/Lcl/notes 0 \ + "Lac translated from lac m-RNA\nDerived from Figure 1(c) stochastic version\n\nElowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/Lcl/Lcl/notes LOAD \ +"Lac translated from lac m-RNA" \ +"Derived from Figure 1(c) stochastic version" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +simundump kreac /kinetics/Lcl/Lcl_degradation 0 0.016666 0 "" white 15 48 -17 \ + 0 +simundump text /kinetics/Lcl/Lcl_degradation/notes 0 \ + "This reaction denotes the degradation of the Lac\n the half life of which is ten minutes.\nt1/2=.693/k where k denotes kf\n\nNote: Rates had to be scaled by 1.4 to get the desired levels\n\nElowitz etal Nature 2000. Vol403 335-338" +call /kinetics/Lcl/Lcl_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac" \ +" the half life of which is ten minutes." \ +"t1/2=.693/k where k denotes kf" \ +"" \ +"Note: Rates had to be scaled by 1.4 to get the desired levels" \ +"" \ +"Elowitz etal Nature 2000. Vol403 335-338" +simundump kpool /kinetics/Lcl/degraded_Lcl 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 2 15 48 -19 0 +simundump text /kinetics/Lcl/degraded_Lcl/notes 0 \ + "Degradation product of lac protein" +call /kinetics/Lcl/degraded_Lcl/notes LOAD \ +"Degradation product of lac protein" +simundump kpool /kinetics/Lcl/degraded_Lcl_mRNA 0 0 0 0 0 0 0 0 1800 0 \ + /kinetics/geometry 1 15 62 -8 0 +simundump text /kinetics/Lcl/degraded_Lcl_mRNA/notes 0 \ + "Degradation product of lac m-RNA" +call /kinetics/Lcl/degraded_Lcl_mRNA/notes LOAD \ +"Degradation product of lac m-RNA" +simundump kpool /kinetics/Lcl/Lcl_operator 0 0 0.022222 0.022222 40 40 0 0 \ + 1800 0 /kinetics/geometry 36 15 69 -12 0 +simundump text /kinetics/Lcl/Lcl_operator/notes 0 \ + "The lac operator under normal conditions\n drives transcription of lac\n\nElowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/Lcl/Lcl_operator/notes LOAD \ +"The lac operator under normal conditions" \ +" drives transcription of lac" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +simundump kenz /kinetics/Lcl/Lcl_operator/Lcl_transcription2 0 0 0 0 0 1800 \ + 2.4998 2 0.5 0 1 "" red 36 "" 69 -11 0 +simundump text /kinetics/Lcl/Lcl_operator/Lcl_transcription2/notes 0 \ + "Rates from\nBox 1 Elowitz et al (2003)\nNature 403:335-338" +call /kinetics/Lcl/Lcl_operator/Lcl_transcription2/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2003)" \ +"Nature 403:335-338" +simundump text /kinetics/geometry/notes 0 "" +call /kinetics/geometry/notes LOAD \ +"" +simundump xgraph /graphs/conc1 0 0 10000 0 2.0691 0 +simundump xgraph /graphs/conc2 0 0 10000 0 3.33 0 +simundump xplot /graphs/conc1/TetR.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 11 0 0 1 +simundump xplot /graphs/conc1/lac.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 62 0 0 1 +simundump xplot /graphs/conc1/Lcl.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 24 0 0 1 +simundump xgraph /moregraphs/conc3 0 0 10000 0 95.756 0 +simundump xgraph /moregraphs/conc4 0 0 10000 0 1 0 +simundump xcoredraw /edit/draw 0 -11 71 -21 2 +simundump xtree /edit/draw/tree 0 \ + /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \ + "edit_elm.D ; drag_from_edit.w " auto 0.6 +simundump xtext /file/notes 0 1 +xtextload /file/notes \ +"Repressilator model: A synthetic oscillatory network" \ +"of transcriptional regulators designed by Michael B. Elowitz and" \ +"Stanislas Leibler 2000 Nature 403(6767):335-338" +addmsg /kinetics/lac_gene/inhib_reac[1] /kinetics/lac_gene/l_op_2nd_bound[1] REAC B A +addmsg /kinetics/lac_gene/l_op_2nd_bound[1] /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1 ENZYME n +addmsg /kinetics/lac_gene/Nucleotides /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1 SUBSTRATE n +addmsg /kinetics/lac_gene/l_op_1rst_bound /kinetics/lac_gene/inhib_reac[1] SUBSTRATE n +addmsg /kinetics/lac_gene/l_op_2nd_bound[1] /kinetics/lac_gene/inhib_reac[1] PRODUCT n +addmsg /kinetics/Lcl/Lcl /kinetics/lac_gene/inhib_reac[1] SUBSTRATE n +addmsg /kinetics/lac_gene/inhib_reac /kinetics/lac_gene/l_op_1rst_bound REAC B A +addmsg /kinetics/lac_gene/inhib_reac[1] /kinetics/lac_gene/l_op_1rst_bound REAC A B +addmsg /kinetics/lac_gene/l_op_1rst_bound /kinetics/lac_gene/l_op_1rst_bound/lac_transcription ENZYME n +addmsg /kinetics/lac_gene/Nucleotides /kinetics/lac_gene/l_op_1rst_bound/lac_transcription SUBSTRATE n +addmsg /kinetics/lac_gene/lac_operator /kinetics/lac_gene/inhib_reac SUBSTRATE n +addmsg /kinetics/lac_gene/l_op_1rst_bound /kinetics/lac_gene/inhib_reac PRODUCT n +addmsg /kinetics/Lcl/Lcl /kinetics/lac_gene/inhib_reac SUBSTRATE n +addmsg /kinetics/lac_gene/inhib_reac /kinetics/lac_gene/lac_operator REAC A B +addmsg /kinetics/lac_gene/lac_operator /kinetics/lac_gene/lac_operator/lac_transcription2 ENZYME n +addmsg /kinetics/lac_gene/Nucleotides /kinetics/lac_gene/lac_operator/lac_transcription2 SUBSTRATE n +addmsg /kinetics/lac_gene/lac_mRNA_degradation /kinetics/lac_gene/lac_mRNA REAC A B +addmsg /kinetics/lac_gene/lac_operator/lac_transcription2 /kinetics/lac_gene/lac_mRNA MM_PRD pA +addmsg /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1 /kinetics/lac_gene/lac_mRNA MM_PRD pA +addmsg /kinetics/lac_gene/l_op_1rst_bound/lac_transcription /kinetics/lac_gene/lac_mRNA MM_PRD pA +addmsg /kinetics/lac_gene/lac_mRNA /kinetics/lac_gene/lac_mRNA/lac_translation ENZYME n +addmsg /kinetics/lac_gene/AminoAcids /kinetics/lac_gene/lac_mRNA/lac_translation SUBSTRATE n +addmsg /kinetics/lac_gene/lac_degradation /kinetics/lac_gene/lac REAC A B +addmsg /kinetics/lac_gene/lac_mRNA/lac_translation /kinetics/lac_gene/lac MM_PRD pA +addmsg /kinetics/TetR_gene/inhib_reac /kinetics/lac_gene/lac REAC A B +addmsg /kinetics/TetR_gene/inhib_reac[1] /kinetics/lac_gene/lac REAC A B +addmsg /kinetics/lac_gene/lac_degradation /kinetics/lac_gene/degraded_lac REAC B A +addmsg /kinetics/lac_gene/lac_mRNA_degradation /kinetics/lac_gene/degraded_lac_mRNA REAC B A +addmsg /kinetics/lac_gene/lac_mRNA /kinetics/lac_gene/lac_mRNA_degradation SUBSTRATE n +addmsg /kinetics/lac_gene/degraded_lac_mRNA /kinetics/lac_gene/lac_mRNA_degradation PRODUCT n +addmsg /kinetics/lac_gene/degraded_lac /kinetics/lac_gene/lac_degradation PRODUCT n +addmsg /kinetics/lac_gene/lac /kinetics/lac_gene/lac_degradation SUBSTRATE n +addmsg /kinetics/lac_gene/lac_mRNA/lac_translation /kinetics/lac_gene/AminoAcids REAC sA B +addmsg /kinetics/lac_gene/lac_operator/lac_transcription2 /kinetics/lac_gene/Nucleotides REAC sA B +addmsg /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1 /kinetics/lac_gene/Nucleotides REAC sA B +addmsg /kinetics/lac_gene/l_op_1rst_bound/lac_transcription /kinetics/lac_gene/Nucleotides REAC sA B +addmsg /kinetics/TetR_gene/inhib_reac[1] /kinetics/TetR_gene/l_op_2nd_bound[1] REAC B A +addmsg /kinetics/TetR_gene/l_op_2nd_bound[1] /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1 ENZYME n +addmsg /kinetics/TetR_gene/Nucleotides /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1 SUBSTRATE n +addmsg /kinetics/TetR_gene/l_op_2nd_bound[1] /kinetics/TetR_gene/inhib_reac[1] PRODUCT n +addmsg /kinetics/TetR_gene/l_op_1rst_bound /kinetics/TetR_gene/inhib_reac[1] SUBSTRATE n +addmsg /kinetics/lac_gene/lac /kinetics/TetR_gene/inhib_reac[1] SUBSTRATE n +addmsg /kinetics/TetR_gene/inhib_reac[1] /kinetics/TetR_gene/l_op_1rst_bound REAC A B +addmsg /kinetics/TetR_gene/inhib_reac /kinetics/TetR_gene/l_op_1rst_bound REAC B A +addmsg /kinetics/TetR_gene/l_op_1rst_bound /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription ENZYME n +addmsg /kinetics/TetR_gene/Nucleotides /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription SUBSTRATE n +addmsg /kinetics/TetR_gene/l_op_1rst_bound /kinetics/TetR_gene/inhib_reac PRODUCT n +addmsg /kinetics/TetR_gene/TetR_operator /kinetics/TetR_gene/inhib_reac SUBSTRATE n +addmsg /kinetics/lac_gene/lac /kinetics/TetR_gene/inhib_reac SUBSTRATE n +addmsg /kinetics/TetR_gene/TetR_mRNA/TetR_translation /kinetics/TetR_gene/TetR MM_PRD pA +addmsg /kinetics/TetR_gene/TetR_degradation /kinetics/TetR_gene/TetR REAC A B +addmsg /kinetics/Lcl/inhib_reac[1] /kinetics/TetR_gene/TetR REAC A B +addmsg /kinetics/Lcl/inhib_reac /kinetics/TetR_gene/TetR REAC A B +addmsg /kinetics/TetR_gene/TetR_degradation /kinetics/TetR_gene/degraded_TetR REAC B A +addmsg /kinetics/TetR_gene/TetR /kinetics/TetR_gene/TetR_degradation SUBSTRATE n +addmsg /kinetics/TetR_gene/degraded_TetR /kinetics/TetR_gene/TetR_degradation PRODUCT n +addmsg /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1 /kinetics/TetR_gene/TetR_mRNA MM_PRD pA +addmsg /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription /kinetics/TetR_gene/TetR_mRNA MM_PRD pA +addmsg /kinetics/TetR_gene/TetR_operator/TetR_transcription2 /kinetics/TetR_gene/TetR_mRNA MM_PRD pA +addmsg /kinetics/TetR_gene/TetR_mRNA_degradation /kinetics/TetR_gene/TetR_mRNA REAC A B +addmsg /kinetics/TetR_gene/TetR_mRNA /kinetics/TetR_gene/TetR_mRNA/TetR_translation ENZYME n +addmsg /kinetics/TetR_gene/AminoAcids /kinetics/TetR_gene/TetR_mRNA/TetR_translation SUBSTRATE n +addmsg /kinetics/TetR_gene/TetR_mRNA /kinetics/TetR_gene/TetR_mRNA_degradation SUBSTRATE n +addmsg /kinetics/TetR_gene/degraded_TetR_mRNA /kinetics/TetR_gene/TetR_mRNA_degradation PRODUCT n +addmsg /kinetics/TetR_gene/TetR_mRNA_degradation /kinetics/TetR_gene/degraded_TetR_mRNA REAC B A +addmsg /kinetics/TetR_gene/inhib_reac /kinetics/TetR_gene/TetR_operator REAC A B +addmsg /kinetics/TetR_gene/TetR_operator /kinetics/TetR_gene/TetR_operator/TetR_transcription2 ENZYME n +addmsg /kinetics/TetR_gene/Nucleotides /kinetics/TetR_gene/TetR_operator/TetR_transcription2 SUBSTRATE n +addmsg /kinetics/TetR_gene/TetR_operator/TetR_transcription2 /kinetics/TetR_gene/Nucleotides REAC sA B +addmsg /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription /kinetics/TetR_gene/Nucleotides REAC sA B +addmsg /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1 /kinetics/TetR_gene/Nucleotides REAC sA B +addmsg /kinetics/TetR_gene/TetR_mRNA/TetR_translation /kinetics/TetR_gene/AminoAcids REAC sA B +addmsg /kinetics/Lcl/inhib_reac[1] /kinetics/Lcl/l_op_2nd_bound[1] REAC B A +addmsg /kinetics/Lcl/l_op_2nd_bound[1] /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1 ENZYME n +addmsg /kinetics/Lcl/Nucleotides /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1 SUBSTRATE n +addmsg /kinetics/Lcl/l_op_2nd_bound[1] /kinetics/Lcl/inhib_reac[1] PRODUCT n +addmsg /kinetics/Lcl/l_op_1rst_bound /kinetics/Lcl/inhib_reac[1] SUBSTRATE n +addmsg /kinetics/TetR_gene/TetR /kinetics/Lcl/inhib_reac[1] SUBSTRATE n +addmsg /kinetics/Lcl/inhib_reac[1] /kinetics/Lcl/l_op_1rst_bound REAC A B +addmsg /kinetics/Lcl/inhib_reac /kinetics/Lcl/l_op_1rst_bound REAC B A +addmsg /kinetics/Lcl/l_op_1rst_bound /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription ENZYME n +addmsg /kinetics/Lcl/Nucleotides /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription SUBSTRATE n +addmsg /kinetics/Lcl/l_op_1rst_bound /kinetics/Lcl/inhib_reac PRODUCT n +addmsg /kinetics/Lcl/Lcl_operator /kinetics/Lcl/inhib_reac SUBSTRATE n +addmsg /kinetics/TetR_gene/TetR /kinetics/Lcl/inhib_reac SUBSTRATE n +addmsg /kinetics/Lcl/Lcl_mRNA/Lcl_translation /kinetics/Lcl/AminoAcids REAC sA B +addmsg /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1 /kinetics/Lcl/Nucleotides REAC sA B +addmsg /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription /kinetics/Lcl/Nucleotides REAC sA B +addmsg /kinetics/Lcl/Lcl_operator/Lcl_transcription2 /kinetics/Lcl/Nucleotides REAC sA B +addmsg /kinetics/Lcl/Lcl_mRNA /kinetics/Lcl/Lcl_mRNA_degradation SUBSTRATE n +addmsg /kinetics/Lcl/degraded_Lcl_mRNA /kinetics/Lcl/Lcl_mRNA_degradation PRODUCT n +addmsg /kinetics/Lcl/l_op_2nd_bound[1]/Lcl_transcription1 /kinetics/Lcl/Lcl_mRNA MM_PRD pA +addmsg /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription /kinetics/Lcl/Lcl_mRNA MM_PRD pA +addmsg /kinetics/Lcl/Lcl_operator/Lcl_transcription2 /kinetics/Lcl/Lcl_mRNA MM_PRD pA +addmsg /kinetics/Lcl/Lcl_mRNA_degradation /kinetics/Lcl/Lcl_mRNA REAC A B +addmsg /kinetics/Lcl/Lcl_mRNA /kinetics/Lcl/Lcl_mRNA/Lcl_translation ENZYME n +addmsg /kinetics/Lcl/AminoAcids /kinetics/Lcl/Lcl_mRNA/Lcl_translation SUBSTRATE n +addmsg /kinetics/Lcl/Lcl_mRNA/Lcl_translation /kinetics/Lcl/Lcl MM_PRD pA +addmsg /kinetics/Lcl/Lcl_degradation /kinetics/Lcl/Lcl REAC A B +addmsg /kinetics/lac_gene/inhib_reac /kinetics/Lcl/Lcl REAC A B +addmsg /kinetics/lac_gene/inhib_reac[1] /kinetics/Lcl/Lcl REAC A B +addmsg /kinetics/Lcl/Lcl /kinetics/Lcl/Lcl_degradation SUBSTRATE n +addmsg /kinetics/Lcl/degraded_Lcl /kinetics/Lcl/Lcl_degradation PRODUCT n +addmsg /kinetics/Lcl/Lcl_degradation /kinetics/Lcl/degraded_Lcl REAC B A +addmsg /kinetics/Lcl/Lcl_mRNA_degradation /kinetics/Lcl/degraded_Lcl_mRNA REAC B A +addmsg /kinetics/Lcl/inhib_reac /kinetics/Lcl/Lcl_operator REAC A B +addmsg /kinetics/Lcl/Lcl_operator /kinetics/Lcl/Lcl_operator/Lcl_transcription2 ENZYME n +addmsg /kinetics/Lcl/Nucleotides /kinetics/Lcl/Lcl_operator/Lcl_transcription2 SUBSTRATE n +addmsg /kinetics/TetR_gene/TetR /graphs/conc1/TetR.Co PLOT Co *TetR.Co *11 +addmsg /kinetics/lac_gene/lac /graphs/conc1/lac.Co PLOT Co *lac.Co *62 +addmsg /kinetics/Lcl/Lcl /graphs/conc1/Lcl.Co PLOT Co *Lcl.Co *24 +enddump +// End of dump + +call /kinetics/lac_gene/notes LOAD \ +"This is a group of reactions resulting in the production" \ +"of Lac" +call /kinetics/lac_gene/l_op_2nd_bound[1]/notes LOAD \ +"it represents the promotor with both of its sites" \ +" bound by the inhibitor" +call /kinetics/lac_gene/l_op_2nd_bound[1]/lac_transcription1/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al Nature (2000)" \ +"403: 335-338" +call /kinetics/lac_gene/inhib_reac[1]/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=9 /sec" \ +"" \ +"Box 1 Elowitz et al Nature 2000 vol 403:335-338" +call /kinetics/lac_gene/l_op_1rst_bound/notes LOAD \ +"it represents the promotor with one of its sites" \ +" bound by the inhibitor" +call /kinetics/lac_gene/l_op_1rst_bound/lac_transcription/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al Nature 2000" \ +"403: 335-338" +call /kinetics/lac_gene/inhib_reac/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf = 1 /nM/sec" \ +"Kb = 224 /sec" \ +"" \ +"Box 1 Elowitz et al Nature 2000 vol 403:335-338" +call /kinetics/lac_gene/lac_operator/notes LOAD \ +"The lac operator under normal conditions" \ +" drives transcription of lac" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/lac_gene/lac_operator/lac_transcription2/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"403:335-338" +call /kinetics/lac_gene/lac_mRNA/notes LOAD \ +"The m-RNA transcribed by the lac operator" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/lac_gene/lac_mRNA/lac_translation/notes LOAD \ +"Rates from " \ +"Box 1 Elowitz et al Nature (2000)" \ +"403: 335-338" +call /kinetics/lac_gene/lac/notes LOAD \ +"Lac translated from lac m-RNA" \ +"Derived from Figure 1(c) stochastic version" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/lac_gene/degraded_lac/notes LOAD \ +"Degradation product of lac protein" +call /kinetics/lac_gene/degraded_lac_mRNA/notes LOAD \ +"Degradation product of lac m-RNA" +call /kinetics/lac_gene/lac_mRNA_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac m-RNA," \ +" the half life of which is two minutes." \ +"t1/2=.693/k where k denotes kf" +call /kinetics/lac_gene/lac_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac" \ +" the half life of which is ten minutes." \ +"t1/2=.693/k where k denotes kf" \ +"" \ +"Note: Rates had to scaled by approx 1.4 to get desired levels" \ +"" \ +"Elowitz et al Nature 2000. Vol403 335-338" +call /kinetics/TetR_gene/notes LOAD \ +"This is a group of reactions resulting in the production" \ +"of Tet R" +call /kinetics/TetR_gene/l_op_2nd_bound[1]/notes LOAD \ +"it represents the promotor with both of its sites" \ +" bound by the inhibitor" +call /kinetics/TetR_gene/l_op_2nd_bound[1]/TetR_transcription1/notes LOAD \ +"Rates from " \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +call /kinetics/TetR_gene/inhib_reac[1]/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf = 1 /nM/sec" \ +"Kb = 9 /sec" \ +"" \ +"Box 1 Elowitz et al Nature 2000 vol 403:335-338" +call /kinetics/TetR_gene/l_op_1rst_bound/notes LOAD \ +"it represents the promotor with one of its sites" \ +" bound by the inhibitor" +call /kinetics/TetR_gene/l_op_1rst_bound/TetR_transcription/notes LOAD \ +"Rates from " \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +call /kinetics/TetR_gene/inhib_reac/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=224 /sec" \ +"" \ +"Box1 Elowitz etal Nature 2000 vol 403:335-338" +call /kinetics/TetR_gene/TetR/notes LOAD \ +"Lac translated from lac m-RNA" \ +"Derived from Figure 1(c) stochastic version" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/TetR_gene/degraded_TetR/notes LOAD \ +"Degradation product of lac protein" +call /kinetics/TetR_gene/TetR_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac" \ +" the half life of which is ten minutes." \ +"t1/2=.693/k where k denotes kf" \ +"" \ +"Note: Rates had to be scaled by 1.4 to get appropriate levels" \ +"" \ +"Elowitz etal Nature 2000. Vol403 335-338" +call /kinetics/TetR_gene/TetR_mRNA/notes LOAD \ +"The m-RNA transcribed by the lac operator" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/TetR_gene/TetR_mRNA/TetR_translation/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +call /kinetics/TetR_gene/TetR_mRNA_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac m-RNA," \ +" the half life of which is two minutes." \ +"t1/2=.693/k where k denotes kf" +call /kinetics/TetR_gene/degraded_TetR_mRNA/notes LOAD \ +"Degradation product of lac m-RNA" +call /kinetics/TetR_gene/TetR_operator/notes LOAD \ +"The lac operator under normal conditions" \ +" drives transcription of lac" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/TetR_gene/TetR_operator/TetR_transcription2/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +call /kinetics/Lcl/notes LOAD \ +"This is a group of reactions resulting in the production" \ +"of Lambda cl" +call /kinetics/Lcl/l_op_2nd_bound[1]/notes LOAD \ +"it represents the promotor with both of its sites" \ +" bound by the inhibitor" +call /kinetics/Lcl/inhib_reac[1]/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=9 /sec" \ +"" \ +"Box1 Elowitz etal Nature 2000 vol 403:335-338" +call /kinetics/Lcl/l_op_1rst_bound/notes LOAD \ +"it represents the promotor with one of its sites" \ +" bound by the inhibitor" +call /kinetics/Lcl/l_op_1rst_bound/Lcl_transcription/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2000)" \ +"Nature 403:335-338" +call /kinetics/Lcl/inhib_reac/notes LOAD \ +"It signifies the first binding of the repressor" \ +" with the operator" \ +"" \ +"Kf=1 /nM/sec" \ +"Kb=224 /sec" \ +"" \ +"Box1 Elowitz etal Nature 2000 vol 403:335-338" +call /kinetics/Lcl/Lcl_mRNA_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac m-RNA," \ +" the half life of which is two minutes." \ +"t1/2=.693/k where k denotes kf" +call /kinetics/Lcl/Lcl_mRNA/notes LOAD \ +"The m-RNA transcribed by the lac operator" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/Lcl/Lcl_mRNA/Lcl_translation/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2003)" \ +"Nature 403:335-338" +call /kinetics/Lcl/Lcl/notes LOAD \ +"Lac translated from lac m-RNA" \ +"Derived from Figure 1(c) stochastic version" \ +"" \ +"Elowitz et al Nature 2000 Vol 403:335-338" +call /kinetics/Lcl/Lcl_degradation/notes LOAD \ +"This reaction denotes the degradation of the Lac" \ +" the half life of which is ten minutes." \ +"t1/2=.693/k where k denotes kf" \ +"" \ +"Note: Rates had to be scaled by 1.4 to get the desired levels" \ +"" \ +"Elowitz etal Nature 2000. Vol403 335-338" +call /kinetics/Lcl/degraded_Lcl/notes LOAD \ +"Degradation product of lac protein" +call /kinetics/Lcl/degraded_Lcl_mRNA/notes LOAD \ +"Degradation product of lac m-RNA" +call /kinetics/Lcl/Lcl_operator/notes LOAD \ +"The lac operator under normal conditions" \ +" drives transcription of lac" \ +"" \ +"Elowitz etal Nature 2000 Vol 403:335-338" +call /kinetics/Lcl/Lcl_operator/Lcl_transcription2/notes LOAD \ +"Rates from" \ +"Box 1 Elowitz et al (2003)" \ +"Nature 403:335-338" +complete_loading diff --git a/demos/Fig3_chemModels/Fig3D.py b/demos/Fig3_chemModels/Fig3D.py new file mode 100644 index 0000000..531758b --- /dev/null +++ b/demos/Fig3_chemModels/Fig3D.py @@ -0,0 +1,67 @@ +import numpy +import pylab +import moose +import time + +''' +This example implements a reaction-diffusion like system which is +bistable and propagates losslessly. It is based on the NEURON example +rxdrun.py, but incorporates more compartments and runs for a longer time. +The system is implemented in a function rather than as a proper system +of chemical reactions. Please see rxdReacDiffusion.py for a variant that +uses a reaction plus a function object to control its rates. +''' + +dt = 0.1 + +# define the geometry +compt = moose.CylMesh( '/cylinder' ) +compt.r0 = compt.r1 = 1 +compt.x1 = 100 +compt.diffLength = 0.2 +assert( compt.numDiffCompts == compt.x1/compt.diffLength ) + +#define the molecule. Its geometry is defined by its parent volume, cylinder +c = moose.Pool( '/cylinder/pool' ) +c.diffConst = 1 # define diffusion constant + +# Here we set up a function calculation +func = moose.Function( '/cylinder/pool/func' ) +func.expr = "-x0 * (0.3 - x0) * (1 - x0)" +func.x.num = 1 #specify number of input variables. + +#Connect the molecules to the func +moose.connect( c, 'nOut', func.x[0], 'input' ) +#Connect the function to the pool +moose.connect( func, 'valueOut', c, 'increment' ) + +#Set up solvers +ksolve = moose.Ksolve( '/cylinder/ksolve' ) +dsolve = moose.Dsolve( '/cylinder/dsolve' ) +stoich = moose.Stoich( '/cylinder/stoich' ) +stoich.compartment = compt +stoich.ksolve = ksolve +stoich.dsolve = dsolve +stoich.path = '/cylinder/##' +for i in range( 10, 18 ): + moose.setClock( i, dt ) + +#initialize +x = numpy.arange( 0, compt.x1, compt.diffLength ) +c.vec.nInit = [ (q < 0.2 * compt.x1) for q in x ] + +# Run and plot it. +moose.reinit() +updateDt = 50 +runtime = updateDt * 4 +plt = pylab.plot( x, c.vec.n, label='t = 0 ') +t1 = time.time() +for t in range( 0, runtime-1, updateDt ): + moose.start( updateDt ) + plt = pylab.plot( x, c.vec.n, label='t = '+str(t + updateDt) ) +print("Time = ", time.time() - t1) + +pylab.ylim( 0, 1.05 ) +pylab.legend() +pylab.show() + diff --git a/demos/Fig3_chemModels/Fig3_NEURON.py b/demos/Fig3_chemModels/Fig3_NEURON.py new file mode 100644 index 0000000..6032b2c --- /dev/null +++ b/demos/Fig3_chemModels/Fig3_NEURON.py @@ -0,0 +1,44 @@ +from neuron import h, rxd +import numpy +from matplotlib import pyplot +import time + +# needed for standard run system +h.load_file('stdrun.hoc') + +dend = h.Section() +dend.nseg = 501 + +# WHERE the dynamics will take place +where = rxd.Region(h.allsec()) + +# WHO the actors are +u = rxd.Species(where, d=1, initial=0) + +# HOW they act +bistable_reaction = rxd.Rate(u, -u * (1 - u) * (0.3 - u)) + +# initial conditions +h.finitialize() +for node in u.nodes: + if node.x < .2: node.concentration = 1 + +def plot_it(color='k'): + y = u.nodes.concentration + x = u.nodes.x + + # convert x from normalized position to microns + x = dend.L * numpy.array(x) + + pyplot.plot(x, y, color) + +plot_it('r') +interval = 50 + +t1 = time.time() +for i in range(1, 5): + h.continuerun(i * interval) + plot_it() +print("Time = ", time.time() - t1) + +pyplot.show() diff --git a/demos/Fig4_ReacDiff/CaMKII_merged77.g b/demos/Fig4_ReacDiff/CaMKII_merged77.g new file mode 100644 index 0000000..41b8311 --- /dev/null +++ b/demos/Fig4_ReacDiff/CaMKII_merged77.g @@ -0,0 +1,2076 @@ +//genesis +// kkit Version 11 flat dumpfile + +// Saved on Sun Nov 15 09:10:36 2015 + +include kkit {argv 1} + +FASTDT = 0.0001 +SIMDT = 0.001 +CONTROLDT = 10 +PLOTDT = 10 +MAXTIME = 2000 +TRANSIENT_TIME = 10 +VARIABLE_DT_FLAG = 1 +DEFAULT_VOL = 1e-20 +VERSION = 11.0 +setfield /file/modpath value /home2/bhalla/scripts/modules +kparms + +//genesis + +initdump -version 3 -ignoreorphans 1 +simobjdump doqcsinfo filename accessname accesstype transcriber developer \ + citation species tissue cellcompartment methodology sources \ + model_implementation model_validation x y z +simobjdump table input output alloced step_mode stepsize x y z +simobjdump xtree path script namemode sizescale +simobjdump xcoredraw xmin xmax ymin ymax +simobjdump xtext editable +simobjdump xgraph xmin xmax ymin ymax overlay +simobjdump xplot pixflags script fg ysquish do_slope wy +simobjdump group xtree_fg_req xtree_textfg_req plotfield expanded movealone \ + link savename file version md5sum mod_save_flag x y z +simobjdump geometry size dim shape outside xtree_fg_req xtree_textfg_req x y \ + z +simobjdump kpool DiffConst CoInit Co n nInit mwt nMin vol slave_enable \ + geomname xtree_fg_req xtree_textfg_req x y z +simobjdump kreac kf kb notes xtree_fg_req xtree_textfg_req x y z +simobjdump kenz CoComplexInit CoComplex nComplexInit nComplex vol k1 k2 k3 \ + keepconc usecomplex notes xtree_fg_req xtree_textfg_req link x y z +simobjdump stim level1 width1 delay1 level2 width2 delay2 baselevel trig_time \ + trig_mode notes xtree_fg_req xtree_textfg_req is_running x y z +simobjdump xtab input output alloced step_mode stepsize notes editfunc \ + xtree_fg_req xtree_textfg_req baselevel last_x last_y is_running x y z +simobjdump kchan perm gmax Vm is_active use_nernst notes xtree_fg_req \ + xtree_textfg_req x y z +simobjdump transport input output alloced step_mode stepsize dt delay clock \ + kf xtree_fg_req xtree_textfg_req x y z +simobjdump proto x y z +simobjdump text str +simundump geometry /kinetics/geometry 0 1e-20 3 sphere "" white black -4 -26 \ + 0 +simundump geometry /kinetics/geometry[1] 0 1e-18 3 sphere "" white black 1 \ + -24 0 +simundump geometry /kinetics/geometry[2] 0 9e-20 3 sphere "" white black 4 \ + -20 0 +simundump geometry /kinetics/geometry[3] 0 1e-20 3 sphere "" white black 3 -6 \ + 0 +simundump geometry /kinetics/geometry[4] 0 1e-18 3 sphere "" white black -2 \ + -12 0 +simundump geometry /kinetics/geometry[5] 0 1e-18 3 sphere "" white black 9 \ + -11 0 +simundump geometry /kinetics/geometry[6] 0 9e-20 3 sphere "" white black 10 \ + -15 0 +simundump geometry /kinetics/geometry[7] 0 1e-20 3 sphere "" white black 0 0 \ + 0 +simundump text /kinetics/notes 0 "" +call /kinetics/notes LOAD \ +"" +simundump text /kinetics/geometry/notes 0 "" +call /kinetics/geometry/notes LOAD \ +"" +simundump text /kinetics/geometry[1]/notes 0 "" +call /kinetics/geometry[1]/notes LOAD \ +"" +simundump text /kinetics/geometry[2]/notes 0 "" +call /kinetics/geometry[2]/notes LOAD \ +"" +simundump text /kinetics/geometry[3]/notes 0 "" +call /kinetics/geometry[3]/notes LOAD \ +"" +simundump text /kinetics/geometry[4]/notes 0 "" +call /kinetics/geometry[4]/notes LOAD \ +"" +simundump text /kinetics/geometry[5]/notes 0 "" +call /kinetics/geometry[5]/notes LOAD \ +"" +simundump text /kinetics/geometry[6]/notes 0 "" +call /kinetics/geometry[6]/notes LOAD \ +"" +simundump text /kinetics/geometry[7]/notes 0 "" +call /kinetics/geometry[7]/notes LOAD \ +"" +simundump group /kinetics/PSD 0 20 black x 0 0 "" PSD defaultfile.g 0 0 0 27 \ + 12 0 +simundump text /kinetics/PSD/notes 0 "" +call /kinetics/PSD/notes LOAD \ +"" +simundump kpool /kinetics/PSD/tot_PSD_R 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry blue 0 -4 7 0 +simundump text /kinetics/PSD/tot_PSD_R/notes 0 "" +call /kinetics/PSD/tot_PSD_R/notes LOAD \ +"" +simundump kpool /kinetics/PSD/actCaMKII 0 0 2 2 12 12 0 0 6 0 \ + /kinetics/geometry 12 20 70 33 0 +simundump text /kinetics/PSD/actCaMKII/notes 0 "" +call /kinetics/PSD/actCaMKII/notes LOAD \ +"" +simundump kenz /kinetics/PSD/actCaMKII/CaMKII_1 0 0 0 0 0 6 0.083325 8 2 0 0 \ + "" red 35 "" -6 3 0 +simundump text /kinetics/PSD/actCaMKII/CaMKII_1/notes 0 "" +call /kinetics/PSD/actCaMKII/CaMKII_1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/actCaMKII/CaMKII_2 0 0 0 0 0 6 0.083325 8 2 0 0 \ + "" red 35 "" -2 3 0 +simundump text /kinetics/PSD/actCaMKII/CaMKII_2/notes 0 "" +call /kinetics/PSD/actCaMKII/CaMKII_2/notes LOAD \ +"" +simundump group /kinetics/PSD/PP1_PSD 1 yellow 20 x 0 0 "" PP1_PSD \ + /home2/bhalla/scripts/modules/PP1_PSD_0.g 0 \ + 62a600ae10e53f567e47decb4f2b6488 0 12 27 0 +simundump text /kinetics/PSD/PP1_PSD/notes 0 "" +call /kinetics/PSD/PP1_PSD/notes LOAD \ +"" +simundump kpool /kinetics/PSD/PP1_PSD/PP1-active 1 0 4 4 24 24 0 0 6 0 \ + /kinetics/geometry cyan yellow 44 25 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-active/notes 0 \ + "Cohen et al Meth Enz 159 390-408 is main source of info\nconc = 1.8 uM" +call /kinetics/PSD/PP1_PSD/PP1-active/notes LOAD \ +"Cohen et al Meth Enz 159 390-408 is main source of info" \ +"conc = 1.8 uM" +simundump kenz /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286 0 0 0 0 0 54.001 \ + 0.083333 2 0.5 0 0 "" red cyan "" 61 25 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286/notes LOAD \ +"" +simundump kenz /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b 0 0 0 0 0 54.001 \ + 0.083333 2 0.5 0 0 "" red cyan "" 71 25 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b/notes LOAD \ +"" +simundump kenz /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305 0 0 0 0 0 54.001 \ + 0.083333 2 0.5 0 0 "" red cyan "" 78 25 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305/notes LOAD \ +"" +simundump kenz /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c 0 0 0 0 0 54.001 \ + 0.020833 0.5 0.125 0 0 "" red cyan "" 88 25 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c/notes LOAD \ +"" +simundump kenz /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a 0 0 0 0 0 54.001 \ + 0.083333 2 0.5 0 0 "" red cyan "" 83 25 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a/notes LOAD \ +"" +simundump kpool /kinetics/PSD/PP1_PSD/I1 1 0 4 4 24 24 0 0 6 0 \ + /kinetics/geometry orange yellow 35.35 21.88 0 +simundump text /kinetics/PSD/PP1_PSD/I1/notes 0 \ + "I1 is a 'mixed' inhibitor, but at high enz concs it looks like a non-compet\ninhibitor (Foulkes et al Eur J Biochem 132 309-313 9183).\nWe treat it as non-compet, so it just turns the enz off\nwithout interacting with the binding site.\nCohen et al ann rev bioch refer to results where conc is \n1.5 to 1.8 uM. In order to get complete inhib of PP1, which is at 1.8 uM,\nwe need >= 1.8 uM.\n\n" +call /kinetics/PSD/PP1_PSD/I1/notes LOAD \ +"I1 is a 'mixed' inhibitor, but at high enz concs it looks like a non-compet" \ +"inhibitor (Foulkes et al Eur J Biochem 132 309-313 9183)." \ +"We treat it as non-compet, so it just turns the enz off" \ +"without interacting with the binding site." \ +"Cohen et al ann rev bioch refer to results where conc is " \ +"1.5 to 1.8 uM. In order to get complete inhib of PP1, which is at 1.8 uM," \ +"we need >= 1.8 uM." \ +"" \ +"" +simundump kpool /kinetics/PSD/PP1_PSD/PP1-I1 1 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry brown yellow 36 29 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-I1/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-I1/notes LOAD \ +"" +simundump kreac /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 1 1 0 "" white yellow 33 \ + 26 0 +simundump text /kinetics/PSD/PP1_PSD/dissoc-PP1-I1/notes 0 \ + "Let us assume that the equil in this case is very far over to the\nright. This is probably safe.\n" +call /kinetics/PSD/PP1_PSD/dissoc-PP1-I1/notes LOAD \ +"Let us assume that the equil in this case is very far over to the" \ +"right. This is probably safe." \ +"" +simundump kreac /kinetics/PSD/PP1_PSD/Inact-PP1 1 83.33 0.1 "" white yellow \ + 17 26 0 +simundump text /kinetics/PSD/PP1_PSD/Inact-PP1/notes 0 \ + "K inhib = 1nM from Cohen Ann Rev Bioch 1989, \n4 nM from Foukes et al \nAssume 2 nM. kf /kb = 8.333e-4" +call /kinetics/PSD/PP1_PSD/Inact-PP1/notes LOAD \ +"K inhib = 1nM from Cohen Ann Rev Bioch 1989, " \ +"4 nM from Foukes et al " \ +"Assume 2 nM. kf /kb = 8.333e-4" +simundump kpool /kinetics/PSD/PP1_PSD/PP1-I1_p 1 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry brown yellow 22 29 0 +simundump text /kinetics/PSD/PP1_PSD/PP1-I1_p/notes 0 "" +call /kinetics/PSD/PP1_PSD/PP1-I1_p/notes LOAD \ +"" +simundump kpool /kinetics/PSD/PP1_PSD/I1_p 1 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry orange yellow 21 22 0 +simundump text /kinetics/PSD/PP1_PSD/I1_p/notes 0 \ + "Dephosph is mainly by PP2B" +call /kinetics/PSD/PP1_PSD/I1_p/notes LOAD \ +"Dephosph is mainly by PP2B" +simundump kpool /kinetics/PSD/PP1_PSD/CaN 0 0 1 1 6 6 0 0 6 0 \ + /kinetics/geometry 1 yellow -1 33 0 +simundump text /kinetics/PSD/PP1_PSD/CaN/notes 0 "" +call /kinetics/PSD/PP1_PSD/CaN/notes LOAD \ +"" +simundump kreac /kinetics/PSD/PP1_PSD/CaM-Bind-CaN 0 7.6667 0.5 "" white \ + yellow 21 40 0 +simundump text /kinetics/PSD/PP1_PSD/CaM-Bind-CaN/notes 0 "" +call /kinetics/PSD/PP1_PSD/CaM-Bind-CaN/notes LOAD \ +"" +simundump kpool /kinetics/PSD/PP1_PSD/Ca2_CaN 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry blue yellow 12 33 0 +simundump text /kinetics/PSD/PP1_PSD/Ca2_CaN/notes 0 "" +call /kinetics/PSD/PP1_PSD/Ca2_CaN/notes LOAD \ +"" +simundump kreac /kinetics/PSD/PP1_PSD/Ca_bind_CaN 0 0.69444 1 "" white yellow \ + 7 40 0 +simundump text /kinetics/PSD/PP1_PSD/Ca_bind_CaN/notes 0 "" +call /kinetics/PSD/PP1_PSD/Ca_bind_CaN/notes LOAD \ +"" +simundump kreac /kinetics/PSD/move_to_PSD 0 0.1 3 "" white 0 -8 -5 0 +simundump text /kinetics/PSD/move_to_PSD/notes 0 "" +call /kinetics/PSD/move_to_PSD/notes LOAD \ +"" +simundump kpool /kinetics/PSD/R_S2 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry 4 0 \ + -8 1 0 +simundump text /kinetics/PSD/R_S2/notes 0 "" +call /kinetics/PSD/R_S2/notes LOAD \ +"" +simundump kpool /kinetics/PSD/R_SpS 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry \ + blue 0 -4 1 0 +simundump text /kinetics/PSD/R_SpS/notes 0 "" +call /kinetics/PSD/R_SpS/notes LOAD \ +"" +simundump kpool /kinetics/PSD/R_SpSp 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry \ + 28 0 0 1 0 +simundump text /kinetics/PSD/R_SpSp/notes 0 "" +call /kinetics/PSD/R_SpSp/notes LOAD \ +"" +simundump kpool /kinetics/PSD/basal_phosphatase 0 0 1 1 6 6 0 0 6 0 \ + /kinetics/geometry 61 0 -4 -2 0 +simundump text /kinetics/PSD/basal_phosphatase/notes 0 \ + "There isn't any clear info for this. I had originally called \nit PP2A, but that causes odd interactions with other pathways.\n" +call /kinetics/PSD/basal_phosphatase/notes LOAD \ +"There isn't any clear info for this. I had originally called " \ +"it PP2A, but that causes odd interactions with other pathways." \ +"" +simundump kenz /kinetics/PSD/basal_phosphatase/P1 0 0 0 0 0 60 0.62499 \ + 0.59998 0.15 0 0 "" red 61 "" -6 -1 0 +simundump text /kinetics/PSD/basal_phosphatase/P1/notes 0 "" +call /kinetics/PSD/basal_phosphatase/P1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/basal_phosphatase/P2 0 0 0 0 0 60 0.62499 \ + 0.59998 0.15 0 0 "" red 61 "" -2 -1 0 +simundump text /kinetics/PSD/basal_phosphatase/P2/notes 0 "" +call /kinetics/PSD/basal_phosphatase/P2/notes LOAD \ +"" +simundump kpool /kinetics/PSD/PKA-active 1 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry yellow 20 14 17 0 +simundump text /kinetics/PSD/PKA-active/notes 0 "" +call /kinetics/PSD/PKA-active/notes LOAD \ +"" +simundump kenz /kinetics/PSD/PKA-active/PKA-phosph-I1 0 0 0 0 0 54.001 \ + 0.012345 4 1 0 0 "" red 27 "" 27 19 0 +simundump text /kinetics/PSD/PKA-active/PKA-phosph-I1/notes 0 "" +call /kinetics/PSD/PKA-active/PKA-phosph-I1/notes LOAD \ +"" +simundump group /kinetics/PSD/CaMKII_PSD 0 33 20 x 0 0 "" CaMKII_PSD \ + defaultfile.g 0 0 0 39 32 0 +simundump text /kinetics/PSD/CaMKII_PSD/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/tot-auto 0 0 2 0.5 3 12 0 0 6 0 \ + /kinetics/geometry 29 33 74 36 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-auto/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-auto/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph 0 0 0 0 0 7.732 \ + 0.066667 8 2 0 0 "" red 29 "" 72 23 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286 0 0 0 0 0 7.732 \ + 0.016667 2 0.5 0 0 "" red 29 "" 59 23 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305 0 0 0 0 0 54.001 \ + 0.2 24 6 0 0 "" red 29 "" 78 23 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/tot_CaMKII 0 0 2 2 12 12 0 0 6 0 \ + /kinetics/geometry 23 33 84 36 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot_CaMKII/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot_CaMKII/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/286P 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 59 33 52 33 0 +simundump text /kinetics/PSD/CaMKII_PSD/286P/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/286P/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 47 33 61 33 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph 0 0 0 0 \ + 0 7.732 0.10417 8 2 0 0 "" red 47 "" 72 20 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph/notes 0 \ + "" +call /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305 0 0 0 0 0 \ + 54.001 0.3125 24 6 0 0 "" red 47 "" 78 20 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286 0 0 0 0 0 \ + 7.732 0.026042 2 0.5 0 0 "" red 47 "" 60 20 0 +simundump text /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/basal_CaMKII 0 0 0.5 0.5 3 3 0 0 6 0 \ + /kinetics/geometry blue 33 81 33 0 +simundump text /kinetics/PSD/CaMKII_PSD/basal_CaMKII/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/basal_CaMKII/notes LOAD \ +"" +simundump kreac /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM 0 10.945 \ + 0.0022 "" white 33 54 28 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM/notes 0 \ + "Same values as for the main compartment\nCan the main compartment pool of Ca/CaM be used?" +call /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM/notes LOAD \ +"Same values as for the main compartment" \ +"Can the main compartment pool of Ca/CaM be used?" +simundump kreac /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM 0 10.945 2.2 "" \ + white 33 65 28 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/NMDAR 0 0 40 40 240 240 0 0 6 0 \ + /kinetics/geometry blue 33 67 8 0 +simundump text /kinetics/PSD/CaMKII_PSD/NMDAR/notes 0 \ + "The stochiometry is a bit off here. Each NMDAR actually\nbinds to a holoenzyme, about 12 CaMKII subunits. But\nour CaMKII calculations are in terms of individual\nsubunits. So as a hack, we put in much more NMDAR than\nis actually there.\n\nDec 2011: Reconsidered this, now only 120 NMDARs.\n\nJune 02 2012. Consider these as anchor points for a dodecamer.\nThere are far more effected CaMKII bindin...." +call /kinetics/PSD/CaMKII_PSD/NMDAR/notes LOAD \ +"The stochiometry is a bit off here. Each NMDAR actually" \ +"binds to a holoenzyme, about 12 CaMKII subunits. But" \ +"our CaMKII calculations are in terms of individual" \ +"subunits. So as a hack, we put in much more NMDAR than" \ +"is actually there." \ +"" \ +"Dec 2011: Reconsidered this, now only 120 NMDARs." \ +"" \ +"June 02 2012. Consider these as anchor points for a dodecamer." \ +"There are far more effected CaMKII binding sites then, than" \ +"individual molecules of NMDAR. Raised limit to 40." +simundump kreac /kinetics/PSD/CaMKII_PSD/transloc_2 0 0.002 0 "" white 33 56 \ + 12 0 +simundump text /kinetics/PSD/CaMKII_PSD/transloc_2/notes 0 \ + "Same as for transloc_1\n\n\n" +call /kinetics/PSD/CaMKII_PSD/transloc_2/notes LOAD \ +"Same as for transloc_1" \ +"" \ +"" \ +"" +simundump kreac /kinetics/PSD/CaMKII_PSD/transloc_1 0 0.002 0 "" white 33 63 \ + 12 0 +simundump text /kinetics/PSD/CaMKII_PSD/transloc_1/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/transloc_1/notes LOAD \ +"" +simundump kreac /kinetics/PSD/CaMKII_PSD/back_1 0 0.04 6.6667e-06 "" white 33 \ + 75 12 0 +simundump text /kinetics/PSD/CaMKII_PSD/back_1/notes 0 \ + "Rates set by the translocation experiments of \nShen and Meyer, Science 1999." +call /kinetics/PSD/CaMKII_PSD/back_1/notes LOAD \ +"Rates set by the translocation experiments of " \ +"Shen and Meyer, Science 1999." +simundump kreac /kinetics/PSD/CaMKII_PSD/back_2 0 0.04 6.6667e-06 "" white 33 \ + 89 13 0 +simundump text /kinetics/PSD/CaMKII_PSD/back_2/notes 0 "Same as for back_1\n" +call /kinetics/PSD/CaMKII_PSD/back_2/notes LOAD \ +"Same as for back_1" \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM 0 0 0 0 0 0 0 0 6 \ + 0 /kinetics/geometry 47 33 56 22 0 +simundump text /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 50 33 63 22 0 +simundump text /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/sCaMKII 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 62 33 75 22 0 +simundump text /kinetics/PSD/CaMKII_PSD/sCaMKII/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/sCaMKII/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 0 33 81 22 0 +simundump text /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 30 33 88 22 0 +simundump text /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/CaMKII-CaM 0 1e-12 0 0 0 0 0 0 6 0 \ + /kinetics/geometry[7] 50 black 66 17 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII-CaM/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII-CaM/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/CaMKII_p_p_p 0 1e-12 0 0 0 0 0 0 6 0 \ + /kinetics/geometry[7] 2 black 84 17 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII_p_p_p/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII_p_p_p/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-CaM 0 1e-12 0 0 0 0 0 \ + 0 6 0 /kinetics/geometry[7] 46 black 58 17 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-CaM/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-CaM/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/CaMKII 0 5e-13 0 0 0 0 0 0 6 0 \ + /kinetics/geometry[7] 61 black 78 17 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/CaMKII-thr305 0 1e-12 0 0 0 0 0 0 6 \ + 0 /kinetics/geometry[7] 36 black 91 17 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII-thr305/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII-thr305/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry 57 33 69 22 0 +simundump text /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaMKII_PSD/CaMKII-thr286 0 1e-12 0 0 0 0 0 0 6 \ + 0 /kinetics/geometry[7] 54 black 73 17 0 +simundump text /kinetics/PSD/CaMKII_PSD/CaMKII-thr286/notes 0 "" +call /kinetics/PSD/CaMKII_PSD/CaMKII-thr286/notes LOAD \ +"" +simundump kpool /kinetics/PSD/PP2A 1 0 1 1 6 6 0 0 6 0 /kinetics/geometry red \ + 20 45 17 0 +simundump text /kinetics/PSD/PP2A/notes 0 "" +call /kinetics/PSD/PP2A/notes LOAD \ +"" +simundump kenz /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p 1 0 0 0 0 54.001 \ + 0.0013289 0.92593 0.22222 0 0 "" red red "" 29 27 0 +simundump text /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p/notes 0 \ + "k1 changed from 3.3e-6 to 6.6e-6\n" +call /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p/notes LOAD \ +"k1 changed from 3.3e-6 to 6.6e-6" \ +"" +simundump kenz /kinetics/PSD/PP2A/PP2A-dephosph-I1 1 0 0 0 0 54.001 0.0013289 \ + 0.92593 0.22222 0 0 "" red red "" 27 20 0 +simundump text /kinetics/PSD/PP2A/PP2A-dephosph-I1/notes 0 \ + "PP2A does most of the dephosph of I1 at basal Ca levels. See\nthe review by Cohen in Ann Rev Biochem 1989.\nFor now, lets halve Km. k1 was 3.3e-6, now 6.6e-6\n" +call /kinetics/PSD/PP2A/PP2A-dephosph-I1/notes LOAD \ +"PP2A does most of the dephosph of I1 at basal Ca levels. See" \ +"the review by Cohen in Ann Rev Biochem 1989." \ +"For now, lets halve Km. k1 was 3.3e-6, now 6.6e-6" \ +"" +simundump group /kinetics/PSD/CaM 1 blue 20 x 0 0 "" defaultfile \ + defaultfile.g 0 fbb0ff81553508bc01f3dd51428742fb 0 31 37 0 +simundump text /kinetics/PSD/CaM/notes 0 "" +call /kinetics/PSD/CaM/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaM/CaM 1 5e-13 20 20 120 120 0 0 6 0 \ + /kinetics/geometry pink blue 35 39 0 +simundump text /kinetics/PSD/CaM/CaM/notes 0 \ + "There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)\nSay 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying\nit is comparable to CaMK levels. \n" +call /kinetics/PSD/CaM/CaM/notes LOAD \ +"There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)" \ +"Say 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying" \ +"it is comparable to CaMK levels. " \ +"" +simundump kreac /kinetics/PSD/CaM/CaM-Ca3-bind-Ca 1 0.6 10 "" white blue 49 \ + 36 0 +simundump text /kinetics/PSD/CaM/CaM-Ca3-bind-Ca/notes 0 \ + "Use K3 = 21.5 uM here from Stemmer and Klee table 3.\nkb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10\n24 Sep 2015\nThis is a bit too low affinity. Changing to match K2 at \nKd = 2.8." +call /kinetics/PSD/CaM/CaM-Ca3-bind-Ca/notes LOAD \ +"Use K3 = 21.5 uM here from Stemmer and Klee table 3." \ +"kb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" \ +"24 Sep 2015" \ +"This is a bit too low affinity. Changing to match K2 at " \ +"Kd = 2.8." +simundump kpool /kinetics/PSD/CaM/CaM-Ca3 1 1e-12 0 0 0 0 0 0 6 0 \ + /kinetics/geometry hotpink blue 47 39 0 +simundump text /kinetics/PSD/CaM/CaM-Ca3/notes 0 "" +call /kinetics/PSD/CaM/CaM-Ca3/notes LOAD \ +"" +simundump kreac /kinetics/PSD/CaM/CaM-bind-Ca 1 1.4141 8.4853 "" white blue \ + 37 36 0 +simundump text /kinetics/PSD/CaM/CaM-bind-Ca/notes 0 \ + "Lets use the fast rate consts here. Since the rates are so different, I am not\nsure whether the order is relevant. These correspond to the TR2C fragment.\nWe use the Martin et al rates here, plus the Drabicowski binding consts.\nAll are scaled by 3X to cell temp.\nkf = 2e-10 kb = 72\nStemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11.\nIf kb=72, kf = 2e-10 (Exactly the same !)...." +call /kinetics/PSD/CaM/CaM-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +simundump kpool /kinetics/PSD/CaM/CaM-Ca2 1 1e-12 0 0 0 0 0 0 6 0 \ + /kinetics/geometry pink blue 43 39 0 +simundump text /kinetics/PSD/CaM/CaM-Ca2/notes 0 \ + "This is the intermediate where the TR2 end (the high-affinity end) has\nbound the Ca but the TR1 end has not." +call /kinetics/PSD/CaM/CaM-Ca2/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +simundump kreac /kinetics/PSD/CaM/CaM-Ca2-bind-Ca 1 0.60001 10 "" white blue \ + 45 36 0 +simundump text /kinetics/PSD/CaM/CaM-Ca2-bind-Ca/notes 0 \ + "K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get\nkb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10\n" +call /kinetics/PSD/CaM/CaM-Ca2-bind-Ca/notes LOAD \ +"K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get" \ +"kb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10" \ +"" +simundump kreac /kinetics/PSD/CaM/CaM-Ca-bind-Ca 1 1.4141 8.4853 "" white \ + blue 41 36 0 +simundump text /kinetics/PSD/CaM/CaM-Ca-bind-Ca/notes 0 \ + "Lets use the fast rate consts here. Since the rates are so different, I am not\nsure whether the order is relevant. These correspond to the TR2C fragment.\nWe use the Martin et al rates here, plus the Drabicowski binding consts.\nAll are scaled by 3X to cell temp.\nkf = 2e-10 kb = 72\nStemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11.\nIf kb=72, kf = 2e-10 (Exactly the same !)...." +call /kinetics/PSD/CaM/CaM-Ca-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +simundump kpool /kinetics/PSD/CaM/CaM-Ca 1 1e-12 0 0 0 0 0 0 6 0 \ + /kinetics/geometry pink blue 39 39 0 +simundump text /kinetics/PSD/CaM/CaM-Ca/notes 0 \ + "This is the intermediate where the TR2 end (the high-affinity end) has\nbound the Ca but the TR1 end has not." +call /kinetics/PSD/CaM/CaM-Ca/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +simundump kpool /kinetics/PSD/CaM/Ca 1 1e-11 0.08 0.08 0.48 0.48 0 0 6 0 \ + /kinetics/geometry red blue 43 33 0 +simundump text /kinetics/PSD/CaM/Ca/notes 0 "" +call /kinetics/PSD/CaM/Ca/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaM/CaM-Ca4 1 1e-12 0 0 0 0 0 0 6 0 \ + /kinetics/geometry blue blue 52 39 0 +simundump text /kinetics/PSD/CaM/CaM-Ca4/notes 0 "" +call /kinetics/PSD/CaM/CaM-Ca4/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaM/Ca_input 0 0 0.08 0.08 0.48 0.48 0 0 6 4 \ + /kinetics/geometry[3] blue black 49 33 0 +simundump text /kinetics/PSD/CaM/Ca_input/notes 0 "" +call /kinetics/PSD/CaM/Ca_input/notes LOAD \ +"" +simundump kreac /kinetics/PSD/CaM/Ca_stim 0 50 50 "" white black 46 31 0 +simundump text /kinetics/PSD/CaM/Ca_stim/notes 0 "" +call /kinetics/PSD/CaM/Ca_stim/notes LOAD \ +"" +simundump kpool /kinetics/PSD/CaM_CaN 1 0 0 0 0 0 0 0 6 0 /kinetics/geometry \ + 1 20 30 33 0 +simundump text /kinetics/PSD/CaM_CaN/notes 0 "" +call /kinetics/PSD/CaM_CaN/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p 1 0 0 0 0 54.001 \ + 0.0063334 1.36 0.34 0 0 "" white 1 "" 29 30 0 +simundump text /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p/notes 0 "" +call /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaM_CaN/dephosph_inhib1 1 0 0 0 0 54.001 \ + 0.0063334 1.36 0.34 0 0 "" red 1 "" 29 24 0 +simundump text /kinetics/PSD/CaM_CaN/dephosph_inhib1/notes 0 "" +call /kinetics/PSD/CaM_CaN/dephosph_inhib1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaM_CaN/CaN_1 0 0 0 0 0 6 0.033333 8 2 0 0 "" \ + red pink "" -6 -4 0 +simundump text /kinetics/PSD/CaM_CaN/CaN_1/notes 0 "" +call /kinetics/PSD/CaM_CaN/CaN_1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/CaM_CaN/CaN_2 0 0 0 0 0 6 0.033333 8 2 0 0 "" \ + red pink "" -2 -4 0 +simundump text /kinetics/PSD/CaM_CaN/CaN_2/notes 0 "" +call /kinetics/PSD/CaM_CaN/CaN_2/notes LOAD \ +"" +simundump group /kinetics/DEND 0 13 black x 0 0 "" DEND defaultfile.g 0 0 0 \ + 11 -30 0 +simundump text /kinetics/DEND/notes 0 "" +call /kinetics/DEND/notes LOAD \ +"" +simundump group /kinetics/DEND/CaM 1 blue 13 x 0 0 "" defaultfile \ + defaultfile.g 0 fbb0ff81553508bc01f3dd51428742fb 0 34 -32 0 +simundump text /kinetics/DEND/CaM/notes 0 "" +call /kinetics/DEND/CaM/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaM/CaM 1 5e-13 1 1 600 600 0 0 600 0 \ + /kinetics/geometry pink blue 38 -30 0 +simundump text /kinetics/DEND/CaM/CaM/notes 0 \ + "There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)\nSay 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying\nit is comparable to CaMK levels. \n" +call /kinetics/DEND/CaM/CaM/notes LOAD \ +"There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)" \ +"Say 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying" \ +"it is comparable to CaMK levels. " \ +"" +simundump kreac /kinetics/DEND/CaM/CaM-Ca3-bind-Ca 1 0.006 10 "" white blue \ + 52 -33 0 +simundump text /kinetics/DEND/CaM/CaM-Ca3-bind-Ca/notes 0 \ + "Use K3 = 21.5 uM here from Stemmer and Klee table 3.\nkb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" +call /kinetics/DEND/CaM/CaM-Ca3-bind-Ca/notes LOAD \ +"Use K3 = 21.5 uM here from Stemmer and Klee table 3." \ +"kb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" +simundump kpool /kinetics/DEND/CaM/CaM-Ca3 1 1e-12 0 0 0 0 0 0 600 0 \ + /kinetics/geometry hotpink blue 50 -30 0 +simundump text /kinetics/DEND/CaM/CaM-Ca3/notes 0 "" +call /kinetics/DEND/CaM/CaM-Ca3/notes LOAD \ +"" +simundump kreac /kinetics/DEND/CaM/CaM-bind-Ca 1 0.014141 8.4853 "" white \ + blue 40 -33 0 +simundump text /kinetics/DEND/CaM/CaM-bind-Ca/notes 0 \ + "Lets use the fast rate consts here. Since the rates are so different, I am not\nsure whether the order is relevant. These correspond to the TR2C fragment.\nWe use the Martin et al rates here, plus the Drabicowski binding consts.\nAll are scaled by 3X to cell temp.\nkf = 2e-10 kb = 72\nStemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11.\nIf kb=72, kf = 2e-10 (Exactly the same !)...." +call /kinetics/DEND/CaM/CaM-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +simundump kpool /kinetics/DEND/CaM/CaM-Ca2 1 1e-12 0 0 0 0 0 0 600 0 \ + /kinetics/geometry pink blue 46 -30 0 +simundump text /kinetics/DEND/CaM/CaM-Ca2/notes 0 \ + "This is the intermediate where the TR2 end (the high-affinity end) has\nbound the Ca but the TR1 end has not." +call /kinetics/DEND/CaM/CaM-Ca2/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +simundump kreac /kinetics/DEND/CaM/CaM-Ca2-bind-Ca 1 0.006 10 "" white blue \ + 48 -33 0 +simundump text /kinetics/DEND/CaM/CaM-Ca2-bind-Ca/notes 0 \ + "K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get\nkb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10\n" +call /kinetics/DEND/CaM/CaM-Ca2-bind-Ca/notes LOAD \ +"K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get" \ +"kb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10" \ +"" +simundump kreac /kinetics/DEND/CaM/CaM-Ca-bind-Ca 1 0.014141 8.4853 "" white \ + blue 44 -33 0 +simundump text /kinetics/DEND/CaM/CaM-Ca-bind-Ca/notes 0 \ + "Lets use the fast rate consts here. Since the rates are so different, I am not\nsure whether the order is relevant. These correspond to the TR2C fragment.\nWe use the Martin et al rates here, plus the Drabicowski binding consts.\nAll are scaled by 3X to cell temp.\nkf = 2e-10 kb = 72\nStemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11.\nIf kb=72, kf = 2e-10 (Exactly the same !)...." +call /kinetics/DEND/CaM/CaM-Ca-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +simundump kpool /kinetics/DEND/CaM/CaM-Ca 1 1e-12 0 0 0 0 0 0 600 0 \ + /kinetics/geometry pink blue 42 -30 0 +simundump text /kinetics/DEND/CaM/CaM-Ca/notes 0 \ + "This is the intermediate where the TR2 end (the high-affinity end) has\nbound the Ca but the TR1 end has not." +call /kinetics/DEND/CaM/CaM-Ca/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +simundump kpool /kinetics/DEND/CaM/CaM-Ca4 1 1e-12 0 0 0 0 0 0 600 0 \ + /kinetics/geometry blue blue 55 -30 0 +simundump text /kinetics/DEND/CaM/CaM-Ca4/notes 0 "" +call /kinetics/DEND/CaM/CaM-Ca4/notes LOAD \ +"" +simundump kreac /kinetics/DEND/CaM/CaM_x2 0 10 10 "" white black 28 -30 0 +simundump text /kinetics/DEND/CaM/CaM_x2/notes 0 "" +call /kinetics/DEND/CaM/CaM_x2/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaM/CaM_xchange 0 2e-11 0 0 0 0 0 0 600 0 \ + /kinetics/geometry[1] blue blue 19 -32 0 +simundump text /kinetics/DEND/CaM/CaM_xchange/notes 0 "" +call /kinetics/DEND/CaM/CaM_xchange/notes LOAD \ +"" +simundump group /kinetics/DEND/CaMKII_BULK 0 33 13 x 0 0 "" CaMKII_BULK \ + defaultfile.g 0 0 0 42 -37 0 +simundump text /kinetics/DEND/CaMKII_BULK/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/tot-auto 0 0 0.18 0.5 300 108 0 0 \ + 600 0 /kinetics/geometry 29 33 77 -33 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-auto/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/tot-auto/notes LOAD \ +"" +simundump kenz /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph 0 0 0 0 0 \ + 69.588 0.00066667 8 2 0 0 "" red 29 "" 75 -46 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph/notes LOAD \ +"" +simundump kenz /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286 0 0 0 0 0 69.588 \ + 0.00016667 2 0.5 0 0 "" red 29 "" 62 -46 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286/notes LOAD \ +"" +simundump kenz /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305 0 0 0 0 0 486.01 \ + 0.002 24 6 0 0 "" red 29 "" 81 -46 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/tot_CaMKII 0 0 0.18 1.18 708 108 0 \ + 0 600 0 /kinetics/geometry 23 33 87 -33 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot_CaMKII/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/tot_CaMKII/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII 0 0 0 0 0 0 0 0 600 \ + 0 /kinetics/geometry 47 33 64 -36 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/notes LOAD \ +"" +simundump kenz /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph 0 0 0 \ + 0 0 69.588 0.0010417 8 2 0 0 "" red 47 "" 75 -49 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph/notes 0 \ + "" +call /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph/notes LOAD \ +"" +simundump kenz /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 0 0 0 0 \ + 0 486.01 0.003125 24 6 0 0 "" red 47 "" 81 -49 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305/notes 0 \ + "" +call /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305/notes LOAD \ +"" +simundump kenz /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 0 0 0 0 \ + 0 69.588 0.00026042 2 0.5 0 0 "" red 47 "" 63 -49 0 +simundump text /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286/notes 0 \ + "" +call /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/basal_CaMKII 0 0 0.5 0.5 300 300 0 \ + 0 600 0 /kinetics/geometry blue 33 84 -36 0 +simundump text /kinetics/DEND/CaMKII_BULK/basal_CaMKII/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/basal_CaMKII/notes LOAD \ +"" +simundump kreac /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM 0 0.10945 \ + 0.0022 "" white 33 57 -41 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM/notes 0 \ + "Same values as for the main compartment\nCan the main compartment pool of Ca/CaM be used?" +call /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM/notes LOAD \ +"Same values as for the main compartment" \ +"Can the main compartment pool of Ca/CaM be used?" +simundump kreac /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM 0 0.10945 2.2 "" \ + white 33 68 -41 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM 0 1e-12 0 0 0 0 \ + 0 0 600 0 /kinetics/geometry 47 33 59 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII-CaM 0 1e-12 0 0 0 0 0 0 600 \ + 0 /kinetics/geometry 50 33 66 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII-CaM/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII-CaM/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 0 1e-12 0 0 0 0 0 0 \ + 600 0 /kinetics/geometry 57 33 72 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII-thr286/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII-thr286/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII 0 5e-13 1 1 600 600 0 0 600 \ + 0 /kinetics/geometry 62 33 78 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII-thr305 0 1e-12 0 0 0 0 0 0 \ + 600 0 /kinetics/geometry 30 33 91 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII-thr305/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII-thr305/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p 0 1e-12 0 0 0 0 0 0 \ + 600 0 /kinetics/geometry 0 33 84 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p/notes LOAD \ +"" +simundump kreac /kinetics/DEND/CaMKII_BULK/CaMKII_x2 0 10 10 "" white black \ + 95 -49 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII_x2/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII_x2/notes LOAD \ +"" +simundump kpool /kinetics/DEND/CaMKII_BULK/CaMKII_xchange 0 2e-11 0 0 0 0 0 0 \ + 600 0 /kinetics/geometry[5] blue black 99 -47 0 +simundump text /kinetics/DEND/CaMKII_BULK/CaMKII_xchange/notes 0 "" +call /kinetics/DEND/CaMKII_BULK/CaMKII_xchange/notes LOAD \ +"" +simundump kpool /kinetics/DEND/actCaMKII 0 0 0.18 0.18 108 108 0 0 600 0 \ + /kinetics/geometry 12 5 73 -36 0 +simundump text /kinetics/DEND/actCaMKII/notes 0 "" +call /kinetics/DEND/actCaMKII/notes LOAD \ +"" +simundump kpool /kinetics/DEND/PP2A 1 0 1.2 1.2 720 720 0 0 600 0 \ + /kinetics/geometry 62 5 47 -44 0 +simundump text /kinetics/DEND/PP2A/notes 0 \ + "Strack et al JBC 1997 show that PP2A is the primary\nphosphatase acting on CaMKII in the bulk." +call /kinetics/DEND/PP2A/notes LOAD \ +"Strack et al JBC 1997 show that PP2A is the primary" \ +"phosphatase acting on CaMKII in the bulk." +simundump kenz /kinetics/DEND/PP2A/Deph-thr286 0 0 0 0 0 486.01 0.0033334 8 2 \ + 0 0 "" red 62 "" 64 -44 0 +simundump text /kinetics/DEND/PP2A/Deph-thr286/notes 0 "" +call /kinetics/DEND/PP2A/Deph-thr286/notes LOAD \ +"" +simundump kenz /kinetics/DEND/PP2A/Deph-thr286b 0 0 0 0 0 486.01 0.0033334 8 \ + 2 0 0 "" red 62 "" 74 -44 0 +simundump text /kinetics/DEND/PP2A/Deph-thr286b/notes 0 "" +call /kinetics/DEND/PP2A/Deph-thr286b/notes LOAD \ +"" +simundump kenz /kinetics/DEND/PP2A/Deph-thr305 0 0 0 0 0 486.01 0.0033334 8 2 \ + 0 0 "" red 62 "" 81 -44 0 +simundump text /kinetics/DEND/PP2A/Deph-thr305/notes 0 "" +call /kinetics/DEND/PP2A/Deph-thr305/notes LOAD \ +"" +simundump kenz /kinetics/DEND/PP2A/Deph-thr286c 0 0 0 0 0 486.01 0.00083332 2 \ + 0.5 0 0 "" red 62 "" 91 -44 0 +simundump text /kinetics/DEND/PP2A/Deph-thr286c/notes 0 "" +call /kinetics/DEND/PP2A/Deph-thr286c/notes LOAD \ +"" +simundump kenz /kinetics/DEND/PP2A/Deph-thr305a 0 0 0 0 0 486.01 0.0033334 8 \ + 2 0 0 "" red 62 "" 86 -44 0 +simundump text /kinetics/DEND/PP2A/Deph-thr305a/notes 0 "" +call /kinetics/DEND/PP2A/Deph-thr305a/notes LOAD \ +"" +simundump kpool /kinetics/DEND/Ca_input 0 0 0.08 0.08 48 48 0 0 600 4 \ + /kinetics/geometry[4] blue black 53 -37 0 +simundump text /kinetics/DEND/Ca_input/notes 0 "" +call /kinetics/DEND/Ca_input/notes LOAD \ +"" +simundump kreac /kinetics/DEND/Ca_stim 0 50 50 "" white black 49 -38 0 +simundump text /kinetics/DEND/Ca_stim/notes 0 "" +call /kinetics/DEND/Ca_stim/notes LOAD \ +"" +simundump group /kinetics/SPINE 0 5 black x 0 0 "" SPINE defaultfile.g 0 0 0 \ + 29 -23 0 +simundump text /kinetics/SPINE/notes 0 "" +call /kinetics/SPINE/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/iR 0 0 4.4444 4.4444 240 240 0 0 54 0 \ + /kinetics/geometry 0 yellow -8 -10 0 +simundump text /kinetics/SPINE/iR/notes 0 "Same as Fus3\n" +call /kinetics/SPINE/iR/notes LOAD \ +"Same as Fus3" \ +"" +simundump group /kinetics/SPINE/CaM 1 blue 5 x 0 0 "" defaultfile \ + defaultfile.g 0 fbb0ff81553508bc01f3dd51428742fb 0 33 2 0 +simundump text /kinetics/SPINE/CaM/notes 0 "" +call /kinetics/SPINE/CaM/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaM/CaM 1 5e-13 20 20 1080 1080 0 0 54 0 \ + /kinetics/geometry pink blue 37 4 0 +simundump text /kinetics/SPINE/CaM/CaM/notes 0 \ + "There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)\nSay 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying\nit is comparable to CaMK levels. \n" +call /kinetics/SPINE/CaM/CaM/notes LOAD \ +"There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)" \ +"Say 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying" \ +"it is comparable to CaMK levels. " \ +"" +simundump kreac /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca 1 0.066667 10 "" white \ + blue 51 1 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca/notes 0 \ + "Use K3 = 21.5 uM here from Stemmer and Klee table 3.\nkb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" +call /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca/notes LOAD \ +"Use K3 = 21.5 uM here from Stemmer and Klee table 3." \ +"kb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" +simundump kpool /kinetics/SPINE/CaM/CaM-Ca3 1 1e-12 0 0 0 0 0 0 54 0 \ + /kinetics/geometry hotpink blue 49 4 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca3/notes 0 "" +call /kinetics/SPINE/CaM/CaM-Ca3/notes LOAD \ +"" +simundump kreac /kinetics/SPINE/CaM/CaM-bind-Ca 1 0.15712 8.4853 "" white \ + blue 39 1 0 +simundump text /kinetics/SPINE/CaM/CaM-bind-Ca/notes 0 \ + "Lets use the fast rate consts here. Since the rates are so different, I am not\nsure whether the order is relevant. These correspond to the TR2C fragment.\nWe use the Martin et al rates here, plus the Drabicowski binding consts.\nAll are scaled by 3X to cell temp.\nkf = 2e-10 kb = 72\nStemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11.\nIf kb=72, kf = 2e-10 (Exactly the same !)...." +call /kinetics/SPINE/CaM/CaM-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +simundump kpool /kinetics/SPINE/CaM/CaM-Ca2 1 1e-12 0 0 0 0 0 0 54 0 \ + /kinetics/geometry pink blue 45 4 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca2/notes 0 \ + "This is the intermediate where the TR2 end (the high-affinity end) has\nbound the Ca but the TR1 end has not." +call /kinetics/SPINE/CaM/CaM-Ca2/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +simundump kreac /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca 1 0.066668 10 "" white \ + blue 47 1 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca/notes 0 \ + "K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get\nkb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10\n" +call /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca/notes LOAD \ +"K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get" \ +"kb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10" \ +"" +simundump kreac /kinetics/SPINE/CaM/CaM-Ca-bind-Ca 1 0.15712 8.4853 "" white \ + blue 43 1 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca-bind-Ca/notes 0 \ + "Lets use the fast rate consts here. Since the rates are so different, I am not\nsure whether the order is relevant. These correspond to the TR2C fragment.\nWe use the Martin et al rates here, plus the Drabicowski binding consts.\nAll are scaled by 3X to cell temp.\nkf = 2e-10 kb = 72\nStemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11.\nIf kb=72, kf = 2e-10 (Exactly the same !)...." +call /kinetics/SPINE/CaM/CaM-Ca-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +simundump kpool /kinetics/SPINE/CaM/CaM-Ca 1 1e-12 0 0 0 0 0 0 54 0 \ + /kinetics/geometry pink blue 41 4 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca/notes 0 \ + "This is the intermediate where the TR2 end (the high-affinity end) has\nbound the Ca but the TR1 end has not." +call /kinetics/SPINE/CaM/CaM-Ca/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +simundump kpool /kinetics/SPINE/CaM/Ca 1 1e-11 0.08 0.08 4.32 4.32 0 0 54 0 \ + /kinetics/geometry red blue 45 -2 0 +simundump text /kinetics/SPINE/CaM/Ca/notes 0 "" +call /kinetics/SPINE/CaM/Ca/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaM/CaM-Ca4 1 1e-12 0 0 0 0 0 0 54 0 \ + /kinetics/geometry blue blue 54 4 0 +simundump text /kinetics/SPINE/CaM/CaM-Ca4/notes 0 "" +call /kinetics/SPINE/CaM/CaM-Ca4/notes LOAD \ +"" +simundump kreac /kinetics/SPINE/CaM/CaM_x2 0 1 100 "" white black 34 10 0 +simundump text /kinetics/SPINE/CaM/CaM_x2/notes 0 "" +call /kinetics/SPINE/CaM/CaM_x2/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaM/CaM_xchange 0 2e-11 0 0 0 0 0 0 54 0 \ + /kinetics/geometry[2] blue black 29 7 0 +simundump text /kinetics/SPINE/CaM/CaM_xchange/notes 0 "" +call /kinetics/SPINE/CaM/CaM_xchange/notes LOAD \ +"" +simundump group /kinetics/SPINE/CaMKII_BULK 0 33 5 x 0 0 "" CaMKII_BULK \ + defaultfile.g 0 0 0 41 -3 0 +simundump text /kinetics/SPINE/CaMKII_BULK/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/tot-auto 0 0 2 0.5 27 108 0 0 54 \ + 0 /kinetics/geometry 29 33 76 1 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-auto/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/tot-auto/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph 0 0 0 0 0 \ + 69.588 0.0074074 8 2 0 0 "" red 29 "" 74 -12 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286 0 0 0 0 0 \ + 69.588 0.0018519 2 0.5 0 0 "" red 29 "" 61 -12 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305 0 0 0 0 0 \ + 486.01 0.022222 24 6 0 0 "" red 29 "" 80 -12 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/tot_CaMKII 0 0 2 22 1188 108 0 0 \ + 54 0 /kinetics/geometry 23 33 86 1 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot_CaMKII/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/tot_CaMKII/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/286P 0 0 0 0 0 0 0 0 54 0 \ + /kinetics/geometry 59 33 54 -2 0 +simundump text /kinetics/SPINE/CaMKII_BULK/286P/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/286P/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII 0 0 0 0 0 0 0 0 54 \ + 0 /kinetics/geometry 47 33 63 -2 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph 0 0 \ + 0 0 0 69.588 0.011574 8 2 0 0 "" red 47 "" 74 -15 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph/notes 0 \ + "" +call /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 0 0 0 0 \ + 0 486.01 0.034722 24 6 0 0 "" red 47 "" 80 -15 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305/notes 0 \ + "" +call /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 0 0 0 0 \ + 0 69.588 0.0028935 2 0.5 0 0 "" red 47 "" 62 -15 0 +simundump text /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286/notes 0 \ + "" +call /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/basal_CaMKII 0 0 0.5 0.5 27 27 0 \ + 0 54 0 /kinetics/geometry blue 33 83 -2 0 +simundump text /kinetics/SPINE/CaMKII_BULK/basal_CaMKII/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/basal_CaMKII/notes LOAD \ +"" +simundump kreac /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM 0 1.2161 \ + 0.0022 "" white 33 56 -7 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM/notes 0 \ + "Same values as for the main compartment\nCan the main compartment pool of Ca/CaM be used?" +call /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM/notes LOAD \ +"Same values as for the main compartment" \ +"Can the main compartment pool of Ca/CaM be used?" +simundump kreac /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM 0 1.2161 2.2 "" \ + white 33 67 -7 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM 0 1e-12 0 0 0 0 \ + 0 0 54 0 /kinetics/geometry 47 33 58 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM 0 1e-12 0 0 0 0 0 0 54 \ + 0 /kinetics/geometry 50 33 65 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 0 1e-12 0 0 0 0 0 0 \ + 54 0 /kinetics/geometry 57 33 71 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII 0 5e-13 20 20 1080 1080 0 \ + 0 54 0 /kinetics/geometry 62 33 77 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305 0 1e-12 0 0 0 0 0 0 \ + 54 0 /kinetics/geometry 30 33 90 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p 0 1e-12 0 0 0 0 0 0 \ + 54 0 /kinetics/geometry 0 33 83 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p/notes LOAD \ +"" +simundump kreac /kinetics/SPINE/CaMKII_BULK/CaMKII_x2 0 1 100 "" white black \ + 92 -15 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII_x2/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII_x2/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaMKII_BULK/CaMKII_xchange 0 2e-11 0 0 0 0 0 \ + 0 54 0 /kinetics/geometry[6] blue black 98 -13 0 +simundump text /kinetics/SPINE/CaMKII_BULK/CaMKII_xchange/notes 0 "" +call /kinetics/SPINE/CaMKII_BULK/CaMKII_xchange/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaM_CaN 1 0 0 0 0 0 0 0 54 0 \ + /kinetics/geometry 1 5 32 -2 0 +simundump text /kinetics/SPINE/CaM_CaN/notes 0 "" +call /kinetics/SPINE/CaM_CaN/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/actCaMKII 0 0 2 2 108 108 0 0 54 0 \ + /kinetics/geometry 12 5 72 -2 0 +simundump text /kinetics/SPINE/actCaMKII/notes 0 "" +call /kinetics/SPINE/actCaMKII/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/PP2A 1 0 5 5 270 270 0 0 54 0 \ + /kinetics/geometry 62 5 46 -10 0 +simundump text /kinetics/SPINE/PP2A/notes 0 \ + "Strack et al JBC 1997 show that PP2A is the primary\nphosphatase acting on CaMKII in the bulk." +call /kinetics/SPINE/PP2A/notes LOAD \ +"Strack et al JBC 1997 show that PP2A is the primary" \ +"phosphatase acting on CaMKII in the bulk." +simundump kenz /kinetics/SPINE/PP2A/Deph-thr286 0 0 0 0 0 486.01 0.037038 8 2 \ + 0 0 "" red 62 "" 63 -10 0 +simundump text /kinetics/SPINE/PP2A/Deph-thr286/notes 0 "" +call /kinetics/SPINE/PP2A/Deph-thr286/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/PP2A/Deph-thr286b 0 0 0 0 0 486.01 0.037038 8 \ + 2 0 0 "" red 62 "" 73 -10 0 +simundump text /kinetics/SPINE/PP2A/Deph-thr286b/notes 0 "" +call /kinetics/SPINE/PP2A/Deph-thr286b/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/PP2A/Deph-thr305 0 0 0 0 0 486.01 0.037038 8 2 \ + 0 0 "" red 62 "" 80 -10 0 +simundump text /kinetics/SPINE/PP2A/Deph-thr305/notes 0 "" +call /kinetics/SPINE/PP2A/Deph-thr305/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/PP2A/Deph-thr286c 0 0 0 0 0 486.01 0.0092593 2 \ + 0.5 0 0 "" red 62 "" 90 -10 0 +simundump text /kinetics/SPINE/PP2A/Deph-thr286c/notes 0 "" +call /kinetics/SPINE/PP2A/Deph-thr286c/notes LOAD \ +"" +simundump kenz /kinetics/SPINE/PP2A/Deph-thr305a 0 0 0 0 0 486.01 0.037038 8 \ + 2 0 0 "" red 62 "" 85 -10 0 +simundump text /kinetics/SPINE/PP2A/Deph-thr305a/notes 0 "" +call /kinetics/SPINE/PP2A/Deph-thr305a/notes LOAD \ +"" +simundump group /kinetics/SPINE/CaN_BULK 1 yellow 5 x 0 0 "" CaN_BULK \ + /home2/bhalla/scripts/modules/PP1_PSD_0.g 0 \ + 62a600ae10e53f567e47decb4f2b6488 0 14 -8 0 +simundump text /kinetics/SPINE/CaN_BULK/notes 0 "" +call /kinetics/SPINE/CaN_BULK/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaN_BULK/CaN 0 0 1 1 54 54 0 0 54 0 \ + /kinetics/geometry 1 yellow 4 -2 0 +simundump text /kinetics/SPINE/CaN_BULK/CaN/notes 0 "" +call /kinetics/SPINE/CaN_BULK/CaN/notes LOAD \ +"" +simundump kreac /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN 0 0.85185 0.5 "" white \ + yellow 23 5 0 +simundump text /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN/notes 0 \ + "From Quintana et al 2005" +call /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN/notes LOAD \ +"From Quintana et al 2005" +simundump kreac /kinetics/SPINE/CaN_BULK/Ca_bind_CaN 0 0.0085734 1 "" white \ + yellow 8 5 0 +simundump text /kinetics/SPINE/CaN_BULK/Ca_bind_CaN/notes 0 "" +call /kinetics/SPINE/CaN_BULK/Ca_bind_CaN/notes LOAD \ +"" +simundump kpool /kinetics/SPINE/CaN_BULK/Ca2_CaN 0 0 0 0 0 0 0 0 54 0 \ + /kinetics/geometry[1] blue yellow 15 -2 0 +simundump text /kinetics/SPINE/CaN_BULK/Ca2_CaN/notes 0 "" +call /kinetics/SPINE/CaN_BULK/Ca2_CaN/notes LOAD \ +"" +simundump kpool /kinetics/Ca 1 1e-11 0.08 0.08 48 48 0 0 600 0 \ + /kinetics/geometry red 13 46 -36 0 +simundump text /kinetics/Ca/notes 0 "" +call /kinetics/Ca/notes LOAD \ +"" +simundump xgraph /graphs/conc1 0 0 2000 0 4 0 +simundump xgraph /graphs/conc2 0 0 2000 0 16.804 0 +simundump xplot /graphs/conc1/Ca.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " red 0 0 1 +simundump xplot /graphs/conc1/actCaMKII.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 12 0 0 1 +simundump xplot /graphs/conc1/tot_PSD_R.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xplot /graphs/conc1/CaM-Ca4.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xplot /graphs/conc2/Ca.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " red 0 0 1 +simundump xplot /graphs/conc2/actCaMKII.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 12 0 0 1 +simundump xplot /graphs/conc2/CaM-Ca4.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xgraph /moregraphs/conc3 0 0 2000 0 4 0 +simundump xgraph /moregraphs/conc4 0 0 2000 0 4 0 +simundump xplot /moregraphs/conc3/Ca.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " red 0 0 1 +simundump xplot /moregraphs/conc3/actCaMKII.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 12 0 0 1 +simundump xplot /moregraphs/conc3/CaM-Ca4.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xcoredraw /edit/draw 0 -10 101 -51 42 +simundump xtree /edit/draw/tree 0 \ + /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \ + "edit_elm.D ; drag_from_edit.w " auto 0.6 +simundump xtext /file/notes 0 1 +xtextload /file/notes \ +"23 Dec 2011" \ +"CaMKII_merged16.g" \ +"Added Ca-binding step to the CaN activation pathway." \ +"Based on CaMKII_merged15.g" \ +"" \ +"CaMKII_merged16a.g" \ +"Halved the Kb for CaN-bind-CaM" \ +"" \ +"CaMKII_merged17.g" \ +" Used more rates from Saucerman and Bers BPJ 2008" \ +"" \ +"CaMKII_merged17a.g" \ +"Fix to init conc of PP1-active in PSD: from 2 to 4." \ +"" \ +"CaMKII_merged17b.g" \ +"Raised PP2A CoInit from 0.1111 uM to 1 uM, to avoid sub-molecular" \ +"levels in PSD. Scaled kcats down to match." \ +"" \ +"CaMKII_merged20.g" \ +"First pass at a version with a reasonable basal PKA and a less" \ +"saturating effect on PP1-active of CaMKII." \ +"" \ +"CaMKII_merged20c.g: This version turns on but does not go off" \ +"afterwards. " \ +"" \ +"CaMKII_merged20d.g: 10x higher Km and kcat for PP1 on CaMKII." \ +"" \ +"CaMKII_merged20e.g: Km = 5 and kcat =0.5" \ +"" \ +"02 June 2012. CaMKII_merged20g.g: NMDAR = 40, effective # of" \ +"sites given that CaMKII is a dodecamer." \ +"" \ +"CaMKII_merged20h.g: Lowered Kb for CaM-Bind-CaN from 0.006 to " \ +"0.002/sec." \ +"" \ +"CaMKII_merged20i.g: Set PKA-active in both compts to be 0.02 uM." \ +"" \ +"CaMKII_merged20j.g: Faster CaN diffusion, by 6x. Now matches" \ +"CaM with 6:54." \ +"" \ +"CaMKII_merged20k.g: Halved CaMKII affinity for NMDAR." \ +"" \ +"CaMKII_merged21.g: Removed bulk PP1. Use PP2A to dephosphorylate" \ +"CaMKII in bulk." \ +"" \ +"19 July 2013. psd_merged30.g: Variant for signeur loading." \ +"" \ +"22 Aug 2015. CaMKII_merged32.g: Duplicated spine head CaMKII and" \ +"ancillary reactions, into Dend. Will need to figure out how to " \ +"keep hihger CaMKII and CaM levels in spine head rather than" \ +"dend." \ +"23 Aug 2015. CaMKII_merged33.g: Added pools and reactions to " \ +"sustain the gradients of CaM and CaMKII between DEND and SPINE." \ +"Needed because we have diffusion of CaM, CaMKII and various " \ +"converted forms of these molecules." \ +"" \ +"23 Aug 2015. CaMKII_merged34.g: Added Ca_input for PSD and DEND." \ +"" \ +"24 Aug 2015. CaMKII_merged35.g" \ +"Increased CaDiffusion rate to 10 microns^2/sec. " \ +"Increased Ca_stim Kf and Kb to 50 from 20." \ +"" \ +"13 Sep 2015. CaMKII_merged36.g" \ +"Set PSD/PKA-active nInit to zero. It was a tiny fractional value" \ +"leading to a possible discrepancy between stochastic and determ" \ +"calculations." \ +"" \ +"14 Sep 2015. CaMKII_merged37.g" \ +"PP2A in the PSD had some tiny nComplexInits in its enz sites." \ +"Zeroed." \ +"" \ +"24 Sep 2015. CaMKII_merged38.g" \ +"Fixed some discrepancies in rates in the Dend compartment. Seems" \ +"that vol scaling had not happened properly." \ +"Also raised affinity of final stage of CaM.Ca3 binding to Ca to" \ +"the same value as for CaM.Ca2 binding." \ +"" \ +"25 Sep 2015. CaMKII_merged39.g" \ +"Fixed CaM_xchange reactions, also similar for CaMKII. These set" \ +"up the higher conc in the spine and PSD, but were not effective." \ +"" \ +"26 Sep 2015. CaMKII_merged42.g" \ +"Moved PP1_1 and PP1_2 enzymes to CaM_CaN" \ +"Some rates changes." \ +"CaMKII_merged42a.g: moved /kinetics/DEND/Ca to /kinetics/Ca so" \ +"that the system isn't confused during diffusions setup." \ +"" \ +"29 Sep 2015. CaMKII_merged43.g" \ +"Added back the CaMKII exchange reaction, and CaMKII diffusion" \ +"between dend and spine. Also moved the CaM_xchange reaction to" \ +"the dend as its substrate is there." \ +"CaMKII_merged44.g: Lower Keq rate of both xchangeReactions from" \ +"10 to 2. kb now 0.5, kf still 1." \ +"" \ +"02 Oct 2015: CaMKII_merged50.g. Moved NMDAR to Spine rather than" \ +"PSD, to keep both substrates in same compt. Also moved reac to" \ +"same compt as substrates." \ +"" \ +"05 Nov 2015: CaMKII_merged57.g. Put all the translocation reactions" \ +"in the PSD itself, now the CaMKII phospho forms just diffuse" \ +"into the PSD if they want to translocate. Then they bind to" \ +"NMDAR and form the scaffolded version." \ +"CaMKII_merged58.g: There was too little CaM and CaMKII in the " \ +"spine. Increased the rate of the reactions pumping them in." \ +"" \ +"09 Nov 2015" \ +"CaMKII_merged59.g: 3 major changes. " \ +"1. Lowered basal activity of CaMKII to 0.5 uM from 1 uM." \ +"2. Fixed Km of intramolecular CaMKII. Divide Km by 20 for" \ +" each of the intramolecular reactions, this brings it into the" \ +" same range as the total amount of CaMKII" \ +"3. CaN is now activated by Ca2.CaM, not by Ca4.CaM." \ +"CaMKII_merged60.g. Fix to Km for PP2A on CaMKII in Dend: it had" \ +" been reduced to 0.45, restored to 5 so that it is the same as" \ +" in PSD. Also doubled kcat for PP2A action on CaMKII phospho-" \ +" forms, across the board." \ +"" \ +"CaMKII_merged61.g: Zero out diffusion constt for all CaN forms." \ +"CaMKII_merged62.g: Double PP2A rates on CaMKII phosph forms in" \ +" dend and spine. Raise back-reac rate for Ca2.CaM binding to" \ +" CaN by factor of 10." \ +"" \ +"10 Nov 2015. CaMKII_merged63.g: Raised PP2A levels in dend and" \ +"spine head by 25%. Doubled kcat for CaMKII on PSDR. Doubled" \ +"back rate for CaM binding to CaN." \ +"" \ +"" \ +"11 Nov 2015. CaMKII_merged65.g: (64 was a dead end). Removed" \ +"xchange reacs between dend and spine, which were there for setting" \ +"up the steady-state conc gradient of CaM and CaMKII. Replaced" \ +"with a diffusion process and local reacs to achieve gradient." \ +"CaMKII_merged66.g: Changed local rates to steepen gradient." \ +"CaMKII_merged67.g: Further sped up diffusion of xchange molecules" \ +"to steepen gradient. Also lowered CaN affinity for CaM." \ +"CaMKII_merged68.g: Lowered CaN affinity for CaM. Lowered CaMKII" \ +"activity on PSDR. Increased 10x rate for NMDAR binding to CaMKII." \ +"CaMKII_merged69.g: further lowered CaN affinity for CaM to ~0.1." \ +"Lowered CaMKII basal activity to 0.2 uM." \ +"Increased 2x further NMDAR binding to CaMKII." \ +"CaMKII_merged70.g: Double CaMKII rate on PSDR." \ +"" \ +"13 Nov 2015. CaMKII_merged71.g. Fine-tuning to restore bistability" \ +"in the PSDR. Lowered CaN kcas on PSDR to 0.8. Raised basal" \ +"CaMKII back to 0.5 uM, from 0.2, in PSD." \ +"" \ +"14 Nov 2015. CaMKII_merged74.g. Did various tests for the" \ +"bistability of the PSDR system. This one has slower CaN kcat on" \ +"PSDR, from 0.8 to 0.2. Based on psdr2.g" \ +"CaMKII_merged75.g. The prev one didn't acheive turnoff. Doubled" \ +"CaN kcat on psdr, now at 0.4." \ +"15 Nov 2015." \ +"CaMKII_merged76.g. Raised kcat and Km both for CaN on PSDR, to" \ +"lessen saturation." \ +"CaMKII_merged77.g. Raised kcat of basal_phosphatase for PSDR from" \ +"0.11 to 0.15, in order to raise threshold and lessen spontaneous" \ +"turnons." \ +"" \ +"" +addmsg /kinetics/PSD/R_S2 /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/R_SpS /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/R_SpSp /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/actCaMKII/CaMKII_1 /kinetics/PSD/actCaMKII REAC eA B +addmsg /kinetics/PSD/actCaMKII/CaMKII_2 /kinetics/PSD/actCaMKII REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM /kinetics/PSD/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM /kinetics/PSD/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto /kinetics/PSD/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/actCaMKII /kinetics/PSD/actCaMKII/CaMKII_1 ENZYME n +addmsg /kinetics/PSD/R_S2 /kinetics/PSD/actCaMKII/CaMKII_1 SUBSTRATE n +addmsg /kinetics/PSD/actCaMKII /kinetics/PSD/actCaMKII/CaMKII_2 ENZYME n +addmsg /kinetics/PSD/R_SpS /kinetics/PSD/actCaMKII/CaMKII_2 SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286 /kinetics/PSD/PP1_PSD/PP1-active REAC eA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b /kinetics/PSD/PP1_PSD/PP1-active REAC eA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305 /kinetics/PSD/PP1_PSD/PP1-active REAC eA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a /kinetics/PSD/PP1_PSD/PP1-active REAC eA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c /kinetics/PSD/PP1_PSD/PP1-active REAC eA B +addmsg /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 /kinetics/PSD/PP1_PSD/PP1-active REAC B A +addmsg /kinetics/PSD/PP1_PSD/Inact-PP1 /kinetics/PSD/PP1_PSD/PP1-active REAC A B +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286 ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286 SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305 ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305 SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 /kinetics/PSD/PP1_PSD/I1 REAC B A +addmsg /kinetics/PSD/PKA-active/PKA-phosph-I1 /kinetics/PSD/PP1_PSD/I1 REAC sA B +addmsg /kinetics/PSD/CaM_CaN/dephosph_inhib1 /kinetics/PSD/PP1_PSD/I1 MM_PRD pA +addmsg /kinetics/PSD/PP2A/PP2A-dephosph-I1 /kinetics/PSD/PP1_PSD/I1 MM_PRD pA +addmsg /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p /kinetics/PSD/PP1_PSD/PP1-I1 MM_PRD pA +addmsg /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p /kinetics/PSD/PP1_PSD/PP1-I1 MM_PRD pA +addmsg /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 /kinetics/PSD/PP1_PSD/PP1-I1 REAC A B +addmsg /kinetics/PSD/PP1_PSD/I1 /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 PRODUCT n +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 PRODUCT n +addmsg /kinetics/PSD/PP1_PSD/PP1-I1 /kinetics/PSD/PP1_PSD/dissoc-PP1-I1 SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/I1_p /kinetics/PSD/PP1_PSD/Inact-PP1 SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/PP1-I1_p /kinetics/PSD/PP1_PSD/Inact-PP1 PRODUCT n +addmsg /kinetics/PSD/PP1_PSD/PP1-active /kinetics/PSD/PP1_PSD/Inact-PP1 SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/Inact-PP1 /kinetics/PSD/PP1_PSD/PP1-I1_p REAC B A +addmsg /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p /kinetics/PSD/PP1_PSD/PP1-I1_p REAC sA B +addmsg /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p /kinetics/PSD/PP1_PSD/PP1-I1_p REAC sA B +addmsg /kinetics/PSD/PP1_PSD/Inact-PP1 /kinetics/PSD/PP1_PSD/I1_p REAC A B +addmsg /kinetics/PSD/PKA-active/PKA-phosph-I1 /kinetics/PSD/PP1_PSD/I1_p MM_PRD pA +addmsg /kinetics/PSD/CaM_CaN/dephosph_inhib1 /kinetics/PSD/PP1_PSD/I1_p REAC sA B +addmsg /kinetics/PSD/PP2A/PP2A-dephosph-I1 /kinetics/PSD/PP1_PSD/I1_p REAC sA B +addmsg /kinetics/PSD/PP1_PSD/Ca_bind_CaN /kinetics/PSD/PP1_PSD/CaN REAC A B +addmsg /kinetics/PSD/CaM_CaN /kinetics/PSD/PP1_PSD/CaM-Bind-CaN PRODUCT n +addmsg /kinetics/PSD/PP1_PSD/Ca2_CaN /kinetics/PSD/PP1_PSD/CaM-Bind-CaN SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-Ca2 /kinetics/PSD/PP1_PSD/CaM-Bind-CaN SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/Ca_bind_CaN /kinetics/PSD/PP1_PSD/Ca2_CaN REAC B A +addmsg /kinetics/PSD/PP1_PSD/CaM-Bind-CaN /kinetics/PSD/PP1_PSD/Ca2_CaN REAC A B +addmsg /kinetics/PSD/PP1_PSD/CaN /kinetics/PSD/PP1_PSD/Ca_bind_CaN SUBSTRATE n +addmsg /kinetics/PSD/PP1_PSD/Ca2_CaN /kinetics/PSD/PP1_PSD/Ca_bind_CaN PRODUCT n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/PP1_PSD/Ca_bind_CaN SUBSTRATE n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/PP1_PSD/Ca_bind_CaN SUBSTRATE n +addmsg /kinetics/SPINE/iR /kinetics/PSD/move_to_PSD SUBSTRATE n +addmsg /kinetics/PSD/R_S2 /kinetics/PSD/move_to_PSD PRODUCT n +addmsg /kinetics/PSD/basal_phosphatase/P1 /kinetics/PSD/R_S2 MM_PRD pA +addmsg /kinetics/PSD/CaM_CaN/CaN_1 /kinetics/PSD/R_S2 MM_PRD pA +addmsg /kinetics/PSD/move_to_PSD /kinetics/PSD/R_S2 REAC B A +addmsg /kinetics/PSD/actCaMKII/CaMKII_1 /kinetics/PSD/R_S2 REAC sA B +addmsg /kinetics/PSD/basal_phosphatase/P2 /kinetics/PSD/R_SpS MM_PRD pA +addmsg /kinetics/PSD/basal_phosphatase/P1 /kinetics/PSD/R_SpS REAC sA B +addmsg /kinetics/PSD/CaM_CaN/CaN_2 /kinetics/PSD/R_SpS MM_PRD pA +addmsg /kinetics/PSD/CaM_CaN/CaN_1 /kinetics/PSD/R_SpS REAC sA B +addmsg /kinetics/PSD/actCaMKII/CaMKII_1 /kinetics/PSD/R_SpS MM_PRD pA +addmsg /kinetics/PSD/actCaMKII/CaMKII_2 /kinetics/PSD/R_SpS REAC sA B +addmsg /kinetics/PSD/basal_phosphatase/P2 /kinetics/PSD/R_SpSp REAC sA B +addmsg /kinetics/PSD/CaM_CaN/CaN_2 /kinetics/PSD/R_SpSp REAC sA B +addmsg /kinetics/PSD/actCaMKII/CaMKII_2 /kinetics/PSD/R_SpSp MM_PRD pA +addmsg /kinetics/PSD/basal_phosphatase/P1 /kinetics/PSD/basal_phosphatase REAC eA B +addmsg /kinetics/PSD/basal_phosphatase/P2 /kinetics/PSD/basal_phosphatase REAC eA B +addmsg /kinetics/PSD/basal_phosphatase /kinetics/PSD/basal_phosphatase/P1 ENZYME n +addmsg /kinetics/PSD/R_SpS /kinetics/PSD/basal_phosphatase/P1 SUBSTRATE n +addmsg /kinetics/PSD/basal_phosphatase /kinetics/PSD/basal_phosphatase/P2 ENZYME n +addmsg /kinetics/PSD/R_SpSp /kinetics/PSD/basal_phosphatase/P2 SUBSTRATE n +addmsg /kinetics/PSD/PKA-active/PKA-phosph-I1 /kinetics/PSD/PKA-active REAC eA B +addmsg /kinetics/PSD/PKA-active /kinetics/PSD/PKA-active/PKA-phosph-I1 ENZYME n +addmsg /kinetics/PSD/PP1_PSD/I1 /kinetics/PSD/PKA-active/PKA-phosph-I1 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 /kinetics/PSD/CaMKII_PSD/tot-auto SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p /kinetics/PSD/CaMKII_PSD/tot-auto SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305 /kinetics/PSD/CaMKII_PSD/tot-auto REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286 /kinetics/PSD/CaMKII_PSD/tot-auto REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/basal_CaMKII /kinetics/PSD/CaMKII_PSD/tot-auto SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph /kinetics/PSD/CaMKII_PSD/tot-auto REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286 ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305 ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305 SUBSTRATE n +addmsg /kinetics/PSD/actCaMKII /kinetics/PSD/CaMKII_PSD/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII /kinetics/PSD/CaMKII_PSD/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 /kinetics/PSD/CaMKII_PSD/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM /kinetics/PSD/CaMKII_PSD/286P SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 /kinetics/PSD/CaMKII_PSD/286P SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII SUMTOTAL n nInit +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305 /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286 /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305 ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286 ENZYME n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM PRODUCT n +addmsg /kinetics/PSD/CaM/CaM-Ca4 /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-Ca4 /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/transloc_2 /kinetics/PSD/CaMKII_PSD/NMDAR REAC A B +addmsg /kinetics/PSD/CaMKII_PSD/transloc_1 /kinetics/PSD/CaMKII_PSD/NMDAR REAC A B +addmsg /kinetics/PSD/CaMKII_PSD/back_1 /kinetics/PSD/CaMKII_PSD/NMDAR REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/back_2 /kinetics/PSD/CaMKII_PSD/NMDAR REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM /kinetics/PSD/CaMKII_PSD/transloc_2 PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/NMDAR /kinetics/PSD/CaMKII_PSD/transloc_2 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-CaM /kinetics/PSD/CaMKII_PSD/transloc_2 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM /kinetics/PSD/CaMKII_PSD/transloc_1 PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/NMDAR /kinetics/PSD/CaMKII_PSD/transloc_1 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-CaM /kinetics/PSD/CaMKII_PSD/transloc_1 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII /kinetics/PSD/CaMKII_PSD/back_1 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/NMDAR /kinetics/PSD/CaMKII_PSD/back_1 PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII /kinetics/PSD/CaMKII_PSD/back_1 PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 /kinetics/PSD/CaMKII_PSD/back_2 SUBSTRATE n +addmsg /kinetics/PSD/CaMKII_PSD/NMDAR /kinetics/PSD/CaMKII_PSD/back_2 PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-thr305 /kinetics/PSD/CaMKII_PSD/back_2 PRODUCT n +addmsg /kinetics/PSD/CaMKII_PSD/transloc_2 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM MM_PRD pA +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286-CaM REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/transloc_1 /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-286 /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-286 /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM REAC sA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286 /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM /kinetics/PSD/CaMKII_PSD/sCaMKII-CaM REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/back_1 /kinetics/PSD/CaMKII_PSD/sCaMKII REAC A B +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM /kinetics/PSD/CaMKII_PSD/sCaMKII REAC A B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a /kinetics/PSD/CaMKII_PSD/sCaMKII MM_PRD pA +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b /kinetics/PSD/CaMKII_PSD/sCaMKII MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph /kinetics/PSD/CaMKII_PSD/sCaMKII REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph /kinetics/PSD/CaMKII_PSD/sCaMKII REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305 /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305 /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p MM_PRD pA +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305 /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p REAC sA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c /kinetics/PSD/CaMKII_PSD/sCaMKII_p_p_p REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/back_2 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 REAC A B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305a /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 REAC sA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286c /kinetics/PSD/CaMKII_PSD/sCaMKII-thr305 MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/transloc_1 /kinetics/PSD/CaMKII_PSD/CaMKII-CaM REAC A B +addmsg /kinetics/PSD/CaMKII_PSD/transloc_2 /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-CaM REAC A B +addmsg /kinetics/PSD/CaMKII_PSD/back_1 /kinetics/PSD/CaMKII_PSD/CaMKII REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/back_2 /kinetics/PSD/CaMKII_PSD/CaMKII-thr305 REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM-act-305 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-305 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 REAC sA B +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 REAC A B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr286b /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 REAC sA B +addmsg /kinetics/PSD/PP1_PSD/PP1-active/Deph-thr305 /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/tot-CaM-CaMKII/CaM_act_autoph /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 MM_PRD pA +addmsg /kinetics/PSD/CaMKII_PSD/tot-auto/auton-autoph /kinetics/PSD/CaMKII_PSD/sCaMKII-thr286 MM_PRD pA +addmsg /kinetics/PSD/PP2A/PP2A-dephosph-I1 /kinetics/PSD/PP2A REAC eA B +addmsg /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p /kinetics/PSD/PP2A REAC eA B +addmsg /kinetics/PSD/PP2A /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p ENZYME n +addmsg /kinetics/PSD/PP1_PSD/PP1-I1_p /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p SUBSTRATE n +addmsg /kinetics/PSD/PP2A /kinetics/PSD/PP2A/PP2A-dephosph-I1 ENZYME n +addmsg /kinetics/PSD/PP1_PSD/I1_p /kinetics/PSD/PP2A/PP2A-dephosph-I1 SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-bind-Ca /kinetics/PSD/CaM/CaM REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca3 /kinetics/PSD/CaM/CaM-Ca3-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/CaM/CaM-Ca3-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-Ca4 /kinetics/PSD/CaM/CaM-Ca3-bind-Ca PRODUCT n +addmsg /kinetics/PSD/CaM/CaM-Ca2-bind-Ca /kinetics/PSD/CaM/CaM-Ca3 REAC B A +addmsg /kinetics/PSD/CaM/CaM-Ca3-bind-Ca /kinetics/PSD/CaM/CaM-Ca3 REAC A B +addmsg /kinetics/PSD/CaM/CaM /kinetics/PSD/CaM/CaM-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/CaM/CaM-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-Ca /kinetics/PSD/CaM/CaM-bind-Ca PRODUCT n +addmsg /kinetics/PSD/CaM/CaM-Ca2-bind-Ca /kinetics/PSD/CaM/CaM-Ca2 REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca-bind-Ca /kinetics/PSD/CaM/CaM-Ca2 REAC B A +addmsg /kinetics/PSD/PP1_PSD/CaM-Bind-CaN /kinetics/PSD/CaM/CaM-Ca2 REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca2 /kinetics/PSD/CaM/CaM-Ca2-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/CaM/CaM-Ca2-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-Ca3 /kinetics/PSD/CaM/CaM-Ca2-bind-Ca PRODUCT n +addmsg /kinetics/PSD/CaM/CaM-Ca /kinetics/PSD/CaM/CaM-Ca-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/CaM/CaM-Ca-bind-Ca SUBSTRATE n +addmsg /kinetics/PSD/CaM/CaM-Ca2 /kinetics/PSD/CaM/CaM-Ca-bind-Ca PRODUCT n +addmsg /kinetics/PSD/CaM/CaM-bind-Ca /kinetics/PSD/CaM/CaM-Ca REAC B A +addmsg /kinetics/PSD/CaM/CaM-Ca-bind-Ca /kinetics/PSD/CaM/CaM-Ca REAC A B +addmsg /kinetics/PSD/CaM/CaM-bind-Ca /kinetics/PSD/CaM/Ca REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca2-bind-Ca /kinetics/PSD/CaM/Ca REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca3-bind-Ca /kinetics/PSD/CaM/Ca REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca-bind-Ca /kinetics/PSD/CaM/Ca REAC A B +addmsg /kinetics/PSD/PP1_PSD/Ca_bind_CaN /kinetics/PSD/CaM/Ca REAC A B +addmsg /kinetics/PSD/PP1_PSD/Ca_bind_CaN /kinetics/PSD/CaM/Ca REAC A B +addmsg /kinetics/PSD/CaM/Ca_stim /kinetics/PSD/CaM/Ca REAC B A +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM /kinetics/PSD/CaM/CaM-Ca4 REAC A B +addmsg /kinetics/PSD/CaMKII_PSD/CaMKII-bind-CaM /kinetics/PSD/CaM/CaM-Ca4 REAC A B +addmsg /kinetics/PSD/CaM/CaM-Ca3-bind-Ca /kinetics/PSD/CaM/CaM-Ca4 REAC B A +addmsg /kinetics/PSD/CaM/Ca_stim /kinetics/PSD/CaM/Ca_input REAC A B +addmsg /kinetics/PSD/CaM/Ca_input /kinetics/PSD/CaM/Ca_stim SUBSTRATE n +addmsg /kinetics/PSD/CaM/Ca /kinetics/PSD/CaM/Ca_stim PRODUCT n +addmsg /kinetics/PSD/CaM_CaN/dephosph_inhib1 /kinetics/PSD/CaM_CaN REAC eA B +addmsg /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p /kinetics/PSD/CaM_CaN REAC eA B +addmsg /kinetics/PSD/PP1_PSD/CaM-Bind-CaN /kinetics/PSD/CaM_CaN REAC B A +addmsg /kinetics/PSD/CaM_CaN/CaN_1 /kinetics/PSD/CaM_CaN REAC eA B +addmsg /kinetics/PSD/CaM_CaN/CaN_2 /kinetics/PSD/CaM_CaN REAC eA B +addmsg /kinetics/PSD/CaM_CaN /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p ENZYME n +addmsg /kinetics/PSD/PP1_PSD/PP1-I1_p /kinetics/PSD/CaM_CaN/dephosph-PP1-I_p SUBSTRATE n +addmsg /kinetics/PSD/CaM_CaN /kinetics/PSD/CaM_CaN/dephosph_inhib1 ENZYME n +addmsg /kinetics/PSD/PP1_PSD/I1_p /kinetics/PSD/CaM_CaN/dephosph_inhib1 SUBSTRATE n +addmsg /kinetics/PSD/R_SpS /kinetics/PSD/CaM_CaN/CaN_1 SUBSTRATE n +addmsg /kinetics/PSD/CaM_CaN /kinetics/PSD/CaM_CaN/CaN_1 ENZYME n +addmsg /kinetics/PSD/R_SpSp /kinetics/PSD/CaM_CaN/CaN_2 SUBSTRATE n +addmsg /kinetics/PSD/CaM_CaN /kinetics/PSD/CaM_CaN/CaN_2 ENZYME n +addmsg /kinetics/DEND/CaM/CaM-bind-Ca /kinetics/DEND/CaM/CaM REAC A B +addmsg /kinetics/DEND/CaM/CaM_x2 /kinetics/DEND/CaM/CaM REAC A B +addmsg /kinetics/DEND/CaM/CaM-Ca3 /kinetics/DEND/CaM/CaM-Ca3-bind-Ca SUBSTRATE n +addmsg /kinetics/Ca /kinetics/DEND/CaM/CaM-Ca3-bind-Ca SUBSTRATE n +addmsg /kinetics/DEND/CaM/CaM-Ca4 /kinetics/DEND/CaM/CaM-Ca3-bind-Ca PRODUCT n +addmsg /kinetics/DEND/CaM/CaM-Ca2-bind-Ca /kinetics/DEND/CaM/CaM-Ca3 REAC B A +addmsg /kinetics/DEND/CaM/CaM-Ca3-bind-Ca /kinetics/DEND/CaM/CaM-Ca3 REAC A B +addmsg /kinetics/DEND/CaM/CaM /kinetics/DEND/CaM/CaM-bind-Ca SUBSTRATE n +addmsg /kinetics/Ca /kinetics/DEND/CaM/CaM-bind-Ca SUBSTRATE n +addmsg /kinetics/DEND/CaM/CaM-Ca /kinetics/DEND/CaM/CaM-bind-Ca PRODUCT n +addmsg /kinetics/DEND/CaM/CaM-Ca2-bind-Ca /kinetics/DEND/CaM/CaM-Ca2 REAC A B +addmsg /kinetics/DEND/CaM/CaM-Ca-bind-Ca /kinetics/DEND/CaM/CaM-Ca2 REAC B A +addmsg /kinetics/DEND/CaM/CaM-Ca2 /kinetics/DEND/CaM/CaM-Ca2-bind-Ca SUBSTRATE n +addmsg /kinetics/Ca /kinetics/DEND/CaM/CaM-Ca2-bind-Ca SUBSTRATE n +addmsg /kinetics/DEND/CaM/CaM-Ca3 /kinetics/DEND/CaM/CaM-Ca2-bind-Ca PRODUCT n +addmsg /kinetics/DEND/CaM/CaM-Ca /kinetics/DEND/CaM/CaM-Ca-bind-Ca SUBSTRATE n +addmsg /kinetics/Ca /kinetics/DEND/CaM/CaM-Ca-bind-Ca SUBSTRATE n +addmsg /kinetics/DEND/CaM/CaM-Ca2 /kinetics/DEND/CaM/CaM-Ca-bind-Ca PRODUCT n +addmsg /kinetics/DEND/CaM/CaM-bind-Ca /kinetics/DEND/CaM/CaM-Ca REAC B A +addmsg /kinetics/DEND/CaM/CaM-Ca-bind-Ca /kinetics/DEND/CaM/CaM-Ca REAC A B +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM /kinetics/DEND/CaM/CaM-Ca4 REAC A B +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM /kinetics/DEND/CaM/CaM-Ca4 REAC A B +addmsg /kinetics/DEND/CaM/CaM-Ca3-bind-Ca /kinetics/DEND/CaM/CaM-Ca4 REAC B A +addmsg /kinetics/DEND/CaM/CaM /kinetics/DEND/CaM/CaM_x2 SUBSTRATE n +addmsg /kinetics/DEND/CaM/CaM_xchange /kinetics/DEND/CaM/CaM_x2 PRODUCT n +addmsg /kinetics/DEND/CaM/CaM_x2 /kinetics/DEND/CaM/CaM_xchange REAC B A +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 /kinetics/DEND/CaMKII_BULK/tot-auto SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p /kinetics/DEND/CaMKII_BULK/tot-auto SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305 /kinetics/DEND/CaMKII_BULK/tot-auto REAC eA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286 /kinetics/DEND/CaMKII_BULK/tot-auto REAC eA B +addmsg /kinetics/DEND/CaMKII_BULK/basal_CaMKII /kinetics/DEND/CaMKII_BULK/tot-auto SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph /kinetics/DEND/CaMKII_BULK/tot-auto REAC eA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286 ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-CaM /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286 SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305 ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305 SUBSTRATE n +addmsg /kinetics/DEND/actCaMKII /kinetics/DEND/CaMKII_BULK/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII /kinetics/DEND/CaMKII_BULK/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr305 /kinetics/DEND/CaMKII_BULK/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-CaM /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-CaM /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM PRODUCT n +addmsg /kinetics/DEND/CaM/CaM-Ca4 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM SUBSTRATE n +addmsg /kinetics/DEND/CaM/CaM-Ca4 /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-CaM /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM PRODUCT n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM REAC B A +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM MM_PRD pA +addmsg /kinetics/DEND/PP2A/Deph-thr286 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 /kinetics/DEND/CaMKII_BULK/CaMKII-CaM REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-286 /kinetics/DEND/CaMKII_BULK/CaMKII-CaM REAC sA B +addmsg /kinetics/DEND/PP2A/Deph-thr286 /kinetics/DEND/CaMKII_BULK/CaMKII-CaM MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM /kinetics/DEND/CaMKII_BULK/CaMKII-CaM REAC B A +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 REAC A B +addmsg /kinetics/DEND/PP2A/Deph-thr286b /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 REAC sA B +addmsg /kinetics/DEND/PP2A/Deph-thr305 /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-bind-CaM /kinetics/DEND/CaMKII_BULK/CaMKII REAC A B +addmsg /kinetics/DEND/PP2A/Deph-thr305a /kinetics/DEND/CaMKII_BULK/CaMKII MM_PRD pA +addmsg /kinetics/DEND/PP2A/Deph-thr286b /kinetics/DEND/CaMKII_BULK/CaMKII MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph /kinetics/DEND/CaMKII_BULK/CaMKII REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-autoph /kinetics/DEND/CaMKII_BULK/CaMKII REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII_x2 /kinetics/DEND/CaMKII_BULK/CaMKII REAC A B +addmsg /kinetics/DEND/PP2A/Deph-thr305a /kinetics/DEND/CaMKII_BULK/CaMKII-thr305 REAC sA B +addmsg /kinetics/DEND/PP2A/Deph-thr286c /kinetics/DEND/CaMKII_BULK/CaMKII-thr305 MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p MM_PRD pA +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto/auton-305 /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p MM_PRD pA +addmsg /kinetics/DEND/PP2A/Deph-thr305 /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p REAC sA B +addmsg /kinetics/DEND/PP2A/Deph-thr286c /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p REAC sA B +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII /kinetics/DEND/CaMKII_BULK/CaMKII_x2 SUBSTRATE n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII_xchange /kinetics/DEND/CaMKII_BULK/CaMKII_x2 PRODUCT n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII_x2 /kinetics/DEND/CaMKII_BULK/CaMKII_xchange REAC B A +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/DEND/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-CaM /kinetics/DEND/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/CaMKII_BULK/tot-auto /kinetics/DEND/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/DEND/PP2A/Deph-thr286 /kinetics/DEND/PP2A REAC eA B +addmsg /kinetics/DEND/PP2A/Deph-thr286b /kinetics/DEND/PP2A REAC eA B +addmsg /kinetics/DEND/PP2A/Deph-thr305 /kinetics/DEND/PP2A REAC eA B +addmsg /kinetics/DEND/PP2A/Deph-thr305a /kinetics/DEND/PP2A REAC eA B +addmsg /kinetics/DEND/PP2A/Deph-thr286c /kinetics/DEND/PP2A REAC eA B +addmsg /kinetics/DEND/PP2A /kinetics/DEND/PP2A/Deph-thr286 ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/DEND/PP2A/Deph-thr286 SUBSTRATE n +addmsg /kinetics/DEND/PP2A /kinetics/DEND/PP2A/Deph-thr286b ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr286 /kinetics/DEND/PP2A/Deph-thr286b SUBSTRATE n +addmsg /kinetics/DEND/PP2A /kinetics/DEND/PP2A/Deph-thr305 ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p /kinetics/DEND/PP2A/Deph-thr305 SUBSTRATE n +addmsg /kinetics/DEND/PP2A /kinetics/DEND/PP2A/Deph-thr286c ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII_p_p_p /kinetics/DEND/PP2A/Deph-thr286c SUBSTRATE n +addmsg /kinetics/DEND/PP2A /kinetics/DEND/PP2A/Deph-thr305a ENZYME n +addmsg /kinetics/DEND/CaMKII_BULK/CaMKII-thr305 /kinetics/DEND/PP2A/Deph-thr305a SUBSTRATE n +addmsg /kinetics/DEND/Ca_stim /kinetics/DEND/Ca_input REAC A B +addmsg /kinetics/DEND/Ca_input /kinetics/DEND/Ca_stim SUBSTRATE n +addmsg /kinetics/Ca /kinetics/DEND/Ca_stim PRODUCT n +addmsg /kinetics/PSD/move_to_PSD /kinetics/SPINE/iR REAC A B +addmsg /kinetics/SPINE/CaM/CaM-bind-Ca /kinetics/SPINE/CaM/CaM REAC A B +addmsg /kinetics/SPINE/CaM/CaM_x2 /kinetics/SPINE/CaM/CaM REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca3 /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/Ca /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM-Ca4 /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca PRODUCT n +addmsg /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca /kinetics/SPINE/CaM/CaM-Ca3 REAC B A +addmsg /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca /kinetics/SPINE/CaM/CaM-Ca3 REAC A B +addmsg /kinetics/SPINE/CaM/CaM /kinetics/SPINE/CaM/CaM-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/Ca /kinetics/SPINE/CaM/CaM-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM-Ca /kinetics/SPINE/CaM/CaM-bind-Ca PRODUCT n +addmsg /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca /kinetics/SPINE/CaM/CaM-Ca2 REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca-bind-Ca /kinetics/SPINE/CaM/CaM-Ca2 REAC B A +addmsg /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN /kinetics/SPINE/CaM/CaM-Ca2 REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca2 /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/Ca /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM-Ca3 /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca PRODUCT n +addmsg /kinetics/SPINE/CaM/CaM-Ca /kinetics/SPINE/CaM/CaM-Ca-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/Ca /kinetics/SPINE/CaM/CaM-Ca-bind-Ca SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM-Ca2 /kinetics/SPINE/CaM/CaM-Ca-bind-Ca PRODUCT n +addmsg /kinetics/SPINE/CaM/CaM-bind-Ca /kinetics/SPINE/CaM/CaM-Ca REAC B A +addmsg /kinetics/SPINE/CaM/CaM-Ca-bind-Ca /kinetics/SPINE/CaM/CaM-Ca REAC A B +addmsg /kinetics/SPINE/CaM/CaM-bind-Ca /kinetics/SPINE/CaM/Ca REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca /kinetics/SPINE/CaM/Ca REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca /kinetics/SPINE/CaM/Ca REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca-bind-Ca /kinetics/SPINE/CaM/Ca REAC A B +addmsg /kinetics/SPINE/CaN_BULK/Ca_bind_CaN /kinetics/SPINE/CaM/Ca REAC A B +addmsg /kinetics/SPINE/CaN_BULK/Ca_bind_CaN /kinetics/SPINE/CaM/Ca REAC A B +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM /kinetics/SPINE/CaM/CaM-Ca4 REAC A B +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM /kinetics/SPINE/CaM/CaM-Ca4 REAC A B +addmsg /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca /kinetics/SPINE/CaM/CaM-Ca4 REAC B A +addmsg /kinetics/SPINE/CaM/CaM /kinetics/SPINE/CaM/CaM_x2 SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM_xchange /kinetics/SPINE/CaM/CaM_x2 PRODUCT n +addmsg /kinetics/SPINE/CaM/CaM_x2 /kinetics/SPINE/CaM/CaM_xchange REAC B A +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 /kinetics/SPINE/CaMKII_BULK/tot-auto SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p /kinetics/SPINE/CaMKII_BULK/tot-auto SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305 /kinetics/SPINE/CaMKII_BULK/tot-auto REAC eA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286 /kinetics/SPINE/CaMKII_BULK/tot-auto REAC eA B +addmsg /kinetics/SPINE/CaMKII_BULK/basal_CaMKII /kinetics/SPINE/CaMKII_BULK/tot-auto SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph /kinetics/SPINE/CaMKII_BULK/tot-auto REAC eA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286 ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286 SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305 ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305 SUBSTRATE n +addmsg /kinetics/SPINE/actCaMKII /kinetics/SPINE/CaMKII_BULK/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII /kinetics/SPINE/CaMKII_BULK/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305 /kinetics/SPINE/CaMKII_BULK/tot_CaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/SPINE/CaMKII_BULK/286P SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 /kinetics/SPINE/CaMKII_BULK/286P SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII REAC eA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM PRODUCT n +addmsg /kinetics/SPINE/CaM/CaM-Ca4 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM-Ca4 /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM PRODUCT n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM REAC B A +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM MM_PRD pA +addmsg /kinetics/SPINE/PP2A/Deph-thr286 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-286 /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-286 /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM REAC sA B +addmsg /kinetics/SPINE/PP2A/Deph-thr286 /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM REAC B A +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 REAC A B +addmsg /kinetics/SPINE/PP2A/Deph-thr286b /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 REAC sA B +addmsg /kinetics/SPINE/PP2A/Deph-thr305 /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-bind-CaM /kinetics/SPINE/CaMKII_BULK/CaMKII REAC A B +addmsg /kinetics/SPINE/PP2A/Deph-thr305a /kinetics/SPINE/CaMKII_BULK/CaMKII MM_PRD pA +addmsg /kinetics/SPINE/PP2A/Deph-thr286b /kinetics/SPINE/CaMKII_BULK/CaMKII MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM_act_autoph /kinetics/SPINE/CaMKII_BULK/CaMKII REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-autoph /kinetics/SPINE/CaMKII_BULK/CaMKII REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII_x2 /kinetics/SPINE/CaMKII_BULK/CaMKII REAC A B +addmsg /kinetics/SPINE/PP2A/Deph-thr305a /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305 REAC sA B +addmsg /kinetics/SPINE/PP2A/Deph-thr286c /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305 MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/tot-CaM-CaMKII/CaM-act-305 /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p MM_PRD pA +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto/auton-305 /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p MM_PRD pA +addmsg /kinetics/SPINE/PP2A/Deph-thr305 /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p REAC sA B +addmsg /kinetics/SPINE/PP2A/Deph-thr286c /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p REAC sA B +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII /kinetics/SPINE/CaMKII_BULK/CaMKII_x2 SUBSTRATE n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII_xchange /kinetics/SPINE/CaMKII_BULK/CaMKII_x2 PRODUCT n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII_x2 /kinetics/SPINE/CaMKII_BULK/CaMKII_xchange REAC B A +addmsg /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN /kinetics/SPINE/CaM_CaN REAC B A +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/SPINE/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-CaM /kinetics/SPINE/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/CaMKII_BULK/tot-auto /kinetics/SPINE/actCaMKII SUMTOTAL n nInit +addmsg /kinetics/SPINE/PP2A/Deph-thr286 /kinetics/SPINE/PP2A REAC eA B +addmsg /kinetics/SPINE/PP2A/Deph-thr286b /kinetics/SPINE/PP2A REAC eA B +addmsg /kinetics/SPINE/PP2A/Deph-thr305 /kinetics/SPINE/PP2A REAC eA B +addmsg /kinetics/SPINE/PP2A/Deph-thr305a /kinetics/SPINE/PP2A REAC eA B +addmsg /kinetics/SPINE/PP2A/Deph-thr286c /kinetics/SPINE/PP2A REAC eA B +addmsg /kinetics/SPINE/PP2A /kinetics/SPINE/PP2A/Deph-thr286 ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-CaM /kinetics/SPINE/PP2A/Deph-thr286 SUBSTRATE n +addmsg /kinetics/SPINE/PP2A /kinetics/SPINE/PP2A/Deph-thr286b ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286 /kinetics/SPINE/PP2A/Deph-thr286b SUBSTRATE n +addmsg /kinetics/SPINE/PP2A /kinetics/SPINE/PP2A/Deph-thr305 ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p /kinetics/SPINE/PP2A/Deph-thr305 SUBSTRATE n +addmsg /kinetics/SPINE/PP2A /kinetics/SPINE/PP2A/Deph-thr286c ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII_p_p_p /kinetics/SPINE/PP2A/Deph-thr286c SUBSTRATE n +addmsg /kinetics/SPINE/PP2A /kinetics/SPINE/PP2A/Deph-thr305a ENZYME n +addmsg /kinetics/SPINE/CaMKII_BULK/CaMKII-thr305 /kinetics/SPINE/PP2A/Deph-thr305a SUBSTRATE n +addmsg /kinetics/SPINE/CaN_BULK/Ca_bind_CaN /kinetics/SPINE/CaN_BULK/CaN REAC A B +addmsg /kinetics/SPINE/CaM_CaN /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN PRODUCT n +addmsg /kinetics/SPINE/CaN_BULK/Ca2_CaN /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN SUBSTRATE n +addmsg /kinetics/SPINE/CaM/CaM-Ca2 /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN SUBSTRATE n +addmsg /kinetics/SPINE/CaN_BULK/CaN /kinetics/SPINE/CaN_BULK/Ca_bind_CaN SUBSTRATE n +addmsg /kinetics/SPINE/CaN_BULK/Ca2_CaN /kinetics/SPINE/CaN_BULK/Ca_bind_CaN PRODUCT n +addmsg /kinetics/SPINE/CaM/Ca /kinetics/SPINE/CaN_BULK/Ca_bind_CaN SUBSTRATE n +addmsg /kinetics/SPINE/CaM/Ca /kinetics/SPINE/CaN_BULK/Ca_bind_CaN SUBSTRATE n +addmsg /kinetics/SPINE/CaN_BULK/Ca_bind_CaN /kinetics/SPINE/CaN_BULK/Ca2_CaN REAC B A +addmsg /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN /kinetics/SPINE/CaN_BULK/Ca2_CaN REAC A B +addmsg /kinetics/DEND/CaM/CaM-bind-Ca /kinetics/Ca REAC A B +addmsg /kinetics/DEND/CaM/CaM-Ca2-bind-Ca /kinetics/Ca REAC A B +addmsg /kinetics/DEND/CaM/CaM-Ca3-bind-Ca /kinetics/Ca REAC A B +addmsg /kinetics/DEND/CaM/CaM-Ca-bind-Ca /kinetics/Ca REAC A B +addmsg /kinetics/DEND/Ca_stim /kinetics/Ca REAC B A +addmsg /kinetics/PSD/CaM/Ca /graphs/conc1/Ca.Co PLOT Co *Ca.Co *red +addmsg /kinetics/PSD/actCaMKII /graphs/conc1/actCaMKII.Co PLOT Co *actCaMKII.Co *12 +addmsg /kinetics/PSD/tot_PSD_R /graphs/conc1/tot_PSD_R.Co PLOT Co *tot_PSD_R.Co *blue +addmsg /kinetics/PSD/CaM/CaM-Ca4 /graphs/conc1/CaM-Ca4.Co PLOT Co *CaM-Ca4.Co *blue +addmsg /kinetics/SPINE/CaM/Ca /graphs/conc2/Ca.Co PLOT Co *Ca.Co *red +addmsg /kinetics/SPINE/actCaMKII /graphs/conc2/actCaMKII.Co PLOT Co *actCaMKII.Co *12 +addmsg /kinetics/SPINE/CaM/CaM-Ca4 /graphs/conc2/CaM-Ca4.Co PLOT Co *CaM-Ca4.Co *blue +addmsg /kinetics/Ca /moregraphs/conc3/Ca.Co PLOT Co *Ca.Co *red +addmsg /kinetics/DEND/actCaMKII /moregraphs/conc3/actCaMKII.Co PLOT Co *actCaMKII.Co *12 +addmsg /kinetics/DEND/CaM/CaM-Ca4 /moregraphs/conc3/CaM-Ca4.Co PLOT Co *CaM-Ca4.Co *blue +enddump +// End of dump + +call /kinetics/PSD/PP1_PSD/PP1-active/notes LOAD \ +"Cohen et al Meth Enz 159 390-408 is main source of info" \ +"conc = 1.8 uM" +call /kinetics/PSD/PP1_PSD/I1/notes LOAD \ +"I1 is a 'mixed' inhibitor, but at high enz concs it looks like a non-compet" \ +"inhibitor (Foulkes et al Eur J Biochem 132 309-313 9183)." \ +"We treat it as non-compet, so it just turns the enz off" \ +"without interacting with the binding site." \ +"Cohen et al ann rev bioch refer to results where conc is " \ +"1.5 to 1.8 uM. In order to get complete inhib of PP1, which is at 1.8 uM," \ +"we need >= 1.8 uM." \ +"" \ +"" +call /kinetics/PSD/PP1_PSD/dissoc-PP1-I1/notes LOAD \ +"Let us assume that the equil in this case is very far over to the" \ +"right. This is probably safe." \ +"" +call /kinetics/PSD/PP1_PSD/Inact-PP1/notes LOAD \ +"K inhib = 1nM from Cohen Ann Rev Bioch 1989, " \ +"4 nM from Foukes et al " \ +"Assume 2 nM. kf /kb = 8.333e-4" +call /kinetics/PSD/PP1_PSD/I1_p/notes LOAD \ +"Dephosph is mainly by PP2B" +call /kinetics/PSD/basal_phosphatase/notes LOAD \ +"There isn't any clear info for this. I had originally called " \ +"it PP2A, but that causes odd interactions with other pathways." \ +"" +call /kinetics/PSD/CaMKII_PSD/CaMKII-thr286-bind-CaM/notes LOAD \ +"Same values as for the main compartment" \ +"Can the main compartment pool of Ca/CaM be used?" +call /kinetics/PSD/CaMKII_PSD/NMDAR/notes LOAD \ +"The stochiometry is a bit off here. Each NMDAR actually" \ +"binds to a holoenzyme, about 12 CaMKII subunits. But" \ +"our CaMKII calculations are in terms of individual" \ +"subunits. So as a hack, we put in much more NMDAR than" \ +"is actually there." \ +"" \ +"Dec 2011: Reconsidered this, now only 120 NMDARs." \ +"" \ +"June 02 2012. Consider these as anchor points for a dodecamer." \ +"There are far more effected CaMKII binding sites then, than" \ +"individual molecules of NMDAR. Raised limit to 40." +call /kinetics/PSD/CaMKII_PSD/transloc_2/notes LOAD \ +"Same as for transloc_1" \ +"" \ +"" \ +"" +call /kinetics/PSD/CaMKII_PSD/back_1/notes LOAD \ +"Rates set by the translocation experiments of " \ +"Shen and Meyer, Science 1999." +call /kinetics/PSD/CaMKII_PSD/back_2/notes LOAD \ +"Same as for back_1" \ +"" +call /kinetics/PSD/PP2A/PP2A-dephosph-PP1-I_p/notes LOAD \ +"k1 changed from 3.3e-6 to 6.6e-6" \ +"" +call /kinetics/PSD/PP2A/PP2A-dephosph-I1/notes LOAD \ +"PP2A does most of the dephosph of I1 at basal Ca levels. See" \ +"the review by Cohen in Ann Rev Biochem 1989." \ +"For now, lets halve Km. k1 was 3.3e-6, now 6.6e-6" \ +"" +call /kinetics/PSD/CaM/CaM/notes LOAD \ +"There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)" \ +"Say 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying" \ +"it is comparable to CaMK levels. " \ +"" +call /kinetics/PSD/CaM/CaM-Ca3-bind-Ca/notes LOAD \ +"Use K3 = 21.5 uM here from Stemmer and Klee table 3." \ +"kb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" \ +"24 Sep 2015" \ +"This is a bit too low affinity. Changing to match K2 at " \ +"Kd = 2.8." +call /kinetics/PSD/CaM/CaM-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +call /kinetics/PSD/CaM/CaM-Ca2/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +call /kinetics/PSD/CaM/CaM-Ca2-bind-Ca/notes LOAD \ +"K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get" \ +"kb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10" \ +"" +call /kinetics/PSD/CaM/CaM-Ca-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +call /kinetics/PSD/CaM/CaM-Ca/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +call /kinetics/DEND/CaM/CaM/notes LOAD \ +"There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)" \ +"Say 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying" \ +"it is comparable to CaMK levels. " \ +"" +call /kinetics/DEND/CaM/CaM-Ca3-bind-Ca/notes LOAD \ +"Use K3 = 21.5 uM here from Stemmer and Klee table 3." \ +"kb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" +call /kinetics/DEND/CaM/CaM-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +call /kinetics/DEND/CaM/CaM-Ca2/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +call /kinetics/DEND/CaM/CaM-Ca2-bind-Ca/notes LOAD \ +"K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get" \ +"kb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10" \ +"" +call /kinetics/DEND/CaM/CaM-Ca-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +call /kinetics/DEND/CaM/CaM-Ca/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +call /kinetics/DEND/CaMKII_BULK/CaMKII-thr286-bind-CaM/notes LOAD \ +"Same values as for the main compartment" \ +"Can the main compartment pool of Ca/CaM be used?" +call /kinetics/DEND/PP2A/notes LOAD \ +"Strack et al JBC 1997 show that PP2A is the primary" \ +"phosphatase acting on CaMKII in the bulk." +call /kinetics/SPINE/iR/notes LOAD \ +"Same as Fus3" \ +"" +call /kinetics/SPINE/CaM/CaM/notes LOAD \ +"There is a LOT of this in the cell: upto 1% of total protein mass. (Alberts et al)" \ +"Say 25 uM. Meyer et al Science 256 1199-1202 1992 refer to studies saying" \ +"it is comparable to CaMK levels. " \ +"" +call /kinetics/SPINE/CaM/CaM-Ca3-bind-Ca/notes LOAD \ +"Use K3 = 21.5 uM here from Stemmer and Klee table 3." \ +"kb/kf =21.5 * 6e5 so kf = 7.75e-7, kb = 10" +call /kinetics/SPINE/CaM/CaM-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +call /kinetics/SPINE/CaM/CaM-Ca2/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +call /kinetics/SPINE/CaM/CaM-Ca2-bind-Ca/notes LOAD \ +"K3 = 21.5, K4 = 2.8. Assuming that the K4 step happens first, we get" \ +"kb/kf = 2.8 uM = 1.68e6 so kf =6e-6 assuming kb = 10" \ +"" +call /kinetics/SPINE/CaM/CaM-Ca-bind-Ca/notes LOAD \ +"Lets use the fast rate consts here. Since the rates are so different, I am not" \ +"sure whether the order is relevant. These correspond to the TR2C fragment." \ +"We use the Martin et al rates here, plus the Drabicowski binding consts." \ +"All are scaled by 3X to cell temp." \ +"kf = 2e-10 kb = 72" \ +"Stemmer & Klee: K1=.9, K2=1.1. Assume 1.0uM for both. kb/kf=3.6e11." \ +"If kb=72, kf = 2e-10 (Exactly the same !)" \ +"" \ +"19 May 2006. Splitting the old CaM-TR2-bind-Ca reaction into" \ +"two steps, each binding 1 Ca. This improves numerical" \ +"stability and is conceptually better too." \ +"" \ +"Overall rates are the same, so each kf and kb is the " \ +"square root of the earlier ones. So" \ +"kf = 1.125e-4, kb = 8.4853" \ +"" +call /kinetics/SPINE/CaM/CaM-Ca/notes LOAD \ +"This is the intermediate where the TR2 end (the high-affinity end) has" \ +"bound the Ca but the TR1 end has not." +call /kinetics/SPINE/CaMKII_BULK/CaMKII-thr286-bind-CaM/notes LOAD \ +"Same values as for the main compartment" \ +"Can the main compartment pool of Ca/CaM be used?" +call /kinetics/SPINE/PP2A/notes LOAD \ +"Strack et al JBC 1997 show that PP2A is the primary" \ +"phosphatase acting on CaMKII in the bulk." +call /kinetics/SPINE/CaN_BULK/CaM-Bind-CaN/notes LOAD \ +"From Quintana et al 2005" +complete_loading diff --git a/demos/Fig4_ReacDiff/Fig4B.py b/demos/Fig4_ReacDiff/Fig4B.py new file mode 100644 index 0000000..a6ad5da --- /dev/null +++ b/demos/Fig4_ReacDiff/Fig4B.py @@ -0,0 +1,185 @@ +######################################################################## +# This program is copyright (c) Upinder S. Bhalla, NCBS, 2015. +# It is licenced under the GPL 2.1 or higher. +# There is no warranty of any kind. You are welcome to make copies under +# the provisions of the GPL. +# This program builds a multiscale model with a few spines inserted into +# a simplified cellular morphology. Each spine has a signaling model in it +# too. The program doesn't run the model, it just displays it in 3D. +######################################################################## +import moogli +import numpy +import time +import pylab +import moose +from moose import neuroml +from PyQt5 import Qt, QtCore, QtGui +import matplotlib.pyplot as plt +import sys +import os +from moose.neuroml.ChannelML import ChannelML +sys.path.append('/home/bhalla/moose/trunk/Demos/util') +import rdesigneur as rd + +PI = 3.14159265359 +useGssa = True +combineSegments = False +baselineTime = 1 +tetTime = 1 +interTetTime = 0.1 +postTetTime = 0.1 +ltdTime = 0.1 +postLtdTime = 0.1 +do3D = True +dt = 0.01 +plotdt = 0.1 +psdTetCa = 8e-3 +basalCa = 0.08e-3 +ltdCa = 0.25e-3 + +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + cellProto = [ ['ca1_minimal.p', 'elec'] ] + spineProto = [ ['makeSpineProto()', 'spine' ]] + chemProto = [ ['CaMKII_merged77.g', 'chem'] ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + chemRange = "H(1.1e-6 - dia) * H(p - 1300e-6)" + spineDistrib = [ \ + ["spine", '#apical#', \ + "spineSpacing", chemRange + " * 5e-6", \ + "spineSpacingDistrib", "1e-6", \ + "angle", "0", \ + "angleDistrib", "6.28", \ + "size", "6", \ + "sizeDistrib", "0" ] \ + ] + chemDistrib = [ \ + [ "chem", "#apical#", "install", chemRange ] + ] + + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField couplingExpr [wildcard][spatialExpn] + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [ + [ 'Ca_conc', 'Ca', 'psd/Ca_input', 'concInit', 8e-5, 1 ], + [ 'Ca_conc', 'Ca', 'dend/DEND/Ca_input', 'concInit', 8e-5, 1 ], + [ 'psd/tot_PSD_R', 'n', 'glu', 'Gbar', 0, 0.01 ], + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + spineDistrib = spineDistrib, \ + chemDistrib = chemDistrib, \ + cellProto = cellProto, \ + spineProto = spineProto, \ + chemProto = chemProto + ) + + return rdes + +def createVmViewer(rdes): + network = moogli.extensions.moose.read(rdes.elecid.path) + normalizer = moogli.utilities.normalizer(-0.08, + 0.02, + clipleft=True, + clipright=True) + colormap = moogli.colors.UniformColorMap([moogli.colors.Color(0.0, + 0.5, + 1.0, + 1.0), + moogli.colors.Color(1.0, + 0.0, + 0.0, + 0.9)]) + mapper = moogli.utilities.mapper(colormap, normalizer) + + def prelude(view): + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + view.pitch(PI/2.0) + view.down(450) + view.left(100) + view.h = 2.0 + view.zoom(5.0) + + def interlude(view): + if view.h > 0.10: + view.h /= 1.005 + view.zoom(0.005) + view.yaw(0.01) + + viewer = moogli.Viewer("vm-viewer") + viewer.attach_shapes(list(network.shapes.values())) + view = moogli.View("vm-view", + prelude=prelude, + interlude=interlude) + viewer.attach_view(view) + return viewer + + +def main(): + numpy.random.seed( 1234 ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + assert( moose.exists( '/model' ) ) + moose.element( '/model/elec/hsolve' ).tick = -1 + for i in range( 10, 18 ): + moose.setClock( i, dt ) + moose.setClock( 18, plotdt ) + moose.reinit() + + if do3D: + app = QtGui.QApplication(sys.argv) + compts = moose.wildcardFind( "/model/elec/#[ISA=CompartmentBase]" ) + print("LEN = ", len( compts )) + for i in compts: + n = i.name[:4] + if ( n == 'head' or n == 'shaf' ): + i.diameter *= 1.0 + i.Vm = 0.02 + else: + i.diameter *= 4.0 + i.Vm = -0.05 + vm_viewer = createVmViewer(rdes) + vm_viewer.showMaximized() + vm_viewer.start() + app.exec_() + +if __name__ == '__main__': + main() diff --git a/demos/Fig4_ReacDiff/Fig4CDEF.py b/demos/Fig4_ReacDiff/Fig4CDEF.py new file mode 100644 index 0000000..88f5e03 --- /dev/null +++ b/demos/Fig4_ReacDiff/Fig4CDEF.py @@ -0,0 +1,242 @@ +######################################################################## +# This program is copyright (c) Upinder S. Bhalla, NCBS, 2015. +# It is licenced under the GPL 2.1 or higher. +# There is no warranty of any kind. You are welcome to make copies under +# the provisions of the GPL. +# This program builds a multiscale model with a few spines inserted into +# a simplified cellular morphology. Each spine has a signaling model in it +# too. The program runs the model with a strong but brief calcium input +# synapses at 10 seconds, and a long but smaller Ca influx from 290 to +# 650 seconds. This simulation runs using a deterministic method. +# The runtime on a 2.2 GHz Intel core I7 processor is about 550 s. +######################################################################## +import moogli +import numpy +import time +import pylab +import moose +from moose import neuroml +from PyQt5 import Qt, QtCore, QtGui +import matplotlib.pyplot as plt +import sys +import os +from moose.neuroml.ChannelML import ChannelML +sys.path.append('/home/bhalla/moose/trunk/Demos/util') +import rdesigneur as rd + +PI = 3.14159265359 +useGssa = False +combineSegments = False +baselineTime = 10 +tetTime = 1 +interTetTime = 20 +postTetTime = 240 +ltdTime = 360 +postLtdTime = 60 +do3D = False +dt = 0.001 +plotdt = 0.1 +psdTetCa = 8e-3 +dendTetCa = 2e-3 +basalCa = 0.08e-3 +ltdCa = 0.25e-3 + +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + cellProto = [ ['ca1_minimal.p', 'elec'] ] + spineProto = [ ['makeSpineProto()', 'spine' ]] + chemProto = [ ['CaMKII_merged77.g', 'chem'] ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + chemRange = "H(1.1e-6 - dia) * H(p - 1300e-6)" + spineDistrib = [ \ + ["spine", '#apical#', \ + "spineSpacing", chemRange + " * 5e-6", \ + "spineSpacingDistrib", "1e-6", \ + "angle", "0", \ + "angleDistrib", "0", \ + "size", "1", \ + "sizeDistrib", "0" ] \ + ] + chemDistrib = [ \ + [ "chem", "#apical#", "install", chemRange ] + ] + + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField couplingExpr [wildcard][spatialExpn] + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [ + [ 'Ca_conc', 'Ca', 'psd/Ca_input', 'concInit', 8e-5, 1 ], + [ 'Ca_conc', 'Ca', 'dend/Ca_dend_input', 'concInit', 8e-5, 1 ], + [ 'psd/tot_PSD_R', 'n', 'glu', 'Gbar', 0, 0.01 ], + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + spineDistrib = spineDistrib, \ + chemDistrib = chemDistrib, \ + cellProto = cellProto, \ + spineProto = spineProto, \ + chemProto = chemProto + ) + + return rdes + +def buildOnePlot( path, field = 'getConc' ): + elist = moose.vec( '/model/chem/' + path ) + tabname = path.replace( '/', '_' ) + tab = moose.Table2( '/graphs/' + tabname, len( elist ) ).vec + moose.connect( tab, 'requestOut', elist, field, 'OneToOne' ) + +def buildPlots(): + if not moose.exists( '/graphs' ): + moose.Neutral( '/graphs' ) + buildOnePlot( 'psd/actCaMKII' ) + buildOnePlot( 'spine/actCaMKII' ) + buildOnePlot( 'dend/DEND/actCaMKII' ) + buildOnePlot( 'psd/tot_PSD_R', 'getN' ) + +def displayPlots(): + #plt.style.use( 'ggplot' ) + #fig = plt.figure( figsize=( 6, 10 ), frameon=False, facecolor='white' ) + fig = plt.figure( figsize=( 5, 10 ), facecolor='white' ) + fig.subplots_adjust( left = 0.18 ) + elist = moose.wildcardFind( '/graphs/#[0]' ) + n = len(elist) + j = 1 + timePts = numpy.arange( 0, len( elist[0].vector ) ) * elist[0].dt + labelName = [ "[CaMKII] (uM)", "[CaMKII] (uM)", + "[CaMKII] (uM)", "# AMPAR" ] + showTickLabels = [0,0,0,1] + plotTitle = ['C', 'D', 'E', 'F'] + plotScale = [1000,1000,1000,1] + for i in zip( elist, labelName, showTickLabels, plotTitle, plotScale ): + ax = plt.subplot( 4, 1, j ) + ax.spines['top'].set_visible( False ) + ax.spines['right'].set_visible( False ) + + #This function does the same as below, one axis at a time + #ax.xaxis.set_tick_params( direction = 'out' ) + #ax.yaxis.set_tick_params( direction = 'out' ) + ax.tick_params( direction = 'out' ) + + # These two are equivalent, get rid of the ticks but not the border + #ax.xaxis.set_visible( False ) + #ax.get_xaxis().set_visible( False ) + if not i[2]: + ax.set_xticklabels([]) + for tick in ax.xaxis.get_major_ticks(): + tick.tick2On = False + for tick in ax.yaxis.get_major_ticks(): + tick.tick2On = False + + plt.ylabel( i[1], fontsize = 16 ) + # alternate way of doing this separately. + #plt.yaxis.label.size_size(16) + #plt.title( 'B' ) + ax.text( -0.18, 1.0, i[3], fontsize = 18, weight = 'bold', + transform=ax.transAxes ) + j = j + 1 + for k in i[0].vec: + plt.plot( timePts, k.vector * i[4] ) + #plt.title( i.name ) + print(i[0].name) + + plt.xlabel( 'Time (s)', fontsize = 16 ) + plt.show() + +def main(): + numpy.random.seed( 1234 ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + assert( moose.exists( '/model' ) ) + moose.element( '/model/elec/hsolve' ).tick = -1 + for i in range( 0, 10 ): + moose.setClock( i, 100 ) + for i in range( 10, 18 ): + moose.setClock( i, dt ) + moose.setClock( 18, plotdt ) + moose.reinit() + buildPlots() + # Run for baseline, tetanus, and post-tetanic settling time + print('starting...') + t1 = time.time() + moose.start( baselineTime ) + caPsd = moose.vec( '/model/chem/psd/Ca_input' ) + caDend = moose.vec( '/model/chem/dend/DEND/Ca_input' ) + castim = (numpy.random.rand( len( caPsd.concInit ) ) * 0.8 + 0.2) * psdTetCa + caPsd.concInit = castim + caDend.concInit = numpy.random.rand( len( caDend.concInit ) ) * dendTetCa + moose.start( tetTime ) + caPsd.concInit = basalCa + caDend.concInit = basalCa + moose.start( interTetTime ) + caPsd.concInit = castim + caDend.concInit = numpy.random.rand( len( caDend.concInit ) ) * dendTetCa + moose.start( tetTime ) + caPsd.concInit = basalCa + caDend.concInit = basalCa + moose.start( postTetTime ) + caPsd.concInit = ltdCa + caDend.concInit = ltdCa + moose.start( ltdTime ) + caPsd.concInit = basalCa + caDend.concInit = basalCa + moose.start( postLtdTime ) + print('real time = ', time.time() - t1) + + if do3D: + app = QtGui.QApplication(sys.argv) + compts = moose.wildcardFind( "/model/elec/#[ISA=compartmentBase]" ) + ecomptPath = [x.path for x in compts] + morphology = moogli.read_morphology_from_moose(name = "", path = "/model/elec") + morphology.create_group( "group_all", ecomptPath, -0.08, 0.02, \ + [0.0, 0.5, 1.0, 1.0], [1.0, 0.0, 0.0, 0.9] ) + viewer = moogli.DynamicMorphologyViewerWidget(morphology) + def callback( morphology, viewer ): + moose.start( 0.1 ) + return True + viewer.set_callback( callback, idletime = 0 ) + viewer.showMaximized() + viewer.show() + app.exec_() + + displayPlots() + +if __name__ == '__main__': + main() diff --git a/demos/Fig4_ReacDiff/Fig4GHIJ.py b/demos/Fig4_ReacDiff/Fig4GHIJ.py new file mode 100644 index 0000000..f305c87 --- /dev/null +++ b/demos/Fig4_ReacDiff/Fig4GHIJ.py @@ -0,0 +1,242 @@ +######################################################################## +# This program is copyright (c) Upinder S. Bhalla, NCBS, 2015. +# It is licenced under the GPL 2.1 or higher. +# There is no warranty of any kind. You are welcome to make copies under +# the provisions of the GPL. +# This program builds a multiscale model with a few spines inserted into +# a simplified cellular morphology. Each spine has a signaling model in it +# too. The program runs the model with a strong but brief calcium input +# synapses at 10 seconds, and a long but smaller Ca influx from 290 to +# 650 seconds. This simulation runs using a stochastic method. +# The runtime on a 2.2 GHz Intel core I7 processor is about 465 s. +######################################################################## +import moogli +import numpy +import time +import pylab +import moose +from moose import neuroml +from PyQt5 import Qt, QtCore, QtGui +import matplotlib.pyplot as plt +import sys +import os +from moose.neuroml.ChannelML import ChannelML +sys.path.append('/home/bhalla/moose/trunk/Demos/util') +import rdesigneur as rd + +PI = 3.14159265359 +useGssa = True +combineSegments = False +baselineTime = 10 +tetTime = 1 +interTetTime = 20 +postTetTime = 240 +ltdTime = 360 +postLtdTime = 60 +do3D = False +dt = 0.001 +plotdt = 0.1 +psdTetCa = 8e-3 +dendTetCa = 2e-3 +basalCa = 0.08e-3 +ltdCa = 0.25e-3 + +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + cellProto = [ ['ca1_minimal.p', 'elec'] ] + spineProto = [ ['makeSpineProto()', 'spine' ]] + chemProto = [ ['CaMKII_merged77.g', 'chem'] ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + chemRange = "H(1.1e-6 - dia) * H(p - 1300e-6)" + spineDistrib = [ \ + ["spine", '#apical#', \ + "spineSpacing", chemRange + " * 5e-6", \ + "spineSpacingDistrib", "1e-6", \ + "angle", "0", \ + "angleDistrib", "0", \ + "size", "1", \ + "sizeDistrib", "0" ] \ + ] + chemDistrib = [ \ + [ "chem", "#apical#", "install", chemRange ] + ] + + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField couplingExpr [wildcard][spatialExpn] + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [ + [ 'Ca_conc', 'Ca', 'psd/Ca_input', 'concInit', 8e-5, 1 ], + [ 'Ca_conc', 'Ca', 'dend/Ca_dend_input', 'concInit', 8e-5, 1 ], + [ 'psd/tot_PSD_R', 'n', 'glu', 'Gbar', 0, 0.01 ], + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + spineDistrib = spineDistrib, \ + chemDistrib = chemDistrib, \ + cellProto = cellProto, \ + spineProto = spineProto, \ + chemProto = chemProto + ) + + return rdes + +def buildOnePlot( path, field = 'getConc' ): + elist = moose.vec( '/model/chem/' + path ) + tabname = path.replace( '/', '_' ) + tab = moose.Table2( '/graphs/' + tabname, len( elist ) ).vec + moose.connect( tab, 'requestOut', elist, field, 'OneToOne' ) + +def buildPlots(): + if not moose.exists( '/graphs' ): + moose.Neutral( '/graphs' ) + buildOnePlot( 'psd/actCaMKII' ) + buildOnePlot( 'spine/actCaMKII' ) + buildOnePlot( 'dend/DEND/actCaMKII' ) + buildOnePlot( 'psd/tot_PSD_R', 'getN' ) + +def displayPlots(): + #plt.style.use( 'ggplot' ) + #fig = plt.figure( figsize=( 6, 10 ), frameon=False, facecolor='white' ) + fig = plt.figure( figsize=( 5, 10 ), facecolor='white' ) + fig.subplots_adjust( left = 0.18 ) + elist = moose.wildcardFind( '/graphs/#[0]' ) + n = len(elist) + j = 1 + timePts = numpy.arange( 0, len( elist[0].vector ) ) * elist[0].dt + labelName = [ "[CaMKII] (uM)", "[CaMKII] (uM)", + "[CaMKII] (uM)", "# AMPAR" ] + showTickLabels = [0,0,0,1] + plotTitle = ['G', 'H', 'I', 'J'] + plotScale = [1000,1000,1000,1] + for i in zip( elist, labelName, showTickLabels, plotTitle, plotScale ): + ax = plt.subplot( 4, 1, j ) + ax.spines['top'].set_visible( False ) + ax.spines['right'].set_visible( False ) + + #This function does the same as below, one axis at a time + #ax.xaxis.set_tick_params( direction = 'out' ) + #ax.yaxis.set_tick_params( direction = 'out' ) + ax.tick_params( direction = 'out' ) + + # These two are equivalent, get rid of the ticks but not the border + #ax.xaxis.set_visible( False ) + #ax.get_xaxis().set_visible( False ) + if not i[2]: + ax.set_xticklabels([]) + for tick in ax.xaxis.get_major_ticks(): + tick.tick2On = False + for tick in ax.yaxis.get_major_ticks(): + tick.tick2On = False + + plt.ylabel( i[1], fontsize = 16 ) + # alternate way of doing this separately. + #plt.yaxis.label.size_size(16) + #plt.title( 'B' ) + ax.text( -0.18, 1.0, i[3], fontsize = 18, weight = 'bold', + transform=ax.transAxes ) + j = j + 1 + for k in i[0].vec: + plt.plot( timePts, k.vector * i[4] ) + #plt.title( i.name ) + print(i[0].name) + + plt.xlabel( 'Time (s)', fontsize = 16 ) + plt.show() + +def main(): + numpy.random.seed( 1234 ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + assert( moose.exists( '/model' ) ) + moose.element( '/model/elec/hsolve' ).tick = -1 + for i in range( 0, 10 ): + moose.setClock( i, 100 ) + for i in range( 10, 18 ): + moose.setClock( i, dt ) + moose.setClock( 18, plotdt ) + moose.reinit() + buildPlots() + # Run for baseline, tetanus, and post-tetanic settling time + print('starting...') + t1 = time.time() + moose.start( baselineTime ) + caPsd = moose.vec( '/model/chem/psd/Ca_input' ) + caDend = moose.vec( '/model/chem/dend/DEND/Ca_input' ) + castim = (numpy.random.rand( len( caPsd.concInit ) ) * 0.8 + 0.2) * psdTetCa + caPsd.concInit = castim + caDend.concInit = numpy.random.rand( len( caDend.concInit ) ) * dendTetCa + moose.start( tetTime ) + caPsd.concInit = basalCa + caDend.concInit = basalCa + moose.start( interTetTime ) + caPsd.concInit = castim + caDend.concInit = numpy.random.rand( len( caDend.concInit ) ) * dendTetCa + moose.start( tetTime ) + caPsd.concInit = basalCa + caDend.concInit = basalCa + moose.start( postTetTime ) + caPsd.concInit = ltdCa + caDend.concInit = ltdCa + moose.start( ltdTime ) + caPsd.concInit = basalCa + caDend.concInit = basalCa + moose.start( postLtdTime ) + print('real time = ', time.time() - t1) + + if do3D: + app = QtGui.QApplication(sys.argv) + compts = moose.wildcardFind( "/model/elec/#[ISA=compartmentBase]" ) + ecomptPath = [x.path for x in compts] + morphology = moogli.read_morphology_from_moose(name = "", path = "/model/elec") + morphology.create_group( "group_all", ecomptPath, -0.08, 0.02, \ + [0.0, 0.5, 1.0, 1.0], [1.0, 0.0, 0.0, 0.9] ) + viewer = moogli.DynamicMorphologyViewerWidget(morphology) + def callback( morphology, viewer ): + moose.start( 0.1 ) + return True + viewer.set_callback( callback, idletime = 0 ) + viewer.showMaximized() + viewer.show() + app.exec_() + + displayPlots() + +if __name__ == '__main__': + main() diff --git a/demos/Fig4_ReacDiff/ca1_minimal.p b/demos/Fig4_ReacDiff/ca1_minimal.p new file mode 100644 index 0000000..4395d62 --- /dev/null +++ b/demos/Fig4_ReacDiff/ca1_minimal.p @@ -0,0 +1,58 @@ +// genesis +// cell parameter file for the 1991 Traub CA1 hippocampal cell +// "phi" parameter reduced by e-3 +*cartesian +*relative + +*set_global RM 1.0 //ohm*m^2 +*set_global RA 1.0 //ohm*m +*set_global CM 0.03 //F/m^2 +*set_global EREST_ACT -0.06 // volts + +// The format for each compartment parameter line is : +// name parent x y z d ch dens ... +// For channels, "dens" = maximum conductance per unit area of compartment + + +dend_3 none 0 220 0 3.84 +dend_5 . 0 220 0 3.84 +dend_6 . 0 220 0 3.84 +dend_8 . 0 110 0 3.84 + +soma dend_8 0 125 0 8.46 + + +apical_10 soma 0 120 0 4.0 +apical_11 apical_10 0 120 0 3 +apical_12 apical_11 0 120 0 3 +apical_13 apical_12 0 120 0 2.6 +apical_14 apical_13 0 120 0 2.6 +apical_15 apical_14 0 120 0 2.6 +apical_16 apical_15 0 120 0 2.6 +apical_17 apical_16 0 120 0 2.6 +apical_18 apical_17 0 120 0 2.6 +apical_19 apical_18 0 120 0 2.6 + +apical_11_1 apical_10 -60 60 0 2 +apical_11_2 apical_11_1 -60 60 0 1.8 +apical_11_3 apical_11_2 0 80 0 1.5 +apical_11_4 apical_11_3 0 80 0 1.5 + +apical_13_1 apical_12 40 40 0 1.0 +apical_13_2 apical_13_1 40 40 0 1.0 + +apical_14_1 apical_13_2 0 10 0 1.0 +apical_14_2 . 0 10 0 1.0 +apical_14_3 . 0 10 0 1.0 +apical_14_4 . 0 10 0 1.0 +apical_14_5 . 0 10 0 1.0 +apical_14_6 . 0 10 0 1.0 +apical_14_7 . 0 10 0 1.0 +apical_14_8 . 0 10 0 1.0 +apical_14_9 . 0 10 0 1.0 +apical_14_10 . 0 10 0 1.0 +apical_14_11 . 0 10 0 1.0 +apical_14_12 . 0 10 0 1.0 +apical_14_13 . 0 10 0 1.0 +apical_15_1 . 0 30 0 1.0 +apical_15_2 . 0 60 0 1.0 diff --git a/demos/Fig4_ReacDiff/rxdSpineSize.py b/demos/Fig4_ReacDiff/rxdSpineSize.py new file mode 100644 index 0000000..22782de --- /dev/null +++ b/demos/Fig4_ReacDiff/rxdSpineSize.py @@ -0,0 +1,293 @@ +################################################################## +## This program is part of 'MOOSE', the +## Messaging Object Oriented Simulation Environment. +## Copyright (C) 2015 Upinder S. Bhalla. and NCBS +## It is made available under the terms of the +## GNU Lesser General Public License version 2.1 +## See the file COPYING.LIB for the full notice. +## +## rxdSpineSize.py: Builds a cell with spines and a propagating reaction +## wave. Products diffuse into the spine and cause it to get bigger. +################################################################## +import math +import pylab +import numpy +import matplotlib.pyplot as plt +import moose +import sys +sys.path.append( '../util' ) +import rdesigneur as rd +from PyQt5 import QtGui +import moogli +import moogli.extensions.moose +import matplotlib + +PI = 3.141592653 +ScalingForTesting = 10 +RM = 1.0 / ScalingForTesting +RA = 1.0 * ScalingForTesting +CM = 0.01 * ScalingForTesting +runtime = 100.0 +frameruntime = 1.0 +diffConst = 5e-12 +dendLen = 100e-6 +diffLen = 1.0e-6 +dendDia = 2e-6 +somaDia = 5e-6 +concInit = 0.001 # 1 millimolar +spineSpacing = 10e-6 +spineSpacingDistrib = 1e-6 +spineSize = 1.0 +spineSizeDistrib = 0.5 +spineAngle= numpy.pi / 2.0 +spineAngleDistrib = 0.0 + +def makeCellProto( name ): + elec = moose.Neuron( '/library/' + name ) + ecompt = [] + soma = rd.buildCompt( elec, 'soma', somaDia, somaDia, -somaDia, RM, RA, CM ) + dend = rd.buildCompt( elec, 'dend', dendLen, dendDia, 0, RM, RA, CM ) + moose.connect( soma, 'axial', dend, 'raxial' ) + elec.buildSegmentTree() + +def makeChemProto( name ): + chem = moose.Neutral( '/library/' + name ) + comptVol = diffLen * dendDia * dendDia * PI / 4.0 + for i in ( ['dend', comptVol], ['spine', 1e-19], ['psd', 1e-20] ): + print('making ', i) + compt = moose.CubeMesh( chem.path + '/' + i[0] ) + compt.volume = i[1] + #x = moose.Pool( compt.path + '/x' ) + #y = moose.BufPool( compt.path + '/y' ) + z = moose.Pool( compt.path + '/z' ) + #x.concInit = 0.0 + #x.diffConst = diffConst + #y.concInit = concInit + z.concInit = 0.0 + z.diffConst = diffConst + nInit = comptVol * 6e23 * concInit + nstr = str( 1/nInit) + + x = moose.Pool( chem.path + '/dend/x' ) + x.diffConst = diffConst + func = moose.Function( x.path + '/func' ) + func.expr = "-x0 * (0.3 - " + nstr + " * x0) * ( 1 - " + nstr + " * x0)" + print(func.expr) + func.x.num = 1 + moose.connect( x, 'nOut', func.x[0], 'input' ) + moose.connect( func, 'valueOut', x, 'increment' ) + z = moose.element( '/library/' + name + '/dend/z' ) + reac = moose.Reac( '/library/' + name + '/dend/reac' ) + reac.Kf = 1 + reac.Kb = 10 + moose.connect( reac, 'sub', x, 'reac' ) + moose.connect( reac, 'prd', z, 'reac' ) + +def makeSpineProto2( name ): + spine = moose.Neutral( '/library/' + name ) + shaft = rd.buildCompt( spine, 'shaft', 0.5e-6, 0.4e-6, 0, RM, RA, CM ) + head = rd.buildCompt( spine, 'head', 0.5e-6, 0.5e-6, 0.5e-6, RM, RA, CM ) + moose.connect( shaft, 'axial', head, 'raxial' ) + +def makeModel(): + moose.Neutral( '/library' ) + makeCellProto( 'cellProto' ) + makeChemProto( 'cProto' ) + makeSpineProto2( 'spine' ) + rdes = rd.rdesigneur( useGssa = False, \ + combineSegments = False, \ + stealCellFromLibrary = True, \ + diffusionLength = 1e-6, \ + cellProto = [['cellProto', 'elec' ]] ,\ + spineProto = [['spineProto', 'spine' ]] ,\ + chemProto = [['cProto', 'chem' ]] ,\ + spineDistrib = [ \ + ['spine', '#', \ + 'spacing', str( spineSpacing ), \ + 'spacingDistrib', str( spineSpacingDistrib ), \ + 'angle', str( spineAngle ), \ + 'angleDistrib', str( spineAngleDistrib ), \ + 'size', str( spineSize ), \ + 'sizeDistrib', str( spineSizeDistrib ) ] \ + ], \ + chemDistrib = [ \ + [ "chem", "dend", "install", "1" ] \ + ], + adaptorList = [ \ + [ 'psd/z', 'n', 'spine', 'psdArea', 10.0e-15, 300e-15 ], \ + ] \ + ) + rdes.buildModel( '/model' ) + x = moose.vec( '/model/chem/dend/x' ) + x.concInit = 0.0 + for i in range( 0,20 ): + x[i].concInit = concInit + +def makePlot( name, srcVec, field ): + tab = moose.Table2('/graphs/' + name + 'Tab', len( srcVec ) ).vec + for i in zip(srcVec, tab): + moose.connect(i[1], 'requestOut', i[0], field) + return tab + + +def displayPlots(): + for x in moose.wildcardFind( '/graphs/#[0]' ): + tab = moose.vec( x ) + for i in range( len( tab ) ): + pylab.plot( tab[i].vector, label=x.name[:-3] + " " + str( i ) ) + pylab.legend() + pylab.figure() + +def main(): + """ + This illustrates the use of rdesigneur to build a simple dendrite with + spines, and then to resize them using spine fields. These are the + fields that would be changed dynamically in a simulation with reactions + that affect spine geometry. + In this simulation there is a propagating reaction wave using a + highly abstracted equation, whose product diffuses into the spines and + makes them bigger. + """ + makeModel() + elec = moose.element( '/model/elec' ) + elec.setSpineAndPsdMesh( moose.element('/model/chem/spine'), moose.element('/model/chem/psd') ) + + eHead = moose.wildcardFind( '/model/elec/#head#' ) + oldDia = [ i.diameter for i in eHead ] + graphs = moose.Neutral( '/graphs' ) + #makePlot( 'psd_x', moose.vec( '/model/chem/psd/x' ), 'getN' ) + #makePlot( 'head_x', moose.vec( '/model/chem/spine/x' ), 'getN' ) + makePlot( 'dend_x', moose.vec( '/model/chem/dend/x' ), 'getN' ) + makePlot( 'dend_z', moose.vec( '/model/chem/dend/z' ), 'getN' ) + makePlot( 'head_z', moose.vec( '/model/chem/spine/z' ), 'getN' ) + makePlot( 'psd_z', moose.vec( '/model/chem/psd/z' ), 'getN' ) + makePlot( 'headDia', eHead, 'getDiameter' ) + + ''' + debug = moose.PyRun( '/pyrun' ) + debug.tick = 10 + debug.runString = """print "RUNNING: ", moose.element( '/model/chem/psd/z' ).n, moose.element( '/model/elec/head0' ).diameter""" + ''' + moose.reinit() + moose.start( runtime ) + + displayPlots() + pylab.plot( oldDia, label = 'old Diameter' ) + pylab.plot( [ i.diameter for i in eHead ], label = 'new Diameter' ) + pylab.legend() + pylab.show() + + app = QtGui.QApplication(sys.argv) + #widget = mv.MoogliViewer( '/model' ) + morphology = moogli.read_morphology_from_moose( name="", path = '/model/elec' ) + widget = moogli.MorphologyViewerWidget( morphology ) + widget.show() + return app.exec_() + quit() + +# Run the 'main' if this script is executed standalone. + +def showVisualization(): + makeModel() + elec = moose.element( '/model/elec' ) + elec.setSpineAndPsdMesh( moose.element('/model/chem/spine'), moose.element('/model/chem/psd') ) + + eHead = moose.wildcardFind( '/model/elec/#head#' ) + oldDia = [ i.diameter for i in eHead ] + graphs = moose.Neutral( '/graphs' ) + #makePlot( 'psd_x', moose.vec( '/model/chem/psd/x' ), 'getN' ) + #makePlot( 'head_x', moose.vec( '/model/chem/spine/x' ), 'getN' ) + makePlot( 'dend_x', moose.vec( '/model/chem/dend/x' ), 'getN' ) + dendZ = makePlot( 'dend_z', moose.vec( '/model/chem/dend/z' ), 'getN' ) + makePlot( 'head_z', moose.vec( '/model/chem/spine/z' ), 'getN' ) + psdZ = makePlot( 'psd_z', moose.vec( '/model/chem/psd/z' ), 'getN' ) + diaTab = makePlot( 'headDia', eHead, 'getDiameter' ) + # print diaTab[0].vector[-1] + # return + dendrite = moose.element("/model/elec/dend") + dendrites = [dendrite.path + "/" + str(i) for i in range(len(dendZ))] + # print dendrites + moose.reinit() + + spineHeads = moose.wildcardFind( '/model/elec/#head#') + # print moose.wildcardFind( '/model/elec/##') + + # print "dendZ", readValues(dendZ) + # print dendrite + + app = QtGui.QApplication(sys.argv) + viewer = create_viewer("/model/elec", dendrite, dendZ, diaTab, psdZ) + viewer.showMaximized() + viewer.start() + return app.exec_() + + +def create_viewer(path, moose_dendrite, dendZ, diaTab, psdZ): + network = moogli.extensions.moose.read(path=path, + vertices=15) + + dendrite = network.groups["dendrite"].shapes[moose_dendrite.path] + chem_compt_group = dendrite.subdivide(len(dendZ)) + normalizer = moogli.utilities.normalizer(0.0, + 300.0, + clipleft=True, + clipright=True) + colormap = moogli.colors.MatplotlibColorMap(matplotlib.cm.rainbow) + mapper = moogli.utilities.mapper(colormap, normalizer) + + def readValues(tables): + values = [] + for i in range(len(tables)): + values.append(tables[i].vector[-1]) + return values + + def prelude(view): + view.home() + view.pitch(math.pi / 3.0) + view.zoom(0.3) + network.groups["soma"].set("color", moogli.colors.RED) + network.groups["spine"].groups["shaft"].set("color", + moogli.colors.RED) + + def interlude(view): + moose.start(frameruntime) + network.groups["spine"].groups["head"].set("radius", + readValues(diaTab), + lambda x: x * 0.5e6) + network.groups["spine"].groups["head"].set("color", + readValues(psdZ), + mapper) + chem_compt_group.set("color", + readValues(dendZ), + mapper) + if moose.element("/clock").currentTime >= runtime: + view.stop() + + viewer = moogli.Viewer("Viewer") + viewer.attach_shapes(list(network.shapes.values())) + viewer.detach_shape(dendrite) + viewer.attach_shapes(list(chem_compt_group.shapes.values())) + + view = moogli.View("main-view", + prelude=prelude, + interlude=interlude) + cb = moogli.widgets.ColorBar(id="cb", + title="Molecule #", + text_color=moogli.colors.BLACK, + position=moogli.geometry.Vec3f(0.975, 0.5, 0.0), + size=moogli.geometry.Vec3f(0.30, 0.05, 0.0), + text_font="/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf", + orientation=math.pi / 2.0, + text_character_size=20, + label_formatting_precision=0, + colormap=moogli.colors.MatplotlibColorMap(matplotlib.cm.rainbow), + color_resolution=100, + scalar_range=moogli.geometry.Vec2f(0.0, + 300.0)) + view.attach_color_bar(cb) + viewer.attach_view(view) + return viewer + + +if __name__ == '__main__': + showVisualization() diff --git a/demos/Fig5_CellMultiscale/Fig5A.py b/demos/Fig5_CellMultiscale/Fig5A.py new file mode 100644 index 0000000..8c7d4d2 --- /dev/null +++ b/demos/Fig5_CellMultiscale/Fig5A.py @@ -0,0 +1,157 @@ +######################################################################## +# This program is copyright (c) Upinder S. Bhalla, NCBS, 2015. +# It is licenced under the GPL 2.1 or higher. +# There is no warranty of any kind. You are welcome to make copies under +# the provisions of the GPL. +# This programme illustrates building a panel of multiscale models to +# test neuronal plasticity in different contexts. The simulation is set +# to settle for 5 seconds, then a 2 second tetanus is delivered, then +# the simulation continues for another 50 seconds. +# By default we set it to run the smallest model, that takes about 4 minutes +# to run 57 seconds of simulation time, on an Intel core I7 at +# 2.2 GHz. The big model, VHC-neuron, takes almost 90 minutes. +# This program dumps data to text files for further analysis. +######################################################################## +import moogli +import numpy +import time +import pylab +import moose +from moose import neuroml +from PyQt5 import Qt, QtCore, QtGui +import matplotlib.pyplot as plt +import sys +import os +from moose.neuroml.ChannelML import ChannelML +sys.path.append('/home/bhalla/moose/trunk/Demos/util') +import rdesigneur as rd + +PI = 3.14159265359 +useGssa = True +combineSegments = False +#### Choose your favourite models here. ################# +#elecFileNames = ( "ca1_minimal.p", ) +#elecFileNames = ( "ca1_minimal.p", "h10.CNG.swc" ) +elecFileNames = ( "CA1.morph.xml", "ca1_minimal.p", "VHC-neuron.CNG.swc", "h10.CNG.swc" ) +synSpineList = [] +synDendList = [] +probeInterval = 0.1 +probeAmplitude = 1.0 +tetanusFrequency = 100.0 +tetanusAmplitude = 1000 +tetanusAmplitudeForSpines = 1000 +baselineTime = 5 +tetTime = 2 +postTetTime = 50 + +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + spineProto = [ \ + ['makeSpineProto()', 'spine' ] + ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + passiveDistrib = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", \ + "Em", "-58e-3", "initVm", "-65e-3" ], \ + [ ".", "#axon#", "RA", "0.5" ] \ + ] + spineDistrib = [ \ + ["spine", '#apical#', "spineSpacing", "20e-6", \ + "spineSpacingDistrib", "2e-6", \ + "angle", "0", \ + "angleDistrib", str( 2*PI ), \ + "size", "1", \ + "sizeDistrib", "0.5" ] \ + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + + rdes = rd.rdesigneur( + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + passiveDistrib = passiveDistrib, \ + spineDistrib = spineDistrib, \ + spineProto = spineProto \ + ) + + return rdes + +def interlude( view ): + view.yaw( 0.01 ) + +def create_viewer(rdes): + print(' doing viewer for ', rdes.soma.path) + network = moogli.extensions.moose.read(rdes.elecid.path) + normalizer = moogli.utilities.normalizer(-0.08, + 0.02, + clipleft=True, + clipright=True) + colormap = moogli.colors.UniformColorMap([moogli.colors.Color(0.0, + 0.5, + 1.0, + 1.0), + moogli.colors.Color(1.0, + 0.0, + 0.0, + 0.9)]) + mapper = moogli.utilities.mapper(colormap, normalizer) + + vms = [moose.element(x).Vm for x in list(network.shapes.keys())] + network.set("color", vms, mapper) + viewer = moogli.Viewer("vm-viewer") + viewer.attach_shapes(list(network.shapes.values())) + view = moogli.View("vm-view", interlude=interlude ) + viewer.attach_view(view) + viewer.show() + viewer.start() + view.pitch( PI/2.0 ) + return viewer + +def main(): + app = QtGui.QApplication(sys.argv) + numpy.random.seed(1234) + rdes = buildRdesigneur() + viewers = [] + j = 0 + for i in elecFileNames: + print(i) + ename = '/model' + str(j) + rdes.cellProtoList = [ ['./cells/' + i, 'elec' ] ] + rdes.buildModel( ename ) + assert( moose.exists( ename ) ) + moose.reinit() + viewers.append(create_viewer(rdes)) + j = j + 1 + app.exec_() + +if __name__ == '__main__': + main() diff --git a/demos/Fig5_CellMultiscale/Fig5BCD.py b/demos/Fig5_CellMultiscale/Fig5BCD.py new file mode 100644 index 0000000..5a4a9f7 --- /dev/null +++ b/demos/Fig5_CellMultiscale/Fig5BCD.py @@ -0,0 +1,281 @@ +######################################################################## +# This program is copyright (c) Upinder S. Bhalla, NCBS, 2015. +# It is licenced under the GPL 2.1 or higher. +# There is no warranty of any kind. You are welcome to make copies under +# the provisions of the GPL. +# This programme illustrates building a panel of multiscale models to +# test neuronal plasticity in different contexts. The simulation is set +# to settle for 5 seconds, then a 2 second tetanus is delivered, then +# the simulation continues for another 50 seconds. +# By default we set it to run the smallest model, that takes about 4 minutes +# to run 57 seconds of simulation time, on an Intel core I7 at +# 2.2 GHz. The big model, VHC-neuron, takes almost 90 minutes. +# This program dumps data to text files for further analysis. +######################################################################## +import moogli +import numpy +import time +import pylab +import moose +from moose import neuroml +from PyQt5 import Qt, QtCore, QtGui +import matplotlib.pyplot as plt +import sys +import os +from moose.neuroml.ChannelML import ChannelML +sys.path.append('/home/bhalla/moose/trunk/Demos/util') +import rdesigneur as rd + +PI = 3.14159265359 +useGssa = True +combineSegments = False +#### Choose your favourite model here. ################# +#elecFileNames = ( "ca1_minimal.p", ) +#elecFileNames = ( "ca1_minimal.p", "h10.CNG.swc" ) +elecFileNames = ( "CA1.morph.xml", "ca1_minimal.p", "VHC-neuron.CNG.swc", "h10.CNG.swc" ) +synSpineList = [] +synDendList = [] +probeInterval = 0.1 +probeAmplitude = 1.0 +tetanusFrequency = 100.0 +tetanusAmplitude = 1000 +tetanusAmplitudeForSpines = 1000 +baselineTime = 5 +tetTime = 2 +postTetTime = 50 + +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + chanProto = [ + ['./chans/hd.xml'], \ + ['./chans/kap.xml'], \ + ['./chans/kad.xml'], \ + ['./chans/kdr.xml'], \ + ['./chans/na3.xml'], \ + ['./chans/nax.xml'], \ + ['./chans/CaConc.xml'], \ + ['./chans/Ca.xml'], \ + ['./chans/NMDA.xml'], \ + ['./chans/Glu.xml'] \ + ] + spineProto = [ \ + ['makeSpineProto()', 'spine' ] + ] + chemProto = [ \ + ['./chem/' + 'psd53.g', 'ltpModel'] \ + ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + passiveDistrib = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", \ + "Em", "-58e-3", "initVm", "-65e-3" ], \ + [ ".", "#axon#", "RA", "0.5" ] \ + ] + chanDistrib = [ \ + ["hd", "#dend#,#apical#", "Gbar", "5e-2*(1+(p*3e4))" ], \ + ["kdr", "#", "Gbar", "p < 50e-6 ? 500 : 100" ], \ + ["na3", "#soma#,#dend#,#apical#", "Gbar", "250" ], \ + ["nax", "#soma#,#axon#", "Gbar", "1250" ], \ + ["kap", "#axon#,#soma#", "Gbar", "300" ], \ + ["kap", "#dend#,#apical#", "Gbar", \ + "300*(H(100-p*1e6)) * (1+(p*1e4))" ], \ + ["Ca_conc", "#dend#,#apical#", "tau", "0.0133" ], \ + ["kad", "#soma#,#dend#,#apical#", "Gbar", \ + "300*H(p - 100e-6)*(1+p*1e4)" ], \ + ["Ca", "#dend#,#apical#", "Gbar", "50" ], \ + ["glu", "#dend#,#apical#", "Gbar", "200*H(p-200e-6)" ], \ + ["NMDA", "#dend#,#apical#", "Gbar", "2*H(p-200e-6)" ] \ + ] + spineDistrib = [ \ + ["spine", '#apical#', "spineSpacing", "20e-6", \ + "spineSpacingDistrib", "2e-6", \ + "angle", "0", \ + "angleDistrib", str( 2*PI ), \ + "size", "1", \ + "sizeDistrib", "0.5" ] \ + ] + chemDistrib = [ \ + [ "ltpModel", "#apical#", "install", "1"] + ] + + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField couplingExpr [wildcard][spatialExpn] + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [ + [ 'Ca_conc', 'Ca', 'psd/Ca_input', 'concInit', 8e-5, 1 ], + [ 'Ca_conc', 'Ca', 'dend/Ca_dend_input', 'concInit', 8e-5, 1 ], + [ 'psd/tot_PSD_R', 'n', 'glu', 'Gbar', 0, 0.01 ], + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + passiveDistrib = passiveDistrib, \ + spineDistrib = spineDistrib, \ + chanDistrib = chanDistrib, \ + chemDistrib = chemDistrib, \ + spineProto = spineProto, \ + chanProto = chanProto, \ + chemProto = chemProto, \ + adaptorList = adaptorList + ) + + return rdes + +def buildPlots( rdes ): + numPlots = 10 + caPsd = moose.vec( '/model/chem/psd/Ca' ) + caHead = moose.vec( '/model/chem/spine/Ca' ) + psdR = moose.vec( '/model/chem/psd/tot_PSD_R' ) + numSpines = rdes.spineCompt.mesh.num + assert( 2 * numSpines == len( rdes.spineComptElist ) ) + if not moose.exists( '/graphs' ): + moose.Neutral( '/graphs' ) + assert( len( caPsd ) == numSpines ) + assert( len( caHead ) == numSpines ) + if numSpines < numPlots: + caPsdTab = moose.Table2( '/graphs/caPsdTab', numSpines ).vec + caHeadTab = moose.Table2( '/graphs/caHeadTab', numSpines ).vec + psdRtab = moose.Table2( '/graphs/psdRtab', numSpines ).vec + for i in range( numSpines ): + moose.connect( caPsdTab[i], 'requestOut', caPsd[i], 'getConc' ) + moose.connect( caHeadTab[i], 'requestOut', caHead[i], 'getConc') + moose.connect( psdRtab[i], 'requestOut', psdR[i], 'getN' ) + else: + caPsdTab = moose.Table2( '/graphs/caPsdTab', numPlots ).vec + caHeadTab = moose.Table2( '/graphs/caHeadTab', numPlots ).vec + psdRtab = moose.Table2( '/graphs/psdRtab', numPlots ).vec + dx = numSpines / numPlots + for i in range( numPlots ): + moose.connect( caPsdTab[i], 'requestOut', caPsd[i*dx], 'getConc' ) + moose.connect( caHeadTab[i], 'requestOut', caHead[i*dx], 'getConc' ) + moose.connect( psdRtab[i], 'requestOut', psdR[i*dx], 'getN' ) + vtab = moose.Table( '/graphs/vtab' ) + moose.connect( vtab, 'requestOut', rdes.soma, 'getVm' ) + eSpineCaTab = moose.Table( '/graphs/eSpineCaTab' ) + path = rdes.spineComptElist[1].path + "/Ca_conc" + moose.connect( eSpineCaTab, 'requestOut', path, 'getCa' ) + eSpineVmTab = moose.Table( '/graphs/eSpineVmTab' ) + moose.connect( eSpineVmTab, 'requestOut', rdes.spineComptElist[1], 'getVm' ) + eSpineGkTab = moose.Table( '/graphs/eSpineGkTab' ) + path = rdes.spineComptElist[1].path + "/NMDA" + moose.connect( eSpineGkTab, 'requestOut', path, 'getGk' ) + +def saveAndClearPlots( name ): + print('saveAndClearPlots( ', name, ' )') + for i in moose.wildcardFind( "/graphs/#" ): + #plot stuff + i.xplot( name + '.xplot', i.name ) + moose.delete( "/graphs" ) + +def printPsd( name ): + # Print the vol, the path dist from soma, the electrotonic dist, and N + psdR = moose.vec( '/model/chem/psd/tot_PSD_R' ) + neuronVoxel = moose.element( '/model/chem/spine' ).neuronVoxel + elecComptMap = moose.element( '/model/chem/dend' ).elecComptMap + print("len( neuronVoxel = ", len( neuronVoxel), min( neuronVoxel), max( neuronVoxel)) + print(len( elecComptMap), elecComptMap[0], elecComptMap[12]) + neuron = moose.element( '/model/elec' ) + ncompts = neuron.compartments + d = {} + j = 0 + for i in ncompts: + #print i + d[i] = j + j += 1 + + f = open( name + ".txt", 'w' ) + for i in range( len( psdR ) ): + n = psdR[i].n + conc = psdR[i].conc + vol = psdR[i].volume + compt = elecComptMap[ neuronVoxel[i] ] + #print compt + segIndex = d[compt[0]] + p = neuron.geometricalDistanceFromSoma[ segIndex ] + L = neuron.electrotonicDistanceFromSoma[ segIndex ] + s = str( i ) + " " + str(n) + " " + str( conc ) + " " + str(p) + " " + str(L) + "\n" + f.write( s ) + f.close() + + +def probeStimulus( time ): + for t in numpy.arange( 0, time, probeInterval ): + moose.start( probeInterval ) + for i in synSpineList: + i.activation( probeAmplitude ) + +def tetanicStimulus( time ): + tetInterval = 1.0/tetanusFrequency + for t in numpy.arange( 0, time, tetInterval ): + moose.start( tetInterval ) + for i in synDendList: + i.activation( tetanusAmplitude ) + for i in synSpineList: + i.activation( tetanusAmplitudeForSpines ) + +def main(): + global synSpineList + global synDendList + numpy.random.seed( 1234 ) + rdes = buildRdesigneur() + for i in elecFileNames: + print(i) + rdes.cellProtoList = [ ['./cells/' + i, 'elec'] ] + rdes.buildModel( '/model' ) + assert( moose.exists( '/model' ) ) + synSpineList = moose.wildcardFind( "/model/elec/#head#/glu,/model/elec/#head#/NMDA" ) + temp = set( moose.wildcardFind( "/model/elec/#/glu,/model/elec/#/NMDA" ) ) + + synDendList = list( temp - set( synSpineList ) ) + moose.reinit() + buildPlots( rdes ) + # Run for baseline, tetanus, and post-tetanic settling time + t1 = time.time() + probeStimulus( baselineTime ) + tetanicStimulus( tetTime ) + probeStimulus( postTetTime ) + print('real time = ', time.time() - t1) + + printPsd( i + ".fig5" ) + saveAndClearPlots( i + ".fig5" ) + moose.delete( '/model' ) + rdes.elecid = moose.element( '/' ) + +if __name__ == '__main__': + main() diff --git a/demos/Fig5_CellMultiscale/cells/970529c.CNG.swc b/demos/Fig5_CellMultiscale/cells/970529c.CNG.swc new file mode 100644 index 0000000..6b8748e --- /dev/null +++ b/demos/Fig5_CellMultiscale/cells/970529c.CNG.swc @@ -0,0 +1,2493 @@ +# Original file 970529c.out.swc edited by Duncan Donohue using StdSwc version 1.21 on 8/16/05. +# Irregularities and fixes documented in 970529c.out.swc.std. See StdSwc1.21.doc for more information. +# +# Claiborne to SWC conversion from L-Measure. R. Scorcioni: rscorcio@gmu.edu +# Original fileName:C:\Documents and Settings\Admin\Desktop\Jaffe\970529c.out +# +# ORIGINAL_SOURCE +# CREATURE +# REGION +# FIELD/LAYER +# TYPE +# CONTRIBUTOR +# REFERENCE +# RAW +# EXTRAS +# SOMA_AREA +# SHRINKAGE_CORRECTION +# VERSION_NUMBER +# VERSION_DATE +# ********************************************* +# SCALE 1.0 1.0 1.0 + 1 1 0 0 0 42.789 -1 + 2 3 -3.25 -3.95 -1.35 2.485 1 + 3 3 -4.34 -5.37 -1.38 1.955 2 + 4 3 -5.86 -5.37 -1.38 1.955 3 + 5 3 -5.64 -8.92 -1.38 1.955 4 + 6 3 -6.73 -11.41 -1.38 1.955 5 + 7 3 -8.03 -13.01 -1.38 1.955 6 + 8 3 -8.9 -14.61 -1.38 1.775 7 + 9 3 -9.55 -16.74 -1.38 1.775 8 + 10 3 -10.42 -17.27 0.67 1.955 9 + 11 3 -10.42 -17.8 0.67 1.955 10 + 12 3 -12.16 -18.87 0.67 0.89 11 + 13 3 -13.46 -20.65 -1.74 0.89 12 + 14 3 -15.42 -22.25 -1.74 0.89 13 + 15 3 -16.28 -23.84 -4.51 0.71 14 + 16 3 -18.46 -25.8 -4.51 0.71 15 + 17 3 -20.63 -27.93 -4.51 0.71 16 + 18 3 -21.71 -29.35 -6.68 0.71 17 + 19 3 -23.67 -32.02 -6.68 0.71 18 + 20 3 -25.19 -33.26 -6.68 0.71 19 + 21 3 -26.87 -35.31 -6.68 0.71 20 + 22 3 -28.39 -37.45 -6.68 0.71 21 + 23 3 -30.13 -38.69 -6.68 0.71 22 + 24 3 -31.43 -38.36 -7.26 0.71 23 + 25 3 -31.65 -41.2 -7.26 0.71 24 + 26 3 -33.61 -43.33 -7.26 0.71 25 + 27 3 -34.69 -45.46 -7.7 0.71 26 + 28 3 -36.21 -47.95 -7.7 0.71 27 + 29 3 -36.99 -50.85 -7.7 0.71 28 + 30 3 -38.29 -52.8 -7.7 0.71 29 + 31 3 -38.94 -54.58 -7.7 0.71 30 + 32 3 -39.59 -56.71 -7.7 0.71 31 + 33 3 -40.24 -58.84 -7.7 0.71 32 + 34 3 -41.11 -61.15 -7.7 0.71 33 + 35 3 -41.98 -63.46 -7.7 0.71 34 + 36 3 -43.02 -65.34 -7.7 0.71 35 + 37 3 -44.98 -66.94 -7.05 0.71 36 + 38 3 -46.06 -68.38 -7.34 0.71 37 + 39 3 -48.45 -71.04 -7.34 0.71 38 + 40 3 -49.54 -72.82 -7.34 0.71 39 + 41 3 -51.27 -74.6 -7.14 0.71 40 + 42 3 -53.01 -76.55 -7.14 0.71 41 + 43 3 -54.31 -78.68 -7.14 0.71 42 + 44 3 -55.86 -81.29 -7.14 0.71 43 + 45 3 -57.59 -83.07 -7.14 0.71 44 + 46 3 -59.33 -85.56 -7.14 0.71 45 + 47 3 -60.85 -88.22 -7.14 0.71 46 + 48 3 -61.8 -88.72 -7.14 0.71 47 + 49 3 -63.11 -89.43 -9.1 0.71 48 + 50 3 -64.84 -90.67 -12.48 0.71 49 + 51 3 -67.02 -91.38 -14.43 0.71 50 + 52 3 -68.54 -92.45 -15.53 0.71 51 + 53 3 -70.71 -93.87 -15.53 0.71 52 + 54 3 -72.45 -95.47 -15.53 0.71 53 + 55 3 -73.31 -97.42 -15.53 0.71 54 + 56 3 -74.18 -100.08 -17.04 0.71 55 + 57 3 -74.83 -102.75 -17.04 0.71 56 + 58 3 -74.5 -104.76 -17.04 0.71 57 + 59 3 -74.72 -106.18 -15.7 0.71 58 + 60 3 -75.15 -108.84 -15.7 0.71 59 + 61 3 -76.02 -111.15 -15.7 0.71 60 + 62 3 -77.11 -113.29 -15.7 0.71 61 + 63 3 -78.63 -115.77 -17.44 0.71 62 + 64 3 -80.15 -117.55 -17.44 0.71 63 + 65 3 -80.79 -120.07 -17.44 0.71 64 + 66 3 -80.79 -121.14 -20.1 0.71 65 + 67 3 -82.26 -123.16 -20.1 0.71 66 + 68 3 -83.78 -125.29 -20.1 0.71 67 + 69 3 -84.43 -127.24 -20.1 0.71 68 + 70 3 -85.51 -129.02 -20.1 0.71 69 + 71 3 -87.9 -130.26 -20.1 0.71 70 + 72 3 -88.77 -132.04 -20.1 0.71 71 + 73 3 -89.64 -134 -20.1 0.71 72 + 74 3 -92.03 -136.84 -20.1 0.71 73 + 75 3 -93.67 -138.89 -20.1 0.71 74 + 76 3 -94.82 -140.58 -20.1 0.71 75 + 77 3 -96.34 -141.65 -20.1 0.71 76 + 78 3 -98.3 -142.18 -20.1 0.71 77 + 79 3 -99.82 -143.6 -20.1 0.71 78 + 80 3 -100.47 -145.02 -20.1 0.71 79 + 81 3 -101.55 -146.09 -20.1 0.71 80 + 82 3 -80.79 -123.27 -20.1 0.71 66 + 83 3 -81 -125.4 -20.1 0.71 82 + 84 3 -82.09 -128.06 -20.1 0.71 83 + 85 3 -82.09 -130.2 -20.1 0.71 84 + 86 3 -82.31 -130.91 -20.1 0.71 85 + 87 3 -82.31 -131.26 -19.08 0.71 86 + 88 3 -82.74 -133.04 -19.08 0.71 87 + 89 3 -82.95 -134.31 -19.08 0.71 88 + 90 3 -82.74 -135.74 -19.08 0.71 89 + 91 3 -61.15 -89.6 -5.21 0.71 47 + 92 3 -62.46 -92.82 -5.21 0.71 91 + 93 3 -63.54 -95.67 -5.21 0.71 92 + 94 3 -64.41 -97.8 -5.21 0.71 93 + 95 3 -65.06 -100.28 -5.21 0.71 94 + 96 3 -65.28 -101.88 -5.21 0.71 95 + 97 3 -65.71 -104.55 -5.21 0.71 96 + 98 3 -65.95 -107.94 -5.21 0.71 97 + 99 3 -66.19 -110.6 -5.21 0.71 98 + 100 3 -66.62 -113.09 -5.21 0.71 99 + 101 3 -66.62 -114.86 -5.46 0.71 100 + 102 3 -67.27 -116.28 -5.46 0.71 101 + 103 3 -68.14 -117.88 -5.46 0.71 102 + 104 3 -67.92 -119.66 -3.45 0.71 103 + 105 3 -67.72 -121.38 -3.45 0.71 104 + 106 3 -67.07 -124.05 -3.45 0.71 105 + 107 3 -67.72 -126.36 -3.45 0.71 106 + 108 3 -67.72 -128.49 -3.45 0.71 107 + 109 3 -68.37 -130.09 0.1 0.71 108 + 110 3 -68.37 -132.75 0.1 0.71 109 + 111 3 -69.67 -133.99 0.1 0.71 110 + 112 3 -70.11 -135.77 0.1 0.71 111 + 113 3 -69.48 -139.14 0.1 0.71 112 + 114 3 -69.27 -140.73 0.26 0.71 113 + 115 3 -69.48 -142.69 0.26 0.71 114 + 116 3 -69.7 -144.46 0.26 0.71 115 + 117 3 -69.48 -146.24 2.1 0.71 116 + 118 3 -68.62 -148.91 2.1 0.71 117 + 119 3 -70.14 -150.68 2.1 0.71 118 + 120 3 -70.14 -151.52 1.9 0.89 119 + 121 3 -10.6 -19.79 0.67 1.245 11 + 122 3 -10.82 -20.86 0.67 1.065 121 + 123 3 -11.25 -22.63 3.11 1.065 122 + 124 3 -11.69 -23.34 3.11 1.065 123 + 125 3 -11.91 -24.05 3.1 1.065 124 + 126 3 -12.77 -25.12 3.1 0.89 125 + 127 3 -13.86 -26.72 3.1 0.89 126 + 128 3 -15.16 -28.5 2.5 0.89 127 + 129 3 -16.68 -30.45 2.5 0.89 128 + 130 3 -17.34 -32.05 4.34 0.89 129 + 131 3 -18.2 -33.65 4.34 0.89 130 + 132 3 -19.29 -34.18 6.59 0.89 131 + 133 3 -19.72 -35.07 6.06 0.89 132 + 134 3 -20.94 -35.93 6.06 0.71 133 + 135 3 -22.24 -37.71 6.06 0.71 134 + 136 3 -23.54 -38.95 8.27 0.71 135 + 137 3 -25.5 -40.02 9.75 0.71 136 + 138 3 -26.58 -40.73 12.12 0.71 137 + 139 3 -28.1 -40.91 14.37 0.71 138 + 140 3 -29.84 -40.73 15.93 0.71 139 + 141 3 -31.36 -40.91 17.94 0.71 140 + 142 3 -33.1 -41.26 20.75 0.71 141 + 143 3 -34.83 -42.15 22.3 0.71 142 + 144 3 -36.35 -43.04 24.67 0.71 143 + 145 3 -39.18 -44.46 26.14 0.71 144 + 146 3 -42.72 -46.04 26.14 0.71 145 + 147 3 -45.11 -46.22 28.64 0.71 146 + 148 3 -47.5 -46.75 31.14 0.71 147 + 149 3 -49.67 -47.82 30.56 0.71 148 + 150 3 -52.5 -48 30.56 0.71 149 + 151 3 -54.89 -48.89 30.56 0.71 150 + 152 3 -57.06 -49.24 30.56 0.71 151 + 153 3 -59.66 -49.96 30.56 0.71 152 + 154 3 -62.04 -50.13 33.3 0.71 153 + 155 3 -65.3 -51.02 33.3 0.71 154 + 156 3 -68.13 -51.73 33.3 0.71 155 + 157 3 -71.17 -53.15 32.83 0.71 156 + 158 3 -73.99 -54.4 32.83 0.71 157 + 159 3 -76.59 -55.64 32.83 0.71 158 + 160 3 -78.39 -56.69 32.83 0.71 159 + 161 3 -80.34 -57.6 32.83 0.71 160 + 162 3 -82.51 -58.13 32.83 0.71 161 + 163 3 -84.03 -59.02 32.83 0.71 162 + 164 3 -85.55 -59.73 34.9 0.71 163 + 165 3 -87.29 -59.91 34.9 0.71 164 + 166 3 -89.25 -59.91 34.9 0.71 165 + 167 3 -92.07 -61.15 36.86 0.71 166 + 168 3 -94.24 -63.28 36.86 0.71 167 + 169 3 -95.34 -65.4 36.86 0.71 168 + 170 3 -96.86 -67 36.86 0.71 169 + 171 3 -98.16 -68.24 36.86 0.71 170 + 172 3 -99.03 -69.13 36.86 0.71 171 + 173 3 -100.55 -70.02 36.86 0.71 172 + 174 3 -102.28 -71.08 36.86 0.71 173 + 175 3 -103.15 -71.79 36.42 0.71 174 + 176 3 -103.59 -72.86 32.87 0.71 175 + 177 3 -104.67 -74.99 32.87 0.71 176 + 178 3 -105.33 -77.12 32.87 0.71 177 + 179 3 -106.41 -78.9 32.87 0.71 178 + 180 3 -107.12 -80.29 32.87 0.71 179 + 181 3 -19.94 -36.85 3.29 0.71 133 + 182 3 -20.81 -37.73 3.29 0.71 181 + 183 3 -21.68 -39.51 4.88 0.71 182 + 184 3 -21.56 -41.92 1.67 0.71 183 + 185 3 -22.64 -43.87 2.73 0.71 184 + 186 3 -23.08 -46.18 0.45 0.71 185 + 187 3 -24.38 -48.32 0.45 0.71 186 + 188 3 -25.03 -50.45 0.45 0.71 187 + 189 3 -26.34 -52.58 0.45 0.71 188 + 190 3 -26.55 -54.71 0.45 0.71 189 + 191 3 -27.44 -56.21 -1.87 0.71 190 + 192 3 -28.03 -59.1 -2.98 0.71 191 + 193 3 -29.11 -61.94 -2.98 0.71 192 + 194 3 -29.55 -64.6 -2.98 0.71 193 + 195 3 -30.2 -67.09 -5.04 0.71 194 + 196 3 -30.63 -69.22 -6.86 0.71 195 + 197 3 -31.07 -71.36 -6.86 0.71 196 + 198 3 -31.59 -74.5 -6.86 0.71 197 + 199 3 -32.24 -76.45 -6.86 0.71 198 + 200 3 -33.11 -78.41 -6.42 0.71 199 + 201 3 -33.11 -81.25 -6.42 0.71 200 + 202 3 -33.33 -83.56 -6.42 0.71 201 + 203 3 -33.55 -84.8 -6.42 0.71 202 + 204 3 -33.55 -86.04 -6.86 0.89 203 + 205 3 -34.72 -86.76 -6.86 0.71 204 + 206 3 -35.59 -88.71 -6.86 0.71 205 + 207 3 -36.24 -89.98 -7.02 0.71 206 + 208 3 -36.89 -92.28 -7.78 0.71 207 + 209 3 -37.54 -94.42 -10.3 0.71 208 + 210 3 -37.98 -96.19 -10.3 0.71 209 + 211 3 -38.63 -98.15 -10.3 0.71 210 + 212 3 -39.28 -99.57 -10.62 0.71 211 + 213 3 -39.28 -100.81 -12.82 0.71 212 + 214 3 -39.9 -103.35 -12.82 0.71 213 + 215 3 -40.55 -105.13 -12.54 0.71 214 + 216 3 -41.2 -106.2 -13.25 0.71 215 + 217 3 -42.34 -107.47 -13.25 0.71 216 + 218 3 -43.86 -109.06 -13.25 0.71 217 + 219 3 -45.38 -110.13 -13.25 0.71 218 + 220 3 -46.03 -111.73 -13.25 0.71 219 + 221 3 -46.46 -113.15 -16.46 0.71 220 + 222 3 -47.98 -115.3 -16.46 0.71 221 + 223 3 -49.07 -117.44 -18.34 0.71 222 + 224 3 -51.02 -118.15 -18.34 0.71 223 + 225 3 -53.19 -119.57 -20.06 0.71 224 + 226 3 -55.37 -120.81 -20.06 0.71 225 + 227 3 -57.4 -122.11 -21.44 0.71 226 + 228 3 -59.36 -123 -24.04 0.71 227 + 229 3 -61.1 -124.95 -24.04 0.71 228 + 230 3 -63.48 -126.55 -24.04 0.71 229 + 231 3 -65.87 -128.51 -24.04 0.71 230 + 232 3 -67.18 -130.46 -27.01 0.71 231 + 233 3 -69.57 -131.35 -27.01 0.71 232 + 234 3 -71.74 -134.55 -27.01 0.71 233 + 235 3 -73.91 -135.61 -27.8 0.71 234 + 236 3 -76.22 -136.53 -30.56 0.71 235 + 237 3 -77.96 -137.07 -30.56 0.71 236 + 238 3 -80.35 -138.13 -30.56 0.71 237 + 239 3 -81.65 -139.2 -30.56 0.71 238 + 240 3 -83.17 -139.73 -30.56 0.71 239 + 241 3 -84.69 -141.15 -30.56 0.71 240 + 242 3 -86.43 -142.57 -30.56 0.71 241 + 243 3 -87.32 -144.27 -30.56 0.71 242 + 244 3 -89.49 -145.33 -30.56 0.71 243 + 245 3 -91.44 -146.22 -30.56 0.71 244 + 246 3 -41.42 -108.68 -15.42 0.71 216 + 247 3 -41.86 -111.88 -15.42 0.71 246 + 248 3 -41.86 -114.01 -15.34 0.71 247 + 249 3 -42.07 -116.15 -15.34 0.71 248 + 250 3 -41.38 -119.46 -16.16 0.71 249 + 251 3 -41.18 -121.77 -19.07 0.71 250 + 252 3 -41.83 -123.91 -18.58 0.71 251 + 253 3 -41.62 -125.86 -18.58 0.71 252 + 254 3 -41.62 -127.99 -20.79 0.71 253 + 255 3 -40.96 -130.48 -20.79 0.71 254 + 256 3 -40.96 -132.97 -22.38 0.71 255 + 257 3 -40.18 -135.18 -22.38 0.71 256 + 258 3 -40.4 -137.31 -24.36 0.71 257 + 259 3 -41.27 -139.08 -24.36 0.71 258 + 260 3 -41.7 -140.51 -26.77 0.71 259 + 261 3 -44.09 -142.64 -29.73 0.71 260 + 262 3 -44.96 -144.41 -29.73 0.71 261 + 263 3 -45.18 -146.01 -29.73 0.71 262 + 264 3 -45.18 -148.5 -29.73 0.71 263 + 265 3 -44.38 -151.06 -29.73 0.71 264 + 266 3 -43.36 -153.55 -29.73 0.71 265 + 267 3 -43.36 -155.15 -29.73 0.71 266 + 268 3 -33.55 -87.82 -5.68 0.71 204 + 269 3 -34.2 -90.66 -5.68 0.71 268 + 270 3 -34.42 -92.62 -5.68 0.71 269 + 271 3 -35.07 -95.1 -5.68 0.71 270 + 272 3 -35.5 -97.24 -5.68 0.71 271 + 273 3 -35.5 -99.72 -5.68 0.71 272 + 274 3 -34.63 -101.32 -5.68 0.71 273 + 275 3 -34.67 -103.04 -5.68 0.71 274 + 276 3 -35.1 -104.82 -6.99 0.71 275 + 277 3 -35.32 -106.42 -6.99 0.71 276 + 278 3 -35.54 -108.37 -6.99 0.71 277 + 279 3 -35.97 -109.79 -8.37 0.71 278 + 280 3 -35.97 -110.86 -8.37 0.71 279 + 281 3 -35.97 -111.22 -8.37 0.71 280 + 282 3 -37.35 -112.89 -8.37 0.71 281 + 283 3 -38.66 -115.02 -8.37 0.71 282 + 284 3 -39.31 -116.8 -8.37 0.71 283 + 285 3 -40.39 -117.68 -8.37 0.71 284 + 286 3 -41.26 -119.46 -8.37 0.71 285 + 287 3 -41.7 -120.7 -8.37 0.71 286 + 288 3 -43.43 -122.84 -8.37 0.71 287 + 289 3 -44.95 -124.08 -8.37 0.71 288 + 290 3 -46.26 -125.86 -8.37 0.71 289 + 291 3 -47.13 -127.63 -10.46 0.71 290 + 292 3 -48.14 -130.42 -10.46 0.71 291 + 293 3 -48.48 -132.24 -7.5 0.71 292 + 294 3 -49.79 -134.55 -7.5 0.71 293 + 295 3 -49.57 -136.86 -6.16 0.71 294 + 296 3 -50.66 -138.46 -7.18 0.71 295 + 297 3 -53.04 -140.24 -7.18 0.71 296 + 298 3 -55 -141.84 -4.03 0.71 297 + 299 3 -57.17 -142.37 -4.03 0.71 298 + 300 3 -58.91 -144.5 -4.03 0.71 299 + 301 3 -61.51 -145.75 -4.03 0.71 300 + 302 3 -63.6 -148.18 -3.6 0.71 301 + 303 3 -65.56 -149.78 -3.6 0.71 302 + 304 3 -66.86 -151.73 -3.6 0.71 303 + 305 3 -68.16 -152.44 -0.13 0.71 304 + 306 3 -68.62 -152.44 -0.76 0.71 305 + 307 3 -69.48 -152.97 -0.76 0.71 306 + 308 3 -35.32 -113.17 -10.42 0.71 281 + 309 3 -35.32 -117.08 -10.42 0.71 308 + 310 3 -35.25 -119.15 -10.42 0.71 309 + 311 3 -35.03 -121.29 -11.3 0.71 310 + 312 3 -34.82 -123.06 -11.3 0.71 311 + 313 3 -34.38 -124.48 -11.42 0.71 312 + 314 3 -33.73 -124.66 -11.42 0.71 313 + 315 3 -33.73 -126.79 -11.42 0.71 314 + 316 3 -33.51 -128.57 -11.42 0.71 315 + 317 3 -32.64 -129.99 -11.42 0.71 316 + 318 3 -31.56 -132.48 -11.42 0.71 317 + 319 3 -31.2 -135.26 -11.42 0.71 318 + 320 3 -30.55 -136.86 -11.42 0.71 319 + 321 3 -29.69 -139.17 -11.42 0.71 320 + 322 3 -29.04 -140.59 -11.42 0.71 321 + 323 3 -27.96 -141.84 -11.42 0.71 322 + 324 3 -28.61 -143.44 -11.42 0.71 323 + 325 3 -27.52 -143.97 -14.1 0.71 324 + 326 3 -27.31 -146.99 -14.1 0.71 325 + 327 3 -26.58 -148.51 -14.1 0.71 326 + 328 3 -25.8 -150.07 -14.1 0.71 327 + 329 3 -24.93 -151.49 -14.1 0.71 328 + 330 3 -23.41 -152.91 -14.1 0.71 329 + 331 3 -22.11 -153.62 -14.1 0.71 330 + 332 3 -20.8 -154.68 -14.1 0.71 331 + 333 3 -21.24 -157.17 -17.15 0.71 332 + 334 3 -20.59 -159.3 -17.15 0.71 333 + 335 3 -20.15 -160.72 -17.15 0.71 334 + 336 3 -19.28 -162.32 -17.15 0.71 335 + 337 3 -17.76 -162.15 -17.15 0.71 336 + 338 3 -17.11 -164.46 -17.15 0.71 337 + 339 3 -15.76 -166.02 -17.15 0.71 338 + 340 3 -14.68 -167.8 -17.15 0.71 339 + 341 3 -14.03 -168.51 -19.01 0.71 340 + 342 3 -12.75 -169.71 -19.01 0.71 341 + 343 3 -10.39 -25.65 6.52 0.71 125 + 344 3 -10.17 -27.43 7.42 0.71 343 + 345 3 -8.65 -28.32 7.42 0.71 344 + 346 3 -8.87 -30.1 7.42 0.71 345 + 347 3 -8.65 -32.4 10.22 0.71 346 + 348 3 -7.52 -34.06 13.02 0.71 347 + 349 3 -6.43 -35.66 15.02 0.71 348 + 350 3 -5.13 -37.08 14.17 0.71 349 + 351 3 -4.69 -39.21 14.17 0.71 350 + 352 3 -4.26 -40.63 16.77 0.71 351 + 353 3 -3.39 -42.41 16.22 0.71 352 + 354 3 -2.31 -43.65 16.22 0.71 353 + 355 3 -1.22 -45.61 18.72 0.71 354 + 356 3 -0.13 -47.03 19.02 0.71 355 + 357 3 1.1 -48.66 19.02 0.71 356 + 358 3 2.19 -49.37 21.17 0.71 357 + 359 3 3.92 -50.97 22.74 0.71 358 + 360 3 5.88 -52.39 22.74 0.71 359 + 361 3 7.83 -54.34 22.74 0.71 360 + 362 3 8.92 -55.76 24.71 0.71 361 + 363 3 9.79 -57.36 22.82 0.71 362 + 364 3 10.66 -59.32 22.82 0.71 363 + 365 3 11.31 -61.27 22.82 0.71 364 + 366 3 12.61 -62.87 22.82 0.71 365 + 367 3 13.67 -65.35 22.82 0.71 366 + 368 3 13.45 -67.66 24.69 0.71 367 + 369 3 13.23 -69.79 26.55 0.71 368 + 370 3 13.23 -72.28 26.55 0.71 369 + 371 3 12.36 -75.12 26.55 0.71 370 + 372 3 12.15 -77.96 26.55 0.71 371 + 373 3 13.27 -80.17 26.55 0.71 372 + 374 3 14.57 -83.01 26.55 0.71 373 + 375 3 16.31 -84.61 26.55 0.71 374 + 376 3 17.61 -86.03 25.15 0.71 375 + 377 3 18.91 -87.28 25.15 0.71 376 + 378 3 20.65 -89.58 25.15 0.71 377 + 379 3 21.52 -91.54 25.15 0.71 378 + 380 3 22.6 -93.14 25.15 0.71 379 + 381 3 23.88 -95.39 25.15 0.71 380 + 382 3 24.53 -96.99 25.15 0.71 381 + 383 3 24.75 -97.52 23.02 0.71 382 + 384 3 25.19 -98.59 23.02 0.71 383 + 385 3 24.55 -99.53 23.02 0.71 384 + 386 3 24.11 -102.72 23.02 0.71 385 + 387 3 24.11 -105.21 23.02 0.71 386 + 388 3 24.55 -106.63 23.02 0.71 387 + 389 3 23.03 -108.94 23.02 0.71 388 + 390 3 23.24 -112.14 23.02 0.71 389 + 391 3 23.24 -114.09 23.02 0.71 390 + 392 3 23.4 -116.15 23.28 0.71 391 + 393 3 23.18 -118.46 23.28 0.71 392 + 394 3 22.96 -120.41 23.28 0.71 393 + 395 3 22.75 -122.19 23.28 0.71 394 + 396 3 22.09 -124.5 23.28 0.71 395 + 397 3 20.79 -126.45 23.28 0.71 396 + 398 3 19.92 -128.4 23.28 0.71 397 + 399 3 18.93 -130.24 23.28 0.71 398 + 400 3 17.49 -131.68 23.28 0.71 399 + 401 3 26.71 -99.48 23.02 0.71 384 + 402 3 28.88 -101.61 23.02 0.71 401 + 403 3 29.96 -103.39 23.02 0.71 402 + 404 3 30.62 -104.1 25.22 0.71 403 + 405 3 32.14 -104.98 25.22 0.71 404 + 406 3 33.22 -106.94 25.22 0.71 405 + 407 3 34.09 -108.54 25.22 0.71 406 + 408 3 35.52 -110.44 23.38 0.71 407 + 409 3 36.6 -112.21 22.04 0.71 408 + 410 3 36.6 -114.88 20.78 0.71 409 + 411 3 37.25 -116.83 20.78 0.71 410 + 412 3 37.91 -119.14 20.78 0.71 411 + 413 3 37.47 -121.1 20.78 0.71 412 + 414 3 38.56 -122.52 20.78 0.71 413 + 415 3 38.34 -125.36 20.78 0.71 414 + 416 3 38.63 -127.72 20.78 0.71 415 + 417 3 39.93 -130.03 20.78 0.71 416 + 418 3 41.67 -133.05 20.78 0.71 417 + 419 3 42.76 -133.94 20.34 0.71 418 + 420 3 43.84 -136.07 18.02 0.71 419 + 421 3 44.93 -138.21 18.02 0.71 420 + 422 3 47.1 -140.16 18.02 0.71 421 + 423 3 48.97 -141.7 18.02 0.71 422 + 424 3 -3.44 -3.24 -7.45 1.42 1 + 425 3 -5.39 -5.04 -7.45 1.065 424 + 426 3 -6.26 -6.81 -9 1.065 425 + 427 3 -7.56 -9.3 -11.45 1.065 426 + 428 3 -8.87 -12.14 -11.15 1.065 427 + 429 3 -9.74 -13.74 -11.15 1.065 428 + 430 3 -9.95 -14.63 -11.15 1.065 429 + 431 3 -10.82 -15.87 -11.15 1.065 430 + 432 3 -11.04 -17.65 -10.71 0.89 431 + 433 3 -11.47 -19.96 -10.71 0.89 432 + 434 3 -11.39 -21.59 -12.99 0.89 433 + 435 3 -12.04 -24.61 -15.49 0.89 434 + 436 3 -11.39 -27.28 -15.49 0.89 435 + 437 3 -10.3 -29.41 -15.78 0.89 436 + 438 3 -9 -32.25 -15.78 0.71 437 + 439 3 -5.96 -34.92 -15.78 0.71 438 + 440 3 -4.25 -37.17 -15.78 0.71 439 + 441 3 -2.95 -40.01 -15.78 0.71 440 + 442 3 -1.86 -42.32 -17.46 0.71 441 + 443 3 -0.12 -44.45 -17.46 0.71 442 + 444 3 0.96 -46.58 -17.46 0.71 443 + 445 3 2.92 -47.3 -17.46 0.71 444 + 446 3 5.31 -49.96 -17.46 0.71 445 + 447 3 7.15 -50.93 -17.46 0.71 446 + 448 3 8.45 -51.99 -17.37 0.71 447 + 449 3 10.63 -53.26 -15.32 0.71 448 + 450 3 13.23 -54.32 -15.32 0.71 449 + 451 3 14.97 -56.1 -15.32 0.71 450 + 452 3 16.73 -57.99 -11.07 0.71 451 + 453 3 19.99 -60.3 -11.07 0.71 452 + 454 3 22.16 -62.61 -11.07 0.71 453 + 455 3 24.55 -64.56 -11.07 0.71 454 + 456 3 26.51 -65.28 -9.06 0.71 455 + 457 3 29.33 -66.52 -7.1 0.71 456 + 458 3 31.94 -68.83 -7.5 0.71 457 + 459 3 34.98 -70.6 -6.11 0.71 458 + 460 3 37.4 -72.08 -6.09 0.71 459 + 461 3 40.66 -73.68 -6.09 0.71 460 + 462 3 43.48 -75.46 -6.09 0.71 461 + 463 3 45.44 -75.99 -6.09 0.71 462 + 464 3 47.39 -77.05 -6.09 0.71 463 + 465 3 48.91 -77.23 -7.27 0.71 464 + 466 3 50.65 -78.3 -7.27 0.71 465 + 467 3 53.91 -77.77 -7.27 0.71 466 + 468 3 55.32 -79.97 -9.21 0.71 467 + 469 3 58.14 -81.03 -7.62 0.71 468 + 470 3 60.09 -82.28 -10.16 0.71 469 + 471 3 62.05 -84.05 -10.16 0.71 470 + 472 3 62.27 -85.83 -8.19 0.71 471 + 473 3 62.85 -87.26 -8.19 0.71 472 + 474 3 64.8 -88.5 -8.19 0.71 473 + 475 3 66.11 -88.86 -8.19 0.71 474 + 476 3 67.41 -90.28 -8.19 0.71 475 + 477 3 68.28 -90.63 -8.19 0.71 476 + 478 3 69.58 -90.81 -8.19 0.71 477 + 479 3 70.23 -91.17 -8.19 0.71 478 + 480 3 71.32 -91.88 -8.19 0.71 479 + 481 3 72.19 -93.12 -8.19 0.71 480 + 482 3 73.27 -93.12 -8.19 0.71 481 + 483 3 -4.72 8.96 0.48 0.89 1 + 484 3 -5.59 9.67 -1.32 0.89 483 + 485 3 -6.68 9.67 -2.98 0.89 484 + 486 3 -8.42 9.5 -2.98 0.89 485 + 487 3 -9.94 9.67 -5.41 0.89 486 + 488 3 -12.11 10.21 -3.33 0.89 487 + 489 3 -13.84 10.21 -5.28 0.89 488 + 490 3 -15.15 10.03 -5.28 0.89 489 + 491 3 -16.02 10.38 -5.26 0.89 490 + 492 3 -17.54 10.21 -7.5 0.89 491 + 493 3 -19.06 10.03 -7.5 0.89 492 + 494 3 -20.58 9.85 -7.5 0.89 493 + 495 3 -22.52 9.05 -7.5 0.89 494 + 496 3 -22.54 9.39 -8.39 1.065 495 + 497 3 -24.56 9.52 -6.46 0.71 496 + 498 3 -27.6 9.16 -6.46 0.71 497 + 499 3 -29.12 9.52 -6.46 0.71 498 + 500 3 -30.42 9.87 -6.46 0.71 499 + 501 3 -31.72 9.52 -6.46 0.71 500 + 502 3 -33.9 9.16 -6.46 0.71 501 + 503 3 -35.42 9.16 -5.93 0.71 502 + 504 3 -36.72 9.52 -5.93 0.71 503 + 505 3 -38.46 10.23 -5.93 0.71 504 + 506 3 -39.54 9.87 -3.47 0.71 505 + 507 3 -41.06 9.87 -3.47 0.71 506 + 508 3 -42.31 9.79 -3.34 0.71 507 + 509 3 -44.26 9.43 -3.34 0.71 508 + 510 3 -45.78 8.7 -3.32 0.71 509 + 511 3 -46 7.81 -3.5 0.71 510 + 512 3 -48.6 7.81 -3.5 0.71 511 + 513 3 -51.64 7.28 -3.5 0.71 512 + 514 3 -54.03 7.28 -7.03 0.71 513 + 515 3 -57.07 7.28 -8.9 0.71 514 + 516 3 -59.68 7.45 -8.9 0.71 515 + 517 3 -61.31 7.01 -9.79 0.71 516 + 518 3 -62.61 7.19 -9.79 0.71 517 + 519 3 -63.48 6.65 -8.6 0.71 518 + 520 3 -65 5.94 -11.2 0.71 519 + 521 3 -67.17 5.76 -11.2 0.71 520 + 522 3 -69.56 6.12 -13.28 0.71 521 + 523 3 -69.78 6.83 -15.9 0.71 522 + 524 3 -73.03 5.41 -18.18 0.71 523 + 525 3 -74.99 4.88 -18.18 0.71 524 + 526 3 -75.64 4.7 -16.49 0.71 525 + 527 3 -77.38 4.17 -16.49 0.71 526 + 528 3 -78.05 3.79 -16.49 0.71 527 + 529 3 -22.76 9.92 -8.69 0.71 496 + 530 3 -25.17 7.83 -13.5 0.71 529 + 531 3 -26.69 6.94 -16 0.71 530 + 532 3 -28 6.23 -17.93 0.71 531 + 533 3 -29.95 5.52 -17.93 0.71 532 + 534 3 -31.47 5.17 -17.49 0.71 533 + 535 3 -32.99 4.63 -19.25 0.71 534 + 536 3 -33.88 3.75 -21.23 0.71 535 + 537 3 -34.75 2.48 -23.63 0.71 536 + 538 3 -35.83 1.06 -21.14 0.71 537 + 539 3 -36.92 -0.36 -21.14 0.71 538 + 540 3 -37.57 -1.25 -23.59 0.71 539 + 541 3 -38.87 -2.67 -26.42 0.71 540 + 542 3 -39.53 -4.27 -25.9 0.71 541 + 543 3 -40.61 -5.52 -27.79 0.71 542 + 544 3 -41.65 -7.41 -27.57 0.71 543 + 545 3 -42.74 -8.48 -27.36 0.71 544 + 546 3 -43.83 -10.43 -29.26 0.71 545 + 547 3 -44.91 -12.39 -30.73 0.71 546 + 548 3 -46 -14.16 -32.63 0.71 547 + 549 3 -46.65 -16.12 -32.63 0.71 548 + 550 3 -46.87 -15.94 -33.9 0.71 549 + 551 3 -48.82 -18.25 -36.08 0.71 550 + 552 3 -50.34 -20.56 -35.03 0.71 551 + 553 3 -51.91 -23.32 -36.91 0.71 552 + 554 3 -53.21 -25.28 -36.91 0.71 553 + 555 3 -54.95 -26.88 -38.65 0.71 554 + 556 3 -54.95 -26.88 -39.05 0.71 555 + 557 3 -56.31 -27.93 -39.05 0.71 556 + 558 3 -57.83 -28.81 -39.05 0.71 557 + 559 3 -59.56 -30.41 -40.08 0.71 558 + 560 3 -61.52 -32.37 -40.08 0.71 559 + 561 3 -62.6 -33.61 -42.58 0.71 560 + 562 3 -63.69 -35.21 -42.58 0.71 561 + 563 3 -65.43 -36.1 -42.58 0.71 562 + 564 3 -67.38 -37.34 -44.58 0.71 563 + 565 3 -69.55 -38.41 -47.55 0.71 564 + 566 3 -70.86 -39.3 -47.55 0.71 565 + 567 3 -72.16 -40.18 -49.9 0.71 566 + 568 3 -73.71 -41.5 -51.42 0.71 567 + 569 3 -75.23 -43.63 -51.42 0.71 568 + 570 3 -76.09 -45.06 -51.42 0.71 569 + 571 3 -77.4 -46.65 -51.42 0.71 570 + 572 3 -79.14 -48.43 -51.42 0.71 571 + 573 3 -80.66 -50.56 -51.42 0.71 572 + 574 3 -81.74 -52.52 -51.12 0.71 573 + 575 3 -82.18 -54.65 -51.12 0.71 574 + 576 3 -83.04 -56.6 -51.12 0.71 575 + 577 3 -81.48 -58.19 -51.12 0.71 576 + 578 3 -83.44 -61.74 -51.12 0.71 577 + 579 3 -84.09 -64.05 -53.42 0.71 578 + 580 3 -85.17 -66.01 -53.42 0.71 579 + 581 3 -85.39 -67.96 -53.42 0.71 580 + 582 3 -85.17 -70.27 -53.42 0.71 581 + 583 3 -85.39 -72.58 -53.42 0.71 582 + 584 3 -85.19 -74.57 -53.42 0.71 583 + 585 3 -86.49 -76.88 -53.42 0.71 584 + 586 3 -87.79 -78.65 -53.42 0.71 585 + 587 3 -88.88 -80.43 -53.42 0.71 586 + 588 3 -89.31 -82.03 -53.42 0.71 587 + 589 3 -90.18 -83.81 -53.42 0.71 588 + 590 3 -92.35 -85.23 -53.42 0.71 589 + 591 3 -94.09 -86.83 -53.42 0.71 590 + 592 3 -95.07 -88.99 -55.52 0.71 591 + 593 3 -97.24 -91.12 -55.52 0.71 592 + 594 3 -99.2 -91.3 -59.18 0.71 593 + 595 3 -101.8 -91.83 -59.18 0.71 594 + 596 3 -103.54 -92.37 -57.78 0.71 595 + 597 3 -105.06 -92.54 -60.13 0.71 596 + 598 3 -106.8 -93.97 -60.13 0.71 597 + 599 3 -107.23 -94.14 -58.8 0.71 598 + 600 3 -108.97 -96.99 -60.87 0.71 599 + 601 3 -110.93 -99.3 -64.3 0.71 600 + 602 3 -112.88 -101.25 -64.3 0.71 601 + 603 3 -114.07 -103.95 -64.3 0.71 602 + 604 3 -115.16 -106.08 -64.3 0.71 603 + 605 3 -116.46 -108.03 -64.3 0.71 604 + 606 3 -118.42 -108.57 -64.3 0.71 605 + 607 3 -120.8 -109.45 -64.3 0.71 606 + 608 3 -123.19 -110.16 -64.3 0.71 607 + 609 3 -125.58 -109.28 -63.32 0.71 608 + 610 3 -127.32 -109.99 -63.32 0.71 609 + 611 3 -129.27 -110.34 -63.32 0.71 610 + 612 3 -130.79 -110.34 -63.32 0.71 611 + 613 3 -132.54 -110.46 -61.53 0.71 612 + 614 3 -135.8 -111.88 -61.53 0.71 613 + 615 3 -136.67 -113.3 -61.53 0.71 614 + 616 3 -137.75 -114.9 -61.53 0.71 615 + 617 3 -138.19 -116.32 -61.53 0.71 616 + 618 3 -138.4 -118.28 -61.53 0.71 617 + 619 3 -54.95 -29.54 -40.82 0.71 556 + 620 3 -56.03 -31.5 -40.82 0.71 619 + 621 3 -56.68 -33.1 -40.82 0.71 620 + 622 3 -57.55 -35.58 -41.45 0.71 621 + 623 3 -58.04 -38.86 -41.45 0.71 622 + 624 3 -58.91 -40.63 -43.09 0.71 623 + 625 3 -59.77 -42.94 -43.87 0.71 624 + 626 3 -60.22 -44.48 -43.87 0.71 625 + 627 3 -60.65 -46.08 -43.07 0.71 626 + 628 3 -61.24 -47.99 -43.07 0.71 627 + 629 3 -61.89 -49.59 -43.07 0.71 628 + 630 3 -62.32 -50.83 -43.07 0.71 629 + 631 3 8.75 -0.81 1.12 1.065 1 + 632 3 9.61 -2.79 -0.82 0.89 631 + 633 3 11.13 -4.57 -0.82 0.89 632 + 634 3 12 -6.7 -3.23 0.89 633 + 635 3 12.87 -8.3 -3.23 0.89 634 + 636 3 14.17 -9.9 -3.23 0.89 635 + 637 3 15.69 -12.21 -3.23 0.89 636 + 638 3 17.35 -13.53 -3.23 0.71 637 + 639 3 19.09 -17.26 -3.23 0.71 638 + 640 3 20.39 -19.39 -3.23 0.71 639 + 641 3 21.48 -20.45 -3.23 0.71 640 + 642 3 22.13 -23.65 -3.23 0.71 641 + 643 3 22.56 -25.43 -4.4 0.71 642 + 644 3 24.3 -27.56 -4.4 0.71 643 + 645 3 25.08 -29.28 -4.4 0.71 644 + 646 3 25.65 -30.5 -4.4 0.71 645 + 647 3 27.17 -31.92 -4.4 0.71 646 + 648 3 27.8 -32.81 -4.4 0.89 647 + 649 3 26.95 -34.99 -4.4 0.71 648 + 650 3 26.29 -37.3 -4.4 0.71 649 + 651 3 25.86 -39.08 -4.4 0.71 650 + 652 3 25.64 -40.5 -6.3 0.71 651 + 653 3 26.29 -41.74 -6.3 0.71 652 + 654 3 26.73 -43.7 -6.3 0.71 653 + 655 3 26.51 -45.65 -6.3 0.71 654 + 656 3 26.95 -47.25 -6.3 0.71 655 + 657 3 27.6 -49.2 -7.94 0.71 656 + 658 3 28.05 -51.3 -7.94 0.71 657 + 659 3 28.7 -53.63 -7.83 0.71 658 + 660 3 29.35 -55.23 -7.38 0.71 659 + 661 3 30 -57.01 -10.33 0.71 660 + 662 3 30.44 -59.14 -10.35 0.71 661 + 663 3 30.61 -59.41 -10.35 0.71 662 + 664 3 29.51 -60.88 -12.27 0.71 663 + 665 3 28.43 -64.26 -12.27 0.71 664 + 666 3 28.21 -66.21 -12.27 0.71 665 + 667 3 27.56 -67.81 -12.9 0.71 666 + 668 3 27.56 -69.76 -12.9 0.71 667 + 669 3 26.91 -72.07 -14.77 0.71 668 + 670 3 27.12 -74.2 -14.77 0.71 669 + 671 3 27.21 -76.04 -16.82 0.71 670 + 672 3 27.21 -79.06 -16.82 0.71 671 + 673 3 27.21 -81.54 -16.82 0.71 672 + 674 3 27.65 -83.5 -16.82 0.71 673 + 675 3 27.43 -86.16 -16.82 0.71 674 + 676 3 27.43 -88.83 -16.82 0.71 675 + 677 3 27.4 -91.52 -19.22 0.71 676 + 678 3 28.05 -94.37 -19.22 0.71 677 + 679 3 28.05 -97.21 -19.22 0.71 678 + 680 3 28.05 -100.41 -19.22 0.71 679 + 681 3 27.83 -102.72 -19.22 0.71 680 + 682 3 27.6 -104.61 -19.22 0.71 681 + 683 3 27.38 -106.21 -19.22 0.71 682 + 684 3 32.35 -61.19 -11.72 0.71 663 + 685 3 33.44 -63.15 -11.72 0.71 684 + 686 3 34.74 -64.92 -11.72 0.71 685 + 687 3 35.83 -66.52 -11.72 0.71 686 + 688 3 36.91 -68.3 -11.72 0.71 687 + 689 3 37.56 -69.72 -12.58 0.71 688 + 690 3 38.43 -70.78 -14.82 0.71 689 + 691 3 39.08 -73.63 -16.77 0.71 690 + 692 3 39.9 -74.37 -15.78 0.71 691 + 693 3 40.99 -77.57 -15.78 0.71 692 + 694 3 41.88 -79.41 -18.03 0.71 693 + 695 3 43.4 -81.9 -18.03 0.71 694 + 696 3 44.27 -83.85 -18.03 0.71 695 + 697 3 45.36 -85.63 -18.03 0.71 696 + 698 3 46.01 -87.76 -18.03 0.71 697 + 699 3 47.51 -89.18 -20.03 0.71 698 + 700 3 48.6 -90.61 -21.13 0.71 699 + 701 3 49.25 -92.38 -20.53 0.71 700 + 702 3 50.73 -94.57 -20.53 0.71 701 + 703 3 51.8 -96.55 -20.53 0.71 702 + 704 3 53.11 -97.61 -21.27 0.71 703 + 705 3 53.97 -99.03 -21.27 0.71 704 + 706 3 55.28 -101.34 -21.27 0.71 705 + 707 3 57.23 -102.23 -21.27 0.71 706 + 708 3 59.84 -104.01 -23.21 0.71 707 + 709 3 61.58 -105.25 -23.21 0.71 708 + 710 3 63.75 -105.07 -23.21 0.71 709 + 711 3 65.7 -105.78 -21.2 0.71 710 + 712 3 67.01 -106.14 -22.98 0.71 711 + 713 3 69.39 -107.38 -22.98 0.71 712 + 714 3 72.24 -108.7 -22.98 0.71 713 + 715 3 74.41 -109.24 -22.98 0.71 714 + 716 3 75.93 -110.3 -23.78 0.71 715 + 717 3 77.23 -111.9 -23.78 0.71 716 + 718 3 78.54 -113.5 -23.78 0.71 717 + 719 3 79.62 -115.1 -23.78 0.71 718 + 720 3 81.14 -117.23 -23.78 0.71 719 + 721 3 82.88 -119.01 -23.78 0.71 720 + 722 3 83.96 -120.25 -24.59 0.71 721 + 723 3 85.27 -121.49 -24.59 0.71 722 + 724 3 86.35 -122.92 -24.59 0.71 723 + 725 3 87.92 -124.28 -24.59 0.71 724 + 726 3 29.76 -33.88 -2.3 0.71 648 + 727 3 31.71 -36.37 -2.3 0.71 726 + 728 3 33.23 -37.79 -2.3 0.71 727 + 729 3 33.67 -37.96 3.37 0.71 728 + 730 3 35.19 -40.63 3.37 0.71 729 + 731 3 36.49 -41.52 5.54 0.71 730 + 732 3 37.58 -42.94 5.54 0.71 731 + 733 3 38.88 -43.83 7.86 0.71 732 + 734 3 41.19 -45.86 7.86 0.71 733 + 735 3 42.49 -47.28 7.86 0.71 734 + 736 3 43.57 -48.7 10.42 0.71 735 + 737 3 44.66 -51.37 10.42 0.71 736 + 738 3 46.18 -52.25 12.98 0.71 737 + 739 3 47.48 -53.32 14.64 0.71 738 + 740 3 48.79 -54.56 14.64 0.71 739 + 741 3 49.87 -55.81 16.12 0.71 740 + 742 3 50.52 -57.94 17.84 0.71 741 + 743 3 51.18 -59.72 20.06 0.71 742 + 744 3 50.33 -63.95 20.06 0.71 743 + 745 3 50.11 -66.63 22.44 0.71 744 + 746 3 50.33 -68.23 21.22 0.71 745 + 747 3 50.55 -70.36 22.63 0.71 746 + 748 3 50.98 -72.32 22.82 0.71 747 + 749 3 50.76 -74.98 25.59 0.71 748 + 750 3 51.67 -77.75 25.59 0.71 749 + 751 3 52.1 -80.59 25.59 0.71 750 + 752 3 52.97 -82.37 25.59 0.71 751 + 753 3 53.19 -84.85 25.51 0.71 752 + 754 3 53.62 -86.98 25.51 0.71 753 + 755 3 54.05 -89.12 25.51 0.71 754 + 756 3 54.71 -91.43 25.51 0.71 755 + 757 3 55.48 -94.1 25.51 0.71 756 + 758 3 55.47 -95.52 26.67 0.71 757 + 759 3 56.77 -96.06 26.67 0.71 758 + 760 3 56.33 -99.79 28.31 0.71 759 + 761 3 56.4 -101.81 28.31 0.71 760 + 762 3 55.96 -104.12 28.31 0.71 761 + 763 3 57.05 -106.61 28.31 0.71 762 + 764 3 57.47 -108.39 28.98 0.71 763 + 765 3 58.33 -110.52 28.98 0.71 764 + 766 3 58.33 -112.12 28.98 0.71 765 + 767 3 58.55 -114.07 28.98 0.71 766 + 768 3 59.85 -115.49 28.98 0.71 767 + 769 3 59.8 -117.52 28.98 0.71 768 + 770 3 59.58 -119.3 28.98 0.71 769 + 771 3 59.15 -121.43 28.98 0.71 770 + 772 3 59.8 -122.85 28.98 0.71 771 + 773 3 60.45 -124.45 28.98 0.71 772 + 774 3 61.53 -125.7 28.98 0.71 773 + 775 3 61.75 -128.18 28.98 0.71 774 + 776 3 61.32 -129.96 28.98 0.71 775 + 777 4 11.43 16.93 -0.7 2.485 1 + 778 4 13.17 18.71 -0.7 2.485 777 + 779 4 14.69 19.95 -0.6 2.31 778 + 780 4 16.43 21.55 -0.6 2.31 779 + 781 4 18.38 23.15 -3.24 2.31 780 + 782 4 20.34 25.64 -2.86 2.31 781 + 783 4 23.6 29.01 -2.86 2.13 782 + 784 4 25.07 30.07 -0.58 2.13 783 + 785 4 27.24 32.2 -0.58 2.13 784 + 786 4 28.11 34.33 -0.58 2.13 785 + 787 4 28.98 36.46 1.38 2.13 786 + 788 4 30.28 38.42 1.38 2.13 787 + 789 4 31.8 40.01 3.08 2.13 788 + 790 4 33.54 42.15 1.32 1.955 789 + 791 4 35.28 44.28 1.96 1.6 790 + 792 4 38.42 47.91 1.96 1.775 791 + 793 4 39.51 49.15 -0.19 1.775 792 + 794 4 39.73 51.11 0.88 1.775 793 + 795 4 41.03 53.24 0.88 1.775 794 + 796 4 41.9 54.66 -1.98 1.775 795 + 797 4 43.42 56.97 -1.98 1.775 796 + 798 4 45.81 58.57 -2.04 1.775 797 + 799 4 46.43 59.84 -4.69 1.775 798 + 800 4 48.17 61.98 -4.32 1.775 799 + 801 4 50.13 64.64 -4.32 1.775 800 + 802 4 50.78 66.77 -6.38 1.775 801 + 803 4 52.08 68.19 -8.52 1.775 802 + 804 4 54.25 70.32 -9.89 1.775 803 + 805 4 55.99 72.63 -10.66 1.775 804 + 806 4 58.38 75.3 -10.66 1.775 805 + 807 4 60.54 78.02 -8.25 1.6 806 + 808 4 62.27 79.97 -8.25 1.6 807 + 809 4 64.01 82.46 -5.63 1.6 808 + 810 4 65.97 85.3 -5.63 1.6 809 + 811 4 67.27 87.61 -4 1.6 810 + 812 4 69.44 90.1 -4 1.6 811 + 813 4 70.69 93.58 -4 1.775 812 + 814 4 71.55 95.53 -7.28 1.955 813 + 815 4 72.62 97.84 -7.28 1.955 814 + 816 4 73.71 99.97 -7.28 2.13 815 + 817 4 74.79 101.75 -7.28 2.13 816 + 818 4 76.1 104.95 -7.28 2.13 817 + 819 4 78.57 108.91 -6 2.13 818 + 820 4 79.87 111.22 -6 2.13 819 + 821 4 81.39 113.53 -4.77 2.13 820 + 822 4 82.05 115.84 -4.77 2.13 821 + 823 4 82.92 116.72 -4.77 2.13 822 + 824 4 83.13 119.39 -4.77 2.13 823 + 825 4 84.47 121.53 -4.77 1.955 824 + 826 4 85.99 123.31 -4.77 1.955 825 + 827 4 87.73 125.62 -4.77 1.955 826 + 828 4 89.25 127.39 -6.71 1.955 827 + 829 4 90.98 129.53 -6.71 1.955 828 + 830 4 92.5 130.59 -11.6 2.13 829 + 831 4 94.02 131.3 -11.6 2.13 830 + 832 4 95.54 132.01 -11.6 2.485 831 + 833 4 95.76 132.37 -11.6 3.02 832 + 834 4 94.89 134.15 -10.74 1.775 833 + 835 4 95.11 136.1 -10.74 1.775 834 + 836 4 95.11 137.34 -12.26 1.775 835 + 837 4 95.11 139.3 -12.26 1.775 836 + 838 4 95.11 139.47 -11.68 1.6 837 + 839 4 95.11 140.9 -11.68 1.6 838 + 840 4 95.33 142.14 -11.68 1.42 839 + 841 4 95.76 143.92 -13.98 1.42 840 + 842 4 96.16 145.86 -13.98 1.42 841 + 843 4 96.38 147.81 -12.71 1.42 842 + 844 4 96.6 149.94 -12.71 1.42 843 + 845 4 97.68 151.37 -12.71 1.42 844 + 846 4 99.2 153.32 -12.71 1.42 845 + 847 4 100.51 155.27 -12.71 1.42 846 + 848 4 101.16 156.52 -12.71 1.42 847 + 849 4 101.81 157.58 -14.33 1.42 848 + 850 4 102.68 158.83 -14.33 1.6 849 + 851 4 102.94 158.9 -14.33 1.775 850 + 852 4 102.35 159.83 -13.14 1.6 851 + 853 4 102.35 161.79 -13.14 1.6 852 + 854 4 102.56 163.56 -13.07 1.42 853 + 855 4 103 166.05 -13.07 1.42 854 + 856 4 103.21 168.36 -13.07 1.42 855 + 857 4 103.65 170.14 -13.07 1.42 856 + 858 4 104.08 171.91 -13.07 1.42 857 + 859 4 104.3 172.62 -13.23 1.42 858 + 860 4 105.27 174.66 -13.23 1.42 859 + 861 4 105.48 176.23 -13.23 1.42 860 + 862 4 105.27 178.01 -13.23 1.42 861 + 863 4 105.7 179.07 -13.23 1.42 862 + 864 4 106.13 180.32 -13.23 1.42 863 + 865 4 106.13 181.21 -13.23 1.42 864 + 866 4 106.35 181.92 -13.23 1.42 865 + 867 4 105.48 183.16 -13.23 1.065 866 + 868 4 105.7 184.76 -13.23 1.065 867 + 869 4 106.35 186 -11.38 0.89 868 + 870 4 106.79 188.31 -11.38 0.89 869 + 871 4 106.35 190.09 -8.14 0.89 870 + 872 4 105.7 191.51 -8.14 0.89 871 + 873 4 106.35 193.11 -8.14 1.065 872 + 874 4 105.7 194.71 -8.14 1.065 873 + 875 4 105.83 196.52 -5.66 1.065 874 + 876 4 106.05 198.83 -5.66 1.065 875 + 877 4 106.48 200.25 -5.66 1.065 876 + 878 4 106.7 201.49 -5.66 1.065 877 + 879 4 106.27 203.09 -7.68 1.065 878 + 880 4 106.27 204.16 -6.5 0.89 879 + 881 4 106.27 206.47 -6.5 0.89 880 + 882 4 106.27 208.6 -6.5 0.89 881 + 883 4 105.83 210.55 -6.5 0.89 882 + 884 4 105.81 211.61 -4.37 1.065 883 + 885 4 106.03 214.09 -4.37 1.065 884 + 886 4 106.25 215.69 -4.37 1.065 885 + 887 4 105.81 216.94 -2.22 1.065 886 + 888 4 105.81 218.53 -2.22 0.89 887 + 889 4 105.38 220.84 -2.22 0.89 888 + 890 4 105.16 222.8 -2.22 0.89 889 + 891 4 105.16 224.4 -2.22 0.89 890 + 892 4 104.29 226.35 -0.57 0.89 891 + 893 4 104.85 227.41 -0.57 0.89 892 + 894 4 105.07 229.54 -0.57 0.89 893 + 895 4 105.07 231.49 -0.57 0.89 894 + 896 4 105.28 233.62 -0.57 0.89 895 + 897 4 105.72 235.76 -0.57 0.89 896 + 898 4 106.15 237 -0.57 0.89 897 + 899 4 106.59 238.42 -0.57 0.89 898 + 900 4 106.8 239.84 0.98 0.89 899 + 901 4 107.24 241.97 0.98 0.89 900 + 902 4 107.67 244.78 0.98 0.89 901 + 903 4 107.67 246.91 0.98 0.89 902 + 904 4 107.67 248.87 0.98 0.89 903 + 905 4 108.1 250.47 0.98 0.89 904 + 906 4 108.53 251.89 0.98 0.89 905 + 907 4 109.62 253.67 0.98 0.89 906 + 908 4 109.84 255.09 0.98 0.89 907 + 909 4 110.71 256.15 0.98 0.89 908 + 910 4 111.05 257.54 2.28 0.89 909 + 911 4 111.48 259.32 2.28 1.065 910 + 912 4 111.05 260.91 2.28 1.065 911 + 913 4 111.27 262.34 3.51 1.065 912 + 914 4 111.27 264.47 3.51 1.065 913 + 915 4 111.27 265.71 3.51 1.065 914 + 916 4 111.48 267.31 5.26 0.89 915 + 917 4 111.7 269.09 5.26 0.89 916 + 918 4 111.92 270.69 5.26 1.065 917 + 919 4 112.47 272.01 5.26 1.065 918 + 920 4 113.1 273.94 7.2 1.065 919 + 921 4 113.53 276.43 7.2 1.065 920 + 922 4 113.75 278.2 7.2 1.065 921 + 923 4 113.97 280.33 8.1 1.065 922 + 924 4 114.19 282.29 8.1 1.065 923 + 925 4 114.19 284.42 8.1 1.065 924 + 926 4 114.62 286.37 9.94 1.065 925 + 927 4 114.63 288.12 9.94 1.065 926 + 928 4 114.2 290.25 9.94 1.065 927 + 929 4 113.98 292.2 9.94 1.065 928 + 930 4 113.98 294.69 9.94 1.065 929 + 931 4 113.33 296.11 9.94 1.065 930 + 932 4 113.11 297.35 11.25 1.065 931 + 933 4 113.55 299.31 11.25 1.065 932 + 934 4 113.76 301.26 13.19 1.065 933 + 935 4 113.6 303.12 13.19 1.065 934 + 936 4 113.38 306.31 13.19 1.065 935 + 937 4 112.73 308.27 13.19 1.065 936 + 938 4 112.73 310.05 15.53 1.065 937 + 939 4 112.51 311.64 15.53 1.065 938 + 940 4 112.95 313.42 15.53 1.065 939 + 941 4 113.6 314.84 15.53 1.065 940 + 942 4 113.38 316.8 15.53 1.065 941 + 943 4 113.2 319.23 16.7 1.065 942 + 944 4 112.98 322.07 16.57 0.89 943 + 945 4 112.98 325.09 16.57 0.89 944 + 946 4 112.98 327.22 18.62 0.89 945 + 947 4 112.33 330.06 18.62 0.89 946 + 948 4 111.46 332.2 19.22 0.89 947 + 949 4 111.2 333.92 19.22 0.89 948 + 950 4 110.98 336.05 20.91 0.89 949 + 951 4 111.63 338 20.91 0.89 950 + 952 4 111.41 340.31 20.91 0.89 951 + 953 4 111.41 342.44 22.79 0.89 952 + 954 4 111.63 344.58 22.79 0.89 953 + 955 4 112.28 347.6 22.79 0.89 954 + 956 4 112.87 348.78 22.79 0.89 955 + 957 4 113.52 350.92 24.5 0.89 956 + 958 4 114.48 352.03 24.5 0.71 957 + 959 4 114.92 353.61 24.5 0.71 958 + 960 4 116 356.09 26.17 0.71 959 + 961 4 116.44 358.4 26.17 0.71 960 + 962 4 117.09 360 28.04 0.71 961 + 963 4 117.96 361.42 28.04 0.71 962 + 964 4 118.17 363.2 27.9 0.71 963 + 965 4 118.61 364.8 27.9 0.71 964 + 966 4 119.48 366.04 27.9 0.71 965 + 967 4 119.85 367.36 30.1 0.71 966 + 968 4 120.07 369.32 31.49 0.71 967 + 969 4 120.93 370.91 31.49 0.71 968 + 970 4 121.59 373.05 31.49 0.71 969 + 971 4 122.24 374.47 31.49 0.71 970 + 972 4 124.41 376.6 31.49 0.71 971 + 973 4 123.54 378.02 31.49 0.71 972 + 974 4 124.63 379.8 31.49 0.71 973 + 975 4 125.93 381.04 32.14 0.71 974 + 976 4 127.12 382.89 32.14 0.71 975 + 977 4 128.42 385.03 32.14 0.71 976 + 978 4 129.29 386.63 32.14 0.71 977 + 979 4 130.16 389.11 32.14 0.71 978 + 980 4 130.81 389.82 32.14 0.71 979 + 981 4 131.46 391.6 32.47 0.71 980 + 982 4 132.11 393.2 32.47 0.71 981 + 983 4 133.63 395.33 32.78 0.71 982 + 984 4 134.05 397.47 35.28 0.71 983 + 985 4 134.27 399.6 35.28 0.71 984 + 986 4 135.35 401.74 35.28 0.71 985 + 987 4 135.79 403.51 35.28 0.89 986 + 988 4 136.44 405.11 35.28 0.89 987 + 989 4 136.85 405.32 35.28 0.89 988 + 990 4 108.09 183.34 -16.39 1.065 866 + 991 4 108.52 185.47 -16.39 0.89 990 + 992 4 108.96 187.07 -17.9 0.89 991 + 993 4 109.39 188.13 -15.86 0.89 992 + 994 4 109.83 189.73 -18.03 0.89 993 + 995 4 110.04 191.15 -20.49 0.89 994 + 996 4 110.69 192.58 -21.47 0.89 995 + 997 4 111.56 193.29 -21.47 0.89 996 + 998 4 112.43 194.53 -22.15 0.89 997 + 999 4 113.08 195.6 -23.38 0.89 998 + 1000 4 113.74 196.66 -24.36 0.89 999 + 1001 4 113.74 198.08 -25.89 0.89 1000 + 1002 4 114.17 199.15 -27.94 0.89 1001 + 1003 4 114.6 200.75 -30.08 0.89 1002 + 1004 4 115.69 203.06 -30.08 0.89 1003 + 1005 4 115.64 204.31 -31.51 0.89 1004 + 1006 4 116.08 205.56 -31.51 0.89 1005 + 1007 4 116.73 206.98 -31.51 0.71 1006 + 1008 4 117.16 208.75 -31.51 0.71 1007 + 1009 4 117.6 210.53 -32.74 0.71 1008 + 1010 4 117.6 212.13 -32.74 0.71 1009 + 1011 4 117.6 214.62 -34.55 0.89 1010 + 1012 4 117.82 216.75 -34.55 0.89 1011 + 1013 4 118.03 218.7 -34.55 0.89 1012 + 1014 4 118.24 220.22 -33.58 0.89 1013 + 1015 4 118.03 223.6 -33.58 0.89 1014 + 1016 4 117.37 225.2 -34.98 0.89 1015 + 1017 4 117.16 226.97 -34.98 0.89 1016 + 1018 4 116.72 228.75 -34.98 0.89 1017 + 1019 4 116.51 230.17 -36.51 0.89 1018 + 1020 4 116.29 231.95 -36.51 0.89 1019 + 1021 4 116.29 233.72 -38.15 0.89 1020 + 1022 4 116.01 235.6 -38.15 0.89 1021 + 1023 4 116.01 237.38 -39.9 0.89 1022 + 1024 4 117.08 239.33 -39.9 0.89 1023 + 1025 4 117.73 241.11 -41.34 0.89 1024 + 1026 4 118.82 242.88 -41.34 0.89 1025 + 1027 4 119.9 244.66 -41.34 0.89 1026 + 1028 4 121.42 248.57 -41.34 0.71 1027 + 1029 4 122.73 249.89 -43.37 0.71 1028 + 1030 4 123.58 251.13 -43.37 0.71 1029 + 1031 4 124.67 252.73 -45.26 0.71 1030 + 1032 4 125.75 254.15 -45.26 0.71 1031 + 1033 4 126.84 255.93 -46.82 0.71 1032 + 1034 4 127.92 257.88 -46.82 0.71 1033 + 1035 4 128.58 259.48 -47.64 0.71 1034 + 1036 4 129.44 261.26 -48.99 0.71 1035 + 1037 4 130.53 262.86 -50.41 0.71 1036 + 1038 4 131.62 264.64 -50.32 0.71 1037 + 1039 4 133.14 266.59 -50.32 0.71 1038 + 1040 4 135.09 268.19 -50.32 0.71 1039 + 1041 4 136.39 270.32 -50.32 0.71 1040 + 1042 4 137.7 271.92 -50.32 0.71 1041 + 1043 4 139.22 273.52 -50.32 0.71 1042 + 1044 4 140.3 275.12 -49.5 0.71 1043 + 1045 4 141.61 277.07 -49.5 0.71 1044 + 1046 4 143.45 279.1 -49.5 0.71 1045 + 1047 4 144.32 280.88 -49.5 0.71 1046 + 1048 4 144.97 282.12 -49.77 0.71 1047 + 1049 4 146.06 284.08 -49.77 0.71 1048 + 1050 4 146.71 285.5 -49.77 0.71 1049 + 1051 4 147.36 287.45 -49.77 0.71 1050 + 1052 4 148.45 289.23 -49.77 0.71 1051 + 1053 4 149.31 291 -49.77 0.71 1052 + 1054 4 150.4 292.43 -49.77 0.71 1053 + 1055 4 151.49 293.65 -49.77 0.71 1054 + 1056 4 151.7 295.42 -51.57 0.71 1055 + 1057 4 152.57 297.38 -51.57 0.71 1056 + 1058 4 153.22 298.98 -51.57 0.71 1057 + 1059 4 153.87 300.93 -51.45 0.71 1058 + 1060 4 153.87 302.88 -51.45 0.71 1059 + 1061 4 154.09 305.02 -51.45 0.71 1060 + 1062 4 154.31 306.62 -51.45 0.71 1061 + 1063 4 154.67 308.27 -51.45 0.71 1062 + 1064 4 154.45 310.05 -53.14 0.71 1063 + 1065 4 155.1 312 -53.14 0.71 1064 + 1066 4 155.32 314.31 -53.14 0.71 1065 + 1067 4 155.32 316.09 -53.55 0.89 1066 + 1068 4 155.97 317.86 -53.55 0.89 1067 + 1069 4 155.75 320.17 -53.55 0.89 1068 + 1070 4 155.97 321.59 -52.72 0.89 1069 + 1071 4 155.82 324 -52.72 0.89 1070 + 1072 4 155.8 325.96 -55.36 0.89 1071 + 1073 4 155.58 327.38 -55.36 0.89 1072 + 1074 4 156.23 328.98 -55.14 0.89 1073 + 1075 4 156.23 331.29 -55.14 0.89 1074 + 1076 4 156.45 333.95 -55.14 0.89 1075 + 1077 4 157.1 336.08 -57.1 0.89 1076 + 1078 4 157.47 337.14 -59.1 0.89 1077 + 1079 4 157.9 338.2 -59.1 0.89 1078 + 1080 4 158.12 338.91 -59.1 1.065 1079 + 1081 4 157.6 341.05 -59.34 0.71 1080 + 1082 4 158.03 343.36 -59.34 0.71 1081 + 1083 4 158.03 344.42 -59.79 0.71 1082 + 1084 4 157.6 346.91 -59.79 0.71 1083 + 1085 4 157.38 348.15 -59.85 0.71 1084 + 1086 4 157.38 350.28 -61.52 0.71 1085 + 1087 4 157.17 352.77 -61.52 0.71 1086 + 1088 4 157.17 354.55 -61.52 0.71 1087 + 1089 4 157.23 357.49 -62.28 0.71 1088 + 1090 4 157.23 359.62 -62.28 0.71 1089 + 1091 4 157.23 362.11 -62.28 0.71 1090 + 1092 4 157.23 363.89 -64.82 0.71 1091 + 1093 4 157.45 366.02 -64.82 0.71 1092 + 1094 4 157.89 367.97 -64.82 0.71 1093 + 1095 4 158.54 369.57 -64.82 0.71 1094 + 1096 4 160.17 371.42 -64.82 0.71 1095 + 1097 4 160.82 373.2 -64.82 0.71 1096 + 1098 4 162.13 374.98 -66.88 0.71 1097 + 1099 4 162.56 376.22 -66.88 0.71 1098 + 1100 4 164.3 378.53 -68.36 0.71 1099 + 1101 4 165.17 380.31 -68.36 0.71 1100 + 1102 4 166.04 382.26 -70.17 0.71 1101 + 1103 4 167.12 384.57 -68.43 0.71 1102 + 1104 4 167.47 386.6 -71.03 0.71 1103 + 1105 4 168.34 388.73 -71.34 0.71 1104 + 1106 4 168.55 390.69 -73.47 0.71 1105 + 1107 4 168.55 392.29 -73.47 0.71 1106 + 1108 4 168.99 393.35 -73.47 0.71 1107 + 1109 4 168.4 394.54 -72.38 0.71 1108 + 1110 4 169.05 396.49 -72.38 0.71 1109 + 1111 4 169.27 398.27 -72.38 0.71 1110 + 1112 4 168.83 400.04 -72.38 0.71 1111 + 1113 4 168.4 401.46 -72.38 0.71 1112 + 1114 4 167.75 402.53 -72.38 0.71 1113 + 1115 4 167.53 403.95 -72.3 0.71 1114 + 1116 4 167.53 405.37 -71.58 0.71 1115 + 1117 4 167.31 408.04 -69.38 0.71 1116 + 1118 4 167.45 410.2 -69.38 0.71 1117 + 1119 4 166.8 411.62 -67.06 0.71 1118 + 1120 4 166.37 413.04 -67.06 0.71 1119 + 1121 4 166.37 415.53 -67.06 0.71 1120 + 1122 4 165.93 417.49 -67.06 0.71 1121 + 1123 4 165.28 419.08 -66.7 0.71 1122 + 1124 4 163.54 420.33 -66.7 0.71 1123 + 1125 4 162.02 421.57 -63.24 0.71 1124 + 1126 4 160.72 424.24 -63.24 0.71 1125 + 1127 4 159.77 425.71 -63.24 0.71 1126 + 1128 4 159.11 427.67 -62.42 0.71 1127 + 1129 4 158.25 429.27 -62.42 0.71 1128 + 1130 4 158.03 431.04 -62.42 0.71 1129 + 1131 4 157.38 432.46 -62.42 0.71 1130 + 1132 4 156.73 434.77 -62.42 0.71 1131 + 1133 4 155.64 436.55 -61.43 0.71 1132 + 1134 4 155.21 439.04 -61.93 0.71 1133 + 1135 4 153.71 441.2 -60.51 0.71 1134 + 1136 4 152.41 443.16 -60.51 0.71 1135 + 1137 4 151.54 445.29 -60.51 0.71 1136 + 1138 4 150.46 447.42 -60.97 0.71 1137 + 1139 4 148.94 449.91 -60.97 0.71 1138 + 1140 4 147.63 451.86 -59.15 0.71 1139 + 1141 4 146.98 453.97 -60.79 0.71 1140 + 1142 4 147.23 456 -60.79 0.71 1141 + 1143 4 146.15 458.49 -59.41 0.71 1142 + 1144 4 145.5 460.8 -59.41 0.71 1143 + 1145 4 144.85 462.75 -59.41 0.71 1144 + 1146 4 144.41 464.88 -59.41 0.71 1145 + 1147 4 143.76 467.37 -59.41 0.71 1146 + 1148 4 144.41 467.91 -59.41 0.71 1147 + 1149 4 143.33 471.1 -59.41 0.71 1148 + 1150 4 143.43 473.2 -59.26 0.71 1149 + 1151 4 143.22 475.51 -59.26 0.71 1150 + 1152 4 143.65 478 -59.26 0.71 1151 + 1153 4 143.43 480.13 -59.26 0.71 1152 + 1154 4 143.43 481.91 -59.26 0.71 1153 + 1155 4 144.3 483.86 -60.06 0.71 1154 + 1156 4 144.74 486.53 -60.06 0.71 1155 + 1157 4 146.14 488.42 -60.06 0.71 1156 + 1158 4 147.22 490.73 -60.06 0.71 1157 + 1159 4 148.53 492.33 -60.06 0.71 1158 + 1160 4 149.18 493.93 -60.06 0.71 1159 + 1161 4 148.96 496.42 -60.06 0.71 1160 + 1162 4 149.83 498.55 -60.06 0.71 1161 + 1163 4 151.13 501.04 -60.06 0.71 1162 + 1164 4 151.92 503.74 -60.06 0.71 1163 + 1165 4 153.01 505.69 -60.54 0.71 1164 + 1166 4 154.31 507.82 -60.54 0.71 1165 + 1167 4 154.96 510.66 -60.54 0.71 1166 + 1168 4 156.48 513.51 -60.54 0.71 1167 + 1169 4 158 515.82 -59.02 0.71 1168 + 1170 4 158.7 517.29 -61.86 0.71 1169 + 1171 4 160.01 519.25 -61.86 0.71 1170 + 1172 4 161.96 520.49 -61.86 0.71 1171 + 1173 4 163.92 521.91 -61.86 0.71 1172 + 1174 4 164.35 523.69 -61.86 0.71 1173 + 1175 4 165.65 524.93 -61.86 0.71 1174 + 1176 4 167.17 526.17 -61.86 0.71 1175 + 1177 4 169.34 527.06 -61.64 0.71 1176 + 1178 4 171.3 528.13 -61.64 0.71 1177 + 1179 4 172.17 529.73 -60.11 0.71 1178 + 1180 4 173.25 531.5 -59.06 0.71 1179 + 1181 4 175.41 532.91 -59.06 0.71 1180 + 1182 4 176.71 534.34 -59.06 0.71 1181 + 1183 4 178.23 536.29 -59.06 0.71 1182 + 1184 4 179.32 537.51 -59.06 0.71 1183 + 1185 4 181.92 539.29 -59.06 0.71 1184 + 1186 4 183.44 539.64 -59.06 0.71 1185 + 1187 4 185.18 540.71 -62.56 0.71 1186 + 1188 4 186.26 542.31 -62.56 0.71 1187 + 1189 4 188 543.91 -62.56 0.71 1188 + 1190 4 190.17 545.86 -62.56 0.71 1189 + 1191 4 192.01 547.82 -61.79 0.71 1190 + 1192 4 193.73 549.78 -63.96 0.71 1191 + 1193 4 195.68 551.2 -66.18 0.71 1192 + 1194 4 198.29 552.8 -66.18 0.71 1193 + 1195 4 199.59 553.86 -66.18 0.71 1194 + 1196 4 200.89 556 -66.18 0.71 1195 + 1197 4 202.85 557.6 -66.18 0.71 1196 + 1198 4 204.37 559.73 -66.18 0.71 1197 + 1199 4 205.89 562.57 -66.18 0.71 1198 + 1200 4 206.72 564.09 -67.75 0.71 1199 + 1201 4 208.01 566.05 -67.21 0.71 1200 + 1202 4 208.87 568.36 -69.38 0.71 1201 + 1203 4 209.96 570.49 -69.38 0.71 1202 + 1204 4 210.61 572.62 -69.38 0.71 1203 + 1205 4 211.7 574.04 -69.38 0.71 1204 + 1206 4 212.78 575.64 -69.38 0.71 1205 + 1207 4 214.3 576.88 -69.38 0.71 1206 + 1208 4 215.97 578.29 -69.38 0.71 1207 + 1209 4 170.51 394.6 -73.47 0.71 1108 + 1210 4 172.9 395.31 -73.47 0.71 1209 + 1211 4 174.42 397.26 -73.47 0.71 1210 + 1212 4 175.07 398.15 -74.9 0.71 1211 + 1213 4 176.16 399.57 -74.9 0.71 1212 + 1214 4 177.75 400.36 -74.9 0.71 1213 + 1215 4 177.97 401.6 -73.17 0.71 1214 + 1216 4 178.19 403.02 -75.59 0.71 1215 + 1217 4 178.41 404.27 -75.59 0.71 1216 + 1218 4 179.27 406.04 -75.34 0.71 1217 + 1219 4 178.84 408.18 -75.34 0.71 1218 + 1220 4 178.84 410.13 -77.88 0.71 1219 + 1221 4 179.27 412.08 -77.88 0.71 1220 + 1222 4 179.49 413.86 -77.88 0.71 1221 + 1223 4 180.3 416.54 -77.88 0.71 1222 + 1224 4 180.3 418.49 -77.88 0.71 1223 + 1225 4 180.52 420.27 -78.7 0.71 1224 + 1226 4 180.74 422.4 -78.7 0.71 1225 + 1227 4 180.52 424.35 -78.7 0.71 1226 + 1228 4 179.65 426.84 -78.7 0.71 1227 + 1229 4 180.09 429.15 -80.71 0.71 1228 + 1230 4 179.82 430.67 -80.71 0.71 1229 + 1231 4 179.6 432.8 -80.71 0.71 1230 + 1232 4 179.6 435.11 -79.88 0.71 1231 + 1233 4 179.38 437.24 -79.88 0.71 1232 + 1234 4 179.82 438.84 -79.88 0.71 1233 + 1235 4 180.25 440.44 -79.88 0.71 1234 + 1236 4 180.25 441.68 -81.52 0.71 1235 + 1237 4 180.69 442.93 -83.26 0.71 1236 + 1238 4 181.99 444.35 -83.26 0.71 1237 + 1239 4 183.55 445.71 -82.04 0.71 1238 + 1240 4 185.29 447.49 -82.04 0.71 1239 + 1241 4 186.59 449.09 -81.54 0.71 1240 + 1242 4 187.46 450.69 -81.54 0.71 1241 + 1243 4 188.98 452.11 -83.78 0.71 1242 + 1244 4 190.29 453.89 -85.06 0.71 1243 + 1245 4 191.81 455.66 -83.98 0.71 1244 + 1246 4 193.33 457.44 -83.98 0.71 1245 + 1247 4 193.98 458.86 -83.98 0.71 1246 + 1248 4 194.9 461 -84.02 0.71 1247 + 1249 4 195.77 463.31 -84.02 0.71 1248 + 1250 4 197.29 464.56 -87.18 0.71 1249 + 1251 4 198.81 466.69 -87.18 0.71 1250 + 1252 4 200.33 468.64 -87.18 0.71 1251 + 1253 4 201.42 470.42 -88.28 0.71 1252 + 1254 4 201.85 471.66 -87.12 0.71 1253 + 1255 4 202.94 473.97 -85.42 0.71 1254 + 1256 4 204.79 476.71 -85.42 0.71 1255 + 1257 4 205.64 478.31 -85.42 0.71 1256 + 1258 4 206.94 480.8 -85.42 0.71 1257 + 1259 4 208.25 483.29 -85.42 0.71 1258 + 1260 4 209.55 485.06 -83.62 0.71 1259 + 1261 4 210.85 487.37 -83.62 0.71 1260 + 1262 4 213.02 489.5 -83.62 0.71 1261 + 1263 4 213.7 491.96 -83.62 0.71 1262 + 1264 4 214.77 493.73 -85.06 0.71 1263 + 1265 4 216.07 496.4 -87.32 0.71 1264 + 1266 4 217.81 498.35 -88.84 0.71 1265 + 1267 4 219.55 500.48 -88.84 0.71 1266 + 1268 4 220.2 502.44 -88.84 0.71 1267 + 1269 4 221.29 504.04 -88.84 0.71 1268 + 1270 4 222.75 505.71 -88.84 0.71 1269 + 1271 4 224.06 507.67 -88.84 0.71 1270 + 1272 4 225.36 509.07 -88.84 0.71 1271 + 1273 4 226.23 510.13 -88.84 0.71 1272 + 1274 4 226.88 511.91 -88.84 0.71 1273 + 1275 4 227.97 514.22 -90.92 0.71 1274 + 1276 4 228.18 516 -90.92 0.71 1275 + 1277 4 229.27 517.42 -89.16 0.71 1276 + 1278 4 230.14 519.02 -89.16 0.71 1277 + 1279 4 232.01 520.67 -89.16 0.71 1278 + 1280 4 233.53 522.25 -89.16 0.71 1279 + 1281 4 234.61 524.38 -89.16 0.71 1280 + 1282 4 236.35 525.8 -89.16 0.71 1281 + 1283 4 237.22 527.04 -89.16 0.71 1282 + 1284 4 238.3 528.64 -90.46 0.71 1283 + 1285 4 240.04 530.06 -90.46 0.71 1284 + 1286 4 240.69 531.84 -89.98 0.71 1285 + 1287 4 241.56 534.15 -89.98 0.71 1286 + 1288 4 242.72 535.67 -89.98 0.71 1287 + 1289 4 243.81 537.27 -89.98 0.71 1288 + 1290 4 245.33 538.16 -89.54 0.71 1289 + 1291 4 246.41 539.58 -89.54 0.71 1290 + 1292 4 247.93 541 -89.54 0.71 1291 + 1293 4 249.45 542.42 -89.54 0.71 1292 + 1294 4 250.76 543.49 -89.54 0.71 1293 + 1295 4 252.71 544.37 -86.81 0.71 1294 + 1296 4 254.23 544.91 -85.04 0.71 1295 + 1297 4 255.53 545.62 -86.74 0.71 1296 + 1298 4 257.49 546.51 -86.26 0.71 1297 + 1299 4 258.57 546.51 -86.66 0.71 1298 + 1300 4 260.31 547.22 -85.52 0.71 1299 + 1301 4 261.75 548.34 -85.52 0.71 1300 + 1302 4 262.84 548.69 -85.52 0.71 1301 + 1303 4 158.99 339.8 -60.21 0.71 1080 + 1304 4 160.51 341.04 -60.21 0.71 1303 + 1305 4 162.45 342.11 -62.85 0.71 1304 + 1306 4 164.18 343.71 -62.85 0.71 1305 + 1307 4 165.27 343.71 -63.99 0.71 1306 + 1308 4 167.01 344.06 -66.1 0.71 1307 + 1309 4 168.74 345.84 -68.3 0.71 1308 + 1310 4 170.26 346.91 -70.45 0.71 1309 + 1311 4 172.22 348.51 -70.45 0.71 1310 + 1312 4 174.39 350.11 -71.54 0.71 1311 + 1313 4 176.13 351.53 -73.3 0.71 1312 + 1314 4 178.41 353.42 -76.18 0.71 1313 + 1315 4 180.36 355.2 -77.5 0.71 1314 + 1316 4 182.1 356.44 -78.82 0.71 1315 + 1317 4 183.18 357.33 -77.79 0.71 1316 + 1318 4 184.92 359.29 -79.28 0.71 1317 + 1319 4 187.09 361.06 -81.11 0.71 1318 + 1320 4 188.83 363.02 -82.41 0.71 1319 + 1321 4 190.78 364.97 -83.39 0.71 1320 + 1322 4 191.44 365.68 -84.27 0.71 1321 + 1323 4 192.32 366.58 -82.58 0.71 1322 + 1324 4 194.04 367.29 -82.58 0.71 1323 + 1325 4 195.78 368.54 -82.58 0.71 1324 + 1326 4 197.73 370.84 -82.58 0.71 1325 + 1327 4 199.69 372.62 -81.69 0.71 1326 + 1328 4 200.56 373.86 -81.69 0.71 1327 + 1329 4 202.08 374.22 -81.69 0.71 1328 + 1330 4 203.6 375.82 -81.69 0.71 1329 + 1331 4 205.33 377.24 -84.2 0.71 1330 + 1332 4 206.85 379.37 -84.2 0.71 1331 + 1333 4 209.24 380.62 -82.27 0.71 1332 + 1334 4 210.99 381.38 -82.27 0.71 1333 + 1335 4 212.29 382.45 -83.34 0.71 1334 + 1336 4 214.03 383.51 -83.34 0.71 1335 + 1337 4 215.77 384.76 -83.34 0.71 1336 + 1338 4 217.29 384.93 -83.34 0.71 1337 + 1339 4 218.59 385.64 -83.34 0.71 1338 + 1340 4 220.11 385.82 -83.34 0.71 1339 + 1341 4 221.63 386.71 -83.34 0.71 1340 + 1342 4 223.15 387.6 -83.34 0.71 1341 + 1343 4 225.1 388.13 -83.34 0.71 1342 + 1344 4 227.28 389.2 -84.61 0.71 1343 + 1345 4 229.86 389.27 -84.61 0.71 1344 + 1346 4 231.81 389.8 -83.78 0.71 1345 + 1347 4 235.5 391.05 -85.85 0.71 1346 + 1348 4 236.37 392.65 -85.85 0.71 1347 + 1349 4 238.11 394.42 -87.34 0.71 1348 + 1350 4 240.28 395.84 -89.05 0.71 1349 + 1351 4 242.45 397.44 -89.05 0.71 1350 + 1352 4 243.1 399.4 -89.05 0.71 1351 + 1353 4 244.63 400.82 -91.1 0.71 1352 + 1354 4 246.36 402.42 -92.89 0.71 1353 + 1355 4 248.62 404.09 -92.35 0.71 1354 + 1356 4 251.01 405.87 -92.35 0.71 1355 + 1357 4 252.53 407.47 -92.35 0.71 1356 + 1358 4 254.05 408.71 -94.54 0.71 1357 + 1359 4 255.57 410.13 -94.65 0.71 1358 + 1360 4 259.26 412.09 -97.34 0.71 1359 + 1361 4 259.92 413.86 -97.34 0.71 1360 + 1362 4 261.65 415.64 -97.34 0.71 1361 + 1363 4 262.3 416.35 -97.92 0.71 1362 + 1364 4 262.74 417.77 -98.9 0.71 1363 + 1365 4 264.37 418.74 -98.9 0.71 1364 + 1366 4 266.11 419.98 -98.9 0.71 1365 + 1367 4 268.26 421.22 -97.77 0.71 1366 + 1368 4 270.44 422.82 -97.77 0.71 1367 + 1369 4 272.39 424.95 -97.58 0.71 1368 + 1370 4 274.13 425.84 -97.58 0.71 1369 + 1371 4 275.21 427.44 -97.58 0.71 1370 + 1372 4 276.08 429.22 -97.58 0.71 1371 + 1373 4 276.73 429.93 -97.58 0.71 1372 + 1374 4 278.69 432.24 -99.62 0.71 1373 + 1375 4 279.72 434.22 -96.31 0.71 1374 + 1376 4 281.02 435.82 -96.31 0.71 1375 + 1377 4 282.33 437.6 -96.31 0.71 1376 + 1378 4 283.85 439.02 -96.31 0.71 1377 + 1379 4 285.37 440.09 -96.31 0.71 1378 + 1380 4 287.1 441.15 -96.31 0.71 1379 + 1381 4 287.97 443.11 -96.31 0.71 1380 + 1382 4 289.28 445.06 -96.31 0.71 1381 + 1383 4 291.66 447.55 -95.6 0.71 1382 + 1384 4 291.42 449.07 -95.6 0.71 1383 + 1385 4 292.07 451.38 -94.46 0.71 1384 + 1386 4 292.94 453.16 -94.46 0.71 1385 + 1387 4 293.59 455.11 -93.38 0.71 1386 + 1388 4 294.89 457.42 -93.38 0.71 1387 + 1389 4 296.19 459.73 -95.56 0.71 1388 + 1390 4 299.45 461.86 -95.56 0.71 1389 + 1391 4 299.87 464.02 -95.56 0.71 1390 + 1392 4 300.09 465.45 -93.33 0.71 1391 + 1393 4 300.09 467.04 -93.33 0.71 1392 + 1394 4 299.87 468.64 -93.33 0.71 1393 + 1395 4 300.3 470.78 -92.41 0.71 1394 + 1396 4 300.52 473.26 -92.41 0.71 1395 + 1397 4 300.95 475.04 -90.96 0.71 1396 + 1398 4 300.52 477.17 -92.18 0.71 1397 + 1399 4 301.07 479.2 -92.18 0.71 1398 + 1400 4 301.94 481.33 -89.05 0.71 1399 + 1401 4 303.46 483.47 -89.05 0.71 1400 + 1402 4 305.19 485.42 -87.02 0.71 1401 + 1403 4 307.58 488.08 -87.02 0.71 1402 + 1404 4 309.1 490.04 -87.33 0.71 1403 + 1405 4 310.41 491.99 -87.33 0.71 1404 + 1406 4 312.41 493.87 -85.52 0.71 1405 + 1407 4 313.71 496 -82.5 0.71 1406 + 1408 4 315.45 497.24 -82.5 0.71 1407 + 1409 4 317.18 498.67 -80.96 0.71 1408 + 1410 4 319.36 499.91 -78.21 0.71 1409 + 1411 4 320.52 500.76 -78.21 0.71 1410 + 1412 4 321.17 501.65 -78.21 0.71 1411 + 1413 4 321.61 502.71 -78.21 0.71 1412 + 1414 4 321.82 504.13 -78.21 0.71 1413 + 1415 4 322.04 505.2 -78.21 0.71 1414 + 1416 4 193.82 366.2 -86.77 0.71 1322 + 1417 4 195.13 367.62 -89.76 0.71 1416 + 1418 4 196.65 368.51 -92.06 0.71 1417 + 1419 4 198.38 369.58 -93.94 0.71 1418 + 1420 4 200.56 370.64 -95.34 0.71 1419 + 1421 4 202.29 371.71 -95.34 0.71 1420 + 1422 4 203.81 372.24 -97.05 0.71 1421 + 1423 4 205.77 371.71 -99.43 0.71 1422 + 1424 4 207.72 371 -100.82 0.71 1423 + 1425 4 210.76 371 -102.69 0.71 1424 + 1426 4 213.24 370.38 -104.76 0.71 1425 + 1427 4 215.63 369.67 -104.76 0.71 1426 + 1428 4 217.8 370.2 -104.76 0.71 1427 + 1429 4 219.1 370.38 -106.96 0.71 1428 + 1430 4 221.49 370.92 -109.06 0.71 1429 + 1431 4 223.37 371.25 -109.06 0.71 1430 + 1432 4 104.68 159.61 -14.07 1.065 851 + 1433 4 106.64 160.68 -14.07 1.065 1432 + 1434 4 108.16 161.75 -16.66 1.065 1433 + 1435 4 109.68 162.46 -15.8 1.065 1434 + 1436 4 111.41 163.35 -15.85 0.89 1435 + 1437 4 112.93 164.06 -15.85 0.89 1436 + 1438 4 114.67 164.77 -15.85 0.89 1437 + 1439 4 116.19 165.65 -17.62 0.89 1438 + 1440 4 117.71 166.9 -18.6 0.89 1439 + 1441 4 119.45 168.32 -18.6 0.89 1440 + 1442 4 121.84 169.74 -20.68 0.89 1441 + 1443 4 122.85 170.59 -19.88 1.065 1442 + 1444 4 123.65 171.72 -23.29 1.065 1443 + 1445 4 124.52 172.79 -22.74 0.89 1444 + 1446 4 125.17 174.21 -25.44 0.71 1445 + 1447 4 126.04 175.45 -25.16 0.71 1446 + 1448 4 126.91 177.76 -28.48 0.71 1447 + 1449 4 128.21 179.72 -28.48 0.71 1448 + 1450 4 129.29 181.67 -30.55 0.71 1449 + 1451 4 130.38 183.63 -33.03 0.71 1450 + 1452 4 132.55 186.82 -35.06 0.71 1451 + 1453 4 131.96 189.37 -36.48 0.71 1452 + 1454 4 132.38 191.5 -36.71 0.71 1453 + 1455 4 132.81 193.63 -40.1 0.71 1454 + 1456 4 132.81 195.76 -40.1 0.71 1455 + 1457 4 133.68 197.54 -40.1 0.71 1456 + 1458 4 133.68 200.2 -41.74 0.71 1457 + 1459 4 133.9 203.05 -41.74 0.71 1458 + 1460 4 133.8 205.94 -42.17 0.71 1459 + 1461 4 134.65 208.25 -44.11 0.71 1460 + 1462 4 134.21 209.85 -44.11 0.71 1461 + 1463 4 134.43 212.16 -46.74 0.71 1462 + 1464 4 134.87 214.83 -48.19 0.71 1463 + 1465 4 134.65 217.14 -48.19 0.71 1464 + 1466 4 136.17 219.62 -50 0.71 1465 + 1467 4 137.5 221.61 -52.58 0.71 1466 + 1468 4 139.24 223.39 -52.18 0.71 1467 + 1469 4 140.76 225.34 -53.82 0.71 1468 + 1470 4 142.71 226.94 -53.82 0.71 1469 + 1471 4 143.8 229.07 -55.17 0.71 1470 + 1472 4 144.88 231.03 -56.26 0.71 1471 + 1473 4 145.97 233.34 -58 0.71 1472 + 1474 4 146.84 235.47 -59.86 0.71 1473 + 1475 4 147.25 237.08 -59.86 0.71 1474 + 1476 4 148.33 239.03 -57.89 0.71 1475 + 1477 4 149.4 240.45 -59.65 0.71 1476 + 1478 4 150.71 241.87 -62.14 0.71 1477 + 1479 4 152.01 244.18 -62.14 0.71 1478 + 1480 4 152.88 245.61 -64 0.71 1479 + 1481 4 153.96 247.56 -66.18 0.71 1480 + 1482 4 155.27 248.98 -66.18 0.71 1481 + 1483 4 156.79 250.4 -67.97 0.71 1482 + 1484 4 158.1 253.68 -67.97 0.71 1483 + 1485 4 158.32 255.63 -69.63 0.71 1484 + 1486 4 159.19 257.41 -69.63 0.71 1485 + 1487 4 160.71 259.54 -71.56 0.71 1486 + 1488 4 161.14 261.67 -73.5 0.71 1487 + 1489 4 162.23 262.91 -73.5 0.71 1488 + 1490 4 163.53 263.8 -75.31 0.71 1489 + 1491 4 163.96 265.76 -77.27 0.71 1490 + 1492 4 164.63 267.63 -77.26 0.71 1491 + 1493 4 165.72 268.88 -79.4 0.71 1492 + 1494 4 166.37 271.01 -81.16 0.71 1493 + 1495 4 168.11 273.14 -82.99 0.71 1494 + 1496 4 169.84 275.45 -85.39 0.71 1495 + 1497 4 171.15 277.05 -88.18 0.71 1496 + 1498 4 172.23 279.54 -89.27 0.71 1497 + 1499 4 174.4 280.96 -92.58 0.71 1498 + 1500 4 176.59 281.59 -92.58 0.71 1499 + 1501 4 178.09 283.19 -95.35 0.71 1500 + 1502 4 179.83 283.9 -95.35 0.71 1501 + 1503 4 182.22 286.21 -97.55 0.71 1502 + 1504 4 183.95 287.99 -99.36 0.71 1503 + 1505 4 185.04 289.76 -101.12 0.71 1504 + 1506 4 186.12 291.89 -102.69 0.71 1505 + 1507 4 186.34 294.2 -102.69 0.71 1506 + 1508 4 187.86 295.8 -104.69 0.71 1507 + 1509 4 189.53 297.66 -106.06 0.71 1508 + 1510 4 191.27 299.61 -106.06 0.71 1509 + 1511 4 193.01 301.39 -109.05 0.71 1510 + 1512 4 194.09 302.63 -109.05 0.71 1511 + 1513 4 195.83 303.52 -110.88 0.71 1512 + 1514 4 196.48 305.29 -112.76 0.71 1513 + 1515 4 197.79 306.54 -114.91 0.71 1514 + 1516 4 198.22 308.49 -116.84 0.71 1515 + 1517 4 198.87 310.62 -118.38 0.71 1516 + 1518 4 200.3 312.46 -120.46 0.71 1517 + 1519 4 200.95 314.94 -123.82 0.71 1518 + 1520 4 202.25 317.25 -125.7 0.71 1519 + 1521 4 203.99 319.03 -125.7 0.71 1520 + 1522 4 204.86 320.45 -127.08 0.71 1521 + 1523 4 206.16 323.11 -127.08 0.71 1522 + 1524 4 206.82 325.07 -131.26 0.71 1523 + 1525 4 207.23 327.06 -131.26 0.71 1524 + 1526 4 208.1 328.12 -133.51 0.71 1525 + 1527 4 209.19 329.9 -136.01 0.71 1526 + 1528 4 209.84 331.85 -137.86 0.71 1527 + 1529 4 210.49 333.45 -140.03 0.71 1528 + 1530 4 210.92 335.58 -142.07 0.71 1529 + 1531 4 211.14 337 -144.91 0.71 1530 + 1532 4 211.79 338.6 -146.06 0.71 1531 + 1533 4 212.88 340.56 -146.84 0.71 1532 + 1534 4 214.53 342.08 -146.84 0.71 1533 + 1535 4 215.4 344.39 -148.82 0.71 1534 + 1536 4 217.14 346.52 -150.9 0.71 1535 + 1537 4 218.01 348.3 -153.4 0.71 1536 + 1538 4 218.66 350.43 -154.82 0.71 1537 + 1539 4 219.96 352.2 -154.82 0.71 1538 + 1540 4 221.27 353.98 -156.14 0.71 1539 + 1541 4 222.79 355.4 -158.7 0.71 1540 + 1542 4 223.87 356.72 -158.7 0.71 1541 + 1543 4 225.17 358.14 -161.48 0.71 1542 + 1544 4 226.69 359.21 -163.85 0.71 1543 + 1545 4 228.21 361.16 -163.85 0.71 1544 + 1546 4 228.64 361.52 -166.42 0.71 1545 + 1547 4 230.16 362.94 -166.42 0.71 1546 + 1548 4 231.47 365.07 -166.42 0.71 1547 + 1549 4 232.77 367.56 -166.42 0.71 1548 + 1550 4 234.29 368.63 -168.77 0.71 1549 + 1551 4 235.38 370.22 -170.48 0.71 1550 + 1552 4 236.68 372.06 -173.12 0.71 1551 + 1553 4 237.99 374.19 -171.79 0.71 1552 + 1554 4 239.51 376.32 -171.79 0.71 1553 + 1555 4 240.59 377.92 -174.18 0.71 1554 + 1556 4 242.11 379.87 -176.73 0.71 1555 + 1557 4 243.85 381.47 -176.73 0.71 1556 + 1558 4 245.59 383.07 -178.46 0.71 1557 + 1559 4 247.32 384.85 -177.55 0.71 1558 + 1560 4 249.12 386.86 -179.96 0.71 1559 + 1561 4 250.2 388.45 -179.96 0.71 1560 + 1562 4 252.16 389.88 -179.96 0.71 1561 + 1563 4 253.03 391.3 -182.7 0.71 1562 + 1564 4 254.55 392.72 -182.7 0.71 1563 + 1565 4 255.85 394.49 -182.7 0.71 1564 + 1566 4 256.28 396.27 -182.7 0.71 1565 + 1567 4 256.85 397.88 -182.7 0.71 1566 + 1568 4 257.28 398.59 -185.53 0.71 1567 + 1569 4 257.5 400.54 -187.73 0.71 1568 + 1570 4 257.5 402.5 -189.17 0.71 1569 + 1571 4 256.85 404.45 -190.48 0.71 1570 + 1572 4 256.63 406.58 -190.48 0.71 1571 + 1573 4 256.41 408.18 -189 0.71 1572 + 1574 4 256.41 409.96 -191.3 0.71 1573 + 1575 4 257.72 411.38 -191.3 0.71 1574 + 1576 4 258 413.97 -191.3 0.71 1575 + 1577 4 258.21 416.25 -192.57 0.71 1576 + 1578 4 258 418.92 -192.57 0.71 1577 + 1579 4 258.65 420.69 -195.35 0.71 1578 + 1580 4 258.87 422.65 -195.35 0.71 1579 + 1581 4 259.73 425.31 -195.42 0.71 1580 + 1582 4 260.17 427.8 -195.42 0.71 1581 + 1583 4 260.85 429.1 -197.68 0.71 1582 + 1584 4 261.07 431.94 -197.68 0.71 1583 + 1585 4 261.65 433.83 -197.68 0.71 1584 + 1586 4 261.65 436.5 -197.68 0.71 1585 + 1587 4 261.87 438.1 -197.91 0.71 1586 + 1588 4 262.08 440.41 -199.85 0.71 1587 + 1589 4 261.87 443.07 -197.82 0.71 1588 + 1590 4 261.87 444.85 -200.63 0.71 1589 + 1591 4 262.08 446.98 -200.63 0.71 1590 + 1592 4 262.65 449.54 -200.63 0.71 1591 + 1593 4 263.25 451.43 -200.63 0.71 1592 + 1594 4 263.9 453.57 -198.22 0.71 1593 + 1595 4 264.33 455.7 -198.22 0.71 1594 + 1596 4 265.27 457.63 -198.22 0.71 1595 + 1597 4 265.7 459.59 -198.22 0.71 1596 + 1598 4 265.92 460.65 -198.22 0.71 1597 + 1599 4 266.57 462.61 -198.22 0.71 1598 + 1600 4 265.92 464.38 -198.22 0.71 1599 + 1601 4 265.48 465.63 -198.22 0.71 1600 + 1602 4 124.37 171.12 -19.88 1.065 1443 + 1603 4 126.11 171.66 -22.04 0.89 1602 + 1604 4 127.84 172.9 -22.04 0.71 1603 + 1605 4 129.15 173.97 -20.95 0.71 1604 + 1606 4 131.1 174.86 -23.14 0.71 1605 + 1607 4 133.49 176.1 -23.14 0.71 1606 + 1608 4 135.66 177.52 -25.39 0.71 1607 + 1609 4 137.18 179.3 -25.39 0.71 1608 + 1610 4 139.14 181.07 -26.37 0.71 1609 + 1611 4 141.31 182.32 -27.28 0.71 1610 + 1612 4 142.86 183.55 -26.5 0.71 1611 + 1613 4 144.38 184.61 -27.97 0.71 1612 + 1614 4 146.12 186.57 -30.14 0.71 1613 + 1615 4 148.08 187.81 -30.14 0.71 1614 + 1616 4 149.16 189.23 -32.23 0.71 1615 + 1617 4 150.25 191.36 -35.3 0.71 1616 + 1618 4 151.12 193.14 -35.3 0.71 1617 + 1619 4 152.85 195.45 -38.03 0.71 1618 + 1620 4 154.16 197.76 -39.54 0.71 1619 + 1621 4 155.43 199.66 -39.54 0.71 1620 + 1622 4 156.52 201.43 -41.39 0.71 1621 + 1623 4 157.6 203.39 -43.26 0.71 1622 + 1624 4 159.34 204.99 -43.26 0.71 1623 + 1625 4 160.64 207.12 -45.29 0.71 1624 + 1626 4 161.95 209.25 -45.29 0.71 1625 + 1627 4 163.25 210.49 -46.8 0.71 1626 + 1628 4 164.33 212.09 -46.8 0.71 1627 + 1629 4 164.98 213.52 -49.34 0.71 1628 + 1630 4 166.72 216.01 -50.76 0.71 1629 + 1631 4 168.67 219.21 -53.36 0.71 1630 + 1632 4 170.84 222.05 -55.05 0.71 1631 + 1633 4 172.58 224.18 -55.05 0.71 1632 + 1634 4 174.1 225.78 -56.75 0.71 1633 + 1635 4 175.62 227.91 -57.33 0.71 1634 + 1636 4 176.2 229.68 -57.33 0.71 1635 + 1637 4 176.41 231.1 -55.85 0.71 1636 + 1638 4 177.5 233.59 -55.85 0.71 1637 + 1639 4 178.8 235.37 -57.51 0.71 1638 + 1640 4 180.54 237.32 -59.19 0.71 1639 + 1641 4 181.84 239.1 -59.19 0.71 1640 + 1642 4 184.01 241.23 -59.39 0.71 1641 + 1643 4 185.32 243 -61.45 0.71 1642 + 1644 4 186.85 244.17 -60.1 0.71 1643 + 1645 4 188.58 245.59 -60.1 0.71 1644 + 1646 4 190.54 247.55 -60.1 0.71 1645 + 1647 4 191.84 248.97 -58.18 0.71 1646 + 1648 4 193.8 250.21 -59.54 0.71 1647 + 1649 4 194.67 251.99 -59.62 0.71 1648 + 1650 4 196.4 252.87 -60.71 0.71 1649 + 1651 4 197.71 253.94 -62.62 0.71 1650 + 1652 4 199.44 254.65 -64.31 0.71 1651 + 1653 4 200.96 255.54 -64.31 0.71 1652 + 1654 4 203.14 256.61 -66.01 0.71 1653 + 1655 4 205.31 258.38 -66.01 0.71 1654 + 1656 4 207.06 259.37 -66.01 0.71 1655 + 1657 4 208.37 260.61 -67.36 0.71 1656 + 1658 4 210.32 261.15 -67.36 0.71 1657 + 1659 4 212.28 262.03 -66.45 0.71 1658 + 1660 4 213.8 262.39 -66.45 0.71 1659 + 1661 4 215.32 263.46 -68.96 0.71 1660 + 1662 4 217.71 264.52 -68.96 0.71 1661 + 1663 4 220.53 266.3 -68.96 0.71 1662 + 1664 4 222.7 267.72 -71.01 0.71 1663 + 1665 4 224.66 268.96 -71.01 0.71 1664 + 1666 4 226.18 270.03 -71.01 0.71 1665 + 1667 4 228.13 271.98 -72.57 0.71 1666 + 1668 4 229.43 273.94 -74.75 0.71 1667 + 1669 4 231.17 276.25 -74.75 0.71 1668 + 1670 4 231.65 278.23 -74.16 0.71 1669 + 1671 4 232.52 280.72 -75.14 0.71 1670 + 1672 4 233.82 282.85 -78.13 0.71 1671 + 1673 4 235.12 284.63 -75.94 0.71 1672 + 1674 4 236.43 286.76 -75.94 0.71 1673 + 1675 4 237.95 288.71 -75.94 0.71 1674 + 1676 4 239.68 291.56 -78.56 0.71 1675 + 1677 4 240.9 294.7 -78.56 0.71 1676 + 1678 4 241.75 297.34 -78.34 0.71 1677 + 1679 4 243.05 299.47 -80.03 0.71 1678 + 1680 4 243.49 301.07 -80.82 0.71 1679 + 1681 4 244.79 303.03 -80.82 0.71 1680 + 1682 4 246.09 304.09 -80.82 0.71 1681 + 1683 4 248.05 305.51 -80.82 0.71 1682 + 1684 4 248.92 307.29 -80.26 0.71 1683 + 1685 4 249.01 308.88 -82.98 0.71 1684 + 1686 4 250.97 311.37 -82.98 0.71 1685 + 1687 4 251.62 313.32 -82.98 0.71 1686 + 1688 4 252.71 314.74 -84.96 0.71 1687 + 1689 4 253.14 316.52 -84.38 0.71 1688 + 1690 4 253.57 318.65 -86.87 0.71 1689 + 1691 4 253.57 320.6 -88.82 0.71 1690 + 1692 4 253.79 322.2 -86.19 0.71 1691 + 1693 4 253.8 324.59 -86.19 0.71 1692 + 1694 4 254.01 325.83 -88.11 0.71 1693 + 1695 4 254.23 329.03 -88.11 0.71 1694 + 1696 4 255.1 330.27 -89.68 0.71 1695 + 1697 4 255.75 332.41 -90.22 0.71 1696 + 1698 4 256.19 334.54 -90.22 0.71 1697 + 1699 4 256.84 336.67 -90.22 0.71 1698 + 1700 4 257.67 338.99 -90.22 0.71 1699 + 1701 4 257.88 341.12 -90.22 0.71 1700 + 1702 4 258.1 343.07 -91.56 0.71 1701 + 1703 4 259.19 345.74 -91.56 0.71 1702 + 1704 4 258.97 348.05 -92.98 0.71 1703 + 1705 4 259.4 350.89 -92.43 0.71 1704 + 1706 4 259.61 353.19 -92.43 0.71 1705 + 1707 4 260.03 355.85 -92.43 0.71 1706 + 1708 4 259.81 357.99 -92.43 0.71 1707 + 1709 4 261.12 359.58 -94.19 0.71 1708 + 1710 4 261.77 361.54 -93.5 0.71 1709 + 1711 4 263.07 364.74 -93.5 0.71 1710 + 1712 4 264.16 367.05 -96.28 0.71 1711 + 1713 4 265.5 368.68 -94.7 0.71 1712 + 1714 4 266.15 370.1 -96.42 0.71 1713 + 1715 4 267.02 372.23 -96.42 0.71 1714 + 1716 4 268.32 374.36 -96.42 0.71 1715 + 1717 4 269.63 377.74 -99.59 0.71 1716 + 1718 4 269.84 379.69 -99.59 0.71 1717 + 1719 4 269.63 381.47 -99.49 0.71 1718 + 1720 4 269.83 383.43 -99.49 0.71 1719 + 1721 4 269.83 385.92 -99.49 0.71 1720 + 1722 4 270.48 388.41 -99.49 0.71 1721 + 1723 4 270.92 390.36 -99.49 0.71 1722 + 1724 4 270.78 392.23 -99.49 0.71 1723 + 1725 4 271.21 395.08 -99.49 0.71 1724 + 1726 4 272.3 397.21 -100.18 0.71 1725 + 1727 4 274.04 399.52 -100.18 0.71 1726 + 1728 4 274.69 400.76 -96.18 0.71 1727 + 1729 4 275.12 403.07 -96.18 0.71 1728 + 1730 4 275.99 405.2 -96.18 0.71 1729 + 1731 4 278.15 407.77 -96.18 0.71 1730 + 1732 4 279.67 409.72 -96.18 0.71 1731 + 1733 4 281.19 411.5 -96.18 0.71 1732 + 1734 4 281.84 413.98 -96.18 0.71 1733 + 1735 4 283.15 415.94 -96.18 0.71 1734 + 1736 4 283.8 418.25 -96.18 0.71 1735 + 1737 4 284.88 419.67 -93.06 0.71 1736 + 1738 4 285.25 421.99 -93.06 0.71 1737 + 1739 4 286.12 424.65 -93.06 0.71 1738 + 1740 4 287.2 426.41 -93.06 0.71 1739 + 1741 4 287.87 427.72 -93.06 0.71 1740 + 1742 4 98.15 132.37 -11.6 1.6 833 + 1743 4 99.89 133.61 -11.6 1.6 1742 + 1744 4 101.63 135.03 -10.04 1.42 1743 + 1745 4 102.89 136.4 -10.04 1.42 1744 + 1746 4 104.84 137.29 -10.04 1.245 1745 + 1747 4 107.01 137.29 -10.04 1.245 1746 + 1748 4 108.32 138.35 -10.04 1.245 1747 + 1749 4 110.7 139.24 -8.42 1.245 1748 + 1750 4 113.09 140.31 -8.42 1.245 1749 + 1751 4 114.4 141.55 -8.42 1.245 1750 + 1752 4 115.92 143.5 -8.42 1.245 1751 + 1753 4 117.44 144.93 -8.42 1.245 1752 + 1754 4 119.17 146.7 -8.42 1.245 1753 + 1755 4 120.91 147.41 -10.38 1.245 1754 + 1756 4 124.01 149.35 -10.38 1.245 1755 + 1757 4 125.09 150.42 -10.38 1.245 1756 + 1758 4 127.03 151.49 -10.38 1.245 1757 + 1759 4 127.9 152.2 -12.32 1.42 1758 + 1760 4 128.12 153.26 -12.32 1.6 1759 + 1761 4 127.66 154.48 -11.34 1.42 1760 + 1762 4 127.01 157.15 -11.34 1.245 1761 + 1763 4 127.23 158.57 -11.34 1.245 1762 + 1764 4 126.14 159.99 -11.34 1.065 1763 + 1765 4 125.93 161.59 -11.34 1.065 1764 + 1766 4 126.14 163.72 -11.34 1.065 1765 + 1767 4 125.71 166.39 -10.09 0.89 1766 + 1768 4 124.99 167.6 -10.74 1.065 1767 + 1769 4 123.69 170.44 -10.74 1.065 1768 + 1770 4 122.61 173.1 -10.74 1.065 1769 + 1771 4 122.39 174.88 -10.74 1.065 1770 + 1772 4 120.43 176.3 -10.74 0.89 1771 + 1773 4 119.57 179.14 -13.15 0.89 1772 + 1774 4 118.48 181.1 -13.15 0.89 1773 + 1775 4 111.53 199.88 -15.63 0.89 1774 + 1776 4 111.09 202.19 -17.74 0.89 1775 + 1777 4 109.57 204.15 -16.32 0.89 1776 + 1778 4 108.05 206.81 -16.32 0.89 1777 + 1779 4 107.4 208.59 -19 0.89 1778 + 1780 4 106.97 210.01 -18.81 0.89 1779 + 1781 4 106.75 212.14 -19.57 0.89 1780 + 1782 4 107.08 214.82 -19.57 0.89 1781 + 1783 4 107.73 217.13 -21.53 0.89 1782 + 1784 4 107.95 219.08 -21.53 0.89 1783 + 1785 4 108.17 220.68 -20.49 0.89 1784 + 1786 4 108.17 222.28 -20.49 0.89 1785 + 1787 4 109.04 224.06 -22.98 0.89 1786 + 1788 4 109.47 225.48 -22.98 0.89 1787 + 1789 4 109.69 227.61 -22.98 0.89 1788 + 1790 4 110.12 229.92 -21.8 0.89 1789 + 1791 4 110.99 232.23 -23.58 0.89 1790 + 1792 4 111.86 233.83 -23.58 0.89 1791 + 1793 4 112.73 235.96 -22.74 0.71 1792 + 1794 4 113.16 238.62 -22.74 0.71 1793 + 1795 4 113.81 240.58 -24.97 0.71 1794 + 1796 4 114.46 241.82 -26.93 0.71 1795 + 1797 4 114.46 245.02 -27.81 0.71 1796 + 1798 4 115.62 246.41 -29.34 0.71 1797 + 1799 4 116.06 248.36 -29.34 0.71 1798 + 1800 4 116.28 249.96 -31.06 0.71 1799 + 1801 4 116.71 253.34 -29.5 0.71 1800 + 1802 4 117.36 256 -29.5 0.71 1801 + 1803 4 118.66 259.91 -29.5 0.71 1802 + 1804 4 119.61 262.45 -31.09 0.71 1803 + 1805 4 120.48 264.76 -31.09 0.71 1804 + 1806 4 121.13 266.71 -31.09 0.71 1805 + 1807 4 121.78 269.02 -31.24 0.71 1806 + 1808 4 122.43 271.16 -31.24 0.71 1807 + 1809 4 123.08 273.47 -31.24 0.71 1808 + 1810 4 123.3 275.77 -31.24 0.71 1809 + 1811 4 124.84 277.36 -31.24 0.71 1810 + 1812 4 124.41 279.85 -31.24 0.71 1811 + 1813 4 124.62 282.16 -31.19 0.71 1812 + 1814 4 124.62 284.65 -31.19 0.89 1813 + 1815 4 123.76 287.84 -31.19 0.89 1814 + 1816 4 123.32 290.15 -29.84 0.89 1815 + 1817 4 122.45 291.76 -29.84 0.89 1816 + 1818 4 122.02 294.07 -29.84 0.89 1817 + 1819 4 121.37 295.85 -27.79 0.89 1818 + 1820 4 120.28 299.4 -27.79 0.89 1819 + 1821 4 119.63 301 -27.79 0.89 1820 + 1822 4 119.41 303.31 -27.79 0.89 1821 + 1823 4 118.76 305.44 -27.79 0.89 1822 + 1824 4 118.3 308.23 -29.7 0.89 1823 + 1825 4 118.3 310.36 -29.7 0.89 1824 + 1826 4 117.87 312.31 -29.35 0.71 1825 + 1827 4 117.65 314.27 -29.35 0.71 1826 + 1828 4 117.22 316.22 -29.35 0.71 1827 + 1829 4 116.78 318.53 -29.44 0.71 1828 + 1830 4 117 320.84 -29.44 0.71 1829 + 1831 4 117.16 323.58 -26.38 0.71 1830 + 1832 4 117.37 326.43 -25.88 0.71 1831 + 1833 4 117.37 328.74 -26.61 0.71 1832 + 1834 4 117.59 331.93 -26.61 0.71 1833 + 1835 4 118.02 333.89 -24.66 0.71 1834 + 1836 4 118.24 336.55 -24.66 0.71 1835 + 1837 4 117.7 339.05 -24.66 0.71 1836 + 1838 4 117.49 341.18 -24.46 0.71 1837 + 1839 4 116.84 343.67 -24.46 0.71 1838 + 1840 4 116.18 345.27 -23.34 0.71 1839 + 1841 4 115.32 347.4 -23.08 0.71 1840 + 1842 4 114.66 349.53 -23.08 0.71 1841 + 1843 4 113.36 351.49 -23.08 0.71 1842 + 1844 4 113.12 352.99 -22.22 0.71 1843 + 1845 4 112.25 354.58 -22.22 0.71 1844 + 1846 4 110.73 355.83 -20.5 0.71 1845 + 1847 4 108.99 357.07 -20.5 0.71 1846 + 1848 4 107.69 359.03 -20.5 0.71 1847 + 1849 4 106.61 361.16 -20.86 0.71 1848 + 1850 4 105.74 362.93 -20.86 0.71 1849 + 1851 4 105.3 365.24 -18.22 0.71 1850 + 1852 4 105.52 367.55 -18.22 0.71 1851 + 1853 4 105.76 369.36 -18.22 0.71 1852 + 1854 4 105.54 370.96 -18.22 0.71 1853 + 1855 4 104.89 372.56 -17.36 0.71 1854 + 1856 4 104.89 375.76 -17.36 0.71 1855 + 1857 4 104.24 377.36 -17.36 0.71 1856 + 1858 4 104.45 378.96 -19.62 0.71 1857 + 1859 4 103.58 380.91 -19.62 0.71 1858 + 1860 4 103.15 382.69 -19.62 0.71 1859 + 1861 4 102.05 384.01 -18.9 0.71 1860 + 1862 4 101.18 385.61 -18.9 0.71 1861 + 1863 4 100.75 387.38 -19.01 0.71 1862 + 1864 4 100.1 389.69 -19.08 0.71 1863 + 1865 4 99.45 391.47 -19.08 0.71 1864 + 1866 4 99.23 393.25 -17.48 0.71 1865 + 1867 4 98.58 395.02 -17.48 0.71 1866 + 1868 4 97.06 397.69 -16.22 0.71 1867 + 1869 4 96.07 399.54 -16.22 0.71 1868 + 1870 4 95.64 401.85 -16.22 0.71 1869 + 1871 4 94.98 403.8 -15.14 0.71 1870 + 1872 4 94.77 406.29 -15.14 0.71 1871 + 1873 4 94.55 408.96 -16.16 0.71 1872 + 1874 4 94.33 411.09 -16.16 0.71 1873 + 1875 4 94.12 412.51 -16.16 0.71 1874 + 1876 4 93.92 414.7 -15.18 0.71 1875 + 1877 4 93.49 416.12 -15.18 0.71 1876 + 1878 4 93.7 418.07 -16.14 0.71 1877 + 1879 4 94.57 420.03 -16.14 0.71 1878 + 1880 4 95.22 422.87 -16.14 0.71 1879 + 1881 4 96.09 424.29 -16.14 0.71 1880 + 1882 4 97.4 426.24 -16.14 0.71 1881 + 1883 4 99.13 428.55 -16.14 0.71 1882 + 1884 4 100.24 429.81 -16.26 0.71 1883 + 1885 4 101.09 431.23 -17.58 0.71 1884 + 1886 4 101.96 433.54 -17.58 0.71 1885 + 1887 4 102.83 435.49 -17.58 0.71 1886 + 1888 4 103.48 437.8 -19.68 0.71 1887 + 1889 4 104.13 439.93 -19.68 0.71 1888 + 1890 4 104.57 441.71 -18.02 0.71 1889 + 1891 4 105.65 444.02 -19.78 0.71 1890 + 1892 4 107.08 445.94 -19.78 0.71 1891 + 1893 4 108.58 449.32 -19.78 0.71 1892 + 1894 4 108.58 451.45 -19.78 0.71 1893 + 1895 4 108.36 453.76 -18.92 0.71 1894 + 1896 4 108.58 455.87 -18.92 0.71 1895 + 1897 4 107.93 457.64 -18.92 0.71 1896 + 1898 4 108.14 459.6 -20.96 0.71 1897 + 1899 4 108.16 462.05 -20.78 0.71 1898 + 1900 4 108.81 464.36 -19.81 0.71 1899 + 1901 4 109.46 466.67 -22.46 0.71 1900 + 1902 4 109.68 469.33 -22.46 0.71 1901 + 1903 4 110.11 471.29 -22.46 0.71 1902 + 1904 4 110.76 473.24 -22.1 0.71 1903 + 1905 4 111.41 475.73 -22.1 0.71 1904 + 1906 4 111.56 477.72 -22.1 0.71 1905 + 1907 4 112.21 480.38 -22.1 0.71 1906 + 1908 4 112.21 482.51 -21.55 0.71 1907 + 1909 4 113.29 483.76 -23.06 0.71 1908 + 1910 4 114.81 485.36 -23.06 0.71 1909 + 1911 4 116.98 487.31 -23.06 0.71 1910 + 1912 4 118.29 488.55 -24.53 0.71 1911 + 1913 4 120.46 489.98 -24.53 0.71 1912 + 1914 4 123.14 491.74 -23.77 0.71 1913 + 1915 4 124.88 493.34 -23.77 0.71 1914 + 1916 4 126.18 494.58 -24.12 0.71 1915 + 1917 4 128.36 495.65 -25.64 0.71 1916 + 1918 4 129.23 496.71 -27.22 0.71 1917 + 1919 4 130.31 499.02 -29.28 0.71 1918 + 1920 4 131.61 501.16 -29.28 0.71 1919 + 1921 4 133.35 503.64 -29.28 0.71 1920 + 1922 4 135.09 505.95 -29.28 0.71 1921 + 1923 4 138.18 507.25 -26.71 0.71 1922 + 1924 4 139.92 507.59 -28.54 0.71 1923 + 1925 4 141.87 508.12 -27.29 0.71 1924 + 1926 4 144.04 509.54 -27.29 0.71 1925 + 1927 4 146.87 510.61 -27.29 0.71 1926 + 1928 4 149.25 512.03 -28.7 0.71 1927 + 1929 4 151.86 512.74 -28.7 0.71 1928 + 1930 4 154.11 513.83 -28.7 0.71 1929 + 1931 4 156.28 514.9 -28.7 0.71 1930 + 1932 4 157.8 515.78 -28.05 0.71 1931 + 1933 4 160.19 515.96 -28.05 0.71 1932 + 1934 4 161.71 517.38 -28.05 0.71 1933 + 1935 4 163.88 518.63 -29.96 0.71 1934 + 1936 4 165.84 518.98 -29.96 0.71 1935 + 1937 4 167.36 519.51 -30.54 0.71 1936 + 1938 4 169.75 520.4 -30.54 0.71 1937 + 1939 4 171.71 521.07 -30.54 0.71 1938 + 1940 4 174.75 522.83 -30.54 0.71 1939 + 1941 4 177.36 523.54 -30.54 0.71 1940 + 1942 4 178.42 525.19 -30.54 0.71 1941 + 1943 4 180.6 526.07 -29.19 0.71 1942 + 1944 4 182.77 527.49 -29.19 0.71 1943 + 1945 4 184.48 528.45 -30.65 0.71 1944 + 1946 4 186.65 529.52 -32.37 0.71 1945 + 1947 4 189.04 531.29 -30.94 0.71 1946 + 1948 4 190.99 532.54 -30.94 0.71 1947 + 1949 4 192.73 534.14 -33.76 0.71 1948 + 1950 4 195.33 536.09 -33.76 0.71 1949 + 1951 4 197.07 537.16 -33.76 0.71 1950 + 1952 4 198.37 539.29 -31.19 0.71 1951 + 1953 4 200.55 541.78 -33.38 0.71 1952 + 1954 4 202.94 543.74 -33.38 0.71 1953 + 1955 4 205.55 545.16 -32.87 0.71 1954 + 1956 4 207.51 546.58 -36.15 0.71 1955 + 1957 4 209.89 547.12 -36.15 0.71 1956 + 1958 4 211.85 547.83 -36.15 0.71 1957 + 1959 4 214.24 549.07 -36.28 0.71 1958 + 1960 4 215.97 550.31 -38.06 0.71 1959 + 1961 4 218.15 551.2 -38.06 0.71 1960 + 1962 4 220.11 552.41 -38.06 0.71 1961 + 1963 4 222.5 553.83 -38.06 0.71 1962 + 1964 4 224.02 555.43 -38.06 0.71 1963 + 1965 4 225.76 556.85 -39.22 0.71 1964 + 1966 4 227.28 558.8 -39.22 0.71 1965 + 1967 4 229.23 560.22 -38.27 0.71 1966 + 1968 4 231.4 562.36 -40.79 0.71 1967 + 1969 4 233.57 564.31 -40.79 0.71 1968 + 1970 4 235.31 565.73 -38.98 0.71 1969 + 1971 4 236.66 567.43 -41.87 0.71 1970 + 1972 4 238.04 568.45 -41.87 0.71 1971 + 1973 4 130.29 153.62 -12.32 1.42 1760 + 1974 4 132.46 154.33 -12.32 1.42 1973 + 1975 4 134.2 155.93 -13 1.42 1974 + 1976 4 135.28 157.35 -13 1.42 1975 + 1977 4 136.8 158.77 -13 1.42 1976 + 1978 4 138.97 160.01 -14.96 1.42 1977 + 1979 4 140.93 160.55 -14.96 1.42 1978 + 1980 4 143.34 162.18 -14.96 1.245 1979 + 1981 4 144.42 163.42 -14.96 1.245 1980 + 1982 4 146.38 165.02 -17.78 1.245 1981 + 1983 4 148.77 166.97 -17.78 1.245 1982 + 1984 4 150.94 168.75 -20.4 1.245 1983 + 1985 4 153.54 170.7 -20.4 1.245 1984 + 1986 4 155.5 171.95 -20.4 1.245 1985 + 1987 4 157.67 173.37 -20.4 1.245 1986 + 1988 4 159.84 174.79 -22.43 1.245 1987 + 1989 4 161.09 176.91 -22.43 1.245 1988 + 1990 4 162.61 179.04 -22.43 1.245 1989 + 1991 4 163.91 181.71 -23.53 1.245 1990 + 1992 4 165.86 184.02 -23.53 1.245 1991 + 1993 4 167.6 186.32 -25.49 1.245 1992 + 1994 4 168.47 187.57 -25.49 1.245 1993 + 1995 4 169.56 189.17 -26.96 1.245 1994 + 1996 4 170.42 190.77 -26.96 1.245 1995 + 1997 4 170.86 192.54 -26.96 1.245 1996 + 1998 4 171.29 193.25 -26.96 1.245 1997 + 1999 4 171.69 196.41 -29.56 1.065 1998 + 2000 4 172.35 200.67 -30.86 0.89 1999 + 2001 4 173 201.91 -32.81 0.89 2000 + 2002 4 172.78 203.16 -30.36 0.71 2001 + 2003 4 173.21 204.56 -33.54 0.71 2002 + 2004 4 173.87 206.51 -33.54 0.71 2003 + 2005 4 173.61 207.99 -36.85 0.71 2004 + 2006 4 174.48 210.47 -39.62 0.71 2005 + 2007 4 176.21 212.6 -41.46 0.71 2006 + 2008 4 176.43 214.2 -44.14 0.71 2007 + 2009 4 178.17 216.34 -44.14 0.71 2008 + 2010 4 179.69 218.64 -44.53 0.71 2009 + 2011 4 181.21 220.95 -46.7 0.71 2010 + 2012 4 184.28 224.14 -48.52 0.71 2011 + 2013 4 186.02 226.09 -50.26 0.71 2012 + 2014 4 187.76 228.76 -50.26 0.71 2013 + 2015 4 189.93 231.07 -49.74 0.71 2014 + 2016 4 191.02 232.84 -49.74 0.71 2015 + 2017 4 192.95 234.8 -53.27 0.71 2016 + 2018 4 193.39 236.4 -52.7 0.71 2017 + 2019 4 193.88 238.3 -56.21 0.71 2018 + 2020 4 195.61 240.25 -56.21 0.71 2019 + 2021 4 196.7 242.03 -55.74 0.71 2020 + 2022 4 198.44 244.16 -55.74 0.71 2021 + 2023 4 200.39 246.47 -60.65 0.71 2022 + 2024 4 202.13 249.13 -60.65 0.71 2023 + 2025 4 203.65 250.55 -62.71 0.71 2024 + 2026 4 204.28 251.96 -63.17 0.71 2025 + 2027 4 205.36 255.16 -63.17 0.71 2026 + 2028 4 205.8 257.29 -65.22 0.71 2027 + 2029 4 206.67 259.78 -68.57 0.71 2028 + 2030 4 207.32 262.09 -68.57 0.71 2029 + 2031 4 208.62 264.4 -70.42 0.71 2030 + 2032 4 208.84 266.89 -70.42 0.71 2031 + 2033 4 209.73 269.1 -70.22 0.71 2032 + 2034 4 210.81 270.7 -73.11 0.71 2033 + 2035 4 211.9 272.83 -73.11 0.71 2034 + 2036 4 213.85 274.96 -76.22 0.71 2035 + 2037 4 215.16 277.45 -76.22 0.71 2036 + 2038 4 216.89 280.47 -79.48 0.71 2037 + 2039 4 218.63 283.31 -79.48 0.71 2038 + 2040 4 220.38 284.94 -80.12 0.71 2039 + 2041 4 221.25 286.54 -82.98 0.71 2040 + 2042 4 224.07 289.92 -82.98 0.71 2041 + 2043 4 222.99 292.22 -84.88 0.71 2042 + 2044 4 224.29 294.89 -84.88 0.71 2043 + 2045 4 226.03 297.2 -87.38 0.71 2044 + 2046 4 227.33 299.15 -87.38 0.71 2045 + 2047 4 228.76 301.1 -89.58 0.71 2046 + 2048 4 230.72 303.76 -89.58 0.71 2047 + 2049 4 232.24 305.72 -88.9 0.71 2048 + 2050 4 233.32 307.14 -91.44 0.71 2049 + 2051 4 234.63 308.74 -91.44 0.71 2050 + 2052 4 235.49 311.04 -92.26 0.71 2051 + 2053 4 237.23 312.82 -92.26 0.71 2052 + 2054 4 239.4 314.42 -94.47 0.71 2053 + 2055 4 241.18 316.12 -94.47 0.71 2054 + 2056 4 242.05 317.72 -94.5 0.71 2055 + 2057 4 243.57 318.78 -94.5 0.71 2056 + 2058 4 245.74 320.03 -94.5 0.71 2057 + 2059 4 247.69 321.45 -94.5 0.71 2058 + 2060 4 249.18 322.23 -94.5 0.71 2059 + 2061 4 249.83 323.3 -94.5 0.71 2060 + 2062 4 250.48 324.18 -94.5 0.89 2061 + 2063 4 250.24 325.41 -92.05 0.71 2062 + 2064 4 251.11 327.16 -92.05 0.71 2063 + 2065 4 252.41 329.12 -92.05 0.71 2064 + 2066 4 254.15 330.72 -91.42 0.71 2065 + 2067 4 255.02 332.67 -88.13 0.71 2066 + 2068 4 256.76 335.69 -88.13 0.71 2067 + 2069 4 258.71 338.89 -88.13 0.71 2068 + 2070 4 260.16 341.07 -86.93 0.71 2069 + 2071 4 261.25 343.03 -86.93 0.71 2070 + 2072 4 261.68 344.8 -86.93 0.71 2071 + 2073 4 262.77 346.94 -89.26 0.71 2072 + 2074 4 265.37 349.6 -89.26 0.71 2073 + 2075 4 265.81 351.91 -88.25 0.71 2074 + 2076 4 267.55 354.93 -88.25 0.71 2075 + 2077 4 269.41 357.07 -87.89 0.71 2076 + 2078 4 270.5 359.56 -90.03 0.71 2077 + 2079 4 272.24 361.16 -90.03 0.71 2078 + 2080 4 273.97 362.76 -91.48 0.71 2079 + 2081 4 275.49 364.71 -91.48 0.71 2080 + 2082 4 277.88 366.13 -91.48 0.71 2081 + 2083 4 280.92 367.73 -91.48 0.71 2082 + 2084 4 282.44 370.04 -93.86 0.71 2083 + 2085 4 283.75 372.07 -93.86 0.71 2084 + 2086 4 286.13 374.38 -93.86 0.71 2085 + 2087 4 288.96 376.52 -93.86 0.71 2086 + 2088 4 290.48 378.47 -93.86 0.71 2087 + 2089 4 291.78 380.25 -95.68 0.71 2088 + 2090 4 294.17 383.62 -95.68 0.71 2089 + 2091 4 296.56 385.75 -95.68 0.71 2090 + 2092 4 297.95 387.52 -93.94 0.71 2091 + 2093 4 299.03 389.65 -93.94 0.71 2092 + 2094 4 300.33 391.78 -93.94 0.71 2093 + 2095 4 300.77 394.45 -91.73 0.71 2094 + 2096 4 301.2 397.29 -91.73 0.71 2095 + 2097 4 301.42 400.31 -91.73 0.71 2096 + 2098 4 300.81 403.01 -91.73 0.71 2097 + 2099 4 300.63 404.39 -91.73 0.71 2098 + 2100 4 299.32 406.87 -91.73 0.71 2099 + 2101 4 299.54 408.63 -87.99 0.71 2100 + 2102 4 299.76 411.47 -87.99 0.71 2101 + 2103 4 299.11 413.6 -84.5 0.71 2102 + 2104 4 299.32 416.27 -84.5 0.71 2103 + 2105 4 299.97 418.93 -84.5 0.71 2104 + 2106 4 298.96 421.78 -84.5 0.71 2105 + 2107 4 298.96 424.09 -84.14 0.71 2106 + 2108 4 299.39 426.23 -84.14 0.71 2107 + 2109 4 300.48 428.89 -84.14 0.71 2108 + 2110 4 301.35 433.33 -80.07 0.71 2109 + 2111 4 302.75 436.18 -80.07 0.71 2110 + 2112 4 304.7 439.92 -80.07 0.71 2111 + 2113 4 306.44 442.4 -80.07 0.71 2112 + 2114 4 307.31 444.71 -77.86 0.71 2113 + 2115 4 308.17 446.67 -77.86 0.71 2114 + 2116 4 309.48 449.86 -74.91 0.71 2115 + 2117 4 310.75 452.41 -74.91 0.71 2116 + 2118 4 312.48 454.89 -74.91 0.71 2117 + 2119 4 314.22 457.03 -74.91 0.71 2118 + 2120 4 315.31 459.34 -73.53 0.71 2119 + 2121 4 316.17 461.11 -73.53 0.71 2120 + 2122 4 317.48 463.78 -73.53 0.71 2121 + 2123 4 318.56 466.97 -75.58 0.71 2122 + 2124 4 319.51 468.92 -75.58 0.71 2123 + 2125 4 319.95 470.87 -74.23 0.71 2124 + 2126 4 321.03 473 -74.23 0.71 2125 + 2127 4 320.38 475.67 -71.43 0.71 2126 + 2128 4 320.16 477.62 -71.43 0.71 2127 + 2129 4 320.81 479.93 -71.43 0.71 2128 + 2130 4 319.95 482.78 -71.67 0.71 2129 + 2131 4 319.61 484.54 -69.26 0.71 2130 + 2132 4 319.83 486.67 -67.86 0.71 2131 + 2133 4 319.83 488.8 -70.26 0.71 2132 + 2134 4 319.83 490.94 -70.26 0.71 2133 + 2135 4 320.26 493.6 -70.57 0.71 2134 + 2136 4 320.26 495.91 -70.57 0.71 2135 + 2137 4 318.96 497.69 -67.66 0.71 2136 + 2138 4 317.76 499.54 -67.66 0.71 2137 + 2139 4 316.67 502.74 -67.66 0.71 2138 + 2140 4 315.8 505.23 -67.66 0.71 2139 + 2141 4 316.28 507.32 -67.66 0.71 2140 + 2142 4 316.28 509.98 -67.66 0.71 2141 + 2143 4 316.49 512.83 -67.66 0.71 2142 + 2144 4 316.66 514.16 -67.66 0.71 2143 + 2145 4 252.41 324.14 -94.5 0.71 2062 + 2146 4 255.89 324.12 -96.7 0.71 2145 + 2147 4 260.23 324.65 -96.7 0.71 2146 + 2148 4 262.84 325.36 -96.7 0.71 2147 + 2149 4 265.01 326.25 -101.5 0.71 2148 + 2150 4 267.83 327.14 -101.63 0.71 2149 + 2151 4 271.31 327.85 -103.7 0.71 2150 + 2152 4 274.32 330.05 -106.5 0.71 2151 + 2153 4 277.57 331.12 -106.5 0.71 2152 + 2154 4 279.51 332.01 -106.5 0.71 2153 + 2155 4 281.85 332.65 -106.5 0.71 2154 + 2156 4 285.74 333.01 -106.5 0.71 2155 + 2157 4 290.74 333.72 -106.5 0.71 2156 + 2158 4 293.56 335.14 -106.5 0.71 2157 + 2159 4 294.43 336.38 -106.5 0.71 2158 + 2160 4 172.38 195.39 -25.17 1.065 1998 + 2161 4 173.03 196.98 -25.17 1.065 2160 + 2162 4 173.46 198.58 -25.17 1.065 2161 + 2163 4 174.77 200.54 -21.96 0.89 2162 + 2164 4 175.2 202.49 -21.96 0.89 2163 + 2165 4 176.07 204.45 -21.96 0.89 2164 + 2166 4 177.74 206.48 -20.91 0.89 2165 + 2167 4 178.61 208.43 -20.91 0.89 2166 + 2168 4 181 210.92 -18.71 0.89 2167 + 2169 4 180.35 212.69 -18.71 0.89 2168 + 2170 4 180.78 214.47 -17.41 0.89 2169 + 2171 4 182.09 216.6 -17.41 0.89 2170 + 2172 4 183.61 218.2 -16.01 0.89 2171 + 2173 4 185.56 219.98 -16.01 0.89 2172 + 2174 4 187.28 221.04 -17.66 0.89 2173 + 2175 4 189.67 222.11 -17.66 0.89 2174 + 2176 4 191.63 223.18 -17.66 0.89 2175 + 2177 4 193.58 224.6 -17.66 0.89 2176 + 2178 4 195.32 225.49 -17.66 0.89 2177 + 2179 4 196.84 227.26 -17.66 0.89 2178 + 2180 4 198.14 228.51 -18.38 0.89 2179 + 2181 4 200.31 230.28 -18.38 0.89 2180 + 2182 4 202.05 231.7 -18.38 0.89 2181 + 2183 4 203.57 233.12 -16.53 0.89 2182 + 2184 4 205.31 234.55 -18.31 0.89 2183 + 2185 4 206.7 236 -18.31 0.89 2184 + 2186 4 208.87 238.13 -17.34 0.89 2185 + 2187 4 210.83 240.44 -19.08 0.89 2186 + 2188 4 212.56 242.39 -19.08 0.89 2187 + 2189 4 214.08 244.35 -19.08 0.89 2188 + 2190 4 215.82 245.77 -17.5 0.89 2189 + 2191 4 217.34 247.19 -19.88 0.89 2190 + 2192 4 218.86 248.61 -19.88 0.89 2191 + 2193 4 220.6 250.03 -20.38 0.71 2192 + 2194 4 222.1 252.31 -20.38 0.89 2193 + 2195 4 222.97 253.91 -20.38 0.89 2194 + 2196 4 224.27 256.04 -20.38 0.89 2195 + 2197 4 224.92 257.64 -20.38 0.89 2196 + 2198 4 225.57 259.95 -22.62 0.89 2197 + 2199 4 226.44 261.9 -22.62 0.89 2198 + 2200 4 226.88 264.04 -22.62 0.89 2199 + 2201 4 227.96 266.34 -22.62 0.89 2200 + 2202 4 229.33 269.27 -22.62 0.89 2201 + 2203 4 229.77 270.69 -22.22 0.89 2202 + 2204 4 230.42 271.75 -22.22 1.065 2203 + 2205 4 230.85 272.64 -22.22 1.065 2204 + 2206 4 230.85 273 -22.22 1.245 2205 + 2207 4 230.2 274.24 -22.22 0.89 2206 + 2208 4 230.2 275.48 -24.66 0.89 2207 + 2209 4 229.55 277.44 -27.06 0.89 2208 + 2210 4 228.9 279.04 -27.06 0.89 2209 + 2211 4 228.68 280.46 -26.86 0.71 2210 + 2212 4 228.68 282.59 -26.86 0.71 2211 + 2213 4 227.16 284.37 -26.86 0.71 2212 + 2214 4 226.51 286.68 -28.33 0.71 2213 + 2215 4 225.86 288.45 -28.37 0.71 2214 + 2216 4 225.43 289.7 -28.37 0.71 2215 + 2217 4 224.99 291.83 -28.37 0.71 2216 + 2218 4 224.77 294.31 -28.37 0.71 2217 + 2219 4 224.56 295.91 -29.94 0.71 2218 + 2220 4 223.91 298.93 -29.94 0.71 2219 + 2221 4 223.25 301.06 -31.99 0.71 2220 + 2222 4 223.03 303.27 -33.33 0.71 2221 + 2223 4 222.16 306.12 -33.33 0.71 2222 + 2224 4 221.94 309.14 -35.13 0.71 2223 + 2225 4 222.16 312.51 -35.13 0.71 2224 + 2226 4 221.51 314.64 -36.4 0.71 2225 + 2227 4 221.29 316.78 -35.34 0.71 2226 + 2228 4 221.03 318.52 -35.34 0.71 2227 + 2229 4 221.03 320.65 -37.2 0.71 2228 + 2230 4 221.24 323.32 -37.2 0.71 2229 + 2231 4 220.81 326.51 -37.2 0.71 2230 + 2232 4 220.59 329.89 -37.2 0.71 2231 + 2233 4 220.81 333.09 -37.3 0.71 2232 + 2234 4 221.06 336.16 -37.3 0.71 2233 + 2235 4 220.84 337.58 -38.95 0.71 2234 + 2236 4 221.71 339.89 -38.95 0.71 2235 + 2237 4 222.36 342.38 -37.04 0.71 2236 + 2238 4 223.01 343.8 -37.04 0.71 2237 + 2239 4 223.67 345.76 -37.04 0.71 2238 + 2240 4 224.1 348.42 -37.04 0.71 2239 + 2241 4 224.91 350.14 -37.04 0.71 2240 + 2242 4 224.91 352.27 -37.04 0.71 2241 + 2243 4 225.78 355.12 -35.97 0.71 2242 + 2244 4 226.87 357.42 -37.05 0.71 2243 + 2245 4 228.39 360.27 -37.05 0.71 2244 + 2246 4 229.69 362.75 -37.05 0.71 2245 + 2247 4 230.53 365.23 -37.05 0.71 2246 + 2248 4 232.7 368.6 -37.05 0.71 2247 + 2249 4 234.87 370.18 -37.82 0.71 2248 + 2250 4 236.83 371.96 -37.82 0.71 2249 + 2251 4 239 374.09 -37.82 0.71 2250 + 2252 4 240.52 376.58 -37.82 0.71 2251 + 2253 4 242.26 378.53 -38.21 0.71 2252 + 2254 4 244.18 379.96 -38.21 0.71 2253 + 2255 4 245.92 381.38 -38.21 0.71 2254 + 2256 4 248.31 382.81 -38.21 0.71 2255 + 2257 4 249.17 384.05 -37.32 0.71 2256 + 2258 4 251.56 385.83 -36.91 0.71 2257 + 2259 4 253.95 387.25 -36.91 0.71 2258 + 2260 4 256.12 388.67 -39.64 0.71 2259 + 2261 4 258.51 390.09 -39.64 0.71 2260 + 2262 4 261.12 392.22 -39.64 0.71 2261 + 2263 4 262.35 393.74 -39.64 0.71 2262 + 2264 4 264.3 394.98 -41.7 0.71 2263 + 2265 4 266.04 396.23 -40.45 0.71 2264 + 2266 4 268.21 398.18 -40.45 0.71 2265 + 2267 4 269.51 399.6 -42.02 0.71 2266 + 2268 4 271.03 400.85 -45.7 0.71 2267 + 2269 4 273.2 402.62 -45.7 0.71 2268 + 2270 4 275.38 404.93 -47.35 0.71 2269 + 2271 4 277.33 406 -47.35 0.71 2270 + 2272 4 279.28 407.24 -47.12 0.71 2271 + 2273 4 281.87 408.21 -47.12 0.71 2272 + 2274 4 283.39 409.45 -47.3 0.71 2273 + 2275 4 285.12 411.05 -48.96 0.71 2274 + 2276 4 285.99 413 -51.37 0.71 2275 + 2277 4 287.29 415.14 -51.37 0.71 2276 + 2278 4 288.82 418.16 -51.37 0.71 2277 + 2279 4 290.34 420.11 -50.91 0.71 2278 + 2280 4 292.07 422.42 -50.91 0.71 2279 + 2281 4 292.93 424.1 -52.87 0.71 2280 + 2282 4 294.23 425.7 -52.86 0.71 2281 + 2283 4 294.91 427.52 -52.86 0.71 2282 + 2284 4 296.21 430.01 -52.86 0.71 2283 + 2285 4 296.21 432.14 -55.55 0.71 2284 + 2286 4 297.95 434.09 -55.55 0.71 2285 + 2287 4 299.04 436.05 -55.6 0.71 2286 + 2288 4 300.12 438 -55.6 0.71 2287 + 2289 4 301.43 439.42 -58.14 0.71 2288 + 2290 4 302.55 440.23 -58.14 0.535 2289 + 2291 4 304.07 442.9 -58.14 0.535 2290 + 2292 4 306.02 444.67 -58.14 0.535 2291 + 2293 4 306.45 446.98 -58.14 0.535 2292 + 2294 4 307.11 448.76 -58.14 0.535 2293 + 2295 4 308.19 450.18 -58.14 0.535 2294 + 2296 4 232.81 274.06 -24.65 0.89 2206 + 2297 4 234.33 275.13 -24.22 0.89 2296 + 2298 4 235.63 276.37 -24.22 0.89 2297 + 2299 4 236.5 277.79 -26.18 0.89 2298 + 2300 4 237.59 279.04 -24.21 0.89 2299 + 2301 4 238.89 280.64 -24.21 0.89 2300 + 2302 4 239.98 281.7 -24.77 0.89 2301 + 2303 4 240.45 283.2 -24.77 0.89 2302 + 2304 4 241.27 284.44 -24.77 0.89 2303 + 2305 4 241.27 285.87 -24.77 0.89 2304 + 2306 4 242.13 287.29 -24.77 0.89 2305 + 2307 4 242.35 288 -24.77 0.89 2306 + 2308 4 243.46 291.06 -21.93 0.89 2307 + 2309 4 244.33 292.3 -23.02 0.71 2308 + 2310 4 245.85 293.54 -21.62 0.71 2309 + 2311 4 247.15 295.5 -19.23 0.71 2310 + 2312 4 248.46 297.1 -19.23 0.71 2311 + 2313 4 249.98 298.87 -19.23 0.71 2312 + 2314 4 251.71 300.83 -19.23 0.71 2313 + 2315 4 253.02 302.78 -16.84 0.71 2314 + 2316 4 255.16 304.41 -17.58 0.71 2315 + 2317 4 256.25 306.01 -17.58 0.71 2316 + 2318 4 257.55 307.43 -15.7 0.71 2317 + 2319 4 258.42 309.03 -16.48 0.71 2318 + 2320 4 259.94 310.28 -13 0.71 2319 + 2321 4 261.68 311.7 -13 0.71 2320 + 2322 4 264.07 313.83 -13 0.71 2321 + 2323 4 266.02 314.69 -11.39 0.71 2322 + 2324 4 267.76 316.12 -11.39 0.71 2323 + 2325 4 269.5 316.83 -11.39 0.71 2324 + 2326 4 270.91 317.52 -9.86 0.71 2325 + 2327 4 273.52 318.95 -9.86 0.71 2326 + 2328 4 274.61 320.19 -10.13 0.71 2327 + 2329 4 276.13 321.08 -8.43 0.71 2328 + 2330 4 277.21 323.21 -7.66 0.71 2329 + 2331 4 277.65 325.87 -7.66 0.71 2330 + 2332 4 278.95 328.01 -7.66 0.71 2331 + 2333 4 281.12 329.78 -9.3 0.71 2332 + 2334 4 282.86 331.2 -9.3 0.71 2333 + 2335 4 284.51 332.46 -9.3 0.71 2334 + 2336 4 285.16 334.23 -7.48 0.71 2335 + 2337 4 286.68 335.48 -7.48 0.71 2336 + 2338 4 287.77 337.08 -7.48 0.71 2337 + 2339 4 289.07 339.56 -6.02 0.71 2338 + 2340 4 290.81 341.52 -7.11 0.71 2339 + 2341 4 292.77 343.12 -4.54 0.71 2340 + 2342 4 295.37 345.43 -4.54 0.71 2341 + 2343 4 297.33 346.84 -3.45 0.71 2342 + 2344 4 300.37 348.61 -2.7 0.71 2343 + 2345 4 302.98 350.57 -2.7 0.71 2344 + 2346 4 304.71 352.16 -0.7 0.71 2345 + 2347 4 306.89 355.01 -0.7 0.71 2346 + 2348 4 308.19 356.96 -0.7 0.71 2347 + 2349 4 309.93 358.2 -0.06 0.71 2348 + 2350 4 311.66 359.98 -2.46 0.71 2349 + 2351 4 313.13 361.97 -2.46 0.71 2350 + 2352 4 314.65 364.1 -2.46 0.71 2351 + 2353 4 315.95 366.05 -0.24 0.71 2352 + 2354 4 318.34 366.94 -0.24 0.71 2353 + 2355 4 320.95 369.07 -0.79 0.71 2354 + 2356 4 322.9 371.21 -0.79 0.71 2355 + 2357 4 324.21 373.34 -1.72 0.71 2356 + 2358 4 324.86 374.94 -3.03 0.71 2357 + 2359 4 325.64 376.44 -0.34 0.71 2358 + 2360 4 326.95 378.21 -0.34 0.71 2359 + 2361 4 327.38 380.7 2.91 0.71 2360 + 2362 4 327.82 383.01 2.91 0.71 2361 + 2363 4 327.38 385.14 3.42 0.71 2362 + 2364 4 326.3 386.74 3.42 0.71 2363 + 2365 4 326.3 388.52 5.5 0.71 2364 + 2366 4 324.34 391.18 4.82 0.71 2365 + 2367 4 322.86 394.94 6.1 0.71 2366 + 2368 4 321.55 397.79 6.1 0.71 2367 + 2369 4 321.34 400.27 9.19 0.71 2368 + 2370 4 321.34 402.41 9.19 0.71 2369 + 2371 4 320.68 404.54 9.31 0.71 2370 + 2372 4 320.9 407.02 9.31 0.71 2371 + 2373 4 320.11 408.84 9.31 0.71 2372 + 2374 4 319.24 410.61 11.2 0.71 2373 + 2375 4 318.8 412.57 11.2 0.71 2374 + 2376 4 318.59 414.7 13.74 0.71 2375 + 2377 4 318.59 417.01 13.74 0.71 2376 + 2378 4 318.37 420.56 16.29 0.71 2377 + 2379 4 317.94 423.76 17.03 0.71 2378 + 2380 4 317.54 426.3 18.78 0.71 2379 + 2381 4 317.54 428.79 17.7 0.71 2380 + 2382 4 317.11 432.16 18.41 0.71 2381 + 2383 4 316.67 435.01 18.41 0.71 2382 + 2384 4 316.24 436.78 20.42 0.71 2383 + 2385 4 316.24 439.27 23.22 0.71 2384 + 2386 4 315.74 441.9 23.22 0.71 2385 + 2387 4 315.52 444.03 23.22 0.71 2386 + 2388 4 316.39 446.16 23.31 0.71 2387 + 2389 4 317.7 448.83 25.14 0.71 2388 + 2390 4 317.7 452.2 25.14 0.71 2389 + 2391 4 318.56 454.34 27.66 0.71 2390 + 2392 4 319.88 455.86 27.66 0.71 2391 + 2393 4 319.88 457.99 30.31 0.71 2392 + 2394 4 320.21 459.64 30.31 0.71 2393 + 2395 4 320.86 462.3 33.11 0.535 2394 + 2396 4 322.16 464.79 33.11 0.535 2395 + 2397 4 323.68 466.92 33.11 0.535 2396 + 2398 4 324.55 469.41 33.11 0.535 2397 + 2399 4 325.42 471.72 33.11 0.535 2398 + 2400 4 324.77 473.14 35.75 0.71 2399 + 2401 4 325.66 475.19 35.75 0.71 2400 + 2402 4 243.87 288.89 -24.82 0.71 2307 + 2403 4 246.04 290.84 -24.82 0.71 2402 + 2404 4 247.56 292.62 -27.58 0.71 2403 + 2405 4 249.52 294.93 -27.58 0.71 2404 + 2406 4 251.91 296.35 -27.14 0.71 2405 + 2407 4 253.21 297.41 -27.14 0.71 2406 + 2408 4 254.73 298.66 -24.03 0.71 2407 + 2409 4 256.25 299.9 -24.03 0.71 2408 + 2410 4 256.9 301.32 -24.03 0.71 2409 + 2411 4 258.21 302.39 -24.03 0.71 2410 + 2412 4 259.29 303.45 -22.58 0.71 2411 + 2413 4 260.59 305.23 -24.06 0.71 2412 + 2414 4 261.68 307.01 -22.05 0.71 2413 + 2415 4 262.98 308.6 -19.55 0.71 2414 + 2416 4 265.15 310.38 -19.55 0.71 2415 + 2417 4 268.02 311.66 -19.55 0.71 2416 + 2418 4 270.61 311.48 -19.55 0.71 2417 + 2419 4 272.34 311.12 -21.46 0.71 2418 + 2420 4 273.43 311.48 -24.34 0.71 2419 + 2421 4 274.73 313.43 -24.9 0.71 2420 + 2422 4 276.47 315.03 -23.42 0.71 2421 + 2423 4 279.07 316.63 -25.15 0.71 2422 + 2424 4 281.9 319.12 -25.15 0.71 2423 + 2425 4 285.59 321.61 -22.04 0.71 2424 + 2426 4 287.55 323.04 -19.46 0.71 2425 + 2427 4 289.5 325.17 -19.46 0.71 2426 + 2428 4 290.37 326.23 -20.76 0.71 2427 + 2429 4 291.89 328.19 -20.76 0.71 2428 + 2430 4 293.19 329.61 -20.76 0.71 2429 + 2431 4 295.15 331.74 -19.03 0.71 2430 + 2432 4 297.1 333.34 -17.14 0.71 2431 + 2433 4 300.58 335.65 -18 0.71 2432 + 2434 4 303.4 336.54 -18 0.71 2433 + 2435 4 304.44 338.06 -15.97 0.71 2434 + 2436 4 306.83 339.12 -14.74 0.71 2435 + 2437 4 309.44 340.19 -14.29 0.71 2436 + 2438 4 310.96 340.72 -13.74 0.71 2437 + 2439 4 313.78 341.97 -12.42 0.71 2438 + 2440 4 316.61 343.03 -12.42 0.71 2439 + 2441 4 318.56 343.56 -9.78 0.71 2440 + 2442 4 321.6 344.1 -9.78 0.71 2441 + 2443 4 323.11 345.44 -9.78 0.71 2442 + 2444 4 326.15 346.15 -9.78 0.71 2443 + 2445 4 328.31 347.03 -5.91 0.71 2444 + 2446 4 331.35 347.57 -5.91 0.71 2445 + 2447 4 333.95 348.81 -5.91 0.71 2446 + 2448 4 336.13 349.88 -5.91 0.71 2447 + 2449 4 338.52 350.23 -6.59 0.71 2448 + 2450 4 340.9 352.01 -3.68 0.71 2449 + 2451 4 342.5 353.26 -3.56 0.71 2450 + 2452 4 345.32 354.86 -3.56 0.71 2451 + 2453 4 347.49 354.86 -4.33 0.71 2452 + 2454 4 350.31 356.63 -2.45 0.71 2453 + 2455 4 351.83 359.12 -2.45 0.71 2454 + 2456 4 353.14 361.43 -2.17 0.71 2455 + 2457 4 353.35 363.38 -2.17 0.71 2456 + 2458 4 353.79 365.16 -1.03 0.71 2457 + 2459 4 354.22 366.94 2.1 0.71 2458 + 2460 4 353.98 368.1 2.1 0.71 2459 + 2461 4 354.19 369.7 2.34 0.71 2460 + 2462 4 355.93 372.01 2.34 0.71 2461 + 2463 4 357.45 374.32 3.12 0.71 2462 + 2464 4 358.75 376.1 5.85 0.71 2463 + 2465 4 360.49 378.23 9.16 0.71 2464 + 2466 4 362.01 380.89 11.15 0.71 2465 + 2467 4 363.1 383.02 11.15 0.71 2466 + 2468 4 365.58 386.39 10.92 0.71 2467 + 2469 4 367.1 388.88 10.92 0.71 2468 + 2470 4 367.97 391.54 10.8 0.71 2469 + 2471 4 369.49 393.14 10.8 0.71 2470 + 2472 4 370.91 395.52 12.87 0.71 2471 diff --git a/demos/Fig5_CellMultiscale/cells/CA1.morph.xml b/demos/Fig5_CellMultiscale/cells/CA1.morph.xml new file mode 100644 index 0000000..dcae7ae --- /dev/null +++ b/demos/Fig5_CellMultiscale/cells/CA1.morph.xml @@ -0,0 +1,12535 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig5_CellMultiscale/cells/DHC-neuron.CNG.swc b/demos/Fig5_CellMultiscale/cells/DHC-neuron.CNG.swc new file mode 100644 index 0000000..6ca8c78 --- /dev/null +++ b/demos/Fig5_CellMultiscale/cells/DHC-neuron.CNG.swc @@ -0,0 +1,6764 @@ +# Original file DHC-neuron.swc edited using StdSwc version 1.31 on 2/28/13. +# Irregularities and fixes documented in DHC-neuron.swc.std. See StdSwc1.31.doc for more information. +# +# Neurolucida to SWC conversion from L-Measure. Sridevi Polavaram: spolavar@gmu.edu +# Original fileName:C:\Users\praveen\Desktop\DataProcessing\CurrentArchives\Processing\Johnston\ASC\DHC-neuron.asc +#The original file has a single soma contour that is averaged into 3 soma points +# NEUROMANTIC V1.6.3 (2/28/2013 12:43:57 PM): Saved to DHC-neuron.swc +1 1 0.0 0.0 0.0 8.5214 -1 +2 1 -0.05 -8.47 -0.87 8.5214 1 +3 1 0.05 8.47 0.87 8.5214 1 +4 3 4.36 -6.98 -4.24 2.275 1 +5 3 5.55 -8.63 -4.38 1.625 4 +6 3 6.29 -9.84 -4.79 1.3 5 +7 3 7.21 -11.46 -3.28 1.085 6 +8 3 7.88 -11.55 -3.27 1.085 7 +9 3 8.14 -12.19 -3.18 0.435 8 +10 3 8.15 -12.41 -3.2 0.435 9 +11 3 8.2 -12.48 -4.57 0.435 10 +12 3 8.45 -12.85 -5.05 0.435 11 +13 3 8.5 -13.21 -5.84 0.435 12 +14 3 8.52 -13.12 -6.74 0.435 13 +15 3 7.83 -13.33 -5.11 0.435 14 +16 3 7.81 -13.11 -5.09 0.435 15 +17 3 8.03 -13.11 -5.01 0.76 16 +18 3 8.07 -13.74 -5.07 0.975 17 +19 3 8.38 -15.02 -5.2 0.975 18 +20 3 8.84 -15.53 -5.24 0.975 19 +21 3 9.53 -16.4 -4.87 0.435 20 +22 3 10.63 -16.55 -4.86 0.435 21 +23 3 11.07 -16.51 -4.99 0.435 22 +24 3 11.52 -16.63 -5.59 0.435 23 +25 3 12.19 -16.76 -5.97 0.435 24 +26 3 12.66 -17.12 -6.45 0.435 25 +27 3 13.12 -17.29 -6.68 0.435 26 +28 3 13.14 -17.22 -7.35 0.435 27 +29 3 13.74 -17.39 -5.39 0.435 28 +30 3 14.63 -17.69 -6.08 0.435 29 +31 3 15.99 -18.22 -6.4 0.435 30 +32 3 17.12 -18.77 -6.73 0.435 31 +33 3 18.71 -19.93 -7.12 0.435 32 +34 3 20.11 -21.34 -7.31 0.435 33 +35 3 22.14 -22.5 -7.38 0.435 34 +36 3 23.28 -23.3 -7.44 0.435 35 +37 3 24.85 -24.28 -7.5 0.435 36 +38 3 25.78 -25.09 -7.57 0.435 37 +39 3 26.27 -25.9 -7.71 0.435 38 +40 3 27.19 -26.95 -7.49 0.435 39 +41 3 28.59 -28.63 -7.33 0.435 40 +42 3 29.96 -29.62 -7.33 0.435 41 +43 3 31.09 -30.41 -7.39 0.435 42 +44 3 33.97 -31.32 -7.41 0.435 43 +45 3 35.74 -31.85 -7.43 0.435 44 +46 3 36.9 -33.07 -7.44 0.435 45 +47 3 38.05 -34.08 -7.52 0.435 46 +48 3 39.23 -35.52 -7.64 0.435 47 +49 3 39.91 -36.13 -7.62 0.435 48 +50 3 40.4 -36.75 -7.67 0.435 49 +51 3 41.32 -37.76 -7.76 0.435 50 +52 3 42.03 -38.57 -7.89 0.435 51 +53 3 43.66 -40.19 -8.02 0.435 52 +54 3 44.56 -41.0 -8.08 0.435 53 +55 3 46.4 -42.39 -8.18 0.435 54 +56 3 47.96 -43.15 -8.23 0.435 55 +57 3 49.11 -44.17 -8.3 0.435 56 +58 3 50.04 -45.18 -8.39 0.435 57 +59 3 50.3 -45.82 -8.45 0.435 58 +60 3 50.6 -47.08 -8.57 0.435 59 +61 3 51.33 -48.33 -8.68 0.435 60 +62 3 51.57 -48.74 -8.72 0.435 61 +63 3 51.64 -49.82 -8.83 0.435 62 +64 3 51.88 -50.23 -8.87 0.435 63 +65 3 52.6 -50.99 -9.46 0.435 64 +66 3 53.31 -51.52 -10.25 0.435 65 +67 3 54.03 -52.51 -10.71 0.435 66 +68 3 54.98 -53.25 -11.45 0.435 67 +69 3 55.45 -53.84 -11.72 0.435 68 +70 3 55.93 -54.45 -11.92 0.435 69 +71 3 56.4 -54.8 -12.4 0.435 70 +72 3 56.85 -55.2 -12.43 0.435 71 +73 3 57.55 -55.81 -12.48 0.435 72 +74 3 58.34 -57.88 -12.9 0.435 73 +75 3 60.6 -58.97 -13.57 0.435 74 +76 3 61.73 -59.75 -13.69 0.435 75 +77 3 62.66 -60.25 -14.7 0.435 76 +78 3 63.34 -60.38 -15.15 0.435 77 +79 3 64.47 -61.16 -15.28 0.435 78 +80 3 64.93 -61.28 -15.96 0.435 79 +81 3 65.87 -62.29 -16.12 0.435 80 +82 3 66.34 -62.63 -16.67 0.435 81 +83 3 68.15 -63.33 -17.3 0.435 82 +84 3 69.71 -63.8 -18.06 0.435 83 +85 3 70.82 -63.89 -18.65 0.435 84 +86 3 71.91 -63.81 -18.7 0.435 85 +87 3 72.57 -64.2 -18.72 0.435 86 +88 3 74.39 -65.36 -19.02 0.435 87 +89 3 75.52 -65.91 -19.2 0.435 88 +90 3 76.46 -66.92 -19.43 0.435 89 +91 3 77.38 -67.42 -20.37 0.435 90 +92 3 78.31 -67.94 -21.16 0.435 91 +93 3 79.92 -69.31 -21.56 0.435 92 +94 3 80.83 -69.62 -22.25 0.435 93 +95 3 81.76 -70.4 -22.45 0.435 94 +96 3 82.22 -70.48 -23.51 0.435 95 +97 3 83.16 -71.24 -24.02 0.435 96 +98 3 84.75 -72.15 -24.76 0.435 97 +99 3 85.43 -72.52 -25.0 0.435 98 +100 3 85.9 -72.64 -25.69 0.435 99 +101 3 86.57 -72.79 -25.91 0.435 100 +102 3 87.47 -73.12 -26.37 0.435 101 +103 3 88.61 -73.89 -26.65 0.435 102 +104 3 89.93 -74.21 -26.95 0.435 103 +105 3 93.09 -75.67 -27.63 0.435 104 +106 3 94.85 -75.94 -28.15 0.435 105 +107 3 96.18 -76.28 -28.22 0.435 106 +108 3 97.7 -76.16 -28.41 0.435 107 +109 3 100.33 -76.4 -28.67 0.435 108 +110 3 101.47 -77.19 -28.8 0.435 109 +111 3 103.49 -78.36 -28.87 0.435 110 +112 3 104.84 -78.87 -29.42 0.435 111 +113 3 106.17 -79.21 -29.5 0.435 112 +114 3 107.69 -79.12 -29.45 0.435 113 +115 3 109.24 -79.64 -29.77 0.435 114 +116 3 111.67 -80.12 -29.84 0.435 115 +117 3 112.82 -81.12 -29.99 0.435 116 +118 3 114.22 -82.51 -30.48 0.435 117 +119 3 114.92 -83.33 -30.55 0.435 118 +120 3 115.64 -84.35 -30.71 0.435 119 +121 3 116.36 -85.37 -30.8 0.435 120 +122 3 116.85 -86.2 -30.95 0.435 121 +123 3 117.37 -87.46 -31.07 0.435 122 +124 3 118.05 -88.06 -31.12 0.435 123 +125 3 118.54 -88.87 -31.41 0.435 124 +126 3 119.26 -89.66 -31.78 0.435 125 +127 3 119.51 -90.03 -32.26 0.435 126 +128 3 120.21 -90.61 -32.61 0.435 127 +129 3 120.45 -91.23 -32.66 0.435 128 +130 3 120.92 -91.62 -32.76 0.435 129 +131 3 121.41 -92.46 -32.84 0.435 130 +132 3 121.66 -92.85 -33.03 0.435 131 +133 3 122.36 -93.45 -33.22 0.435 132 +134 3 123.27 -94.21 -33.58 0.435 133 +135 3 123.52 -94.63 -33.7 0.435 134 +136 3 124.69 -95.56 -34.44 0.435 135 +137 3 125.16 -95.96 -34.47 0.435 136 +138 3 125.6 -96.36 -34.58 0.435 137 +139 3 126.29 -96.74 -34.76 0.435 138 +140 3 126.74 -96.91 -34.83 0.435 139 +141 3 127.21 -97.3 -35.01 0.435 140 +142 3 127.66 -97.66 -35.42 0.435 141 +143 3 128.13 -98.03 -35.82 0.435 142 +144 3 128.6 -98.41 -36.0 0.435 143 +145 3 128.84 -98.55 -36.61 0.435 144 +146 3 129.53 -99.14 -36.74 0.435 145 +147 3 130.42 -99.29 -36.95 0.435 146 +148 3 130.45 -99.43 -37.57 0.435 147 +149 3 7.37 -16.37 -5.36 0.54 20 +150 3 7.01 -17.48 -5.48 0.54 149 +151 3 6.43 -18.58 -5.61 0.54 150 +152 3 5.65 -19.92 -5.77 0.54 151 +153 3 4.59 -20.41 -5.84 0.54 152 +154 3 4.39 -20.67 -5.65 0.65 153 +155 3 3.35 -21.35 -5.9 0.65 154 +156 3 2.97 -21.68 -7.22 0.65 155 +157 3 3.24 -21.69 -9.02 0.435 156 +158 3 3.3 -22.56 -9.11 0.435 157 +159 3 3.35 -23.42 -9.13 0.435 158 +160 3 2.55 -24.33 -9.24 0.435 159 +161 3 1.72 -25.03 -9.34 0.435 160 +162 3 0.89 -25.5 -9.4 0.435 161 +163 3 1.32 -25.86 -8.79 0.435 162 +164 3 1.76 -26.22 -8.17 0.435 163 +165 3 2.7 -27.25 -8.25 0.435 164 +166 3 3.62 -28.27 -8.34 0.435 165 +167 3 4.79 -29.48 -8.44 0.435 166 +168 3 5.98 -31.13 -8.58 0.435 167 +169 3 6.73 -32.59 -8.71 0.435 168 +170 3 7.49 -34.48 -8.89 0.435 169 +171 3 8.25 -36.16 -9.05 0.435 170 +172 3 8.84 -38.48 -9.27 0.435 171 +173 3 9.36 -39.74 -9.39 0.435 172 +174 3 9.88 -41.22 -9.53 0.435 173 +175 3 10.22 -43.14 -9.72 0.435 174 +176 3 10.15 -45.29 -9.95 0.435 175 +177 3 10.26 -47.0 -10.12 0.435 176 +178 3 10.79 -48.69 -10.28 0.435 177 +179 3 10.9 -50.39 -10.46 0.435 178 +180 3 11.63 -51.65 -10.57 0.435 179 +181 3 12.82 -53.08 -10.69 0.435 180 +182 3 13.38 -54.92 -11.4 0.435 181 +183 3 13.71 -56.38 -11.84 0.435 182 +184 3 14.0 -57.37 -12.69 0.435 183 +185 3 14.11 -58.82 -13.21 0.435 184 +186 3 14.45 -60.73 -13.48 0.435 185 +187 3 14.96 -62.0 -13.6 0.435 186 +188 3 15.07 -63.71 -13.78 0.435 187 +189 3 15.17 -65.21 -13.93 0.435 188 +190 3 15.86 -66.02 -14.0 0.435 189 +191 3 16.38 -67.28 -14.11 0.435 190 +192 3 17.11 -68.31 -14.2 0.435 191 +193 3 17.59 -69.15 -14.28 0.435 192 +194 3 17.6 -69.32 -14.3 0.435 193 +195 3 17.43 -69.37 -15.89 0.435 194 +196 3 17.24 -69.83 -15.94 0.435 195 +197 3 16.82 -70.07 -15.9 0.435 196 +198 3 16.39 -70.1 -15.91 0.435 197 +199 3 16.23 -70.96 -16.01 0.435 198 +200 3 16.26 -71.39 -16.12 0.435 199 +201 3 16.31 -72.24 -16.28 0.435 200 +202 3 16.41 -73.74 -16.43 0.435 201 +203 3 16.7 -74.8 -16.54 0.435 202 +204 3 16.97 -75.64 -16.62 0.435 203 +205 3 17.24 -76.49 -16.7 0.435 204 +206 3 17.26 -76.91 -16.82 0.435 205 +207 3 17.31 -77.54 -16.95 0.435 206 +208 3 17.34 -77.97 -17.08 0.435 207 +209 3 17.38 -78.6 -17.14 0.435 208 +210 3 17.43 -79.23 -17.28 0.435 209 +211 3 17.06 -80.33 -17.4 0.435 210 +212 3 16.68 -81.22 -17.5 0.435 211 +213 3 16.28 -81.67 -17.56 0.435 212 +214 3 16.34 -82.75 -17.67 0.435 213 +215 3 16.39 -83.39 -17.73 0.435 214 +216 3 16.45 -84.46 -17.84 0.435 215 +217 3 16.51 -85.31 -17.93 0.435 216 +218 3 16.8 -86.37 -18.03 0.435 217 +219 3 16.84 -87.02 -18.1 0.435 218 +220 3 16.88 -87.66 -18.16 0.435 219 +221 3 16.7 -88.31 -18.23 0.435 220 +222 3 16.98 -88.89 -18.82 0.435 221 +223 3 17.2 -88.88 -18.73 0.435 222 +224 3 17.23 -89.3 -18.93 0.435 223 +225 3 17.69 -89.67 -19.26 0.435 224 +226 3 17.94 -90.08 -19.37 0.435 225 +227 3 17.98 -90.47 -19.79 0.435 226 +228 3 18.43 -90.61 -20.24 0.435 227 +229 3 18.93 -91.37 -21.06 0.435 228 +230 3 19.19 -91.95 -21.5 0.435 229 +231 3 19.45 -92.34 -21.9 0.435 230 +232 3 20.13 -92.44 -22.5 0.435 231 +233 3 20.38 -92.81 -22.99 0.435 232 +234 3 20.64 -93.13 -23.92 0.435 233 +235 3 21.11 -93.49 -24.47 0.435 234 +236 3 21.36 -93.9 -24.51 0.435 235 +237 3 21.61 -94.26 -24.99 0.435 236 +238 3 22.1 -94.85 -25.34 0.435 237 +239 3 22.13 -95.48 -25.49 0.435 238 +240 3 22.6 -95.86 -25.89 0.435 239 +241 3 23.1 -96.41 -26.46 0.435 240 +242 3 23.35 -97.04 -26.59 0.435 241 +243 3 23.61 -97.62 -27.1 0.435 242 +244 3 23.88 -98.25 -27.24 0.435 243 +245 3 24.13 -98.85 -27.45 0.435 244 +246 3 24.18 -99.49 -27.58 0.435 245 +247 3 24.67 -100.04 -28.31 0.435 246 +248 3 24.92 -100.4 -28.86 0.435 247 +249 3 25.22 -101.44 -29.12 0.435 248 +250 3 25.51 -102.23 -29.79 0.435 249 +251 3 25.97 -102.62 -29.9 0.435 250 +252 3 26.21 -102.75 -30.59 0.435 251 +253 3 26.71 -103.54 -31.11 0.435 252 +254 3 27.2 -104.3 -31.78 0.435 253 +255 3 27.46 -104.93 -31.84 0.435 254 +256 3 27.73 -105.52 -32.26 0.435 255 +257 3 28.61 -105.68 -32.34 0.435 256 +258 3 29.09 -106.03 -32.89 0.435 257 +259 3 29.78 -106.59 -33.23 0.435 258 +260 3 30.24 -106.74 -33.69 0.435 259 +261 3 31.18 -107.46 -34.58 0.435 260 +262 3 31.42 -107.59 -35.26 0.435 261 +263 3 32.77 -108.1 -35.81 0.435 262 +264 3 33.22 -108.29 -35.82 0.435 263 +265 3 33.91 -108.34 -36.94 0.435 264 +266 3 34.15 -108.47 -37.7 0.435 265 +267 3 34.38 -108.39 -38.29 0.435 266 +268 3 35.06 -108.76 -38.61 0.435 267 +269 3 35.74 -109.15 -38.63 0.435 268 +270 3 37.1 -109.63 -39.41 0.435 269 +271 3 37.99 -109.77 -39.62 0.435 270 +272 3 38.45 -110.11 -40.25 0.435 271 +273 3 38.9 -110.3 -40.34 0.435 272 +274 3 39.15 -110.7 -40.37 0.435 273 +275 3 39.4 -111.33 -40.43 0.435 274 +276 3 39.46 -112.19 -40.52 0.435 275 +277 3 39.54 -112.71 -41.85 0.435 276 +278 3 39.78 -113.09 -42.11 0.435 277 +279 3 39.83 -113.4 -43.27 0.435 278 +280 3 39.85 -113.57 -43.81 0.435 279 +281 3 39.04 -114.25 -43.98 0.435 280 +282 3 38.86 -114.41 -44.76 0.435 281 +283 3 38.45 -114.58 -45.54 0.435 282 +284 3 38.5 -114.9 -46.55 0.435 283 +285 3 38.53 -114.78 -47.67 0.435 284 +286 3 38.12 -115.21 -47.94 0.435 285 +287 3 37.73 -115.62 -48.45 0.435 286 +288 3 37.76 -116.04 -48.56 0.435 287 +289 3 38.01 -116.2 -49.11 0.435 288 +290 3 38.03 -116.35 -49.64 0.435 289 +291 3 37.63 -116.75 -50.15 0.435 290 +292 3 38.12 -117.35 -50.43 0.435 291 +293 3 38.15 -117.77 -50.54 0.435 292 +294 3 38.62 -118.36 -50.89 0.435 293 +295 3 40.77 -117.78 -50.93 0.435 294 +296 3 41.66 -118.16 -50.95 0.435 295 +297 3 42.34 -118.76 -51.0 0.435 296 +298 3 43.03 -119.38 -51.05 0.435 297 +299 3 43.52 -120.2 -51.12 0.435 298 +300 3 44.0 -120.82 -51.17 0.435 299 +301 3 44.47 -121.43 -51.22 0.435 300 +302 3 44.91 -121.4 -51.21 0.435 301 +303 3 46.2 -121.32 -51.17 0.435 302 +304 3 46.85 -121.28 -51.15 0.435 303 +305 3 47.28 -121.25 -51.14 0.435 304 +306 3 48.32 -120.55 -51.04 0.435 305 +307 3 49.37 -120.05 -50.96 0.435 306 +308 3 50.2 -119.37 -50.87 0.435 307 +309 3 50.85 -119.28 -51.23 0.435 308 +310 3 51.28 -119.25 -51.29 0.435 309 +311 3 52.18 -119.37 -51.66 0.435 310 +312 3 53.04 -119.32 -51.64 0.435 311 +313 3 53.92 -119.48 -51.7 0.435 312 +314 3 55.44 -119.59 -51.68 0.435 313 +315 3 56.53 -119.75 -51.67 0.435 314 +316 3 56.98 -119.93 -51.68 0.435 315 +317 3 57.67 -120.29 -52.0 0.435 316 +318 3 58.36 -120.61 -52.62 0.435 317 +319 3 59.04 -121.22 -52.67 0.435 318 +320 3 59.75 -121.78 -53.09 0.435 319 +321 3 60.44 -122.38 -53.14 0.435 320 +322 3 60.89 -122.78 -53.24 0.435 321 +323 3 61.14 -123.19 -53.27 0.435 322 +324 3 61.63 -124.03 -53.35 0.435 323 +325 3 61.88 -124.44 -53.47 0.435 324 +326 3 62.12 -124.84 -53.57 0.435 325 +327 3 62.37 -125.23 -53.83 0.435 326 +328 3 62.83 -125.62 -53.94 0.435 327 +329 3 63.49 -125.8 -54.01 0.435 328 +330 3 63.95 -126.19 -54.04 0.435 329 +331 3 64.4 -126.12 -54.48 0.435 330 +332 3 64.83 -126.07 -54.69 0.435 331 +333 3 65.28 -126.01 -54.98 0.435 332 +334 3 16.54 -88.97 -18.31 0.435 221 +335 3 16.16 -90.07 -18.43 0.435 334 +336 3 16.21 -90.92 -18.52 0.435 335 +337 3 15.45 -92.27 -18.67 0.435 336 +338 3 15.98 -93.94 -18.83 0.435 337 +339 3 16.27 -95.01 -18.94 0.435 338 +340 3 16.3 -95.45 -18.98 0.435 339 +341 3 16.59 -96.44 -19.61 0.435 340 +342 3 15.61 -97.73 -20.37 0.435 341 +343 3 15.72 -97.83 -20.38 0.435 342 +344 3 16.49 -97.63 -20.86 0.325 343 +345 3 16.73 -98.26 -20.85 0.325 344 +346 3 16.76 -98.43 -21.24 0.325 345 +347 3 16.78 -98.35 -22.07 0.325 346 +348 3 17.03 -98.46 -23.05 0.325 347 +349 3 17.29 -98.53 -24.26 0.325 348 +350 3 17.34 -99.17 -24.4 0.325 349 +351 3 17.38 -99.52 -25.11 0.325 350 +352 3 17.44 -100.09 -25.92 0.325 351 +353 3 17.73 -100.78 -27.49 0.325 352 +354 3 17.99 -101.13 -28.05 0.325 353 +355 3 18.03 -101.53 -28.47 0.325 354 +356 3 18.27 -101.19 -29.56 0.325 355 +357 3 18.31 -101.57 -30.05 0.325 356 +358 3 18.35 -102.17 -30.56 0.325 357 +359 3 17.62 -103.88 -31.36 0.325 358 +360 3 17.67 -104.72 -31.51 0.325 359 +361 3 17.74 -105.78 -31.85 0.325 360 +362 3 17.82 -106.54 -32.84 0.325 361 +363 3 18.1 -107.1 -33.56 0.325 362 +364 3 18.15 -107.68 -34.22 0.325 363 +365 3 18.63 -108.29 -34.35 0.325 364 +366 3 18.88 -108.69 -34.54 0.325 365 +367 3 19.12 -109.31 -34.6 0.325 366 +368 3 19.38 -109.94 -34.73 0.325 367 +369 3 19.63 -110.33 -34.99 0.325 368 +370 3 19.72 -111.62 -35.13 0.325 369 +371 3 19.8 -112.89 -35.33 0.325 370 +372 3 19.87 -113.96 -35.44 0.325 371 +373 3 20.12 -114.59 -35.49 0.325 372 +374 3 20.17 -115.45 -35.58 0.325 373 +375 3 20.42 -115.87 -35.62 0.325 374 +376 3 20.49 -116.93 -35.73 0.325 375 +377 3 20.53 -117.58 -35.79 0.325 376 +378 3 20.78 -117.99 -35.91 0.325 377 +379 3 20.81 -118.39 -36.1 0.325 378 +380 3 20.86 -119.02 -36.39 0.325 379 +381 3 20.04 -119.7 -36.63 0.325 380 +382 3 20.13 -120.95 -37.06 0.325 381 +383 3 20.28 -123.02 -37.95 0.325 382 +384 3 20.76 -123.6 -38.44 0.325 383 +385 3 20.82 -124.41 -38.98 0.325 384 +386 3 21.32 -125.22 -39.28 0.325 385 +387 3 21.48 -127.57 -39.59 0.325 386 +388 3 21.13 -129.1 -39.76 0.325 387 +389 3 21.41 -129.93 -39.92 0.325 388 +390 3 21.92 -130.95 -40.23 0.325 389 +391 3 21.98 -131.76 -40.77 0.325 390 +392 3 22.02 -132.37 -41.06 0.325 391 +393 3 22.08 -132.99 -41.43 0.325 392 +394 3 22.11 -133.63 -41.49 0.325 393 +395 3 22.17 -134.24 -41.85 0.325 394 +396 3 22.21 -134.86 -42.22 0.325 395 +397 3 22.28 -135.66 -42.82 0.325 396 +398 3 22.34 -136.47 -43.36 0.325 397 +399 3 22.4 -137.32 -43.52 0.325 398 +400 3 22.04 -138.12 -44.37 0.325 399 +401 3 22.17 -140.04 -44.64 0.325 400 +402 3 22.25 -141.04 -45.41 0.325 401 +403 3 22.3 -141.68 -45.56 0.325 402 +404 3 22.36 -142.74 -45.82 0.325 403 +405 3 22.03 -144.05 -46.03 0.325 404 +406 3 22.08 -144.9 -46.12 0.325 405 +407 3 22.34 -145.24 -46.9 0.325 406 +408 3 22.38 -145.62 -47.47 0.325 407 +409 3 22.41 -146.25 -47.61 0.325 408 +410 3 22.66 -146.67 -47.64 0.325 409 +411 3 22.72 -147.51 -47.88 0.325 410 +412 3 22.75 -147.92 -48.07 0.325 411 +413 3 23.02 -148.53 -48.28 0.325 412 +414 3 23.09 -149.33 -48.96 0.325 413 +415 3 22.74 -150.6 -49.49 0.325 414 +416 3 23.5 -152.26 -49.79 0.325 415 +417 3 23.56 -153.09 -50.1 0.325 416 +418 3 24.1 -154.54 -50.54 0.325 417 +419 3 24.82 -155.53 -51.0 0.325 418 +420 3 25.76 -156.24 -51.96 0.325 419 +421 3 26.72 -156.9 -53.43 0.325 420 +422 3 27.19 -157.23 -54.13 0.325 421 +423 3 27.66 -157.62 -54.31 0.325 422 +424 3 27.91 -157.68 -55.67 0.325 423 +425 3 28.4 -158.01 -56.52 0.325 424 +426 3 29.27 -157.89 -57.1 0.325 425 +427 3 29.94 -157.77 -57.82 0.325 426 +428 3 30.87 -158.02 -59.02 0.325 427 +429 3 31.76 -158.35 -59.49 0.325 428 +430 3 15.84 -97.92 -20.39 0.435 343 +431 3 15.47 -99.02 -20.58 0.435 430 +432 3 15.74 -99.62 -21.02 0.435 431 +433 3 15.79 -100.21 -21.53 0.435 432 +434 3 15.87 -101.24 -22.09 0.435 433 +435 3 15.93 -102.07 -22.39 0.435 434 +436 3 16.17 -102.48 -22.43 0.435 435 +437 3 16.23 -103.34 -22.6 0.435 436 +438 3 16.26 -103.77 -22.64 0.435 437 +439 3 16.74 -104.59 -22.78 0.435 438 +440 3 16.41 -106.11 -22.95 0.435 439 +441 3 15.87 -107.87 -23.14 0.435 440 +442 3 15.91 -108.27 -23.42 0.435 441 +443 3 15.97 -108.84 -24.15 0.435 442 +444 3 16.04 -109.64 -24.83 0.435 443 +445 3 16.08 -110.01 -25.4 0.435 444 +446 3 16.13 -110.6 -26.06 0.435 445 +447 3 16.2 -111.39 -26.74 0.435 446 +448 3 16.25 -112.22 -26.97 0.435 447 +449 3 16.75 -112.77 -27.7 0.435 448 +450 3 16.79 -113.14 -28.34 0.435 449 +451 3 16.81 -113.58 -28.39 0.435 450 +452 3 17.31 -114.61 -28.55 0.435 451 +453 3 17.34 -115.04 -28.68 0.435 452 +454 3 17.41 -115.8 -29.58 0.435 453 +455 3 18.15 -117.04 -29.84 0.435 454 +456 3 18.2 -117.61 -30.5 0.435 455 +457 3 18.48 -118.41 -31.03 0.435 456 +458 3 19.64 -119.41 -31.19 0.435 457 +459 3 19.69 -120.27 -31.28 0.435 458 +460 3 19.75 -120.6 -32.35 0.435 459 +461 3 19.38 -121.68 -32.55 0.435 460 +462 3 19.42 -122.06 -33.05 0.435 461 +463 3 19.05 -122.91 -33.44 0.435 462 +464 3 19.13 -123.95 -33.85 0.435 463 +465 3 19.2 -124.75 -34.54 0.435 464 +466 3 19.48 -125.77 -35.01 0.435 465 +467 3 19.55 -126.6 -35.39 0.435 466 +468 3 19.84 -127.64 -35.57 0.435 467 +469 3 20.17 -129.33 -35.89 0.435 468 +470 3 20.44 -130.14 -36.19 0.435 469 +471 3 20.49 -130.75 -36.71 0.435 470 +472 3 20.99 -131.58 -36.86 0.435 471 +473 3 21.01 -131.78 -36.95 0.435 472 +474 3 21.06 -132.62 -37.04 0.435 473 +475 3 21.11 -132.95 -38.13 0.435 474 +476 3 21.17 -133.49 -39.16 0.435 475 +477 3 21.21 -133.86 -39.8 0.435 476 +478 3 21.51 -134.33 -41.43 0.435 477 +479 3 21.57 -135.14 -42.03 0.435 478 +480 3 21.63 -135.7 -42.84 0.435 479 +481 3 21.68 -136.33 -43.06 0.435 480 +482 3 21.72 -136.69 -43.78 0.435 481 +483 3 21.13 -137.56 -44.03 0.435 482 +484 3 21.39 -138.2 -44.09 0.435 483 +485 3 21.48 -139.48 -44.22 0.435 484 +486 3 21.51 -139.89 -44.49 0.435 485 +487 3 21.55 -140.24 -45.27 0.435 486 +488 3 21.23 -141.71 -46.04 0.435 487 +489 3 20.47 -143.47 -46.24 0.435 488 +490 3 19.27 -145.04 -46.5 0.435 489 +491 3 18.52 -146.8 -46.78 0.435 490 +492 3 16.95 -149.26 -47.07 0.435 491 +493 3 16.61 -150.79 -47.24 0.435 492 +494 3 15.85 -152.55 -47.44 0.435 493 +495 3 15.49 -153.65 -47.56 0.435 494 +496 3 15.13 -154.97 -47.71 0.435 495 +497 3 15.21 -156.25 -47.84 0.435 496 +498 3 14.41 -157.16 -47.95 0.435 497 +499 3 13.66 -158.92 -48.15 0.435 498 +500 3 11.6 -160.56 -48.37 0.435 499 +501 3 9.96 -162.16 -48.57 0.435 500 +502 3 8.77 -163.96 -48.79 0.435 501 +503 3 8.22 -165.49 -48.96 0.435 502 +504 3 7.1 -168.37 -49.28 0.435 503 +505 3 5.65 -172.47 -50.49 0.435 504 +506 3 4.45 -173.98 -51.2 0.435 505 +507 3 2.96 -177.21 -52.48 0.435 506 +508 3 1.37 -179.44 -52.9 0.435 507 +509 3 0.17 -180.72 -53.96 0.435 508 +510 3 -1.46 -182.09 -54.29 0.435 509 +511 3 -2.47 -183.23 -54.43 0.435 510 +512 3 -3.95 -183.96 -54.55 0.435 511 +513 3 -5.18 -184.89 -54.75 0.435 512 +514 3 -6.45 -185.39 -54.83 0.435 513 +515 3 17.85 -69.54 -14.54 0.435 194 +516 3 18.1 -70.12 -15.04 0.435 515 +517 3 18.36 -70.75 -15.1 0.435 516 +518 3 17.99 -71.63 -15.28 0.435 517 +519 3 17.21 -72.96 -15.44 0.435 518 +520 3 17.26 -73.81 -15.52 0.435 519 +521 3 17.3 -74.46 -15.59 0.435 520 +522 3 17.75 -74.86 -15.62 0.435 521 +523 3 18.21 -75.06 -15.63 0.435 522 +524 3 18.65 -75.24 -15.64 0.435 523 +525 3 19.33 -75.63 -15.66 0.435 524 +526 3 19.83 -76.65 -15.98 0.435 525 +527 3 20.35 -77.91 -16.18 0.435 526 +528 3 20.86 -78.94 -16.34 0.435 527 +529 3 20.94 -80.22 -16.47 0.435 528 +530 3 21.02 -81.52 -16.6 0.435 529 +531 3 21.28 -82.15 -16.66 0.435 530 +532 3 21.59 -83.63 -16.81 0.435 531 +533 3 22.11 -84.89 -16.93 0.435 532 +534 3 23.54 -86.95 -17.11 0.435 533 +535 3 24.47 -87.97 -17.19 0.435 534 +536 3 25.18 -89.0 -17.28 0.435 535 +537 3 25.29 -90.5 -17.51 0.435 536 +538 3 25.4 -92.2 -17.69 0.435 537 +539 3 25.45 -93.07 -17.78 0.435 538 +540 3 25.79 -94.98 -17.97 0.435 539 +541 3 25.9 -96.69 -18.14 0.435 540 +542 3 26.39 -97.73 -18.24 0.435 541 +543 3 27.1 -97.72 -19.72 0.435 542 +544 3 27.98 -98.1 -19.73 0.435 543 +545 3 28.66 -98.48 -19.76 0.435 544 +546 3 29.13 -99.12 -19.66 0.435 545 +547 3 29.41 -99.95 -19.74 0.435 546 +548 3 29.9 -101.0 -19.84 0.435 547 +549 3 30.37 -101.4 -19.87 0.435 548 +550 3 30.64 -102.46 -19.97 0.435 549 +551 3 30.91 -103.07 -20.26 0.435 550 +552 3 31.41 -104.1 -20.51 0.435 551 +553 3 31.72 -105.34 -20.85 0.435 552 +554 3 32.0 -106.18 -21.08 0.435 553 +555 3 32.29 -107.2 -21.48 0.435 554 +556 3 32.31 -107.63 -21.52 0.435 555 +557 3 33.25 -108.64 -21.61 0.435 556 +558 3 33.71 -109.26 -21.66 0.435 557 +559 3 34.2 -109.59 -22.44 0.435 558 +560 3 35.38 -111.01 -22.64 0.435 559 +561 3 35.44 -112.09 -22.75 0.435 560 +562 3 35.47 -112.51 -22.86 0.435 561 +563 3 35.97 -113.55 -22.95 0.435 562 +564 3 36.06 -114.84 -23.09 0.435 563 +565 3 36.54 -115.67 -23.16 0.435 564 +566 3 37.22 -116.05 -23.18 0.435 565 +567 3 37.92 -116.67 -23.23 0.435 566 +568 3 39.1 -118.32 -23.37 0.435 567 +569 3 39.39 -119.36 -23.48 0.435 568 +570 3 39.91 -120.84 -23.62 0.435 569 +571 3 39.96 -121.48 -23.68 0.435 570 +572 3 40.69 -122.7 -24.02 0.435 571 +573 3 40.79 -124.2 -24.24 0.435 572 +574 3 41.3 -125.45 -24.44 0.435 573 +575 3 41.8 -126.29 -24.52 0.435 574 +576 3 42.09 -127.54 -24.79 0.435 575 +577 3 42.35 -128.17 -24.85 0.435 576 +578 3 42.42 -129.24 -25.03 0.435 577 +579 3 42.45 -129.66 -25.07 0.435 578 +580 3 43.15 -130.48 -25.14 0.435 579 +581 3 43.61 -130.88 -25.17 0.435 580 +582 3 43.87 -131.51 -25.23 0.435 581 +583 3 44.12 -131.92 -25.27 0.435 582 +584 3 44.85 -133.18 -25.38 0.435 583 +585 3 45.31 -133.78 -25.43 0.435 584 +586 3 45.82 -134.83 -25.53 0.435 585 +587 3 45.84 -135.26 -25.57 0.435 586 +588 3 46.1 -135.88 -25.63 0.435 587 +589 3 46.35 -136.3 -25.67 0.435 588 +590 3 46.64 -137.58 -25.79 0.435 589 +591 3 46.91 -138.42 -25.87 0.435 590 +592 3 47.02 -139.91 -26.1 0.435 591 +593 3 47.7 -140.51 -26.15 0.435 592 +594 3 48.42 -141.54 -26.24 0.435 593 +595 3 48.9 -142.37 -26.32 0.435 594 +596 3 49.19 -143.43 -26.42 0.435 595 +597 3 49.45 -144.07 -26.48 0.435 596 +598 3 49.71 -144.7 -26.54 0.435 597 +599 3 49.74 -145.33 -26.6 0.435 598 +600 3 50.02 -146.18 -26.68 0.435 599 +601 3 50.28 -146.81 -26.74 0.435 600 +602 3 50.55 -147.66 -26.82 0.435 601 +603 3 50.85 -148.93 -26.95 0.435 602 +604 3 50.89 -149.57 -27.01 0.435 603 +605 3 50.94 -150.43 -27.1 0.435 604 +606 3 51.22 -151.28 -27.18 0.435 605 +607 3 51.96 -152.73 -27.31 0.435 606 +608 3 52.44 -153.56 -27.39 0.435 607 +609 3 52.7 -154.19 -27.45 0.435 608 +610 3 52.96 -154.53 -28.3 0.435 609 +611 3 53.44 -155.08 -28.95 0.435 610 +612 3 53.93 -155.42 -29.58 0.435 611 +613 3 54.39 -155.8 -29.83 0.435 612 +614 3 54.64 -156.21 -29.86 0.435 613 +615 3 55.73 -156.35 -30.0 0.435 614 +616 3 56.48 -157.81 -30.14 0.435 615 +617 3 57.44 -159.26 -30.26 0.435 616 +618 3 57.91 -159.86 -30.31 0.435 617 +619 3 58.41 -160.6 -31.36 0.435 618 +620 3 59.36 -161.6 -31.67 0.435 619 +621 3 59.84 -162.17 -32.1 0.435 620 +622 3 60.09 -162.79 -32.23 0.435 621 +623 3 60.84 -163.75 -33.06 0.435 622 +624 3 61.29 -164.14 -33.17 0.435 623 +625 3 61.54 -164.55 -33.21 0.435 624 +626 3 61.77 -164.49 -33.72 0.435 625 +627 3 62.25 -165.08 -34.07 0.435 626 +628 3 62.49 -165.21 -34.76 0.435 627 +629 3 62.98 -165.78 -35.18 0.435 628 +630 3 63.0 -165.68 -36.15 0.435 629 +631 3 63.47 -166.04 -36.71 0.435 630 +632 3 64.15 -166.41 -36.88 0.435 631 +633 3 64.82 -166.8 -36.9 0.435 632 +634 3 65.28 -166.98 -36.98 0.435 633 +635 3 65.96 -167.37 -37.01 0.435 634 +636 3 66.39 -167.55 -37.01 0.435 635 +637 3 27.14 -99.2 -18.37 0.435 542 +638 3 27.21 -100.26 -18.55 0.435 637 +639 3 28.24 -101.99 -20.21 0.435 638 +640 3 27.9 -103.51 -20.38 0.435 639 +641 3 27.98 -104.79 -20.51 0.435 640 +642 3 28.07 -106.08 -20.71 0.435 641 +643 3 27.29 -107.42 -20.87 0.435 642 +644 3 26.91 -108.29 -20.97 0.435 643 +645 3 26.94 -108.73 -21.01 0.435 644 +646 3 27.19 -109.35 -21.07 0.435 645 +647 3 27.49 -110.36 -21.62 0.435 646 +648 3 27.75 -110.71 -22.25 0.435 647 +649 3 28.02 -111.56 -22.33 0.435 648 +650 3 28.3 -112.62 -22.52 0.435 649 +651 3 28.04 -115.2 -22.79 0.435 650 +652 3 28.11 -116.0 -23.55 0.435 651 +653 3 28.21 -117.48 -23.78 0.435 652 +654 3 28.51 -118.98 -23.92 0.435 653 +655 3 28.81 -120.25 -24.05 0.435 654 +656 3 28.91 -121.69 -24.27 0.435 655 +657 3 28.98 -122.77 -24.38 0.435 656 +658 3 29.26 -123.57 -24.75 0.435 657 +659 3 29.33 -124.38 -25.37 0.435 658 +660 3 28.99 -125.9 -25.68 0.435 659 +661 3 29.28 -126.92 -26.16 0.435 660 +662 3 28.94 -127.97 -26.65 0.435 661 +663 3 28.56 -129.07 -26.78 0.435 662 +664 3 27.79 -130.41 -26.93 0.435 663 +665 3 27.44 -131.93 -27.17 0.435 664 +666 3 27.53 -133.2 -27.38 0.435 665 +667 3 27.18 -134.51 -27.52 0.435 666 +668 3 27.25 -135.59 -27.63 0.435 667 +669 3 27.01 -138.39 -27.93 0.435 668 +670 3 27.07 -139.45 -28.19 0.435 669 +671 3 27.18 -140.92 -28.71 0.435 670 +672 3 27.26 -142.21 -28.84 0.435 671 +673 3 26.88 -143.08 -28.94 0.435 672 +674 3 26.51 -144.17 -29.13 0.435 673 +675 3 26.59 -145.25 -29.24 0.435 674 +676 3 26.21 -146.13 -29.34 0.435 675 +677 3 26.47 -146.72 -29.78 0.435 676 +678 3 26.72 -147.12 -29.97 0.435 677 +679 3 26.98 -147.75 -30.03 0.435 678 +680 3 27.23 -148.38 -30.08 0.435 679 +681 3 27.73 -149.21 -30.23 0.435 680 +682 3 28.21 -150.04 -30.3 0.435 681 +683 3 28.51 -151.08 -30.55 0.435 682 +684 3 28.14 -152.15 -30.91 0.435 683 +685 3 28.21 -152.93 -31.66 0.435 684 +686 3 28.97 -154.57 -32.19 0.435 685 +687 3 29.28 -155.61 -32.59 0.435 686 +688 3 29.34 -156.41 -33.13 0.435 687 +689 3 29.42 -157.69 -33.33 0.435 688 +690 3 29.71 -158.74 -33.51 0.435 689 +691 3 29.77 -159.3 -34.32 0.435 690 +692 3 29.84 -160.11 -34.93 0.435 691 +693 3 29.45 -160.72 -35.53 0.435 692 +694 3 29.52 -161.79 -35.71 0.435 693 +695 3 29.58 -162.64 -35.88 0.435 694 +696 3 29.84 -163.27 -35.94 0.435 695 +697 3 29.49 -164.57 -36.15 0.435 696 +698 3 29.52 -165.0 -36.19 0.435 697 +699 3 29.19 -166.49 -36.74 0.435 698 +700 3 29.29 -167.98 -36.96 0.435 699 +701 3 29.34 -168.57 -37.54 0.435 700 +702 3 29.39 -169.41 -37.71 0.435 701 +703 3 29.47 -170.49 -37.82 0.435 702 +704 3 29.13 -171.75 -38.41 0.435 703 +705 3 29.2 -172.79 -38.74 0.435 704 +706 3 29.93 -174.05 -38.85 0.435 705 +707 3 30.43 -174.58 -39.73 0.435 706 +708 3 30.94 -175.59 -40.12 0.435 707 +709 3 31.18 -176.0 -40.23 0.435 708 +710 3 31.7 -176.7 -41.58 0.435 709 +711 3 31.75 -177.3 -42.09 0.435 710 +712 3 31.99 -177.7 -42.2 0.435 711 +713 3 32.23 -178.12 -42.23 0.435 712 +714 3 32.71 -178.72 -42.52 0.435 713 +715 3 32.76 -179.33 -42.8 0.435 714 +716 3 33.22 -179.51 -42.89 0.435 715 +717 3 33.52 -180.76 -43.31 0.435 716 +718 3 33.99 -181.08 -44.01 0.435 717 +719 3 34.43 -180.99 -44.66 0.435 718 +720 3 35.13 -181.58 -44.86 0.435 719 +721 3 35.6 -181.97 -45.04 0.435 720 +722 3 36.07 -182.57 -45.09 0.435 721 +723 3 37.41 -183.12 -45.34 0.435 722 +724 3 38.31 -183.22 -45.94 0.435 723 +725 3 40.08 -183.75 -46.02 0.435 724 +726 3 41.89 -184.9 -46.48 0.435 725 +727 3 42.37 -185.21 -47.25 0.435 726 +728 3 42.86 -185.8 -47.61 0.435 727 +729 3 43.1 -186.2 -47.86 0.435 728 +730 3 43.58 -186.81 -47.91 0.435 729 +731 3 43.85 -187.35 -48.87 0.435 730 +732 3 44.12 -187.97 -49.01 0.435 731 +733 3 1.19 -26.21 -10.83 0.435 163 +734 3 1.24 -27.08 -10.84 0.435 733 +735 3 1.32 -28.35 -10.97 0.435 734 +736 3 1.4 -29.65 -11.1 0.435 735 +737 3 1.71 -30.91 -11.22 0.435 736 +738 3 1.81 -32.63 -11.4 0.435 737 +739 3 1.92 -34.13 -11.55 0.435 738 +740 3 2.02 -35.84 -11.72 0.435 739 +741 3 2.14 -37.77 -11.92 0.435 740 +742 3 2.24 -39.27 -12.07 0.435 741 +743 3 2.76 -40.53 -12.19 0.435 742 +744 3 3.28 -41.79 -12.31 0.435 743 +745 3 3.62 -43.91 -12.52 0.435 744 +746 3 3.88 -44.56 -12.51 0.435 745 +747 3 4.35 -45.15 -12.78 0.435 746 +748 3 4.64 -45.7 -13.67 0.435 747 +749 3 4.9 -46.25 -14.39 0.435 748 +750 3 5.19 -47.3 -14.56 0.435 749 +751 3 5.25 -48.16 -14.65 0.435 750 +752 3 5.3 -49.01 -14.82 0.435 751 +753 3 4.96 -50.32 -14.96 0.435 752 +754 3 5.0 -50.96 -15.1 0.435 753 +755 3 5.51 -51.96 -15.57 0.435 754 +756 3 5.76 -52.6 -15.63 0.435 755 +757 3 6.23 -52.94 -16.18 0.435 756 +758 3 6.77 -54.62 -16.42 0.435 757 +759 3 7.04 -55.24 -16.55 0.435 758 +760 3 7.32 -56.09 -16.71 0.435 759 +761 3 7.56 -56.47 -16.97 0.435 760 +762 3 8.09 -57.95 -17.11 0.435 761 +763 3 8.14 -58.59 -17.17 0.435 762 +764 3 8.17 -59.22 -17.32 0.435 763 +765 3 7.79 -60.11 -17.42 0.435 764 +766 3 7.82 -60.54 -17.46 0.435 765 +767 3 8.1 -61.34 -17.84 0.435 766 +768 3 8.67 -63.46 -18.12 0.435 767 +769 3 9.0 -65.16 -18.28 0.435 768 +770 3 8.68 -66.89 -18.47 0.435 769 +771 3 8.71 -67.3 -18.74 0.435 770 +772 3 9.19 -67.89 -19.09 0.435 771 +773 3 9.45 -68.23 -19.73 0.435 772 +774 3 9.7 -68.85 -20.01 0.435 773 +775 3 9.97 -69.47 -20.14 0.435 774 +776 3 10.21 -69.89 -20.18 0.435 775 +777 3 10.47 -70.5 -20.39 0.435 776 +778 3 10.77 -71.48 -21.24 0.435 777 +779 3 11.56 -73.57 -21.51 0.435 778 +780 3 11.39 -74.44 -21.68 0.435 779 +781 3 11.94 -76.12 -21.84 0.435 780 +782 3 12.29 -78.01 -22.33 0.435 781 +783 3 12.38 -79.26 -22.83 0.435 782 +784 3 12.45 -80.29 -23.24 0.435 783 +785 3 13.21 -81.96 -23.54 0.435 784 +786 3 13.51 -83.01 -23.64 0.435 785 +787 3 13.78 -83.85 -23.8 0.435 786 +788 3 13.81 -84.28 -23.84 0.435 787 +789 3 14.08 -85.11 -24.0 0.435 788 +790 3 14.35 -85.95 -24.15 0.435 789 +791 3 14.39 -86.34 -24.57 0.435 790 +792 3 14.47 -87.1 -25.55 0.435 791 +793 3 14.49 -87.27 -26.09 0.435 792 +794 3 14.53 -87.91 -26.16 0.435 793 +795 3 14.78 -88.01 -27.15 0.435 794 +796 3 15.04 -88.65 -27.21 0.435 795 +797 3 15.54 -89.68 -27.3 0.435 796 +798 3 16.0 -90.09 -27.26 0.435 797 +799 3 17.33 -90.44 -27.26 0.435 798 +800 3 18.92 -91.08 -28.49 0.435 799 +801 3 19.13 -91.08 -28.42 0.435 800 +802 3 19.37 -91.28 -28.43 0.435 801 +803 3 19.81 -91.46 -28.51 0.435 802 +804 3 20.65 -90.97 -28.52 0.435 803 +805 3 21.09 -90.89 -29.03 0.435 804 +806 3 22.36 -90.13 -29.22 0.435 805 +807 3 23.24 -90.25 -29.66 0.435 806 +808 3 23.94 -90.56 -30.5 0.435 807 +809 3 24.38 -90.74 -30.59 0.435 808 +810 3 24.87 -91.04 -31.52 0.435 809 +811 3 25.55 -91.42 -31.76 0.435 810 +812 3 26.45 -92.0 -31.88 0.435 811 +813 3 26.7 -92.14 -32.41 0.435 812 +814 3 28.04 -92.71 -32.44 0.435 813 +815 3 28.72 -93.09 -32.46 0.435 814 +816 3 29.85 -93.61 -33.09 0.435 815 +817 3 30.55 -94.19 -33.44 0.435 816 +818 3 31.43 -94.34 -33.51 0.435 817 +819 3 31.89 -94.7 -33.84 0.435 818 +820 3 32.12 -94.9 -33.93 0.435 819 +821 3 32.36 -94.84 -34.37 0.435 820 +822 3 32.6 -94.99 -34.98 0.435 821 +823 3 33.06 -95.11 -35.59 0.435 822 +824 3 33.53 -95.45 -36.21 0.435 823 +825 3 34.25 -95.93 -37.45 0.435 824 +826 3 35.62 -96.88 -37.97 0.435 825 +827 3 36.73 -97.22 -38.13 0.435 826 +828 3 37.66 -97.74 -38.92 0.435 827 +829 3 38.37 -98.27 -39.63 0.435 828 +830 3 39.27 -98.33 -40.59 0.435 829 +831 3 39.95 -98.72 -40.54 0.435 830 +832 3 40.17 -98.66 -41.05 0.435 831 +833 3 40.19 -98.55 -42.1 0.435 832 +834 3 40.89 -98.84 -43.1 0.435 833 +835 3 41.56 -98.99 -43.4 0.435 834 +836 3 42.03 -99.13 -43.86 0.435 835 +837 3 42.48 -99.52 -43.95 0.435 836 +838 3 43.15 -99.69 -43.96 0.435 837 +839 3 43.58 -99.88 -43.97 0.435 838 +840 3 44.52 -100.65 -44.41 0.435 839 +841 3 45.17 -100.6 -44.39 0.435 840 +842 3 45.64 -101.22 -44.51 0.435 841 +843 3 46.34 -102.03 -44.58 0.435 842 +844 3 46.82 -102.4 -44.99 0.435 843 +845 3 47.94 -102.94 -45.32 0.435 844 +846 3 48.39 -103.12 -45.4 0.435 845 +847 3 49.28 -103.5 -45.41 0.435 846 +848 3 49.71 -103.47 -45.4 0.435 847 +849 3 50.37 -103.37 -45.91 0.435 848 +850 3 50.8 -103.35 -45.89 0.435 849 +851 3 51.26 -103.25 -46.55 0.435 850 +852 3 51.96 -103.25 -48.34 0.435 851 +853 3 52.4 -103.19 -48.7 0.435 852 +854 3 52.84 -103.11 -49.21 0.435 853 +855 3 53.5 -103.03 -49.49 0.435 854 +856 3 53.96 -102.91 -50.37 0.435 855 +857 3 54.84 -103.02 -50.88 0.435 856 +858 3 55.29 -102.93 -51.47 0.435 857 +859 3 55.96 -102.83 -52.11 0.435 858 +860 3 56.41 -102.96 -52.65 0.435 859 +861 3 57.08 -103.12 -52.72 0.435 860 +862 3 57.3 -103.1 -52.79 0.435 861 +863 3 58.16 -103.01 -53.14 0.435 862 +864 3 59.06 -103.11 -53.73 0.435 863 +865 3 59.5 -103.04 -54.16 0.435 864 +866 3 60.15 -103.0 -54.22 0.435 865 +867 3 60.8 -102.94 -54.35 0.435 866 +868 3 60.83 -102.78 -55.85 0.435 867 +869 3 61.08 -102.65 -57.03 0.435 868 +870 3 61.53 -102.56 -57.61 0.435 869 +871 3 62.21 -102.94 -57.71 0.435 870 +872 3 63.12 -103.5 -58.12 0.435 871 +873 3 64.02 -103.55 -59.09 0.435 872 +874 3 64.91 -103.7 -59.23 0.435 873 +875 3 65.36 -103.87 -59.46 0.435 874 +876 3 66.04 -104.26 -59.49 0.435 875 +877 3 66.71 -104.37 -60.01 0.435 876 +878 3 67.4 -104.7 -60.64 0.435 877 +879 3 68.3 -105.05 -61.02 0.435 878 +880 3 68.53 -105.23 -61.12 0.435 879 +881 3 68.77 -105.43 -61.13 0.435 880 +882 3 0.29 -26.4 -9.51 0.435 162 +883 3 -0.93 -27.34 -9.64 0.435 882 +884 3 -1.38 -27.94 -8.27 0.435 883 +885 3 -1.79 -28.43 -7.88 0.435 884 +886 3 -2.19 -28.86 -8.17 0.435 885 +887 3 -2.59 -29.26 -8.82 0.435 886 +888 3 -2.53 -29.84 -9.48 0.435 887 +889 3 -2.92 -30.23 -10.13 0.435 888 +890 3 -3.32 -30.68 -10.26 0.435 889 +891 3 -3.67 -31.43 -11.7 0.435 890 +892 3 -3.13 -32.61 -12.5 0.435 891 +893 3 -3.1 -33.26 -12.56 0.435 892 +894 3 -3.04 -34.11 -12.72 0.435 893 +895 3 -3.41 -35.0 -12.82 0.435 894 +896 3 -4.65 -36.14 -12.97 0.435 895 +897 3 -5.8 -38.58 -13.25 0.435 896 +898 3 -6.98 -40.36 -13.53 0.435 897 +899 3 -8.19 -41.44 -14.43 0.435 898 +900 3 -9.82 -43.0 -15.01 0.435 899 +901 3 -12.12 -44.19 -15.49 0.435 900 +902 3 -13.3 -45.69 -16.34 0.435 901 +903 3 -14.53 -46.62 -16.62 0.435 902 +904 3 -15.3 -47.89 -17.45 0.435 903 +905 3 -16.54 -48.53 -18.37 0.435 904 +906 3 -18.31 -51.16 -19.29 0.435 905 +907 3 -19.43 -53.77 -19.89 0.435 906 +908 3 -20.98 -56.14 -21.08 0.435 907 +909 3 -22.19 -57.71 -21.34 0.435 908 +910 3 -23.77 -59.88 -22.35 0.435 909 +911 3 -25.82 -61.73 -22.67 0.435 910 +912 3 -27.89 -63.13 -22.87 0.435 911 +913 3 -28.48 -63.75 -23.7 0.435 912 +914 3 -29.05 -65.07 -23.77 0.435 913 +915 3 -29.42 -66.17 -23.89 0.435 914 +916 3 -30.22 -67.06 -24.31 0.435 915 +917 3 -30.58 -67.91 -24.63 0.435 916 +918 3 -31.39 -68.78 -25.11 0.435 917 +919 3 -31.81 -68.74 -25.8 0.435 918 +920 3 -32.15 -69.73 -26.97 0.435 919 +921 3 -33.77 -71.56 -27.2 0.435 920 +922 3 -34.1 -72.55 -28.21 0.435 921 +923 3 -35.7 -74.58 -28.53 0.435 922 +924 3 -36.05 -75.31 -30.12 0.435 923 +925 3 -37.0 -77.52 -30.38 0.435 924 +926 3 -38.2 -79.1 -30.57 0.435 925 +927 3 -40.22 -81.37 -30.85 0.435 926 +928 3 -41.35 -83.44 -32.67 0.435 927 +929 3 -42.99 -84.82 -32.93 0.435 928 +930 3 -42.66 -85.7 -34.74 0.435 929 +931 3 -43.7 -86.41 -34.84 0.435 930 +932 3 -44.9 -87.99 -35.03 0.435 931 +933 3 -45.93 -88.91 -35.08 0.435 932 +934 3 -45.88 -89.77 -35.17 0.435 933 +935 3 -47.05 -91.47 -36.28 0.435 934 +936 3 -48.65 -93.25 -36.87 0.435 935 +937 3 -49.03 -93.83 -37.77 0.435 936 +938 3 -49.36 -95.35 -38.01 0.435 937 +939 3 -50.16 -96.19 -38.87 0.435 938 +940 3 -50.49 -97.43 -39.61 0.435 939 +941 3 -50.44 -97.76 -40.62 0.435 940 +942 3 -50.82 -98.39 -41.08 0.435 941 +943 3 -50.75 -98.91 -42.41 0.435 942 +944 3 -51.12 -99.7 -43.4 0.435 943 +945 3 -51.46 -100.75 -43.89 0.435 944 +946 3 -51.15 -101.45 -45.4 0.435 945 +947 3 1.92 -21.67 -8.0 0.54 156 +948 3 1.3 -21.83 -8.86 0.54 947 +949 3 0.89 -21.74 -10.07 0.54 948 +950 3 -0.54 -22.67 -10.35 0.54 949 +951 3 -1.97 -24.01 -10.9 0.435 950 +952 3 -3.24 -24.51 -11.06 0.435 951 +953 3 -4.44 -25.28 -12.75 0.435 952 +954 3 -6.7 -27.13 -13.06 0.435 953 +955 3 -7.53 -27.79 -13.53 0.435 954 +956 3 -8.55 -28.47 -14.0 0.435 955 +957 3 -9.18 -28.93 -14.06 0.435 956 +958 3 -9.63 -28.48 -14.48 0.435 957 +959 3 -10.24 -28.65 -15.41 0.435 958 +960 3 -10.2 -28.69 -17.08 0.435 959 +961 3 -10.58 -29.36 -17.08 0.435 960 +962 3 -11.2 -29.81 -17.45 0.435 961 +963 3 -12.0 -30.67 -18.01 0.435 962 +964 3 -12.74 -32.12 -19.07 0.435 963 +965 3 -13.54 -32.94 -20.01 0.435 964 +966 3 -13.65 -34.57 -20.18 0.435 965 +967 3 -13.84 -35.31 -19.58 0.325 966 +968 3 -13.6 -35.72 -19.61 0.325 967 +969 3 -13.35 -35.6 -20.73 0.435 968 +970 3 -13.31 -36.24 -20.8 0.435 969 +971 3 -13.28 -36.66 -20.84 0.435 970 +972 3 -13.22 -37.74 -20.95 0.435 971 +973 3 -13.19 -38.15 -21.14 0.435 972 +974 3 -13.16 -38.31 -21.61 0.435 973 +975 3 -13.07 -39.6 -21.74 0.435 974 +976 3 -13.42 -40.89 -22.04 0.435 975 +977 3 -13.34 -41.96 -22.21 0.435 976 +978 3 -13.29 -42.81 -22.38 0.435 977 +979 3 -13.67 -43.69 -22.55 0.435 978 +980 3 -13.6 -44.75 -22.81 0.435 979 +981 3 -13.51 -45.73 -23.74 0.435 980 +982 3 -13.44 -46.79 -24.0 0.435 981 +983 3 -13.38 -47.36 -24.67 0.435 982 +984 3 -13.35 -47.76 -25.01 0.435 983 +985 3 -13.3 -48.35 -25.66 0.435 984 +986 3 -13.03 -48.96 -25.87 0.435 985 +987 3 -12.95 -50.24 -26.0 0.435 986 +988 3 -12.88 -51.04 -26.61 0.435 987 +989 3 -12.82 -52.11 -26.79 0.435 988 +990 3 -12.77 -52.45 -27.66 0.435 989 +991 3 -12.72 -53.09 -27.8 0.435 990 +992 3 -12.64 -53.85 -28.86 0.435 991 +993 3 -12.61 -54.26 -28.97 0.435 992 +994 3 -12.55 -55.09 -29.36 0.435 993 +995 3 -12.3 -55.51 -29.47 0.435 994 +996 3 -12.27 -56.13 -29.61 0.435 995 +997 3 -12.16 -57.63 -29.76 0.435 996 +998 3 -12.51 -58.89 -30.5 0.435 997 +999 3 -12.45 -59.46 -31.25 0.435 998 +1000 3 -12.37 -60.47 -31.87 0.435 999 +1001 3 -12.31 -61.32 -32.04 0.435 1000 +1002 3 -11.96 -62.93 -33.09 0.435 1001 +1003 3 -12.28 -64.64 -33.58 0.435 1002 +1004 3 -12.19 -65.64 -34.43 0.435 1003 +1005 3 -11.93 -65.98 -35.15 0.435 1004 +1006 3 -11.88 -66.83 -35.3 0.435 1005 +1007 3 -11.6 -67.65 -35.68 0.435 1006 +1008 3 -11.56 -68.06 -35.87 0.435 1007 +1009 3 -11.03 -69.24 -36.74 0.435 1008 +1010 3 -11.0 -69.89 -36.8 0.435 1009 +1011 3 -10.93 -70.42 -37.91 0.435 1010 +1012 3 -10.87 -71.27 -38.0 0.435 1011 +1013 3 -11.22 -72.58 -38.23 0.435 1012 +1014 3 -11.59 -73.13 -39.42 0.435 1013 +1015 3 -11.54 -73.78 -39.48 0.435 1014 +1016 3 -11.48 -74.32 -40.44 0.435 1015 +1017 3 -11.43 -74.95 -40.66 0.435 1016 +1018 3 -11.41 -75.38 -40.7 0.435 1017 +1019 3 -11.78 -76.22 -41.25 0.435 1018 +1020 3 -11.5 -77.27 -41.42 0.435 1019 +1021 3 -11.44 -78.09 -41.81 0.435 1020 +1022 3 -11.4 -78.47 -42.38 0.435 1021 +1023 3 -11.34 -78.82 -43.24 0.435 1022 +1024 3 -11.29 -79.42 -43.68 0.435 1023 +1025 3 -11.25 -79.74 -44.62 0.435 1024 +1026 3 -11.21 -80.16 -44.81 0.435 1025 +1027 3 -11.18 -80.55 -45.3 0.435 1026 +1028 3 -11.1 -81.07 -46.55 0.435 1027 +1029 3 -10.85 -81.69 -46.61 0.435 1028 +1030 3 -10.58 -82.24 -47.57 0.435 1029 +1031 3 -10.33 -82.63 -47.75 0.435 1030 +1032 3 -10.06 -82.96 -48.61 0.435 1031 +1033 3 -10.02 -83.33 -49.17 0.435 1032 +1034 3 -9.54 -83.94 -49.31 0.435 1033 +1035 3 -9.26 -84.22 -50.69 0.435 1034 +1036 3 -9.02 -84.63 -50.87 0.435 1035 +1037 3 -7.86 -85.83 -51.12 0.435 1036 +1038 3 -6.91 -86.76 -52.02 0.435 1037 +1039 3 -6.65 -87.16 -52.21 0.435 1038 +1040 3 -5.51 -87.86 -53.16 0.435 1039 +1041 3 -5.04 -88.02 -53.38 0.435 1040 +1042 3 -4.78 -88.32 -54.54 0.435 1041 +1043 3 -3.87 -88.91 -54.65 0.435 1042 +1044 3 -2.92 -89.61 -55.69 0.435 1043 +1045 3 -1.81 -90.18 -55.87 0.435 1044 +1046 3 -1.36 -90.36 -55.88 0.435 1045 +1047 3 -0.47 -90.73 -55.97 0.435 1046 +1048 3 -0.04 -90.7 -55.96 0.435 1047 +1049 3 -14.34 -33.86 -20.12 0.435 966 +1050 3 -15.59 -34.79 -20.32 0.435 1049 +1051 3 -17.03 -35.45 -21.18 0.435 1050 +1052 3 -17.43 -36.09 -21.4 0.435 1051 +1053 3 -19.06 -37.71 -21.61 0.435 1052 +1054 3 -19.44 -38.37 -21.77 0.435 1053 +1055 3 -18.95 -39.16 -22.29 0.435 1054 +1056 3 -18.89 -39.68 -23.47 0.435 1055 +1057 3 -19.69 -40.57 -23.73 0.435 1056 +1058 3 -20.74 -41.07 -23.81 0.435 1057 +1059 3 -22.16 -42.12 -25.08 0.435 1058 +1060 3 -23.17 -42.97 -25.79 0.435 1059 +1061 3 -23.96 -43.76 -27.03 0.435 1060 +1062 3 -24.35 -44.14 -27.83 0.435 1061 +1063 3 -25.12 -44.94 -29.14 0.435 1062 +1064 3 -25.92 -45.78 -29.85 0.435 1063 +1065 3 -26.67 -47.29 -30.47 0.435 1064 +1066 3 -27.48 -47.59 -32.17 0.435 1065 +1067 3 -28.26 -48.4 -33.33 0.435 1066 +1068 3 -30.44 -50.98 -35.01 0.435 1067 +1069 3 -31.67 -51.85 -35.81 0.435 1068 +1070 3 -33.3 -53.45 -36.08 0.435 1069 +1071 3 -34.3 -54.0 -37.67 0.435 1070 +1072 3 -35.92 -55.57 -38.25 0.435 1071 +1073 3 -36.72 -56.69 -38.46 0.435 1072 +1074 3 -37.27 -57.67 -39.85 0.435 1073 +1075 3 -38.9 -59.01 -40.48 0.435 1074 +1076 3 -39.67 -60.25 -41.53 0.435 1075 +1077 3 -40.46 -61.34 -41.97 0.435 1076 +1078 3 -41.65 -62.59 -43.26 0.435 1077 +1079 3 -41.78 -63.34 -44.54 0.435 1078 +1080 3 -42.79 -64.47 -44.76 0.435 1079 +1081 3 -43.48 -66.53 -46.35 0.435 1080 +1082 3 -44.25 -68.08 -46.53 0.435 1081 +1083 3 -45.19 -69.45 -46.69 0.435 1082 +1084 3 -46.21 -69.76 -48.41 0.11 1083 +1085 3 -46.16 -70.05 -49.79 0.435 1084 +1086 3 -46.52 -70.41 -50.81 0.435 1085 +1087 3 -47.32 -71.5 -51.32 0.435 1086 +1088 3 -48.1 -72.31 -52.32 0.435 1087 +1089 3 -48.87 -73.56 -53.31 0.435 1088 +1090 3 -49.65 -74.65 -53.81 0.435 1089 +1091 3 -50.69 -75.31 -54.35 0.435 1090 +1092 3 -51.51 -75.99 -54.68 0.435 1091 +1093 3 -53.16 -76.87 -55.56 0.435 1092 +1094 3 -54.83 -77.55 -56.34 0.435 1093 +1095 3 -56.47 -78.89 -57.05 0.435 1094 +1096 3 -56.41 -79.43 -58.15 0.435 1095 +1097 3 -57.64 -80.35 -58.36 0.435 1096 +1098 3 -58.43 -81.42 -59.01 0.435 1097 +1099 3 -58.77 -82.73 -59.24 0.435 1098 +1100 3 -59.17 -83.39 -59.31 0.435 1099 +1101 3 -59.11 -84.02 -59.6 0.435 1100 +1102 3 -59.49 -84.35 -60.78 0.435 1101 +1103 3 -59.87 -85.44 -60.97 0.435 1102 +1104 3 -59.79 -85.95 -62.31 0.435 1103 +1105 3 -45.01 -69.81 -47.02 0.435 1083 +1106 3 -45.76 -71.04 -48.22 0.435 1105 +1107 3 -46.57 -71.93 -48.56 0.435 1106 +1108 3 -46.9 -73.45 -48.8 0.435 1107 +1109 3 -46.61 -73.94 -50.2 0.435 1108 +1110 3 -47.8 -75.72 -50.57 0.435 1109 +1111 3 -48.97 -77.73 -50.72 0.435 1110 +1112 3 -49.89 -80.15 -50.99 0.435 1111 +1113 3 -51.1 -81.45 -51.84 0.435 1112 +1114 3 -51.44 -82.51 -52.4 0.435 1113 +1115 3 -52.65 -84.08 -52.59 0.435 1114 +1116 3 -52.6 -84.93 -52.76 0.435 1115 +1117 3 -53.8 -86.26 -53.3 0.435 1116 +1118 3 -54.76 -87.72 -54.46 0.435 1117 +1119 3 -55.72 -89.71 -54.69 0.435 1118 +1120 3 -56.13 -89.89 -54.87 0.435 1119 +1121 3 -56.75 -90.58 -54.95 0.435 1120 +1122 3 -56.64 -91.74 -56.2 0.435 1121 +1123 3 -57.01 -92.61 -56.53 0.435 1122 +1124 3 -56.95 -93.45 -56.76 0.435 1123 +1125 3 -56.89 -94.29 -57.07 0.435 1124 +1126 3 -56.82 -95.07 -57.83 0.435 1125 +1127 3 -57.44 -95.54 -57.96 0.435 1126 +1128 3 -58.24 -96.66 -58.1 0.435 1127 +1129 3 -59.06 -97.34 -58.27 0.435 1128 +1130 3 -60.27 -98.7 -58.51 0.435 1129 +1131 3 -60.64 -99.57 -58.69 0.435 1130 +1132 3 -61.42 -100.9 -59.07 0.435 1131 +1133 3 -61.78 -101.7 -59.91 0.435 1132 +1134 3 -62.57 -102.81 -60.12 0.435 1133 +1135 3 -63.38 -103.94 -60.25 0.435 1134 +1136 3 -63.29 -105.17 -60.91 0.435 1135 +1137 3 -63.2 -106.17 -61.69 0.435 1136 +1138 3 -63.16 -106.55 -62.18 0.435 1137 +1139 3 -63.11 -107.19 -62.32 0.435 1138 +1140 3 -62.85 -107.82 -62.45 0.435 1139 +1141 3 -63.59 -109.78 -62.75 0.435 1140 +1142 3 -63.96 -110.63 -63.15 0.435 1141 +1143 3 -63.9 -111.46 -63.61 0.435 1142 +1144 3 -63.85 -112.04 -64.27 0.435 1143 +1145 3 -63.82 -112.46 -64.31 0.435 1144 +1146 3 -63.79 -112.88 -64.44 0.435 1145 +1147 3 -63.51 -113.44 -65.16 0.435 1146 +1148 3 -63.43 -114.71 -65.44 0.435 1147 +1149 3 -64.59 -116.93 -65.78 0.435 1148 +1150 3 -64.94 -118.24 -65.92 0.435 1149 +1151 3 -64.89 -119.09 -66.08 0.435 1150 +1152 3 -64.81 -120.12 -66.57 0.435 1151 +1153 3 -64.75 -120.98 -66.65 0.435 1152 +1154 3 -64.7 -121.56 -67.32 0.435 1153 +1155 3 -64.4 -122.83 -67.51 0.435 1154 +1156 3 -64.37 -123.23 -67.77 0.435 1155 +1157 3 -64.09 -124.05 -68.0 0.435 1156 +1158 3 -63.83 -124.69 -68.06 0.435 1157 +1159 3 -63.54 -125.73 -68.31 0.435 1158 +1160 3 -62.83 -126.51 -68.76 0.435 1159 +1161 3 -62.31 -127.49 -69.52 0.435 1160 +1162 3 -62.06 -127.88 -69.71 0.435 1161 +1163 3 -61.59 -128.49 -69.91 0.435 1162 +1164 3 -61.56 -128.88 -70.25 0.435 1163 +1165 3 -61.53 -129.3 -70.37 0.435 1164 +1166 3 -61.26 -129.65 -71.08 0.435 1165 +1167 3 -60.79 -129.98 -71.85 0.435 1166 +1168 3 -60.97 -130.41 -71.9 0.435 1167 +1169 3 -60.92 -130.76 -72.77 0.435 1168 +1170 3 -61.77 -131.24 -72.84 0.435 1169 +1171 3 -61.75 -131.45 -72.93 0.435 1170 +1172 3 -62.09 -131.96 -73.08 0.435 1171 +1173 3 -61.83 -132.58 -73.2 0.435 1172 +1174 3 -61.78 -132.89 -74.36 0.435 1173 +1175 3 -61.51 -133.23 -75.07 0.435 1174 +1176 3 -61.46 -133.78 -76.04 0.435 1175 +1177 3 -61.38 -134.56 -76.87 0.435 1176 +1178 3 -61.11 -134.86 -77.95 0.435 1177 +1179 3 -60.64 -135.46 -78.22 0.435 1178 +1180 3 -60.37 -136.08 -78.36 0.435 1179 +1181 3 -60.14 -136.5 -78.4 0.435 1180 +1182 3 -60.1 -136.91 -78.66 0.435 1181 +1183 3 -59.84 -137.53 -78.8 0.435 1182 +1184 3 8.32 -12.11 -2.64 1.085 8 +1185 3 8.51 -12.22 -1.51 1.085 1184 +1186 3 9.85 -13.04 -1.04 0.65 1185 +1187 3 10.53 -13.65 -1.09 0.65 1186 +1188 3 11.44 -14.25 -0.98 0.65 1187 +1189 3 11.86 -14.57 0.27 0.65 1188 +1190 3 12.51 -14.78 0.57 0.65 1189 +1191 3 12.93 -15.07 1.52 0.65 1190 +1192 3 13.59 -15.27 1.89 0.65 1191 +1193 3 14.04 -15.97 2.58 0.65 1192 +1194 3 14.75 -16.78 2.52 0.65 1193 +1195 3 14.77 -17.22 2.55 0.65 1194 +1196 3 14.87 -17.58 2.52 0.65 1195 +1197 3 14.42 -16.6 1.17 0.65 1196 +1198 3 13.99 -16.86 1.28 0.65 1197 +1199 3 14.06 -17.12 -0.31 0.65 1198 +1200 3 14.3 -17.32 -0.4 0.54 1199 +1201 3 14.16 -18.62 -0.53 0.54 1200 +1202 3 14.22 -19.47 -0.62 0.54 1201 +1203 3 14.25 -20.12 -0.69 0.54 1202 +1204 3 13.88 -21.0 -0.79 0.54 1203 +1205 3 13.07 -21.92 -0.83 0.54 1204 +1206 3 12.23 -22.61 -0.92 0.54 1205 +1207 3 11.87 -23.19 -1.9 0.54 1206 +1208 3 11.94 -23.7 -3.22 0.54 1207 +1209 3 11.56 -24.09 -3.96 0.54 1208 +1210 3 11.64 -24.84 -5.01 0.54 1209 +1211 3 11.7 -25.65 -5.54 0.54 1210 +1212 3 11.34 -26.71 -6.11 0.54 1211 +1213 3 10.13 -28.06 -6.35 0.54 1212 +1214 3 10.21 -29.06 -7.21 0.54 1213 +1215 3 9.41 -29.7 -7.83 0.54 1214 +1216 3 9.03 -30.28 -8.72 0.54 1215 +1217 3 9.07 -30.62 -9.59 0.54 1216 +1218 3 9.11 -31.01 -10.08 0.54 1217 +1219 3 7.78 -33.11 -11.61 0.54 1218 +1220 3 7.79 -33.32 -11.63 0.54 1219 +1221 3 7.81 -34.05 -10.88 0.54 1220 +1222 3 7.39 -34.0 -11.64 0.54 1221 +1223 3 6.59 -34.35 -12.97 0.54 1222 +1224 3 6.2 -34.68 -14.22 0.54 1223 +1225 3 6.28 -35.45 -15.2 0.54 1224 +1226 3 6.78 -35.32 -24.67 0.54 1225 +1227 3 7.25 -35.94 -24.72 0.54 1226 +1228 3 7.55 -37.21 -24.85 0.54 1227 +1229 3 7.16 -37.88 -24.93 0.54 1228 +1230 3 7.22 -37.9 -26.74 0.54 1229 +1231 3 7.25 -38.03 -27.66 0.54 1230 +1232 3 7.08 -38.69 -27.73 0.54 1231 +1233 3 6.89 -39.1 -28.08 0.435 1232 +1234 3 6.09 -40.0 -28.19 0.435 1233 +1235 3 5.95 -41.32 -28.25 0.435 1234 +1236 3 5.55 -41.72 -28.68 0.435 1235 +1237 3 5.18 -42.83 -28.8 0.435 1236 +1238 3 4.82 -43.41 -29.7 0.435 1237 +1239 3 4.46 -44.23 -30.4 0.435 1238 +1240 3 4.51 -44.55 -31.55 0.435 1239 +1241 3 4.56 -44.87 -32.64 0.435 1240 +1242 3 4.62 -45.42 -33.6 0.435 1241 +1243 3 4.24 -46.27 -33.93 0.435 1242 +1244 3 4.28 -46.64 -34.57 0.435 1243 +1245 3 3.95 -47.64 -35.66 0.435 1244 +1246 3 4.01 -48.7 -35.85 0.435 1245 +1247 3 4.06 -49.04 -36.77 0.435 1246 +1248 3 4.12 -49.62 -37.44 0.435 1247 +1249 3 4.19 -50.43 -37.9 0.435 1248 +1250 3 4.24 -51.06 -38.12 0.54 1249 +1251 3 4.29 -51.93 -38.12 0.54 1250 +1252 3 4.3 -52.12 -38.44 0.54 1251 +1253 3 3.94 -52.18 -40.27 0.54 1252 +1254 3 3.99 -52.71 -41.31 0.54 1253 +1255 3 4.07 -53.48 -42.28 0.54 1254 +1256 3 3.73 -54.17 -44.17 0.54 1255 +1257 3 3.41 -55.12 -45.79 0.54 1256 +1258 3 3.08 -56.09 -47.18 0.54 1257 +1259 3 3.13 -56.43 -48.04 0.54 1258 +1260 3 3.21 -56.88 -49.96 0.54 1259 +1261 3 3.27 -56.89 -51.93 0.54 1260 +1262 3 3.32 -57.2 -53.09 0.54 1261 +1263 3 2.93 -57.81 -53.77 0.54 1262 +1264 3 2.57 -58.38 -54.88 0.54 1263 +1265 3 2.23 -59.39 -55.83 0.54 1264 +1266 3 2.28 -60.24 -55.99 0.54 1265 +1267 3 2.37 -60.94 -57.49 0.54 1266 +1268 3 2.65 -61.23 -58.88 0.54 1267 +1269 3 2.71 -61.48 -60.63 0.54 1268 +1270 3 2.81 -62.14 -62.66 0.54 1269 +1271 3 2.44 -62.46 -63.83 0.54 1270 +1272 3 2.5 -63.31 -64.14 0.54 1271 +1273 3 2.53 -63.73 -64.19 0.54 1272 +1274 3 2.18 -64.23 -65.89 0.54 1273 +1275 3 2.23 -65.09 -65.98 0.54 1274 +1276 3 2.71 -65.71 -66.03 0.54 1275 +1277 3 2.98 -66.26 -66.77 0.54 1276 +1278 3 3.05 -66.78 -68.1 0.54 1277 +1279 3 3.09 -67.43 -68.16 0.54 1278 +1280 3 3.14 -68.02 -68.53 0.54 1279 +1281 3 3.21 -68.84 -69.06 0.54 1280 +1282 3 2.8 -69.29 -69.2 0.54 1281 +1283 3 2.41 -69.69 -69.77 0.54 1282 +1284 3 2.04 -70.31 -70.38 0.54 1283 +1285 3 2.09 -70.87 -71.26 0.54 1284 +1286 3 2.14 -71.19 -72.35 0.54 1285 +1287 3 2.21 -71.98 -72.95 0.54 1286 +1288 3 1.44 -73.0 -74.13 0.54 1287 +1289 3 1.5 -73.26 -75.82 0.54 1288 +1290 3 1.59 -74.0 -77.03 0.54 1289 +1291 3 1.22 -74.57 -78.14 0.54 1290 +1292 3 1.26 -75.21 -78.21 0.54 1291 +1293 3 0.89 -75.54 -79.38 0.54 1292 +1294 3 0.95 -76.11 -80.2 0.54 1293 +1295 3 0.54 -76.56 -80.32 0.54 1294 +1296 3 0.61 -77.6 -80.73 0.54 1295 +1297 3 0.67 -78.19 -81.39 0.54 1296 +1298 3 0.71 -78.8 -81.69 0.54 1297 +1299 3 0.76 -79.44 -81.82 0.54 1298 +1300 3 1.02 -80.06 -81.96 0.54 1299 +1301 3 1.5 -80.63 -82.53 0.54 1300 +1302 3 1.78 -81.47 -82.61 0.54 1301 +1303 3 1.87 -82.96 -82.84 0.54 1302 +1304 3 2.12 -83.37 -82.88 0.54 1303 +1305 3 2.61 -84.17 -83.25 0.54 1304 +1306 3 3.32 -84.96 -83.62 0.54 1305 +1307 3 4.04 -85.73 -84.13 0.54 1306 +1308 3 4.73 -86.33 -84.25 0.54 1307 +1309 3 6.52 -87.29 -84.31 0.54 1308 +1310 3 7.42 -87.67 -84.33 0.54 1309 +1311 3 8.31 -88.03 -84.42 0.54 1310 +1312 3 9.43 -88.61 -84.46 0.54 1311 +1313 3 10.76 -88.96 -84.46 0.54 1312 +1314 3 11.42 -89.13 -84.46 0.54 1313 +1315 3 12.28 -89.07 -84.44 0.54 1314 +1316 3 12.9 -88.61 -84.37 0.54 1315 +1317 3 13.54 -88.58 -84.36 0.54 1316 +1318 3 7.3 -38.67 -27.79 0.54 1232 +1319 3 8.0 -39.48 -27.86 0.54 1318 +1320 3 9.16 -40.13 -29.26 0.54 1319 +1321 3 9.84 -40.51 -29.36 0.54 1320 +1322 3 10.54 -40.82 -30.27 0.54 1321 +1323 3 11.03 -41.62 -30.57 0.54 1322 +1324 3 11.98 -42.31 -31.68 0.54 1323 +1325 3 12.23 -42.17 -32.93 0.54 1324 +1326 3 12.91 -42.52 -33.41 0.54 1325 +1327 3 13.55 -42.48 -33.39 0.54 1326 +1328 3 14.65 -42.34 -34.1 0.54 1327 +1329 3 15.58 -43.13 -34.24 0.54 1328 +1330 3 16.28 -43.39 -35.45 0.54 1329 +1331 3 16.74 -43.79 -35.48 0.54 1330 +1332 3 17.21 -44.14 -36.04 0.54 1331 +1333 3 17.9 -44.42 -37.11 0.54 1332 +1334 3 18.62 -45.2 -37.62 0.54 1333 +1335 3 18.89 -45.26 -38.9 0.54 1334 +1336 3 19.39 -46.04 -39.57 0.54 1335 +1337 3 20.11 -46.46 -41.26 0.54 1336 +1338 3 21.29 -47.68 -41.43 0.54 1337 +1339 3 21.78 -47.92 -43.03 0.54 1338 +1340 3 22.25 -48.52 -43.23 0.54 1339 +1341 3 22.99 -49.5 -43.84 0.54 1340 +1342 3 23.7 -50.24 -44.58 0.54 1341 +1343 3 24.4 -50.84 -44.78 0.54 1342 +1344 3 25.1 -51.65 -44.91 0.54 1343 +1345 3 26.05 -52.61 -45.59 0.54 1344 +1346 3 27.18 -53.39 -45.65 0.54 1345 +1347 3 27.89 -54.21 -45.72 0.54 1346 +1348 3 28.39 -54.96 -46.62 0.54 1347 +1349 3 29.33 -55.97 -46.77 0.54 1348 +1350 3 30.26 -56.99 -46.85 0.54 1349 +1351 3 31.22 -57.92 -47.83 0.54 1350 +1352 3 31.7 -58.74 -47.97 0.54 1351 +1353 3 31.97 -59.37 -48.03 0.54 1352 +1354 3 32.25 -60.15 -48.64 0.54 1353 +1355 3 32.5 -60.52 -49.13 0.54 1354 +1356 3 32.99 -61.35 -49.27 0.54 1355 +1357 3 33.25 -61.74 -49.61 0.54 1356 +1358 3 33.49 -62.11 -50.02 0.54 1357 +1359 3 33.52 -62.53 -50.13 0.54 1358 +1360 3 33.79 -63.37 -50.3 0.54 1359 +1361 3 33.81 -63.54 -50.68 0.54 1360 +1362 3 15.23 -17.86 2.72 0.65 1196 +1363 3 15.26 -18.31 2.82 0.65 1362 +1364 3 15.74 -18.94 2.92 0.65 1363 +1365 3 16.41 -19.35 3.12 0.65 1364 +1366 3 16.84 -19.57 3.41 0.65 1365 +1367 3 18.16 -20.22 4.13 0.65 1366 +1368 3 18.83 -20.39 4.13 0.65 1367 +1369 3 19.7 -20.81 4.56 0.65 1368 +1370 3 21.0 -21.01 5.17 0.65 1369 +1371 3 22.34 -21.59 5.21 0.65 1370 +1372 3 23.65 -21.71 5.23 0.65 1371 +1373 3 24.79 -22.51 5.18 0.65 1372 +1374 3 25.71 -23.3 5.12 0.65 1373 +1375 3 26.39 -23.92 5.07 0.65 1374 +1376 3 27.29 -24.3 5.13 0.65 1375 +1377 3 28.58 -24.22 5.17 0.65 1376 +1378 3 29.47 -24.37 5.18 0.65 1377 +1379 3 30.55 -24.53 5.19 0.65 1378 +1380 3 31.88 -24.88 5.18 0.65 1379 +1381 3 32.55 -25.26 5.16 0.65 1380 +1382 3 33.22 -25.66 5.28 0.65 1381 +1383 3 33.86 -25.94 7.07 0.435 1382 +1384 3 34.52 -26.12 7.15 0.435 1383 +1385 3 36.08 -26.67 7.13 0.435 1384 +1386 3 36.29 -26.78 7.12 0.435 1385 +1387 3 37.03 -27.74 6.43 0.11 1386 +1388 3 38.98 -27.86 6.69 0.435 1387 +1389 3 41.2 -28.59 6.67 0.435 1388 +1390 3 43.79 -28.43 6.74 0.435 1389 +1391 3 45.55 -28.75 6.75 0.435 1390 +1392 3 47.55 -29.5 6.72 0.435 1391 +1393 3 49.35 -30.68 6.64 0.435 1392 +1394 3 50.06 -31.49 6.58 0.435 1393 +1395 3 51.41 -32.28 6.53 0.435 1394 +1396 3 53.25 -33.34 5.4 0.435 1395 +1397 3 55.69 -34.04 5.32 0.435 1396 +1398 3 56.61 -34.3 4.11 0.435 1397 +1399 3 58.36 -34.38 3.92 0.435 1398 +1400 3 59.27 -34.97 3.8 0.435 1399 +1401 3 59.67 -35.31 5.2 0.435 1400 +1402 3 60.55 -35.51 5.65 0.435 1401 +1403 3 60.99 -35.99 6.37 0.435 1402 +1404 3 62.29 -36.17 6.91 0.435 1403 +1405 3 62.7 -36.22 7.67 0.435 1404 +1406 3 63.38 -36.86 7.84 0.435 1405 +1407 3 65.15 -37.18 7.85 0.435 1406 +1408 3 66.24 -37.56 8.07 0.435 1407 +1409 3 68.62 -37.67 8.57 0.435 1408 +1410 3 71.21 -37.53 8.79 0.435 1409 +1411 3 73.12 -37.0 8.96 0.435 1410 +1412 3 74.0 -37.17 9.05 0.435 1411 +1413 3 75.1 -37.57 9.41 0.435 1412 +1414 3 76.23 -38.4 9.8 0.435 1413 +1415 3 76.9 -39.1 10.73 0.435 1414 +1416 3 77.35 -39.53 10.98 0.435 1415 +1417 3 78.68 -40.13 11.26 0.435 1416 +1418 3 80.02 -40.73 11.53 0.435 1417 +1419 3 81.14 -41.53 11.55 0.435 1418 +1420 3 81.83 -42.14 11.66 0.435 1419 +1421 3 83.41 -43.14 11.66 0.435 1420 +1422 3 84.99 -44.12 11.6 0.435 1421 +1423 3 85.89 -44.71 11.64 0.435 1422 +1424 3 86.81 -45.55 11.94 0.435 1423 +1425 3 87.91 -45.93 12.01 0.435 1424 +1426 3 88.35 -46.11 12.0 0.435 1425 +1427 3 90.36 -46.86 12.04 0.435 1426 +1428 3 91.23 -46.81 12.07 0.435 1427 +1429 3 92.09 -46.76 12.09 0.435 1428 +1430 3 92.71 -46.29 12.16 0.435 1429 +1431 3 93.33 -45.81 12.22 0.435 1430 +1432 3 94.6 -45.31 12.3 0.435 1431 +1433 3 97.19 -45.15 12.38 0.435 1432 +1434 3 98.73 -45.48 12.38 0.435 1433 +1435 3 99.88 -46.28 12.33 0.435 1434 +1436 3 101.02 -47.31 12.4 0.435 1435 +1437 3 101.92 -47.88 12.36 0.435 1436 +1438 3 102.84 -48.7 12.38 0.435 1437 +1439 3 103.49 -48.88 12.38 0.435 1438 +1440 3 104.82 -49.22 12.37 0.435 1439 +1441 3 105.45 -49.28 13.29 0.435 1440 +1442 3 106.54 -49.46 13.59 0.435 1441 +1443 3 106.97 -49.69 13.95 0.435 1442 +1444 3 108.06 -49.88 14.41 0.435 1443 +1445 3 108.76 -50.45 14.0 0.435 1444 +1446 3 109.22 -50.33 13.12 0.435 1445 +1447 3 110.35 -50.57 11.98 0.435 1446 +1448 3 110.39 -50.38 10.2 0.435 1447 +1449 3 111.7 -50.24 9.64 0.435 1448 +1450 3 114.97 -50.22 9.27 0.435 1449 +1451 3 116.93 -50.28 9.01 0.435 1450 +1452 3 118.26 -50.1 8.07 0.435 1451 +1453 3 119.16 -50.45 7.84 0.435 1452 +1454 3 120.53 -51.12 6.66 0.435 1453 +1455 3 121.21 -51.49 6.42 0.435 1454 +1456 3 36.99 -27.48 7.06 0.435 1386 +1457 3 39.19 -28.0 7.13 0.435 1456 +1458 3 40.11 -28.02 5.79 0.435 1457 +1459 3 41.83 -27.92 5.93 0.435 1458 +1460 3 43.56 -27.82 5.98 0.435 1459 +1461 3 45.3 -27.94 6.08 0.435 1460 +1462 3 46.2 -28.3 6.06 0.435 1461 +1463 3 47.24 -27.81 6.07 0.435 1462 +1464 3 48.79 -28.14 6.07 0.435 1463 +1465 3 50.79 -28.87 6.04 0.435 1464 +1466 3 51.7 -29.47 6.0 0.435 1465 +1467 3 52.63 -30.48 5.84 0.435 1466 +1468 3 53.59 -31.93 5.71 0.435 1467 +1469 3 54.56 -33.37 5.58 0.435 1468 +1470 3 55.27 -34.4 5.49 0.435 1469 +1471 3 56.68 -36.05 5.36 0.435 1470 +1472 3 56.93 -36.67 5.3 0.435 1471 +1473 3 57.61 -37.03 4.83 0.11 1472 +1474 3 58.07 -37.48 5.39 0.435 1473 +1475 3 58.71 -37.46 5.56 0.435 1474 +1476 3 59.14 -37.43 5.57 0.435 1475 +1477 3 59.6 -37.83 5.47 0.435 1476 +1478 3 60.07 -38.23 5.44 0.435 1477 +1479 3 60.75 -38.3 4.47 0.435 1478 +1480 3 61.01 -38.64 3.76 0.435 1479 +1481 3 61.69 -38.7 2.57 0.435 1480 +1482 3 62.17 -39.07 2.17 0.435 1481 +1483 3 62.41 -39.2 1.55 0.435 1482 +1484 3 63.11 -39.73 0.83 0.435 1483 +1485 3 63.59 -40.08 0.28 0.435 1484 +1486 3 64.51 -40.57 -0.79 0.435 1485 +1487 3 65.22 -41.38 -0.86 0.435 1486 +1488 3 65.7 -41.71 -1.55 0.435 1487 +1489 3 65.1 -42.41 -1.57 0.435 1488 +1490 3 65.75 -42.58 -1.57 0.435 1489 +1491 3 66.87 -43.16 -1.52 0.435 1490 +1492 3 68.43 -43.72 -1.55 0.435 1491 +1493 3 69.09 -43.89 -1.55 0.435 1492 +1494 3 69.53 -44.07 -1.64 0.435 1493 +1495 3 70.44 -44.4 -2.1 0.435 1494 +1496 3 70.68 -44.27 -3.14 0.435 1495 +1497 3 71.39 -44.77 -4.3 0.435 1496 +1498 3 72.08 -44.86 -5.13 0.435 1497 +1499 3 72.74 -44.74 -5.92 0.435 1498 +1500 3 73.22 -44.81 -6.9 0.435 1499 +1501 3 73.93 -45.61 -7.34 0.435 1500 +1502 3 74.66 -46.32 -8.31 0.435 1501 +1503 3 75.14 -47.14 -8.53 0.435 1502 +1504 3 75.62 -47.72 -8.95 0.435 1503 +1505 3 76.31 -48.32 -9.0 0.435 1504 +1506 3 76.83 -48.8 -10.39 0.435 1505 +1507 3 77.29 -49.4 -10.52 0.435 1506 +1508 3 77.76 -50.02 -10.58 0.435 1507 +1509 3 78.48 -50.78 -11.24 0.435 1508 +1510 3 78.76 -51.05 -12.61 0.435 1509 +1511 3 79.23 -51.67 -12.66 0.435 1510 +1512 3 79.93 -51.94 -13.81 0.435 1511 +1513 3 80.39 -52.13 -13.89 0.435 1512 +1514 3 81.11 -52.88 -14.55 0.435 1513 +1515 3 81.8 -53.47 -14.75 0.435 1514 +1516 3 82.89 -53.59 -14.97 0.435 1515 +1517 3 83.35 -53.98 -15.22 0.435 1516 +1518 3 84.06 -54.24 -16.43 0.435 1517 +1519 3 84.98 -54.79 -16.92 0.435 1518 +1520 3 85.42 -54.7 -17.44 0.435 1519 +1521 3 85.9 -54.75 -18.78 0.435 1520 +1522 3 86.41 -55.49 -19.75 0.435 1521 +1523 3 86.91 -56.0 -20.84 0.435 1522 +1524 3 86.98 -56.5 -22.18 0.435 1523 +1525 3 87.23 -56.89 -22.52 0.435 1524 +1526 3 87.26 -57.06 -23.06 0.435 1525 +1527 3 87.75 -57.85 -23.51 0.435 1526 +1528 3 88.01 -58.19 -24.21 0.435 1527 +1529 3 88.48 -58.57 -24.46 0.435 1528 +1530 3 88.5 -58.7 -25.31 0.435 1529 +1531 3 88.77 -59.33 -25.37 0.435 1530 +1532 3 89.26 -59.61 -26.59 0.435 1531 +1533 3 89.75 -59.87 -27.96 0.435 1532 +1534 3 90.42 -60.23 -28.21 0.435 1533 +1535 3 91.17 -61.15 -29.42 0.435 1534 +1536 3 91.68 -62.15 -29.96 0.435 1535 +1537 3 92.39 -62.96 -30.03 0.435 1536 +1538 3 92.39 -62.95 -30.17 0.435 1537 +1539 3 92.4 -62.89 -30.77 0.435 1538 +1540 3 92.44 -63.28 -31.19 0.435 1539 +1541 3 92.48 -63.67 -31.6 0.435 1540 +1542 3 92.71 -63.56 -32.57 0.435 1541 +1543 3 92.94 -63.74 -32.73 0.435 1542 +1544 3 93.2 -63.88 -33.5 0.435 1543 +1545 3 93.43 -64.01 -34.11 0.435 1544 +1546 3 93.9 -64.14 -34.71 0.435 1545 +1547 3 94.13 -64.27 -35.24 0.435 1546 +1548 3 94.6 -64.44 -35.55 0.435 1547 +1549 3 94.81 -64.42 -35.63 0.435 1548 +1550 3 95.05 -64.57 -36.16 0.435 1549 +1551 3 95.95 -64.93 -36.33 0.435 1550 +1552 3 96.39 -65.11 -36.33 0.435 1551 +1553 3 96.86 -65.23 -37.09 0.435 1552 +1554 3 97.54 -65.56 -37.56 0.435 1553 +1555 3 98.22 -65.7 -38.01 0.435 1554 +1556 3 98.68 -65.8 -38.83 0.435 1555 +1557 3 99.39 -66.07 -39.98 0.435 1556 +1558 3 100.51 -66.64 -40.08 0.435 1557 +1559 3 100.73 -66.62 -40.16 0.435 1558 +1560 3 100.97 -66.75 -40.84 0.435 1559 +1561 3 101.22 -66.64 -41.88 0.435 1560 +1562 3 101.88 -66.51 -42.67 0.435 1561 +1563 3 102.11 -66.42 -43.41 0.435 1562 +1564 3 102.98 -66.35 -43.54 0.435 1563 +1565 3 103.64 -66.26 -44.04 0.435 1564 +1566 3 104.3 -66.18 -44.47 0.435 1565 +1567 3 105.4 -66.07 -44.81 0.435 1566 +1568 3 106.04 -66.02 -44.79 0.435 1567 +1569 3 106.7 -65.93 -45.3 0.435 1568 +1570 3 107.35 -65.88 -45.35 0.435 1569 +1571 3 108.21 -65.31 -46.02 0.435 1570 +1572 3 108.86 -65.26 -46.23 0.435 1571 +1573 3 57.45 -37.93 5.18 0.435 1472 +1574 3 58.41 -39.38 5.05 0.435 1573 +1575 3 60.03 -41.0 4.92 0.435 1574 +1576 3 61.15 -41.56 4.74 0.435 1575 +1577 3 62.73 -42.29 4.33 0.435 1576 +1578 3 64.53 -43.26 4.27 0.435 1577 +1579 3 65.45 -43.49 2.91 0.435 1578 +1580 3 66.15 -43.82 2.29 0.435 1579 +1581 3 66.59 -43.97 1.91 0.435 1580 +1582 3 67.75 -44.47 1.14 0.435 1581 +1583 3 68.43 -44.78 0.44 0.435 1582 +1584 3 69.98 -45.06 -0.15 0.435 1583 +1585 3 70.49 -45.56 -1.39 0.435 1584 +1586 3 71.18 -46.16 -1.43 0.435 1585 +1587 3 71.43 -46.25 -2.57 0.435 1586 +1588 3 71.94 -46.75 -3.67 0.435 1587 +1589 3 72.45 -48.01 -3.86 0.435 1588 +1590 3 72.46 -48.21 -3.96 0.435 1589 +1591 3 73.2 -49.67 -4.09 0.435 1590 +1592 3 73.29 -50.15 -5.72 0.435 1591 +1593 3 73.79 -51.15 -6.19 0.435 1592 +1594 3 74.07 -51.95 -6.72 0.435 1593 +1595 3 74.61 -53.11 -7.8 0.435 1594 +1596 3 74.89 -53.91 -8.33 0.435 1595 +1597 3 75.4 -54.95 -8.5 0.435 1596 +1598 3 75.71 -56.18 -9.15 0.435 1597 +1599 3 75.77 -57.02 -9.3 0.435 1598 +1600 3 76.27 -58.05 -9.55 0.435 1599 +1601 3 76.8 -59.28 -9.97 0.435 1600 +1602 3 77.35 -60.91 -10.66 0.435 1601 +1603 3 77.43 -62.18 -10.86 0.435 1602 +1604 3 77.03 -62.62 -11.06 0.435 1603 +1605 3 77.09 -62.94 -12.23 0.435 1604 +1606 3 77.37 -63.69 -13.21 0.435 1605 +1607 3 77.43 -64.54 -13.29 0.435 1606 +1608 3 77.99 -66.44 -13.48 0.435 1607 +1609 3 78.69 -67.26 -13.61 0.435 1608 +1610 3 79.22 -68.19 -14.75 0.435 1609 +1611 3 79.5 -69.25 -14.86 0.435 1610 +1612 3 33.53 -26.95 5.16 0.435 1382 +1613 3 33.0 -28.91 4.94 0.435 1612 +1614 3 33.95 -30.35 4.81 0.435 1613 +1615 3 34.47 -31.4 4.72 0.435 1614 +1616 3 35.16 -31.81 4.69 0.435 1615 +1617 3 35.41 -31.89 3.4 0.435 1616 +1618 3 36.91 -31.37 3.49 0.435 1617 +1619 3 37.35 -31.51 3.11 0.435 1618 +1620 3 38.63 -31.0 3.12 0.435 1619 +1621 3 39.75 -31.35 3.04 0.435 1620 +1622 3 41.08 -31.37 1.86 0.435 1621 +1623 3 42.41 -31.44 1.28 0.435 1622 +1624 3 44.82 -31.65 0.56 0.435 1623 +1625 3 46.34 -31.51 0.16 0.435 1624 +1626 3 47.45 -31.38 -0.39 0.435 1625 +1627 3 48.32 -31.53 -0.46 0.435 1626 +1628 3 49.9 -31.99 -1.45 0.435 1627 +1629 3 51.03 -32.55 -1.64 0.435 1628 +1630 3 52.16 -33.1 -1.82 0.435 1629 +1631 3 52.62 -33.49 -2.0 0.435 1630 +1632 3 52.66 -33.84 -2.86 0.435 1631 +1633 3 53.13 -34.45 -2.91 0.435 1632 +1634 3 53.41 -35.28 -3.22 0.435 1633 +1635 3 53.66 -35.67 -3.48 0.435 1634 +1636 3 54.13 -36.29 -3.53 0.435 1635 +1637 3 54.61 -36.89 -3.66 0.435 1636 +1638 3 56.82 -37.37 -4.03 0.435 1637 +1639 3 57.92 -37.2 -4.97 0.435 1638 +1640 3 58.82 -37.28 -5.78 0.435 1639 +1641 3 60.17 -37.78 -6.33 0.435 1640 +1642 3 61.29 -37.82 -7.44 0.435 1641 +1643 3 62.84 -37.83 -8.53 0.435 1642 +1644 3 63.31 -37.95 -9.14 0.435 1643 +1645 3 63.99 -38.31 -9.39 0.435 1644 +1646 3 64.7 -38.82 -10.33 0.435 1645 +1647 3 65.4 -39.36 -11.12 0.435 1646 +1648 3 66.36 -40.3 -11.94 0.435 1647 +1649 3 68.16 -41.26 -12.08 0.435 1648 +1650 3 35.47 -33.7 4.5 0.435 1616 +1651 3 35.98 -34.75 4.41 0.435 1650 +1652 3 36.08 -36.25 4.25 0.435 1651 +1653 3 36.6 -37.72 4.11 0.435 1652 +1654 3 36.73 -39.87 3.9 0.435 1653 +1655 3 36.49 -42.68 3.6 0.435 1654 +1656 3 36.15 -44.21 3.43 0.435 1655 +1657 3 36.21 -45.28 3.32 0.435 1656 +1658 3 36.71 -46.1 3.25 0.435 1657 +1659 3 37.21 -47.15 3.15 0.435 1658 +1660 3 37.7 -48.2 3.06 0.435 1659 +1661 3 37.32 -48.87 2.98 0.435 1660 +1662 3 36.54 -50.42 2.8 0.435 1661 +1663 3 36.67 -52.56 2.65 0.435 1662 +1664 3 36.39 -54.73 2.42 0.435 1663 +1665 3 36.73 -56.64 2.23 0.435 1664 +1666 3 36.95 -57.17 3.09 0.435 1665 +1667 3 37.01 -58.52 3.77 0.435 1666 +1668 3 37.3 -59.02 2.3 0.435 1667 +1669 3 37.0 -60.16 0.6 0.435 1668 +1670 3 37.08 -61.43 0.23 0.435 1669 +1671 3 37.42 -63.04 -0.67 0.435 1670 +1672 3 38.13 -63.82 -1.18 0.435 1671 +1673 3 38.39 -64.14 -2.12 0.435 1672 +1674 3 38.67 -64.98 -2.27 0.435 1673 +1675 3 39.16 -65.8 -2.42 0.435 1674 +1676 3 39.19 -66.23 -2.47 0.435 1675 +1677 3 39.27 -67.51 -2.6 0.435 1676 +1678 3 39.32 -68.36 -2.68 0.435 1677 +1679 3 39.38 -68.96 -3.27 0.435 1678 +1680 3 40.09 -69.76 -3.41 0.435 1679 +1681 3 41.05 -71.22 -3.54 0.435 1680 +1682 3 41.35 -71.91 -5.03 0.435 1681 +1683 3 41.62 -72.74 -5.26 0.435 1682 +1684 3 41.69 -73.81 -5.37 0.435 1683 +1685 3 41.79 -74.76 -6.75 0.435 1684 +1686 3 41.85 -75.61 -6.83 0.435 1685 +1687 3 42.38 -77.3 -6.99 0.435 1686 +1688 3 42.66 -78.13 -7.07 0.435 1687 +1689 3 42.93 -78.99 -7.16 0.435 1688 +1690 3 43.39 -79.39 -7.27 0.435 1689 +1691 3 43.45 -79.68 -8.65 0.435 1690 +1692 3 43.56 -81.09 -9.55 0.435 1691 +1693 3 43.91 -83.0 -9.74 0.435 1692 +1694 3 44.16 -83.62 -10.02 0.435 1693 +1695 3 44.45 -84.39 -10.78 0.435 1694 +1696 3 44.53 -85.13 -12.05 0.435 1695 +1697 3 44.61 -86.18 -12.24 0.435 1696 +1698 3 44.67 -86.73 -13.2 0.435 1697 +1699 3 44.79 -88.14 -14.31 0.435 1698 +1700 3 44.89 -89.37 -15.04 0.435 1699 +1701 3 45.42 -90.54 -15.91 0.435 1700 +1702 3 45.47 -91.39 -15.99 0.435 1701 +1703 3 45.57 -92.86 -16.59 0.435 1702 +1704 3 46.01 -92.83 -16.66 0.435 1703 +1705 3 46.53 -94.07 -16.78 0.435 1704 +1706 3 46.87 -95.99 -16.97 0.435 1705 +1707 3 46.12 -97.97 -17.19 0.435 1706 +1708 3 46.2 -99.25 -17.32 0.435 1707 +1709 3 47.16 -100.23 -17.85 0.435 1708 +1710 3 48.5 -100.77 -18.18 0.435 1709 +1711 3 49.42 -101.57 -18.24 0.435 1710 +1712 3 49.94 -102.28 -19.35 0.435 1711 +1713 3 49.98 -102.64 -20.07 0.435 1712 +1714 3 49.19 -103.97 -20.37 0.435 1713 +1715 3 49.26 -105.04 -20.55 0.435 1714 +1716 3 49.12 -105.91 -20.73 0.435 1715 +1717 3 49.18 -106.2 -22.11 0.435 1716 +1718 3 48.81 -106.52 -23.51 0.435 1717 +1719 3 48.86 -107.11 -24.1 0.435 1718 +1720 3 48.9 -106.93 -25.89 0.435 1719 +1721 3 48.95 -107.26 -26.89 0.435 1720 +1722 3 48.57 -107.9 -27.05 0.435 1721 +1723 3 48.61 -108.28 -27.69 0.435 1722 +1724 3 48.22 -108.89 -28.29 0.435 1723 +1725 3 48.26 -109.26 -28.86 0.435 1724 +1726 3 48.75 -109.87 -28.98 0.435 1725 +1727 3 48.85 -111.32 -29.66 0.435 1726 +1728 3 48.94 -112.04 -31.08 0.435 1727 +1729 3 49.19 -112.14 -32.07 0.435 1728 +1730 3 49.25 -112.99 -32.23 0.435 1729 +1731 3 49.3 -113.84 -32.39 0.435 1730 +1732 3 49.33 -114.26 -32.44 0.435 1731 +1733 3 49.24 -115.37 -34.36 0.435 1732 +1734 3 48.47 -116.65 -35.19 0.435 1733 +1735 3 48.53 -117.24 -35.78 0.435 1734 +1736 3 47.52 -118.09 -36.57 0.435 1735 +1737 3 47.76 -118.21 -37.4 0.435 1736 +1738 3 47.83 -118.75 -38.44 0.435 1737 +1739 3 47.84 -118.68 -39.1 0.435 1738 +1740 3 47.91 -119.48 -39.79 0.435 1739 +1741 3 47.56 -120.27 -40.78 0.435 1740 +1742 3 47.43 -121.51 -41.37 0.435 1741 +1743 3 47.06 -122.39 -41.62 0.435 1742 +1744 3 47.13 -122.92 -42.66 0.435 1743 +1745 3 47.18 -123.5 -43.39 0.435 1744 +1746 3 46.82 -124.33 -44.16 0.435 1745 +1747 3 46.26 -125.64 -44.39 0.435 1746 +1748 3 45.92 -126.9 -44.98 0.435 1747 +1749 3 45.56 -127.41 -46.62 0.435 1748 +1750 3 45.21 -127.94 -47.97 0.435 1749 +1751 3 45.26 -128.27 -48.98 0.435 1750 +1752 3 44.88 -129.1 -49.59 0.435 1751 +1753 3 44.96 -129.86 -50.73 0.435 1752 +1754 3 45.01 -129.96 -51.79 0.435 1753 +1755 3 45.29 -130.78 -52.1 0.435 1754 +1756 3 45.55 -131.13 -52.73 0.435 1755 +1757 3 45.8 -131.97 -52.89 0.435 1756 +1758 3 45.87 -132.55 -53.63 0.435 1757 +1759 3 45.92 -133.39 -53.78 0.435 1758 +1760 3 45.99 -133.95 -54.68 0.435 1759 +1761 3 46.02 -134.06 -55.58 0.435 1760 +1762 3 46.07 -134.7 -55.8 0.435 1761 +1763 3 46.13 -135.21 -57.14 0.435 1762 +1764 3 46.18 -135.55 -57.99 0.435 1763 +1765 3 46.47 -136.09 -58.95 0.435 1764 +1766 3 46.52 -136.94 -59.12 0.435 1765 +1767 3 46.33 -137.37 -59.16 0.435 1766 +1768 3 46.15 -138.07 -58.94 0.435 1767 +1769 3 46.2 -138.71 -59.0 0.435 1768 +1770 3 45.82 -139.02 -60.47 0.435 1769 +1771 3 45.48 -140.08 -61.5 0.435 1770 +1772 3 45.18 -141.44 -63.3 0.435 1771 +1773 3 45.31 -142.81 -64.72 0.435 1772 +1774 3 44.53 -144.1 -65.32 0.435 1773 +1775 3 43.31 -145.24 -65.55 0.435 1774 +1776 3 42.27 -145.43 -66.5 0.435 1775 +1777 3 41.27 -146.17 -68.4 0.435 1776 +1778 3 40.0 -146.41 -68.91 0.435 1777 +1779 3 39.34 -145.95 -69.48 0.435 1778 +1780 3 39.12 -145.47 -70.19 0.435 1779 +1781 3 38.27 -145.19 -71.39 0.435 1780 +1782 3 37.66 -145.04 -73.27 0.435 1781 +1783 3 36.18 -145.51 -73.8 0.435 1782 +1784 3 35.38 -145.9 -74.77 0.435 1783 +1785 3 34.75 -146.09 -75.4 0.435 1784 +1786 3 34.36 -146.47 -76.14 0.435 1785 +1787 3 -1.87 -7.91 -3.58 1.95 1 +1788 3 -1.88 -7.93 -3.36 1.95 1787 +1789 3 -2.04 -8.83 -3.3 1.41 1788 +1790 3 -2.46 -9.07 -3.26 1.41 1789 +1791 3 -3.08 -9.83 -2.6 1.41 1790 +1792 3 -3.06 -9.74 -3.49 1.41 1791 +1793 3 -3.22 -10.82 -3.61 1.085 1792 +1794 3 -3.62 -11.28 -3.6 1.085 1793 +1795 3 -3.6 -11.71 -3.64 1.085 1794 +1796 3 -3.75 -12.58 -3.73 1.085 1795 +1797 3 -4.61 -13.19 -2.61 0.65 1796 +1798 3 -5.76 -12.39 -2.55 0.65 1797 +1799 3 -6.84 -12.46 -2.59 0.65 1798 +1800 3 -7.88 -12.95 -2.73 0.54 1799 +1801 3 -9.8 -13.5 -2.83 0.54 1800 +1802 3 -11.46 -15.43 -1.95 0.54 1801 +1803 3 -12.71 -16.16 -1.97 0.54 1802 +1804 3 -14.18 -16.92 -1.86 0.54 1803 +1805 3 -14.62 -17.46 -1.1 0.54 1804 +1806 3 -15.03 -17.97 -0.55 0.54 1805 +1807 3 -16.51 -18.73 -0.52 0.54 1806 +1808 3 -18.18 -19.97 -0.09 0.54 1807 +1809 3 -19.0 -20.9 0.01 0.54 1808 +1810 3 -21.24 -23.21 -0.12 0.54 1809 +1811 3 -22.87 -24.8 -0.32 0.54 1810 +1812 3 -23.72 -25.31 -0.17 0.54 1811 +1813 3 -25.62 -26.08 -0.22 0.54 1812 +1814 3 -27.32 -26.62 -0.31 0.54 1813 +1815 3 -27.56 -26.2 -0.27 0.54 1814 +1816 3 -27.89 -26.6 -2.96 0.325 1815 +1817 3 -28.28 -26.66 -4.71 0.435 1816 +1818 3 -29.08 -27.58 -4.68 0.435 1817 +1819 3 -29.71 -28.06 -4.66 0.435 1818 +1820 3 -30.73 -28.96 -5.08 0.435 1819 +1821 3 -31.54 -29.34 -6.12 0.435 1820 +1822 3 -32.36 -30.03 -6.22 0.435 1821 +1823 3 -33.65 -30.31 -6.35 0.435 1822 +1824 3 -34.95 -30.13 -6.89 0.435 1823 +1825 3 -36.89 -29.95 -7.66 0.435 1824 +1826 3 -38.44 -29.16 -7.92 0.435 1825 +1827 3 -39.74 -29.23 -8.04 0.435 1826 +1828 3 -41.47 -29.29 -8.46 0.435 1827 +1829 3 -42.54 -29.1 -8.91 0.435 1828 +1830 3 -43.6 -29.37 -9.05 0.435 1829 +1831 3 -44.43 -29.53 -10.14 0.435 1830 +1832 3 -45.26 -29.94 -10.88 0.435 1831 +1833 3 -46.06 -30.84 -11.07 0.435 1832 +1834 3 -46.88 -31.53 -11.31 0.435 1833 +1835 3 -48.15 -32.0 -11.76 0.435 1834 +1836 3 -50.03 -32.69 -12.56 0.435 1835 +1837 3 -51.76 -32.78 -12.68 0.435 1836 +1838 3 -53.27 -32.29 -14.17 0.435 1837 +1839 3 -54.79 -32.14 -14.57 0.435 1838 +1840 3 -56.09 -32.22 -14.6 0.435 1839 +1841 3 -57.58 -32.51 -14.67 0.435 1840 +1842 3 -59.07 -32.49 -15.84 0.435 1841 +1843 3 -60.63 -31.7 -16.1 0.435 1842 +1844 3 -62.14 -31.78 -16.21 0.435 1843 +1845 3 -62.1 -31.63 -17.63 0.435 1844 +1846 3 -63.39 -31.94 -17.61 0.435 1845 +1847 3 -64.26 -32.01 -17.49 0.435 1846 +1848 3 -65.77 -31.8 -18.34 0.435 1847 +1849 3 -66.64 -31.33 -19.22 0.435 1848 +1850 3 -67.73 -31.4 -19.25 0.435 1849 +1851 3 -68.99 -31.91 -19.33 0.435 1850 +1852 3 -69.81 -32.58 -19.57 0.435 1851 +1853 3 -70.85 -33.03 -20.09 0.435 1852 +1854 3 -72.31 -33.43 -21.3 0.435 1853 +1855 3 -73.8 -33.95 -21.46 0.435 1854 +1856 3 -75.25 -35.11 -21.61 0.435 1855 +1857 3 -75.62 -36.0 -21.79 0.435 1856 +1858 3 -76.68 -36.26 -21.92 0.435 1857 +1859 3 -77.28 -36.92 -22.23 0.435 1858 +1860 3 -78.33 -37.41 -22.31 0.435 1859 +1861 3 -79.2 -37.47 -22.33 0.435 1860 +1862 3 -80.76 -36.91 -22.31 0.435 1861 +1863 3 -82.03 -37.17 -22.74 0.435 1862 +1864 3 -82.64 -37.57 -23.4 0.435 1863 +1865 3 -82.59 -37.89 -24.57 0.435 1864 +1866 3 -83.61 -38.56 -25.11 0.435 1865 +1867 3 -84.89 -38.85 -25.24 0.435 1866 +1868 3 -86.38 -39.1 -25.69 0.435 1867 +1869 3 -88.12 -38.99 -25.79 0.435 1868 +1870 3 -88.91 -39.37 -25.85 0.435 1869 +1871 3 -88.62 -39.85 -27.32 0.435 1870 +1872 3 -88.58 -40.5 -27.31 0.435 1871 +1873 3 -88.48 -41.47 -28.47 0.435 1872 +1874 3 -88.86 -42.07 -29.21 0.435 1873 +1875 3 -89.02 -42.39 -30.38 0.435 1874 +1876 3 -89.41 -43.06 -30.46 0.435 1875 +1877 3 -89.78 -44.43 -30.08 0.435 1876 +1878 3 -89.73 -45.33 -29.87 0.435 1877 +1879 3 -89.9 -45.14 -31.75 0.435 1878 +1880 3 -90.28 -45.47 -32.99 0.435 1879 +1881 3 -90.64 -46.28 -33.76 0.435 1880 +1882 3 -91.0 -46.55 -35.61 0.435 1881 +1883 3 -90.93 -47.32 -36.44 0.435 1882 +1884 3 -91.75 -48.01 -36.6 0.435 1883 +1885 3 -91.71 -47.84 -38.24 0.435 1884 +1886 3 -92.08 -48.68 -38.86 0.435 1885 +1887 3 -92.45 -49.24 -39.91 0.435 1886 +1888 3 -92.85 -49.41 -40.7 0.435 1887 +1889 3 -92.81 -49.77 -41.4 0.435 1888 +1890 3 -92.77 -50.14 -42.05 0.435 1889 +1891 3 -92.49 -50.74 -42.33 0.435 1890 +1892 3 -92.24 -51.08 -43.12 0.435 1891 +1893 3 -92.2 -51.72 -43.25 0.435 1892 +1894 3 -92.15 -52.33 -43.62 0.54 1893 +1895 3 -92.09 -53.16 -44.0 0.54 1894 +1896 3 -91.57 -53.91 -44.82 0.54 1895 +1897 3 -91.29 -54.68 -45.57 0.54 1896 +1898 3 -90.78 -55.44 -46.39 0.54 1897 +1899 3 -90.56 -55.61 -46.63 0.54 1898 +1900 3 -90.5 -56.2 -47.21 0.54 1899 +1901 3 -90.46 -56.6 -47.56 0.54 1900 +1902 3 -90.41 -57.16 -48.45 0.54 1901 +1903 3 -90.37 -57.53 -49.09 0.54 1902 +1904 3 -90.3 -57.8 -50.61 0.54 1903 +1905 3 -90.24 -58.61 -51.15 0.54 1904 +1906 3 -90.16 -59.68 -51.34 0.54 1905 +1907 3 -90.07 -60.91 -51.99 0.54 1906 +1908 3 -89.99 -61.66 -53.12 0.54 1907 +1909 3 -89.92 -62.45 -53.8 0.54 1908 +1910 3 -90.68 -63.45 -55.21 0.54 1909 +1911 3 -91.25 -64.48 -55.93 0.54 1910 +1912 3 -91.35 -65.92 -56.98 0.54 1911 +1913 3 -91.27 -66.66 -58.11 0.54 1912 +1914 3 -91.63 -67.47 -58.89 0.54 1913 +1915 3 -91.53 -68.39 -60.49 0.54 1914 +1916 3 -91.41 -69.8 -61.54 0.54 1915 +1917 3 -91.8 -70.16 -62.41 0.54 1916 +1918 3 -92.15 -70.67 -64.13 0.54 1917 +1919 3 -92.09 -70.98 -65.28 0.54 1918 +1920 3 -92.02 -71.76 -66.05 0.54 1919 +1921 3 -92.4 -72.14 -67.0 0.54 1920 +1922 3 -92.79 -72.7 -68.04 0.54 1921 +1923 3 -93.58 -73.06 -69.38 0.54 1922 +1924 3 -93.97 -73.66 -70.05 0.54 1923 +1925 3 -93.89 -74.42 -71.03 0.54 1924 +1926 3 -93.85 -75.06 -71.1 0.54 1925 +1927 3 -94.65 -75.98 -71.21 0.54 1926 +1928 3 -95.45 -76.79 -72.22 0.54 1927 +1929 3 -95.4 -77.13 -73.16 0.54 1928 +1930 3 -96.18 -78.18 -74.04 0.54 1929 +1931 3 -96.97 -79.02 -74.68 0.54 1930 +1932 3 -97.36 -79.39 -75.7 0.54 1931 +1933 3 -97.69 -80.37 -76.87 0.54 1932 +1934 3 -98.46 -81.62 -77.99 0.54 1933 +1935 3 -98.36 -82.84 -78.65 0.54 1934 +1936 3 -98.72 -83.66 -79.41 0.54 1935 +1937 3 -99.08 -84.75 -79.62 0.54 1936 +1938 3 -99.65 -86.07 -79.77 0.54 1937 +1939 3 -99.39 -86.71 -79.83 0.54 1938 +1940 3 -100.16 -87.71 -81.07 0.54 1939 +1941 3 -99.83 -88.59 -83.04 0.54 1940 +1942 3 -99.76 -89.35 -83.87 0.54 1941 +1943 3 -100.11 -90.41 -84.44 0.54 1942 +1944 3 -100.04 -91.23 -84.82 0.54 1943 +1945 3 -99.95 -92.47 -85.48 0.54 1944 +1946 3 -100.27 -93.91 -86.39 0.54 1945 +1947 3 -101.05 -95.23 -86.77 0.54 1946 +1948 3 -101.36 -96.67 -87.76 0.54 1947 +1949 3 -102.33 -98.39 -88.56 0.54 1948 +1950 3 -103.48 -100.29 -89.76 0.54 1949 +1951 3 -103.38 -101.25 -90.99 0.54 1950 +1952 3 -104.15 -102.8 -91.25 0.54 1951 +1953 3 -104.07 -103.86 -91.35 0.54 1952 +1954 3 -104.45 -104.47 -92.03 0.54 1953 +1955 3 -104.81 -105.51 -92.75 0.54 1954 +1956 3 -104.92 -106.98 -93.36 0.54 1955 +1957 3 -105.29 -107.85 -93.61 0.54 1956 +1958 3 -105.24 -108.19 -94.46 0.54 1957 +1959 3 -105.18 -108.49 -95.77 0.54 1958 +1960 3 -105.15 -108.87 -96.19 0.54 1959 +1961 3 -89.59 -39.42 -26.77 0.435 1870 +1962 3 -89.56 -39.53 -27.76 0.435 1961 +1963 3 -90.37 -39.98 -28.13 0.435 1962 +1964 3 -90.98 -40.36 -29.08 0.435 1963 +1965 3 -91.79 -40.73 -30.2 0.435 1964 +1966 3 -92.64 -41.21 -30.27 0.435 1965 +1967 3 -93.68 -41.67 -30.79 0.435 1966 +1968 3 -95.95 -43.02 -31.74 0.435 1967 +1969 3 -97.62 -43.97 -31.96 0.435 1968 +1970 3 -99.09 -44.69 -32.29 0.435 1969 +1971 3 -99.72 -44.91 -32.63 0.435 1970 +1972 3 -99.82 -45.64 -33.01 0.435 1971 +1973 3 -100.84 -46.57 -33.13 0.435 1972 +1974 3 -102.96 -47.34 -33.33 0.435 1973 +1975 3 -102.94 -47.24 -34.3 0.435 1974 +1976 3 -104.01 -47.24 -34.93 0.435 1975 +1977 3 -105.07 -47.5 -35.13 0.435 1976 +1978 3 -106.13 -47.47 -36.06 0.435 1977 +1979 3 -107.51 -46.27 -35.97 0.435 1978 +1980 3 -108.82 -45.89 -36.33 0.435 1979 +1981 3 -110.63 -44.67 -36.55 0.435 1980 +1982 3 -112.17 -44.29 -36.93 0.435 1981 +1983 3 -113.02 -44.03 -37.9 0.435 1982 +1984 3 -113.93 -43.17 -38.37 0.435 1983 +1985 3 -115.29 -41.94 -38.64 0.435 1984 +1986 3 -117.25 -41.52 -39.55 0.435 1985 +1987 3 -118.36 -41.16 -39.54 0.435 1986 +1988 3 -119.26 -40.03 -40.5 0.435 1987 +1989 3 -120.39 -39.46 -40.54 0.435 1988 +1990 3 -120.86 -38.55 -41.06 0.435 1989 +1991 3 -121.96 -37.94 -41.47 0.435 1990 +1992 3 -121.97 -37.43 -42.18 0.435 1991 +1993 3 -122.65 -37.31 -41.73 0.435 1992 +1994 3 -123.55 -36.94 -41.64 0.435 1993 +1995 3 -124.24 -36.35 -41.51 0.435 1994 +1996 3 -124.91 -35.66 -42.21 0.435 1995 +1997 3 -125.56 -35.17 -43.16 0.435 1996 +1998 3 -28.4 -26.9 -0.37 0.54 1815 +1999 3 -29.67 -27.43 -0.15 0.54 1998 +2000 3 -31.37 -27.97 -0.25 0.54 1999 +2001 3 -33.05 -28.72 -0.36 0.54 2000 +2002 3 -34.27 -30.09 -0.46 0.54 2001 +2003 3 -34.25 -30.55 -0.13 0.54 2002 +2004 3 -34.16 -31.84 -0.19 0.54 2003 +2005 3 -34.76 -33.54 1.05 0.54 2004 +2006 3 -34.73 -34.24 1.65 0.54 2005 +2007 3 -35.5 -35.53 0.98 0.54 2006 +2008 3 -36.74 -36.18 0.13 0.54 2007 +2009 3 -38.38 -37.28 -0.77 0.54 2008 +2010 3 -39.59 -38.59 -1.39 0.54 2009 +2011 3 -40.41 -39.27 -1.56 0.54 2010 +2012 3 -41.17 -40.83 -1.74 0.54 2011 +2013 3 -41.78 -41.48 -2.12 0.54 2012 +2014 3 -42.79 -42.63 -2.26 0.54 2013 +2015 3 -44.67 -43.8 -2.43 0.54 2014 +2016 3 -45.9 -44.67 -3.3 0.54 2015 +2017 3 -46.01 -45.92 -3.89 0.54 2016 +2018 3 -45.96 -46.55 -4.09 0.54 2017 +2019 3 -46.75 -47.88 -4.25 0.54 2018 +2020 3 -47.39 -48.98 -2.5 0.54 2019 +2021 3 -48.17 -50.31 -2.65 0.54 2020 +2022 3 -49.0 -51.33 -1.8 0.54 2021 +2023 3 -50.02 -52.49 -1.65 0.54 2022 +2024 3 -50.81 -53.86 -1.57 0.54 2023 +2025 3 -51.17 -55.43 -1.22 0.54 2024 +2026 3 -51.56 -56.12 -1.15 0.54 2025 +2027 3 -52.39 -56.84 -0.95 0.54 2026 +2028 3 -52.8 -57.34 -0.62 0.54 2027 +2029 3 -53.21 -57.83 -0.31 0.54 2028 +2030 3 -53.62 -58.58 0.34 0.54 2029 +2031 3 -53.63 -59.16 1.71 0.54 2030 +2032 3 -54.47 -59.7 2.24 0.54 2031 +2033 3 -54.47 -60.22 3.17 0.54 2032 +2034 3 -54.46 -60.71 3.72 0.54 2033 +2035 3 -54.87 -61.71 4.67 0.54 2034 +2036 3 -55.65 -62.83 4.53 0.54 2035 +2037 3 -56.45 -64.19 4.59 0.54 2036 +2038 3 -56.83 -65.1 4.79 0.54 2037 +2039 3 -57.6 -66.92 5.11 0.54 2038 +2040 3 -58.63 -68.15 5.79 0.54 2039 +2041 3 -59.27 -69.24 7.54 0.54 2040 +2042 3 -3.66 -14.09 -3.89 0.76 1796 +2043 3 -2.93 -15.33 -4.0 0.76 2042 +2044 3 -2.9 -15.76 -3.96 0.76 2043 +2045 3 -2.63 -16.31 -4.77 0.76 2044 +2046 3 -2.41 -16.85 -3.69 0.76 2045 +2047 3 -2.19 -17.34 -2.9 0.76 2046 +2048 3 -1.95 -17.78 -2.79 0.76 2047 +2049 3 -1.73 -18.35 -1.34 0.76 2048 +2050 3 -1.26 -19.25 -0.74 0.76 2049 +2051 3 -0.57 -20.09 -0.51 0.76 2050 +2052 3 -0.09 -20.96 -0.36 0.76 2051 +2053 3 0.37 -21.37 -0.32 0.76 2052 +2054 3 0.6 -21.79 -0.21 0.76 2053 +2055 3 1.29 -22.4 -0.18 0.76 2054 +2056 3 2.21 -23.23 -0.02 0.76 2055 +2057 3 2.66 -23.65 0.09 0.76 2056 +2058 3 3.35 -24.25 0.05 0.76 2057 +2059 3 3.58 -24.72 0.46 0.76 2058 +2060 3 4.04 -25.12 0.49 0.76 2059 +2061 3 4.28 -26.09 1.61 0.65 2060 +2062 3 4.53 -26.49 1.42 0.65 2061 +2063 3 4.76 -26.95 1.76 0.65 2062 +2064 3 5.2 -27.72 3.12 0.65 2063 +2065 3 5.42 -28.21 3.91 0.65 2064 +2066 3 5.43 -28.5 4.62 0.65 2065 +2067 3 5.45 -29.19 5.0 0.65 2066 +2068 3 5.71 -29.85 5.24 0.65 2067 +2069 3 5.93 -30.33 5.88 0.65 2068 +2070 3 5.95 -31.06 6.63 0.65 2069 +2071 3 5.95 -31.32 7.14 0.65 2070 +2072 3 6.19 -31.79 7.55 0.65 2071 +2073 3 6.47 -32.85 7.45 0.65 2072 +2074 3 6.77 -34.12 7.32 0.65 2073 +2075 3 6.81 -34.79 7.47 0.65 2074 +2076 3 7.27 -35.46 7.95 0.65 2075 +2077 3 7.73 -36.08 8.05 0.65 2076 +2078 3 8.43 -36.94 8.28 0.65 2077 +2079 3 8.9 -37.58 8.44 0.65 2078 +2080 3 9.81 -38.7 9.4 0.65 2079 +2081 3 10.05 -39.16 9.73 0.65 2080 +2082 3 10.58 -40.88 9.95 0.65 2081 +2083 3 11.04 -41.53 10.2 0.65 2082 +2084 3 11.3 -42.42 10.56 0.65 2083 +2085 3 11.36 -43.28 10.47 0.65 2084 +2086 3 11.6 -43.72 10.74 0.65 2085 +2087 3 11.83 -44.15 10.85 0.65 2086 +2088 3 12.08 -44.57 10.81 0.65 2087 +2089 4 -1.69 6.41 -3.07 2.06 1 +2090 4 -3.12 8.26 -2.91 1.085 2089 +2091 4 -4.24 9.64 -4.3 0.975 2090 +2092 4 -4.45 10.02 -4.27 0.975 2091 +2093 4 -4.03 10.53 -4.74 0.54 2092 +2094 4 -3.64 11.2 -4.66 0.54 2093 +2095 4 -3.02 11.88 -4.57 0.54 2094 +2096 4 -2.19 12.41 -5.02 0.54 2095 +2097 4 -1.95 13.03 -6.76 0.54 2096 +2098 4 -1.74 13.57 -7.53 0.54 2097 +2099 4 -1.69 13.77 -9.46 0.54 2098 +2100 4 -1.03 13.86 -10.04 0.54 2099 +2101 4 -0.87 14.73 -10.03 0.54 2100 +2102 4 -0.44 15.3 -10.94 0.54 2101 +2103 4 -0.26 16.28 -11.89 0.54 2102 +2104 4 -0.07 17.24 -12.69 0.54 2103 +2105 4 0.13 17.5 -13.03 0.54 2104 +2106 4 0.32 18.25 -13.78 0.54 2105 +2107 4 0.49 19.43 -14.71 0.435 2106 +2108 4 1.33 20.22 -15.43 0.435 2107 +2109 4 1.51 20.86 -15.29 0.435 2108 +2110 4 1.72 21.38 -15.91 0.435 2109 +2111 4 1.92 22.2 -17.41 0.435 2110 +2112 4 2.93 23.86 -18.19 0.435 2111 +2113 4 3.37 24.46 -19.54 0.435 2112 +2114 4 3.97 25.62 -19.94 0.435 2113 +2115 4 4.36 26.61 -20.8 0.435 2114 +2116 4 4.34 27.64 -22.36 0.435 2115 +2117 4 4.66 29.6 -22.15 0.435 2116 +2118 4 4.84 30.31 -22.59 0.435 2117 +2119 4 5.26 31.06 -23.41 0.435 2118 +2120 4 5.46 32.12 -25.1 0.435 2119 +2121 4 6.02 33.71 -25.46 0.435 2120 +2122 4 7.29 34.76 -26.45 0.435 2121 +2123 4 7.92 35.26 -26.76 0.435 2122 +2124 4 9.72 38.56 -28.11 0.435 2123 +2125 4 9.48 38.99 -28.22 0.435 2124 +2126 4 9.67 39.21 -28.04 0.435 2125 +2127 4 10.08 39.67 -28.06 0.435 2126 +2128 4 10.28 40.69 -29.53 0.435 2127 +2129 4 11.11 41.45 -29.96 0.435 2128 +2130 4 11.35 41.81 -31.12 0.435 2129 +2131 4 11.54 42.82 -32.44 0.435 2130 +2132 4 11.49 43.69 -32.5 0.435 2131 +2133 4 12.1 44.39 -32.57 0.435 2132 +2134 4 12.45 46.23 -33.27 0.435 2133 +2135 4 12.45 46.79 -34.5 0.435 2134 +2136 4 12.84 47.74 -35.15 0.435 2135 +2137 4 13.4 49.33 -35.42 0.435 2136 +2138 4 13.62 50.11 -36.55 0.435 2137 +2139 4 14.22 51.07 -37.11 0.435 2138 +2140 4 14.57 52.39 -37.03 0.435 2139 +2141 4 15.12 54.43 -37.49 0.435 2140 +2142 4 15.45 56.3 -38.5 0.435 2141 +2143 4 16.46 58.17 -39.25 0.435 2142 +2144 4 16.78 60.21 -39.87 0.435 2143 +2145 4 17.59 61.64 -40.61 0.435 2144 +2146 4 17.76 62.81 -41.31 0.435 2145 +2147 4 18.54 64.43 -41.73 0.435 2146 +2148 4 19.25 67.35 -42.23 0.435 2147 +2149 4 19.83 68.75 -42.76 0.435 2148 +2150 4 20.79 70.78 -42.9 0.435 2149 +2151 4 22.01 72.14 -42.73 0.435 2150 +2152 4 23.83 74.2 -42.55 0.435 2151 +2153 4 25.66 76.04 -42.32 0.435 2152 +2154 4 27.1 77.41 -42.14 0.435 2153 +2155 4 28.6 77.76 -42.52 0.435 2154 +2156 4 31.63 77.95 -42.43 0.435 2155 +2157 4 32.99 77.17 -42.55 0.435 2156 +2158 4 34.55 76.12 -41.87 0.435 2157 +2159 4 35.47 75.29 -41.71 0.435 2158 +2160 4 36.13 74.29 -39.99 0.435 2159 +2161 4 37.28 73.02 -39.64 0.435 2160 +2162 4 38.45 71.58 -39.76 0.435 2161 +2163 4 38.89 71.08 -38.75 0.435 2162 +2164 4 39.09 70.48 -36.99 0.435 2163 +2165 4 38.69 70.59 -38.35 0.435 2164 +2166 4 39.12 70.33 -37.76 0.435 2165 +2167 4 39.12 70.36 -37.99 0.435 2166 +2168 4 39.37 70.24 -38.67 0.435 2167 +2169 4 39.66 69.99 -40.35 0.435 2168 +2170 4 39.7 70.15 -41.91 0.435 2169 +2171 4 40.18 69.31 -41.91 0.435 2170 +2172 4 40.41 69.1 -41.85 0.435 2171 +2173 4 40.69 68.87 -43.61 0.435 2172 +2174 4 40.98 68.42 -45.45 0.435 2173 +2175 4 41.04 68.35 -46.89 0.435 2174 +2176 4 41.93 68.49 -47.68 0.435 2175 +2177 4 42.42 68.0 -49.01 0.435 2176 +2178 4 42.69 67.68 -50.01 0.435 2177 +2179 4 43.18 67.16 -50.89 0.435 2178 +2180 4 43.65 67.09 -52.08 0.435 2179 +2181 4 43.95 66.87 -54.05 0.435 2180 +2182 4 44.21 66.26 -54.26 0.435 2181 +2183 4 44.69 66.21 -55.54 0.435 2182 +2184 4 45.15 66.37 -56.79 0.435 2183 +2185 4 46.09 65.95 -58.54 0.435 2184 +2186 4 46.76 66.07 -59.27 0.435 2185 +2187 4 48.03 65.53 -57.42 0.435 2186 +2188 4 48.67 66.29 -58.23 0.435 2187 +2189 4 48.86 67.31 -59.39 0.435 2188 +2190 4 49.29 68.12 -60.89 0.435 2189 +2191 4 49.29 68.95 -62.6 0.435 2190 +2192 4 -5.37 10.72 -5.05 0.975 2092 +2193 4 -5.84 11.44 -4.99 0.975 2192 +2194 4 -6.11 13.03 -5.88 0.54 2193 +2195 4 -7.05 14.04 -5.8 0.54 2194 +2196 4 -7.34 15.32 -5.68 0.435 2195 +2197 4 -8.06 16.35 -5.59 0.435 2196 +2198 4 -7.86 17.13 -6.63 0.435 2197 +2199 4 -7.65 17.64 -7.25 0.435 2198 +2200 4 -7.69 18.29 -7.41 0.435 2199 +2201 4 -8.14 18.99 -8.1 0.435 2200 +2202 4 -8.58 19.52 -9.26 0.435 2201 +2203 4 -8.62 20.18 -9.35 0.435 2202 +2204 4 -8.65 20.59 -9.22 0.435 2203 +2205 4 -8.68 21.01 -9.11 0.435 2204 +2206 4 -8.7 21.51 -9.66 0.435 2205 +2207 4 -8.72 22.51 -10.99 0.435 2206 +2208 4 -8.73 23.0 -11.54 0.435 2207 +2209 4 -9.21 23.86 -11.7 0.435 2208 +2210 4 -9.23 24.56 -12.23 0.435 2209 +2211 4 -9.71 25.73 -13.39 0.435 2210 +2212 4 -9.74 26.39 -13.4 0.435 2211 +2213 4 -10.23 27.26 -13.7 0.435 2212 +2214 4 -10.28 28.11 -13.61 0.435 2213 +2215 4 -10.32 28.76 -13.62 0.435 2214 +2216 4 -10.38 29.61 -13.53 0.435 2215 +2217 4 -10.19 30.83 -14.61 0.435 2216 +2218 4 -10.23 31.5 -14.84 0.435 2217 +2219 4 -10.06 32.4 -15.04 0.435 2218 +2220 4 -9.89 33.32 -15.4 0.435 2219 +2221 4 -9.69 34.04 -16.0 0.435 2220 +2222 4 -9.76 35.16 -16.34 0.435 2221 +2223 4 -9.59 36.02 -16.17 0.435 2222 +2224 4 -9.59 36.06 -16.54 0.435 2223 +2225 4 -9.59 36.6 -17.54 0.435 2224 +2226 4 -9.58 36.9 -18.41 0.435 2225 +2227 4 -9.6 37.64 -19.24 0.435 2226 +2228 4 -9.38 38.24 -20.76 0.435 2227 +2229 4 -9.44 39.1 -20.67 0.435 2228 +2230 4 -9.49 39.96 -20.58 0.435 2229 +2231 4 -10.47 41.04 -18.99 0.435 2230 +2232 4 -10.99 42.29 -18.87 0.435 2231 +2233 4 -11.03 43.2 -19.3 0.435 2232 +2234 4 -11.06 44.17 -20.19 0.435 2233 +2235 4 -11.58 45.65 -20.11 0.435 2234 +2236 4 -11.65 46.73 -20.16 0.435 2235 +2237 4 -12.62 48.44 -20.45 0.435 2236 +2238 4 -13.54 49.73 -20.95 0.435 2237 +2239 4 -14.61 52.93 -21.01 0.435 2238 +2240 4 -14.67 54.01 -21.05 0.435 2239 +2241 4 -15.63 55.77 -21.73 0.435 2240 +2242 4 -16.62 58.14 -22.26 0.435 2241 +2243 4 -16.95 60.11 -22.59 0.435 2242 +2244 4 -17.9 61.63 -23.14 0.435 2243 +2245 4 -18.37 62.52 -23.51 0.435 2244 +2246 4 -18.84 63.41 -24.1 0.435 2245 +2247 4 -18.53 65.66 -24.62 0.435 2246 +2248 4 -18.59 66.8 -25.17 0.435 2247 +2249 4 -18.64 67.66 -25.17 0.435 2248 +2250 4 -18.68 68.6 -25.89 0.435 2249 +2251 4 -18.76 69.91 -25.91 0.435 2250 +2252 4 -18.81 70.78 -25.97 0.435 2251 +2253 4 -19.31 72.07 -26.23 0.435 2252 +2254 4 -19.8 72.92 -26.31 0.435 2253 +2255 4 -19.86 73.78 -26.22 0.435 2254 +2256 4 -19.91 74.65 -26.2 0.435 2255 +2257 4 -20.85 76.67 -27.52 0.435 2256 +2258 4 -20.88 77.64 -28.56 0.435 2257 +2259 4 -20.66 77.98 -29.57 0.435 2258 +2260 4 -20.68 78.7 -30.25 0.435 2259 +2261 4 -21.2 80.23 -30.63 0.435 2260 +2262 4 -21.68 81.32 -30.98 0.435 2261 +2263 4 -23.31 83.19 -31.13 0.435 2262 +2264 4 -23.81 84.49 -31.53 0.435 2263 +2265 4 -24.84 87.05 -31.59 0.435 2264 +2266 4 -25.64 89.35 -31.37 0.435 2265 +2267 4 -26.13 90.18 -31.15 0.435 2266 +2268 4 -26.85 91.2 -30.99 0.435 2267 +2269 4 -27.35 92.51 -31.39 0.435 2268 +2270 4 -27.8 93.24 -32.38 0.435 2269 +2271 4 -28.95 94.5 -32.66 0.435 2270 +2272 4 -30.19 97.06 -33.01 0.435 2271 +2273 4 -31.12 98.33 -33.14 0.435 2272 +2274 4 -32.78 100.63 -33.39 0.435 2273 +2275 4 -33.34 102.76 -33.25 0.435 2274 +2276 4 -34.31 104.46 -33.55 0.435 2275 +2277 4 -34.41 106.22 -33.83 0.435 2276 +2278 4 -36.15 109.81 -33.88 0.435 2277 +2279 4 -36.75 112.63 -34.12 0.435 2278 +2280 4 -36.89 115.02 -34.26 0.435 2279 +2281 4 -38.78 117.5 -34.12 0.435 2280 +2282 4 -40.66 119.53 -33.95 0.435 2281 +2283 4 -41.7 122.48 -33.67 0.435 2282 +2284 4 -42.3 125.02 -33.43 0.435 2283 +2285 4 -42.41 126.73 -33.25 0.435 2284 +2286 4 -44.52 129.19 -33.05 0.435 2285 +2287 4 -45.04 130.45 -32.93 0.435 2286 +2288 4 -45.01 130.82 -34.55 0.435 2287 +2289 4 -45.71 131.42 -34.35 0.435 2288 +2290 4 -45.73 131.85 -34.31 0.435 2289 +2291 4 -46.86 132.67 -34.55 0.435 2290 +2292 4 -7.72 38.87 -19.52 0.435 2227 +2293 4 -7.35 40.26 -20.05 0.435 2292 +2294 4 -6.26 40.67 -21.26 0.435 2293 +2295 4 -6.06 41.37 -21.63 0.435 2294 +2296 4 -5.92 42.75 -22.31 0.435 2295 +2297 4 -5.94 43.48 -23.07 0.435 2296 +2298 4 -6.57 43.52 -23.91 0.435 2297 +2299 4 -6.39 44.47 -24.49 0.435 2298 +2300 4 -5.99 45.22 -25.16 0.435 2299 +2301 4 -5.79 45.93 -25.6 0.435 2300 +2302 4 -5.61 46.89 -26.48 0.435 2301 +2303 4 -5.42 47.65 -27.3 0.435 2302 +2304 4 -5.03 48.82 -27.92 0.435 2303 +2305 4 -4.88 49.94 -28.1 0.435 2304 +2306 4 -5.11 50.64 -28.79 0.435 2305 +2307 4 -5.83 51.67 -28.78 0.435 2306 +2308 4 -5.85 52.14 -29.1 0.435 2307 +2309 4 -5.65 52.9 -30.01 0.435 2308 +2310 4 -5.62 53.06 -31.57 0.435 2309 +2311 4 -6.06 53.52 -32.13 0.435 2310 +2312 4 -6.68 53.61 -33.34 0.435 2311 +2313 4 -7.13 54.29 -33.89 0.435 2312 +2314 4 -7.13 54.6 -34.76 0.435 2313 +2315 4 -7.75 54.39 -35.25 0.435 2314 +2316 4 -7.37 55.59 -36.09 0.435 2315 +2317 4 -7.55 55.22 -36.89 0.435 2316 +2318 4 -7.53 55.85 -38.78 0.435 2317 +2319 4 -7.4 57.36 -38.63 0.435 2318 +2320 4 -7.41 57.84 -39.1 0.435 2319 +2321 4 -8.06 58.1 -39.09 0.435 2320 +2322 4 -8.96 58.49 -39.07 0.435 2321 +2323 4 -9.89 59.28 -39.01 0.435 2322 +2324 4 -9.96 60.04 -37.96 0.435 2323 +2325 4 -10.89 60.48 -36.42 0.435 2324 +2326 4 -10.9 60.77 -37.07 0.435 2325 +2327 4 -11.34 60.74 -37.01 0.435 2326 +2328 4 -11.57 61.42 -37.62 0.435 2327 +2329 4 -11.57 61.73 -38.49 0.435 2328 +2330 4 -11.55 62.08 -39.74 0.435 2329 +2331 4 -11.58 62.78 -40.2 0.435 2330 +2332 4 -11.55 63.15 -41.66 0.435 2331 +2333 4 -11.99 63.69 -42.98 0.435 2332 +2334 4 -11.79 64.14 -43.08 0.435 2333 +2335 4 -11.61 65.09 -43.73 0.435 2334 +2336 4 -11.41 65.59 -44.19 0.435 2335 +2337 4 -11.19 66.17 -45.49 0.435 2336 +2338 4 -10.56 66.71 -46.1 0.435 2337 +2339 4 -10.39 67.6 -46.3 0.435 2338 +2340 4 -10.36 67.74 -47.64 0.435 2339 +2341 4 -10.15 68.52 -48.76 0.435 2340 +2342 4 -10.16 68.8 -49.41 0.435 2341 +2343 4 -10.18 69.8 -50.67 0.435 2342 +2344 4 -10.01 70.93 -51.0 0.435 2343 +2345 4 -10.07 71.79 -50.91 0.435 2344 +2346 4 -10.53 72.49 -51.6 0.435 2345 +2347 4 -10.6 74.04 -51.97 0.435 2346 +2348 4 -10.66 75.45 -53.1 0.435 2347 +2349 4 -10.14 77.66 -53.09 0.435 2348 +2350 4 -10.15 78.17 -53.86 0.435 2349 +2351 4 -10.18 78.85 -54.1 0.435 2350 +2352 4 -9.36 79.85 -54.88 0.435 2351 +2353 4 -9.34 79.92 -55.62 0.435 2352 +2354 4 -9.15 80.63 -56.08 0.435 2353 +2355 4 -9.17 81.35 -56.68 0.435 2354 +2356 4 -9.21 82.27 -57.26 0.435 2355 +2357 4 -9.01 82.76 -57.74 0.435 2356 +2358 4 -9.33 84.48 -57.72 0.435 2357 +2359 4 -8.69 84.81 -58.34 0.435 2358 +2360 4 -8.73 85.73 -58.85 0.435 2359 +2361 4 -8.74 86.25 -59.63 0.435 2360 +2362 4 -7.96 87.81 -59.67 0.435 2361 +2363 4 -10.09 19.69 -9.8 0.435 2202 +2364 4 -11.18 19.93 -10.64 0.435 2363 +2365 4 -12.26 20.12 -11.1 0.435 2364 +2366 4 -13.38 20.97 -11.64 0.435 2365 +2367 4 -14.08 22.3 -12.34 0.435 2366 +2368 4 -14.76 22.99 -12.96 0.435 2367 +2369 4 -14.53 23.1 -14.0 0.435 2368 +2370 4 -14.51 23.15 -14.45 0.435 2369 +2371 4 -14.93 23.71 -15.99 0.435 2370 +2372 4 -14.93 24.54 -17.71 0.435 2371 +2373 4 -16.27 25.38 -18.18 0.435 2372 +2374 4 -16.25 25.48 -19.15 0.435 2373 +2375 4 -17.13 25.93 -19.95 0.435 2374 +2376 4 -17.34 26.47 -21.11 0.435 2375 +2377 4 -17.78 27.24 -22.47 0.435 2376 +2378 4 -17.77 27.55 -23.41 0.435 2377 +2379 4 -18.66 28.17 -23.75 0.435 2378 +2380 4 -18.67 28.39 -23.73 0.435 2379 +2381 4 -18.83 28.11 -25.34 0.435 2380 +2382 4 -19.26 28.09 -25.35 0.435 2381 +2383 4 -19.68 27.86 -25.54 0.435 2382 +2384 4 -19.67 27.9 -25.98 0.435 2383 +2385 4 -20.08 27.96 -26.82 0.435 2384 +2386 4 -20.05 28.1 -28.17 0.435 2385 +2387 4 -20.46 28.13 -28.69 0.435 2386 +2388 4 -20.92 28.86 -29.69 0.435 2387 +2389 4 -21.75 28.63 -30.1 0.435 2388 +2390 4 -22.38 28.67 -30.95 0.435 2389 +2391 4 -22.86 29.58 -31.54 0.435 2390 +2392 4 -23.71 29.59 -32.24 0.435 2391 +2393 4 -25.0 30.04 -33.2 0.435 2392 +2394 4 -25.22 30.02 -33.21 0.435 2393 +2395 4 -26.1 30.49 -34.01 0.435 2394 +2396 4 -26.52 30.5 -34.4 0.435 2395 +2397 4 -26.71 30.32 -34.87 0.435 2396 +2398 4 -28.25 31.19 -35.87 0.435 2397 +2399 4 -28.67 31.53 -37.36 0.435 2398 +2400 4 -28.69 31.98 -37.53 0.435 2399 +2401 4 -28.67 32.07 -38.36 0.435 2400 +2402 4 -29.1 32.31 -38.86 0.435 2401 +2403 4 -29.1 32.58 -39.29 0.435 2402 +2404 4 -29.99 32.98 -39.64 0.435 2403 +2405 4 -29.98 33.02 -40.02 0.435 2404 +2406 4 -30.19 33.59 -41.39 0.435 2405 +2407 4 -30.84 33.78 -41.69 0.435 2406 +2408 4 -30.85 34.33 -42.69 0.435 2407 +2409 4 -31.32 34.97 -42.94 0.435 2408 +2410 4 -31.97 35.18 -43.23 0.435 2409 +2411 4 -32.64 35.6 -43.51 0.435 2410 +2412 4 -33.09 36.03 -43.7 0.435 2411 +2413 4 -33.08 36.08 -44.22 0.435 2412 +2414 4 -33.1 36.54 -44.56 0.435 2413 +2415 4 -33.52 36.8 -45.21 0.435 2414 +2416 4 -34.19 37.24 -45.64 0.435 2415 +2417 4 -34.83 37.23 -46.02 0.435 2416 +2418 4 -35.24 37.11 -47.18 0.435 2417 +2419 4 -35.43 36.89 -47.28 0.435 2418 +2420 4 -36.32 37.28 -47.34 0.435 2419 +2421 4 -36.97 37.24 -47.43 0.435 2420 +2422 4 -37.17 37.57 -48.69 0.435 2421 +2423 4 -36.98 38.0 -48.41 0.435 2422 +2424 4 -38.03 37.75 -48.91 0.435 2423 +2425 4 -38.05 38.22 -49.25 0.435 2424 +2426 4 -38.48 38.54 -50.42 0.435 2425 +2427 4 -38.51 39.49 -51.31 0.435 2426 +2428 4 -38.49 39.61 -52.42 0.435 2427 +2429 4 -38.93 40.33 -53.34 0.435 2428 +2430 4 -38.91 40.41 -54.16 0.435 2429 +2431 4 -38.94 41.15 -54.99 0.435 2430 +2432 4 -39.0 42.49 -55.45 0.435 2431 +2433 4 -39.47 43.12 -55.55 0.435 2432 +2434 4 -40.35 43.8 -56.25 0.435 2433 +2435 4 -40.39 44.49 -56.71 0.435 2434 +2436 4 -41.96 45.27 -56.81 0.435 2435 +2437 4 -42.16 45.32 -57.35 0.435 2436 +2438 4 -43.02 45.77 -58.15 0.435 2437 +2439 4 -43.24 45.8 -58.53 0.435 2438 +2440 4 -44.14 46.63 -58.77 0.435 2439 +2441 4 -44.78 46.64 -59.23 0.435 2440 +2442 4 -6.88 11.21 -6.39 0.76 2193 +2443 4 -9.07 12.29 -7.91 0.76 2442 +2444 4 -10.02 13.21 -6.78 0.65 2443 +2445 4 -10.7 13.6 -6.76 0.65 2444 +2446 4 -11.62 14.4 -6.7 0.65 2445 +2447 4 -12.57 15.9 -7.02 0.65 2446 +2448 4 -13.29 16.96 -7.23 0.65 2447 +2449 4 -13.52 17.65 -7.76 0.65 2448 +2450 4 -14.46 18.7 -7.98 0.65 2449 +2451 4 -14.93 19.59 -8.42 0.65 2450 +2452 4 -14.95 20.33 -9.33 0.65 2451 +2453 4 -15.46 21.6 -9.36 0.65 2452 +2454 4 -15.95 22.69 -9.63 0.65 2453 +2455 4 -16.89 23.72 -9.63 0.65 2454 +2456 4 -18.03 24.74 -9.7 0.65 2455 +2457 4 -19.38 25.78 -10.15 0.65 2456 +2458 4 -20.76 27.01 -10.28 0.65 2457 +2459 4 -21.3 28.7 -10.12 0.65 2458 +2460 4 -21.9 31.26 -10.02 0.65 2459 +2461 4 -22.63 32.52 -10.13 0.54 2460 +2462 4 -22.8 35.31 -9.85 0.54 2461 +2463 4 -23.63 38.3 -9.79 0.54 2462 +2464 4 -23.86 38.8 -9.74 0.54 2463 +2465 4 -24.5 39.31 -10.91 0.435 2464 +2466 4 -25.42 39.9 -10.79 0.435 2465 +2467 4 -25.43 40.1 -10.62 0.435 2466 +2468 4 -26.1 40.52 -10.89 0.435 2467 +2469 4 -26.31 40.52 -10.98 0.435 2468 +2470 4 -26.76 40.99 -11.77 0.435 2469 +2471 4 -27.45 41.88 -12.36 0.435 2470 +2472 4 -27.42 41.98 -13.34 0.435 2471 +2473 4 -27.63 42.25 -13.92 0.435 2472 +2474 4 -28.12 43.36 -14.49 0.435 2473 +2475 4 -29.69 44.4 -14.95 0.435 2474 +2476 4 -30.19 45.74 -15.65 0.325 2475 +2477 4 -31.06 46.18 -16.3 0.325 2476 +2478 4 -31.53 46.83 -16.54 0.325 2477 +2479 4 -32.21 47.73 -17.3 0.325 2478 +2480 4 -33.11 48.61 -17.91 0.325 2479 +2481 4 -33.59 49.51 -18.58 0.325 2480 +2482 4 -35.38 50.74 -18.87 0.325 2481 +2483 4 -36.05 51.17 -19.3 0.325 2482 +2484 4 -37.89 52.78 -19.25 0.325 2483 +2485 4 -39.26 54.53 -20.15 0.325 2484 +2486 4 -39.95 55.4 -20.68 0.325 2485 +2487 4 -41.54 56.92 -21.54 0.325 2486 +2488 4 -42.64 57.34 -22.05 0.325 2487 +2489 4 -43.55 58.2 -22.51 0.325 2488 +2490 4 -45.35 59.42 -22.96 0.325 2489 +2491 4 -48.0 60.65 -23.8 0.325 2490 +2492 4 -49.56 61.5 -24.65 0.325 2491 +2493 4 -50.24 62.11 -24.68 0.325 2492 +2494 4 -52.9 63.27 -24.92 0.325 2493 +2495 4 -55.35 64.75 -26.03 0.325 2494 +2496 4 -56.93 66.04 -26.84 0.325 2495 +2497 4 -58.95 67.22 -26.99 0.325 2496 +2498 4 -60.52 68.5 -27.73 0.325 2497 +2499 4 -61.86 69.33 -28.13 0.325 2498 +2500 4 -63.86 70.59 -28.95 0.325 2499 +2501 4 -65.17 71.02 -29.69 0.325 2500 +2502 4 -66.26 70.98 -30.09 0.325 2501 +2503 4 -66.67 71.03 -30.78 0.325 2502 +2504 4 -67.51 71.1 -31.99 0.325 2503 +2505 4 -68.56 70.89 -32.72 0.325 2504 +2506 4 -68.96 70.7 -33.2 0.325 2505 +2507 4 -69.15 70.81 -34.47 0.325 2506 +2508 4 -24.69 41.48 -9.79 0.54 2464 +2509 4 -25.39 45.75 -9.43 0.54 2508 +2510 4 -26.04 48.94 -9.12 0.54 2509 +2511 4 -27.54 52.08 -8.91 0.54 2510 +2512 4 -28.85 55.65 -8.57 0.54 2511 +2513 4 -30.58 59.0 -8.26 0.54 2512 +2514 4 -30.75 61.56 -8.0 0.54 2513 +2515 4 -31.61 64.74 -7.69 0.54 2514 +2516 4 -32.05 65.78 -8.72 0.435 2515 +2517 4 -33.21 67.0 -8.62 0.435 2516 +2518 4 -33.25 67.61 -8.26 0.435 2517 +2519 4 -34.6 68.69 -9.08 0.435 2518 +2520 4 -34.64 69.87 -9.94 0.435 2519 +2521 4 -34.68 70.79 -10.53 0.435 2520 +2522 4 -34.71 71.75 -11.41 0.435 2521 +2523 4 -35.45 73.27 -11.8 0.435 2522 +2524 4 -36.43 75.46 -12.65 0.435 2523 +2525 4 -37.63 77.87 -13.56 0.435 2524 +2526 4 -38.42 80.0 -13.58 0.435 2525 +2527 4 -39.58 81.52 -14.28 0.435 2526 +2528 4 -39.79 82.04 -15.36 0.435 2527 +2529 4 -40.75 83.24 -14.95 0.435 2528 +2530 4 -41.24 84.3 -14.94 0.435 2529 +2531 4 -41.75 85.59 -15.12 0.435 2530 +2532 4 -42.22 86.49 -15.71 0.435 2531 +2533 4 -43.15 87.84 -16.73 0.435 2532 +2534 4 -42.99 89.21 -17.26 0.435 2533 +2535 4 -45.58 92.8 -17.85 0.435 2534 +2536 4 -47.01 95.38 -18.52 0.435 2535 +2537 4 -48.22 97.31 -18.96 0.435 2536 +2538 4 -49.12 98.41 -19.62 0.435 2537 +2539 4 -49.67 100.34 -19.8 0.435 2538 +2540 4 -50.17 101.65 -20.21 0.435 2539 +2541 4 -50.9 103.21 -20.97 0.435 2540 +2542 4 -51.84 104.74 -21.66 0.435 2541 +2543 4 -51.94 106.51 -22.08 0.435 2542 +2544 4 -52.98 109.5 -22.25 0.435 2543 +2545 4 -54.16 111.44 -22.75 0.435 2544 +2546 4 -54.87 112.8 -23.83 0.435 2545 +2547 4 -56.75 115.06 -23.65 0.435 2546 +2548 4 -57.75 117.16 -23.6 0.435 2547 +2549 4 -58.29 118.89 -23.82 0.435 2548 +2550 4 -59.25 120.58 -23.97 0.435 2549 +2551 4 -60.47 122.69 -24.08 0.435 2550 +2552 4 -62.55 124.71 -23.92 0.435 2551 +2553 4 -64.6 126.32 -23.87 0.435 2552 +2554 4 -65.99 127.74 -23.76 0.435 2553 +2555 4 -10.59 12.43 -8.01 0.54 2443 +2556 4 -12.47 11.52 -8.75 0.54 2555 +2557 4 -14.18 10.98 -8.84 0.54 2556 +2558 4 -16.11 10.66 -9.0 0.54 2557 +2559 4 -17.64 11.29 -9.8 0.54 2558 +2560 4 -20.23 11.14 -9.87 0.54 2559 +2561 4 -21.95 10.81 -9.95 0.54 2560 +2562 4 -24.78 11.07 -9.99 0.54 2561 +2563 4 -30.29 12.82 -11.29 0.54 2562 +2564 4 -31.62 13.39 -11.42 0.54 2563 +2565 4 -32.79 14.82 -11.3 0.54 2564 +2566 4 -34.55 15.14 -11.31 0.54 2565 +2567 4 -37.17 15.42 -11.34 0.54 2566 +2568 4 -38.72 15.97 -11.32 0.435 2567 +2569 4 -40.34 17.37 -11.21 0.435 2568 +2570 4 -40.87 19.06 -11.05 0.435 2569 +2571 4 -42.04 20.28 -10.95 0.435 2570 +2572 4 -44.05 21.22 -10.9 0.435 2571 +2573 4 -46.75 22.79 -10.8 0.435 2572 +2574 4 -48.18 24.63 -10.65 0.435 2573 +2575 4 -49.51 26.02 -12.19 0.435 2574 +2576 4 -51.34 27.41 -12.09 0.435 2575 +2577 4 -52.5 27.85 -10.72 0.435 2576 +2578 4 -53.43 28.87 -10.63 0.435 2577 +2579 4 -54.38 30.32 -10.51 0.435 2578 +2580 4 -54.76 32.11 -9.2 0.435 2579 +2581 4 -56.21 34.39 -8.92 0.435 2580 +2582 4 -57.23 36.41 -8.13 0.435 2581 +2583 4 -58.2 38.07 -7.91 0.435 2582 +2584 4 -60.1 39.69 -5.83 0.435 2583 +2585 4 -61.27 40.31 -4.21 0.435 2584 +2586 4 -61.99 41.34 -4.13 0.435 2585 +2587 4 -62.47 42.19 -4.2 0.435 2586 +2588 4 -62.97 43.24 -4.1 0.435 2587 +2589 4 -63.86 43.6 -4.01 0.435 2588 +2590 4 -64.93 43.28 -3.61 0.435 2589 +2591 4 -65.77 42.56 -3.49 0.435 2590 +2592 4 -66.63 42.26 -3.24 0.435 2591 +2593 4 -67.18 42.89 -3.18 0.435 2592 +2594 4 -68.05 42.83 -3.13 0.435 2593 +2595 4 -68.52 43.45 -3.16 0.435 2594 +2596 4 -70.61 42.79 -4.48 0.435 2595 +2597 4 -71.47 42.55 -4.68 0.435 2596 +2598 4 -72.13 42.47 -4.32 0.435 2597 +2599 4 -73.17 41.71 -3.9 0.435 2598 +2600 4 -74.92 42.02 -3.91 0.435 2599 +2601 4 -75.85 42.81 -3.7 0.435 2600 +2602 4 -76.78 43.62 -3.56 0.435 2601 +2603 4 -77.69 44.12 -2.62 0.435 2602 +2604 4 -79.0 44.03 -2.51 0.435 2603 +2605 4 -79.27 44.03 -0.72 0.435 2604 +2606 4 -80.38 44.39 -0.7 0.435 2605 +2607 4 -80.59 44.4 -0.93 0.435 2606 +2608 4 -80.79 44.49 -1.98 0.435 2607 +2609 4 -81.02 44.91 -1.94 0.435 2608 +2610 4 -81.51 44.93 -0.22 0.435 2609 +2611 4 -81.76 44.77 1.18 0.435 2610 +2612 4 -82.24 45.04 2.41 0.435 2611 +2613 4 -82.5 45.16 3.24 0.435 2612 +2614 4 -82.56 45.71 4.13 0.435 2613 +2615 4 -83.1 47.14 4.85 0.435 2614 +2616 4 -83.58 47.72 5.21 0.435 2615 +2617 4 -84.26 48.09 5.31 0.435 2616 +2618 4 -85.57 47.97 5.72 0.435 2617 +2619 4 -87.37 48.93 5.84 0.435 2618 +2620 4 -88.9 49.05 5.82 0.435 2619 +2621 4 -90.44 49.35 6.2 0.435 2620 +2622 4 -91.98 49.68 6.27 0.435 2621 +2623 4 -93.13 50.66 6.57 0.435 2622 +2624 4 -94.31 51.87 6.82 0.435 2623 +2625 4 -94.99 52.24 6.99 0.435 2624 +2626 4 -95.45 52.6 7.39 0.435 2625 +2627 4 3.0 7.07 -2.66 3.035 1 +2628 4 2.98 7.28 -2.64 3.035 2627 +2629 4 3.48 9.68 -2.38 2.6 2628 +2630 4 4.2 11.88 -2.14 2.385 2629 +2631 4 4.5 14.03 -1.84 2.165 2630 +2632 4 5.01 16.22 -1.6 2.275 2631 +2633 4 4.91 18.79 -1.34 2.275 2632 +2634 4 5.35 19.38 -2.54 0.325 2633 +2635 4 6.38 20.08 -2.36 0.325 2634 +2636 4 6.81 20.1 -2.28 0.325 2635 +2637 4 7.24 20.62 -2.89 0.325 2636 +2638 4 7.47 20.74 -3.86 0.325 2637 +2639 4 7.88 21.71 -4.57 0.325 2638 +2640 4 8.29 22.21 -5.05 0.325 2639 +2641 4 8.72 22.29 -5.48 0.325 2640 +2642 4 9.13 22.97 -5.47 0.325 2641 +2643 4 9.73 23.65 -5.39 0.435 2642 +2644 4 10.73 24.99 -5.22 0.435 2643 +2645 4 11.24 27.18 -4.98 0.435 2644 +2646 4 11.42 27.83 -4.91 0.435 2645 +2647 4 11.81 28.81 -5.79 0.435 2646 +2648 4 12.47 29.42 -6.99 0.435 2647 +2649 4 13.07 30.91 -8.4 0.435 2648 +2650 4 13.46 31.59 -8.47 0.435 2649 +2651 4 13.72 31.76 -10.1 0.435 2650 +2652 4 14.88 34.0 -9.92 0.435 2651 +2653 4 16.1 35.4 -10.05 0.435 2652 +2654 4 16.73 36.17 -10.85 0.435 2653 +2655 4 17.16 36.23 -11.22 0.435 2654 +2656 4 17.37 37.27 -12.69 0.435 2655 +2657 4 17.75 38.19 -12.96 0.435 2656 +2658 4 18.17 38.67 -13.2 0.435 2657 +2659 4 18.35 39.89 -14.43 0.435 2658 +2660 4 18.52 40.81 -14.78 0.435 2659 +2661 4 18.5 41.57 -15.83 0.435 2660 +2662 4 18.49 42.34 -16.96 0.435 2661 +2663 4 18.68 43.06 -17.48 0.435 2662 +2664 4 19.01 45.1 -18.17 0.435 2663 +2665 4 19.33 46.85 -18.05 0.435 2664 +2666 4 19.8 47.26 -19.66 0.435 2665 +2667 4 20.15 48.07 -18.96 0.435 2666 +2668 4 20.74 49.19 -18.76 0.435 2667 +2669 4 21.11 50.08 -18.66 0.435 2668 +2670 4 21.73 51.13 -20.12 0.435 2669 +2671 4 21.96 51.95 -21.69 0.435 2670 +2672 4 22.08 53.47 -21.6 0.435 2671 +2673 4 22.66 54.59 -21.47 0.435 2672 +2674 4 22.99 56.11 -21.3 0.435 2673 +2675 4 23.38 57.02 -21.5 0.435 2674 +2676 4 23.55 57.93 -21.78 0.435 2675 +2677 4 23.74 58.91 -22.65 0.435 2676 +2678 4 24.33 60.07 -23.12 0.435 2677 +2679 4 24.5 60.77 -23.43 0.435 2678 +2680 4 5.64 19.91 -1.2 2.275 2633 +2681 4 5.48 22.49 -0.94 2.275 2680 +2682 4 5.36 24.41 -0.74 2.275 2681 +2683 4 5.46 26.14 -0.56 2.275 2682 +2684 4 5.78 27.88 -0.38 2.275 2683 +2685 4 5.94 28.84 -0.27 2.275 2684 +2686 4 5.28 28.75 0.23 0.54 2685 +2687 4 4.63 28.71 0.21 0.54 2686 +2688 4 4.42 28.71 0.12 0.54 2687 +2689 4 4.16 29.07 0.61 0.54 2688 +2690 4 2.59 29.3 1.73 0.54 2689 +2691 4 2.12 29.65 2.21 0.54 2690 +2692 4 1.04 29.55 2.54 0.54 2691 +2693 4 0.08 29.95 4.37 0.435 2692 +2694 4 -0.79 30.33 4.39 0.435 2693 +2695 4 -0.8 30.56 4.19 0.435 2694 +2696 4 -1.48 30.95 4.29 0.435 2695 +2697 4 -2.2 31.69 5.1 0.435 2696 +2698 4 -3.14 32.4 6.06 0.435 2697 +2699 4 -3.86 33.15 6.79 0.435 2698 +2700 4 -3.89 33.56 6.98 0.435 2699 +2701 4 -3.94 34.19 7.2 0.435 2700 +2702 4 -4.86 34.74 7.69 0.435 2701 +2703 4 -5.96 35.11 7.55 0.435 2702 +2704 4 -6.0 35.49 8.12 0.435 2703 +2705 4 -6.51 35.91 10.11 0.435 2704 +2706 4 -7.45 36.38 11.18 0.435 2705 +2707 4 -8.38 36.89 11.97 0.435 2706 +2708 4 -9.56 38.04 12.81 0.435 2707 +2709 4 -10.75 39.63 13.4 0.435 2708 +2710 4 -11.26 40.38 14.37 0.435 2709 +2711 4 -12.21 41.36 14.9 0.435 2710 +2712 4 -12.71 42.11 15.65 0.435 2711 +2713 4 -13.44 42.8 16.98 0.435 2712 +2714 4 -13.96 43.76 17.9 0.435 2713 +2715 4 -15.11 44.23 18.97 0.435 2714 +2716 4 -16.25 44.45 20.26 0.435 2715 +2717 4 -17.65 46.1 20.39 0.435 2716 +2718 4 -17.68 46.53 20.44 0.435 2717 +2719 4 -18.21 47.43 21.8 0.435 2718 +2720 4 -19.14 47.96 22.51 0.435 2719 +2721 4 -19.41 48.52 23.24 0.435 2720 +2722 4 -19.95 49.4 24.83 0.435 2721 +2723 4 -20.88 50.36 25.51 0.435 2722 +2724 4 -22.09 51.74 26.14 0.435 2723 +2725 4 -23.0 52.52 26.5 0.435 2724 +2726 4 -23.95 53.73 26.76 0.435 2725 +2727 4 -25.35 54.88 27.45 0.435 2726 +2728 4 -25.88 56.08 28.16 0.435 2727 +2729 4 -27.31 57.85 29.06 0.435 2728 +2730 4 -29.43 59.99 30.14 0.435 2729 +2731 4 -31.52 62.0 30.45 0.435 2730 +2732 4 -33.11 62.97 30.58 0.435 2731 +2733 4 -34.12 65.28 30.8 0.435 2732 +2734 4 -36.02 67.96 31.03 0.435 2733 +2735 4 -37.7 70.21 31.22 0.435 2734 +2736 4 -39.61 73.12 31.48 0.435 2735 +2737 4 -41.94 75.56 31.68 0.435 2736 +2738 4 -42.55 78.31 31.95 0.435 2737 +2739 4 -44.88 80.98 32.17 0.435 2738 +2740 4 -47.95 84.66 32.48 0.435 2739 +2741 4 -49.78 86.26 32.6 0.435 2740 +2742 4 -50.31 87.47 33.24 0.435 2741 +2743 4 -50.89 89.29 34.17 0.435 2742 +2744 4 -52.06 90.42 35.24 0.435 2743 +2745 4 -53.98 92.83 35.97 0.435 2744 +2746 4 -55.83 94.64 36.12 0.435 2745 +2747 4 -57.89 96.23 36.31 0.435 2746 +2748 4 -59.06 97.68 36.43 0.435 2747 +2749 4 -60.07 99.75 36.62 0.435 2748 +2750 4 -61.49 101.57 37.15 0.435 2749 +2751 4 -63.0 104.69 37.59 0.435 2750 +2752 4 -63.54 106.1 38.25 0.435 2751 +2753 4 -64.52 107.47 39.12 0.435 2752 +2754 4 -65.05 108.64 40.13 0.435 2753 +2755 4 -65.13 109.67 40.69 0.435 2754 +2756 4 -65.66 110.64 41.53 0.435 2755 +2757 4 -66.17 111.89 41.72 0.435 2756 +2758 4 -66.25 112.88 42.58 0.435 2757 +2759 4 -66.75 113.66 43.1 0.435 2758 +2760 4 -66.82 114.72 43.36 0.435 2759 +2761 4 -67.77 115.69 43.89 0.435 2760 +2762 4 -68.89 116.26 44.07 0.435 2761 +2763 4 -69.21 117.44 45.02 0.435 2762 +2764 4 -69.94 118.45 45.26 0.435 2763 +2765 4 -69.81 119.72 45.69 0.435 2764 +2766 4 -15.97 43.66 19.73 0.435 2715 +2767 4 -16.79 42.96 19.64 0.435 2766 +2768 4 -17.44 42.62 20.49 0.435 2767 +2769 4 -18.28 42.12 20.64 0.435 2768 +2770 4 -19.6 41.98 21.13 0.435 2769 +2771 4 -20.29 42.3 21.82 0.435 2770 +2772 4 -20.98 42.08 23.51 0.435 2771 +2773 4 -22.1 42.38 24.2 0.435 2772 +2774 4 -22.98 42.01 25.11 0.435 2773 +2775 4 -23.41 41.7 25.76 0.435 2774 +2776 4 -24.25 40.89 26.78 0.435 2775 +2777 4 -25.71 39.72 26.77 0.435 2776 +2778 4 -26.52 38.57 26.87 0.435 2777 +2779 4 -26.89 37.39 27.48 0.435 2778 +2780 4 -28.8 36.6 27.65 0.435 2779 +2781 4 -29.2 35.64 28.3 0.435 2780 +2782 4 -30.48 35.08 28.75 0.435 2781 +2783 4 -30.93 34.72 29.82 0.435 2782 +2784 4 -31.32 34.29 29.47 0.435 2783 +2785 4 -31.35 34.2 30.36 0.435 2784 +2786 4 -31.78 33.59 31.8 0.435 2785 +2787 4 -32.43 33.01 32.93 0.435 2786 +2788 4 -33.27 32.26 33.29 0.435 2787 +2789 4 -33.52 32.37 34.2 0.435 2788 +2790 4 6.3 30.1 -0.5 2.06 2685 +2791 4 6.21 32.13 -1.27 2.06 2790 +2792 4 6.31 33.86 -1.09 1.95 2791 +2793 4 6.23 35.76 -2.71 1.95 2792 +2794 4 6.32 37.92 -2.48 1.95 2793 +2795 4 6.01 39.27 -2.35 1.95 2794 +2796 4 5.11 39.05 -0.73 0.435 2795 +2797 4 4.71 38.83 -0.92 0.435 2796 +2798 4 4.27 38.81 -1.01 0.435 2797 +2799 4 3.83 38.75 -0.72 0.435 2798 +2800 4 2.99 38.26 -0.64 0.54 2799 +2801 4 1.74 37.32 -0.77 0.54 2800 +2802 4 0.47 36.55 -0.28 0.54 2801 +2803 4 0.01 36.37 1.11 0.54 2802 +2804 4 -0.41 36.04 1.9 0.54 2803 +2805 4 -1.24 35.32 2.03 0.54 2804 +2806 4 -2.32 35.03 2.12 0.54 2805 +2807 4 -3.16 34.49 2.58 0.54 2806 +2808 4 -3.56 33.53 3.23 0.54 2807 +2809 4 -3.97 33.05 3.47 0.54 2808 +2810 4 -4.65 33.43 3.49 0.54 2809 +2811 4 -4.56 34.54 5.49 0.435 2810 +2812 4 -4.38 35.2 5.56 0.435 2811 +2813 4 -4.41 35.35 6.18 0.435 2812 +2814 4 -4.49 36.09 7.31 0.435 2813 +2815 4 -4.53 36.44 8.1 0.435 2814 +2816 4 -5.02 36.78 8.88 0.435 2815 +2817 4 -5.07 37.4 9.09 0.435 2816 +2818 4 -4.3 38.92 9.64 0.435 2817 +2819 4 -4.98 39.28 9.96 0.435 2818 +2820 4 -5.46 40.11 10.04 0.435 2819 +2821 4 -5.95 40.72 10.09 0.435 2820 +2822 4 -6.91 42.38 10.24 0.435 2821 +2823 4 -8.51 43.58 10.32 0.435 2822 +2824 4 -9.87 44.35 10.37 0.435 2823 +2825 4 -11.2 44.64 10.97 0.435 2824 +2826 4 -11.68 45.26 11.03 0.435 2825 +2827 4 -11.93 45.89 11.09 0.435 2826 +2828 4 -11.95 46.35 10.83 0.435 2827 +2829 4 -12.36 46.7 9.2 0.435 2828 +2830 4 -12.19 46.79 10.57 0.435 2829 +2831 4 -12.65 46.94 10.96 0.435 2830 +2832 4 -12.9 47.07 11.72 0.435 2831 +2833 4 -12.74 47.88 12.4 0.435 2832 +2834 4 -13.17 47.86 12.39 0.435 2833 +2835 4 -13.23 48.17 13.55 0.435 2834 +2836 4 -13.71 48.52 14.1 0.435 2835 +2837 4 -14.04 50.15 14.8 0.435 2836 +2838 4 -14.72 50.53 15.04 0.435 2837 +2839 4 -15.23 51.29 15.71 0.435 2838 +2840 4 -4.82 32.52 3.85 0.54 2810 +2841 4 -6.34 32.12 4.59 0.54 2840 +2842 4 -6.8 31.97 5.84 0.54 2841 +2843 4 -7.67 31.93 5.67 0.435 2842 +2844 4 -8.73 31.66 5.62 0.435 2843 +2845 4 -9.17 31.08 6.75 0.435 2844 +2846 4 -10.06 31.46 6.77 0.435 2845 +2847 4 -10.96 32.03 6.81 0.435 2846 +2848 4 -11.67 32.86 6.88 0.435 2847 +2849 4 -12.09 32.85 6.72 0.435 2848 +2850 4 -12.54 32.51 7.65 0.435 2849 +2851 4 -12.78 32.65 8.19 0.435 2850 +2852 4 -13.2 32.42 8.08 0.435 2851 +2853 4 -13.59 31.99 7.73 0.435 2852 +2854 4 -14.01 31.2 8.84 0.435 2853 +2855 4 -14.4 30.29 8.96 0.435 2854 +2856 4 -14.8 29.54 9.71 0.435 2855 +2857 4 -15.42 28.54 10.64 0.435 2856 +2858 4 -16.03 27.56 11.35 0.435 2857 +2859 4 -16.47 27.25 11.92 0.325 2858 +2860 4 -16.87 26.82 11.63 0.325 2859 +2861 4 -16.87 26.81 11.78 0.325 2860 +2862 4 -17.31 26.51 12.27 0.325 2861 +2863 4 -17.3 26.0 13.04 0.325 2862 +2864 4 -17.73 25.68 13.75 0.325 2863 +2865 4 -17.71 25.2 14.16 0.325 2864 +2866 4 -18.15 24.93 14.42 0.325 2865 +2867 4 6.01 39.73 -3.51 1.95 2795 +2868 4 6.01 39.83 -3.5 1.95 2867 +2869 4 5.88 41.88 -3.29 1.735 2868 +2870 4 5.82 42.74 -3.2 1.735 2869 +2871 4 5.94 45.07 -4.62 1.735 2870 +2872 4 5.85 46.56 -4.46 1.735 2871 +2873 4 6.01 48.21 -5.65 1.735 2872 +2874 4 6.35 49.75 -5.55 1.735 2873 +2875 4 6.51 51.43 -7.11 1.735 2874 +2876 4 6.85 52.75 -6.97 1.735 2875 +2877 4 7.21 54.39 -7.92 1.735 2876 +2878 4 7.81 56.14 -9.68 1.735 2877 +2879 4 8.84 57.58 -10.48 1.735 2878 +2880 4 9.61 59.18 -10.75 1.735 2879 +2881 4 10.39 60.51 -10.6 1.735 2880 +2882 4 9.14 60.71 -12.41 0.54 2881 +2883 4 8.27 60.66 -12.44 0.54 2882 +2884 4 7.18 60.81 -12.38 0.54 2883 +2885 4 5.84 61.37 -12.35 0.54 2884 +2886 4 5.33 62.63 -12.24 0.54 2885 +2887 4 4.58 64.09 -12.1 0.54 2886 +2888 4 2.54 65.47 -12.01 0.54 2887 +2889 4 0.95 66.98 -12.95 0.54 2888 +2890 4 0.43 68.46 -12.8 0.54 2889 +2891 4 -0.12 70.35 -12.62 0.54 2890 +2892 4 -1.77 72.41 -12.45 0.54 2891 +2893 4 -3.09 72.76 -12.44 0.54 2892 +2894 4 -4.42 72.82 -11.71 0.54 2893 +2895 4 -6.0 73.57 -11.59 0.435 2894 +2896 4 -6.65 73.54 -11.61 0.435 2895 +2897 4 -7.79 74.85 -12.34 0.435 2896 +2898 4 -7.95 74.5 -13.35 0.435 2897 +2899 4 -7.94 75.08 -14.8 0.435 2898 +2900 4 -8.59 75.36 -15.84 0.435 2899 +2901 4 -9.19 75.51 -17.72 0.435 2900 +2902 4 -9.63 75.71 -17.71 0.435 2901 +2903 4 -9.87 75.92 -17.78 0.435 2902 +2904 4 -9.82 76.11 -19.56 0.435 2903 +2905 4 -9.81 76.19 -20.38 0.435 2904 +2906 4 -9.98 76.31 -21.65 0.435 2905 +2907 4 -9.94 76.47 -23.22 0.435 2906 +2908 4 -9.91 76.6 -24.49 0.435 2907 +2909 4 -10.31 75.93 -24.56 0.435 2908 +2910 4 -10.12 77.17 -26.01 0.435 2909 +2911 4 -11.26 77.95 -25.81 0.435 2910 +2912 4 -11.7 78.47 -26.97 0.435 2911 +2913 4 -11.66 78.61 -28.31 0.435 2912 +2914 4 -11.65 79.21 -29.98 0.435 2913 +2915 4 -11.65 79.51 -30.7 0.435 2914 +2916 4 -11.64 79.8 -31.43 0.435 2915 +2917 4 -11.42 80.12 -32.22 0.435 2916 +2918 4 -11.45 81.1 -33.33 0.435 2917 +2919 4 -11.45 81.65 -34.47 0.435 2918 +2920 4 -11.44 81.92 -35.04 0.435 2919 +2921 4 -12.33 82.57 -35.6 0.435 2920 +2922 4 -12.38 83.78 -36.76 0.435 2921 +2923 4 -12.38 84.32 -37.83 0.435 2922 +2924 4 -13.08 85.41 -38.27 0.435 2923 +2925 4 -13.08 85.94 -39.19 0.435 2924 +2926 4 -13.11 86.69 -40.17 0.435 2925 +2927 4 -12.9 87.2 -40.87 0.435 2926 +2928 4 -11.38 87.59 -41.55 0.435 2927 +2929 4 -11.34 87.74 -43.04 0.435 2928 +2930 4 -11.86 89.01 -42.99 0.435 2929 +2931 4 -11.88 89.72 -43.6 0.435 2930 +2932 4 -11.92 90.66 -44.26 0.435 2931 +2933 4 -12.17 91.55 -44.76 0.435 2932 +2934 4 -12.38 91.87 -45.79 0.435 2933 +2935 4 -12.84 92.56 -46.33 0.435 2934 +2936 4 -12.89 93.41 -46.33 0.435 2935 +2937 4 -13.78 94.34 -47.53 0.435 2936 +2938 4 -13.79 95.14 -48.89 0.435 2937 +2939 4 -13.59 95.6 -49.13 0.435 2938 +2940 4 -13.38 95.66 -49.5 0.435 2939 +2941 4 -12.95 96.19 -50.18 0.435 2940 +2942 4 -12.99 97.1 -50.54 0.435 2941 +2943 4 -13.01 97.58 -51.02 0.435 2942 +2944 4 -13.48 98.48 -51.62 0.435 2943 +2945 4 -14.09 98.57 -52.9 0.435 2944 +2946 4 -14.75 99.04 -53.7 0.435 2945 +2947 4 -15.41 99.52 -54.57 0.435 2946 +2948 4 -16.08 100.2 -55.19 0.435 2947 +2949 4 -16.27 100.26 -55.95 0.435 2948 +2950 4 -17.17 100.95 -56.87 0.435 2949 +2951 4 -18.99 102.35 -56.77 0.435 2950 +2952 4 -19.92 103.9 -57.69 0.435 2951 +2953 4 -20.8 104.63 -58.92 0.435 2952 +2954 4 -21.61 107.17 -58.75 0.435 2953 +2955 4 -22.15 108.84 -58.59 0.435 2954 +2956 4 -21.92 109.48 -60.25 0.435 2955 +2957 4 -22.48 111.38 -60.14 0.435 2956 +2958 4 -22.5 111.85 -60.55 0.435 2957 +2959 4 -20.93 115.05 -61.0 0.435 2958 +2960 4 -20.98 115.94 -61.36 0.435 2959 +2961 4 -20.8 116.64 -61.59 0.435 2960 +2962 4 -10.54 76.41 -25.12 0.435 2909 +2963 4 -10.72 76.53 -26.47 0.435 2962 +2964 4 -11.15 77.06 -27.64 0.435 2963 +2965 4 -11.13 77.16 -28.68 0.435 2964 +2966 4 -11.11 77.5 -29.77 0.435 2965 +2967 4 -11.12 77.77 -30.35 0.435 2966 +2968 4 -11.75 78.28 -31.59 0.435 2967 +2969 4 -12.86 78.67 -31.8 0.435 2968 +2970 4 -12.87 78.65 -31.57 0.435 2969 +2971 4 -13.28 78.72 -32.56 0.435 2970 +2972 4 -13.3 79.18 -32.82 0.435 2971 +2973 4 -14.16 79.43 -33.72 0.435 2972 +2974 4 -15.04 80.13 -34.64 0.435 2973 +2975 4 -15.94 80.48 -34.39 0.435 2974 +2976 4 -16.38 80.66 -34.25 0.435 2975 +2977 4 -16.4 80.85 -34.07 0.435 2976 +2978 4 -17.06 81.3 -34.57 0.435 2977 +2979 4 -17.71 81.26 -34.59 0.435 2978 +2980 4 -18.57 81.83 -36.36 0.435 2979 +2981 4 -19.22 81.99 -36.36 0.435 2980 +2982 4 -19.66 81.94 -36.14 0.435 2981 +2983 4 -20.54 82.39 -36.8 0.435 2982 +2984 4 -21.8 82.49 -38.63 0.435 2983 +2985 4 -23.06 82.52 -39.71 0.435 2984 +2986 4 -23.5 82.46 -39.43 0.435 2985 +2987 4 -23.49 82.51 -39.87 0.435 2986 +2988 4 -24.11 82.36 -40.88 0.435 2987 +2989 4 -24.95 82.12 -41.23 0.435 2988 +2990 4 -25.98 81.99 -42.69 0.435 2989 +2991 4 -27.03 81.83 -43.94 0.435 2990 +2992 4 -27.65 81.66 -44.73 0.435 2991 +2993 4 -29.6 81.8 -45.29 0.435 2992 +2994 4 -31.12 82.69 -46.51 0.435 2993 +2995 4 -32.18 82.76 -47.81 0.435 2994 +2996 4 -33.91 83.23 -49.16 0.435 2995 +2997 4 -35.18 83.24 -50.09 0.435 2996 +2998 4 -36.51 84.11 -50.94 0.435 2997 +2999 4 -37.97 83.93 -52.2 0.435 2998 +3000 4 -39.06 83.87 -52.38 0.435 2999 +3001 4 -40.72 83.47 -53.74 0.435 3000 +3002 4 -42.01 83.19 -53.88 0.435 3001 +3003 4 -43.69 82.48 -54.36 0.435 3002 +3004 4 -45.64 82.59 -54.55 0.435 3003 +3005 4 -46.48 82.12 -54.7 0.435 3004 +3006 4 -47.97 82.11 -55.64 0.435 3005 +3007 4 -48.84 82.56 -56.29 0.435 3006 +3008 4 -50.16 82.99 -56.96 0.435 3007 +3009 4 -51.19 83.1 -58.77 0.435 3008 +3010 4 -4.78 75.24 -12.23 0.54 2893 +3011 4 -6.22 77.52 -12.02 0.54 3010 +3012 4 -7.69 80.02 -11.8 0.54 3011 +3013 4 -7.97 81.89 -13.34 0.54 3012 +3014 4 -8.26 83.44 -13.86 0.54 3013 +3015 4 -8.3 84.39 -14.6 0.54 3014 +3016 4 -8.67 86.73 -14.44 0.54 3015 +3017 4 -9.65 88.88 -14.77 0.54 3016 +3018 4 -10.54 89.56 -15.55 0.54 3017 +3019 4 -10.6 90.92 -16.24 0.54 3018 +3020 4 -11.49 91.9 -17.89 0.54 3019 +3021 4 -11.49 92.43 -18.74 0.54 3020 +3022 4 -11.95 93.37 -19.71 0.54 3021 +3023 4 -13.83 95.86 -19.72 0.54 3022 +3024 4 -15.05 98.0 -20.13 0.54 3023 +3025 4 -16.44 99.95 -21.02 0.54 3024 +3026 4 -17.68 102.49 -21.16 0.54 3025 +3027 4 -18.65 104.16 -21.09 0.54 3026 +3028 4 -20.59 107.5 -20.86 0.54 3027 +3029 4 -21.64 110.5 -21.17 0.54 3028 +3030 4 -23.5 112.56 -21.09 0.54 3029 +3031 4 -25.02 116.15 -21.12 0.54 3030 +3032 4 -26.44 118.01 -21.04 0.54 3031 +3033 4 -27.85 119.64 -20.91 0.54 3032 +3034 4 -27.98 121.57 -20.71 0.54 3033 +3035 4 -27.92 124.16 -20.44 0.54 3034 +3036 4 -28.67 125.92 -20.65 0.435 3035 +3037 4 -29.2 127.4 -20.51 0.435 3036 +3038 4 -29.34 129.58 -20.67 0.435 3037 +3039 4 -29.5 132.15 -20.41 0.435 3038 +3040 4 -29.58 133.45 -20.5 0.435 3039 +3041 4 -30.37 135.78 -20.42 0.435 3040 +3042 4 -30.98 138.84 -20.88 0.435 3041 +3043 4 -31.67 139.92 -21.38 0.435 3042 +3044 4 -32.43 141.61 -21.23 0.435 3043 +3045 4 -33.45 143.91 -21.01 0.435 3044 +3046 4 -34.64 145.56 -20.87 0.435 3045 +3047 4 -36.27 147.18 -20.74 0.435 3046 +3048 4 -36.78 148.69 -20.9 0.435 3047 +3049 4 -37.45 152.32 -20.62 0.435 3048 +3050 4 -37.63 155.33 -20.53 0.435 3049 +3051 4 -38.17 157.06 -20.82 0.435 3050 +3052 4 -38.28 159.07 -21.29 0.435 3051 +3053 4 -39.1 161.85 -21.4 0.435 3052 +3054 4 -39.2 163.61 -21.75 0.435 3053 +3055 4 -39.68 164.7 -22.03 0.435 3054 +3056 4 -39.76 166.29 -22.69 0.435 3055 +3057 4 -39.83 167.62 -23.16 0.435 3056 +3058 4 -39.91 168.93 -23.17 0.435 3057 +3059 4 -39.99 170.24 -23.27 0.435 3058 +3060 4 -40.07 171.78 -23.57 0.435 3059 +3061 4 -40.11 172.44 -23.65 0.435 3060 +3062 4 -40.59 173.28 -23.64 0.435 3061 +3063 4 -41.06 174.22 -24.54 0.435 3062 +3064 4 -41.52 174.62 -24.51 0.435 3063 +3065 4 10.83 61.1 -11.73 1.735 2881 +3066 4 11.81 62.66 -11.55 1.735 3065 +3067 4 11.57 63.18 -11.5 1.735 3066 +3068 4 10.69 64.17 -13.38 0.54 3067 +3069 4 10.23 64.56 -13.2 0.54 3068 +3070 4 10.2 64.99 -13.15 0.54 3069 +3071 4 9.3 65.36 -13.14 0.54 3070 +3072 4 8.17 66.16 -13.08 0.54 3071 +3073 4 7.72 66.57 -13.2 0.54 3072 +3074 4 7.25 67.24 -13.59 0.54 3073 +3075 4 6.55 68.1 -13.97 0.54 3074 +3076 4 5.86 68.94 -14.12 0.54 3075 +3077 4 4.95 70.06 -15.02 0.54 3076 +3078 4 4.44 71.34 -15.05 0.54 3077 +3079 4 4.42 72.08 -15.95 0.54 3078 +3080 4 4.38 73.0 -16.38 0.54 3079 +3081 4 4.08 74.52 -16.61 0.54 3080 +3082 4 4.25 75.45 -17.11 0.54 3081 +3083 4 4.22 76.14 -17.49 0.54 3082 +3084 4 4.63 76.89 -18.16 0.54 3083 +3085 4 5.19 78.71 -18.71 0.435 3084 +3086 4 5.14 79.9 -19.65 0.435 3085 +3087 4 5.11 80.55 -19.73 0.435 3086 +3088 4 5.1 81.05 -20.43 0.435 3087 +3089 4 4.6 82.4 -21.21 0.435 3088 +3090 4 4.55 83.56 -21.91 0.435 3089 +3091 4 4.73 84.51 -22.49 0.435 3090 +3092 4 4.87 86.06 -22.77 0.435 3091 +3093 4 4.4 87.0 -23.74 0.435 3092 +3094 4 4.08 88.73 -23.8 0.435 3093 +3095 4 3.98 90.77 -24.72 0.435 3094 +3096 4 3.62 93.14 -24.79 0.435 3095 +3097 4 3.53 94.92 -25.21 0.435 3096 +3098 4 3.48 95.81 -25.42 0.435 3097 +3099 4 2.53 97.34 -26.19 0.435 3098 +3100 4 2.46 98.91 -26.7 0.435 3099 +3101 4 1.51 100.37 -26.65 0.435 3100 +3102 4 1.42 101.69 -26.89 0.435 3101 +3103 4 0.4 104.51 -27.46 0.435 3102 +3104 4 0.34 105.61 -27.65 0.435 3103 +3105 4 -0.74 109.23 -27.6 0.435 3104 +3106 4 -0.83 111.04 -28.24 0.435 3105 +3107 4 -0.92 112.82 -28.81 0.435 3106 +3108 4 -0.82 114.8 -28.84 0.435 3107 +3109 4 -0.86 115.69 -29.2 0.435 3108 +3110 4 -0.94 116.77 -29.16 0.435 3109 +3111 4 -0.77 117.95 -29.94 0.435 3110 +3112 4 -0.38 118.88 -30.28 0.435 3111 +3113 4 -0.82 119.6 -31.27 0.435 3112 +3114 4 -0.38 119.68 -31.78 0.435 3113 +3115 4 11.52 63.81 -11.43 1.735 3067 +3116 4 11.74 63.82 -11.43 1.735 3115 +3117 4 13.25 63.84 -11.47 1.735 3116 +3118 4 12.89 65.33 -9.36 0.435 3117 +3119 4 12.86 66.0 -9.52 0.435 3118 +3120 4 12.38 66.35 -9.04 0.435 3119 +3121 4 12.12 66.36 -7.24 0.435 3120 +3122 4 11.63 67.21 -7.24 0.435 3121 +3123 4 11.6 67.66 -7.41 0.435 3122 +3124 4 11.58 67.57 -6.53 0.435 3123 +3125 4 11.55 67.71 -5.76 0.435 3124 +3126 4 11.53 67.65 -5.16 0.435 3125 +3127 4 11.48 67.98 -4.3 0.435 3126 +3128 4 11.47 68.15 -3.91 0.435 3127 +3129 4 11.6 68.9 -2.54 0.435 3128 +3130 4 11.97 69.51 -1.86 0.435 3129 +3131 4 12.27 71.11 -0.41 0.435 3130 +3132 4 12.4 72.17 0.0 0.435 3131 +3133 4 12.9 74.54 0.4 0.435 3132 +3134 4 12.73 77.06 1.26 0.435 3133 +3135 4 12.81 78.97 1.76 0.435 3134 +3136 4 13.33 80.92 2.19 0.435 3135 +3137 4 13.03 81.37 3.89 0.435 3136 +3138 4 13.37 82.9 3.99 0.435 3137 +3139 4 13.94 84.23 4.21 0.435 3138 +3140 4 14.28 85.23 5.23 0.435 3139 +3141 4 14.23 85.58 6.09 0.435 3140 +3142 4 13.48 86.72 7.09 0.435 3141 +3143 4 13.17 88.21 7.24 0.435 3142 +3144 4 13.06 89.92 7.41 0.435 3143 +3145 4 12.95 91.64 7.59 0.435 3144 +3146 4 11.87 95.01 7.91 0.435 3145 +3147 4 12.01 95.28 9.68 0.435 3146 +3148 4 11.52 96.32 9.78 0.435 3147 +3149 4 11.44 97.4 9.81 0.435 3148 +3150 4 11.38 98.23 10.19 0.435 3149 +3151 4 11.35 98.63 10.54 0.435 3150 +3152 4 10.65 98.92 11.54 0.435 3151 +3153 4 10.17 99.46 12.25 0.435 3152 +3154 4 9.61 100.87 13.06 0.435 3153 +3155 4 9.55 101.71 13.3 0.435 3154 +3156 4 9.19 104.04 13.61 0.435 3155 +3157 4 9.07 105.97 13.81 0.435 3156 +3158 4 8.93 107.55 15.24 0.435 3157 +3159 4 8.79 109.7 15.46 0.435 3158 +3160 4 7.78 111.79 15.66 0.435 3159 +3161 4 7.23 113.42 16.41 0.435 3160 +3162 4 7.14 114.69 16.7 0.435 3161 +3163 4 7.26 116.18 17.08 0.435 3162 +3164 4 5.78 118.62 17.75 0.435 3163 +3165 4 5.29 119.67 17.92 0.435 3164 +3166 4 5.44 120.49 18.39 0.435 3165 +3167 4 5.72 122.61 19.07 0.435 3166 +3168 4 6.0 124.99 19.39 0.435 3167 +3169 4 6.73 127.18 19.64 0.435 3168 +3170 4 7.67 129.38 19.97 0.435 3169 +3171 4 9.27 131.62 20.31 0.435 3170 +3172 4 9.84 132.7 20.66 0.435 3171 +3173 4 10.56 134.66 21.26 0.435 3172 +3174 4 11.08 136.57 21.99 0.435 3173 +3175 4 11.64 137.83 22.67 0.435 3174 +3176 4 11.94 139.56 23.61 0.435 3175 +3177 4 12.46 141.23 24.62 0.435 3176 +3178 4 12.83 142.07 25.09 0.435 3177 +3179 4 13.15 143.55 25.71 0.435 3178 +3180 4 13.25 145.0 26.46 0.435 3179 +3181 4 14.59 147.82 27.31 0.435 3180 +3182 4 14.89 149.25 28.45 0.435 3181 +3183 4 15.2 150.4 30.22 0.435 3182 +3184 4 16.2 151.74 30.39 0.435 3183 +3185 4 16.82 152.18 30.75 0.435 3184 +3186 4 17.37 153.69 31.22 0.435 3185 +3187 4 17.9 154.62 33.14 0.435 3186 +3188 4 18.71 155.53 33.25 0.435 3187 +3189 4 19.64 157.39 34.75 0.435 3188 +3190 4 19.77 158.42 35.39 0.435 3189 +3191 4 20.74 160.19 35.66 0.435 3190 +3192 4 21.26 162.15 36.03 0.435 3191 +3193 4 22.91 163.28 36.57 0.435 3192 +3194 4 23.68 164.78 37.26 0.435 3193 +3195 4 24.03 165.84 37.68 0.435 3194 +3196 4 24.79 167.34 38.39 0.435 3195 +3197 4 24.84 169.66 39.23 0.435 3196 +3198 4 25.09 172.44 39.68 0.435 3197 +3199 4 24.97 174.12 40.3 0.435 3198 +3200 4 24.8 176.66 40.86 0.435 3199 +3201 4 24.7 177.86 41.74 0.435 3200 +3202 4 24.82 178.89 42.37 0.435 3201 +3203 4 24.01 181.41 42.76 0.435 3202 +3204 4 23.5 182.66 43.03 0.435 3203 +3205 4 23.39 184.36 43.28 0.435 3204 +3206 4 23.26 186.28 43.63 0.435 3205 +3207 4 22.7 187.88 44.53 0.435 3206 +3208 4 22.96 190.22 45.31 0.435 3207 +3209 4 23.5 191.94 45.8 0.435 3208 +3210 4 22.95 193.82 46.05 0.435 3209 +3211 4 23.02 195.76 46.41 0.435 3210 +3212 4 22.95 196.76 47.19 0.435 3211 +3213 4 22.88 197.31 48.15 0.435 3212 +3214 4 21.95 198.07 48.73 0.435 3213 +3215 4 22.29 199.59 48.9 0.435 3214 +3216 4 22.45 200.44 49.22 0.435 3215 +3217 4 22.37 201.19 50.27 0.435 3216 +3218 4 22.3 202.24 50.53 0.435 3217 +3219 4 21.82 202.86 50.58 0.435 3218 +3220 4 21.1 203.62 51.17 0.435 3219 +3221 4 20.21 203.99 51.26 0.435 3220 +3222 4 19.9 205.44 51.71 0.435 3221 +3223 4 20.42 207.19 51.97 0.435 3222 +3224 4 21.61 208.97 52.42 0.435 3223 +3225 4 22.34 211.16 52.73 0.435 3224 +3226 4 24.35 213.47 53.1 0.435 3225 +3227 4 24.84 215.84 53.66 0.435 3226 +3228 4 25.98 218.24 54.3 0.435 3227 +3229 4 26.73 219.72 55.16 0.435 3228 +3230 4 27.48 221.44 55.81 0.435 3229 +3231 4 27.98 223.81 56.37 0.435 3230 +3232 4 28.33 224.65 56.91 0.435 3231 +3233 4 29.14 225.76 57.12 0.435 3232 +3234 4 29.24 227.22 57.8 0.435 3233 +3235 4 29.79 228.5 58.4 0.435 3234 +3236 4 30.33 230.21 58.96 0.435 3235 +3237 4 30.69 231.3 59.24 0.435 3236 +3238 4 30.8 232.52 60.19 0.435 3237 +3239 4 30.71 233.79 60.4 0.435 3238 +3240 4 14.76 86.98 7.6 0.435 3141 +3241 4 15.26 88.6 9.07 0.435 3240 +3242 4 15.39 89.85 9.57 0.435 3241 +3243 4 15.1 90.35 10.91 0.435 3242 +3244 4 15.22 91.87 11.07 0.435 3243 +3245 4 15.79 93.19 11.22 0.435 3244 +3246 4 15.76 94.42 9.83 0.325 3245 +3247 4 15.0 96.1 9.99 0.325 3246 +3248 4 14.21 98.2 10.19 0.325 3247 +3249 4 13.43 100.31 10.39 0.325 3248 +3250 4 12.58 103.47 10.69 0.325 3249 +3251 4 12.58 106.7 11.03 0.325 3250 +3252 4 14.55 64.69 -12.56 1.735 3117 +3253 4 15.81 65.98 -13.89 1.735 3252 +3254 4 16.36 67.52 -13.72 1.735 3253 +3255 4 16.59 67.59 -14.31 0.435 3254 +3256 4 17.05 67.18 -14.27 0.435 3255 +3257 4 17.53 66.85 -14.97 0.435 3256 +3258 4 17.97 66.91 -15.26 0.435 3257 +3259 4 17.76 66.94 -15.71 0.435 3258 +3260 4 18.22 67.07 -16.67 0.435 3259 +3261 4 18.67 67.16 -17.25 0.435 3260 +3262 4 19.12 66.8 -17.65 0.435 3261 +3263 4 19.58 66.61 -17.74 0.435 3262 +3264 4 20.04 66.21 -17.77 0.435 3263 +3265 4 20.92 66.3 -18.11 0.435 3264 +3266 4 21.74 67.02 -18.25 0.435 3265 +3267 4 22.55 67.93 -18.14 0.435 3266 +3268 4 22.96 68.41 -18.37 0.435 3267 +3269 4 23.5 70.22 -18.62 0.435 3268 +3270 4 24.35 70.71 -18.7 0.435 3269 +3271 4 24.6 71.08 -20.17 0.435 3270 +3272 4 24.77 71.55 -20.2 0.435 3271 +3273 4 25.42 72.35 -21.37 0.435 3272 +3274 4 25.44 72.44 -22.27 0.435 3273 +3275 4 26.1 72.54 -22.78 0.435 3274 +3276 4 26.91 73.47 -22.81 0.435 3275 +3277 4 26.93 73.57 -23.7 0.435 3276 +3278 4 27.56 74.06 -23.93 0.435 3277 +3279 4 27.76 74.79 -24.61 0.435 3278 +3280 4 27.99 74.91 -25.57 0.435 3279 +3281 4 28.64 74.96 -25.7 0.435 3280 +3282 4 29.24 75.88 -25.82 0.435 3281 +3283 4 29.46 75.91 -26.04 0.435 3282 +3284 4 29.7 76.01 -26.78 0.435 3283 +3285 4 30.58 76.15 -27.65 0.435 3284 +3286 4 30.82 75.97 -27.96 0.435 3285 +3287 4 31.27 76.09 -28.76 0.435 3286 +3288 4 31.28 76.14 -29.28 0.435 3287 +3289 4 32.19 75.82 -29.9 0.435 3288 +3290 4 32.43 75.94 -30.78 0.435 3289 +3291 4 33.12 75.59 -31.18 0.435 3290 +3292 4 33.35 75.45 -31.87 0.435 3291 +3293 4 33.84 75.15 -32.87 0.435 3292 +3294 4 34.33 74.57 -33.29 0.435 3293 +3295 4 35.03 74.06 -34.15 0.435 3294 +3296 4 35.52 73.23 -34.31 0.435 3295 +3297 4 36.01 72.94 -35.38 0.435 3296 +3298 4 36.49 72.37 -35.8 0.435 3297 +3299 4 36.58 71.36 -36.59 0.435 3298 +3300 4 37.28 70.55 -36.73 0.435 3299 +3301 4 37.57 69.76 -37.33 0.435 3300 +3302 4 37.84 69.24 -38.44 0.435 3301 +3303 4 38.1 68.89 -39.14 0.435 3302 +3304 4 38.35 68.49 -39.33 0.435 3303 +3305 4 38.57 69.09 -40.77 0.435 3304 +3306 4 39.04 68.68 -40.72 0.435 3305 +3307 4 39.46 68.69 -40.56 0.435 3306 +3308 4 39.71 68.28 -40.67 0.435 3307 +3309 4 39.96 67.9 -41.01 0.435 3308 +3310 4 40.45 67.35 -41.73 0.435 3309 +3311 4 40.72 66.78 -42.38 0.435 3310 +3312 4 40.73 66.8 -42.61 0.435 3311 +3313 4 40.78 66.79 -44.49 0.435 3312 +3314 4 41.04 66.72 -45.77 0.435 3313 +3315 4 41.07 66.56 -46.39 0.435 3314 +3316 4 41.32 66.69 -47.51 0.435 3315 +3317 4 41.6 65.92 -48.34 0.435 3316 +3318 4 41.64 65.87 -49.85 0.435 3317 +3319 4 41.67 66.0 -51.11 0.435 3318 +3320 4 41.94 65.66 -52.05 0.435 3319 +3321 4 41.98 65.53 -52.73 0.435 3320 +3322 4 42.21 65.35 -53.05 0.435 3321 +3323 4 42.24 65.49 -54.32 0.435 3322 +3324 4 42.47 65.6 -55.28 0.435 3323 +3325 4 42.51 65.46 -55.89 0.435 3324 +3326 4 42.54 65.59 -57.24 0.435 3325 +3327 4 42.79 65.5 -58.37 0.435 3326 +3328 4 43.28 65.21 -59.52 0.435 3327 +3329 4 43.54 65.11 -60.43 0.435 3328 +3330 4 43.98 64.94 -60.66 0.435 3329 +3331 4 44.43 64.77 -60.82 0.435 3330 +3332 4 44.91 64.44 -61.59 0.435 3331 +3333 4 45.37 64.05 -61.7 0.435 3332 +3334 4 45.82 63.87 -61.86 0.435 3333 +3335 4 46.48 63.71 -61.93 0.435 3334 +3336 4 47.57 63.79 -61.98 0.435 3335 +3337 4 48.37 64.69 -61.87 0.435 3336 +3338 4 48.83 64.82 -62.82 0.435 3337 +3339 4 48.86 64.93 -63.86 0.435 3338 +3340 4 49.29 64.96 -63.92 0.435 3339 +3341 4 49.53 65.08 -64.89 0.435 3340 +3342 4 50.82 65.65 -65.4 0.435 3341 +3343 4 52.12 65.5 -65.24 0.435 3342 +3344 4 53.39 65.98 -64.92 0.435 3343 +3345 4 54.04 66.02 -64.91 0.435 3344 +3346 4 55.14 65.66 -64.92 0.435 3345 +3347 4 56.66 65.75 -64.8 0.435 3346 +3348 4 57.54 65.36 -64.82 0.435 3347 +3349 4 58.62 65.42 -64.79 0.435 3348 +3350 4 59.07 65.22 -64.65 0.435 3349 +3351 4 60.58 65.58 -65.03 0.435 3350 +3352 4 61.44 65.63 -65.0 0.435 3351 +3353 4 61.67 65.66 -65.14 0.435 3352 +3354 4 62.15 65.15 -66.16 0.435 3353 +3355 4 62.63 65.04 -67.0 0.435 3354 +3356 4 62.87 64.66 -67.4 0.435 3355 +3357 4 63.35 64.32 -67.95 0.435 3356 +3358 4 64.03 63.95 -68.12 0.435 3357 +3359 4 65.16 63.42 -68.6 0.435 3358 +3360 4 65.86 63.12 -69.6 0.435 3359 +3361 4 66.29 63.16 -69.74 0.435 3360 +3362 4 67.0 62.64 -70.53 0.435 3361 +3363 4 67.91 62.34 -71.29 0.435 3362 +3364 4 68.61 61.75 -71.49 0.435 3363 +3365 4 68.63 61.58 -71.88 0.435 3364 +3366 4 69.09 61.2 -72.21 0.435 3365 +3367 4 69.59 60.93 -73.5 0.435 3366 +3368 4 70.06 60.58 -74.06 0.435 3367 +3369 4 70.3 60.72 -75.17 0.435 3368 +3370 4 70.78 60.38 -75.87 0.435 3369 +3371 4 71.04 60.33 -77.3 0.435 3370 +3372 4 71.5 59.94 -77.41 0.435 3371 +3373 4 71.99 59.13 -77.7 0.435 3372 +3374 4 72.18 59.27 -76.93 0.435 3373 +3375 4 72.39 59.29 -76.92 0.435 3374 +3376 4 72.63 58.86 -76.81 0.435 3375 +3377 4 72.63 58.9 -77.19 0.435 3376 +3378 4 72.87 58.99 -78.0 0.435 3377 +3379 4 73.1 59.57 -79.21 0.435 3378 +3380 4 74.62 59.45 -79.19 0.435 3379 +3381 4 74.86 59.55 -80.01 0.435 3380 +3382 4 74.89 59.7 -81.42 0.435 3381 +3383 4 75.78 59.55 -81.64 0.435 3382 +3384 4 76.0 59.59 -81.94 0.435 3383 +3385 4 76.47 59.49 -82.69 0.435 3384 +3386 4 76.92 59.63 -83.79 0.435 3385 +3387 4 77.38 59.5 -84.4 0.435 3386 +3388 4 77.66 59.49 -86.27 0.435 3387 +3389 4 78.1 59.31 -86.36 0.435 3388 +3390 4 78.36 59.22 -87.42 0.435 3389 +3391 4 78.59 59.27 -87.78 0.435 3390 +3392 4 79.03 59.39 -88.66 0.435 3391 +3393 4 79.72 59.04 -89.06 0.435 3392 +3394 4 80.0 58.79 -90.73 0.435 3393 +3395 4 81.14 58.24 -90.99 0.435 3394 +3396 4 82.05 57.71 -91.55 0.435 3395 +3397 4 82.73 57.31 -91.58 0.435 3396 +3398 4 83.82 57.18 -91.64 0.435 3397 +3399 4 16.39 67.89 -15.27 1.735 3254 +3400 4 16.95 69.7 -16.05 1.515 3399 +3401 4 17.06 71.43 -15.87 1.515 3400 +3402 4 17.17 72.62 -14.76 1.41 3401 +3403 4 17.53 73.74 -14.79 1.515 3402 +3404 4 17.48 74.59 -14.7 1.515 3403 +3405 4 17.45 75.02 -14.66 1.515 3404 +3406 4 16.45 73.5 -14.24 0.435 3405 +3407 4 15.36 73.43 -14.27 0.435 3406 +3408 4 13.39 73.76 -14.35 0.435 3407 +3409 4 11.64 74.09 -14.44 0.435 3408 +3410 4 10.05 74.79 -13.8 0.435 3409 +3411 4 9.35 75.57 -13.44 0.435 3410 +3412 4 7.4 75.18 -12.92 0.435 3411 +3413 4 4.82 74.81 -13.02 0.435 3412 +3414 4 2.25 74.44 -13.12 0.435 3413 +3415 4 0.35 73.55 -13.25 0.435 3414 +3416 4 -1.0 74.06 -12.63 0.435 3415 +3417 4 -1.47 74.68 -12.58 0.435 3416 +3418 4 -2.36 75.29 -12.76 0.435 3417 +3419 4 -3.73 75.48 -11.19 0.435 3418 +3420 4 -4.63 76.06 -11.15 0.435 3419 +3421 4 -5.51 76.84 -11.09 0.435 3420 +3422 4 -6.02 77.84 -10.48 0.435 3421 +3423 4 -6.09 78.91 -10.37 0.435 3422 +3424 4 -6.59 79.95 -10.27 0.435 3423 +3425 4 -6.67 81.03 -10.16 0.435 3424 +3426 4 -6.5 82.16 -10.5 0.435 3425 +3427 4 -6.63 84.09 -10.3 0.435 3426 +3428 4 -7.17 85.98 -10.12 0.435 3427 +3429 4 -8.66 88.7 -9.87 0.435 3428 +3430 4 -10.18 92.25 -9.54 0.435 3429 +3431 4 -11.29 95.29 -7.96 0.435 3430 +3432 4 -12.28 97.37 -7.77 0.435 3431 +3433 4 -13.72 99.44 -7.52 0.435 3432 +3434 4 -14.51 101.54 -7.32 0.435 3433 +3435 4 -15.74 103.54 -6.46 0.435 3434 +3436 4 -17.2 105.51 -5.39 0.435 3435 +3437 4 -18.65 107.78 -5.11 0.435 3436 +3438 4 -20.35 110.44 -4.58 0.435 3437 +3439 4 -20.51 113.02 -4.31 0.435 3438 +3440 4 -20.41 114.73 -3.9 0.435 3439 +3441 4 -22.87 119.29 -3.49 0.435 3440 +3442 4 -24.08 121.16 -3.33 0.435 3441 +3443 4 -25.03 122.33 -2.62 0.435 3442 +3444 4 -25.14 123.81 -2.18 0.435 3443 +3445 4 -25.19 123.83 -0.22 0.435 3444 +3446 4 -26.19 124.85 1.74 0.435 3445 +3447 4 -27.85 127.13 1.94 0.435 3446 +3448 4 -28.31 127.53 1.97 0.435 3447 +3449 4 -28.82 128.79 2.09 0.435 3448 +3450 4 -29.33 129.3 3.03 0.435 3449 +3451 4 -30.29 130.73 3.38 0.435 3450 +3452 4 -30.4 132.44 3.71 0.435 3451 +3453 4 -31.42 134.48 4.26 0.435 3452 +3454 4 -32.49 137.39 4.92 0.435 3453 +3455 4 -33.02 138.81 5.58 0.435 3454 +3456 4 -32.92 140.5 6.14 0.435 3455 +3457 4 -32.85 142.62 6.66 0.435 3456 +3458 4 -33.39 144.08 7.02 0.435 3457 +3459 4 -33.95 145.92 7.73 0.435 3458 +3460 4 -34.52 147.79 8.28 0.435 3459 +3461 4 -35.1 150.11 8.59 0.435 3460 +3462 4 -35.18 151.11 9.37 0.435 3461 +3463 4 -36.59 152.73 9.58 0.435 3462 +3464 4 -37.54 153.97 9.69 0.435 3463 +3465 4 -37.63 155.25 9.89 0.435 3464 +3466 4 -37.46 156.05 10.05 0.435 3465 +3467 4 -37.53 156.86 10.66 0.435 3466 +3468 4 -37.4 157.55 12.39 0.435 3467 +3469 4 -37.01 158.22 12.47 0.435 3468 +3470 4 -37.06 158.85 12.76 0.435 3469 +3471 4 -36.67 159.26 13.26 0.435 3470 +3472 4 -24.84 124.92 -0.1 0.435 3445 +3473 4 -24.92 126.2 0.02 0.435 3472 +3474 4 -24.99 127.3 -0.08 0.435 3473 +3475 4 -24.46 129.01 0.55 0.435 3474 +3476 4 -24.35 130.72 0.8 0.435 3475 +3477 4 -24.97 133.45 1.37 0.435 3476 +3478 4 -25.4 136.85 1.87 0.435 3477 +3479 4 -25.47 137.64 2.63 0.435 3478 +3480 4 -26.48 139.71 2.97 0.435 3479 +3481 4 -27.47 141.56 3.36 0.435 3480 +3482 4 -5.99 76.83 -10.88 0.435 3421 +3483 4 -7.05 76.32 -10.88 0.435 3482 +3484 4 -9.26 76.79 -10.58 0.435 3483 +3485 4 -9.91 76.17 -9.08 0.435 3484 +3486 4 -12.01 74.73 -9.05 0.435 3485 +3487 4 -14.12 73.95 -9.11 0.435 3486 +3488 4 -15.62 73.64 -9.18 0.435 3487 +3489 4 -19.31 73.63 -9.19 0.435 3488 +3490 4 -21.22 72.86 -9.31 0.435 3489 +3491 4 -22.9 71.89 -9.38 0.435 3490 +3492 4 -24.41 71.79 -9.35 0.435 3491 +3493 4 -26.13 71.45 -9.2 0.435 3492 +3494 4 -30.21 70.75 -9.22 0.435 3493 +3495 4 -33.67 70.54 -9.32 0.435 3494 +3496 4 -36.46 69.95 -9.45 0.435 3495 +3497 4 -38.34 68.95 -9.45 0.435 3496 +3498 4 -40.88 67.93 -9.61 0.435 3497 +3499 4 -44.5 66.64 -9.83 0.435 3498 +3500 4 -47.67 65.37 -10.04 0.435 3499 +3501 4 -50.67 64.75 -10.17 0.435 3500 +3502 4 -54.34 64.54 -10.28 0.435 3501 +3503 4 -58.4 63.64 -10.47 0.435 3502 +3504 4 -60.7 62.21 -10.67 0.435 3503 +3505 4 -63.37 59.9 -10.98 0.435 3504 +3506 4 -64.95 57.43 -11.27 0.435 3505 +3507 4 -67.84 55.11 -11.58 0.435 3506 +3508 4 -69.04 53.53 -11.77 0.435 3507 +3509 4 -69.82 52.19 -11.93 0.435 3508 +3510 4 -0.14 74.49 -13.09 0.435 3415 +3511 4 -2.29 74.13 -12.96 0.435 3510 +3512 4 -4.92 74.34 -12.39 0.435 3511 +3513 4 -7.74 74.17 -12.48 0.435 3512 +3514 4 -9.88 73.6 -12.52 0.435 3513 +3515 4 -11.39 73.5 -12.56 0.435 3514 +3516 4 -13.11 73.17 -12.56 0.435 3515 +3517 4 -13.92 72.47 -12.65 0.435 3516 +3518 4 -14.71 71.15 -12.8 0.435 3517 +3519 4 -15.47 69.1 -12.43 0.435 3518 +3520 4 -16.66 67.3 -12.57 0.435 3519 +3521 4 -17.45 65.89 -12.06 0.435 3520 +3522 4 -18.2 63.9 -12.21 0.435 3521 +3523 4 -18.15 63.47 -12.86 0.435 3522 +3524 4 -18.55 62.79 -12.63 0.435 3523 +3525 4 -18.95 62.39 -13.21 0.435 3524 +3526 4 -19.88 60.72 -14.61 0.435 3525 +3527 4 -21.28 58.7 -14.85 0.435 3526 +3528 4 -22.06 57.89 -15.86 0.435 3527 +3529 4 -22.41 56.6 -16.22 0.435 3528 +3530 4 -23.38 54.82 -16.51 0.435 3529 +3531 4 -24.54 52.88 -17.41 0.435 3530 +3532 4 -26.19 51.72 -17.72 0.435 3531 +3533 4 -26.54 50.68 -18.44 0.435 3532 +3534 4 -27.04 48.57 -19.42 0.435 3533 +3535 4 -27.38 47.06 -19.59 0.435 3534 +3536 4 -28.17 45.94 -19.8 0.435 3535 +3537 4 -28.93 44.39 -20.05 0.435 3536 +3538 4 -29.72 43.86 -21.56 0.435 3537 +3539 4 -30.65 41.7 -22.33 0.435 3538 +3540 4 -30.36 40.42 -22.53 0.435 3539 +3541 4 -30.27 39.45 -23.46 0.435 3540 +3542 4 -31.39 36.61 -24.08 0.435 3541 +3543 4 -31.96 35.79 -24.86 0.435 3542 +3544 4 -32.3 34.47 -25.08 0.435 3543 +3545 4 -33.54 33.32 -25.23 0.435 3544 +3546 4 -33.44 32.35 -26.23 0.435 3545 +3547 4 -33.76 30.65 -26.79 0.435 3546 +3548 4 -34.11 29.86 -27.86 0.435 3547 +3549 4 -34.46 28.81 -28.43 0.435 3548 +3550 4 -35.04 28.29 -30.08 0.435 3549 +3551 4 -35.8 26.74 -30.26 0.435 3550 +3552 4 -36.6 25.61 -30.24 0.435 3551 +3553 4 -36.34 25.0 -30.67 0.435 3552 +3554 4 -36.7 24.46 -32.02 0.435 3553 +3555 4 -36.98 22.37 -32.85 0.435 3554 +3556 4 17.35 77.3 -15.78 1.515 3404 +3557 4 17.49 78.38 -15.67 1.515 3556 +3558 4 18.01 80.57 -15.5 1.41 3557 +3559 4 18.55 82.33 -15.31 1.41 3558 +3560 4 19.09 84.08 -15.11 1.41 3559 +3561 4 20.1 85.76 -16.05 1.41 3560 +3562 4 20.64 87.52 -15.85 1.41 3561 +3563 4 21.46 88.75 -16.75 1.41 3562 +3564 4 22.34 88.42 -16.77 1.41 3563 +3565 4 23.52 87.51 -17.74 0.54 3564 +3566 4 23.95 87.53 -17.73 0.54 3565 +3567 4 24.17 87.53 -17.5 0.54 3566 +3568 4 24.41 87.16 -17.99 0.54 3567 +3569 4 25.11 86.91 -19.35 0.54 3568 +3570 4 25.6 86.31 -19.62 0.54 3569 +3571 4 26.32 85.31 -19.94 0.54 3570 +3572 4 26.79 84.93 -20.27 0.54 3571 +3573 4 27.28 84.13 -20.56 0.54 3572 +3574 4 27.74 84.02 -21.32 0.54 3573 +3575 4 28.44 83.42 -21.51 0.54 3574 +3576 4 29.36 82.93 -22.45 0.54 3575 +3577 4 30.08 82.47 -23.84 0.54 3576 +3578 4 30.53 82.53 -24.12 0.54 3577 +3579 4 31.02 82.28 -25.64 0.54 3578 +3580 4 31.51 81.73 -26.44 0.54 3579 +3581 4 31.98 81.4 -26.99 0.54 3580 +3582 4 32.48 80.89 -28.16 0.54 3581 +3583 4 32.74 80.26 -28.3 0.54 3582 +3584 4 33.21 79.91 -28.77 0.54 3583 +3585 4 33.27 79.1 -29.23 0.54 3584 +3586 4 33.53 78.73 -29.79 0.54 3585 +3587 4 34.01 78.41 -30.57 0.54 3586 +3588 4 34.69 78.04 -30.81 0.54 3587 +3589 4 35.37 77.67 -30.99 0.54 3588 +3590 4 36.26 77.57 -31.51 0.54 3589 +3591 4 36.73 77.44 -32.18 0.54 3590 +3592 4 36.96 77.25 -32.35 0.54 3591 +3593 4 37.4 77.09 -32.51 0.54 3592 +3594 4 37.87 76.73 -32.92 0.54 3593 +3595 4 38.35 76.38 -33.46 0.54 3594 +3596 4 38.82 76.03 -34.09 0.54 3595 +3597 4 39.54 75.27 -34.68 0.54 3596 +3598 4 40.68 74.26 -34.83 0.54 3597 +3599 4 40.93 73.87 -35.02 0.54 3598 +3600 4 41.0 73.31 -35.98 0.54 3599 +3601 4 41.73 72.6 -37.01 0.54 3600 +3602 4 42.19 72.5 -37.85 0.54 3601 +3603 4 42.9 71.71 -38.21 0.54 3602 +3604 4 42.92 71.53 -38.6 0.54 3603 +3605 4 43.41 70.98 -39.18 0.54 3604 +3606 4 43.88 70.63 -39.73 0.54 3605 +3607 4 44.39 69.88 -40.7 0.54 3606 +3608 4 45.08 69.07 -40.77 0.54 3607 +3609 4 45.56 68.45 -40.82 0.54 3608 +3610 4 46.27 67.65 -41.04 0.54 3609 +3611 4 47.36 67.79 -41.67 0.54 3610 +3612 4 48.06 67.46 -42.29 0.54 3611 +3613 4 48.49 67.5 -42.43 0.54 3612 +3614 4 48.75 66.85 -42.27 0.54 3613 +3615 4 48.75 66.87 -42.42 0.54 3614 +3616 4 49.47 66.68 -44.38 0.54 3615 +3617 4 49.47 66.7 -44.53 0.54 3616 +3618 4 49.96 66.14 -45.18 0.54 3617 +3619 4 50.22 65.76 -45.58 0.54 3618 +3620 4 50.92 65.22 -46.3 0.54 3619 +3621 4 51.38 64.82 -46.33 0.54 3620 +3622 4 51.84 64.46 -46.74 0.54 3621 +3623 4 52.52 64.08 -46.83 0.54 3622 +3624 4 52.99 63.99 -47.81 0.54 3623 +3625 4 53.23 63.85 -48.28 0.54 3624 +3626 4 53.26 63.73 -49.26 0.54 3625 +3627 4 53.3 63.87 -50.6 0.54 3626 +3628 4 53.77 63.47 -50.71 0.54 3627 +3629 4 53.84 62.68 -51.47 0.435 3628 +3630 4 53.87 62.53 -52.16 0.435 3629 +3631 4 53.66 62.32 -52.33 0.435 3630 +3632 4 54.12 61.92 -52.37 0.435 3631 +3633 4 54.8 61.29 -52.26 0.435 3632 +3634 4 55.48 60.92 -52.37 0.435 3633 +3635 4 55.94 60.74 -52.44 0.435 3634 +3636 4 56.67 60.01 -53.34 0.435 3635 +3637 4 57.14 59.18 -53.41 0.435 3636 +3638 4 57.41 58.55 -53.54 0.435 3637 +3639 4 57.9 57.73 -53.69 0.435 3638 +3640 4 58.36 57.36 -54.02 0.435 3639 +3641 4 58.83 56.99 -54.35 0.435 3640 +3642 4 59.52 56.71 -55.34 0.435 3641 +3643 4 59.99 56.59 -56.1 0.435 3642 +3644 4 60.7 56.1 -57.19 0.435 3643 +3645 4 61.18 55.79 -58.11 0.435 3644 +3646 4 61.65 55.4 -58.29 0.435 3645 +3647 4 62.14 55.15 -59.74 0.435 3646 +3648 4 62.63 54.63 -60.76 0.435 3647 +3649 4 62.91 54.35 -62.06 0.435 3648 +3650 4 63.18 53.75 -62.5 0.435 3649 +3651 4 63.68 53.28 -63.96 0.435 3650 +3652 4 63.73 52.95 -64.97 0.435 3651 +3653 4 64.24 52.46 -66.3 0.435 3652 +3654 4 64.48 52.33 -66.98 0.435 3653 +3655 4 64.97 51.83 -68.08 0.435 3654 +3656 4 65.23 51.43 -68.26 0.435 3655 +3657 4 65.5 50.85 -68.84 0.435 3656 +3658 4 65.54 50.75 -69.9 0.435 3657 +3659 4 65.79 50.96 -71.84 0.435 3658 +3660 4 66.29 50.71 -73.21 0.435 3659 +3661 4 66.34 50.61 -74.43 0.435 3660 +3662 4 67.5 49.67 -75.25 0.435 3661 +3663 4 67.99 49.17 -76.35 0.435 3662 +3664 4 68.93 48.42 -76.92 0.435 3663 +3665 4 69.39 48.27 -77.31 0.435 3664 +3666 4 70.3 47.72 -77.72 0.435 3665 +3667 4 71.01 47.23 -78.89 0.435 3666 +3668 4 71.95 46.73 -79.82 0.435 3667 +3669 4 72.83 46.36 -79.84 0.435 3668 +3670 4 74.2 45.88 -80.75 0.435 3669 +3671 4 74.86 45.72 -80.83 0.435 3670 +3672 4 75.51 45.76 -80.88 0.435 3671 +3673 4 76.62 45.43 -81.12 0.435 3672 +3674 4 77.75 44.88 -81.38 0.435 3673 +3675 4 79.75 44.4 -81.83 0.435 3674 +3676 4 81.09 43.62 -81.88 0.435 3675 +3677 4 82.23 42.83 -82.01 0.435 3676 +3678 4 83.38 42.08 -82.44 0.435 3677 +3679 4 84.96 41.1 -82.58 0.435 3678 +3680 4 86.52 40.56 -82.6 0.435 3679 +3681 4 87.63 40.0 -82.7 0.435 3680 +3682 4 22.05 89.61 -16.28 1.41 3564 +3683 4 22.63 90.56 -16.17 1.41 3682 +3684 4 23.48 90.8 -15.89 0.54 3683 +3685 4 23.92 90.6 -15.83 0.54 3684 +3686 4 24.11 91.04 -15.78 0.54 3685 +3687 4 24.13 91.15 -16.82 0.54 3686 +3688 4 24.37 90.97 -17.06 0.54 3687 +3689 4 24.6 91.05 -17.65 0.54 3688 +3690 4 24.62 91.13 -18.39 0.54 3689 +3691 4 24.84 91.18 -18.84 0.54 3690 +3692 4 24.86 91.27 -19.66 0.54 3691 +3693 4 25.32 91.39 -20.61 0.54 3692 +3694 4 25.75 91.42 -20.6 0.54 3693 +3695 4 25.94 91.87 -20.55 0.54 3694 +3696 4 26.37 92.41 -21.39 0.54 3695 +3697 4 27.03 92.81 -22.76 0.435 3696 +3698 4 27.66 93.85 -23.99 0.435 3697 +3699 4 28.49 94.58 -24.28 0.435 3698 +3700 4 28.91 95.1 -24.89 0.435 3699 +3701 4 29.15 95.19 -25.56 0.435 3700 +3702 4 29.93 96.56 -25.77 0.435 3701 +3703 4 30.4 96.71 -26.95 0.435 3702 +3704 4 31.07 96.82 -27.53 0.435 3703 +3705 4 31.49 97.39 -28.59 0.435 3704 +3706 4 32.3 98.84 -29.55 0.435 3705 +3707 4 32.94 99.39 -30.23 0.435 3706 +3708 4 33.54 100.29 -30.2 0.435 3707 +3709 4 34.15 101.26 -30.77 0.435 3708 +3710 4 34.78 102.04 -31.65 0.435 3709 +3711 4 35.39 103.01 -32.36 0.435 3710 +3712 4 37.08 104.04 -32.74 0.435 3711 +3713 4 38.73 105.72 -33.28 0.435 3712 +3714 4 39.8 106.32 -34.25 0.435 3713 +3715 4 41.01 108.18 -34.63 0.435 3714 +3716 4 41.37 109.55 -35.01 0.435 3715 +3717 4 41.76 110.78 -36.23 0.435 3716 +3718 4 42.13 112.44 -37.33 0.435 3717 +3719 4 42.54 113.2 -38.14 0.435 3718 +3720 4 43.07 115.21 -38.3 0.435 3719 +3721 4 44.26 117.53 -39.09 0.435 3720 +3722 4 45.69 119.45 -39.91 0.435 3721 +3723 4 46.5 120.95 -41.32 0.435 3722 +3724 4 47.11 121.9 -41.73 0.435 3723 +3725 4 47.49 122.82 -42.08 0.435 3724 +3726 4 48.02 125.07 -42.52 0.435 3725 +3727 4 48.78 127.36 -43.09 0.435 3726 +3728 4 48.86 130.11 -44.46 0.435 3727 +3729 4 48.83 131.08 -45.48 0.435 3728 +3730 4 49.19 132.67 -46.0 0.435 3729 +3731 4 49.12 134.04 -46.61 0.435 3730 +3732 4 48.66 135.25 -48.0 0.435 3731 +3733 4 48.19 136.18 -48.98 0.435 3732 +3734 4 48.36 137.33 -49.45 0.435 3733 +3735 4 47.87 138.43 -49.95 0.435 3734 +3736 4 47.83 138.83 -49.68 0.435 3735 +3737 4 47.82 139.59 -50.66 0.435 3736 +3738 4 47.78 140.48 -50.94 0.435 3737 +3739 4 47.73 141.12 -50.73 0.435 3738 +3740 4 47.74 141.7 -52.18 0.435 3739 +3741 4 47.65 143.5 -52.9 0.435 3740 +3742 4 47.79 144.59 -52.71 0.435 3741 +3743 4 48.04 144.99 -54.46 0.435 3742 +3744 4 48.02 146.01 -55.95 0.435 3743 +3745 4 48.34 148.3 -56.98 0.435 3744 +3746 4 48.51 149.47 -57.61 0.435 3745 +3747 4 49.52 150.91 -58.19 0.435 3746 +3748 4 50.63 154.51 -58.77 0.435 3747 +3749 4 50.52 156.52 -59.47 0.435 3748 +3750 4 51.36 157.53 -60.33 0.435 3749 +3751 4 52.3 159.75 -60.15 0.435 3750 +3752 4 53.1 161.19 -60.96 0.435 3751 +3753 4 22.85 90.51 -16.09 1.515 3683 +3754 4 22.57 92.13 -17.13 1.515 3753 +3755 4 22.02 93.8 -16.97 1.515 3754 +3756 4 21.93 95.3 -16.82 1.515 3755 +3757 4 21.88 96.76 -18.26 1.515 3756 +3758 4 21.34 98.44 -18.1 1.515 3757 +3759 4 20.58 100.67 -19.09 1.515 3758 +3760 4 20.06 102.74 -20.54 1.515 3759 +3761 4 19.98 104.02 -20.41 1.515 3760 +3762 4 19.9 105.31 -20.28 1.515 3761 +3763 4 20.05 106.96 -21.54 1.515 3762 +3764 4 20.46 107.53 -21.47 1.515 3763 +3765 4 21.29 107.75 -20.98 0.435 3764 +3766 4 21.91 108.22 -20.91 0.435 3765 +3767 4 22.1 108.63 -20.56 0.435 3766 +3768 4 22.25 109.21 -19.75 0.435 3767 +3769 4 22.42 109.82 -19.23 0.435 3768 +3770 4 22.57 110.63 -18.54 0.435 3769 +3771 4 22.96 111.03 -17.96 0.435 3770 +3772 4 23.12 111.62 -17.29 0.435 3771 +3773 4 23.24 112.86 -16.56 0.435 3772 +3774 4 23.4 113.5 -16.34 0.435 3773 +3775 4 23.93 115.19 -15.47 0.435 3774 +3776 4 24.5 116.24 -14.82 0.435 3775 +3777 4 24.86 117.31 -14.32 0.435 3776 +3778 4 25.26 117.74 -14.05 0.435 3777 +3779 4 25.63 118.35 -13.52 0.435 3778 +3780 4 26.03 118.74 -12.8 0.435 3779 +3781 4 26.65 119.21 -12.74 0.435 3780 +3782 4 26.82 119.6 -12.24 0.435 3781 +3783 4 27.21 120.26 -12.01 0.435 3782 +3784 4 27.36 121.12 -11.84 0.435 3783 +3785 4 28.04 121.27 -12.93 0.435 3784 +3786 4 29.51 122.22 -12.8 0.435 3785 +3787 4 31.01 125.77 -12.4 0.435 3786 +3788 4 32.36 128.42 -12.09 0.435 3787 +3789 4 33.15 129.2 -10.71 0.435 3788 +3790 4 34.13 130.76 -10.46 0.435 3789 +3791 4 35.32 132.3 -9.97 0.435 3790 +3792 4 36.59 132.81 -9.89 0.435 3791 +3793 4 36.94 133.62 -9.04 0.435 3792 +3794 4 37.74 134.69 -8.38 0.435 3793 +3795 4 38.48 136.41 -7.73 0.435 3794 +3796 4 39.86 138.15 -6.76 0.435 3795 +3797 4 41.33 138.85 -6.5 0.435 3796 +3798 4 43.14 140.85 -5.65 0.435 3797 +3799 4 44.74 142.57 -4.53 0.435 3798 +3800 4 45.93 144.1 -3.9 0.435 3799 +3801 4 48.45 145.31 -3.57 0.435 3800 +3802 4 49.44 146.67 -3.4 0.435 3801 +3803 4 49.96 148.61 -2.89 0.435 3802 +3804 4 51.36 150.41 -2.59 0.435 3803 +3805 4 52.91 153.29 -2.18 0.435 3804 +3806 4 54.07 155.51 -1.92 0.435 3805 +3807 4 54.9 155.69 -0.98 0.435 3806 +3808 4 55.92 156.81 -0.76 0.435 3807 +3809 4 57.57 157.67 0.41 0.435 3808 +3810 4 57.69 158.39 1.92 0.435 3809 +3811 4 58.75 158.89 1.99 0.435 3810 +3812 4 59.16 158.81 3.05 0.435 3811 +3813 4 59.29 159.6 3.89 0.435 3812 +3814 4 59.69 159.73 4.97 0.435 3813 +3815 4 60.56 159.54 5.27 0.435 3814 +3816 4 61.21 159.58 5.29 0.435 3815 +3817 4 61.15 160.41 5.6 0.435 3816 +3818 4 61.32 161.07 5.75 0.435 3817 +3819 4 61.25 161.86 6.35 0.435 3818 +3820 4 61.2 162.45 6.95 0.435 3819 +3821 4 60.73 163.05 7.15 0.435 3820 +3822 4 60.67 163.62 7.88 0.435 3821 +3823 4 60.6 164.69 8.07 0.435 3822 +3824 4 60.96 165.52 8.62 0.435 3823 +3825 4 61.32 166.55 9.41 0.435 3824 +3826 4 62.1 167.65 9.76 0.435 3825 +3827 4 63.67 170.32 10.15 0.435 3826 +3828 4 64.03 170.62 11.7 0.435 3827 +3829 4 64.64 171.04 12.21 0.435 3828 +3830 4 64.59 171.36 13.45 0.435 3829 +3831 4 64.55 171.99 13.58 0.435 3830 +3832 4 65.14 172.28 15.29 0.435 3831 +3833 4 65.47 173.28 16.37 0.435 3832 +3834 4 65.67 173.21 17.13 0.435 3833 +3835 4 66.47 174.04 18.07 0.435 3834 +3836 4 66.8 175.29 18.81 0.435 3835 +3837 4 68.03 175.92 19.88 0.435 3836 +3838 4 68.55 177.62 20.6 0.435 3837 +3839 4 69.3 179.31 21.39 0.435 3838 +3840 4 70.3 180.15 22.33 0.435 3839 +3841 4 70.45 180.94 23.32 0.435 3840 +3842 4 71.67 181.79 24.26 0.435 3841 +3843 4 72.27 182.19 24.92 0.435 3842 +3844 4 73.02 183.94 25.35 0.435 3843 +3845 4 73.59 185.01 25.84 0.435 3844 +3846 4 74.2 185.45 26.21 0.435 3845 +3847 4 75.35 187.62 26.91 0.435 3846 +3848 4 75.7 188.68 27.41 0.435 3847 +3849 4 76.07 189.76 27.75 0.435 3848 +3850 4 76.68 190.17 28.34 0.435 3849 +3851 4 77.96 190.2 28.83 0.435 3850 +3852 4 78.35 190.59 29.55 0.435 3851 +3853 4 79.91 193.22 30.23 0.435 3852 +3854 4 80.0 194.85 31.39 0.435 3853 +3855 4 80.81 194.94 33.15 0.435 3854 +3856 4 81.56 196.18 34.2 0.435 3855 +3857 4 82.14 197.04 34.75 0.435 3856 +3858 4 82.52 197.37 36.0 0.435 3857 +3859 4 83.57 197.54 37.1 0.435 3858 +3860 4 83.9 198.53 38.27 0.435 3859 +3861 4 85.0 200.99 40.36 0.435 3860 +3862 4 85.41 200.94 41.12 0.435 3861 +3863 4 85.78 201.53 41.93 0.435 3862 +3864 4 86.56 202.58 42.81 0.435 3863 +3865 4 87.13 203.33 44.26 0.435 3864 +3866 4 87.48 204.13 45.26 0.435 3865 +3867 4 88.09 204.53 45.92 0.435 3866 +3868 4 88.65 205.58 46.79 0.435 3867 +3869 4 26.62 122.57 -11.63 0.435 3784 +3870 4 26.15 123.19 -11.58 0.435 3869 +3871 4 26.08 123.99 -10.97 0.435 3870 +3872 4 26.02 124.54 -9.94 0.435 3871 +3873 4 25.95 125.33 -9.25 0.435 3872 +3874 4 25.86 126.34 -8.55 0.435 3873 +3875 4 25.32 128.01 -8.24 0.435 3874 +3876 4 25.66 129.53 -7.99 0.435 3875 +3877 4 25.56 131.03 -7.84 0.435 3876 +3878 4 25.48 132.31 -7.71 0.435 3877 +3879 4 24.9 134.64 -7.48 0.435 3878 +3880 4 24.82 135.93 -7.35 0.435 3879 +3881 4 25.11 138.1 -7.05 0.435 3880 +3882 4 24.95 140.66 -6.78 0.435 3881 +3883 4 25.02 142.82 -6.56 0.435 3882 +3884 4 25.06 145.62 -6.27 0.435 3883 +3885 4 24.89 148.18 -6.01 0.435 3884 +3886 4 25.54 151.67 -5.63 0.435 3885 +3887 4 25.69 152.73 -5.29 0.435 3886 +3888 4 25.78 154.41 -4.66 0.435 3887 +3889 4 26.29 156.35 -4.14 0.435 3888 +3890 4 26.58 158.48 -3.55 0.435 3889 +3891 4 26.54 159.62 -4.1 0.435 3890 +3892 4 26.48 160.77 -4.74 0.435 3891 +3893 4 26.82 162.34 -5.02 0.435 3892 +3894 4 27.01 163.3 -5.75 0.435 3893 +3895 4 27.37 164.93 -6.7 0.435 3894 +3896 4 27.71 165.68 -5.19 0.435 3895 +3897 4 27.21 166.71 -4.94 0.435 3896 +3898 4 27.41 167.2 -5.41 0.435 3897 +3899 4 27.58 167.57 -4.61 0.435 3898 +3900 4 27.72 168.65 -4.5 0.435 3899 +3901 4 27.67 168.98 -3.49 0.435 3900 +3902 4 27.8 170.46 -3.03 0.435 3901 +3903 4 27.72 171.53 -2.84 0.435 3902 +3904 4 27.65 172.54 -2.29 0.435 3903 +3905 4 27.97 174.27 -2.03 0.435 3904 +3906 4 27.44 175.5 -1.46 0.435 3905 +3907 4 27.57 176.54 -0.98 0.435 3906 +3908 4 19.98 108.04 -21.43 1.515 3764 +3909 4 19.66 109.74 -21.26 1.515 3908 +3910 4 19.6 110.82 -21.15 1.515 3909 +3911 4 19.52 111.88 -21.04 1.515 3910 +3912 4 19.03 112.76 -20.96 1.515 3911 +3913 4 18.38 112.89 -21.57 0.65 3912 +3914 4 18.17 113.1 -21.62 0.975 3913 +3915 4 17.74 112.85 -21.59 0.975 3914 +3916 4 17.58 113.02 -23.39 0.975 3915 +3917 4 17.38 113.1 -24.29 0.975 3916 +3918 4 17.18 113.2 -25.48 0.975 3917 +3919 4 16.99 113.28 -26.31 0.975 3918 +3920 4 16.58 113.36 -27.37 0.975 3919 +3921 4 16.36 113.85 -28.07 0.975 3920 +3922 4 15.72 114.12 -28.97 0.975 3921 +3923 4 15.09 114.7 -30.8 0.975 3922 +3924 4 13.8 114.94 -31.78 0.975 3923 +3925 4 12.88 116.07 -32.74 0.76 3924 +3926 4 12.91 116.18 -33.79 0.76 3925 +3927 4 12.0 117.03 -34.25 0.65 3926 +3928 4 11.56 117.48 -34.74 0.65 3927 +3929 4 11.33 118.52 -36.52 0.65 3928 +3930 4 11.32 118.5 -36.3 0.65 3929 +3931 4 10.87 118.9 -36.27 0.65 3930 +3932 4 11.3 119.47 -37.33 0.54 3931 +3933 4 11.49 119.94 -37.5 0.54 3932 +3934 4 11.46 120.89 -38.31 0.54 3933 +3935 4 10.95 122.16 -38.26 0.54 3934 +3936 4 10.95 122.13 -38.05 0.54 3935 +3937 4 10.97 122.24 -39.09 0.54 3936 +3938 4 11.0 122.36 -40.28 0.54 3937 +3939 4 10.32 123.3 -41.33 0.54 3938 +3940 4 10.28 123.11 -39.47 0.54 3939 +3941 4 10.46 122.99 -38.19 0.54 3940 +3942 4 10.46 123.55 -39.49 0.54 3941 +3943 4 10.5 123.72 -41.13 0.54 3942 +3944 4 10.25 124.37 -41.29 0.54 3943 +3945 4 10.23 124.84 -41.62 0.54 3944 +3946 4 10.24 125.12 -42.2 0.54 3945 +3947 4 10.2 125.79 -42.43 0.54 3946 +3948 4 9.76 126.05 -43.09 0.54 3947 +3949 4 9.77 126.64 -44.62 0.54 3948 +3950 4 9.77 126.91 -45.11 0.54 3949 +3951 4 9.76 127.45 -46.11 0.54 3950 +3952 4 9.37 127.59 -47.69 0.54 3951 +3953 4 9.39 127.67 -48.51 0.54 3952 +3954 4 9.17 128.21 -49.74 0.54 3953 +3955 4 8.77 128.25 -50.35 0.54 3954 +3956 4 8.32 128.98 -51.34 0.54 3955 +3957 4 7.86 129.7 -52.33 0.54 3956 +3958 4 7.84 130.44 -53.31 0.54 3957 +3959 4 8.0 131.85 -54.13 0.54 3958 +3960 4 8.02 132.17 -55.16 0.54 3959 +3961 4 8.02 132.72 -56.38 0.54 3960 +3962 4 8.01 133.2 -56.78 0.54 3961 +3963 4 8.21 133.97 -57.83 0.54 3962 +3964 4 8.4 134.48 -58.38 0.54 3963 +3965 4 8.42 134.83 -59.7 0.54 3964 +3966 4 8.39 135.51 -60.0 0.54 3965 +3967 4 8.79 137.01 -61.65 0.54 3966 +3968 4 8.22 139.44 -62.38 0.54 3967 +3969 4 7.52 140.56 -63.19 0.54 3968 +3970 4 7.46 141.4 -62.88 0.54 3969 +3971 4 6.8 142.09 -63.73 0.54 3970 +3972 4 6.63 142.25 -65.38 0.54 3971 +3973 4 6.41 142.81 -66.75 0.54 3972 +3974 4 6.23 142.96 -68.25 0.54 3973 +3975 4 5.81 143.5 -69.63 0.54 3974 +3976 4 5.31 144.6 -70.07 0.54 3975 +3977 4 4.64 144.97 -69.81 0.54 3976 +3978 4 3.74 146.15 -71.37 0.54 3977 +3979 4 3.7 146.79 -71.23 0.54 3978 +3980 4 3.22 147.39 -71.03 0.54 3979 +3981 4 2.73 148.49 -71.45 0.54 3980 +3982 4 2.69 149.18 -71.84 0.54 3981 +3983 4 2.24 149.85 -72.3 0.54 3982 +3984 4 2.46 150.42 -73.52 0.54 3983 +3985 4 2.65 151.18 -74.42 0.54 3984 +3986 4 2.64 151.67 -74.97 0.54 3985 +3987 4 2.61 152.38 -75.5 0.54 3986 +3988 4 3.2 153.76 -76.03 0.54 3987 +3989 4 3.17 154.21 -76.12 0.54 3988 +3990 4 2.06 154.84 -76.68 0.54 3989 +3991 4 1.84 155.35 -77.47 0.54 3990 +3992 4 1.63 155.64 -78.27 0.54 3991 +3993 4 0.76 156.34 -79.36 0.54 3992 +3994 4 0.08 156.48 -79.06 0.54 3993 +3995 4 -0.38 157.08 -78.77 0.54 3994 +3996 4 -1.29 157.94 -79.24 0.54 3995 +3997 4 -1.26 158.07 -80.5 0.54 3996 +3998 4 -1.69 158.61 -81.88 0.54 3997 +3999 4 -1.5 159.58 -82.68 0.54 3998 +4000 4 -1.51 160.62 -84.39 0.54 3999 +4001 4 -2.2 161.21 -84.19 0.435 4000 +4002 4 -2.7 162.04 -84.12 0.435 4001 +4003 4 -2.72 162.26 -84.18 0.435 4002 +4004 4 10.87 119.2 -37.06 0.65 3931 +4005 4 10.41 119.58 -36.88 0.65 4004 +4006 4 10.44 119.74 -38.38 0.65 4005 +4007 4 9.99 120.2 -38.94 0.65 4006 +4008 4 9.81 120.32 -40.22 0.65 4007 +4009 4 9.58 120.81 -40.85 0.65 4008 +4010 4 8.93 121.28 -41.64 0.65 4009 +4011 4 8.8 120.58 -43.38 0.65 4010 +4012 4 8.16 120.31 -43.2 0.65 4011 +4013 4 7.76 120.43 -44.62 0.65 4012 +4014 4 7.39 120.36 -46.37 0.65 4013 +4015 4 6.36 120.02 -47.94 0.65 4014 +4016 4 5.35 119.43 -49.16 0.54 4015 +4017 4 5.45 118.99 -51.16 0.54 4016 +4018 4 4.67 117.68 -51.69 0.54 4017 +4019 4 4.72 117.13 -52.65 0.54 4018 +4020 4 3.51 116.3 -53.67 0.54 4019 +4021 4 2.68 116.14 -54.76 0.54 4020 +4022 4 1.92 115.15 -56.16 0.54 4021 +4023 4 1.13 114.59 -57.59 0.54 4022 +4024 4 0.09 114.42 -58.84 0.54 4023 +4025 4 -1.18 114.2 -59.57 0.54 4024 +4026 4 -1.34 114.33 -60.92 0.54 4025 +4027 4 -1.96 114.42 -62.21 0.54 4026 +4028 4 -3.06 114.9 -63.24 0.54 4027 +4029 4 -4.1 114.97 -64.69 0.54 4028 +4030 4 -5.15 115.07 -66.28 0.54 4029 +4031 4 -6.21 114.81 -66.56 0.54 4030 +4032 4 -6.22 114.79 -66.41 0.54 4031 +4033 4 -6.84 114.89 -67.69 0.54 4032 +4034 4 -7.87 114.74 -69.02 0.54 4033 +4035 4 -7.83 114.89 -70.43 0.54 4034 +4036 4 -9.67 113.88 -72.31 0.54 4035 +4037 4 -10.51 113.98 -73.83 0.54 4036 +4038 4 -11.54 113.8 -74.93 0.54 4037 +4039 4 -13.68 113.5 -75.46 0.54 4038 +4040 4 -14.51 113.32 -76.33 0.54 4039 +4041 4 -15.3 112.51 -77.41 0.54 4040 +4042 4 -16.59 112.47 -77.82 0.54 4041 +4043 4 -18.43 111.46 -79.71 0.54 4042 +4044 4 -19.48 111.46 -80.41 0.54 4043 +4045 4 -21.17 110.72 -80.6 0.54 4044 +4046 4 -22.67 110.43 -80.74 0.54 4045 +4047 4 -23.5 109.98 -81.19 0.54 4046 +4048 4 -25.47 110.32 -81.49 0.54 4047 +4049 4 19.18 113.86 -20.92 1.515 3912 +4050 4 19.09 115.37 -20.76 1.515 4049 +4051 4 18.99 116.87 -20.61 1.515 4050 +4052 4 19.52 118.83 -20.39 1.515 4051 +4053 4 20.31 120.49 -21.26 1.515 4052 +4054 4 20.66 121.8 -21.12 1.515 4053 +4055 4 21.2 123.55 -20.92 1.515 4054 +4056 4 21.27 125.71 -20.7 1.515 4055 +4057 4 21.21 126.84 -20.58 1.515 4056 +4058 4 21.88 126.7 -21.11 0.54 4057 +4059 4 23.14 127.43 -21.01 0.54 4058 +4060 4 24.0 127.48 -20.98 0.65 4059 +4061 4 25.46 128.43 -20.85 0.65 4060 +4062 4 26.96 128.74 -20.78 0.65 4061 +4063 4 28.05 128.59 -20.77 0.65 4062 +4064 4 29.35 128.67 -20.73 0.65 4063 +4065 4 29.86 127.99 -22.22 0.435 4064 +4066 4 30.13 127.36 -22.28 0.435 4065 +4067 4 31.32 125.72 -22.42 0.435 4066 +4068 4 32.5 124.28 -22.54 0.435 4067 +4069 4 34.04 123.72 -22.56 0.435 4068 +4070 4 35.99 123.85 -22.5 0.435 4069 +4071 4 39.06 123.39 -22.56 0.435 4070 +4072 4 40.87 122.43 -22.61 0.435 4071 +4073 4 43.74 121.05 -22.16 0.435 4072 +4074 4 45.94 120.75 -22.14 0.435 4073 +4075 4 48.53 120.9 -21.99 0.435 4074 +4076 4 50.45 121.45 -21.89 0.435 4075 +4077 4 53.72 121.21 -21.83 0.435 4076 +4078 4 57.2 121.21 -21.75 0.435 4077 +4079 4 59.79 121.38 -21.67 0.435 4078 +4080 4 62.48 123.26 -21.41 0.435 4079 +4081 4 65.65 124.77 -21.48 0.435 4080 +4082 4 69.23 126.7 -21.2 0.435 4081 +4083 4 72.44 127.33 -21.06 0.435 4082 +4084 4 75.21 127.93 -20.93 0.435 4083 +4085 4 78.27 127.92 -20.93 0.435 4084 +4086 4 81.82 127.24 -22.8 0.435 4085 +4087 4 85.38 126.18 -22.82 0.435 4086 +4088 4 89.98 125.38 -22.8 0.435 4087 +4089 4 93.42 125.8 -22.67 0.435 4088 +4090 4 96.63 126.43 -22.53 0.435 4089 +4091 4 99.06 125.93 -22.52 0.435 4090 +4092 4 101.28 124.99 -22.57 0.435 4091 +4093 4 103.3 124.04 -22.62 0.435 4092 +4094 4 105.73 123.33 -22.64 0.435 4093 +4095 4 107.68 123.45 -22.58 0.435 4094 +4096 4 110.7 123.63 -22.49 0.435 4095 +4097 4 112.38 124.59 -22.35 0.435 4096 +4098 4 30.61 129.4 -20.63 0.54 4064 +4099 4 32.57 129.3 -20.59 0.54 4098 +4100 4 34.3 129.19 -20.48 0.54 4099 +4101 4 36.24 129.3 -20.42 0.54 4100 +4102 4 38.42 129.21 -20.38 0.54 4101 +4103 4 39.99 129.51 -22.28 0.54 4102 +4104 4 42.14 129.64 -22.21 0.54 4103 +4105 4 42.55 130.4 -23.03 0.54 4104 +4106 4 43.57 131.54 -22.89 0.54 4105 +4107 4 44.52 133.53 -22.66 0.54 4106 +4108 4 45.05 135.51 -22.44 0.54 4107 +4109 4 45.7 138.99 -22.06 0.54 4108 +4110 4 47.59 143.19 -21.58 0.54 4109 +4111 4 47.5 144.13 -20.21 0.54 4110 +4112 4 48.89 146.15 -19.97 0.54 4111 +4113 4 50.97 147.57 -19.85 0.54 4112 +4114 4 52.95 149.97 -18.64 0.54 4113 +4115 4 54.56 152.22 -18.37 0.54 4114 +4116 4 56.0 153.17 -18.24 0.54 4115 +4117 4 58.05 154.7 -17.13 0.54 4116 +4118 4 59.17 157.04 -15.89 0.54 4117 +4119 4 59.91 158.98 -15.13 0.54 4118 +4120 4 60.44 160.44 -14.22 0.54 4119 +4121 4 61.28 160.68 -13.95 0.54 4120 +4122 4 62.74 161.62 -13.74 0.54 4121 +4123 4 63.74 162.96 -13.58 0.54 4122 +4124 4 64.53 163.79 -12.65 0.54 4123 +4125 4 65.91 165.75 -11.81 0.54 4124 +4126 4 66.85 167.66 -10.76 0.54 4125 +4127 4 67.14 169.3 -9.6 0.54 4126 +4128 4 67.89 170.74 -8.31 0.54 4127 +4129 4 68.43 172.22 -7.61 0.54 4128 +4130 4 69.63 173.51 -6.69 0.54 4129 +4131 4 70.22 173.89 -5.81 0.54 4130 +4132 4 72.11 175.13 -6.16 0.54 4131 +4133 4 72.49 175.5 -5.29 0.54 4132 +4134 4 74.4 175.45 -3.52 0.54 4133 +4135 4 76.56 175.57 -3.38 0.54 4134 +4136 4 77.63 175.59 -2.9 0.54 4135 +4137 4 78.68 175.53 -1.67 0.54 4136 +4138 4 79.31 176.0 -1.61 0.54 4137 +4139 4 80.18 176.05 -1.59 0.54 4138 +4140 4 82.28 177.04 -1.43 0.54 4139 +4141 4 84.52 179.32 -1.14 0.54 4140 +4142 4 85.3 180.11 0.22 0.54 4141 +4143 4 86.27 181.07 2.08 0.54 4142 +4144 4 86.59 182.81 2.26 0.54 4143 +4145 4 87.32 184.75 3.01 0.54 4144 +4146 4 87.26 185.26 4.12 0.54 4145 +4147 4 87.4 185.81 5.31 0.54 4146 +4148 4 87.54 186.83 6.1 0.54 4147 +4149 4 87.67 188.11 6.31 0.54 4148 +4150 4 88.24 189.19 6.81 0.54 4149 +4151 4 88.58 190.21 7.6 0.54 4150 +4152 4 88.99 190.65 7.88 0.54 4151 +4153 4 44.5 130.01 -22.12 0.54 4104 +4154 4 47.27 130.82 -21.97 0.54 4153 +4155 4 50.0 132.49 -21.81 0.54 4154 +4156 4 51.7 133.59 -22.93 0.54 4155 +4157 4 54.21 135.04 -22.72 0.54 4156 +4158 4 56.75 136.07 -22.71 0.54 4157 +4159 4 58.21 137.27 -23.0 0.54 4158 +4160 4 59.53 137.44 -23.78 0.54 4159 +4161 4 62.07 138.47 -23.84 0.54 4160 +4162 4 63.74 139.44 -23.7 0.54 4161 +4163 4 65.09 138.93 -24.25 0.54 4162 +4164 4 66.86 138.66 -24.77 0.54 4163 +4165 4 70.11 138.64 -24.69 0.54 4164 +4166 4 73.04 140.55 -24.49 0.54 4165 +4167 4 74.89 142.17 -24.28 0.54 4166 +4168 4 76.12 143.61 -24.86 0.54 4167 +4169 4 78.29 143.81 -25.47 0.54 4168 +4170 4 81.27 144.9 -25.73 0.54 4169 +4171 4 84.64 146.62 -25.55 0.54 4170 +4172 4 86.97 147.9 -26.12 0.54 4171 +4173 4 88.24 148.46 -26.4 0.54 4172 +4174 4 90.65 148.72 -27.38 0.54 4173 +4175 4 94.09 149.39 -27.61 0.54 4174 +4176 4 97.55 150.17 -28.87 0.54 4175 +4177 4 100.52 151.21 -28.69 0.54 4176 +4178 4 102.0 152.24 -29.24 0.54 4177 +4179 4 103.54 152.45 -30.3 0.54 4178 +4180 4 105.05 152.54 -30.33 0.54 4179 +4181 4 105.93 152.66 -30.9 0.54 4180 +4182 4 108.04 153.67 -30.98 0.54 4181 +4183 4 109.51 154.65 -31.21 0.54 4182 +4184 4 110.77 155.68 -31.91 0.54 4183 +4185 4 112.3 155.85 -32.61 0.54 4184 +4186 4 114.43 156.62 -32.55 0.54 4185 +4187 4 117.2 157.5 -33.0 0.54 4186 +4188 4 118.68 158.49 -33.24 0.54 4187 +4189 4 119.98 158.63 -33.8 0.54 4188 +4190 4 120.89 158.59 -34.91 0.54 4189 +4191 4 121.76 158.67 -35.18 0.54 4190 +4192 4 122.88 158.63 -36.29 0.54 4191 +4193 4 124.61 158.76 -36.38 0.54 4192 +4194 4 125.69 158.82 -36.35 0.54 4193 +4195 4 126.6 158.78 -37.47 0.54 4194 +4196 4 127.05 158.88 -38.2 0.54 4195 +4197 4 127.71 158.75 -38.57 0.54 4196 +4198 4 21.84 127.26 -20.67 1.515 4057 +4199 4 21.95 128.77 -20.52 1.515 4198 +4200 4 22.31 130.93 -22.24 1.41 4199 +4201 4 22.62 132.68 -22.06 1.41 4200 +4202 4 22.95 134.41 -21.87 1.41 4201 +4203 4 23.48 136.38 -21.65 1.41 4202 +4204 4 23.84 138.32 -23.4 1.41 4203 +4205 4 23.99 139.4 -23.29 1.41 4204 +4206 4 24.13 140.72 -23.3 1.41 4205 +4207 4 24.27 142.02 -23.16 1.41 4206 +4208 4 24.16 143.74 -22.99 1.41 4207 +4209 4 24.27 145.25 -22.83 1.41 4208 +4210 4 24.38 146.97 -22.65 1.41 4209 +4211 4 24.55 147.85 -22.55 1.515 4210 +4212 4 24.3 148.31 -22.51 1.515 4211 +4213 4 23.55 148.94 -20.58 0.435 4212 +4214 4 23.09 149.35 -20.62 0.54 4213 +4215 4 22.13 150.8 -20.49 0.54 4214 +4216 4 21.35 153.48 -21.66 0.54 4215 +4217 4 21.38 156.48 -21.35 0.54 4216 +4218 4 21.85 159.3 -21.05 0.54 4217 +4219 4 23.2 161.76 -20.76 0.54 4218 +4220 4 23.82 162.73 -21.4 0.54 4219 +4221 4 23.71 164.44 -21.16 0.435 4220 +4222 4 23.43 166.07 -22.42 0.435 4221 +4223 4 22.66 168.51 -23.4 0.435 4222 +4224 4 22.01 171.71 -23.16 0.435 4223 +4225 4 21.61 174.69 -22.86 0.435 4224 +4226 4 21.57 175.4 -22.86 0.435 4225 +4227 4 21.51 176.26 -22.77 0.54 4226 +4228 4 21.38 178.39 -22.55 0.54 4227 +4229 4 20.61 180.29 -22.38 0.54 4228 +4230 4 20.35 181.2 -23.04 0.54 4229 +4231 4 19.39 182.65 -22.91 0.54 4230 +4232 4 18.88 184.2 -23.44 0.54 4231 +4233 4 17.42 186.69 -23.22 0.54 4232 +4234 4 16.97 187.42 -24.21 0.54 4233 +4235 4 16.93 188.35 -24.87 0.54 4234 +4236 4 16.43 189.71 -25.72 0.54 4235 +4237 4 15.73 191.35 -27.3 0.54 4236 +4238 4 24.85 149.8 -22.34 1.515 4212 +4239 4 24.98 151.31 -22.18 1.515 4238 +4240 4 25.43 152.54 -22.05 1.515 4239 +4241 4 25.86 153.16 -23.48 0.54 4240 +4242 4 26.28 153.61 -23.42 0.54 4241 +4243 4 26.62 154.33 -21.9 0.54 4242 +4244 4 26.8 154.18 -20.19 0.54 4243 +4245 4 27.47 154.32 -21.21 0.54 4244 +4246 4 27.88 155.1 -22.18 0.54 4245 +4247 4 28.73 155.59 -22.18 0.54 4246 +4248 4 29.15 156.15 -23.16 0.54 4247 +4249 4 29.78 156.41 -23.12 0.54 4248 +4250 4 29.99 157.21 -24.54 0.54 4249 +4251 4 30.77 158.56 -24.38 0.54 4250 +4252 4 30.98 158.5 -23.71 0.54 4251 +4253 4 31.35 159.1 -22.96 0.54 4252 +4254 4 31.95 160.04 -23.3 0.54 4253 +4255 4 32.79 161.05 -24.16 0.54 4254 +4256 4 33.39 161.99 -24.42 0.54 4255 +4257 4 33.97 163.34 -24.57 0.54 4256 +4258 4 34.8 164.09 -24.92 0.54 4257 +4259 4 35.59 165.47 -25.29 0.54 4258 +4260 4 36.79 167.06 -25.17 0.54 4259 +4261 4 37.59 168.18 -25.04 0.54 4260 +4262 4 38.86 168.7 -25.02 0.54 4261 +4263 4 39.86 170.05 -24.86 0.54 4262 +4264 4 41.04 171.85 -24.65 0.54 4263 +4265 4 42.05 173.21 -24.63 0.54 4264 +4266 4 42.8 175.23 -24.86 0.54 4265 +4267 4 43.37 176.83 -25.21 0.54 4266 +4268 4 44.34 178.66 -25.45 0.54 4267 +4269 4 44.71 180.0 -25.68 0.54 4268 +4270 4 45.06 181.59 -26.11 0.54 4269 +4271 4 45.44 182.8 -27.03 0.54 4270 +4272 4 45.38 184.16 -27.49 0.54 4271 +4273 4 45.31 185.27 -27.83 0.54 4272 +4274 4 45.48 186.4 -28.08 0.54 4273 +4275 4 46.04 188.0 -28.51 0.54 4274 +4276 4 46.64 188.89 -28.48 0.54 4275 +4277 4 46.79 189.98 -28.44 0.54 4276 +4278 4 47.2 190.75 -29.25 0.54 4277 +4279 4 47.6 191.2 -29.2 0.54 4278 +4280 4 47.57 191.89 -29.51 0.54 4279 +4281 4 47.93 193.21 -29.43 0.54 4280 +4282 4 48.68 195.26 -29.96 0.54 4281 +4283 4 49.29 196.25 -30.75 0.54 4282 +4284 4 50.06 198.02 -30.62 0.54 4283 +4285 4 51.53 199.04 -31.16 0.54 4284 +4286 4 52.58 200.08 -32.08 0.54 4285 +4287 4 53.6 201.81 -33.54 0.54 4286 +4288 4 55.02 203.4 -33.34 0.54 4287 +4289 4 55.57 205.23 -33.81 0.54 4288 +4290 4 56.15 206.83 -34.24 0.54 4289 +4291 4 56.65 209.01 -34.08 0.54 4290 +4292 4 57.16 211.19 -33.84 0.54 4291 +4293 4 57.31 212.78 -34.35 0.54 4292 +4294 4 57.67 213.88 -34.3 0.54 4293 +4295 4 58.03 215.28 -34.91 0.54 4294 +4296 4 59.03 216.86 -34.87 0.54 4295 +4297 4 60.61 219.11 -34.6 0.54 4296 +4298 4 62.89 220.99 -34.64 0.54 4297 +4299 4 64.75 222.42 -34.68 0.54 4298 +4300 4 65.32 224.0 -34.88 0.54 4299 +4301 4 65.71 224.89 -34.86 0.54 4300 +4302 4 66.67 226.68 -34.72 0.54 4301 +4303 4 66.58 228.19 -34.64 0.54 4302 +4304 4 66.62 231.25 -34.85 0.54 4303 +4305 4 67.17 233.02 -34.88 0.54 4304 +4306 4 68.56 234.86 -34.96 0.54 4305 +4307 4 70.2 236.69 -34.74 0.54 4306 +4308 4 71.38 238.74 -34.95 0.54 4307 +4309 4 72.16 240.37 -35.52 0.54 4308 +4310 4 72.54 241.53 -35.99 0.54 4309 +4311 4 73.78 243.24 -37.14 0.54 4310 +4312 4 74.13 244.6 -37.51 0.54 4311 +4313 4 74.5 246.02 -38.33 0.54 4312 +4314 4 74.45 246.92 -38.62 0.54 4313 +4315 4 74.84 247.86 -39.12 0.54 4314 +4316 4 75.2 249.48 -39.77 0.54 4315 +4317 4 75.12 251.03 -40.14 0.54 4316 +4318 4 75.45 252.78 -40.11 0.54 4317 +4319 4 75.94 255.18 -39.85 0.54 4318 +4320 4 76.86 257.82 -39.55 0.54 4319 +4321 4 77.19 259.56 -39.36 0.54 4320 +4322 4 77.26 261.72 -39.21 0.54 4321 +4323 4 76.78 262.86 -40.01 0.54 4322 +4324 4 76.58 266.08 -39.68 0.54 4323 +4325 4 77.28 268.7 -39.39 0.54 4324 +4326 4 78.82 271.59 -39.06 0.54 4325 +4327 4 79.58 272.88 -39.05 0.54 4326 +4328 4 80.77 273.9 -37.64 0.54 4327 +4329 4 80.79 273.99 -38.46 0.54 4328 +4330 4 81.35 275.58 -38.81 0.54 4329 +4331 4 81.76 276.3 -39.25 0.54 4330 +4332 4 82.28 278.51 -39.31 0.54 4331 +4333 4 82.62 280.04 -39.22 0.54 4332 +4334 4 82.72 281.99 -39.09 0.54 4333 +4335 4 83.04 283.73 -38.91 0.54 4334 +4336 4 83.93 286.81 -38.72 0.54 4335 +4337 4 84.59 290.09 -38.43 0.54 4336 +4338 4 84.62 293.1 -38.12 0.54 4337 +4339 4 84.46 295.45 -37.88 0.54 4338 +4340 4 84.52 297.84 -37.71 0.54 4339 +4341 4 84.74 301.29 -37.35 0.54 4340 +4342 4 85.27 303.26 -37.13 0.54 4341 +4343 4 85.74 306.08 -36.83 0.54 4342 +4344 4 85.82 308.29 -37.05 0.54 4343 +4345 4 86.03 311.96 -36.74 0.54 4344 +4346 4 86.21 315.85 -36.33 0.54 4345 +4347 4 86.03 318.63 -36.05 0.54 4346 +4348 4 86.48 321.88 -35.7 0.54 4347 +4349 4 86.75 324.48 -35.43 0.54 4348 +4350 4 87.27 326.47 -35.44 0.54 4349 +4351 4 87.41 328.04 -35.88 0.54 4350 +4352 4 87.95 329.82 -35.9 0.54 4351 +4353 4 88.08 331.34 -35.89 0.54 4352 +4354 4 30.68 156.34 -24.01 0.54 4249 +4355 4 31.78 156.2 -24.08 0.54 4354 +4356 4 32.45 156.03 -24.15 0.54 4355 +4357 4 33.5 156.53 -24.16 0.54 4356 +4358 4 34.12 157.02 -24.31 0.54 4357 +4359 4 34.99 157.07 -24.22 0.54 4358 +4360 4 35.6 157.51 -23.93 0.54 4359 +4361 4 36.01 157.44 -23.02 0.54 4360 +4362 4 36.19 157.83 -22.3 0.54 4361 +4363 4 36.58 158.22 -21.65 0.54 4362 +4364 4 37.16 159.05 -20.94 0.54 4363 +4365 4 37.58 159.0 -20.26 0.54 4364 +4366 4 37.94 159.86 -19.94 0.54 4365 +4367 4 38.3 160.91 -19.44 0.54 4366 +4368 4 38.68 161.56 -19.14 0.54 4367 +4369 4 39.29 161.99 -18.63 0.54 4368 +4370 4 39.88 162.85 -18.15 0.54 4369 +4371 4 40.67 163.95 -17.87 0.54 4370 +4372 4 41.04 164.57 -17.19 0.54 4371 +4373 4 41.22 164.93 -16.47 0.54 4372 +4374 4 42.24 165.84 -16.2 0.54 4373 +4375 4 42.65 166.29 -16.07 0.54 4374 +4376 4 43.05 166.7 -15.64 0.54 4375 +4377 4 43.6 167.99 -15.12 0.54 4376 +4378 4 43.81 167.93 -14.44 0.54 4377 +4379 4 44.23 167.91 -13.98 0.54 4378 +4380 4 44.63 167.88 -13.37 0.54 4379 +4381 4 45.69 168.35 -12.99 0.54 4380 +4382 4 46.32 168.3 -12.16 0.54 4381 +4383 4 46.72 168.74 -11.88 0.54 4382 +4384 4 47.31 169.59 -11.48 0.54 4383 +4385 4 47.7 170.02 -11.12 0.54 4384 +4386 4 48.25 171.54 -10.8 0.54 4385 +4387 4 48.65 171.95 -10.3 0.54 4386 +4388 4 49.04 172.34 -9.56 0.54 4387 +4389 4 49.43 172.73 -8.91 0.54 4388 +4390 4 49.82 173.16 -8.56 0.54 4389 +4391 4 50.59 173.93 -7.1 0.54 4390 +4392 4 51.44 173.88 -6.11 0.54 4391 +4393 4 52.07 173.8 -4.98 0.54 4392 +4394 4 52.47 173.73 -4.07 0.54 4393 +4395 4 53.11 173.71 -3.45 0.54 4394 +4396 4 54.2 173.53 -2.99 0.54 4395 +4397 4 55.47 173.5 -1.91 0.54 4396 +4398 4 56.74 174.01 -1.83 0.54 4397 +4399 4 57.54 174.9 -1.64 0.54 4398 +4400 4 58.08 175.86 -0.03 0.54 4399 +4401 4 59.09 177.21 0.21 0.54 4400 +4402 4 59.84 178.43 1.48 0.54 4401 +4403 4 60.4 179.72 1.93 0.54 4402 +4404 4 60.97 180.52 2.93 0.54 4403 +4405 4 61.54 181.33 3.86 0.54 4404 +4406 4 62.77 182.18 4.8 0.54 4405 +4407 4 63.79 183.07 5.37 0.54 4406 +4408 4 64.97 184.82 5.81 0.54 4407 +4409 4 65.96 186.18 6.05 0.54 4408 +4410 4 66.77 187.04 6.53 0.54 4409 +4411 4 67.73 188.8 7.03 0.54 4410 +4412 4 68.26 190.76 7.33 0.54 4411 +4413 4 68.63 191.4 7.62 0.54 4412 +4414 4 69.22 192.25 8.18 0.54 4413 +4415 4 70.67 193.15 8.76 0.54 4414 +4416 4 71.47 193.73 10.04 0.54 4415 +4417 4 71.88 193.99 9.93 0.54 4416 +4418 4 72.67 195.33 10.02 0.54 4417 +4419 4 72.86 195.76 10.14 0.54 4418 +4420 4 73.46 196.14 11.18 0.54 4419 +4421 4 73.58 197.11 12.25 0.54 4420 +4422 4 74.18 197.72 13.09 0.54 4421 +4423 4 74.96 198.55 13.94 0.54 4422 +4424 4 75.31 199.56 14.96 0.54 4423 +4425 4 75.86 200.55 16.2 0.54 4424 +4426 4 76.39 202.0 17.2 0.54 4425 +4427 4 76.93 203.47 18.04 0.54 4426 +4428 4 77.44 205.12 19.28 0.54 4427 +4429 4 78.16 206.99 20.55 0.54 4428 +4430 4 78.31 207.56 21.43 0.54 4429 +4431 4 78.83 209.24 22.37 0.54 4430 +4432 4 79.39 210.5 23.2 0.54 4431 +4433 4 80.18 211.32 24.13 0.54 4432 +4434 4 80.52 212.09 25.35 0.54 4433 +4435 4 80.9 212.42 26.59 0.54 4434 +4436 4 81.46 213.45 27.47 0.54 4435 +4437 4 82.5 213.86 28.44 0.54 4436 +4438 4 83.34 213.86 28.99 0.54 4437 +4439 4 83.95 214.25 29.72 0.54 4438 +4440 4 84.56 214.67 30.31 0.54 4439 +4441 4 85.34 215.99 30.69 0.54 4440 +4442 4 85.69 216.79 31.53 0.54 4441 +4443 4 86.27 217.33 33.03 0.54 4442 +4444 4 86.69 217.28 33.79 0.54 4443 +4445 4 87.75 217.29 34.35 0.54 4444 +4446 4 88.59 217.76 34.49 0.54 4445 +4447 4 25.53 152.84 -22.01 1.515 4240 +4448 4 25.68 153.72 -21.92 1.515 4447 +4449 4 25.09 153.81 -20.72 0.435 4448 +4450 4 24.57 154.5 -19.3 0.435 4449 +4451 4 24.13 154.39 -18.5 0.435 4450 +4452 4 24.11 154.3 -17.6 0.435 4451 +4453 4 23.85 154.13 -16.19 0.435 4452 +4454 4 23.82 153.98 -14.71 0.435 4453 +4455 4 23.54 154.26 -13.4 0.435 4454 +4456 4 23.52 154.16 -12.43 0.435 4455 +4457 4 23.48 153.96 -10.56 0.435 4456 +4458 4 23.45 153.87 -9.67 0.435 4457 +4459 4 23.2 153.69 -7.96 0.435 4458 +4460 4 22.23 154.8 -6.74 0.435 4459 +4461 4 21.46 156.15 -5.49 0.435 4460 +4462 4 20.67 157.71 -4.22 0.435 4461 +4463 4 19.49 159.14 -4.1 0.435 4462 +4464 4 18.97 160.4 -3.9 0.435 4463 +4465 4 18.61 162.2 -2.59 0.435 4464 +4466 4 18.77 163.06 -2.5 0.435 4465 +4467 4 18.89 164.57 -2.34 0.435 4466 +4468 4 19.07 165.22 -2.2 0.435 4467 +4469 4 19.01 165.83 -1.76 0.435 4468 +4470 4 19.16 166.89 -1.49 0.435 4469 +4471 4 18.41 168.09 -0.86 0.435 4470 +4472 4 17.68 169.09 -0.48 0.435 4471 +4473 4 16.3 170.25 0.05 0.435 4472 +4474 4 16.27 170.65 0.33 0.435 4473 +4475 4 15.31 171.84 0.88 0.435 4474 +4476 4 15.23 172.88 1.29 0.435 4475 +4477 4 15.35 174.14 1.87 0.435 4476 +4478 4 15.45 176.05 2.37 0.435 4477 +4479 4 15.37 176.83 3.21 0.435 4478 +4480 4 15.52 177.6 4.12 0.435 4479 +4481 4 15.46 178.44 4.5 0.435 4480 +4482 4 15.4 179.26 4.89 0.435 4481 +4483 4 14.39 181.1 5.36 0.435 4482 +4484 4 12.69 184.0 5.69 0.435 4483 +4485 4 12.18 185.04 5.78 0.435 4484 +4486 4 11.69 185.84 6.24 0.435 4485 +4487 4 11.13 187.47 6.99 0.435 4486 +4488 4 11.31 188.12 7.14 0.435 4487 +4489 4 11.23 189.16 7.54 0.435 4488 +4490 4 11.35 190.36 8.57 0.435 4489 +4491 4 10.82 191.62 8.77 0.435 4490 +4492 4 9.88 192.84 8.88 0.435 4491 +4493 4 9.38 193.88 9.04 0.435 4492 +4494 4 8.89 194.71 9.12 0.435 4493 +4495 4 8.85 195.35 9.26 0.435 4494 +4496 4 8.73 195.63 9.29 0.435 4495 +4497 4 8.52 196.19 7.83 0.435 4496 +4498 4 7.89 196.53 6.27 0.435 4497 +4499 4 7.25 196.48 6.33 0.435 4498 +4500 4 6.8 196.94 5.84 0.65 4499 +4501 4 6.11 197.54 5.89 0.865 4500 +4502 4 5.01 198.52 4.22 0.325 4501 +4503 4 3.65 199.5 4.29 0.325 4502 +4504 4 2.74 200.63 3.26 0.325 4503 +4505 4 2.19 201.74 4.94 0.325 4504 +4506 4 1.28 202.3 5.36 0.325 4505 +4507 4 0.33 202.98 6.45 0.325 4506 +4508 4 -0.56 203.3 7.07 0.325 4507 +4509 4 -1.51 203.98 8.25 0.325 4508 +4510 4 -1.78 204.34 8.89 0.325 4509 +4511 4 -1.83 204.37 10.7 0.325 4510 +4512 4 -1.66 205.26 10.56 0.325 4511 +4513 4 -1.47 205.41 11.42 0.325 4512 +4514 4 -1.29 205.31 12.46 0.325 4513 +4515 4 -1.13 205.62 13.78 0.325 4514 +4516 4 -0.79 206.89 14.44 0.325 4515 +4517 4 -0.22 208.2 14.67 0.325 4516 +4518 4 0.1 209.93 14.93 0.325 4517 +4519 4 -0.49 212.25 15.24 0.325 4518 +4520 4 -1.12 215.44 15.55 0.325 4519 +4521 4 -1.5 217.78 15.78 0.325 4520 +4522 4 -1.57 218.79 16.49 0.325 4521 +4523 4 -1.23 220.07 17.0 0.325 4522 +4524 4 -1.23 222.99 18.14 0.325 4523 +4525 4 -1.84 225.72 18.63 0.325 4524 +4526 4 -2.02 228.51 18.99 0.325 4525 +4527 4 -2.18 230.85 19.3 0.325 4526 +4528 4 -2.67 231.68 19.98 0.325 4527 +4529 4 -2.84 234.25 20.24 0.325 4528 +4530 4 -2.18 237.31 20.57 0.325 4529 +4531 4 -2.54 239.66 20.81 0.325 4530 +4532 4 -3.11 241.76 21.01 0.325 4531 +4533 4 -5.12 246.16 21.42 0.325 4532 +4534 4 -6.67 249.93 21.85 0.325 4533 +4535 4 -7.64 251.07 22.77 0.325 4534 +4536 4 -7.77 252.99 23.12 0.325 4535 +4537 4 -8.6 255.73 23.39 0.325 4536 +4538 4 -10.02 257.8 23.56 0.325 4537 +4539 4 -12.59 259.6 25.65 0.325 4538 +4540 4 -13.58 261.41 26.49 0.325 4539 +4541 4 -14.1 262.12 27.54 0.325 4540 +4542 4 -14.17 262.65 28.79 0.325 4541 +4543 4 -15.12 263.87 29.12 0.325 4542 +4544 4 9.2 196.39 9.83 0.435 4496 +4545 4 8.68 197.86 10.04 0.435 4544 +4546 4 7.68 199.46 10.87 0.435 4545 +4547 4 6.97 200.26 11.08 0.435 4546 +4548 4 6.0 201.63 11.95 0.435 4547 +4549 4 4.99 203.44 12.71 0.435 4548 +4550 4 3.58 205.02 13.45 0.435 4549 +4551 4 2.17 206.41 13.79 0.435 4550 +4552 4 1.2 207.83 14.29 0.435 4551 +4553 4 0.7 208.8 14.98 0.435 4552 +4554 4 -0.3 210.36 16.17 0.435 4553 +4555 4 -0.41 211.84 16.62 0.435 4554 +4556 4 -1.64 213.54 18.28 0.435 4555 +4557 4 -1.72 214.82 18.41 0.435 4556 +4558 4 -2.52 217.11 18.93 0.435 4557 +4559 4 -3.58 219.28 20.34 0.435 4558 +4560 4 -4.14 221.14 20.97 0.435 4559 +4561 4 -4.68 222.02 22.7 0.435 4560 +4562 4 -5.31 224.99 23.0 0.435 4561 +4563 4 -5.42 226.71 23.17 0.435 4562 +4564 4 -5.52 228.15 23.84 0.435 4563 +4565 4 -6.07 229.83 24.15 0.435 4564 +4566 4 -6.63 231.7 24.57 0.435 4565 +4567 4 -7.18 233.37 25.03 0.435 4566 +4568 4 -7.29 234.82 25.55 0.435 4567 +4569 4 -7.4 236.5 26.02 0.435 4568 +4570 4 -7.93 237.39 27.68 0.435 4569 +4571 4 -8.01 238.46 27.79 0.435 4570 +4572 4 -9.48 240.35 29.69 0.435 4571 +4573 4 -10.93 242.62 29.89 0.435 4572 +4574 4 -10.79 243.92 30.02 0.435 4573 +4575 4 -10.9 245.1 31.2 0.435 4574 +4576 4 -11.36 245.49 31.3 0.435 4575 +4577 4 -11.94 247.82 31.53 0.435 4576 +4578 4 -12.47 249.3 31.67 0.435 4577 +4579 4 -13.08 251.8 32.36 0.435 4578 +4580 4 -12.95 253.1 32.5 0.435 4579 +4581 4 -12.65 255.26 32.81 0.435 4580 +4582 4 -12.81 257.64 33.36 0.435 4581 +4583 4 -13.91 261.23 33.7 0.435 4582 +4584 4 -14.88 265.57 35.33 0.435 4583 +4585 4 -15.0 267.49 35.52 0.435 4584 +4586 4 -16.25 269.42 37.13 0.435 4585 +4587 4 -17.2 270.66 37.24 0.435 4586 +4588 4 -17.12 272.81 37.46 0.435 4587 +4589 4 -18.0 276.37 38.26 0.435 4588 +4590 4 -18.67 279.49 39.24 0.435 4589 +4591 4 -19.97 282.53 40.58 0.435 4590 +4592 4 -20.8 284.47 42.27 0.435 4591 +4593 4 -20.66 285.78 42.41 0.435 4592 +4594 4 -20.31 286.29 43.98 0.435 4593 +4595 4 -20.37 287.35 44.09 0.435 4594 +4596 4 -21.31 288.37 44.17 0.435 4595 +4597 4 -22.54 290.37 45.17 0.435 4596 +4598 4 -23.08 291.83 45.39 0.435 4597 +4599 4 -23.18 293.28 46.06 0.435 4598 +4600 4 -23.28 294.77 46.29 0.435 4599 +4601 4 -23.37 296.08 46.58 0.435 4600 +4602 4 -24.18 298.61 46.82 0.435 4601 +4603 4 -24.24 299.45 47.13 0.435 4602 +4604 4 -25.23 301.07 47.72 0.435 4603 +4605 4 -26.2 302.22 48.5 0.435 4604 +4606 4 -27.16 303.88 48.72 0.435 4605 +4607 4 -27.66 304.67 49.18 0.435 4606 +4608 4 -28.19 305.88 49.81 0.435 4607 +4609 4 -28.74 307.26 50.85 0.435 4608 +4610 4 -29.27 308.71 51.14 0.435 4609 +4611 4 -29.36 309.97 51.56 0.435 4610 +4612 4 -29.85 310.78 51.86 0.435 4611 +4613 4 -30.35 311.81 52.18 0.435 4612 +4614 4 -30.44 313.08 52.38 0.435 4613 +4615 4 -30.98 314.55 52.6 0.435 4614 +4616 4 -32.33 315.32 52.72 0.435 4615 +4617 4 -33.49 316.54 52.82 0.435 4616 +4618 4 -35.11 317.94 53.01 0.435 4617 +4619 4 -36.21 318.26 53.32 0.435 4618 +4620 4 -36.92 318.84 53.58 0.435 4619 +4621 4 -37.84 319.6 54.09 0.435 4620 +4622 4 -38.52 319.98 54.19 0.435 4621 +4623 4 -39.94 321.82 54.42 0.435 4622 +4624 4 -40.45 322.86 54.6 0.435 4623 +4625 4 -40.5 323.7 54.83 0.435 4624 +4626 4 -41.44 324.71 55.07 0.435 4625 +4627 4 -41.9 325.09 55.32 0.435 4626 +4628 4 -42.38 325.68 55.52 0.435 4627 +4629 4 -43.75 326.67 55.74 0.435 4628 +4630 4 -45.3 327.22 55.69 0.435 4629 +4631 4 -46.31 329.3 55.95 0.435 4630 +4632 4 -47.31 331.39 56.22 0.435 4631 +4633 4 -48.0 331.96 56.49 0.435 4632 +4634 4 -49.15 332.73 56.77 0.435 4633 +4635 4 -49.62 333.35 56.89 0.435 4634 +4636 4 -50.11 334.15 57.2 0.435 4635 +4637 4 -50.62 335.19 57.44 0.435 4636 +4638 4 -50.7 336.21 57.92 0.435 4637 +4639 4 -51.45 337.65 58.27 0.435 4638 +4640 4 -52.15 338.46 58.42 0.435 4639 +4641 4 -52.85 339.04 58.68 0.435 4640 +4642 4 -53.54 339.64 58.73 0.435 4641 +4643 4 -54.48 340.88 58.83 0.435 4642 +4644 4 -54.78 342.14 58.96 0.435 4643 +4645 4 -55.3 343.62 59.1 0.435 4644 +4646 4 -55.8 344.65 59.27 0.435 4645 +4647 4 -56.53 345.68 59.51 0.435 4646 +4648 4 -56.54 345.87 59.76 0.435 4647 +4649 4 -57.5 347.09 59.94 0.435 4648 +4650 4 -57.95 347.49 59.97 0.435 4649 +4651 4 -58.49 348.97 60.11 0.435 4650 +4652 4 -58.96 349.59 60.16 0.435 4651 +4653 4 -58.99 350.0 60.21 0.435 4652 +4654 4 -59.01 350.44 60.25 0.435 4653 +4655 4 25.8 155.24 -21.76 1.515 4448 +4656 4 25.68 157.16 -21.56 1.515 4655 +4657 4 25.82 158.46 -21.42 1.515 4656 +4658 4 25.95 159.76 -21.29 1.515 4657 +4659 4 26.34 160.65 -21.19 1.515 4658 +4660 4 26.62 162.81 -20.96 1.515 4659 +4661 4 27.01 163.49 -20.88 1.515 4660 +4662 4 26.91 164.99 -20.72 1.515 4661 +4663 4 27.05 166.28 -20.59 1.515 4662 +4664 4 26.95 167.93 -20.42 1.3 4663 +4665 4 26.87 169.75 -21.29 1.3 4664 +4666 4 26.34 170.96 -20.57 1.41 4665 +4667 4 25.77 172.85 -20.39 1.41 4666 +4668 4 25.25 174.33 -20.25 1.41 4667 +4669 4 25.22 174.66 -20.22 1.41 4668 +4670 4 24.34 175.06 -20.5 0.76 4669 +4671 4 23.19 176.07 -20.42 0.76 4670 +4672 4 22.52 176.45 -20.4 0.865 4671 +4673 4 21.37 177.46 -20.32 0.76 4672 +4674 4 20.68 178.36 -21.0 0.76 4673 +4675 4 19.39 178.29 -21.18 0.54 4674 +4676 4 18.28 179.45 -22.6 0.435 4675 +4677 4 16.93 180.81 -23.99 0.435 4676 +4678 4 15.12 182.54 -25.06 0.435 4677 +4679 4 13.01 185.53 -25.94 0.435 4678 +4680 4 11.36 188.14 -26.91 0.435 4679 +4681 4 11.12 188.84 -27.52 0.435 4680 +4682 4 9.47 190.9 -27.42 0.435 4681 +4683 4 7.4 192.7 -27.29 0.435 4682 +4684 4 6.91 194.39 -28.55 0.435 4683 +4685 4 5.46 196.65 -28.27 0.435 4684 +4686 4 25.17 175.61 -20.12 1.41 4669 +4687 4 25.09 176.91 -20.14 1.41 4686 +4688 4 25.21 178.42 -19.98 1.41 4687 +4689 4 25.33 179.93 -19.82 1.41 4688 +4690 4 25.51 180.38 -19.77 1.41 4689 +4691 4 25.89 180.97 -19.01 0.54 4690 +4692 4 26.29 181.68 -19.23 0.54 4691 +4693 4 26.72 181.7 -19.15 0.54 4692 +4694 4 27.33 182.38 -19.06 0.54 4693 +4695 4 27.48 183.46 -18.95 0.54 4694 +4696 4 27.41 184.54 -18.84 0.435 4695 +4697 4 27.75 186.06 -18.67 0.435 4696 +4698 4 28.3 187.33 -18.0 0.435 4697 +4699 4 28.65 188.38 -17.36 0.435 4698 +4700 4 29.21 189.13 -15.91 0.435 4699 +4701 4 29.64 189.1 -15.38 0.435 4700 +4702 4 29.74 190.57 -14.77 0.435 4701 +4703 4 29.88 191.61 -14.28 0.435 4702 +4704 4 29.78 192.84 -13.55 0.435 4703 +4705 4 29.9 194.34 -13.32 0.435 4704 +4706 4 30.03 195.37 -12.61 0.435 4705 +4707 4 30.38 196.65 -12.24 0.435 4706 +4708 4 30.77 197.07 -11.73 0.435 4707 +4709 4 31.08 198.75 -10.95 0.435 4708 +4710 4 31.44 199.8 -10.46 0.435 4709 +4711 4 31.76 201.27 -9.76 0.435 4710 +4712 4 31.68 202.31 -9.29 0.435 4711 +4713 4 32.05 203.18 -9.04 0.435 4712 +4714 4 32.18 204.67 -8.73 0.435 4713 +4715 4 32.25 206.81 -8.35 0.435 4714 +4716 4 32.38 208.12 -8.22 0.435 4715 +4717 4 32.49 209.57 -7.46 0.435 4716 +4718 4 31.99 210.3 -6.49 0.435 4717 +4719 4 32.14 211.45 -6.97 0.435 4718 +4720 4 32.11 212.4 -7.86 0.435 4719 +4721 4 32.22 214.42 -8.39 0.435 4720 +4722 4 32.58 215.79 -8.78 0.435 4721 +4723 4 32.5 217.07 -8.72 0.435 4722 +4724 4 33.1 218.01 -8.84 0.435 4723 +4725 4 33.04 219.11 -9.1 0.435 4724 +4726 4 33.61 220.44 -8.94 0.435 4725 +4727 4 34.14 222.2 -8.75 0.435 4726 +4728 4 34.24 224.14 -8.63 0.435 4727 +4729 4 34.63 225.37 -9.85 0.435 4728 +4730 4 35.17 227.13 -9.65 0.435 4729 +4731 4 35.12 227.43 -8.42 0.435 4730 +4732 4 35.72 228.09 -8.1 0.435 4731 +4733 4 36.08 228.92 -7.4 0.435 4732 +4734 4 36.48 229.32 -6.83 0.435 4733 +4735 4 36.63 229.93 -6.31 0.435 4734 +4736 4 36.79 230.76 -5.92 0.435 4735 +4737 4 36.97 231.15 -5.27 0.435 4736 +4738 4 37.13 231.51 -4.56 0.435 4737 +4739 4 37.31 231.9 -3.98 0.435 4738 +4740 4 37.73 231.86 -3.37 0.435 4739 +4741 4 25.23 181.44 -19.73 1.41 4690 +4742 4 25.15 182.74 -19.6 1.41 4741 +4743 4 24.84 184.22 -19.46 1.41 4742 +4744 4 24.33 185.27 -19.36 1.41 4743 +4745 4 23.6 186.51 -19.25 1.41 4744 +4746 4 22.68 187.52 -19.17 1.41 4745 +4747 4 21.94 188.99 -19.03 1.41 4746 +4748 4 21.86 190.06 -18.92 1.41 4747 +4749 4 21.75 191.78 -18.75 1.41 4748 +4750 4 22.08 193.31 -18.58 1.41 4749 +4751 4 22.45 194.4 -18.46 1.41 4750 +4752 4 23.94 195.52 -19.97 1.41 4751 +4753 4 24.28 196.77 -19.31 1.41 4752 +4754 4 24.86 198.17 -19.75 1.41 4753 +4755 4 24.77 198.43 -21.0 0.54 4754 +4756 4 25.39 198.07 -19.3 0.54 4755 +4757 4 26.05 197.88 -19.07 0.54 4756 +4758 4 26.29 197.44 -18.89 0.54 4757 +4759 4 26.71 197.42 -18.35 0.54 4758 +4760 4 26.91 197.35 -17.6 0.54 4759 +4761 4 27.32 197.57 -17.41 0.54 4760 +4762 4 27.74 197.51 -16.58 0.54 4761 +4763 4 28.55 198.41 -16.32 0.54 4762 +4764 4 29.09 199.94 -16.07 0.54 4763 +4765 4 29.52 199.95 -15.84 0.54 4764 +4766 4 29.9 200.31 -14.89 0.54 4765 +4767 4 30.31 200.74 -14.61 0.54 4766 +4768 4 30.3 200.71 -14.31 0.54 4767 +4769 4 30.91 201.13 -13.87 0.54 4768 +4770 4 31.28 201.7 -12.83 0.54 4769 +4771 4 31.42 203.01 -12.84 0.54 4770 +4772 4 31.58 203.68 -12.84 0.54 4771 +4773 4 31.76 204.29 -12.25 0.54 4772 +4774 4 32.08 205.56 -11.73 0.54 4773 +4775 4 32.62 207.3 -11.38 0.54 4774 +4776 4 33.79 209.52 -11.13 0.54 4775 +4777 4 35.13 212.16 -10.67 0.54 4776 +4778 4 36.26 214.8 -10.22 0.54 4777 +4779 4 36.96 217.19 -9.8 0.54 4778 +4780 4 37.5 218.94 -9.54 0.54 4779 +4781 4 38.23 221.13 -9.3 0.54 4780 +4782 4 38.59 222.21 -8.95 0.54 4781 +4783 4 39.57 223.73 -8.31 0.54 4782 +4784 4 40.12 225.23 -7.84 0.54 4783 +4785 4 40.69 226.88 -8.71 0.54 4784 +4786 4 40.88 227.37 -9.04 0.54 4785 +4787 4 41.24 228.98 -9.69 0.54 4786 +4788 4 42.02 230.57 -9.89 0.54 4787 +4789 4 42.56 232.33 -9.84 0.54 4788 +4790 4 43.29 234.53 -9.67 0.54 4789 +4791 4 43.89 235.71 -10.14 0.54 4790 +4792 4 44.72 236.74 -11.15 0.54 4791 +4793 4 45.28 238.27 -10.98 0.54 4792 +4794 4 45.65 239.42 -11.44 0.54 4793 +4795 4 45.59 240.79 -11.99 0.54 4794 +4796 4 45.77 241.48 -12.21 0.54 4795 +4797 4 45.3 242.39 -12.95 0.54 4796 +4798 4 45.66 244.01 -13.68 0.54 4797 +4799 4 45.82 244.63 -13.24 0.54 4798 +4800 4 46.46 244.88 -13.2 0.54 4799 +4801 4 46.91 244.97 -13.85 0.54 4800 +4802 4 47.11 245.47 -14.33 0.54 4801 +4803 4 48.19 246.1 -15.45 0.54 4802 +4804 4 49.24 246.59 -15.37 0.54 4803 +4805 4 49.7 246.72 -16.39 0.54 4804 +4806 4 50.14 247.3 -17.61 0.54 4805 +4807 4 50.76 248.29 -18.47 0.54 4806 +4808 4 51.82 249.12 -19.41 0.54 4807 +4809 4 52.89 249.97 -20.74 0.54 4808 +4810 4 53.31 251.01 -22.12 0.54 4809 +4811 4 54.2 250.94 -23.01 0.54 4810 +4812 4 54.21 251.0 -23.61 0.54 4811 +4813 4 55.25 251.68 -23.29 0.54 4812 +4814 4 55.26 251.98 -24.01 0.54 4813 +4815 4 55.3 252.17 -25.87 0.54 4814 +4816 4 56.6 252.8 -26.98 0.54 4815 +4817 4 57.24 253.37 -27.82 0.54 4816 +4818 4 58.1 253.97 -28.94 0.54 4817 +4819 4 58.34 254.06 -29.75 0.54 4818 +4820 4 58.94 255.02 -30.09 0.54 4819 +4821 4 59.83 255.14 -30.74 0.54 4820 +4822 4 60.68 255.99 -32.28 0.54 4821 +4823 4 61.08 256.93 -32.71 0.54 4822 +4824 4 62.16 257.53 -33.59 0.54 4823 +4825 4 62.38 258.1 -34.82 0.54 4824 +4826 4 62.78 258.87 -35.63 0.54 4825 +4827 4 62.8 258.94 -36.37 0.54 4826 +4828 4 63.03 259.52 -37.66 0.54 4827 +4829 4 63.26 259.91 -39.27 0.54 4828 +4830 4 63.43 261.09 -40.05 0.54 4829 +4831 4 63.66 260.9 -40.07 0.54 4830 +4832 4 63.62 262.36 -41.73 0.54 4831 +4833 4 63.59 262.78 -41.6 0.54 4832 +4834 4 63.77 263.74 -42.26 0.54 4833 +4835 4 63.74 264.18 -42.44 0.54 4834 +4836 4 63.77 264.56 -44.06 0.54 4835 +4837 4 63.81 264.71 -45.55 0.54 4836 +4838 4 64.01 265.49 -46.59 0.54 4837 +4839 4 64.21 266.5 -47.91 0.54 4838 +4840 4 64.2 267.3 -49.27 0.54 4839 +4841 4 64.2 267.85 -50.42 0.54 4840 +4842 4 64.37 269.05 -51.42 0.54 4841 +4843 4 64.34 270.02 -52.37 0.54 4842 +4844 4 64.49 271.38 -52.83 0.54 4843 +4845 4 64.61 272.89 -52.67 0.54 4844 +4846 4 64.58 273.3 -52.48 0.54 4845 +4847 4 64.08 274.12 -52.26 0.54 4846 +4848 4 64.08 274.67 -53.33 0.54 4847 +4849 4 64.07 275.42 -54.38 0.54 4848 +4850 4 63.85 276.22 -55.97 0.54 4849 +4851 4 32.19 201.41 -13.59 0.54 4769 +4852 4 33.04 201.46 -13.57 0.54 4851 +4853 4 34.92 202.37 -12.74 0.54 4852 +4854 4 35.13 202.33 -12.29 0.54 4853 +4855 4 36.77 203.71 -12.04 0.54 4854 +4856 4 38.03 204.18 -11.51 0.54 4855 +4857 4 39.28 204.57 -10.3 0.54 4856 +4858 4 40.91 205.94 -9.9 0.54 4857 +4859 4 41.71 206.78 -9.19 0.54 4858 +4860 4 42.55 207.25 -9.04 0.54 4859 +4861 4 44.01 207.94 -8.49 0.54 4860 +4862 4 44.83 208.36 -7.68 0.54 4861 +4863 4 46.12 208.41 -7.41 0.54 4862 +4864 4 46.89 209.41 -6.01 0.54 4863 +4865 4 47.54 209.42 -5.76 0.54 4864 +4866 4 48.14 209.84 -5.18 0.54 4865 +4867 4 48.89 211.33 -4.48 0.54 4866 +4868 4 49.94 211.78 -3.95 0.54 4867 +4869 4 51.14 213.33 -3.61 0.54 4868 +4870 4 51.92 214.44 -3.26 0.54 4869 +4871 4 53.38 215.38 -2.98 0.54 4870 +4872 4 54.59 216.74 -2.81 0.54 4871 +4873 4 55.84 217.66 -2.53 0.54 4872 +4874 4 57.03 219.23 -2.26 0.54 4873 +4875 4 58.09 219.72 -2.18 0.54 4874 +4876 4 59.76 220.69 -2.04 0.54 4875 +4877 4 61.46 221.22 -1.95 0.54 4876 +4878 4 63.72 223.07 -1.63 0.54 4877 +4879 4 65.35 224.89 -1.41 0.54 4878 +4880 4 66.72 227.13 -1.14 0.54 4879 +4881 4 68.18 228.07 -1.01 0.54 4880 +4882 4 69.11 230.48 -0.66 0.54 4881 +4883 4 70.69 232.95 -0.37 0.54 4882 +4884 4 71.91 234.32 -0.2 0.54 4883 +4885 4 72.52 234.74 0.22 0.54 4884 +4886 4 73.16 234.75 0.54 0.54 4885 +4887 4 75.06 235.55 0.3 0.54 4886 +4888 4 77.23 235.68 0.36 0.54 4887 +4889 4 78.5 236.19 0.45 0.54 4888 +4890 4 79.12 236.65 0.51 0.54 4889 +4891 4 80.16 237.12 0.95 0.54 4890 +4892 4 81.67 237.19 1.22 0.54 4891 +4893 4 83.17 237.24 1.71 0.54 4892 +4894 4 84.22 237.68 2.16 0.54 4893 +4895 4 85.72 237.7 2.95 0.54 4894 +4896 4 87.43 237.77 3.37 0.54 4895 +4897 4 88.09 237.53 3.97 0.54 4896 +4898 4 89.16 237.33 4.51 0.54 4897 +4899 4 90.24 237.11 5.26 0.54 4898 +4900 4 91.09 237.11 5.74 0.54 4899 +4901 4 91.96 237.14 5.98 0.54 4900 +4902 4 92.82 236.91 6.58 0.54 4901 +4903 4 93.69 236.75 6.65 0.54 4902 +4904 4 94.33 236.76 6.97 0.54 4903 +4905 4 94.97 236.75 7.44 0.54 4904 +4906 4 95.84 236.54 7.82 0.54 4905 +4907 4 96.28 236.33 8.11 0.54 4906 +4908 4 97.05 236.71 7.72 0.54 4907 +4909 4 97.3 236.87 6.23 0.54 4908 +4910 4 97.71 236.29 7.91 0.54 4909 +4911 4 97.9 236.96 7.91 0.54 4910 +4912 4 98.32 236.97 8.07 0.54 4911 +4913 4 98.53 236.91 8.75 0.54 4912 +4914 4 98.93 236.85 9.65 0.54 4913 +4915 4 99.55 237.02 10.44 0.54 4914 +4916 4 100.19 237.03 10.69 0.54 4915 +4917 4 100.64 236.59 11.11 0.54 4916 +4918 4 101.7 236.55 12.18 0.54 4917 +4919 4 102.55 236.59 12.28 0.54 4918 +4920 4 102.75 236.5 13.25 0.54 4919 +4921 4 103.16 236.44 14.16 0.54 4920 +4922 4 103.37 236.41 14.61 0.54 4921 +4923 4 104.0 236.37 15.46 0.54 4922 +4924 4 104.2 236.06 16.49 0.54 4923 +4925 4 104.39 235.98 17.46 0.54 4924 +4926 4 104.83 235.69 18.34 0.54 4925 +4927 4 105.02 235.37 19.37 0.54 4926 +4928 4 105.23 235.32 20.04 0.54 4927 +4929 4 106.11 234.88 20.62 0.54 4928 +4930 4 106.55 234.42 21.19 0.54 4929 +4931 4 107.21 234.23 21.42 0.54 4930 +4932 4 107.43 233.94 22.22 0.54 4931 +4933 4 108.07 233.45 23.16 0.54 4932 +4934 4 108.73 233.23 23.53 0.54 4933 +4935 4 108.92 232.91 24.71 0.54 4934 +4936 4 109.55 232.86 25.62 0.54 4935 +4937 4 109.75 232.8 26.3 0.54 4936 +4938 4 110.38 233.02 26.63 0.54 4937 +4939 4 110.59 232.99 27.09 0.54 4938 +4940 4 110.78 232.9 27.99 0.54 4939 +4941 4 25.17 200.33 -19.52 1.41 4754 +4942 4 25.25 202.27 -19.32 1.41 4941 +4943 4 25.33 204.43 -19.09 1.41 4942 +4944 4 25.43 204.52 -19.08 1.41 4943 +4945 4 24.91 204.95 -17.16 0.435 4944 +4946 4 23.76 206.25 -17.96 0.435 4945 +4947 4 23.23 207.43 -17.02 0.435 4946 +4948 4 22.52 207.95 -16.08 0.435 4947 +4949 4 21.58 208.38 -14.63 0.435 4948 +4950 4 20.89 208.7 -13.93 0.435 4949 +4951 4 20.18 209.19 -12.77 0.435 4950 +4952 4 19.27 209.47 -11.86 0.435 4951 +4953 4 18.56 210.28 -11.64 0.435 4952 +4954 4 18.24 211.23 -10.49 0.435 4953 +4955 4 16.82 213.07 -10.25 0.435 4954 +4956 4 15.8 215.09 -9.4 0.435 4955 +4957 4 14.64 216.26 -8.85 0.435 4956 +4958 4 13.68 217.23 -8.32 0.435 4957 +4959 4 12.72 218.64 -7.82 0.435 4958 +4960 4 12.38 220.34 -7.12 0.435 4959 +4961 4 11.33 223.08 -6.87 0.435 4960 +4962 4 11.09 223.49 -6.76 0.435 4961 +4963 4 10.15 224.71 -6.65 0.435 4962 +4964 4 9.59 226.63 -6.47 0.435 4963 +4965 4 9.33 227.24 -6.41 0.435 4964 +4966 4 9.28 228.11 -6.32 0.435 4965 +4967 4 8.34 228.87 -5.81 0.435 4966 +4968 4 7.2 229.86 -5.66 0.435 4967 +4969 4 6.67 231.33 -5.52 0.435 4968 +4970 4 6.14 232.59 -5.4 0.435 4969 +4971 4 5.9 233.21 -5.27 0.435 4970 +4972 4 5.41 233.83 -5.22 0.435 4971 +4973 4 4.92 234.88 -5.12 0.435 4972 +4974 4 4.2 235.91 -5.03 0.435 4973 +4975 4 3.07 236.7 -4.98 0.435 4974 +4976 4 2.56 237.74 -4.88 0.435 4975 +4977 4 2.23 239.44 -4.63 0.435 4976 +4978 4 1.75 240.27 -4.56 0.435 4977 +4979 4 0.98 241.9 -3.96 0.435 4978 +4980 4 0.46 242.86 -3.11 0.435 4979 +4981 4 -0.05 244.09 -2.7 0.435 4980 +4982 4 -0.97 244.89 -2.64 0.435 4981 +4983 4 -1.48 245.9 -2.09 0.435 4982 +4984 4 -2.17 246.21 -1.4 0.435 4983 +4985 4 -3.26 246.95 -2.93 0.435 4984 +4986 4 -3.7 247.44 -3.73 0.435 4985 +4987 4 -4.37 247.87 -4.07 0.435 4986 +4988 4 -5.49 248.44 -4.04 0.435 4987 +4989 4 -6.81 248.79 -4.03 0.435 4988 +4990 4 -7.94 249.59 -3.97 0.435 4989 +4991 4 -8.49 251.27 -3.81 0.435 4990 +4992 4 -9.9 252.91 -3.68 0.435 4991 +4993 4 -10.38 254.27 -4.6 0.435 4992 +4994 4 -11.32 255.57 -5.16 0.435 4993 +4995 4 -12.9 257.31 -6.16 0.435 4994 +4996 4 -13.38 258.21 -6.68 0.435 4995 +4997 4 -13.47 259.79 -7.27 0.435 4996 +4998 4 -14.64 261.23 -7.22 0.435 4997 +4999 4 -15.82 262.91 -7.38 0.435 4998 +5000 4 -16.71 263.56 -7.94 0.435 4999 +5001 4 -16.85 266.0 -8.52 0.435 5000 +5002 4 -16.96 267.93 -8.32 0.435 5001 +5003 4 -17.07 269.42 -8.17 0.435 5002 +5004 4 -18.23 270.88 -8.27 0.435 5003 +5005 4 -19.17 272.18 -8.84 0.435 5004 +5006 4 -19.69 273.66 -8.77 0.435 5005 +5007 4 -20.61 274.48 -8.86 0.435 5006 +5008 4 -20.67 275.6 -9.2 0.435 5007 +5009 4 -20.73 276.7 -9.31 0.435 5008 +5010 4 -20.56 277.87 -10.09 0.435 5009 +5011 4 -20.59 278.83 -10.89 0.435 5010 +5012 4 -20.66 279.9 -10.78 0.435 5011 +5013 4 -20.75 281.69 -11.43 0.435 5012 +5014 4 -21.44 282.59 -12.03 0.435 5013 +5015 4 -22.55 283.51 -13.32 0.435 5014 +5016 4 -23.45 284.36 -13.71 0.435 5015 +5017 4 -24.11 284.83 -14.5 0.435 5016 +5018 4 -25.64 285.23 -15.1 0.435 5017 +5019 4 -26.92 285.2 -15.58 0.435 5018 +5020 4 -27.79 285.17 -15.84 0.435 5019 +5021 4 -29.05 284.69 -16.22 0.435 5020 +5022 4 -30.6 285.25 -16.27 0.435 5021 +5023 4 -32.61 286.22 -16.3 0.435 5022 +5024 4 -36.18 287.73 -16.29 0.435 5023 +5025 4 -39.26 288.93 -17.23 0.435 5024 +5026 4 -40.9 291.3 -18.15 0.435 5025 +5027 4 -42.33 292.61 -16.84 0.435 5026 +5028 4 -43.32 294.68 -16.65 0.435 5027 +5029 4 -43.79 294.82 -16.12 0.435 5028 +5030 4 -45.41 296.18 -15.57 0.435 5029 +5031 4 -45.51 297.63 -14.89 0.435 5030 +5032 4 -46.48 299.06 -14.54 0.435 5031 +5033 4 -47.18 299.6 -13.9 0.435 5032 +5034 4 -47.71 300.56 -12.98 0.435 5033 +5035 4 -48.41 301.36 -12.76 0.435 5034 +5036 4 -48.67 301.94 -12.25 0.435 5035 +5037 4 -48.75 302.97 -11.7 0.435 5036 +5038 4 -48.91 305.3 -11.24 0.435 5037 +5039 4 25.5 205.85 -20.22 1.41 4944 +5040 4 24.79 206.88 -20.13 1.41 5039 +5041 4 25.11 206.91 -20.16 1.41 5040 +5042 4 25.27 206.92 -20.17 1.41 5041 +5043 4 24.04 207.49 -18.58 0.11 5042 +5044 4 23.5 209.18 -18.49 0.11 5043 +5045 4 22.71 211.23 -17.77 0.435 5044 +5046 4 21.92 213.08 -17.29 0.435 5045 +5047 4 21.35 214.89 -16.06 0.435 5046 +5048 4 20.8 216.26 -15.03 0.435 5047 +5049 4 20.27 217.2 -13.89 0.435 5048 +5050 4 19.56 217.43 -12.38 0.435 5049 +5051 4 18.45 217.81 -12.44 0.435 5050 +5052 4 16.79 220.07 -12.25 0.435 5051 +5053 4 15.97 222.59 -12.0 0.435 5052 +5054 4 15.88 224.1 -11.85 0.435 5053 +5055 4 16.25 224.93 -11.15 0.435 5054 +5056 4 16.43 225.36 -11.1 0.435 5055 +5057 4 16.79 226.68 -11.04 0.435 5056 +5058 4 16.74 227.28 -10.53 0.435 5057 +5059 4 16.85 228.53 -9.86 0.435 5058 +5060 4 15.6 230.76 -9.06 0.435 5059 +5061 4 15.09 231.72 -8.14 0.435 5060 +5062 4 13.63 234.2 -7.84 0.435 5061 +5063 4 12.41 236.27 -7.59 0.435 5062 +5064 4 12.33 237.31 -7.18 0.435 5063 +5065 4 11.36 238.69 -6.46 0.435 5064 +5066 4 11.01 240.07 -5.2 0.435 5065 +5067 4 10.49 240.98 -3.91 0.435 5066 +5068 4 8.18 242.98 -3.6 0.435 5067 +5069 4 6.48 245.65 -3.14 0.435 5068 +5070 4 4.52 249.17 -2.67 0.435 5069 +5071 4 2.66 251.21 -2.5 0.435 5070 +5072 4 0.25 254.68 -1.83 0.435 5071 +5073 4 -1.47 257.75 -1.02 0.435 5072 +5074 4 -2.04 259.34 0.18 0.435 5073 +5075 4 -3.67 260.9 0.83 0.435 5074 +5076 4 -4.19 261.88 1.59 0.435 5075 +5077 4 -4.7 262.85 2.28 0.435 5076 +5078 4 -5.65 263.83 2.81 0.435 5077 +5079 4 -8.18 266.03 3.06 0.435 5078 +5080 4 -10.04 268.06 3.3 0.435 5079 +5081 4 -11.68 269.63 3.95 0.435 5080 +5082 4 -13.1 270.93 5.26 0.435 5081 +5083 4 -14.12 272.97 5.97 0.435 5082 +5084 4 -14.27 275.05 6.72 0.435 5083 +5085 4 -14.29 275.74 6.25 0.435 5084 +5086 4 -14.76 276.37 6.24 0.435 5085 +5087 4 -14.57 276.28 7.29 0.435 5086 +5088 4 -15.09 276.72 9.12 0.435 5087 +5089 4 -15.13 277.05 10.06 0.435 5088 +5090 4 -15.87 277.49 11.6 0.435 5089 +5091 4 -16.77 278.03 12.16 0.435 5090 +5092 4 25.36 208.22 -20.06 1.41 5041 +5093 4 25.75 208.68 -20.0 1.41 5092 +5094 4 26.09 210.2 -19.84 1.41 5093 +5095 4 25.77 211.9 -19.67 1.41 5094 +5096 4 25.17 214.24 -19.44 1.41 5095 +5097 4 24.36 216.77 -19.2 1.41 5096 +5098 4 23.37 218.86 -19.0 1.41 5097 +5099 4 23.07 220.44 -19.74 1.41 5098 +5100 4 23.38 220.59 -19.72 1.41 5099 +5101 4 24.2 221.0 -18.9 0.435 5100 +5102 4 24.15 221.65 -18.92 0.435 5101 +5103 4 24.33 222.02 -18.2 0.435 5102 +5104 4 24.46 223.29 -17.77 0.435 5103 +5105 4 24.65 223.19 -16.72 0.435 5104 +5106 4 24.62 223.6 -16.52 0.435 5105 +5107 4 24.82 223.54 -15.69 0.435 5106 +5108 4 24.77 224.14 -15.33 0.435 5107 +5109 4 24.95 224.52 -14.61 0.435 5108 +5110 4 25.08 225.32 -13.84 0.435 5109 +5111 4 25.45 226.14 -13.07 0.435 5110 +5112 4 25.82 227.0 -12.82 0.435 5111 +5113 4 25.97 228.07 -12.56 0.435 5112 +5114 4 26.35 228.7 -12.11 0.435 5113 +5115 4 26.52 229.33 -11.74 0.435 5114 +5116 4 26.89 230.21 -11.64 0.435 5115 +5117 4 27.48 231.31 -11.43 0.435 5116 +5118 4 27.77 233.48 -11.13 0.435 5117 +5119 4 28.12 234.79 -10.99 0.435 5118 +5120 4 28.22 236.24 -10.23 0.435 5119 +5121 4 28.37 237.31 -10.04 0.435 5120 +5122 4 28.52 238.37 -9.7 0.435 5121 +5123 4 28.87 239.44 -9.2 0.435 5122 +5124 4 29.21 240.48 -8.48 0.435 5123 +5125 4 29.39 241.1 -8.19 0.435 5124 +5126 4 29.74 242.18 -7.84 0.435 5125 +5127 4 29.94 242.89 -8.37 0.435 5126 +5128 4 30.15 243.45 -9.36 0.435 5127 +5129 4 30.55 244.16 -9.73 0.435 5128 +5130 4 30.73 245.09 -10.23 0.435 5129 +5131 4 31.11 245.99 -10.21 0.435 5130 +5132 4 31.25 247.32 -10.44 0.435 5131 +5133 4 31.18 248.39 -10.4 0.435 5132 +5134 4 31.55 249.5 -10.36 0.435 5133 +5135 4 31.52 250.23 -11.04 0.435 5134 +5136 4 31.69 251.11 -11.1 0.435 5135 +5137 4 32.76 251.67 -11.62 0.435 5136 +5138 4 33.71 253.66 -11.39 0.435 5137 +5139 4 34.25 255.41 -11.19 0.435 5138 +5140 4 34.44 256.14 -11.79 0.435 5139 +5141 4 34.59 257.25 -11.82 0.435 5140 +5142 4 34.56 257.39 -11.28 0.435 5141 +5143 4 34.75 258.1 -11.58 0.435 5142 +5144 4 34.72 258.79 -11.96 0.435 5143 +5145 4 34.69 259.48 -12.42 0.435 5144 +5146 4 34.85 260.61 -12.75 0.435 5145 +5147 4 35.01 261.49 -12.73 0.435 5146 +5148 4 36.04 262.67 -13.11 0.435 5147 +5149 4 36.14 264.4 -12.93 0.435 5148 +5150 4 35.79 266.54 -12.79 0.435 5149 +5151 4 35.71 267.82 -12.66 0.435 5150 +5152 4 35.69 268.04 -12.64 0.435 5151 +5153 4 35.63 269.41 -13.33 0.435 5152 +5154 4 35.1 271.14 -13.61 0.435 5153 +5155 4 34.33 273.34 -14.3 0.435 5154 +5156 4 33.58 275.36 -15.4 0.435 5155 +5157 4 33.7 277.1 -15.37 0.435 5156 +5158 4 33.35 279.26 -15.37 0.435 5157 +5159 4 32.99 282.12 -15.99 0.435 5158 +5160 4 32.62 284.52 -16.35 0.435 5159 +5161 4 32.53 286.02 -16.2 0.435 5160 +5162 4 32.46 287.66 -17.32 0.435 5161 +5163 4 31.64 290.4 -17.06 0.435 5162 +5164 4 31.79 292.04 -18.08 0.435 5163 +5165 4 31.73 293.12 -18.05 0.435 5164 +5166 4 31.78 295.75 -18.23 0.435 5165 +5167 4 33.4 297.78 -18.05 0.435 5166 +5168 4 34.36 299.85 -18.42 0.435 5167 +5169 4 34.49 301.4 -18.64 0.435 5168 +5170 4 35.25 303.21 -18.88 0.435 5169 +5171 4 35.57 305.17 -18.74 0.435 5170 +5172 4 36.5 307.32 -17.9 0.435 5171 +5173 4 36.73 310.34 -17.58 0.435 5172 +5174 4 36.45 311.38 -17.33 0.435 5173 +5175 4 36.33 313.31 -17.13 0.435 5174 +5176 4 36.4 315.47 -16.9 0.435 5175 +5177 4 36.68 318.06 -16.63 0.435 5176 +5178 4 36.99 319.86 -16.52 0.435 5177 +5179 4 37.58 321.0 -16.69 0.435 5178 +5180 4 37.96 322.18 -17.31 0.435 5179 +5181 4 37.91 323.61 -18.59 0.435 5180 +5182 4 38.08 324.77 -19.22 0.435 5181 +5183 4 38.05 325.76 -20.48 0.435 5182 +5184 4 37.32 327.26 -20.71 0.435 5183 +5185 4 37.04 328.64 -21.56 0.435 5184 +5186 4 36.36 329.55 -22.46 0.435 5185 +5187 4 36.31 330.19 -22.32 0.435 5186 +5188 4 35.84 331.32 -23.04 0.435 5187 +5189 4 36.15 333.84 -24.2 0.435 5188 +5190 4 36.3 335.24 -24.96 0.435 5189 +5191 4 36.86 337.06 -25.51 0.435 5190 +5192 4 37.23 338.46 -26.11 0.435 5191 +5193 4 38.13 341.55 -26.0 0.435 5192 +5194 4 38.46 343.32 -26.11 0.435 5193 +5195 4 39.61 345.76 -25.9 0.435 5194 +5196 4 40.68 349.53 -25.94 0.435 5195 +5197 4 41.48 350.65 -25.8 0.435 5196 +5198 4 42.65 352.66 -25.57 0.435 5197 +5199 4 42.56 354.16 -25.42 0.435 5198 +5200 4 42.46 355.67 -25.34 0.435 5199 +5201 4 42.15 357.69 -26.2 0.435 5200 +5202 4 41.01 359.3 -27.79 0.435 5201 +5203 4 22.75 222.16 -19.87 1.41 5100 +5204 4 22.65 224.49 -21.37 1.41 5203 +5205 4 23.01 225.8 -21.3 1.41 5204 +5206 4 23.11 227.53 -21.12 1.41 5205 +5207 4 23.26 229.17 -22.15 1.41 5206 +5208 4 23.43 230.84 -23.49 1.41 5207 +5209 4 23.32 232.56 -23.46 1.41 5208 +5210 4 23.49 234.07 -25.26 1.41 5209 +5211 4 23.54 234.89 -25.17 1.41 5210 +5212 4 22.83 235.39 -24.08 0.435 5211 +5213 4 22.78 236.02 -23.94 0.435 5212 +5214 4 22.3 236.57 -23.22 0.435 5213 +5215 4 21.58 237.07 -22.21 0.435 5214 +5216 4 20.88 237.39 -21.44 0.435 5215 +5217 4 20.16 238.63 -21.25 0.435 5216 +5218 4 19.69 238.98 -20.7 0.435 5217 +5219 4 19.19 239.55 -20.2 0.435 5218 +5220 4 19.12 240.32 -19.37 0.435 5219 +5221 4 18.38 241.76 -19.09 0.435 5220 +5222 4 17.89 242.59 -19.01 0.435 5221 +5223 4 17.38 243.85 -18.81 0.435 5222 +5224 4 16.67 244.66 -18.68 0.435 5223 +5225 4 15.93 245.88 -18.33 0.435 5224 +5226 4 15.43 246.92 -18.17 0.435 5225 +5227 4 14.98 247.09 -18.01 0.435 5226 +5228 4 14.51 247.71 -17.96 0.435 5227 +5229 4 14.65 248.79 -17.84 0.435 5228 +5230 4 14.54 250.5 -17.59 0.435 5229 +5231 4 13.77 252.39 -17.41 0.435 5230 +5232 4 12.98 254.48 -17.21 0.435 5231 +5233 4 12.44 256.16 -16.9 0.435 5232 +5234 4 11.94 256.92 -16.16 0.435 5233 +5235 4 11.42 258.18 -16.04 0.435 5234 +5236 4 10.97 258.88 -16.74 0.435 5235 +5237 4 10.48 259.71 -16.66 0.435 5236 +5238 4 9.56 260.78 -17.02 0.435 5237 +5239 4 8.9 261.52 -18.32 0.435 5238 +5240 4 8.24 261.93 -18.6 0.435 5239 +5241 4 7.57 262.11 -18.59 0.435 5240 +5242 4 6.85 263.14 -18.57 0.435 5241 +5243 4 6.82 264.1 -19.31 0.435 5242 +5244 4 7.0 264.79 -19.69 0.435 5243 +5245 4 6.98 265.47 -19.99 0.435 5244 +5246 4 6.92 266.62 -20.55 0.435 5245 +5247 4 6.9 267.32 -21.01 0.435 5246 +5248 4 6.83 268.43 -21.35 0.435 5247 +5249 4 6.34 269.26 -21.27 0.435 5248 +5250 4 5.84 270.81 -21.88 0.435 5249 +5251 4 4.9 271.83 -21.79 0.435 5250 +5252 4 4.18 273.41 -22.77 0.435 5251 +5253 4 3.18 275.49 -22.51 0.435 5252 +5254 4 2.65 276.73 -22.24 0.435 5253 +5255 4 1.75 277.84 -23.13 0.435 5254 +5256 4 1.73 279.1 -24.73 0.435 5255 +5257 4 1.68 280.29 -25.74 0.435 5256 +5258 4 1.6 281.8 -25.74 0.435 5257 +5259 4 1.0 284.13 -25.51 0.435 5258 +5260 4 -0.66 286.61 -25.29 0.435 5259 +5261 4 -1.83 288.37 -26.19 0.435 5260 +5262 4 -2.36 289.84 -26.06 0.435 5261 +5263 4 -3.3 291.13 -26.55 0.435 5262 +5264 4 -4.21 292.46 -27.34 0.435 5263 +5265 4 -4.7 293.29 -27.33 0.435 5264 +5266 4 -5.87 295.04 -28.16 0.435 5265 +5267 4 -6.74 295.55 -29.41 0.435 5266 +5268 4 -8.07 296.12 -29.45 0.435 5267 +5269 4 -9.19 296.97 -29.99 0.435 5268 +5270 4 -9.92 298.24 -30.03 0.435 5269 +5271 4 -11.31 299.66 -29.92 0.435 5270 +5272 4 -13.35 301.85 -31.4 0.435 5271 +5273 4 -14.71 303.16 -32.2 0.435 5272 +5274 4 -15.39 303.83 -32.83 0.435 5273 +5275 4 -15.85 304.72 -33.34 0.435 5274 +5276 4 -16.78 306.05 -34.28 0.435 5275 +5277 4 -17.7 307.36 -34.85 0.435 5276 +5278 4 -18.83 308.5 -36.12 0.435 5277 +5279 4 -20.42 310.21 -36.88 0.435 5278 +5280 4 -21.37 311.49 -37.15 0.435 5279 +5281 4 -22.28 312.58 -37.81 0.435 5280 +5282 4 -23.39 313.49 -38.87 0.435 5281 +5283 4 -23.87 314.36 -39.24 0.435 5282 +5284 4 -23.91 315.8 -40.53 0.435 5283 +5285 4 -24.63 317.11 -41.09 0.435 5284 +5286 4 -25.3 318.08 -42.36 0.435 5285 +5287 4 -25.97 319.0 -43.41 0.435 5286 +5288 4 -28.19 319.76 -43.76 0.435 5287 +5289 4 -29.1 320.62 -44.15 0.435 5288 +5290 4 -29.79 321.5 -44.75 0.435 5289 +5291 4 -31.42 323.58 -44.87 0.435 5290 +5292 4 -32.36 324.61 -44.87 0.435 5291 +5293 4 -32.78 325.16 -46.18 0.435 5292 +5294 4 -33.89 326.08 -47.47 0.435 5293 +5295 4 23.42 235.13 -25.15 1.41 5211 +5296 4 23.56 236.43 -25.01 1.41 5295 +5297 4 24.14 237.55 -24.89 1.41 5296 +5298 4 24.54 238.83 -26.55 1.41 5297 +5299 4 24.89 240.4 -26.76 1.515 5298 +5300 4 25.23 242.5 -27.96 1.515 5299 +5301 4 25.6 243.61 -27.99 1.515 5300 +5302 4 25.31 244.88 -27.86 1.625 5301 +5303 4 25.0 246.65 -28.89 1.625 5302 +5304 4 24.94 248.26 -29.93 1.625 5303 +5305 4 25.08 249.34 -29.6 1.625 5304 +5306 4 24.51 249.71 -29.57 1.625 5305 +5307 4 23.36 250.4 -29.08 0.65 5306 +5308 4 22.83 251.57 -28.13 0.54 5307 +5309 4 22.6 251.78 -28.2 0.54 5308 +5310 4 22.58 251.68 -27.22 0.54 5309 +5311 4 22.56 251.59 -26.34 0.54 5310 +5312 4 22.54 251.5 -25.51 0.54 5311 +5313 4 22.49 251.84 -24.57 0.54 5312 +5314 4 22.48 251.81 -24.27 0.54 5313 +5315 4 22.46 252.0 -24.03 0.54 5314 +5316 4 22.44 251.94 -23.44 0.54 5315 +5317 4 22.41 252.04 -22.37 0.54 5316 +5318 4 22.4 251.99 -21.92 0.54 5317 +5319 4 22.38 251.89 -20.88 0.54 5318 +5320 4 22.37 252.16 -21.37 0.54 5319 +5321 4 22.36 252.36 -21.28 0.54 5320 +5322 4 22.33 252.78 -21.02 0.54 5321 +5323 4 22.31 252.68 -20.12 0.54 5322 +5324 4 21.83 253.01 -19.42 0.54 5323 +5325 4 21.34 253.82 -19.2 0.76 5324 +5326 4 20.56 255.93 -19.0 0.65 5325 +5327 4 20.46 257.43 -18.84 0.65 5326 +5328 4 19.04 259.27 -18.69 0.65 5327 +5329 4 18.3 260.51 -18.5 0.65 5328 +5330 4 17.54 262.4 -18.33 0.65 5329 +5331 4 16.79 263.84 -17.96 0.65 5330 +5332 4 16.0 265.68 -17.27 0.65 5331 +5333 4 15.42 267.46 -16.04 0.54 5332 +5334 4 14.89 268.65 -15.18 0.54 5333 +5335 4 14.36 269.59 -14.11 0.54 5334 +5336 4 14.31 270.15 -13.23 0.54 5335 +5337 4 14.21 271.11 -12.07 0.54 5336 +5338 4 13.4 273.38 -11.34 0.54 5337 +5339 4 12.61 275.47 -11.06 0.54 5338 +5340 4 12.33 276.85 -11.98 0.435 5339 +5341 4 11.57 278.53 -11.82 0.435 5340 +5342 4 11.52 279.4 -11.88 0.435 5341 +5343 4 11.32 282.9 -12.28 0.435 5342 +5344 4 10.65 286.74 -11.9 0.435 5343 +5345 4 10.75 288.46 -11.72 0.435 5344 +5346 4 9.78 290.13 -11.57 0.435 5345 +5347 4 8.54 292.42 -11.36 0.435 5346 +5348 4 7.73 294.95 -11.2 0.435 5347 +5349 4 7.38 296.75 -9.96 0.435 5348 +5350 4 6.84 298.5 -10.32 0.435 5349 +5351 4 6.77 299.84 -10.72 0.435 5350 +5352 4 6.85 302.01 -10.56 0.435 5351 +5353 4 6.76 303.77 -10.9 0.435 5352 +5354 4 5.1 305.83 -10.81 0.435 5353 +5355 4 3.96 306.84 -10.73 0.435 5354 +5356 4 2.12 308.45 -10.61 0.435 5355 +5357 4 -0.11 309.63 -10.84 0.435 5356 +5358 4 -1.79 312.11 -10.62 0.435 5357 +5359 4 -1.95 314.69 -10.36 0.435 5358 +5360 4 -2.92 316.34 -10.28 0.435 5359 +5361 4 -4.14 318.47 -10.54 0.435 5360 +5362 4 -4.68 320.41 -10.66 0.435 5361 +5363 4 -5.42 321.63 -10.33 0.435 5362 +5364 4 -6.12 322.44 -10.26 0.435 5363 +5365 4 -7.54 324.29 -10.1 0.435 5364 +5366 4 -7.82 324.88 -9.6 0.435 5365 +5367 4 -8.26 324.73 -8.42 0.435 5366 +5368 4 -8.35 325.44 -6.99 0.435 5367 +5369 4 -9.28 325.67 -5.56 0.435 5368 +5370 4 -9.76 326.01 -4.85 0.435 5369 +5371 4 -10.23 326.33 -4.0 0.435 5370 +5372 4 -11.15 326.62 -3.24 0.435 5371 +5373 4 -11.62 327.2 -2.74 0.435 5372 +5374 4 -13.21 327.89 -2.03 0.435 5373 +5375 4 -13.07 328.41 -0.69 0.435 5374 +5376 4 -13.85 330.49 -0.19 0.435 5375 +5377 4 -13.88 330.39 0.77 0.435 5376 +5378 4 -15.05 331.32 1.52 0.435 5377 +5379 4 -16.19 332.06 2.09 0.435 5378 +5380 4 -17.59 333.2 2.71 0.435 5379 +5381 4 -18.96 334.16 3.15 0.435 5380 +5382 4 -19.52 335.76 4.28 0.435 5381 +5383 4 -20.73 337.1 5.29 0.435 5382 +5384 4 -20.82 338.32 5.95 0.435 5383 +5385 4 -21.76 339.33 6.18 0.435 5384 +5386 4 -22.96 340.62 7.64 0.435 5385 +5387 4 -24.08 340.44 8.81 0.435 5386 +5388 4 -24.8 341.18 9.61 0.435 5387 +5389 4 -25.96 342.11 10.28 0.435 5388 +5390 4 -26.74 343.94 11.14 0.435 5389 +5391 4 -27.77 346.22 11.5 0.435 5390 +5392 4 -28.76 348.06 12.04 0.435 5391 +5393 4 -29.82 350.7 13.19 0.435 5392 +5394 4 -30.86 352.41 15.0 0.435 5393 +5395 4 -30.94 353.4 15.86 0.435 5394 +5396 4 -31.03 354.39 16.78 0.435 5395 +5397 4 -32.45 355.93 17.81 0.435 5396 +5398 4 -31.91 357.2 18.49 0.435 5397 +5399 4 -31.56 358.73 18.66 0.435 5398 +5400 4 -31.4 359.6 18.75 0.435 5399 +5401 4 -31.48 360.67 18.86 0.435 5400 +5402 4 -32.2 361.64 19.55 0.435 5401 +5403 4 -32.92 362.42 19.98 0.435 5402 +5404 4 -34.33 364.03 20.35 0.435 5403 +5405 4 -36.16 365.41 20.6 0.435 5404 +5406 4 -36.49 366.99 21.36 0.435 5405 +5407 4 -36.56 367.79 21.96 0.435 5406 +5408 4 -37.48 368.57 22.32 0.435 5407 +5409 4 -38.01 369.8 22.67 0.435 5408 +5410 4 -38.95 370.79 23.04 0.435 5409 +5411 4 -39.04 372.28 23.34 0.435 5410 +5412 4 -39.79 373.69 23.92 0.435 5411 +5413 4 -39.72 375.36 24.7 0.435 5412 +5414 4 -40.3 377.65 25.22 0.435 5413 +5415 4 -40.82 378.86 25.79 0.435 5414 +5416 4 -41.99 379.56 26.82 0.435 5415 +5417 4 -42.9 379.8 28.1 0.435 5416 +5418 4 -43.81 380.12 28.65 0.435 5417 +5419 4 -45.2 381.29 29.26 0.435 5418 +5420 4 -46.14 382.28 29.41 0.435 5419 +5421 4 -46.22 383.56 29.69 0.435 5420 +5422 4 -46.34 385.24 30.16 0.435 5421 +5423 4 -46.88 386.68 30.68 0.435 5422 +5424 4 -48.33 389.16 30.97 0.435 5423 +5425 4 -49.85 392.51 31.36 0.435 5424 +5426 4 -51.48 394.12 31.49 0.435 5425 +5427 4 -52.44 395.57 31.69 0.435 5426 +5428 4 -54.07 397.17 31.9 0.435 5427 +5429 4 -55.67 398.37 31.98 0.435 5428 +5430 4 -57.42 401.86 32.83 0.435 5429 +5431 4 -59.31 404.32 33.12 0.435 5430 +5432 4 -60.72 405.95 33.4 0.435 5431 +5433 4 -61.9 407.12 34.02 0.435 5432 +5434 4 -63.33 408.94 34.32 0.435 5433 +5435 4 -63.43 410.15 35.2 0.435 5434 +5436 4 -63.37 412.46 36.04 0.435 5435 +5437 4 -63.43 413.03 36.79 0.435 5436 +5438 4 -63.31 414.52 37.16 0.435 5437 +5439 4 -63.4 415.48 38.39 0.435 5438 +5440 4 -64.82 417.09 38.75 0.435 5439 +5441 4 -64.9 418.37 38.95 0.435 5440 +5442 4 -65.46 420.27 39.14 0.435 5441 +5443 4 -65.57 421.98 39.31 0.435 5442 +5444 4 -66.5 423.0 39.39 0.435 5443 +5445 4 -67.03 424.46 39.61 0.435 5444 +5446 4 -67.09 425.09 39.9 0.435 5445 +5447 4 -67.15 425.62 41.09 0.435 5446 +5448 4 -67.24 426.87 41.52 0.435 5447 +5449 4 -67.91 427.06 41.89 0.435 5448 +5450 4 -68.38 427.69 41.88 0.435 5449 +5451 4 -68.67 427.89 43.85 0.435 5450 +5452 4 -69.34 427.76 44.8 0.435 5451 +5453 4 -69.82 428.09 45.42 0.435 5452 +5454 4 -70.53 428.32 47.09 0.435 5453 +5455 4 -70.4 428.79 48.87 0.435 5454 +5456 4 -70.69 429.56 49.78 0.435 5455 +5457 4 -71.19 430.83 49.75 0.435 5456 +5458 4 -70.83 431.4 50.79 0.435 5457 +5459 4 -70.69 432.44 51.35 0.435 5458 +5460 4 -71.64 432.86 53.1 0.435 5459 +5461 4 -72.13 433.68 53.26 0.435 5460 +5462 4 -72.86 434.38 54.37 0.435 5461 +5463 4 -73.55 434.95 54.71 0.435 5462 +5464 4 -74.52 436.37 55.14 0.435 5463 +5465 4 -74.8 437.18 55.52 0.435 5464 +5466 4 -74.42 437.8 56.11 0.435 5465 +5467 4 -74.29 438.86 56.46 0.435 5466 +5468 4 -74.34 439.71 56.61 0.435 5467 +5469 4 -74.81 440.33 56.67 0.435 5468 +5470 4 -75.98 441.75 56.87 0.435 5469 +5471 4 -77.58 442.95 56.95 0.435 5470 +5472 4 -79.51 445.84 57.21 0.435 5471 +5473 4 -80.99 448.77 57.48 0.435 5472 +5474 4 -81.53 449.95 58.26 0.435 5473 +5475 4 -83.24 452.79 59.19 0.435 5474 +5476 4 -83.16 454.71 59.62 0.435 5475 +5477 4 -83.05 456.16 60.37 0.435 5476 +5478 4 -82.78 458.54 60.7 0.435 5477 +5479 4 -82.69 460.44 61.28 0.435 5478 +5480 4 -82.56 461.44 62.21 0.435 5479 +5481 4 -82.16 461.87 62.49 0.435 5480 +5482 4 -82.28 463.52 63.26 0.435 5481 +5483 4 -82.79 464.27 64.09 0.435 5482 +5484 4 -83.96 465.19 64.98 0.435 5483 +5485 4 -84.45 465.43 66.57 0.435 5484 +5486 4 -85.19 466.12 67.91 0.435 5485 +5487 4 -86.14 466.82 68.94 0.435 5486 +5488 4 -86.39 467.15 69.87 0.435 5487 +5489 4 -87.75 467.87 70.36 0.435 5488 +5490 4 -89.09 468.16 71.04 0.435 5489 +5491 4 24.48 250.15 -29.53 1.625 5306 +5492 4 25.04 250.78 -31.11 1.735 5491 +5493 4 25.2 251.66 -31.01 1.735 5492 +5494 4 24.94 253.32 -32.58 1.735 5493 +5495 4 24.84 255.39 -33.79 1.735 5494 +5496 4 24.75 257.17 -34.21 1.735 5495 +5497 4 24.22 258.42 -34.03 1.735 5496 +5498 4 24.4 259.13 -33.95 1.735 5497 +5499 4 24.81 259.89 -34.69 0.65 5498 +5500 4 25.2 260.54 -34.54 0.865 5499 +5501 4 26.04 260.81 -34.41 0.865 5500 +5502 4 26.62 262.18 -34.71 0.865 5501 +5503 4 27.38 263.94 -34.59 0.65 5502 +5504 4 28.18 265.31 -34.65 0.65 5503 +5505 4 28.52 266.63 -34.58 0.65 5504 +5506 4 29.08 268.17 -34.48 0.65 5505 +5507 4 30.07 269.54 -34.4 0.65 5506 +5508 4 31.02 271.74 -34.15 0.65 5507 +5509 4 31.97 273.96 -34.05 0.65 5508 +5510 4 32.68 276.4 -33.93 0.65 5509 +5511 4 33.63 278.6 -33.68 0.65 5510 +5512 4 34.55 281.24 -33.45 0.65 5511 +5513 4 35.7 283.46 -33.2 0.65 5512 +5514 4 36.96 287.63 -32.73 0.65 5513 +5515 4 37.71 289.39 -32.53 0.65 5514 +5516 4 38.64 291.81 -32.26 0.65 5515 +5517 4 39.53 294.88 -31.92 0.65 5516 +5518 4 40.45 297.31 -31.65 0.65 5517 +5519 4 41.41 299.51 -31.4 0.65 5518 +5520 4 42.53 302.38 -31.08 0.65 5519 +5521 4 43.47 304.59 -30.83 0.65 5520 +5522 4 43.84 305.22 -30.38 0.65 5521 +5523 4 44.85 306.57 -30.22 0.65 5522 +5524 4 47.13 308.21 -29.99 0.65 5523 +5525 4 47.49 309.32 -29.87 0.65 5524 +5526 4 47.83 310.83 -29.62 0.65 5525 +5527 4 48.14 312.78 -29.41 0.65 5526 +5528 4 48.48 314.1 -29.27 0.65 5527 +5529 4 48.44 314.73 -29.21 0.65 5528 +5530 4 49.23 316.37 -29.7 0.65 5529 +5531 4 49.64 316.85 -29.94 0.65 5530 +5532 4 49.99 317.91 -29.44 0.65 5531 +5533 4 23.96 259.81 -35.1 1.735 5498 +5534 4 23.69 260.96 -35.81 1.735 5533 +5535 4 23.35 261.23 -35.79 1.735 5534 +5536 4 22.02 261.6 -36.08 0.76 5535 +5537 4 21.26 263.26 -35.78 0.54 5536 +5538 4 20.31 264.49 -35.67 0.54 5537 +5539 4 19.56 266.17 -35.52 0.54 5538 +5540 4 18.81 267.63 -35.38 0.54 5539 +5541 4 18.32 268.68 -35.29 0.54 5540 +5542 4 17.79 269.93 -35.17 0.54 5541 +5543 4 17.69 271.43 -35.02 0.54 5542 +5544 4 17.64 272.29 -34.93 0.54 5543 +5545 4 17.8 273.16 -34.84 0.54 5544 +5546 4 17.71 274.66 -34.68 0.54 5545 +5547 4 17.82 276.39 -34.5 0.54 5546 +5548 4 17.75 277.45 -34.39 0.54 5547 +5549 4 16.37 278.66 -34.3 0.54 5548 +5550 4 15.86 279.71 -34.2 0.54 5549 +5551 4 14.91 281.16 -34.08 0.54 5550 +5552 4 13.53 282.35 -33.99 0.54 5551 +5553 4 13.23 282.82 -32.22 0.54 5552 +5554 4 12.87 283.44 -32.08 0.65 5553 +5555 4 12.99 284.95 -31.92 0.65 5554 +5556 4 12.9 286.45 -31.77 0.865 5555 +5557 4 13.01 288.18 -31.58 0.865 5556 +5558 4 13.31 290.14 -31.38 0.865 5557 +5559 4 13.44 291.65 -31.22 0.865 5558 +5560 4 13.55 293.16 -31.06 0.865 5559 +5561 4 13.52 293.6 -31.01 0.865 5560 +5562 4 12.83 294.19 -30.97 0.865 5561 +5563 4 11.9 295.21 -30.88 0.54 5562 +5564 4 11.62 296.27 -30.78 0.76 5563 +5565 4 10.47 297.28 -30.7 0.76 5564 +5566 4 9.96 298.32 -30.61 0.76 5565 +5567 4 9.23 299.56 -30.5 0.65 5566 +5568 4 7.86 300.78 -30.4 0.65 5567 +5569 4 7.34 302.03 -30.29 0.65 5568 +5570 4 6.36 303.7 -30.14 0.65 5569 +5571 4 6.28 304.98 -30.01 0.65 5570 +5572 4 4.84 306.46 -28.38 0.65 5571 +5573 4 3.46 307.67 -28.29 0.65 5572 +5574 4 2.76 308.22 -27.79 0.65 5573 +5575 4 2.71 308.55 -26.78 0.65 5574 +5576 4 2.2 309.51 -25.87 0.65 5575 +5577 4 2.08 311.2 -25.47 0.65 5576 +5578 4 1.07 313.3 -25.28 0.65 5577 +5579 4 0.53 314.97 -25.05 0.65 5578 +5580 4 0.44 315.97 -24.26 0.65 5579 +5581 4 -0.94 317.37 -23.85 0.65 5580 +5582 4 -2.36 318.97 -23.41 0.65 5581 +5583 4 -2.91 320.61 -22.73 0.65 5582 +5584 4 -3.02 322.03 -21.84 0.65 5583 +5585 4 -4.45 323.85 -21.38 0.65 5584 +5586 4 -5.83 325.02 -21.06 0.65 5585 +5587 4 -6.99 326.03 -20.91 0.65 5586 +5588 4 -7.04 326.65 -20.7 0.65 5587 +5589 4 -7.98 327.89 -20.59 0.65 5588 +5590 4 -8.05 328.91 -20.04 0.65 5589 +5591 4 -8.15 330.13 -19.24 0.65 5590 +5592 4 -8.02 331.23 -18.82 0.65 5591 +5593 4 -8.08 331.81 -18.16 0.65 5592 +5594 4 -8.15 332.61 -17.62 0.65 5593 +5595 4 -8.23 333.62 -16.92 0.65 5594 +5596 4 -8.79 335.49 -16.35 0.65 5595 +5597 4 -9.29 336.5 -15.96 0.65 5596 +5598 4 -10.29 338.34 -15.49 0.65 5597 +5599 4 -10.35 339.15 -14.96 0.65 5598 +5600 4 -10.87 340.4 -14.69 0.65 5599 +5601 4 -12.29 342.24 -14.46 0.65 5600 +5602 4 -13.48 343.64 -14.04 0.65 5601 +5603 4 -14.39 344.2 -13.63 0.65 5602 +5604 4 -14.69 345.19 -12.93 0.65 5603 +5605 4 -15.23 346.86 -12.55 0.65 5604 +5606 4 -15.13 348.58 -12.28 0.65 5605 +5607 4 -15.69 350.22 -11.69 0.65 5606 +5608 4 -16.9 352.03 -11.07 0.65 5607 +5609 4 -17.39 352.56 -10.13 0.65 5608 +5610 4 -18.55 353.54 -9.82 0.65 5609 +5611 4 -19.71 354.75 -9.65 0.65 5610 +5612 4 -19.78 355.32 -8.84 0.65 5611 +5613 4 -20.29 356.3 -8.07 0.65 5612 +5614 4 -20.38 357.3 -7.29 0.65 5613 +5615 4 -20.9 358.51 -6.8 0.65 5614 +5616 4 -21.63 359.5 -6.34 0.65 5615 +5617 4 -22.57 360.46 -5.66 0.65 5616 +5618 4 -23.53 361.65 -5.11 0.65 5617 +5619 4 -24.03 362.65 -4.64 0.65 5618 +5620 4 -24.1 363.46 -4.03 0.65 5619 +5621 4 -24.87 365.08 -3.36 0.65 5620 +5622 4 -25.42 366.51 -2.84 0.65 5621 +5623 4 -26.14 366.97 -1.38 0.65 5622 +5624 4 -26.65 368.24 -1.26 0.65 5623 +5625 4 -27.14 368.73 -0.09 0.65 5624 +5626 4 -27.24 369.72 0.76 0.65 5625 +5627 4 -27.36 371.37 1.67 0.65 5626 +5628 4 -27.45 372.63 1.95 0.65 5627 +5629 4 -28.21 373.99 3.06 0.65 5628 +5630 4 -28.73 375.25 3.18 0.65 5629 +5631 4 -30.1 375.97 3.74 0.65 5630 +5632 4 -31.5 376.83 5.16 0.65 5631 +5633 4 -32.39 377.2 5.25 0.65 5632 +5634 4 -33.59 379.06 5.42 0.65 5633 +5635 4 -33.05 380.82 5.61 0.65 5634 +5636 4 -32.69 381.85 5.8 0.54 5635 +5637 4 -32.09 382.23 6.69 0.54 5636 +5638 4 -31.98 383.44 7.71 0.54 5637 +5639 4 -31.83 384.22 8.55 0.54 5638 +5640 4 -32.82 385.83 9.29 0.54 5639 +5641 4 -33.32 386.84 9.69 0.54 5640 +5642 4 -33.43 388.04 10.64 0.54 5641 +5643 4 -33.51 389.07 11.2 0.54 5642 +5644 4 -33.84 390.75 11.44 0.54 5643 +5645 4 -33.91 391.81 11.7 0.54 5644 +5646 4 -33.78 392.52 13.36 0.54 5645 +5647 4 -34.06 393.33 13.81 0.54 5646 +5648 4 -35.05 394.9 14.85 0.54 5647 +5649 4 -35.81 396.05 15.86 0.54 5648 +5650 4 -36.56 397.22 16.72 0.54 5649 +5651 4 -37.24 397.82 16.83 0.54 5650 +5652 4 -37.95 398.37 17.33 0.54 5651 +5653 4 -38.22 399.17 17.79 0.54 5652 +5654 4 -38.72 399.95 18.46 0.54 5653 +5655 4 -38.78 400.55 18.82 0.54 5654 +5656 4 -38.89 401.98 19.79 0.54 5655 +5657 4 -39.18 402.49 20.89 0.54 5656 +5658 4 -39.72 403.64 22.21 0.54 5657 +5659 4 -40.72 404.91 23.97 0.54 5658 +5660 4 -41.89 406.33 24.24 0.54 5659 +5661 4 -42.64 407.24 25.45 0.54 5660 +5662 4 -43.11 407.62 25.7 0.54 5661 +5663 4 -43.59 407.96 26.33 0.54 5662 +5664 4 -44.26 408.32 26.72 0.54 5663 +5665 4 -44.95 408.67 27.05 0.54 5664 +5666 4 -45.66 409.44 27.63 0.54 5665 +5667 4 -46.57 409.76 28.18 0.54 5666 +5668 4 -47.26 410.12 28.42 0.54 5667 +5669 4 -47.94 410.72 28.55 0.54 5668 +5670 4 -49.04 410.85 28.68 0.54 5669 +5671 4 23.1 261.64 -35.75 1.735 5535 +5672 4 23.43 262.39 -37.18 1.735 5671 +5673 4 23.38 263.57 -38.11 1.735 5672 +5674 4 23.64 264.48 -38.01 1.735 5673 +5675 4 24.05 264.17 -36.74 0.65 5674 +5676 4 24.7 263.88 -35.71 0.65 5675 +5677 4 25.3 264.57 -35.7 0.65 5676 +5678 4 25.72 264.48 -34.57 0.65 5677 +5679 4 26.13 264.46 -34.03 0.65 5678 +5680 4 27.13 265.27 -32.95 0.65 5679 +5681 4 27.31 265.69 -32.6 0.65 5680 +5682 4 27.73 265.65 -31.99 0.65 5681 +5683 4 27.91 266.03 -31.34 0.65 5682 +5684 4 27.89 265.96 -30.68 0.65 5683 +5685 4 28.3 265.91 -29.99 0.65 5684 +5686 4 28.26 266.28 -29.28 0.65 5685 +5687 4 29.29 267.16 -28.78 0.65 5686 +5688 4 29.68 267.55 -28.06 0.65 5687 +5689 4 30.02 268.82 -27.61 0.65 5688 +5690 4 30.38 269.67 -27.07 0.65 5689 +5691 4 30.75 270.52 -26.67 0.65 5690 +5692 4 31.13 271.14 -26.14 0.65 5691 +5693 4 31.52 271.78 -25.76 0.65 5692 +5694 4 31.7 272.2 -25.42 0.65 5693 +5695 4 32.28 273.05 -24.93 0.65 5694 +5696 4 33.06 274.35 -24.33 0.65 5695 +5697 4 33.64 275.21 -23.93 0.65 5696 +5698 4 34.17 276.94 -23.51 0.65 5697 +5699 4 34.76 278.02 -23.23 0.65 5698 +5700 4 35.08 279.53 -22.85 0.65 5699 +5701 4 36.24 281.75 -22.51 0.65 5700 +5702 4 37.42 283.54 -22.3 0.65 5701 +5703 4 39.89 285.62 -21.95 0.65 5702 +5704 4 41.54 287.02 -21.77 0.65 5703 +5705 4 42.13 287.9 -21.58 0.65 5704 +5706 4 42.53 288.57 -21.43 0.65 5705 +5707 4 44.27 291.68 -20.99 0.65 5706 +5708 4 45.89 293.48 -20.7 0.65 5707 +5709 4 46.89 295.09 -21.03 0.65 5708 +5710 4 47.87 296.67 -20.84 0.65 5709 +5711 4 48.65 297.67 -19.59 0.65 5710 +5712 4 49.63 298.65 -17.88 0.65 5711 +5713 4 50.8 300.66 -17.64 0.65 5712 +5714 4 52.16 302.88 -17.31 0.65 5713 +5715 4 53.49 305.69 -16.31 0.65 5714 +5716 4 55.72 307.97 -15.95 0.65 5715 +5717 4 56.91 309.76 -15.73 0.65 5716 +5718 4 58.53 311.8 -15.48 0.65 5717 +5719 4 60.98 314.1 -15.19 0.65 5718 +5720 4 61.76 314.65 -13.68 0.65 5719 +5721 4 62.58 315.56 -13.57 0.65 5720 +5722 4 64.04 316.51 -13.44 0.65 5721 +5723 4 64.8 317.81 -12.9 0.65 5722 +5724 4 65.38 318.91 -12.71 0.65 5723 +5725 4 66.61 320.06 -12.56 0.65 5724 +5726 4 68.26 321.45 -12.37 0.65 5725 +5727 4 69.25 323.01 -12.19 0.65 5726 +5728 4 70.18 325.22 -11.94 0.65 5727 +5729 4 71.18 326.58 -11.77 0.65 5728 +5730 4 72.81 328.39 -11.47 0.65 5729 +5731 4 74.19 330.4 -11.08 0.65 5730 +5732 4 75.33 332.55 -10.22 0.65 5731 +5733 4 75.43 334.5 -10.02 0.65 5732 +5734 4 76.29 337.72 -9.21 0.65 5733 +5735 4 76.35 340.09 -8.9 0.65 5734 +5736 4 77.43 343.6 -8.51 0.65 5735 +5737 4 78.93 346.81 -7.08 0.65 5736 +5738 4 79.42 349.21 -6.82 0.65 5737 +5739 4 79.93 351.59 -6.49 0.65 5738 +5740 4 80.73 352.51 -6.37 0.65 5739 +5741 4 81.71 354.07 -6.19 0.65 5740 +5742 4 82.85 356.72 -5.89 0.65 5741 +5743 4 83.26 360.41 -5.49 0.65 5742 +5744 4 84.34 363.91 -5.11 0.65 5743 +5745 4 85.32 365.95 -5.4 0.65 5744 +5746 4 86.98 367.17 -5.54 0.65 5745 +5747 4 87.81 368.14 -6.09 0.65 5746 +5748 4 87.98 369.09 -6.75 0.65 5747 +5749 4 88.17 369.78 -7.12 0.65 5748 +5750 4 89.0 371.3 -8.61 0.65 5749 +5751 4 23.56 265.03 -39.61 1.735 5674 +5752 4 23.87 267.3 -40.43 1.41 5751 +5753 4 24.22 269.42 -41.78 1.19 5752 +5754 4 24.58 271.04 -42.51 1.19 5753 +5755 4 24.74 272.44 -43.26 1.19 5754 +5756 4 24.99 273.38 -43.16 1.19 5755 +5757 4 25.4 273.84 -43.1 1.19 5756 +5758 4 25.55 274.68 -42.78 0.54 5757 +5759 4 25.53 275.13 -42.89 0.54 5758 +5760 4 25.71 274.98 -41.32 0.54 5759 +5761 4 26.32 275.7 -41.68 0.54 5760 +5762 4 26.52 276.14 -41.63 0.54 5761 +5763 4 26.9 276.82 -41.62 0.54 5762 +5764 4 27.05 277.63 -40.93 0.54 5763 +5765 4 27.01 277.98 -40.15 0.54 5764 +5766 4 27.2 278.18 -39.83 0.54 5765 +5767 4 27.37 278.52 -38.88 0.54 5766 +5768 4 27.56 278.94 -38.45 0.54 5767 +5769 4 27.7 279.75 -37.84 0.54 5768 +5770 4 27.85 280.55 -37.15 0.54 5769 +5771 4 27.78 281.61 -36.89 0.76 5770 +5772 4 27.9 282.61 -35.95 0.65 5771 +5773 4 27.85 282.92 -34.72 0.65 5772 +5774 4 27.84 282.88 -34.35 0.65 5773 +5775 4 27.79 283.23 -33.56 0.65 5774 +5776 4 27.72 284.02 -32.72 0.65 5775 +5777 4 27.36 286.11 -32.21 0.76 5776 +5778 4 27.25 287.29 -31.12 0.76 5777 +5779 4 26.75 288.28 -30.43 0.76 5778 +5780 4 26.66 289.31 -29.94 0.76 5779 +5781 4 26.8 290.36 -29.45 0.76 5780 +5782 4 26.9 292.02 -28.68 0.76 5781 +5783 4 26.78 293.72 -28.35 0.76 5782 +5784 4 27.11 295.46 -28.16 0.76 5783 +5785 4 27.46 296.51 -27.6 0.76 5784 +5786 4 28.64 298.26 -26.93 0.76 5785 +5787 4 29.17 299.99 -26.44 0.76 5786 +5788 4 29.29 301.25 -26.09 0.76 5787 +5789 4 29.59 303.41 -25.62 0.76 5788 +5790 4 28.98 305.94 -25.31 0.76 5789 +5791 4 28.41 308.06 -25.1 0.76 5790 +5792 4 28.7 310.21 -24.79 0.76 5791 +5793 4 29.24 312.18 -24.5 0.76 5792 +5794 4 30.0 313.67 -24.25 0.65 5793 +5795 4 31.77 316.57 -23.91 0.65 5794 +5796 4 32.93 318.79 -23.65 0.65 5795 +5797 4 34.26 321.67 -23.32 0.65 5796 +5798 4 35.05 323.0 -23.17 0.65 5797 +5799 4 35.16 324.73 -22.98 0.65 5798 +5800 4 34.62 326.2 -22.85 0.65 5799 +5801 4 33.58 328.93 -22.52 0.65 5800 +5802 4 32.2 333.37 -22.09 0.65 5801 +5803 4 31.87 335.49 -21.88 0.65 5802 +5804 4 31.97 337.0 -21.72 0.65 5803 +5805 4 32.06 339.16 -21.49 0.65 5804 +5806 4 32.39 340.69 -21.33 0.65 5805 +5807 4 32.46 343.06 -21.08 0.65 5806 +5808 4 32.28 345.84 -20.8 0.65 5807 +5809 4 31.76 347.32 -20.66 0.65 5808 +5810 4 31.24 348.57 -20.54 0.65 5809 +5811 4 31.18 349.43 -20.45 0.65 5810 +5812 4 30.84 351.02 -19.24 0.54 5811 +5813 4 31.16 352.76 -19.05 0.54 5812 +5814 4 31.91 354.53 -18.85 0.54 5813 +5815 4 32.28 355.64 -18.8 0.54 5814 +5816 4 32.42 356.93 -18.66 0.54 5815 +5817 4 32.34 358.0 -18.55 0.54 5816 +5818 4 32.29 358.86 -18.47 0.54 5817 +5819 4 31.76 360.33 -18.33 0.54 5818 +5820 4 32.45 362.96 -18.04 0.54 5819 +5821 4 33.01 364.49 -17.87 0.54 5820 +5822 4 33.75 366.49 -17.64 0.54 5821 +5823 4 34.9 368.91 -17.36 0.54 5822 +5824 4 35.9 370.26 -17.2 0.54 5823 +5825 4 36.27 371.15 -17.1 0.54 5824 +5826 4 36.23 371.79 -17.03 0.54 5825 +5827 4 36.28 374.37 -16.77 0.54 5826 +5828 4 35.69 376.91 -16.52 0.54 5827 +5829 4 36.2 379.1 -16.28 0.54 5828 +5830 4 37.1 381.95 -15.96 0.54 5829 +5831 4 38.04 384.15 -15.71 0.54 5830 +5832 4 38.75 386.26 -14.57 0.54 5831 +5833 4 39.93 388.27 -14.34 0.54 5832 +5834 4 40.65 390.46 -14.02 0.435 5833 +5835 4 41.41 391.98 -13.62 0.435 5834 +5836 4 41.94 393.7 -13.05 0.435 5835 +5837 4 41.83 395.15 -12.45 0.435 5836 +5838 4 42.49 398.41 -12.02 0.435 5837 +5839 4 43.63 400.84 -11.67 0.435 5838 +5840 4 44.36 403.24 -11.4 0.435 5839 +5841 4 44.69 404.78 -11.24 0.435 5840 +5842 4 44.98 406.94 -11.01 0.435 5841 +5843 4 44.87 408.65 -10.75 0.435 5842 +5844 4 45.18 410.61 -10.54 0.435 5843 +5845 4 45.88 413.23 -10.26 0.435 5844 +5846 4 47.67 415.71 -9.96 0.435 5845 +5847 4 48.69 416.84 -9.82 0.435 5846 +5848 4 48.63 417.91 -9.71 0.435 5847 +5849 4 48.71 419.63 -9.38 0.435 5848 +5850 4 49.03 421.58 -9.1 0.435 5849 +5851 4 50.44 423.16 -8.82 0.435 5850 +5852 4 53.74 425.93 -8.45 0.435 5851 +5853 4 54.83 429.24 -8.09 0.435 5852 +5854 4 55.38 430.77 -7.91 0.435 5853 +5855 4 55.72 432.04 -7.33 0.435 5854 +5856 4 55.86 433.08 -6.77 0.435 5855 +5857 4 55.78 434.11 -6.28 0.435 5856 +5858 4 55.09 435.55 -7.96 0.435 5857 +5859 4 54.63 436.16 -7.98 0.435 5858 +5860 4 53.7 437.53 -9.21 0.435 5859 +5861 4 53.28 437.76 -9.65 0.435 5860 +5862 4 52.38 438.71 -10.86 0.435 5861 +5863 4 51.26 440.11 -12.55 0.435 5862 +5864 4 50.59 441.31 -14.18 0.435 5863 +5865 4 49.21 443.34 -15.73 0.435 5864 +5866 4 47.62 444.86 -16.67 0.435 5865 +5867 4 47.54 445.89 -16.26 0.435 5866 +5868 4 46.84 446.99 -16.69 0.435 5867 +5869 4 46.54 448.01 -16.29 0.435 5868 +5870 4 46.73 448.43 -16.1 0.435 5869 +5871 4 46.72 449.17 -16.84 0.435 5870 +5872 4 46.45 450.35 -17.94 0.435 5871 +5873 4 46.4 451.22 -18.07 0.435 5872 +5874 4 45.74 451.94 -19.14 0.435 5873 +5875 4 45.25 453.3 -19.99 0.435 5874 +5876 4 45.25 453.85 -20.99 0.435 5875 +5877 4 43.92 454.97 -22.26 0.435 5876 +5878 4 44.24 456.76 -22.52 0.435 5877 +5879 4 42.85 458.73 -23.56 0.435 5878 +5880 4 42.56 460.57 -24.65 0.435 5879 +5881 4 42.88 462.31 -24.54 0.435 5880 +5882 4 43.59 465.49 -25.33 0.435 5881 +5883 4 44.93 468.16 -25.1 0.435 5882 +5884 4 45.62 470.99 -24.79 0.435 5883 +5885 4 46.91 474.68 -24.53 0.435 5884 +5886 4 47.97 478.4 -24.12 0.435 5885 +5887 4 50.13 481.98 -23.7 0.435 5886 +5888 4 52.83 487.3 -23.08 0.435 5887 +5889 4 55.67 490.27 -22.71 0.435 5888 +5890 4 57.08 491.86 -22.51 0.435 5889 +5891 4 59.46 495.96 -22.85 0.435 5890 +5892 4 61.33 497.44 -23.26 0.435 5891 +5893 4 62.37 498.44 -24.04 0.435 5892 +5894 4 64.34 501.8 -23.79 0.435 5893 +5895 4 65.3 502.99 -21.99 0.435 5894 +5896 4 65.63 504.45 -21.31 0.435 5895 +5897 4 66.65 505.4 -21.25 0.435 5896 +5898 4 67.2 506.94 -21.16 0.435 5897 +5899 4 67.75 508.48 -20.99 0.435 5898 +5900 4 68.32 509.8 -20.84 0.435 5899 +5901 4 68.65 511.06 -20.1 0.435 5900 +5902 4 68.8 512.08 -19.54 0.435 5901 +5903 4 68.76 512.5 -19.26 0.435 5902 +5904 4 68.74 513.22 -20.02 0.435 5903 +5905 4 68.72 513.99 -21.14 0.435 5904 +5906 4 68.29 514.99 -22.86 0.435 5905 +5907 4 68.3 515.31 -23.81 0.435 5906 +5908 4 68.27 516.04 -24.49 0.435 5907 +5909 4 68.2 517.37 -24.81 0.435 5908 +5910 4 68.14 518.5 -25.21 0.435 5909 +5911 4 67.33 521.04 -25.12 0.435 5910 +5912 4 67.04 522.62 -25.87 0.435 5911 +5913 4 67.62 524.04 -26.61 0.435 5912 +5914 4 68.19 525.07 -25.66 0.435 5913 +5915 4 68.57 526.53 -26.94 0.435 5914 +5916 4 68.76 527.5 -27.89 0.435 5915 +5917 4 69.37 528.5 -28.75 0.435 5916 +5918 4 69.77 529.73 -29.9 0.435 5917 +5919 4 70.22 530.08 -30.97 0.435 5918 +5920 4 70.75 532.12 -31.5 0.435 5919 +5921 4 70.64 534.61 -32.38 0.435 5920 +5922 4 71.39 536.69 -33.2 0.435 5921 +5923 4 71.73 538.48 -33.46 0.435 5922 +5924 4 72.67 541.21 -34.06 0.435 5923 +5925 4 72.8 542.77 -34.35 0.435 5924 +5926 4 71.81 545.17 -35.18 0.435 5925 +5927 4 71.71 546.68 -35.09 0.435 5926 +5928 4 71.83 548.68 -35.42 0.435 5927 +5929 4 71.94 550.45 -35.68 0.435 5928 +5930 4 64.14 504.21 -21.89 0.435 5895 +5931 4 64.08 505.07 -21.95 0.435 5930 +5932 4 63.6 505.68 -21.75 0.435 5931 +5933 4 64.15 506.63 -19.98 0.435 5932 +5934 4 64.05 507.57 -18.76 0.435 5933 +5935 4 63.68 509.33 -17.0 0.435 5934 +5936 4 62.73 510.02 -15.82 0.435 5935 +5937 4 62.51 509.99 -15.68 0.435 5936 +5938 4 61.42 509.6 -14.77 0.435 5937 +5939 4 60.34 509.57 -15.02 0.435 5938 +5940 4 59.91 509.53 -14.88 0.435 5939 +5941 4 29.75 351.27 -20.3 0.54 5811 +5942 4 29.28 352.11 -20.22 0.54 5941 +5943 4 29.22 352.68 -19.48 0.54 5942 +5944 4 29.16 352.99 -18.32 0.54 5943 +5945 4 29.09 353.79 -17.56 0.54 5944 +5946 4 29.4 355.21 -16.43 0.54 5945 +5947 4 29.58 355.84 -16.06 0.54 5946 +5948 4 29.47 357.04 -15.11 0.54 5947 +5949 4 29.84 357.87 -14.63 0.54 5948 +5950 4 29.76 358.9 -14.01 0.54 5949 +5951 4 29.71 359.26 -13.37 0.54 5950 +5952 4 28.75 360.4 -12.29 0.54 5951 +5953 4 28.7 360.99 -11.77 0.54 5952 +5954 4 27.98 361.47 -10.53 0.54 5953 +5955 4 27.5 361.81 -9.84 0.54 5954 +5956 4 27.02 362.11 -8.84 0.54 5955 +5957 4 26.49 363.26 -7.68 0.54 5956 +5958 4 26.2 364.02 -6.85 0.54 5957 +5959 4 26.12 364.52 -5.37 0.54 5958 +5960 4 26.28 365.11 -4.63 0.54 5959 +5961 4 26.2 365.58 -2.92 0.54 5960 +5962 4 25.47 366.54 -2.01 0.54 5961 +5963 4 25.61 367.34 -1.32 0.54 5962 +5964 4 25.52 368.34 -0.47 0.54 5963 +5965 4 25.47 368.92 0.18 0.54 5964 +5966 4 24.03 370.93 0.81 0.54 5965 +5967 4 23.55 371.52 1.16 0.54 5966 +5968 4 22.6 372.48 1.84 0.54 5967 +5969 4 21.68 373.0 2.48 0.54 5968 +5970 4 21.24 372.96 2.61 0.54 5969 +5971 4 19.84 374.27 3.24 0.54 5970 +5972 4 18.95 374.15 3.89 0.54 5971 +5973 4 18.7 374.48 4.67 0.54 5972 +5974 4 17.53 375.13 6.07 0.54 5973 +5975 4 17.49 375.25 7.06 0.54 5974 +5976 4 17.43 376.06 7.52 0.54 5975 +5977 4 17.62 376.23 8.22 0.54 5976 +5978 4 17.56 376.82 8.88 0.54 5977 +5979 4 17.51 377.66 8.97 0.54 5978 +5980 4 17.63 378.93 9.32 0.54 5979 +5981 4 17.78 380.0 9.67 0.54 5980 +5982 4 17.1 380.35 9.99 0.54 5981 +5983 4 16.64 380.75 10.17 0.54 5982 +5984 4 15.92 381.27 10.96 0.54 5983 +5985 4 15.23 381.86 11.23 0.54 5984 +5986 4 14.3 382.63 11.51 0.54 5985 +5987 4 13.98 384.06 12.11 0.54 5986 +5988 4 12.77 385.63 13.15 0.54 5987 +5989 4 12.73 385.99 13.79 0.54 5988 +5990 4 12.2 387.19 14.5 0.54 5989 +5991 4 11.27 387.95 15.0 0.54 5990 +5992 4 11.22 388.55 15.59 0.54 5991 +5993 4 10.51 389.08 16.24 0.54 5992 +5994 4 10.01 389.86 16.83 0.54 5993 +5995 4 9.52 390.67 17.05 0.54 5994 +5996 4 9.04 391.25 17.48 0.54 5995 +5997 4 8.57 391.6 17.96 0.54 5996 +5998 4 7.88 391.95 18.43 0.54 5997 +5999 4 7.39 392.76 18.65 0.54 5998 +6000 4 6.87 393.74 19.42 0.54 5999 +6001 4 6.34 394.9 20.58 0.54 6000 +6002 4 6.27 395.69 21.26 0.54 6001 +6003 4 6.43 396.3 21.78 0.54 6002 +6004 4 6.57 397.58 22.07 0.54 6003 +6005 4 6.48 398.57 22.93 0.54 6004 +6006 4 6.43 399.2 23.21 0.54 6005 +6007 4 5.04 400.33 23.98 0.54 6006 +6008 4 3.43 401.74 24.09 0.54 6007 +6009 4 3.35 402.8 24.19 0.54 6008 +6010 4 2.87 403.36 24.84 0.54 6009 +6011 4 3.0 404.6 25.58 0.54 6010 +6012 4 3.15 405.46 25.74 0.54 6011 +6013 4 3.08 406.27 26.28 0.54 6012 +6014 4 2.59 407.07 26.73 0.54 6013 +6015 4 2.05 408.49 27.39 0.54 6014 +6016 4 1.98 409.29 27.92 0.54 6015 +6017 4 1.93 409.89 28.5 0.54 6016 +6018 4 2.91 410.88 29.99 0.54 6017 +6019 4 3.43 412.3 31.43 0.54 6018 +6020 4 3.58 413.37 31.7 0.54 6019 +6021 4 3.68 414.82 32.37 0.54 6020 +6022 4 2.95 415.81 32.91 0.54 6021 +6023 4 1.76 417.17 33.71 0.54 6022 +6024 4 1.25 418.16 34.32 0.54 6023 +6025 4 0.73 419.13 35.08 0.54 6024 +6026 4 0.64 420.39 35.51 0.54 6025 +6027 4 0.55 421.35 36.67 0.54 6026 +6028 4 0.08 421.72 37.08 0.54 6027 +6029 4 0.2 422.94 37.88 0.54 6028 +6030 4 0.98 424.27 38.19 0.54 6029 +6031 4 1.17 424.16 39.38 0.54 6030 +6032 4 1.72 425.18 40.41 0.54 6031 +6033 4 2.03 426.31 42.26 0.54 6032 +6034 4 2.55 427.98 43.35 0.54 6033 +6035 4 2.95 428.35 44.08 0.54 6034 +6036 4 3.28 429.66 44.38 0.54 6035 +6037 4 3.67 430.28 44.82 0.54 6036 +6038 4 4.72 430.74 45.28 0.54 6037 +6039 4 5.06 431.83 46.0 0.54 6038 +6040 4 5.04 431.74 46.89 0.54 6039 +6041 4 5.43 431.63 48.17 0.54 6040 +6042 4 5.59 432.47 48.64 0.54 6041 +6043 4 5.98 432.84 49.37 0.54 6042 +6044 4 6.11 433.6 50.73 0.54 6043 +6045 4 6.7 434.17 51.85 0.54 6044 +6046 4 25.07 273.97 -43.1 1.19 5757 +6047 4 25.06 274.47 -43.87 1.19 6046 +6048 4 24.98 275.75 -43.74 1.19 6047 +6049 4 24.47 277.02 -43.62 1.19 6048 +6050 4 24.18 278.89 -45.02 1.19 6049 +6051 4 23.72 279.38 -44.98 1.19 6050 +6052 4 23.54 279.55 -46.77 0.54 6051 +6053 4 22.14 280.97 -46.66 0.54 6052 +6054 4 21.71 280.93 -46.52 0.76 6053 +6055 4 20.77 282.16 -46.41 0.76 6054 +6056 4 21.32 283.49 -46.26 0.76 6055 +6057 4 21.69 284.59 -46.22 0.76 6056 +6058 4 22.05 285.9 -46.08 0.76 6057 +6059 4 21.67 287.7 -44.69 0.435 6058 +6060 4 20.96 288.73 -44.6 0.435 6059 +6061 4 20.88 289.49 -43.62 0.435 6060 +6062 4 19.97 290.04 -43.13 0.435 6061 +6063 4 20.11 291.12 -42.95 0.435 6062 +6064 4 20.25 292.16 -42.61 0.435 6063 +6065 4 20.15 293.62 -42.01 0.435 6064 +6066 4 20.09 294.45 -41.55 0.435 6065 +6067 4 19.1 296.31 -41.3 0.435 6066 +6068 4 18.6 297.08 -40.63 0.435 6067 +6069 4 18.08 298.1 -40.23 0.435 6068 +6070 4 17.71 300.38 -39.4 0.435 6069 +6071 4 17.6 301.85 -39.03 0.435 6070 +6072 4 17.04 303.73 -38.55 0.435 6071 +6073 4 16.52 304.94 -38.06 0.435 6072 +6074 4 16.0 305.92 -37.37 0.435 6073 +6075 4 15.94 306.77 -37.05 0.435 6074 +6076 4 16.04 307.95 -35.87 0.435 6075 +6077 4 16.18 309.25 -35.74 0.435 6076 +6078 4 16.07 310.96 -35.49 0.435 6077 +6079 4 15.99 312.25 -35.36 0.435 6078 +6080 4 15.08 312.83 -35.32 0.435 6079 +6081 4 14.15 313.82 -34.94 0.435 6080 +6082 4 13.44 314.33 -34.07 0.435 6081 +6083 4 12.93 315.37 -33.82 0.435 6082 +6084 4 12.82 316.81 -33.07 0.435 6083 +6085 4 12.97 317.64 -32.68 0.435 6084 +6086 4 12.9 318.66 -32.05 0.435 6085 +6087 4 12.36 320.08 -31.47 0.435 6086 +6088 4 12.3 320.94 -31.3 0.435 6087 +6089 4 12.88 322.03 -30.95 0.435 6088 +6090 4 13.02 323.1 -30.76 0.435 6089 +6091 4 13.18 323.98 -30.66 0.435 6090 +6092 4 13.34 324.8 -30.13 0.435 6091 +6093 4 13.27 325.61 -29.67 0.435 6092 +6094 4 12.95 327.09 -29.45 0.435 6093 +6095 4 12.63 328.3 -28.73 0.435 6094 +6096 4 12.55 329.29 -27.79 0.435 6095 +6097 4 12.93 330.14 -27.33 0.435 6096 +6098 4 13.03 331.6 -26.72 0.435 6097 +6099 4 12.97 332.43 -26.4 0.435 6098 +6100 4 12.94 332.86 -26.21 0.435 6099 +6101 4 13.08 333.88 -25.65 0.435 6100 +6102 4 13.23 334.95 -25.38 0.435 6101 +6103 4 13.22 334.92 -25.08 0.435 6102 +6104 4 13.18 335.3 -24.52 0.435 6103 +6105 4 13.11 336.11 -23.99 0.435 6104 +6106 4 13.49 336.45 -22.82 0.435 6105 +6107 4 13.67 336.84 -22.32 0.435 6106 +6108 4 13.81 337.65 -21.55 0.435 6107 +6109 4 13.96 338.45 -20.79 0.435 6108 +6110 4 14.12 339.31 -20.62 0.435 6109 +6111 4 13.15 340.74 -20.34 0.435 6110 +6112 4 13.31 341.59 -19.95 0.435 6111 +6113 4 12.79 342.32 -18.98 0.435 6112 +6114 4 12.08 343.34 -18.74 0.435 6113 +6115 4 12.02 343.94 -18.38 0.435 6114 +6116 4 12.4 344.81 -18.06 0.435 6115 +6117 4 12.53 346.1 -17.84 0.435 6116 +6118 4 12.49 346.49 -17.43 0.435 6117 +6119 4 12.68 346.93 -17.3 0.435 6118 +6120 4 23.88 280.73 -46.27 1.19 6051 +6121 4 23.8 282.02 -46.14 1.19 6120 +6122 4 24.18 283.73 -47.76 1.19 6121 +6123 4 23.93 284.24 -47.71 1.19 6122 +6124 4 24.54 285.07 -47.92 1.19 6123 +6125 4 24.75 285.61 -48.91 1.19 6124 +6126 4 24.73 286.62 -50.23 1.19 6125 +6127 4 24.24 288.08 -51.45 0.76 6126 +6128 4 23.77 289.26 -52.62 0.975 6127 +6129 4 22.84 291.08 -54.11 0.975 6128 +6130 4 22.32 292.88 -54.92 0.975 6129 +6131 4 22.28 294.06 -56.0 0.975 6130 +6132 4 22.27 294.85 -57.27 0.975 6131 +6133 4 22.43 295.98 -57.61 0.975 6132 +6134 4 23.01 297.66 -58.78 0.975 6133 +6135 4 23.58 299.53 -59.78 0.975 6134 +6136 4 24.17 300.95 -60.52 0.975 6135 +6137 4 24.3 302.04 -60.4 0.975 6136 +6138 4 24.05 303.4 -61.24 0.975 6137 +6139 4 23.55 304.79 -62.25 0.975 6138 +6140 4 23.07 306.17 -63.39 0.975 6139 +6141 4 22.15 307.54 -64.56 0.975 6140 +6142 4 21.22 309.11 -65.62 0.975 6141 +6143 4 20.31 310.26 -66.81 0.975 6142 +6144 4 19.35 312.0 -67.48 0.975 6143 +6145 4 18.4 313.99 -68.43 0.975 6144 +6146 4 18.14 315.18 -69.59 0.975 6145 +6147 4 17.65 316.26 -69.79 0.865 6146 +6148 4 17.4 317.49 -71.33 0.865 6147 +6149 4 17.34 318.61 -71.67 0.865 6148 +6150 4 17.65 320.56 -71.53 0.865 6149 +6151 4 18.23 322.23 -72.63 0.865 6150 +6152 4 18.59 323.55 -72.48 0.865 6151 +6153 4 19.17 324.66 -72.35 0.865 6152 +6154 4 19.57 325.67 -73.52 0.865 6153 +6155 4 19.49 326.96 -73.39 0.865 6154 +6156 4 19.0 328.54 -74.36 0.865 6155 +6157 4 18.04 329.78 -74.25 0.865 6156 +6158 4 17.54 331.38 -75.31 0.865 6157 +6159 4 17.01 333.39 -76.25 0.865 6158 +6160 4 17.18 334.26 -76.15 0.865 6159 +6161 4 17.7 336.24 -76.01 0.865 6160 +6162 4 17.68 337.23 -77.26 0.865 6161 +6163 4 18.05 338.95 -78.89 0.865 6162 +6164 4 18.21 340.34 -79.64 0.865 6163 +6165 4 18.14 341.68 -80.03 0.865 6164 +6166 4 17.88 342.83 -80.82 0.865 6165 +6167 4 17.86 343.85 -82.31 0.865 6166 +6168 4 17.82 345.06 -83.54 0.865 6167 +6169 4 17.55 346.43 -84.3 0.865 6168 +6170 4 17.5 347.57 -85.02 0.865 6169 +6171 4 16.56 348.85 -85.28 0.865 6170 +6172 4 16.07 350.2 -86.06 0.865 6171 +6173 4 15.34 352.02 -87.24 0.865 6172 +6174 4 14.82 353.82 -88.2 0.865 6173 +6175 4 14.52 355.6 -88.92 0.865 6174 +6176 4 14.69 356.56 -89.5 0.865 6175 +6177 4 14.85 358.18 -90.46 0.865 6176 +6178 4 15.41 358.73 -90.84 1.085 6177 +6179 4 16.01 359.36 -90.24 1.085 6178 +6180 4 16.63 360.66 -91.82 1.085 6179 +6181 4 17.24 361.91 -93.1 1.085 6180 +6182 4 17.68 362.51 -94.47 1.085 6181 +6183 4 18.09 363.26 -95.21 1.085 6182 +6184 4 18.3 363.8 -96.05 1.085 6183 +6185 4 18.57 363.98 -96.71 0.975 6184 +6186 4 18.89 364.43 -97.11 1.085 6185 +6187 4 20.61 365.32 -98.4 0.865 6186 +6188 4 21.66 366.12 -99.2 0.76 6187 +6189 4 22.49 367.37 -100.18 0.76 6188 +6190 4 23.14 367.67 -100.58 0.65 6189 +6191 4 23.59 367.52 -100.97 0.65 6190 +6192 4 24.48 367.15 -100.99 0.65 6191 +6193 4 25.35 367.2 -100.96 0.65 6192 +6194 4 26.06 366.9 -102.03 0.65 6193 +6195 4 27.52 367.65 -101.92 0.65 6194 +6196 4 28.62 368.09 -103.43 0.65 6195 +6197 4 29.49 368.42 -104.05 0.65 6196 +6198 4 31.18 369.75 -105.38 0.65 6197 +6199 4 32.48 370.4 -106.64 0.65 6198 +6200 4 34.19 370.94 -106.54 0.65 6199 +6201 4 36.2 370.49 -107.29 0.65 6200 +6202 4 37.67 371.01 -107.2 0.65 6201 +6203 4 39.8 372.33 -108.14 0.65 6202 +6204 4 42.52 374.0 -107.91 0.65 6203 +6205 4 44.19 375.52 -109.07 0.65 6204 +6206 4 47.21 376.51 -110.4 0.65 6205 +6207 4 49.54 377.51 -110.24 0.65 6206 +6208 4 51.91 378.44 -111.53 0.65 6207 +6209 4 53.85 379.36 -112.89 0.65 6208 +6210 4 55.73 380.56 -112.72 0.65 6209 +6211 4 56.29 381.92 -113.02 0.65 6210 +6212 4 56.51 382.16 -113.07 0.65 6211 +6213 4 56.69 382.91 -113.89 0.65 6212 +6214 4 56.91 383.44 -114.73 0.65 6213 +6215 4 57.12 384.21 -115.71 0.65 6214 +6216 4 57.12 384.8 -117.15 0.65 6215 +6217 4 57.14 384.88 -117.97 0.65 6216 +6218 4 57.14 385.14 -118.55 0.65 6217 +6219 4 57.13 385.64 -119.17 0.65 6218 +6220 4 57.31 386.34 -119.47 0.65 6219 +6221 4 57.29 387.11 -120.6 0.65 6220 +6222 4 57.48 387.85 -121.27 0.65 6221 +6223 4 57.7 388.4 -122.34 0.65 6222 +6224 4 58.07 389.78 -122.86 0.65 6223 +6225 4 58.52 389.9 -123.82 0.65 6224 +6226 4 58.95 390.42 -124.36 0.65 6225 +6227 4 59.54 391.6 -124.98 0.65 6226 +6228 4 59.93 392.56 -125.48 0.65 6227 +6229 4 60.59 392.63 -125.75 0.65 6228 +6230 4 61.26 392.78 -126.78 0.65 6229 +6231 4 61.71 392.87 -127.43 0.65 6230 +6232 4 62.38 393.01 -128.31 0.65 6231 +6233 4 62.8 393.51 -128.7 0.65 6232 +6234 4 62.99 394.27 -129.67 0.65 6233 +6235 4 63.18 395.23 -130.47 0.65 6234 +6236 4 62.7 396.08 -130.62 0.65 6235 +6237 4 62.67 396.82 -131.45 0.65 6236 +6238 4 62.85 397.77 -132.18 0.65 6237 +6239 4 63.43 399.16 -132.61 0.65 6238 +6240 4 63.42 399.66 -133.25 0.65 6239 +6241 4 64.45 400.85 -133.62 0.65 6240 +6242 4 64.87 401.65 -134.82 0.65 6241 +6243 4 65.71 402.42 -135.47 0.65 6242 +6244 4 66.81 403.1 -137.18 0.65 6243 +6245 4 67.66 403.67 -137.93 0.65 6244 +6246 4 68.96 404.04 -138.61 0.65 6245 +6247 4 69.74 405.63 -138.88 0.65 6246 +6248 4 70.81 406.19 -139.4 0.65 6247 +6249 4 71.86 407.23 -140.4 0.65 6248 +6250 4 72.65 408.33 -139.96 0.65 6249 +6251 4 73.03 409.19 -139.71 0.65 6250 +6252 4 73.64 409.66 -139.65 0.65 6251 +6253 4 17.2 365.25 -97.28 0.865 6185 +6254 4 16.5 366.08 -97.29 0.865 6253 +6255 4 16.03 366.97 -97.82 0.865 6254 +6256 4 15.58 367.94 -99.07 0.865 6255 +6257 4 15.3 369.59 -100.57 0.865 6256 +6258 4 14.84 370.27 -101.04 0.865 6257 +6259 4 14.38 371.26 -102.53 0.865 6258 +6260 4 14.78 372.76 -104.18 0.865 6259 +6261 4 15.14 373.55 -103.25 0.865 6260 +6262 4 15.73 374.75 -103.87 0.65 6261 +6263 4 15.25 375.54 -103.57 0.65 6262 +6264 4 15.25 375.85 -104.37 0.65 6263 +6265 4 15.25 376.1 -104.72 0.65 6264 +6266 4 15.02 376.57 -105.2 0.65 6265 +6267 4 15.2 377.28 -105.66 0.65 6266 +6268 4 14.76 377.77 -106.44 0.65 6267 +6269 4 14.76 378.6 -108.17 0.65 6268 +6270 4 14.75 379.09 -108.79 0.65 6269 +6271 4 14.74 379.58 -109.27 0.65 6270 +6272 4 14.73 379.83 -109.62 0.65 6271 +6273 4 14.95 380.39 -110.76 0.65 6272 +6274 4 15.37 380.92 -111.45 0.65 6273 +6275 4 15.56 381.37 -111.48 0.65 6274 +6276 4 16.18 382.37 -112.27 0.65 6275 +6277 4 16.39 382.88 -112.97 0.65 6276 +6278 4 16.57 383.62 -113.71 0.65 6277 +6279 4 16.55 384.62 -114.96 0.65 6278 +6280 4 16.55 385.18 -116.18 0.65 6279 +6281 4 16.56 385.76 -117.63 0.65 6280 +6282 4 16.59 386.14 -119.17 0.65 6281 +6283 4 16.6 386.74 -120.77 0.65 6282 +6284 4 16.61 387.1 -122.09 0.65 6283 +6285 4 16.6 387.83 -122.92 0.65 6284 +6286 4 16.63 387.96 -124.26 0.65 6285 +6287 4 16.21 388.54 -125.94 0.65 6286 +6288 4 16.22 389.13 -127.47 0.65 6287 +6289 4 16.23 389.73 -129.05 0.65 6288 +6290 4 16.22 390.53 -130.48 0.65 6289 +6291 4 16.2 391.22 -130.94 0.65 6290 +6292 4 15.75 391.96 -132.0 0.65 6291 +6293 4 15.77 392.32 -133.32 0.65 6292 +6294 4 15.76 393.08 -134.45 0.65 6293 +6295 4 15.31 393.82 -135.66 0.65 6294 +6296 4 14.8 395.38 -136.35 0.65 6295 +6297 4 14.06 396.62 -136.16 0.65 6296 +6298 4 13.1 398.29 -136.09 0.65 6297 +6299 4 11.94 399.82 -136.86 0.65 6298 +6300 4 11.41 401.81 -137.57 0.65 6299 +6301 4 10.48 403.39 -138.64 0.65 6300 +6302 4 9.92 405.82 -139.45 0.65 6301 +6303 4 8.96 407.61 -140.49 0.65 6302 +6304 4 8.04 410.54 -140.44 0.65 6303 +6305 4 7.22 413.91 -141.99 0.54 6304 +6306 4 6.69 415.63 -142.13 0.54 6305 +6307 4 6.49 418.84 -141.88 0.54 6306 +6308 4 5.33 423.29 -141.45 0.54 6307 +6309 4 5.45 425.3 -141.91 0.54 6308 +6310 4 4.76 429.13 -141.53 0.54 6309 +6311 4 3.92 432.09 -141.24 0.54 6310 +6312 4 3.52 435.08 -140.94 0.54 6311 +6313 4 2.56 439.97 -140.46 0.54 6312 +6314 4 1.01 444.29 -141.26 0.54 6313 +6315 4 0.41 446.84 -141.01 0.54 6314 +6316 4 -0.88 450.78 -141.99 0.54 6315 +6317 4 -0.83 453.86 -142.42 0.54 6316 +6318 4 -1.95 457.88 -142.1 0.54 6317 +6319 4 -3.85 460.35 -141.89 0.54 6318 +6320 4 -5.45 462.07 -142.74 0.54 6319 +6321 4 -6.5 464.81 -142.48 0.54 6320 +6322 4 -6.65 467.43 -142.73 0.54 6321 +6323 4 -6.75 469.37 -143.22 0.54 6322 +6324 4 -7.34 471.69 -142.91 0.54 6323 +6325 4 -7.7 474.33 -143.4 0.54 6324 +6326 4 -7.43 476.94 -143.2 0.54 6325 +6327 4 -7.16 479.52 -142.92 0.54 6326 +6328 4 -7.23 484.58 -143.54 0.54 6327 +6329 4 -8.41 489.46 -143.06 0.54 6328 +6330 4 -10.77 492.32 -142.82 0.54 6329 +6331 4 13.94 358.71 -90.57 0.65 6177 +6332 4 13.27 359.66 -91.85 0.65 6331 +6333 4 11.72 360.49 -92.33 0.65 6332 +6334 4 9.96 361.66 -94.21 0.435 6333 +6335 4 7.77 362.75 -95.8 0.435 6334 +6336 4 6.24 363.68 -97.18 0.435 6335 +6337 4 4.2 365.32 -97.58 0.435 6336 +6338 4 2.62 366.31 -97.67 0.435 6337 +6339 4 0.86 367.46 -99.32 0.435 6338 +6340 4 -1.39 368.83 -99.31 0.435 6339 +6341 4 -2.3 370.21 -100.55 0.435 6340 +6342 4 -2.78 371.63 -102.07 0.435 6341 +6343 4 -4.64 373.96 -102.48 0.435 6342 +6344 4 -6.0 375.27 -103.57 0.435 6343 +6345 4 -7.09 375.98 -104.66 0.435 6344 +6346 4 -8.41 377.16 -106.45 0.435 6345 +6347 4 -10.18 378.25 -107.59 0.435 6346 +6348 4 -11.29 379.14 -108.58 0.435 6347 +6349 4 -12.83 380.01 -109.58 0.435 6348 +6350 4 -14.42 381.25 -109.79 0.435 6349 +6351 4 -15.52 381.92 -110.8 0.435 6350 +6352 4 -16.7 383.36 -110.68 0.435 6351 +6353 4 -18.53 384.97 -110.63 0.435 6352 +6354 4 -19.95 386.82 -110.47 0.435 6353 +6355 4 -21.35 388.24 -110.36 0.435 6354 +6356 4 -22.49 389.25 -110.28 0.435 6355 +6357 4 -23.84 390.03 -110.23 0.435 6356 +6358 4 -25.45 391.44 -110.12 0.435 6357 +6359 4 -27.06 392.62 -110.04 0.435 6358 +6360 4 -28.23 394.06 -109.92 0.435 6359 +6361 4 -29.65 395.91 -109.76 0.435 6360 +6362 4 -30.41 396.78 -108.11 0.435 6361 +6363 4 -31.37 397.92 -107.03 0.435 6362 +6364 4 -32.33 399.06 -106.04 0.435 6363 +6365 4 -33.7 400.04 -105.89 0.435 6364 +6366 4 -36.03 402.2 -104.97 0.435 6365 +6367 4 -37.92 404.15 -104.14 0.435 6366 +6368 4 -39.35 405.95 -103.45 0.435 6367 +6369 4 -42.34 408.03 -102.33 0.435 6368 +6370 4 -45.07 410.03 -102.19 0.435 6369 +6371 4 -47.13 411.35 -101.5 0.435 6370 +6372 4 -48.08 412.27 -100.52 0.435 6371 +6373 4 -49.68 413.44 -100.35 0.435 6372 +6374 4 -50.84 414.68 -100.25 0.435 6373 +6375 4 -51.84 416.18 -98.69 0.435 6374 +6376 4 -53.02 417.61 -98.57 0.435 6375 +6377 4 -53.85 417.53 -97.63 0.435 6376 +6378 4 -55.21 418.03 -97.0 0.435 6377 +6379 4 -58.36 419.78 -96.9 0.435 6378 +6380 4 -60.0 421.83 -96.72 0.435 6379 +6381 4 -61.59 422.76 -96.21 0.435 6380 +6382 4 -63.43 424.36 -96.09 0.435 6381 +6383 4 -66.58 426.11 -95.99 0.435 6382 +6384 4 -69.33 428.31 -95.82 0.435 6383 +6385 4 -70.26 429.87 -96.81 0.435 6384 +6386 4 -72.98 431.63 -96.62 0.435 6385 +6387 4 -74.8 433.03 -96.52 0.435 6386 +6388 4 -76.41 434.23 -96.43 0.435 6387 +6389 4 -77.77 434.91 -95.56 0.435 6388 +6390 4 -80.09 437.14 -95.38 0.435 6389 +6391 4 -81.29 438.48 -94.37 0.435 6390 +6392 4 -82.9 439.88 -94.26 0.435 6391 +6393 4 -84.33 441.12 -92.44 0.435 6392 +6394 4 -86.39 442.72 -92.32 0.435 6393 +6395 4 -88.22 444.34 -92.2 0.435 6394 +6396 4 -89.6 445.53 -92.11 0.435 6395 +6397 4 -92.32 446.75 -90.84 0.435 6396 +6398 4 -94.61 448.54 -90.64 0.435 6397 +6399 4 -96.24 450.38 -90.48 0.435 6398 +6400 4 -98.24 451.7 -91.9 0.435 6399 +6401 4 -100.52 453.5 -91.77 0.435 6400 +6402 4 -103.5 456.13 -91.64 0.435 6401 +6403 4 -108.48 459.26 -91.43 0.435 6402 +6404 4 -112.75 461.59 -91.44 0.435 6403 +6405 4 -114.79 462.97 -91.35 0.435 6404 +6406 4 -117.01 463.92 -91.3 0.435 6405 +6407 4 -119.5 465.25 -91.07 0.435 6406 +6408 4 -122.39 466.37 -91.03 0.435 6407 +6409 4 -125.71 467.46 -90.99 0.435 6408 +6410 4 -128.61 468.54 -90.58 0.435 6409 +6411 4 -131.06 469.45 -90.54 0.435 6410 +6412 4 -132.12 469.84 -90.6 0.435 6411 +6413 4 -134.14 470.78 -90.48 0.435 6412 +6414 4 -137.65 471.43 -90.49 0.435 6413 +6415 4 -139.86 471.94 -90.49 0.435 6414 +6416 4 -142.97 473.04 -90.45 0.435 6415 +6417 4 -146.94 474.08 -90.44 0.435 6416 +6418 4 -149.59 474.79 -90.5 0.435 6417 +6419 4 -153.5 474.99 -90.65 0.435 6418 +6420 4 -157.9 475.8 -90.67 0.435 6419 +6421 4 -161.81 475.99 -90.74 0.435 6420 +6422 4 -165.49 475.98 -90.83 0.435 6421 +6423 4 -168.73 475.79 -90.93 0.435 6422 +6424 4 -170.88 475.23 -91.04 0.435 6423 +6425 4 -172.18 475.15 -91.08 0.435 6424 +6426 4 -53.98 419.96 -98.13 0.435 6376 +6427 4 -54.47 421.11 -99.08 0.435 6426 +6428 4 -54.55 422.4 -98.95 0.435 6427 +6429 4 -54.7 424.75 -98.63 0.435 6428 +6430 4 -55.05 426.87 -98.35 0.435 6429 +6431 4 -55.62 429.0 -98.29 0.435 6430 +6432 4 -55.78 431.36 -98.05 0.435 6431 +6433 4 -56.79 433.88 -97.82 0.435 6432 +6434 4 -57.51 435.75 -99.52 0.435 6433 +6435 4 -58.62 436.66 -100.66 0.435 6434 +6436 4 -60.23 438.34 -101.13 0.435 6435 +6437 4 -61.38 439.91 -102.27 0.435 6436 +6438 4 -62.59 442.28 -102.89 0.435 6437 +6439 4 -62.74 444.64 -102.65 0.435 6438 +6440 4 -62.39 446.48 -103.42 0.435 6439 +6441 4 -62.91 448.53 -104.65 0.435 6440 +6442 4 -63.36 449.54 -106.22 0.435 6441 +6443 4 -63.59 450.54 -107.78 0.435 6442 +6444 4 -64.07 451.4 -107.92 0.435 6443 +6445 4 -64.54 452.3 -108.67 0.435 6444 +6446 4 -64.54 453.15 -110.55 0.435 6445 +6447 4 -65.01 453.47 -109.77 0.435 6446 +6448 4 -65.72 454.6 -110.57 0.435 6447 +6449 4 -65.74 455.6 -111.83 0.435 6448 +6450 4 -65.98 456.55 -112.86 0.435 6449 +6451 4 -66.5 458.6 -114.02 0.435 6450 +6452 4 -66.98 460.04 -115.54 0.435 6451 +6453 4 -68.17 461.96 -116.13 0.435 6452 +6454 4 -68.23 463.29 -116.44 0.435 6453 +6455 4 -68.76 464.81 -116.67 0.435 6454 +6456 4 -68.82 465.88 -116.64 0.435 6455 +6457 4 -69.3 467.29 -117.85 0.435 6456 +6458 4 -69.86 469.19 -117.67 0.435 6457 +6459 4 -71.22 470.75 -118.98 0.435 6458 +6460 4 -72.16 472.05 -119.54 0.435 6459 +6461 4 -73.14 473.99 -119.51 0.435 6460 +6462 4 -74.33 476.17 -120.3 0.435 6461 +6463 4 -75.36 478.48 -120.16 0.435 6462 +6464 4 -76.78 480.54 -119.98 0.435 6463 +6465 4 -77.95 481.76 -119.88 0.435 6464 +6466 4 25.33 288.32 -51.62 0.975 6126 +6467 4 26.34 290.03 -52.71 0.865 6466 +6468 4 27.32 292.17 -53.97 0.54 6467 +6469 4 28.34 293.86 -54.98 0.54 6468 +6470 4 28.5 294.74 -55.04 0.54 6469 +6471 4 29.05 296.28 -54.86 0.54 6470 +6472 4 29.4 298.1 -55.41 0.54 6471 +6473 4 29.46 300.47 -55.17 0.54 6472 +6474 4 29.8 302.0 -55.0 0.54 6473 +6475 4 31.12 305.09 -54.65 0.54 6474 +6476 4 31.67 306.63 -54.48 0.54 6475 +6477 4 32.83 308.84 -54.15 0.54 6476 +6478 4 33.98 311.27 -53.87 0.54 6477 +6479 4 34.72 313.2 -53.65 0.54 6478 +6480 4 35.26 314.95 -53.46 0.54 6479 +6481 4 35.57 316.91 -53.25 0.54 6480 +6482 4 35.66 318.85 -53.05 0.54 6481 +6483 4 35.54 320.77 -52.85 0.54 6482 +6484 4 35.46 322.1 -53.09 0.54 6483 +6485 4 35.59 324.19 -54.38 0.54 6484 +6486 4 36.11 326.39 -54.22 0.54 6485 +6487 4 36.61 328.57 -53.98 0.54 6486 +6488 4 37.33 330.97 -53.71 0.54 6487 +6489 4 38.08 332.95 -53.49 0.54 6488 +6490 4 38.65 334.06 -53.36 0.54 6489 +6491 4 39.0 335.63 -53.56 0.54 6490 +6492 4 39.52 337.6 -53.35 0.54 6491 +6493 4 39.48 337.95 -52.49 0.54 6492 +6494 4 39.65 338.6 -52.49 0.54 6493 +6495 4 39.41 339.59 -53.75 0.54 6494 +6496 4 40.0 341.01 -54.49 0.54 6495 +6497 4 40.37 341.85 -54.09 0.54 6496 +6498 4 40.94 343.76 -55.24 0.54 6497 +6499 4 41.13 344.72 -56.11 0.54 6498 +6500 4 41.5 346.44 -57.67 0.54 6499 +6501 4 41.87 347.52 -57.55 0.54 6500 +6502 4 42.46 349.24 -59.08 0.54 6501 +6503 4 43.68 351.44 -60.64 0.54 6502 +6504 4 44.45 353.3 -61.4 0.54 6503 +6505 4 45.24 355.23 -62.84 0.54 6504 +6506 4 46.44 357.87 -64.5 0.54 6505 +6507 4 47.47 359.41 -66.13 0.54 6506 +6508 4 47.84 360.77 -66.5 0.54 6507 +6509 4 47.97 362.08 -66.36 0.54 6508 +6510 4 47.26 363.12 -66.35 0.54 6509 +6511 4 47.47 363.58 -67.05 0.435 6510 +6512 4 48.02 365.12 -66.88 0.435 6511 +6513 4 48.8 366.44 -66.65 0.435 6512 +6514 4 49.75 368.44 -66.35 0.435 6513 +6515 4 50.52 370.19 -66.15 0.435 6514 +6516 4 50.64 371.19 -65.21 0.435 6515 +6517 4 50.96 372.38 -63.8 0.435 6516 +6518 4 50.37 374.71 -63.57 0.435 6517 +6519 4 49.19 376.38 -63.58 0.435 6518 +6520 4 47.53 378.96 -64.41 0.435 6519 +6521 4 46.11 381.06 -64.59 0.435 6520 +6522 4 45.62 382.4 -65.3 0.435 6521 +6523 4 44.67 384.19 -66.34 0.435 6522 +6524 4 44.18 385.82 -67.7 0.435 6523 +6525 4 43.68 387.4 -68.59 0.435 6524 +6526 4 43.36 388.88 -68.44 0.435 6525 +6527 4 43.47 391.11 -68.97 0.435 6526 +6528 4 43.54 393.27 -68.82 0.435 6527 +6529 4 43.76 396.8 -68.6 0.435 6528 +6530 4 44.6 400.51 -68.2 0.435 6529 +6531 4 45.02 404.49 -68.6 0.435 6530 +6532 4 45.92 407.35 -68.28 0.435 6531 +6533 4 46.95 411.5 -67.83 0.435 6532 +6534 4 48.16 416.51 -67.28 0.435 6533 +6535 4 48.99 420.44 -66.86 0.435 6534 +6536 4 49.54 422.24 -67.11 0.435 6535 +6537 4 49.69 423.06 -66.5 0.435 6536 +6538 4 49.83 424.08 -65.86 0.435 6537 +6539 4 49.72 425.54 -65.26 0.435 6538 +6540 4 50.11 426.18 -64.96 0.435 6539 +6541 4 50.89 427.52 -64.72 0.435 6540 +6542 4 51.24 428.04 -63.3 0.435 6541 +6543 4 51.42 428.65 -62.79 0.435 6542 +6544 4 51.54 429.67 -62.0 0.435 6543 +6545 4 51.84 431.56 -61.19 0.435 6544 +6546 4 51.98 432.38 -60.58 0.435 6545 +6547 4 52.35 433.2 -59.89 0.435 6546 +6548 4 52.47 434.22 -59.09 0.435 6547 +6549 4 53.17 436.8 -58.44 0.435 6548 +6550 4 53.21 439.02 -56.85 0.435 6549 +6551 4 53.69 441.63 -56.49 0.435 6550 +6552 4 53.57 443.04 -55.45 0.435 6551 +6553 4 53.9 444.78 -55.26 0.435 6552 +6554 4 54.8 447.42 -54.97 0.435 6553 +6555 4 55.34 449.16 -54.69 0.435 6554 +6556 4 55.83 451.48 -53.69 0.435 6555 +6557 4 56.18 452.79 -53.54 0.435 6556 +6558 4 56.06 454.72 -53.28 0.435 6557 +6559 4 55.49 456.62 -53.09 0.435 6558 +6560 4 54.94 458.52 -52.91 0.435 6559 +6561 4 55.05 460.25 -52.73 0.435 6560 +6562 4 55.07 462.73 -51.42 0.435 6561 +6563 4 56.13 466.45 -51.01 0.435 6562 +6564 4 56.83 469.1 -50.63 0.435 6563 +6565 4 59.16 473.33 -50.14 0.435 6564 +6566 4 60.09 475.75 -49.87 0.435 6565 +6567 4 61.0 478.38 -49.5 0.435 6566 +6568 4 62.09 481.12 -48.06 0.435 6567 +6569 4 62.84 485.72 -45.77 0.435 6568 +6570 4 62.89 487.54 -44.37 0.435 6569 +6571 4 63.63 489.73 -44.13 0.435 6570 +6572 4 64.43 493.53 -42.43 0.435 6571 +6573 4 65.12 495.81 -40.9 0.435 6572 +6574 4 66.22 498.33 -39.4 0.435 6573 +6575 4 66.92 500.4 -37.97 0.435 6574 +6576 4 67.17 502.41 -36.09 0.435 6575 +6577 4 67.07 503.61 -35.15 0.325 6576 +6578 4 67.29 506.85 -34.81 0.325 6577 +6579 4 67.4 508.79 -34.6 0.325 6578 +6580 4 67.66 511.38 -34.33 0.325 6579 +6581 4 67.25 513.79 -32.58 0.325 6580 +6582 4 67.3 516.14 -32.18 0.325 6581 +6583 4 67.8 518.54 -31.92 0.325 6582 +6584 4 67.84 521.06 -30.99 0.325 6583 +6585 4 68.53 523.88 -30.6 0.325 6584 +6586 4 69.43 525.93 -28.86 0.325 6585 +6587 4 69.7 528.54 -28.58 0.325 6586 +6588 4 70.4 531.15 -28.22 0.325 6587 +6589 4 70.49 533.31 -28.0 0.325 6588 +6590 4 70.59 534.82 -27.84 0.325 6589 +6591 4 71.12 536.79 -27.62 0.325 6590 +6592 4 71.92 537.9 -27.41 0.325 6591 +6593 4 72.07 538.99 -27.29 0.325 6592 +6594 4 72.4 540.52 -27.13 0.325 6593 +6595 4 72.5 542.45 -26.93 0.325 6594 +6596 4 72.43 543.53 -26.82 0.325 6595 +6597 4 72.34 545.02 -26.66 0.325 6596 +6598 4 71.81 546.28 -26.55 0.325 6597 +6599 4 71.76 547.15 -26.46 0.325 6598 +6600 4 71.29 547.75 -26.34 0.325 6599 +6601 4 46.3 364.57 -66.23 0.54 6510 +6602 4 45.33 366.22 -66.08 0.54 6601 +6603 4 45.04 367.56 -66.62 0.435 6602 +6604 4 44.56 368.95 -67.77 0.435 6603 +6605 4 44.09 369.87 -68.51 0.435 6604 +6606 4 43.19 371.03 -69.84 0.435 6605 +6607 4 42.95 372.02 -71.1 0.435 6606 +6608 4 42.67 373.11 -71.3 0.435 6607 +6609 4 42.44 374.02 -72.5 0.435 6608 +6610 4 42.21 374.83 -74.15 0.435 6609 +6611 4 41.98 375.79 -75.26 0.435 6610 +6612 4 41.73 376.73 -76.15 0.435 6611 +6613 4 40.8 377.78 -76.36 0.435 6612 +6614 4 39.98 378.15 -78.3 0.435 6613 +6615 4 24.1 207.46 -20.24 0.435 5040 +6616 4 23.59 208.52 -20.21 0.435 6615 +6617 4 23.58 208.74 -20.27 0.435 6616 +6618 4 23.52 209.54 -19.66 0.435 6617 +6619 4 22.8 210.05 -18.64 0.435 6618 +6620 4 22.31 211.11 -18.77 0.435 6619 +6621 4 22.24 211.91 -18.16 0.435 6620 +6622 4 21.69 213.25 -16.68 0.435 6621 +6623 4 20.7 214.86 -16.08 0.435 6622 +6624 4 19.73 216.03 -15.38 0.435 6623 +6625 4 18.27 218.52 -15.16 0.435 6624 +6626 4 18.18 220.03 -15.0 0.435 6625 +6627 4 17.53 223.42 -14.67 0.435 6626 +6628 4 16.27 226.15 -14.42 0.435 6627 +6629 4 14.17 228.39 -14.23 0.435 6628 +6630 4 12.99 229.82 -14.11 0.435 6629 +6631 4 11.49 232.96 -13.82 0.435 6630 +6632 4 9.96 237.06 -14.57 0.435 6631 +6633 4 8.24 240.19 -14.36 0.435 6632 +6634 4 7.72 241.99 -15.32 0.435 6633 +6635 4 6.74 243.87 -15.22 0.435 6634 +6636 4 6.18 246.59 -16.61 0.435 6635 +6637 4 5.23 248.03 -16.49 0.435 6636 +6638 4 4.69 249.52 -16.34 0.435 6637 +6639 4 4.6 251.02 -16.19 0.435 6638 +6640 4 4.72 252.53 -16.03 0.435 6639 +6641 4 4.43 253.75 -16.06 0.435 6640 +6642 4 4.37 254.91 -16.77 0.435 6641 +6643 4 4.32 256.02 -17.11 0.435 6642 +6644 4 2.9 257.88 -17.03 0.435 6643 +6645 4 1.5 259.3 -16.92 0.435 6644 +6646 4 0.6 260.18 -17.52 0.435 6645 +6647 4 0.32 261.24 -17.57 0.435 6646 +6648 4 0.24 262.54 -17.51 0.435 6647 +6649 4 0.18 263.67 -17.92 0.435 6648 +6650 4 -0.38 265.99 -17.7 0.435 6649 +6651 4 -0.96 268.12 -17.49 0.435 6650 +6652 4 -3.07 271.38 -18.86 0.435 6651 +6653 4 -3.81 272.84 -18.73 0.435 6652 +6654 4 -5.45 274.92 -18.78 0.435 6653 +6655 4 -6.01 276.82 -18.6 0.435 6654 +6656 4 -6.17 279.18 -18.43 0.435 6655 +6657 4 -5.97 283.06 -18.02 0.435 6656 +6658 4 -6.37 285.85 -17.89 0.435 6657 +6659 4 -7.39 288.98 -19.47 0.435 6658 +6660 4 -8.22 291.94 -19.19 0.435 6659 +6661 4 -8.3 293.77 -20.06 0.435 6660 +6662 4 -8.93 297.01 -20.19 0.435 6661 +6663 4 -10.6 299.52 -20.27 0.435 6662 +6664 4 -11.6 302.14 -21.08 0.435 6663 +6665 4 -12.66 305.41 -21.82 0.435 6664 +6666 4 -14.57 308.3 -21.57 0.435 6665 +6667 4 -15.9 312.63 -22.13 0.435 6666 +6668 4 -15.82 315.09 -22.86 0.435 6667 +6669 4 -15.83 318.75 -22.55 0.435 6668 +6670 4 -15.55 321.68 -23.29 0.435 6669 +6671 4 -15.48 324.35 -23.85 0.435 6670 +6672 4 -15.2 326.74 -23.67 0.435 6671 +6673 4 -15.06 328.24 -24.04 0.435 6672 +6674 4 -14.28 329.57 -23.73 0.435 6673 +6675 4 -13.73 331.1 -23.48 0.435 6674 +6676 4 -13.31 331.64 -24.25 0.435 6675 +6677 4 -12.95 333.3 -25.35 0.435 6676 +6678 4 -12.51 334.09 -26.53 0.435 6677 +6679 4 -12.15 335.46 -26.92 0.435 6678 +6680 4 17.94 73.8 -14.09 0.435 3403 +6681 4 19.39 74.96 -13.94 0.435 6680 +6682 4 19.82 75.01 -14.07 0.435 6681 +6683 4 20.41 75.32 -12.6 0.435 6682 +6684 4 21.21 75.62 -10.74 0.435 6683 +6685 4 21.97 76.89 -9.83 0.435 6684 +6686 4 23.57 78.87 -9.14 0.435 6685 +6687 4 24.55 80.17 -8.53 0.435 6686 +6688 4 25.68 82.56 -7.73 0.435 6687 +6689 4 26.63 84.46 -6.61 0.435 6688 +6690 4 27.17 85.96 -6.06 0.435 6689 +6691 4 28.36 87.5 -5.5 0.435 6690 +6692 4 30.0 88.86 -4.94 0.435 6691 +6693 4 31.2 90.19 -4.48 0.435 6692 +6694 4 31.43 90.14 -4.48 0.435 6693 +6695 4 31.8 91.02 -4.3 0.435 6694 +6696 4 32.39 91.92 -4.19 0.435 6695 +6697 4 33.18 93.25 -4.03 0.435 6696 +6698 4 33.75 94.57 -3.88 0.435 6697 +6699 4 33.68 95.65 -3.77 0.435 6698 +6700 4 33.82 97.0 -4.23 0.435 6699 +6701 4 33.59 98.01 -5.56 0.435 6700 +6702 4 33.54 98.61 -5.13 0.435 6701 +6703 4 33.5 98.96 -4.34 0.435 6702 +6704 4 33.85 100.02 -3.99 0.435 6703 +6705 4 33.32 101.45 -3.33 0.435 6704 +6706 4 33.4 102.86 -2.13 0.435 6705 +6707 4 33.49 104.76 -1.56 0.435 6706 +6708 4 33.8 105.95 -0.29 0.435 6707 +6709 4 34.35 107.18 0.81 0.435 6708 +6710 4 35.3 109.1 1.72 0.435 6709 +6711 4 35.83 110.81 2.36 0.435 6710 +6712 4 37.04 112.17 2.6 0.435 6711 +6713 4 37.33 114.33 2.91 0.435 6712 +6714 4 37.7 115.16 3.46 0.435 6713 +6715 4 38.24 116.65 4.15 0.435 6714 +6716 4 39.49 117.08 4.98 0.435 6715 +6717 4 40.44 119.07 5.28 0.435 6716 +6718 4 41.22 120.37 5.73 0.435 6717 +6719 4 41.79 121.19 6.51 0.435 6718 +6720 4 42.38 122.61 5.92 0.435 6719 +6721 4 43.11 123.96 7.96 0.435 6720 +6722 4 43.91 124.89 7.92 0.435 6721 +6723 4 33.33 90.68 -3.77 0.435 6694 +6724 4 35.91 91.05 -3.59 0.435 6723 +6725 4 37.85 91.18 -3.54 0.435 6724 +6726 4 40.24 91.1 -3.49 0.435 6725 +6727 4 43.02 91.7 -3.36 0.435 6726 +6728 4 46.0 92.75 -3.18 0.435 6727 +6729 4 49.06 92.28 -3.16 0.435 6728 +6730 4 53.19 92.32 -3.05 0.435 6729 +6731 4 55.53 92.88 -2.94 0.435 6730 +6732 4 57.69 92.96 -2.36 0.435 6731 +6733 4 60.19 94.37 -1.7 0.435 6732 +6734 4 61.4 95.15 -0.15 0.435 6733 +6735 4 63.65 97.22 0.1 0.435 6734 +6736 4 64.84 98.51 1.09 0.435 6735 +6737 4 65.38 99.99 1.86 0.435 6736 +6738 4 68.32 101.44 2.16 0.435 6737 +6739 4 71.07 102.68 2.42 0.435 6738 +6740 4 72.46 104.7 2.67 0.435 6739 +6741 4 75.61 109.62 3.25 0.435 6740 +6742 4 78.25 112.36 3.6 0.435 6741 +6743 4 80.84 115.97 4.03 0.435 6742 +6744 4 83.49 118.72 4.38 0.435 6743 +6745 4 85.54 120.56 4.62 0.435 6744 +6746 4 87.68 120.9 4.78 0.435 6745 +6747 4 90.67 121.69 5.24 0.435 6746 +6748 4 93.01 121.97 6.06 0.435 6747 +6749 4 95.6 122.13 6.22 0.435 6748 +6750 4 98.95 124.04 6.57 0.435 6749 +6751 4 102.37 124.68 6.72 0.435 6750 +6752 4 105.55 125.96 6.92 0.435 6751 +6753 4 106.75 127.24 7.77 0.435 6752 +6754 4 109.25 128.64 8.43 0.435 6753 +6755 4 110.47 129.77 8.79 0.435 6754 +6756 4 111.34 129.82 8.9 0.435 6755 +6757 4 112.41 129.85 9.3 0.435 6756 diff --git a/demos/Fig5_CellMultiscale/cells/VHC-neuron.CNG.swc b/demos/Fig5_CellMultiscale/cells/VHC-neuron.CNG.swc new file mode 100644 index 0000000..3a7b77c --- /dev/null +++ b/demos/Fig5_CellMultiscale/cells/VHC-neuron.CNG.swc @@ -0,0 +1,3022 @@ +# Original file VHC-neuron.swc edited using StdSwc version 1.31 on 2/28/13. +# Irregularities and fixes documented in VHC-neuron.swc.std. See StdSwc1.31.doc for more information. +# +# Neurolucida to SWC conversion from L-Measure. Sridevi Polavaram: spolavar@gmu.edu +# Original fileName:C:\Users\praveen\Desktop\DataProcessing\CurrentArchives\Processing\Johnston\ASC\VHC-neuron.asc +#The original file has a single soma contour that is averaged into 3 soma points +1 1 0.0 0.0 0.0 8.88119 -1 +2 1 0.35 -8.83 -0.87 8.88119 1 +3 1 -0.35 8.83 0.87 8.88119 1 +4 3 0.67 -4.33 -2.18 2.165 1 +5 3 -0.09 -6.62 -2.34 1.84 4 +6 3 -1.76 -8.01 -2.31 1.405 5 +7 3 -2.97 -8.02 -2.2 1.405 6 +8 3 -3.39 -8.37 -2.2 1.405 7 +9 3 -3.48 -8.5 -2.2 1.405 8 +10 3 -3.53 -8.81 -3.1 1.19 9 +11 3 -3.61 -9.04 -3.55 1.19 10 +12 3 -4.27 -8.08 -3.52 0.11 11 +13 3 -5.31 -7.95 -3.18 0.11 12 +14 3 -5.47 -8.42 -3.21 0.54 13 +15 3 -6.69 -8.42 -3.11 0.54 14 +16 3 -7.0 -7.52 -2.98 0.54 15 +17 3 -8.21 -7.23 -2.84 0.54 16 +18 3 -8.66 -7.68 -2.85 0.54 17 +19 3 -9.28 -8.31 -2.85 0.54 18 +20 3 -9.73 -9.06 -2.88 0.54 19 +21 3 -10.03 -10.29 -2.97 0.54 20 +22 3 -10.03 -10.88 -3.03 0.54 21 +23 3 -10.18 -11.95 -3.12 0.54 22 +24 3 -10.63 -12.42 -3.13 0.54 23 +25 3 -10.94 -13.64 -3.22 0.54 24 +26 3 -11.39 -14.1 -3.22 0.54 25 +27 3 -11.68 -15.01 -3.28 0.54 26 +28 3 -12.22 -15.99 -4.24 0.65 27 +29 3 -12.53 -16.61 -4.26 0.65 28 +30 3 -12.98 -17.36 -4.31 0.65 29 +31 3 -13.66 -18.21 -5.16 0.54 30 +32 3 -14.88 -18.82 -5.11 0.54 31 +33 3 -16.85 -19.3 -4.97 0.54 32 +34 3 -17.61 -20.37 -5.0 0.54 33 +35 3 -17.76 -22.05 -5.16 0.54 34 +36 3 -17.6 -22.81 -5.25 0.54 35 +37 3 -17.44 -24.17 -5.39 0.54 36 +38 3 -17.74 -25.1 -5.45 0.54 37 +39 3 -19.12 -25.86 -5.4 0.54 38 +40 3 -20.94 -25.87 -5.24 0.54 39 +41 3 -22.15 -25.9 -5.05 0.54 40 +42 3 -22.3 -26.96 -5.14 0.54 41 +43 3 -22.29 -27.57 -5.19 0.54 42 +44 3 -22.44 -28.04 -5.22 0.54 43 +45 3 -22.94 -27.75 -6.06 0.435 44 +46 3 -23.25 -28.36 -6.09 0.435 45 +47 3 -23.56 -29.27 -6.23 0.435 46 +48 3 -24.05 -29.99 -6.72 0.435 47 +49 3 -24.86 -30.7 -7.31 0.435 48 +50 3 -26.08 -31.33 -7.26 0.435 49 +51 3 -27.75 -31.18 -7.09 0.435 50 +52 3 -29.32 -31.45 -7.5 0.435 51 +53 3 -30.27 -31.72 -7.89 0.435 52 +54 3 -31.81 -31.43 -7.79 0.435 53 +55 3 -33.73 -30.72 -8.68 0.435 54 +56 3 -34.98 -30.41 -8.84 0.435 55 +57 3 -35.25 -30.43 -10.1 0.54 56 +58 3 -36.17 -31.34 -10.26 0.54 57 +59 3 -37.55 -32.11 -10.29 0.54 58 +60 3 -38.19 -32.68 -10.73 0.54 59 +61 3 -38.5 -33.59 -10.86 0.54 60 +62 3 -39.6 -34.93 -11.27 0.54 61 +63 3 -40.35 -36.61 -11.37 0.54 62 +64 3 -41.27 -37.83 -11.48 0.54 63 +65 3 -41.72 -38.58 -11.59 0.54 64 +66 3 -42.19 -39.04 -11.66 0.54 65 +67 3 -42.37 -39.46 -11.98 0.54 66 +68 3 -42.4 -39.43 -12.36 0.54 67 +69 3 -43.94 -40.64 -12.57 0.54 68 +70 3 -45.25 -41.77 -13.61 0.54 69 +71 3 -46.49 -43.28 -13.86 0.54 70 +72 3 -47.71 -44.49 -13.96 0.54 71 +73 3 -48.47 -45.27 -13.96 0.54 72 +74 3 -49.24 -46.32 -14.14 0.54 73 +75 3 -50.18 -47.81 -14.57 0.54 74 +76 3 -52.32 -49.34 -14.68 0.54 75 +77 3 -53.07 -50.1 -14.68 0.54 76 +78 3 -53.41 -50.69 -15.09 0.54 77 +79 3 -53.87 -51.44 -15.19 0.54 78 +80 3 -54.81 -52.33 -15.5 0.54 79 +81 3 -56.05 -53.53 -15.8 0.54 80 +82 3 -57.73 -54.0 -15.77 0.54 81 +83 3 -59.85 -54.92 -15.66 0.54 82 +84 3 -61.23 -56.61 -15.78 0.54 83 +85 3 -62.89 -58.3 -15.79 0.54 84 +86 3 -66.39 -60.61 -15.69 0.54 85 +87 3 -67.76 -61.99 -15.7 0.54 86 +88 3 -68.97 -63.22 -15.7 0.54 87 +89 3 -71.85 -64.3 -15.55 0.54 88 +90 3 -73.99 -64.64 -15.38 0.54 89 +91 3 -75.81 -64.35 -15.19 0.54 90 +92 3 -79.65 -65.1 -15.35 0.54 91 +93 3 -82.24 -64.37 -15.04 0.54 92 +94 3 -84.53 -64.23 -14.82 0.54 93 +95 3 -86.41 -64.78 -15.39 0.54 94 +96 3 -88.69 -65.57 -15.26 0.54 95 +97 3 -90.98 -66.66 -15.15 0.54 96 +98 3 -92.87 -67.8 -16.07 0.54 97 +99 3 -93.53 -69.89 -16.73 0.54 98 +100 3 -95.82 -71.88 -16.79 0.54 99 +101 3 -96.87 -73.56 -16.87 0.54 100 +102 3 -97.85 -75.31 -17.77 0.54 101 +103 3 -98.47 -76.52 -17.99 0.54 102 +104 3 -98.16 -77.74 -18.06 0.54 103 +105 3 -98.09 -78.42 -17.38 0.54 104 +106 3 -97.89 -79.23 -16.87 0.54 105 +107 3 -98.75 -80.5 -16.54 0.54 106 +108 3 -99.36 -81.41 -16.57 0.54 107 +109 3 -99.32 -83.28 -16.31 0.54 108 +110 3 -100.2 -86.04 -16.34 0.54 109 +111 3 -99.59 -88.77 -16.67 0.54 110 +112 3 -99.27 -90.91 -16.82 0.54 111 +113 3 -98.62 -92.16 -16.55 0.54 112 +114 3 -98.46 -93.83 -16.73 0.54 113 +115 3 -98.58 -94.93 -16.45 0.54 114 +116 3 -98.4 -96.01 -16.42 0.54 115 +117 3 -98.69 -96.93 -16.4 0.54 116 +118 3 -22.3 -29.09 -5.42 0.54 44 +119 3 -21.83 -31.67 -5.72 0.54 118 +120 3 -20.61 -34.99 -6.22 0.54 119 +121 3 -19.89 -36.61 -6.91 0.54 120 +122 3 -19.46 -38.24 -7.56 0.54 121 +123 3 -19.16 -39.45 -7.78 0.54 122 +124 3 -18.65 -40.57 -7.25 0.54 123 +125 3 -17.05 -42.46 -6.82 0.54 124 +126 3 -16.58 -44.14 -6.97 0.54 125 +127 3 -16.87 -45.37 -6.98 0.54 126 +128 3 -16.66 -45.58 -6.26 0.54 127 +129 3 -17.25 -47.1 -6.35 0.54 128 +130 3 -18.32 -47.57 -6.3 0.54 129 +131 3 -19.05 -48.38 -6.01 0.54 130 +132 3 -20.1 -49.46 -5.87 0.54 131 +133 3 -20.55 -51.43 -6.02 0.54 132 +134 3 -21.15 -53.57 -6.17 0.54 133 +135 3 -22.35 -55.72 -6.2 0.54 134 +136 3 -23.41 -57.41 -6.27 0.54 135 +137 3 -24.16 -59.09 -6.36 0.54 136 +138 3 -25.52 -59.88 -6.16 0.54 137 +139 3 -26.42 -60.8 -6.08 0.54 138 +140 3 -27.46 -61.9 -5.8 0.54 139 +141 3 -28.2 -64.21 -5.88 0.54 140 +142 3 -28.5 -66.33 -6.07 0.54 141 +143 3 -29.72 -67.87 -6.1 0.54 142 +144 3 -31.08 -68.64 -6.05 0.54 143 +145 3 -32.76 -70.63 -6.09 0.54 144 +146 3 -33.19 -72.63 -6.16 0.54 145 +147 3 -33.8 -75.05 -6.34 0.54 146 +148 3 -33.71 -76.04 -5.62 0.54 147 +149 3 -35.03 -77.17 -6.74 0.54 148 +150 3 -36.24 -79.02 -6.8 0.54 149 +151 3 -37.19 -80.5 -7.25 0.54 150 +152 3 -37.41 -81.78 -8.26 0.54 151 +153 3 -37.85 -84.68 -8.5 0.54 152 +154 3 -38.77 -88.03 -8.81 0.54 153 +155 3 -38.91 -90.01 -9.0 0.54 154 +156 3 -39.06 -91.68 -9.15 0.54 155 +157 3 -38.76 -93.18 -9.47 0.54 156 +158 3 -38.8 -94.06 -9.93 0.54 157 +159 3 -39.48 -94.59 -10.83 0.54 158 +160 3 -41.17 -96.26 -10.99 0.54 159 +161 3 -41.54 -97.09 -11.87 0.54 160 +162 3 -41.81 -97.74 -13.11 0.54 161 +163 3 -41.84 -99.24 -11.97 0.54 162 +164 3 -42.03 -99.98 -10.67 0.54 163 +165 3 -41.98 -100.61 -10.44 0.54 164 +166 3 -42.73 -102.6 -10.48 0.54 165 +167 3 -42.57 -105.2 -10.68 0.54 166 +168 3 -42.71 -106.56 -10.8 0.54 167 +169 3 -43.6 -108.43 -10.59 0.54 168 +170 3 -44.18 -109.97 -10.46 0.54 169 +171 3 -44.24 -110.81 -9.71 0.54 170 +172 3 -44.24 -112.04 -9.68 0.54 171 +173 3 -44.52 -113.29 -9.54 0.54 172 +174 3 -44.93 -114.69 -9.33 0.54 173 +175 3 -44.89 -116.26 -9.04 0.54 174 +176 3 -44.68 -117.66 -8.75 0.54 175 +177 3 -44.39 -119.19 -8.84 0.54 176 +178 3 -43.91 -120.55 -9.02 0.54 177 +179 3 -43.89 -120.9 -8.69 0.54 178 +180 3 -42.63 -122.13 -8.62 0.54 179 +181 3 -41.35 -123.71 -8.14 0.54 180 +182 3 -40.56 -125.39 -8.29 0.54 181 +183 3 -39.95 -126.59 -8.46 0.54 182 +184 3 -39.34 -128.42 -8.63 0.54 183 +185 3 -38.71 -130.56 -8.81 0.54 184 +186 3 -38.07 -131.8 -8.62 0.54 185 +187 3 -37.6 -132.87 -8.68 0.54 186 +188 3 -37.59 -134.08 -8.74 0.54 187 +189 3 -37.59 -135.0 -8.83 0.54 188 +190 3 -37.43 -135.76 -8.92 0.54 189 +191 3 -36.82 -136.67 -9.06 0.54 190 +192 3 -36.05 -138.64 -9.32 0.54 191 +193 3 -35.9 -140.01 -9.47 0.54 192 +194 3 -36.34 -141.07 -9.54 0.54 193 +195 3 -37.05 -141.51 -9.36 0.435 194 +196 3 -37.96 -142.43 -9.36 0.435 195 +197 3 -39.64 -142.9 -9.25 0.435 196 +198 3 -41.44 -143.55 -9.01 0.435 197 +199 3 -42.34 -144.48 -8.86 0.435 198 +200 3 -43.11 -144.62 -8.95 0.435 199 +201 3 -43.6 -145.36 -9.28 0.435 200 +202 3 -43.94 -145.63 -9.65 0.435 201 +203 3 -44.28 -146.19 -10.13 0.435 202 +204 3 -44.99 -146.71 -11.25 0.435 203 +205 3 -45.66 -147.56 -11.88 0.435 204 +206 3 -45.84 -148.59 -12.34 0.435 205 +207 3 -46.13 -150.11 -12.46 0.435 206 +208 3 -46.59 -151.48 -12.62 0.435 207 +209 3 -46.59 -152.7 -12.74 0.435 208 +210 3 -46.42 -154.06 -12.89 0.435 209 +211 3 -46.6 -154.8 -13.25 0.435 210 +212 3 -46.15 -155.85 -13.47 0.435 211 +213 3 -45.85 -157.07 -13.61 0.435 212 +214 3 -46.02 -157.81 -13.9 0.435 213 +215 3 -46.02 -158.71 -14.14 0.435 214 +216 3 -46.22 -159.72 -14.67 0.435 215 +217 3 -46.53 -160.34 -14.78 0.435 216 +218 3 -46.83 -160.94 -14.81 0.435 217 +219 3 -46.99 -161.4 -14.84 0.435 218 +220 3 -47.04 -161.94 -15.64 0.435 219 +221 3 -47.65 -162.54 -15.73 0.435 220 +222 3 -48.11 -163.01 -15.73 0.435 221 +223 3 -48.42 -163.32 -15.73 0.435 222 +224 3 -48.62 -163.71 -16.28 0.435 223 +225 3 -48.31 -165.22 -16.53 0.435 224 +226 3 -47.25 -165.67 -16.67 0.435 225 +227 3 -3.29 -10.26 -4.74 1.19 10 +228 3 -2.54 -10.99 -5.1 1.08 227 +229 3 -1.93 -11.9 -5.24 0.865 228 +230 3 -1.81 -12.92 -5.81 0.65 229 +231 3 -1.21 -13.83 -5.95 0.65 230 +232 3 -1.2 -14.74 -6.04 0.65 231 +233 3 -1.8 -15.96 -6.11 0.65 232 +234 3 -2.26 -16.71 -6.22 0.65 233 +235 3 -3.79 -17.95 -6.19 0.65 234 +236 3 -4.84 -19.93 -6.3 0.65 235 +237 3 -5.14 -20.55 -6.33 0.435 236 +238 3 -6.2 -22.22 -6.39 0.435 237 +239 3 -6.34 -23.59 -6.51 0.435 238 +240 3 -5.58 -24.95 -6.72 0.435 239 +241 3 -4.67 -27.09 -7.01 0.435 240 +242 3 -4.2 -29.67 -7.3 0.435 241 +243 3 -4.2 -30.88 -7.42 0.435 242 +244 3 -3.89 -32.39 -7.6 0.435 243 +245 3 -2.46 -33.18 -8.94 0.435 244 +246 3 -1.39 -33.63 -9.08 0.435 245 +247 3 -0.03 -34.37 -9.35 0.435 246 +248 3 1.17 -35.88 -9.61 0.435 247 +249 3 2.25 -38.15 -9.94 0.435 248 +250 3 3.18 -40.28 -10.23 0.435 249 +251 3 3.48 -41.49 -10.37 0.435 250 +252 3 4.85 -42.85 -10.63 0.435 251 +253 3 6.49 -42.62 -11.29 0.435 252 +254 3 8.21 -43.42 -12.58 0.435 253 +255 3 9.59 -44.79 -11.18 0.435 254 +256 3 10.7 -45.29 -10.8 0.435 255 +257 3 11.5 -46.08 -10.51 0.435 256 +258 3 11.97 -47.16 -10.5 0.435 257 +259 3 13.08 -48.25 -10.26 0.435 258 +260 3 13.0 -48.78 -9.54 0.435 259 +261 3 12.87 -49.57 -9.46 0.435 260 +262 3 12.76 -50.06 -9.04 0.435 261 +263 3 12.82 -51.04 -8.45 0.435 262 +264 3 13.34 -52.46 -7.97 0.435 263 +265 3 13.53 -52.95 -7.73 0.435 264 +266 3 13.55 -53.89 -7.6 0.435 265 +267 3 13.56 -54.5 -7.58 0.435 266 +268 3 -4.18 -10.16 -2.3 0.755 9 +269 3 -5.4 -11.08 -2.28 0.65 268 +270 3 -6.46 -12.15 -2.28 0.65 269 +271 3 -7.06 -13.68 -2.38 0.65 270 +272 3 -7.51 -15.67 -2.45 0.65 271 +273 3 -7.34 -17.65 -2.66 0.65 272 +274 3 -6.43 -19.76 -2.95 0.65 273 +275 3 -5.66 -21.74 -3.21 0.65 274 +276 3 -5.04 -24.47 -3.53 0.65 275 +277 3 -4.42 -25.98 -3.75 0.65 276 +278 3 -4.72 -27.19 -3.83 0.65 277 +279 3 -5.34 -27.81 -3.84 0.65 278 +280 3 -6.55 -27.83 -3.72 0.65 279 +281 3 -7.47 -29.36 -3.79 0.65 280 +282 3 -7.71 -30.46 -3.88 0.65 281 +283 3 -7.85 -30.94 -2.1 0.435 282 +284 3 -8.31 -31.4 -2.1 0.435 283 +285 3 -8.76 -31.87 -2.1 0.435 284 +286 3 -9.26 -32.27 -2.63 0.435 285 +287 3 -9.8 -32.65 -3.44 0.435 286 +288 3 -10.28 -33.09 -3.67 0.435 287 +289 3 -10.55 -33.42 -3.44 0.435 288 +290 3 -10.84 -33.75 -3.23 0.435 289 +291 3 -10.83 -34.36 -3.22 0.435 290 +292 3 -10.5 -34.69 -3.06 0.435 291 +293 3 -9.99 -35.2 -2.47 0.435 292 +294 3 -9.77 -35.72 -1.86 0.435 293 +295 3 -8.83 -36.34 -1.86 0.435 294 +296 3 -8.98 -37.42 -1.86 0.435 295 +297 3 -9.13 -38.17 -1.92 0.435 296 +298 3 -9.44 -38.79 -1.95 0.435 297 +299 3 -10.19 -39.56 -1.89 0.435 298 +300 3 -10.33 -40.33 -1.88 0.435 299 +301 3 -10.62 -41.25 -1.87 0.435 300 +302 3 -10.93 -41.86 -1.9 0.435 301 +303 3 -11.04 -42.96 -1.61 0.435 302 +304 3 -10.29 -43.39 -3.53 0.435 303 +305 3 -10.28 -44.0 -3.52 0.435 304 +306 3 -7.61 -30.42 -3.89 0.54 282 +307 3 -6.54 -31.79 -4.11 0.54 306 +308 3 -5.85 -33.07 -3.47 0.54 307 +309 3 -6.0 -34.45 -3.59 0.54 308 +310 3 -7.37 -35.22 -3.55 0.54 309 +311 3 -7.21 -37.19 -3.75 0.54 310 +312 3 -6.22 -38.47 -4.87 0.54 311 +313 3 -5.61 -39.97 -5.07 0.54 312 +314 3 -6.21 -41.81 -5.21 0.54 313 +315 3 -5.85 -42.47 -4.77 0.435 314 +316 3 -5.24 -43.37 -4.91 0.435 315 +317 3 -4.62 -45.49 -5.17 0.435 316 +318 3 -4.17 -46.86 -5.35 0.435 317 +319 3 -3.56 -47.46 -5.47 0.435 318 +320 3 -2.5 -47.3 -5.55 0.435 319 +321 3 -1.73 -47.43 -5.72 0.435 320 +322 3 -1.12 -48.96 -5.92 0.435 321 +323 3 -1.58 -50.03 -5.98 0.435 322 +324 3 -1.42 -51.69 -6.15 0.435 323 +325 3 -0.66 -53.05 -6.36 0.435 324 +326 3 0.4 -54.4 -6.66 0.435 325 +327 3 1.17 -55.16 -6.81 0.435 326 +328 3 0.71 -56.23 -6.87 0.435 327 +329 3 0.33 -56.76 -7.79 0.435 328 +330 3 -0.32 -58.22 -8.39 0.435 329 +331 3 -1.38 -59.61 -8.44 0.435 330 +332 3 -1.83 -60.98 -8.53 0.435 331 +333 3 -1.82 -62.5 -8.67 0.435 332 +334 3 -1.82 -64.32 -8.86 0.435 333 +335 3 -1.2 -65.54 -9.03 0.435 334 +336 3 0.0 -66.74 -9.26 0.435 335 +337 3 0.47 -68.12 -9.43 0.435 336 +338 3 0.32 -68.57 -9.46 0.435 337 +339 3 0.01 -69.48 -9.53 0.435 338 +340 3 0.02 -70.4 -9.62 0.435 339 +341 3 0.78 -71.76 -9.82 0.435 340 +342 3 1.7 -72.97 -10.02 0.435 341 +343 3 2.45 -74.0 -10.42 0.435 342 +344 3 1.99 -75.37 -10.59 0.435 343 +345 3 1.98 -75.98 -10.65 0.435 344 +346 3 2.75 -77.03 -10.82 0.435 345 +347 3 3.06 -78.25 -10.97 0.435 346 +348 3 2.76 -78.86 -11.0 0.435 347 +349 3 2.15 -79.78 -11.03 0.435 348 +350 3 2.61 -81.14 -11.21 0.435 349 +351 3 3.98 -81.27 -11.35 0.435 350 +352 3 4.44 -81.73 -11.44 0.435 351 +353 3 4.9 -82.79 -11.58 0.435 352 +354 3 5.05 -84.17 -11.73 0.435 353 +355 3 5.11 -85.41 -13.06 0.435 354 +356 3 4.51 -86.03 -13.07 0.435 355 +357 3 4.05 -87.08 -13.13 0.435 356 +358 3 5.87 -87.99 -13.39 0.435 357 +359 3 6.94 -89.34 -13.62 0.435 358 +360 3 7.26 -89.66 -15.19 0.435 359 +361 3 7.41 -90.71 -15.31 0.435 360 +362 3 7.27 -91.78 -15.4 0.435 361 +363 3 6.96 -92.39 -15.43 0.435 362 +364 3 6.97 -93.61 -15.55 0.435 363 +365 3 7.89 -94.51 -15.72 0.435 364 +366 3 8.9 -95.81 -16.63 0.435 365 +367 3 9.5 -97.01 -16.87 0.435 366 +368 3 9.78 -97.89 -17.28 0.435 367 +369 3 10.05 -99.68 -17.87 0.435 368 +370 3 10.22 -101.04 -18.02 0.435 369 +371 3 11.12 -101.33 -18.2 0.435 370 +372 3 12.8 -101.77 -18.4 0.435 371 +373 3 13.56 -102.83 -18.57 0.435 372 +374 3 13.72 -104.5 -18.75 0.435 373 +375 3 14.47 -105.55 -19.0 0.435 374 +376 3 15.39 -106.77 -19.2 0.435 375 +377 3 16.61 -108.57 -19.48 0.435 376 +378 3 17.38 -110.24 -19.72 0.435 377 +379 3 18.45 -112.52 -20.04 0.435 378 +380 3 19.52 -114.78 -20.36 0.435 379 +381 3 21.03 -116.57 -20.9 0.435 380 +382 3 21.89 -118.02 -21.88 0.435 381 +383 3 22.81 -119.53 -22.12 0.435 382 +384 3 24.02 -120.73 -22.34 0.435 383 +385 3 25.54 -121.63 -22.57 0.435 384 +386 3 27.84 -123.58 -22.97 0.435 385 +387 3 29.06 -125.1 -23.23 0.435 386 +388 3 28.92 -127.99 -23.5 0.435 387 +389 3 29.37 -129.34 -23.68 0.435 388 +390 3 29.07 -130.27 -23.81 0.435 389 +391 3 30.9 -131.15 -24.06 0.435 390 +392 3 31.66 -132.83 -24.3 0.435 391 +393 3 32.58 -134.34 -24.53 0.435 392 +394 3 33.65 -135.38 -24.73 0.435 393 +395 3 33.96 -136.6 -24.88 0.435 394 +396 3 35.33 -138.86 -25.23 0.435 395 +397 3 35.84 -140.11 -25.48 0.435 396 +398 3 36.6 -141.17 -25.65 0.435 397 +399 3 37.52 -142.08 -25.82 0.435 398 +400 3 39.34 -142.96 -26.08 0.435 399 +401 3 40.03 -144.86 -27.15 0.435 400 +402 3 40.8 -146.82 -27.42 0.435 401 +403 3 42.11 -148.41 -28.45 0.435 402 +404 3 42.11 -149.32 -28.54 0.435 403 +405 3 42.07 -149.87 -29.12 0.435 404 +406 3 42.82 -151.24 -29.39 0.435 405 +407 3 44.05 -151.83 -29.57 0.435 406 +408 3 45.05 -152.2 -30.46 0.435 407 +409 3 45.07 -152.83 -31.95 0.435 408 +410 3 44.94 -153.0 -33.4 0.435 409 +411 3 45.09 -154.36 -33.54 0.435 410 +412 3 46.16 -156.02 -33.87 0.435 411 +413 3 47.23 -157.98 -34.17 0.435 412 +414 3 49.06 -160.71 -34.6 0.435 413 +415 3 49.67 -162.22 -34.8 0.435 414 +416 3 50.75 -162.66 -34.94 0.435 415 +417 3 51.97 -163.86 -35.17 0.435 416 +418 3 52.73 -165.53 -35.49 0.435 417 +419 3 53.95 -166.73 -35.79 0.435 418 +420 3 56.12 -167.07 -37.08 0.435 419 +421 3 57.77 -167.77 -37.76 0.435 420 +422 3 59.29 -169.59 -38.07 0.435 421 +423 3 60.21 -170.79 -38.27 0.435 422 +424 3 61.11 -171.07 -38.53 0.435 423 +425 3 61.46 -172.32 -39.9 0.435 424 +426 3 61.73 -172.88 -40.37 0.435 425 +427 3 61.98 -174.03 -41.25 0.435 426 +428 3 62.36 -175.0 -42.21 0.435 427 +429 3 62.89 -176.75 -43.26 0.435 428 +430 3 63.65 -178.11 -43.54 0.435 429 +431 3 64.27 -179.61 -43.75 0.435 430 +432 3 64.73 -180.38 -43.87 0.435 431 +433 3 65.79 -181.11 -44.04 0.435 432 +434 3 66.86 -181.57 -44.18 0.435 433 +435 3 68.38 -180.94 -44.26 0.435 434 +436 3 68.69 -180.64 -44.26 0.435 435 +437 3 68.53 -180.47 -46.04 0.435 436 +438 3 68.0 -179.64 -46.59 0.435 437 +439 3 -7.29 -42.58 -5.25 0.435 314 +440 3 -8.04 -43.04 -5.22 0.435 439 +441 3 -9.1 -45.63 -5.38 0.435 440 +442 3 -7.72 -48.2 -5.76 0.435 441 +443 3 -7.1 -50.64 -6.05 0.435 442 +444 3 -7.7 -51.86 -6.05 0.435 443 +445 3 -9.02 -52.67 -5.62 0.435 444 +446 3 -9.47 -53.15 -5.47 0.435 445 +447 3 -10.07 -53.77 -5.41 0.435 446 +448 3 -9.61 -54.83 -5.55 0.435 447 +449 3 -9.46 -55.59 -5.64 0.435 448 +450 3 -10.07 -56.21 -5.65 0.435 449 +451 3 -11.44 -56.36 -5.54 0.435 450 +452 3 -12.35 -57.28 -5.54 0.435 451 +453 3 -12.49 -57.74 -5.57 0.435 452 +454 3 -12.6 -58.26 -5.08 0.435 453 +455 3 -12.59 -59.47 -5.19 0.435 454 +456 3 -12.13 -61.45 -5.36 0.435 455 +457 3 -12.12 -62.66 -5.48 0.435 456 +458 3 -13.18 -63.13 -5.43 0.435 457 +459 3 -13.79 -64.05 -5.46 0.435 458 +460 3 -14.7 -65.88 -5.56 0.435 459 +461 3 -14.54 -67.86 -5.76 0.435 460 +462 3 -14.05 -69.56 -5.67 0.435 461 +463 3 -13.28 -70.32 -5.73 0.435 462 +464 3 -12.67 -71.52 -5.92 0.435 463 +465 3 -12.66 -72.75 -6.03 0.435 464 +466 3 -12.95 -73.97 -6.05 0.435 465 +467 3 -12.96 -75.19 -6.17 0.435 466 +468 3 -13.05 -75.7 -5.67 0.435 467 +469 3 -13.36 -76.3 -5.71 0.435 468 +470 3 -13.35 -76.61 -5.67 0.435 469 +471 3 -13.8 -77.68 -5.73 0.435 470 +472 3 -4.13 -8.82 -3.75 0.11 8 +473 3 -5.04 -9.14 -3.56 0.11 472 +474 3 -5.17 -9.91 -3.62 0.11 473 +475 3 -5.4 -9.38 -4.23 0.65 474 +476 3 -6.03 -9.39 -4.32 0.65 475 +477 3 -7.57 -9.66 -4.59 0.65 476 +478 3 -9.11 -9.96 -4.69 0.65 477 +479 3 -11.24 -10.59 -4.56 0.65 478 +480 3 -13.07 -11.2 -4.52 0.65 479 +481 3 -14.78 -12.25 -4.85 0.65 480 +482 3 -15.69 -13.17 -4.93 0.54 481 +483 3 -16.79 -14.8 -5.44 0.54 482 +484 3 -17.3 -15.82 -6.03 0.54 483 +485 3 -17.49 -16.53 -6.61 0.54 484 +486 3 -18.03 -16.92 -7.43 0.54 485 +487 3 -18.49 -17.35 -7.58 0.54 486 +488 3 -20.18 -16.91 -7.45 0.54 487 +489 3 -22.02 -17.51 -7.64 0.54 488 +490 3 -23.12 -17.93 -7.96 0.54 489 +491 3 -24.34 -18.55 -7.9 0.54 490 +492 3 -25.12 -18.67 -9.82 0.54 491 +493 3 -25.19 -19.23 -10.54 0.54 492 +494 3 -25.88 -18.84 -11.35 0.54 493 +495 3 -27.71 -17.94 -11.09 0.54 494 +496 3 -28.76 -18.42 -10.97 0.54 495 +497 3 -29.45 -18.34 -11.73 0.54 496 +498 3 -31.51 -17.81 -12.39 0.54 497 +499 3 -33.03 -18.12 -12.35 0.54 498 +500 3 -35.21 -17.8 -12.65 0.54 499 +501 3 -37.66 -17.18 -12.52 0.54 500 +502 3 -40.65 -16.07 -13.04 0.54 501 +503 3 -41.66 -16.27 -14.1 0.54 502 +504 3 -43.19 -16.58 -14.07 0.54 503 +505 3 -46.23 -17.82 -13.91 0.54 504 +506 3 -49.43 -18.6 -13.84 0.54 505 +507 3 -52.13 -18.96 -14.91 0.54 506 +508 3 -54.57 -19.28 -14.71 0.54 507 +509 3 -57.24 -18.15 -15.33 0.54 508 +510 3 -60.0 -18.47 -15.2 0.54 509 +511 3 -60.98 -18.7 -15.96 0.54 510 +512 3 -61.98 -18.92 -16.94 0.54 511 +513 3 -63.16 -19.26 -18.08 0.54 512 +514 3 -63.47 -19.57 -18.16 0.54 513 +515 3 -64.11 -20.15 -18.53 0.54 514 +516 3 -64.76 -20.11 -18.92 0.54 515 +517 3 -65.52 -20.87 -18.92 0.54 516 +518 3 -65.65 -21.05 -20.29 0.54 517 +519 3 -65.8 -21.49 -20.48 0.54 518 +520 3 -66.24 -21.66 -21.89 0.54 519 +521 3 -66.09 -21.81 -21.84 0.54 520 +522 3 -65.97 -21.94 -22.24 0.54 521 +523 3 -66.03 -21.87 -22.91 0.54 522 +524 3 -65.79 -22.1 -23.72 0.54 523 +525 3 -65.66 -22.21 -24.11 0.54 524 +526 3 -65.56 -22.92 -24.72 0.54 525 +527 3 -65.5 -23.29 -25.67 0.54 526 +528 3 -65.7 -23.68 -26.37 0.54 527 +529 3 -65.88 -24.11 -26.69 0.54 528 +530 3 -65.95 -24.34 -27.47 0.54 529 +531 3 -66.0 -24.89 -28.04 0.54 530 +532 3 -66.14 -24.75 -29.53 0.54 531 +533 3 -66.17 -25.01 -30.08 0.54 532 +534 3 -66.41 -25.36 -31.07 0.54 533 +535 3 -66.47 -25.93 -31.66 0.54 534 +536 3 -67.13 -26.47 -32.33 0.54 535 +537 3 -67.32 -26.9 -32.73 0.54 536 +538 3 -67.71 -27.11 -33.62 0.54 537 +539 3 -68.11 -27.31 -34.74 0.54 538 +540 3 -68.29 -27.74 -35.07 0.54 539 +541 3 -68.48 -28.16 -35.55 0.54 540 +542 3 -68.82 -29.04 -35.97 0.54 541 +543 3 -65.85 -20.54 -20.83 0.54 517 +544 3 -66.61 -20.69 -20.77 0.54 543 +545 3 -68.01 -20.83 -20.97 0.54 544 +546 3 -69.3 -20.45 -21.72 0.54 545 +547 3 -71.02 -20.27 -21.99 0.54 546 +548 3 -71.91 -20.3 -23.28 0.54 547 +549 3 -73.47 -20.56 -23.68 0.54 548 +550 3 -75.26 -20.3 -24.77 0.54 549 +551 3 -77.1 -20.02 -24.66 0.54 550 +552 3 -78.96 -19.68 -24.82 0.54 551 +553 3 -80.73 -19.46 -25.63 0.54 552 +554 3 -82.71 -20.23 -25.59 0.54 553 +555 3 -84.53 -20.25 -25.42 0.54 554 +556 3 -86.26 -19.76 -25.75 0.54 555 +557 3 -87.79 -18.56 -25.49 0.54 556 +558 3 -89.16 -17.5 -25.26 0.54 557 +559 3 -90.21 -17.06 -25.04 0.54 558 +560 3 -92.19 -16.62 -24.81 0.54 559 +561 3 -93.6 -16.14 -25.02 0.54 560 +562 3 -94.25 -15.81 -25.3 0.54 561 +563 3 -96.38 -14.92 -25.02 0.54 562 +564 3 -24.5 -18.09 -7.92 0.54 491 +565 3 -26.66 -18.39 -8.06 0.54 564 +566 3 -28.03 -19.16 -8.08 0.54 565 +567 3 -29.48 -19.84 -8.99 0.54 566 +568 3 -29.94 -20.9 -9.13 0.54 567 +569 3 -30.25 -21.2 -9.13 0.54 568 +570 3 -31.18 -21.5 -7.63 0.54 569 +571 3 -32.1 -21.52 -7.55 0.54 570 +572 3 -34.69 -21.09 -7.28 0.54 571 +573 3 -38.04 -20.2 -6.96 0.54 572 +574 3 -40.66 -19.74 -6.9 0.54 573 +575 3 -41.28 -20.34 -7.05 0.54 574 +576 3 -43.0 -20.75 -7.53 0.54 575 +577 3 -43.16 -20.9 -7.68 0.54 576 +578 3 -43.07 -21.29 -6.75 0.54 577 +579 3 -43.92 -21.67 -5.95 0.54 578 +580 3 -45.55 -22.49 -5.42 0.54 579 +581 3 -47.53 -23.89 -5.38 0.54 580 +582 3 -49.35 -23.9 -5.14 0.54 581 +583 3 -52.08 -25.15 -5.0 0.54 582 +584 3 -53.9 -26.08 -4.92 0.54 583 +585 3 -55.41 -27.31 -4.77 0.54 584 +586 3 -57.2 -27.98 -4.36 0.54 585 +587 3 -59.45 -28.48 -3.9 0.54 586 +588 3 -61.09 -28.99 -3.41 0.54 587 +589 3 -63.5 -29.65 -2.96 0.54 588 +590 3 -65.78 -29.51 -2.73 0.54 589 +591 3 -69.56 -29.72 -2.18 0.54 590 +592 3 -71.53 -29.6 -1.84 0.54 591 +593 3 -73.15 -29.53 -0.99 0.54 592 +594 3 -73.43 -30.78 -0.87 0.54 593 +595 3 -74.0 -31.43 -0.5 0.54 594 +596 3 -76.57 -30.69 -0.12 0.54 595 +597 3 -79.45 -31.49 0.14 0.54 596 +598 3 -81.74 -31.97 0.31 0.54 597 +599 3 -84.31 -32.46 0.65 0.54 598 +600 3 -85.67 -33.25 0.84 0.54 599 +601 3 -87.01 -33.45 1.25 0.54 600 +602 3 -89.27 -33.94 1.64 0.54 601 +603 3 -90.76 -34.9 1.98 0.54 602 +604 3 -92.58 -36.14 2.12 0.54 603 +605 3 -93.74 -36.8 2.6 0.54 604 +606 3 -96.02 -37.9 2.78 0.54 605 +607 3 -96.78 -38.67 2.78 0.54 606 +608 3 -30.41 -22.58 -9.26 0.54 569 +609 3 -31.31 -24.71 -9.38 0.54 608 +610 3 -32.21 -26.85 -9.5 0.54 609 +611 3 -32.21 -28.06 -9.63 0.54 610 +612 3 -32.23 -28.94 -10.01 0.54 611 +613 3 -32.43 -29.97 -10.55 0.54 612 +614 3 -33.03 -31.18 -10.68 0.54 613 +615 3 -33.72 -32.01 -11.69 0.54 614 +616 3 -34.8 -32.47 -11.71 0.54 615 +617 3 -35.85 -33.55 -11.71 0.54 616 +618 3 -36.47 -34.77 -11.77 0.54 617 +619 3 -36.15 -36.29 -11.95 0.54 618 +620 3 -36.42 -36.55 -11.96 0.54 619 +621 3 -36.57 -37.32 -10.35 0.65 620 +622 3 -36.91 -37.59 -10.73 0.65 621 +623 3 -37.01 -37.49 -11.77 0.65 622 +624 3 -37.15 -37.96 -10.06 0.65 623 +625 3 -37.58 -38.45 -9.76 0.65 624 +626 3 -38.43 -38.82 -9.11 0.65 625 +627 3 -38.88 -39.29 -9.04 0.65 626 +628 3 -39.78 -39.01 -8.85 0.65 627 +629 3 -40.55 -38.86 -8.77 0.54 628 +630 3 -41.77 -38.87 -8.65 0.54 629 +631 3 -42.51 -39.64 -8.51 0.54 630 +632 3 -43.42 -40.58 -8.45 0.54 631 +633 3 -43.39 -42.11 -8.45 0.54 632 +634 3 -43.69 -42.74 -8.4 0.54 633 +635 3 -44.43 -43.52 -8.19 0.54 634 +636 3 -45.94 -43.85 -8.0 0.54 635 +637 3 -47.62 -43.72 -7.76 0.54 636 +638 3 -48.63 -44.23 -7.27 0.54 637 +639 3 -49.35 -45.04 -6.76 0.54 638 +640 3 -50.21 -45.4 -6.26 0.54 639 +641 3 -50.79 -46.05 -5.96 0.54 640 +642 3 -51.85 -47.74 -5.94 0.54 641 +643 3 -53.06 -48.36 -5.9 0.54 642 +644 3 -54.11 -49.45 -5.69 0.54 643 +645 3 -55.62 -50.38 -5.63 0.54 644 +646 3 -56.5 -51.33 -5.34 0.54 645 +647 3 -57.4 -51.64 -5.21 0.54 646 +648 3 -59.23 -50.75 -4.95 0.54 647 +649 3 -59.97 -51.54 -4.75 0.54 648 +650 3 -61.03 -52.62 -4.67 0.54 649 +651 3 -62.84 -53.27 -4.34 0.54 650 +652 3 -63.74 -54.5 -4.3 0.54 651 +653 3 -64.65 -55.42 -4.31 0.54 652 +654 3 -65.71 -55.88 -4.26 0.54 653 +655 3 -67.38 -55.75 -4.09 0.54 654 +656 3 -69.97 -56.54 -3.92 0.54 655 +657 3 -71.02 -58.52 -4.02 0.54 656 +658 3 -71.77 -59.29 -3.96 0.54 657 +659 3 -71.92 -60.98 -4.11 0.54 658 +660 3 -72.07 -62.04 -4.19 0.54 659 +661 3 -72.51 -62.82 -4.0 0.54 660 +662 3 -74.79 -62.7 -3.7 0.54 661 +663 3 -76.29 -63.03 -3.52 0.54 662 +664 3 -76.89 -63.65 -3.38 0.54 663 +665 3 -77.75 -64.63 -2.87 0.54 664 +666 3 -78.35 -65.25 -2.79 0.54 665 +667 3 -79.26 -66.17 -2.79 0.54 666 +668 3 -80.78 -66.49 -2.61 0.54 667 +669 3 -81.84 -67.57 -2.63 0.54 668 +670 3 -82.9 -68.64 -2.63 0.54 669 +671 3 -85.03 -68.97 -2.46 0.54 670 +672 3 -86.1 -70.04 -2.47 0.54 671 +673 3 -87.15 -70.52 -2.34 0.54 672 +674 3 -87.87 -71.62 -2.08 0.54 673 +675 3 -88.17 -71.94 -1.93 0.54 674 +676 3 -88.62 -72.4 -1.93 0.54 675 +677 3 -89.21 -73.02 -1.87 0.54 676 +678 3 -90.59 -73.18 -1.75 0.54 677 +679 3 -92.27 -73.35 -1.62 0.54 678 +680 3 -93.03 -74.13 -1.63 0.54 679 +681 3 -93.63 -74.73 -1.63 0.54 680 +682 3 -94.37 -75.52 -1.49 0.54 681 +683 3 -94.98 -76.74 -1.47 0.54 682 +684 3 -95.28 -77.66 -1.53 0.54 683 +685 3 -95.57 -78.28 -1.49 0.54 684 +686 3 -96.18 -79.2 -1.53 0.54 685 +687 3 -96.63 -79.96 -1.56 0.54 686 +688 3 -98.31 -79.81 -1.39 0.54 687 +689 3 -99.52 -79.83 -1.28 0.54 688 +690 3 -100.5 -80.4 -0.26 0.65 689 +691 3 -101.37 -81.06 0.2 0.65 690 +692 3 -101.93 -81.71 0.64 0.65 691 +693 3 -104.5 -82.22 1.12 0.65 692 +694 3 -107.38 -82.71 1.34 0.65 693 +695 3 -108.58 -83.33 1.48 0.65 694 +696 3 -110.26 -84.42 1.53 0.435 695 +697 3 -112.24 -84.59 1.69 0.435 696 +698 3 -113.74 -84.92 1.94 0.435 697 +699 3 -115.1 -86.3 2.09 0.435 698 +700 3 -115.4 -86.62 2.09 0.65 699 +701 3 -116.47 -87.09 2.14 0.65 700 +702 3 -117.67 -88.32 2.2 0.65 701 +703 3 -118.11 -89.99 2.08 0.65 702 +704 3 -117.51 -90.91 1.93 0.65 703 +705 3 -116.44 -91.96 1.81 0.65 704 +706 3 -116.38 -93.84 2.08 0.65 705 +707 3 -116.38 -94.75 2.06 0.65 706 +708 3 -116.66 -95.39 2.17 0.65 707 +709 3 -116.82 -95.84 2.22 0.65 708 +710 3 -117.38 -95.88 2.65 0.65 709 +711 3 -117.21 -97.57 2.55 0.65 710 +712 3 -117.31 -98.69 3.06 0.65 711 +713 3 -117.87 -99.35 3.56 0.65 712 +714 3 -118.31 -99.82 3.64 0.65 713 +715 3 -119.48 -99.89 4.34 0.65 714 +716 3 -119.79 -100.19 4.34 0.65 715 +717 3 -120.37 -100.84 4.64 0.65 716 +718 3 -121.26 -101.77 4.78 0.65 717 +719 3 -121.57 -102.09 4.78 0.65 718 +720 3 -122.02 -102.54 4.78 0.65 719 +721 3 -123.54 -102.26 5.02 0.65 720 +722 3 -124.3 -102.42 5.07 0.65 721 +723 3 -124.59 -102.74 5.14 0.65 722 +724 3 -124.74 -103.2 5.11 0.65 723 +725 3 -36.35 -37.31 -10.9 0.54 620 +726 3 -35.82 -37.83 -10.25 0.54 725 +727 3 -35.54 -38.11 -10.45 0.54 726 +728 3 -35.25 -38.41 -9.06 0.54 727 +729 3 -34.88 -38.78 -8.38 0.54 728 +730 3 -34.45 -39.82 -7.17 0.54 729 +731 3 -34.43 -40.75 -7.11 0.54 730 +732 3 -34.99 -42.63 -6.71 0.54 731 +733 3 -35.37 -44.07 -6.05 0.54 732 +734 3 -35.66 -44.7 -5.94 0.54 733 +735 3 -35.61 -45.35 -5.55 0.54 734 +736 3 -35.72 -46.45 -5.27 0.54 735 +737 3 -36.02 -47.07 -5.22 0.54 736 +738 3 -36.42 -47.6 -4.63 0.54 737 +739 3 -36.87 -48.68 -4.55 0.54 738 +740 3 -37.46 -49.3 -4.4 0.54 739 +741 3 -37.74 -49.94 -4.22 0.54 740 +742 3 -38.08 -51.13 -3.09 0.54 741 +743 3 -37.89 -52.21 -2.84 0.54 742 +744 3 -38.14 -53.2 -2.31 0.54 743 +745 3 -38.38 -54.17 -1.7 0.54 744 +746 3 -38.36 -55.11 -1.64 0.54 745 +747 3 -38.5 -55.57 -1.52 0.54 746 +748 3 -38.49 -55.89 -1.4 0.54 747 +749 3 -38.75 -56.54 -1.06 0.54 748 +750 3 -39.46 -57.36 -0.54 0.54 749 +751 3 -40.96 -57.7 -0.14 0.54 750 +752 3 -42.01 -57.87 0.0 0.54 751 +753 3 -42.45 -58.35 0.23 0.54 752 +754 3 -43.05 -58.98 0.29 0.54 753 +755 3 6.7 -3.75 -5.33 0.865 1 +756 3 7.16 -4.21 -5.41 0.865 755 +757 3 8.22 -4.04 -5.49 0.865 756 +758 3 9.44 -4.63 -5.66 0.865 757 +759 3 10.51 -5.08 -5.81 0.865 758 +760 3 11.58 -6.45 -6.04 0.865 759 +761 3 12.35 -7.2 -6.18 0.54 760 +762 3 14.62 -7.02 -6.37 0.54 761 +763 3 16.16 -7.01 -6.52 0.54 762 +764 3 16.73 -7.29 -5.23 0.54 763 +765 3 17.34 -7.28 -5.29 0.54 764 +766 3 18.42 -6.85 -3.46 0.54 765 +767 3 19.63 -5.01 -3.39 0.54 766 +768 3 20.89 -4.13 -4.55 0.54 767 +769 3 22.56 -3.66 -4.66 0.54 768 +770 3 23.48 -3.35 -4.72 0.54 769 +771 3 24.39 -2.42 -4.71 0.54 770 +772 3 25.0 -1.82 -4.71 0.54 771 +773 3 27.48 -1.23 -6.0 0.54 772 +774 3 29.0 -1.51 -6.17 0.54 773 +775 3 29.91 -0.59 -6.17 0.54 774 +776 3 31.13 0.63 -6.16 0.54 775 +777 3 32.73 1.79 -6.95 0.54 776 +778 3 34.85 3.33 -7.0 0.54 777 +779 3 36.38 4.25 -7.05 0.54 778 +780 3 39.25 5.95 -7.15 0.54 779 +781 3 41.7 6.88 -7.28 0.54 780 +782 3 44.17 7.47 -8.52 0.54 781 +783 3 45.54 7.95 -8.75 0.54 782 +784 3 46.67 8.34 -7.98 0.54 783 +785 3 48.22 8.32 -7.82 0.54 784 +786 3 49.47 8.61 -7.53 0.54 785 +787 3 50.45 8.24 -6.98 0.54 786 +788 3 52.97 7.87 -6.34 0.54 787 +789 3 54.85 8.43 -5.78 0.54 788 +790 3 56.74 8.68 -5.18 0.54 789 +791 3 58.14 9.43 -5.0 0.54 790 +792 3 59.39 9.7 -4.63 0.54 791 +793 3 60.79 10.44 -4.32 0.54 792 +794 3 62.66 10.41 -4.04 0.54 793 +795 3 65.9 10.85 -3.76 0.54 794 +796 3 18.25 -7.88 -5.43 0.54 765 +797 3 19.2 -8.81 -5.31 0.54 796 +798 3 19.5 -10.04 -5.37 0.54 797 +799 3 19.68 -10.81 -5.32 0.54 798 +800 3 21.72 -13.13 -5.06 0.54 799 +801 3 23.56 -14.94 -5.4 0.54 800 +802 3 24.81 -16.17 -5.41 0.54 801 +803 3 26.03 -18.3 -5.59 0.54 802 +804 3 26.38 -18.96 -5.23 0.54 803 +805 3 26.56 -19.43 -5.06 0.54 804 +806 3 26.58 -20.67 -5.03 0.54 805 +807 3 26.88 -21.57 -5.14 0.54 806 +808 3 27.2 -22.79 -5.22 0.54 807 +809 3 27.99 -23.57 -5.13 0.54 808 +810 3 29.55 -24.49 -4.99 0.54 809 +811 3 31.08 -24.2 -5.03 0.54 810 +812 3 33.23 -23.6 -4.79 0.54 811 +813 3 34.92 -24.35 -4.94 0.54 812 +814 3 36.3 -25.12 -4.99 0.54 813 +815 3 37.35 -25.55 -5.28 0.54 814 +816 3 38.39 -25.36 -5.66 0.54 815 +817 3 39.69 -25.1 -6.6 0.54 816 +818 3 41.21 -25.7 -6.8 0.54 817 +819 3 41.11 -26.5 -8.07 0.435 818 +820 3 41.28 -26.98 -7.9 0.435 819 +821 3 41.37 -27.36 -8.7 0.435 820 +822 3 41.43 -27.72 -9.65 0.435 821 +823 3 41.51 -28.11 -10.53 0.435 822 +824 3 41.7 -28.58 -11.96 0.435 823 +825 3 43.52 -30.38 -12.38 0.435 824 +826 3 44.59 -31.74 -12.61 0.435 825 +827 3 45.81 -34.47 -13.0 0.435 826 +828 3 48.56 -36.26 -13.42 0.435 827 +829 3 49.79 -38.08 -13.71 0.435 828 +830 3 50.69 -39.29 -13.91 0.435 829 +831 3 50.1 -40.51 -13.97 0.435 830 +832 3 47.97 -41.44 -13.87 0.435 831 +833 3 47.06 -42.66 -13.91 0.435 832 +834 3 47.67 -44.48 -14.14 0.435 833 +835 3 49.35 -44.92 -14.33 0.435 834 +836 3 50.37 -45.02 -14.96 0.435 835 +837 3 50.05 -46.22 -15.28 0.435 836 +838 3 49.9 -47.27 -15.45 0.435 837 +839 3 49.75 -49.25 -15.62 0.435 838 +840 3 49.75 -50.47 -15.74 0.435 839 +841 3 49.59 -51.52 -15.98 0.435 840 +842 3 49.53 -52.98 -16.73 0.435 841 +843 3 49.98 -54.33 -17.05 0.435 842 +844 3 50.87 -55.81 -17.58 0.435 843 +845 3 51.79 -57.63 -17.85 0.435 844 +846 3 52.1 -59.75 -18.15 0.435 845 +847 3 52.26 -62.03 -18.38 0.435 846 +848 3 52.85 -62.92 -18.67 0.435 847 +849 3 53.77 -63.52 -18.91 0.435 848 +850 3 54.58 -65.83 -20.41 0.435 849 +851 3 54.57 -67.64 -20.66 0.435 850 +852 3 54.7 -69.58 -21.25 0.435 851 +853 3 54.93 -71.32 -22.26 0.435 852 +854 3 56.08 -72.45 -23.31 0.435 853 +855 3 57.4 -74.07 -24.12 0.435 854 +856 3 58.83 -75.75 -25.63 0.435 855 +857 3 61.87 -78.15 -26.21 0.435 856 +858 3 63.91 -79.24 -27.57 0.435 857 +859 3 66.44 -81.15 -28.52 0.435 858 +860 3 67.97 -82.65 -28.87 0.435 859 +861 3 68.9 -84.76 -29.17 0.435 860 +862 3 70.27 -86.12 -29.43 0.435 861 +863 3 72.7 -86.41 -29.68 0.435 862 +864 3 74.37 -87.44 -30.09 0.435 863 +865 3 76.32 -89.68 -30.79 0.435 864 +866 3 77.64 -91.58 -31.71 0.435 865 +867 3 77.81 -92.34 -33.31 0.435 866 +868 3 78.38 -93.21 -33.98 0.435 867 +869 3 79.18 -94.29 -35.44 0.435 868 +870 3 80.02 -95.42 -36.38 0.435 869 +871 3 79.7 -97.22 -36.84 0.435 870 +872 3 79.68 -100.23 -37.49 0.435 871 +873 3 81.27 -104.22 -39.09 0.435 872 +874 3 82.94 -106.47 -39.54 0.435 873 +875 3 84.3 -108.12 -39.98 0.435 874 +876 3 84.22 -110.15 -41.09 0.435 875 +877 3 83.92 -111.99 -41.3 0.435 876 +878 3 83.01 -114.72 -41.57 0.435 877 +879 3 83.16 -115.79 -41.69 0.435 878 +880 3 84.18 -117.08 -42.58 0.435 879 +881 3 85.78 -118.66 -43.64 0.435 880 +882 3 86.0 -120.08 -44.85 0.435 881 +883 3 86.26 -120.62 -45.54 0.435 882 +884 3 87.14 -121.81 -45.96 0.435 883 +885 3 88.82 -122.26 -46.16 0.435 884 +886 3 89.68 -124.0 -47.16 0.435 885 +887 3 89.84 -126.28 -47.4 0.435 886 +888 3 91.66 -128.08 -47.83 0.435 887 +889 3 93.26 -128.44 -48.84 0.435 888 +890 3 94.76 -128.1 -49.18 0.435 889 +891 3 95.21 -128.56 -49.26 0.435 890 +892 3 41.61 -25.79 -7.52 0.54 818 +893 3 44.26 -26.59 -8.82 0.54 892 +894 3 46.54 -26.4 -9.01 0.54 893 +895 3 48.66 -26.67 -9.47 0.54 894 +896 3 50.33 -27.72 -9.72 0.54 895 +897 3 52.09 -28.24 -10.61 0.54 896 +898 3 54.16 -29.07 -11.64 0.54 897 +899 3 55.53 -29.2 -11.78 0.54 898 +900 3 56.54 -30.2 -10.99 0.54 899 +901 3 58.49 -30.93 -9.81 0.54 900 +902 3 60.79 -32.89 -10.21 0.54 901 +903 3 63.02 -34.5 -9.37 0.54 902 +904 3 65.02 -35.86 -9.6 0.54 903 +905 3 66.69 -37.83 -9.95 0.54 904 +906 3 67.76 -39.18 -10.18 0.54 905 +907 3 69.76 -41.14 -10.55 0.54 906 +908 3 71.64 -42.09 -10.14 0.54 907 +909 3 72.86 -43.0 -10.35 0.54 908 +910 3 73.48 -43.9 -10.49 0.54 909 +911 4 -2.36 9.28 -0.57 4.11 1 +912 4 -2.99 13.54 -0.1 3.14 911 +913 4 -3.77 16.72 0.27 2.49 912 +914 4 -4.07 19.45 0.57 1.73 913 +915 4 -4.39 21.59 0.8 1.515 914 +916 4 -5.0 23.4 1.12 1.405 915 +917 4 -5.16 25.07 1.3 1.405 916 +918 4 -5.16 26.28 1.42 1.405 917 +919 4 -5.46 27.8 1.66 1.405 918 +920 4 -5.05 29.49 3.08 1.73 919 +921 4 -4.75 31.94 3.29 1.73 920 +922 4 -5.06 34.06 3.52 1.73 921 +923 4 -5.52 36.34 3.79 1.73 922 +924 4 -5.87 38.81 3.61 1.405 923 +925 4 -5.8 40.87 2.97 1.405 924 +926 4 -5.82 42.7 3.08 1.19 925 +927 4 -5.37 44.38 3.2 1.19 926 +928 4 -5.22 46.05 3.35 1.19 927 +929 4 -4.31 47.89 3.45 1.19 928 +930 4 -3.71 50.02 3.6 1.19 929 +931 4 -2.65 51.7 3.67 1.19 930 +932 4 -1.75 54.45 3.84 1.19 931 +933 4 -1.45 55.98 3.97 1.19 932 +934 4 -1.43 57.49 2.68 1.19 933 +935 4 -1.34 58.92 3.72 1.19 934 +936 4 -1.66 60.43 3.97 1.19 935 +937 4 -1.36 61.35 3.97 1.19 936 +938 4 -2.03 62.01 3.48 1.19 937 +939 4 -2.42 63.01 2.71 1.19 938 +940 4 -2.68 62.9 3.33 0.54 939 +941 4 -3.28 62.89 3.38 0.54 940 +942 4 -3.26 62.88 3.53 0.54 941 +943 4 -3.2 62.81 4.27 0.54 942 +944 4 -3.18 62.79 4.49 0.54 943 +945 4 -3.56 62.84 5.44 0.54 944 +946 4 -3.5 62.49 6.01 0.54 945 +947 4 -3.44 62.43 6.67 0.54 946 +948 4 -3.33 62.31 7.86 0.54 947 +949 4 -3.13 62.11 8.28 0.54 948 +950 4 -3.12 61.49 8.37 0.54 949 +951 4 -3.11 60.57 8.28 0.54 950 +952 4 -3.24 59.47 8.56 0.54 951 +953 4 -3.23 58.56 8.47 0.54 952 +954 4 -3.22 57.95 8.48 0.54 953 +955 4 -3.81 57.02 8.53 0.54 954 +956 4 -4.11 56.71 8.6 0.54 955 +957 4 -5.02 57.0 8.79 0.54 956 +958 4 -5.55 57.5 9.87 0.54 957 +959 4 -6.0 58.57 10.01 0.65 958 +960 4 -6.76 59.01 10.12 0.65 959 +961 4 -7.3 58.93 10.92 0.65 960 +962 4 -8.11 58.83 10.45 0.65 961 +963 4 -8.11 60.05 8.99 0.65 962 +964 4 -7.92 60.48 7.8 0.65 963 +965 4 -9.09 61.64 6.89 0.65 964 +966 4 -9.86 62.4 6.89 0.65 965 +967 4 -11.04 63.28 5.79 0.65 966 +968 4 -12.6 63.9 5.7 0.65 967 +969 4 -14.08 64.45 4.69 0.65 968 +970 4 -14.86 65.22 4.75 0.65 969 +971 4 -16.53 66.26 5.01 0.65 970 +972 4 -17.44 67.16 5.18 0.65 971 +973 4 -17.75 67.47 5.24 0.65 972 +974 4 -18.66 67.76 5.35 0.65 973 +975 4 -19.88 68.37 5.52 0.65 974 +976 4 -21.15 69.63 5.15 0.65 975 +977 4 -21.96 71.62 5.12 0.65 976 +978 4 -22.38 72.05 3.84 0.65 977 +979 4 -22.04 73.24 2.8 0.65 978 +980 4 -22.69 73.88 2.38 0.435 979 +981 4 -23.76 74.94 2.66 0.435 980 +982 4 -23.91 76.0 2.78 0.54 981 +983 4 -24.22 77.83 2.98 0.54 982 +984 4 -24.36 79.48 3.24 0.54 983 +985 4 -24.22 80.86 3.28 0.54 984 +986 4 -24.13 81.98 2.78 0.54 985 +987 4 -24.25 83.31 1.79 0.54 986 +988 4 -23.93 84.83 0.32 0.54 987 +989 4 -24.03 85.56 -0.72 0.54 988 +990 4 -23.99 87.04 -1.8 0.54 989 +991 4 -24.53 88.18 -2.39 0.54 990 +992 4 -25.3 89.55 -4.0 0.54 991 +993 4 -25.85 91.31 -4.69 0.54 992 +994 4 -26.54 93.82 -5.29 0.54 993 +995 4 -26.94 96.94 -5.77 0.54 994 +996 4 -26.5 99.86 -5.68 0.54 995 +997 4 -25.4 101.2 -6.86 0.54 996 +998 4 -24.5 102.74 -6.87 0.54 997 +999 4 -24.36 105.01 -6.66 0.54 998 +1000 4 -23.75 105.63 -6.73 0.54 999 +1001 4 -22.53 105.95 -6.81 0.54 1000 +1002 4 -21.96 106.6 -7.18 0.54 1001 +1003 4 -21.07 107.54 -7.4 0.54 1002 +1004 4 -20.88 107.97 -8.66 0.54 1003 +1005 4 -20.98 108.68 -9.57 0.54 1004 +1006 4 -21.55 110.15 -10.59 0.54 1005 +1007 4 -22.0 110.61 -12.0 0.54 1006 +1008 4 -22.54 110.53 -12.87 0.54 1007 +1009 4 -23.53 110.0 -13.74 0.54 1008 +1010 4 -24.05 109.62 -14.48 0.54 1009 +1011 4 -24.55 108.9 -15.04 0.54 1010 +1012 4 -24.91 108.66 -15.7 0.54 1011 +1013 4 -25.63 108.16 -16.9 0.54 1012 +1014 4 -27.38 107.78 -17.6 0.54 1013 +1015 4 -29.09 107.35 -18.02 0.54 1014 +1016 4 -30.38 106.79 -18.63 0.54 1015 +1017 4 -31.99 105.66 -19.65 0.54 1016 +1018 4 -33.92 105.15 -20.66 0.54 1017 +1019 4 -35.31 105.02 -20.85 0.54 1018 +1020 4 -36.26 104.14 -21.23 0.54 1019 +1021 4 -37.38 103.73 -21.84 0.54 1020 +1022 4 -38.82 103.03 -22.53 0.54 1021 +1023 4 -39.89 102.56 -22.55 0.54 1022 +1024 4 -21.12 73.85 2.77 0.435 979 +1025 4 -20.74 75.31 2.04 0.435 1024 +1026 4 -21.43 75.38 1.21 0.54 1025 +1027 4 -22.5 76.74 1.44 0.54 1026 +1028 4 -24.34 77.95 1.72 0.54 1027 +1029 4 -25.85 78.23 1.89 0.54 1028 +1030 4 -27.46 79.21 1.31 0.54 1029 +1031 4 -29.09 80.52 0.37 0.54 1030 +1032 4 -30.73 81.25 -0.68 0.54 1031 +1033 4 -31.11 81.93 -1.33 0.54 1032 +1034 4 -32.04 82.54 -1.34 0.54 1033 +1035 4 -32.62 83.11 -2.51 0.54 1034 +1036 4 -33.03 83.23 -3.67 0.54 1035 +1037 4 -33.66 83.85 -3.79 0.54 1036 +1038 4 -34.42 84.31 -5.41 0.54 1037 +1039 4 -34.98 84.86 -4.7 0.54 1038 +1040 4 -35.5 85.38 -5.28 0.54 1039 +1041 4 -36.26 86.44 -6.7 0.54 1040 +1042 4 -36.87 87.35 -6.55 0.54 1041 +1043 4 -38.48 88.04 -7.4 0.54 1042 +1044 4 -40.59 88.91 -8.48 0.54 1043 +1045 4 -42.74 89.84 -8.4 0.54 1044 +1046 4 -44.31 90.47 -8.73 0.54 1045 +1047 4 -45.65 92.4 -9.63 0.54 1046 +1048 4 -46.08 93.44 -10.85 0.54 1047 +1049 4 -2.27 64.69 2.78 1.19 939 +1050 4 -1.98 65.92 2.81 1.19 1049 +1051 4 -1.53 66.99 2.87 1.19 1050 +1052 4 -0.62 69.11 3.05 1.19 1051 +1053 4 -0.92 70.01 3.25 1.19 1052 +1054 4 -1.19 71.49 3.88 1.19 1053 +1055 4 -2.26 72.5 4.08 1.19 1054 +1056 4 -1.69 72.84 5.34 0.54 1055 +1057 4 -1.53 73.28 5.59 0.54 1056 +1058 4 -1.03 73.39 5.93 0.54 1057 +1059 4 -0.89 74.16 5.91 0.54 1058 +1060 4 -0.13 75.84 6.01 0.54 1059 +1061 4 0.46 77.68 6.13 0.54 1060 +1062 4 0.91 78.75 6.19 0.54 1061 +1063 4 0.02 79.93 6.69 0.54 1062 +1064 4 -0.87 80.82 6.94 0.54 1063 +1065 4 -1.18 83.25 7.21 0.54 1064 +1066 4 -1.14 84.41 7.93 0.54 1065 +1067 4 -1.51 85.09 7.27 0.54 1066 +1068 4 -1.52 85.99 7.43 0.54 1067 +1069 4 -1.73 86.82 6.85 0.54 1068 +1070 4 -1.93 87.64 6.35 0.54 1069 +1071 4 -2.29 88.0 5.81 0.54 1070 +1072 4 -2.37 88.68 5.06 0.54 1071 +1073 4 -2.92 89.83 4.23 0.54 1072 +1074 4 -2.86 90.69 3.33 0.54 1073 +1075 4 -3.25 91.68 2.62 0.54 1074 +1076 4 -3.31 92.36 2.02 0.54 1075 +1077 4 -4.27 94.22 1.77 0.54 1076 +1078 4 -4.28 95.44 1.89 0.54 1077 +1079 4 -4.44 96.5 1.92 0.54 1078 +1080 4 -4.95 97.32 1.45 0.54 1079 +1081 4 -4.83 98.72 1.35 0.54 1080 +1082 4 -5.2 99.99 0.83 0.54 1081 +1083 4 -5.57 101.57 0.34 0.54 1082 +1084 4 -5.51 102.44 -0.64 0.54 1083 +1085 4 -6.15 102.16 -2.57 0.54 1084 +1086 4 -6.45 102.17 -2.54 0.54 1085 +1087 4 -7.51 102.61 -2.4 0.54 1086 +1088 4 -7.83 103.82 -2.26 0.54 1087 +1089 4 -7.82 104.73 -2.09 0.54 1088 +1090 4 -7.83 105.65 -1.99 0.54 1089 +1091 4 -8.17 106.6 -2.4 0.54 1090 +1092 4 -8.11 107.45 -3.15 0.54 1091 +1093 4 -8.11 108.07 -4.84 0.54 1092 +1094 4 -8.42 108.38 -6.45 0.54 1093 +1095 4 -9.37 109.01 -6.67 0.54 1094 +1096 4 -9.37 110.83 -6.43 0.54 1095 +1097 4 -9.28 112.27 -6.96 0.54 1096 +1098 4 -9.84 112.83 -7.99 0.54 1097 +1099 4 -10.31 113.3 -8.13 0.54 1098 +1100 4 -11.46 115.96 -8.6 0.54 1099 +1101 4 -11.75 118.36 -9.69 0.54 1100 +1102 4 -11.68 120.11 -10.37 0.54 1101 +1103 4 -11.17 122.05 -11.21 0.54 1102 +1104 4 -12.02 123.2 -12.0 0.54 1103 +1105 4 -13.35 125.12 -12.89 0.54 1104 +1106 4 -12.85 126.46 -13.87 0.54 1105 +1107 4 -12.1 127.24 -14.02 0.54 1106 +1108 4 -10.88 129.37 -13.91 0.54 1107 +1109 4 -10.66 131.88 -14.45 0.54 1108 +1110 4 -10.24 134.8 -14.5 0.54 1109 +1111 4 -9.71 136.09 -15.19 0.54 1110 +1112 4 -9.21 137.74 -16.28 0.54 1111 +1113 4 -8.85 139.52 -17.12 0.54 1112 +1114 4 -8.37 140.88 -18.47 0.54 1113 +1115 4 -8.15 142.17 -19.2 0.54 1114 +1116 4 -7.47 143.03 -20.17 0.54 1115 +1117 4 -6.98 143.76 -21.34 0.54 1116 +1118 4 -6.3 144.62 -22.15 0.54 1117 +1119 4 -5.65 145.49 -23.34 0.54 1118 +1120 4 -4.55 146.83 -24.52 0.54 1119 +1121 4 -4.03 147.56 -25.56 0.54 1120 +1122 4 -3.49 148.24 -26.29 0.54 1121 +1123 4 -2.86 149.13 -27.56 0.54 1122 +1124 4 -1.65 150.97 -27.55 0.54 1123 +1125 4 -1.2 152.35 -29.06 0.54 1124 +1126 4 0.46 154.05 -29.11 0.54 1125 +1127 4 -2.56 72.54 4.11 1.19 1055 +1128 4 -4.2 74.16 4.79 1.08 1127 +1129 4 -5.12 75.06 5.04 1.08 1128 +1130 4 -5.32 75.9 5.51 0.54 1129 +1131 4 -4.55 76.67 5.52 0.54 1130 +1132 4 -2.73 76.99 5.39 0.54 1131 +1133 4 0.29 77.02 5.11 0.54 1132 +1134 4 2.09 76.76 4.54 0.54 1133 +1135 4 4.1 76.3 4.61 0.54 1134 +1136 4 6.44 75.81 4.88 0.54 1135 +1137 4 9.03 74.46 4.59 0.54 1136 +1138 4 11.15 73.57 4.3 0.54 1137 +1139 4 12.56 73.4 4.45 0.54 1138 +1140 4 14.72 72.48 4.46 0.54 1139 +1141 4 16.24 71.58 4.24 0.54 1140 +1142 4 17.65 70.18 4.35 0.54 1141 +1143 4 20.1 68.37 4.02 0.54 1142 +1144 4 21.94 68.38 4.0 0.54 1143 +1145 4 23.51 68.34 4.38 0.54 1144 +1146 4 24.77 68.32 4.65 0.54 1145 +1147 4 26.58 68.03 4.45 0.54 1146 +1148 4 28.73 66.83 4.21 0.54 1147 +1149 4 31.16 67.15 4.02 0.54 1148 +1150 4 34.23 66.84 4.01 0.54 1149 +1151 4 37.46 65.47 3.95 0.54 1150 +1152 4 39.76 65.63 3.9 0.54 1151 +1153 4 42.35 65.8 3.76 0.54 1152 +1154 4 45.1 66.44 3.64 0.54 1153 +1155 4 46.65 66.11 3.77 0.54 1154 +1156 4 49.09 64.29 3.45 0.54 1155 +1157 4 51.69 62.65 3.05 0.54 1156 +1158 4 53.37 63.12 2.94 0.54 1157 +1159 4 55.18 64.05 2.86 0.54 1158 +1160 4 62.55 62.92 2.23 0.54 1159 +1161 4 66.81 62.05 1.75 0.54 1160 +1162 4 69.42 61.89 1.79 0.54 1161 +1163 4 70.71 61.85 2.34 0.54 1162 +1164 4 71.95 60.62 2.34 0.54 1163 +1165 4 74.38 60.03 2.06 0.54 1164 +1166 4 76.51 60.05 1.87 0.54 1165 +1167 4 76.74 59.83 2.57 0.54 1166 +1168 4 78.33 59.47 3.22 0.54 1167 +1169 4 79.02 58.79 3.85 0.54 1168 +1170 4 79.24 58.56 4.57 0.54 1169 +1171 4 79.18 57.1 5.41 0.54 1170 +1172 4 78.9 56.15 5.64 0.54 1171 +1173 4 78.68 55.45 6.5 0.54 1172 +1174 4 78.42 55.1 6.94 0.54 1173 +1175 4 78.14 54.47 7.21 0.54 1174 +1176 4 -6.09 76.33 6.23 1.08 1129 +1177 4 -6.97 77.79 6.92 1.08 1176 +1178 4 -6.79 78.22 7.24 1.08 1177 +1179 4 -6.31 79.27 7.52 1.08 1178 +1180 4 -5.77 79.63 8.49 1.08 1179 +1181 4 -5.31 80.69 8.77 1.08 1180 +1182 4 -4.24 82.37 8.85 1.08 1181 +1183 4 -3.78 82.82 8.93 1.08 1182 +1184 4 -3.8 83.87 9.55 1.08 1183 +1185 4 -3.8 86.0 9.76 1.08 1184 +1186 4 -4.21 87.32 8.86 1.08 1185 +1187 4 -4.67 88.38 9.02 1.08 1186 +1188 4 -5.57 89.89 7.73 1.405 1187 +1189 4 -6.18 91.4 7.93 1.405 1188 +1190 4 -6.29 92.12 8.47 1.3 1189 +1191 4 -6.35 92.48 8.73 1.3 1190 +1192 4 -5.43 91.69 7.22 0.11 1191 +1193 4 -4.97 92.16 7.3 0.435 1192 +1194 4 -4.52 93.52 7.4 0.435 1193 +1195 4 -3.75 95.19 7.49 0.435 1194 +1196 4 -2.85 96.11 7.56 0.435 1195 +1197 4 -1.34 96.74 7.48 0.435 1196 +1198 4 -0.13 96.77 7.22 0.435 1197 +1199 4 1.04 97.42 6.81 0.435 1198 +1200 4 2.99 98.23 6.32 0.435 1199 +1201 4 4.03 99.03 6.08 0.435 1200 +1202 4 5.07 100.41 5.96 0.435 1201 +1203 4 6.42 101.2 5.77 0.435 1202 +1204 4 8.85 102.46 5.52 0.435 1203 +1205 4 9.2 103.02 4.48 0.435 1204 +1206 4 10.99 103.99 3.95 0.435 1205 +1207 4 12.96 105.69 3.94 0.435 1206 +1208 4 15.08 107.22 3.81 0.435 1207 +1209 4 16.37 108.09 2.95 0.435 1208 +1210 4 18.6 109.22 2.32 0.435 1209 +1211 4 21.77 110.34 1.91 0.435 1210 +1212 4 23.85 111.03 1.18 0.435 1211 +1213 4 26.71 111.84 0.7 0.435 1212 +1214 4 29.14 113.08 0.59 0.435 1213 +1215 4 31.56 113.73 0.21 0.435 1214 +1216 4 33.64 114.71 -0.4 0.435 1215 +1217 4 35.75 115.65 -0.58 0.435 1216 +1218 4 39.1 117.21 -0.74 0.435 1217 +1219 4 41.37 119.2 -0.75 0.435 1218 +1220 4 43.96 120.89 -0.83 0.435 1219 +1221 4 47.91 123.37 -0.95 0.435 1220 +1222 4 50.77 124.17 -1.29 0.435 1221 +1223 4 52.39 123.8 -2.23 0.435 1222 +1224 4 55.57 123.99 -2.59 0.435 1223 +1225 4 58.26 124.68 -3.29 0.435 1224 +1226 4 61.6 125.33 -3.62 0.435 1225 +1227 4 65.79 126.35 -4.59 0.435 1226 +1228 4 69.02 127.72 -6.04 0.435 1227 +1229 4 72.83 127.0 -6.53 0.435 1228 +1230 4 77.43 127.39 -7.0 0.435 1229 +1231 4 81.36 128.35 -7.33 0.435 1230 +1232 4 84.07 129.01 -7.82 0.435 1231 +1233 4 86.66 128.58 -8.11 0.435 1232 +1234 4 88.95 128.75 -8.3 0.435 1233 +1235 4 90.32 128.61 -8.44 0.435 1234 +1236 4 -6.92 93.64 8.6 1.3 1190 +1237 4 -6.7 94.03 9.3 1.3 1236 +1238 4 -7.6 95.22 9.65 1.3 1237 +1239 4 -8.01 95.74 9.74 1.3 1238 +1240 4 -6.77 95.72 9.93 0.435 1239 +1241 4 -6.3 95.85 10.13 0.435 1240 +1242 4 -5.99 96.17 10.13 0.435 1241 +1243 4 -5.56 96.37 9.72 0.435 1242 +1244 4 -5.11 96.52 9.7 0.435 1243 +1245 4 -3.65 97.2 9.02 0.435 1244 +1246 4 -3.22 96.78 8.64 0.435 1245 +1247 4 -1.59 96.69 7.95 0.435 1246 +1248 4 0.06 96.27 7.54 0.435 1247 +1249 4 0.75 95.59 6.65 0.435 1248 +1250 4 1.95 94.41 6.19 0.435 1249 +1251 4 3.43 93.55 5.52 0.435 1250 +1252 4 4.94 93.58 5.16 0.435 1251 +1253 4 6.69 93.67 4.25 0.435 1252 +1254 4 7.39 93.9 3.52 0.435 1253 +1255 4 7.55 94.05 1.94 0.435 1254 +1256 4 7.86 93.75 1.95 0.435 1255 +1257 4 8.62 93.6 1.87 0.435 1256 +1258 4 8.47 93.76 0.24 0.435 1257 +1259 4 8.55 93.69 -0.6 0.435 1258 +1260 4 8.65 93.28 -1.17 0.435 1259 +1261 4 8.86 93.09 -2.27 0.435 1260 +1262 4 9.6 92.98 -2.73 0.435 1261 +1263 4 10.35 92.85 -2.97 0.435 1262 +1264 4 11.04 93.07 -3.62 0.435 1263 +1265 4 12.22 92.49 0.75 0.435 1264 +1266 4 12.37 91.72 0.66 0.435 1265 +1267 4 12.64 91.46 0.24 0.435 1266 +1268 4 12.07 91.13 -1.02 0.435 1267 +1269 4 12.68 90.22 -1.24 0.435 1268 +1270 4 13.27 89.64 -1.58 0.435 1269 +1271 4 13.77 88.24 -2.98 0.435 1270 +1272 4 14.83 87.19 -3.25 0.435 1271 +1273 4 15.9 86.75 -3.39 0.435 1272 +1274 4 16.34 85.41 -3.71 0.435 1273 +1275 4 16.74 84.41 -4.6 0.435 1274 +1276 4 17.49 83.36 -4.85 0.435 1275 +1277 4 17.74 82.52 -5.71 0.435 1276 +1278 4 17.35 81.99 -6.48 0.435 1277 +1279 4 16.73 81.39 -6.71 0.435 1278 +1280 4 16.61 80.62 -8.14 0.435 1279 +1281 4 16.89 79.13 -8.68 0.435 1280 +1282 4 17.51 77.92 -8.85 0.435 1281 +1283 4 17.9 76.92 -9.67 0.435 1282 +1284 4 18.34 75.89 -10.12 0.435 1283 +1285 4 18.93 75.3 -10.39 0.435 1284 +1286 4 19.68 75.17 -10.54 0.435 1285 +1287 4 20.75 75.34 -10.7 0.435 1286 +1288 4 21.77 74.33 -11.35 0.435 1287 +1289 4 22.35 73.44 -11.79 0.435 1288 +1290 4 22.45 73.35 -12.41 0.435 1289 +1291 4 22.72 71.88 -13.03 0.435 1290 +1292 4 23.1 69.68 -14.19 0.435 1291 +1293 4 24.33 68.48 -14.42 0.435 1292 +1294 4 24.92 67.6 -14.79 0.435 1293 +1295 4 26.7 66.45 -15.59 0.435 1294 +1296 4 27.74 64.82 -16.14 0.435 1295 +1297 4 30.33 61.95 -16.75 0.435 1296 +1298 4 32.47 60.45 -17.09 0.435 1297 +1299 4 33.38 59.54 -17.26 0.435 1298 +1300 4 35.28 56.77 -18.68 0.435 1299 +1301 4 35.84 55.31 -19.42 0.435 1300 +1302 4 36.6 54.26 -19.66 0.435 1301 +1303 4 37.2 53.36 -19.88 0.435 1302 +1304 4 37.67 52.92 -19.97 0.435 1303 +1305 4 38.06 52.53 -20.8 0.435 1304 +1306 4 38.49 52.1 -21.18 0.435 1305 +1307 4 -8.0 96.22 10.54 1.3 1239 +1308 4 -8.91 97.42 10.82 1.3 1307 +1309 4 -10.54 98.52 11.08 1.3 1308 +1310 4 -11.37 99.05 12.03 0.54 1309 +1311 4 -12.45 99.8 12.2 0.54 1310 +1312 4 -13.21 100.55 12.35 0.54 1311 +1313 4 -14.17 100.6 11.92 0.54 1312 +1314 4 -15.54 101.05 12.01 0.54 1313 +1315 4 -16.17 102.27 12.04 0.54 1314 +1316 4 -17.05 103.14 12.59 0.54 1315 +1317 4 -19.02 105.37 13.29 0.54 1316 +1318 4 -19.32 106.29 13.4 0.54 1317 +1319 4 -19.78 107.34 13.55 0.54 1318 +1320 4 -20.55 109.01 13.79 0.54 1319 +1321 4 -20.8 108.95 14.41 0.54 1320 +1322 4 -21.56 109.39 14.52 0.54 1321 +1323 4 -22.61 109.53 14.7 0.54 1322 +1324 4 -23.57 109.86 14.45 0.54 1323 +1325 4 -24.08 110.37 13.94 0.54 1324 +1326 4 -23.72 112.15 13.02 0.54 1325 +1327 4 -24.34 112.46 13.03 0.54 1326 +1328 4 -25.41 113.81 13.26 0.54 1327 +1329 4 -26.93 116.54 13.67 0.54 1328 +1330 4 -27.6 119.31 13.54 0.54 1329 +1331 4 -27.31 120.86 13.51 0.54 1330 +1332 4 -26.83 122.22 12.17 0.54 1331 +1333 4 -27.15 123.13 12.22 0.54 1332 +1334 4 -28.01 125.51 11.47 0.54 1333 +1335 4 -27.85 127.77 10.24 0.54 1334 +1336 4 -28.01 129.17 8.65 0.54 1335 +1337 4 -28.25 130.01 7.85 0.54 1336 +1338 4 -29.16 130.9 8.1 0.54 1337 +1339 4 -30.38 132.72 8.38 0.54 1338 +1340 4 -30.99 133.33 6.83 0.54 1339 +1341 4 -32.18 136.02 6.0 0.54 1340 +1342 4 -33.32 138.37 5.49 0.54 1341 +1343 4 -33.63 140.51 5.67 0.54 1342 +1344 4 -35.17 143.23 6.07 0.54 1343 +1345 4 -35.5 145.38 6.08 0.54 1344 +1346 4 -35.76 148.97 5.47 0.54 1345 +1347 4 -35.49 152.03 5.45 0.54 1346 +1348 4 -35.46 155.97 4.54 0.54 1347 +1349 4 -36.39 158.7 4.9 0.54 1348 +1350 4 -37.16 162.49 5.33 0.54 1349 +1351 4 -38.67 165.51 4.26 0.54 1350 +1352 4 -40.46 167.59 3.49 0.54 1351 +1353 4 -40.73 169.07 2.37 0.54 1352 +1354 4 -41.1 170.05 1.83 0.54 1353 +1355 4 -42.23 171.76 1.5 0.54 1354 +1356 4 -43.65 173.48 1.26 0.54 1355 +1357 4 -44.41 174.23 1.4 0.54 1356 +1358 4 -44.59 175.64 -0.4 0.54 1357 +1359 4 -44.76 177.91 -0.16 0.54 1358 +1360 4 -44.15 180.04 -0.01 0.54 1359 +1361 4 -43.85 182.49 0.19 0.54 1360 +1362 4 -44.5 184.95 0.18 0.54 1361 +1363 4 -45.07 187.94 -0.59 0.54 1362 +1364 4 -44.92 190.53 -1.94 0.54 1363 +1365 4 -44.75 191.57 -0.05 0.54 1364 +1366 4 -45.06 191.87 -0.06 0.54 1365 +1367 4 -44.43 192.47 0.09 0.54 1366 +1368 4 -46.08 176.81 1.81 0.54 1357 +1369 4 -49.45 181.64 1.0 0.54 1368 +1370 4 -50.39 182.55 2.54 0.54 1369 +1371 4 -52.84 184.97 3.01 0.54 1370 +1372 4 -54.24 188.18 3.14 0.54 1371 +1373 4 -10.13 99.23 11.11 1.19 1309 +1374 4 -10.86 100.86 11.71 1.08 1373 +1375 4 -10.7 100.97 11.71 1.08 1374 +1376 4 -11.55 100.89 12.54 0.54 1375 +1377 4 -12.46 101.19 12.65 0.54 1376 +1378 4 -13.07 101.79 12.77 0.54 1377 +1379 4 -13.83 102.54 12.91 0.54 1378 +1380 4 -14.44 103.15 13.02 0.54 1379 +1381 4 -15.2 104.51 13.22 0.54 1380 +1382 4 -15.97 106.78 13.51 0.54 1381 +1383 4 -15.22 108.15 13.58 0.54 1382 +1384 4 -15.22 109.07 13.67 0.54 1383 +1385 4 -15.45 110.22 12.9 0.54 1384 +1386 4 -16.38 111.13 13.0 0.54 1385 +1387 4 -17.15 112.5 13.2 0.54 1386 +1388 4 -18.07 114.61 13.5 0.54 1387 +1389 4 -18.84 116.58 13.76 0.54 1388 +1390 4 -19.91 119.16 14.11 0.54 1389 +1391 4 -20.09 122.07 14.18 0.54 1390 +1392 4 -20.92 123.8 13.74 0.54 1391 +1393 4 -21.25 125.64 13.81 0.54 1392 +1394 4 -22.16 128.37 14.07 0.54 1393 +1395 4 -23.4 130.48 14.39 0.54 1394 +1396 4 -24.92 133.22 14.8 0.54 1395 +1397 4 -26.92 135.79 15.17 0.54 1396 +1398 4 -29.09 138.84 15.37 0.54 1397 +1399 4 -29.71 140.97 15.55 0.54 1398 +1400 4 -31.13 144.79 15.68 0.54 1399 +1401 4 -31.29 147.39 15.86 0.54 1400 +1402 4 -32.47 150.38 15.14 0.54 1401 +1403 4 -33.09 152.81 15.43 0.54 1402 +1404 4 -32.94 154.79 15.61 0.54 1403 +1405 4 -34.16 155.99 15.84 0.54 1404 +1406 4 -35.44 156.94 15.45 0.54 1405 +1407 4 -36.97 157.54 15.58 0.54 1406 +1408 4 -38.05 158.61 15.78 0.54 1407 +1409 4 -38.2 160.89 16.01 0.54 1408 +1410 4 -39.55 162.96 16.26 0.54 1409 +1411 4 -39.86 165.09 16.5 0.54 1410 +1412 4 -40.93 167.05 16.78 0.54 1411 +1413 4 -42.35 169.06 16.59 0.54 1412 +1414 4 -43.42 171.33 16.91 0.54 1413 +1415 4 -44.51 173.92 17.18 0.54 1414 +1416 4 -44.51 175.75 17.36 0.54 1415 +1417 4 -45.66 179.31 16.98 0.54 1416 +1418 4 -46.89 181.43 17.31 0.54 1417 +1419 4 -48.12 185.38 17.72 0.54 1418 +1420 4 -48.44 189.33 18.14 0.54 1419 +1421 4 -49.21 191.61 18.43 0.54 1420 +1422 4 -49.37 193.89 18.67 0.54 1421 +1423 4 -48.8 196.05 18.52 0.54 1422 +1424 4 -48.59 197.98 17.64 0.54 1423 +1425 4 -49.06 199.95 17.8 0.54 1424 +1426 4 -49.67 201.17 17.98 0.54 1425 +1427 4 -49.29 205.94 17.8 0.54 1426 +1428 4 -50.12 208.29 17.43 0.54 1427 +1429 4 -50.05 209.74 16.66 0.54 1428 +1430 4 -50.52 211.72 16.81 0.54 1429 +1431 4 -51.59 214.3 17.16 0.54 1430 +1432 4 -51.95 216.77 16.99 0.54 1431 +1433 4 -51.85 218.19 16.59 0.54 1432 +1434 4 -51.41 220.79 16.73 0.54 1433 +1435 4 -51.44 221.73 16.52 0.54 1434 +1436 4 -51.19 223.31 16.04 0.54 1435 +1437 4 -10.4 102.22 11.88 1.08 1375 +1438 4 -9.64 102.99 11.89 1.08 1437 +1439 4 -8.89 104.97 12.08 1.08 1438 +1440 4 -8.74 106.95 12.26 1.08 1439 +1441 4 -8.24 109.18 12.96 0.975 1440 +1442 4 -7.33 111.62 13.19 0.975 1441 +1443 4 -7.03 112.84 13.28 0.975 1442 +1444 4 -6.11 112.65 14.32 0.65 1443 +1445 4 -5.35 112.5 14.23 0.65 1444 +1446 4 -4.89 112.05 14.15 0.65 1445 +1447 4 -5.04 110.98 14.06 0.65 1446 +1448 4 -4.58 109.62 13.89 0.435 1447 +1449 4 -3.51 108.26 13.65 0.435 1448 +1450 4 -2.19 106.34 12.81 0.435 1449 +1451 4 -1.4 105.26 12.86 0.435 1450 +1452 4 -0.76 104.63 13.11 0.54 1451 +1453 4 0.21 103.36 13.59 0.54 1452 +1454 4 0.57 102.09 13.96 0.54 1453 +1455 4 1.41 100.65 14.64 0.54 1454 +1456 4 1.88 99.27 14.47 0.54 1455 +1457 4 2.21 98.33 14.65 0.54 1456 +1458 4 2.57 97.38 15.13 0.54 1457 +1459 4 2.89 96.46 15.08 0.54 1458 +1460 4 3.2 95.23 15.0 0.54 1459 +1461 4 3.81 94.63 14.89 0.54 1460 +1462 4 5.05 92.81 14.75 0.54 1461 +1463 4 5.54 92.32 14.96 0.54 1462 +1464 4 6.32 90.95 14.91 0.54 1463 +1465 4 6.78 89.56 14.89 0.54 1464 +1466 4 7.3 88.75 15.36 0.54 1465 +1467 4 7.46 88.3 15.37 0.54 1466 +1468 4 -7.18 114.81 13.56 0.975 1443 +1469 4 -8.4 116.92 13.89 0.975 1468 +1470 4 -9.63 119.35 14.24 0.975 1469 +1471 4 -11.16 122.06 14.65 0.975 1470 +1472 4 -11.68 123.48 15.96 0.975 1471 +1473 4 -12.43 124.23 16.1 0.975 1472 +1474 4 -12.83 124.88 16.2 0.975 1473 +1475 4 -12.98 124.12 14.48 0.54 1474 +1476 4 -13.43 123.36 14.45 0.54 1475 +1477 4 -13.12 122.14 14.29 0.54 1476 +1478 4 -12.82 121.54 14.21 0.435 1477 +1479 4 -13.12 120.02 14.09 0.435 1478 +1480 4 -13.12 119.41 14.03 0.435 1479 +1481 4 -13.11 118.19 13.92 0.435 1480 +1482 4 -13.12 116.97 13.79 0.435 1481 +1483 4 -12.96 116.52 13.73 0.435 1482 +1484 4 -12.65 115.62 13.62 0.435 1483 +1485 4 -12.49 115.15 13.56 0.435 1484 +1486 4 -13.5 126.51 16.42 0.975 1474 +1487 4 -14.27 128.76 16.8 0.975 1486 +1488 4 -14.12 131.35 17.03 0.975 1487 +1489 4 -13.67 132.73 17.12 0.975 1488 +1490 4 -12.92 135.01 17.28 0.975 1489 +1491 4 -13.22 136.23 17.43 1.08 1490 +1492 4 -13.7 139.11 17.76 1.08 1491 +1493 4 -13.55 141.09 17.93 1.08 1492 +1494 4 -14.31 142.46 18.13 1.08 1493 +1495 4 -15.08 144.43 18.4 1.08 1494 +1496 4 -15.85 146.39 18.66 1.08 1495 +1497 4 -16.31 147.77 18.84 1.08 1496 +1498 4 -16.16 150.04 19.05 1.08 1497 +1499 4 -14.95 150.66 19.0 1.08 1498 +1500 4 -13.58 151.74 18.97 1.08 1499 +1501 4 -13.12 152.8 19.03 1.08 1500 +1502 4 -12.97 154.78 19.29 1.08 1501 +1503 4 -11.31 158.28 19.47 1.08 1502 +1504 4 -11.32 162.24 19.86 1.08 1503 +1505 4 -10.83 162.78 19.87 1.08 1504 +1506 4 -11.36 162.68 20.73 0.65 1505 +1507 4 -11.81 163.75 20.88 0.65 1506 +1508 4 -12.24 164.17 21.34 0.65 1507 +1509 4 -12.68 164.59 21.64 0.65 1508 +1510 4 -13.29 164.59 21.63 0.65 1509 +1511 4 -13.7 165.61 22.23 0.65 1510 +1512 4 -14.28 166.17 22.79 0.65 1511 +1513 4 -14.49 166.37 23.89 0.65 1512 +1514 4 -14.78 168.17 24.39 0.65 1513 +1515 4 -15.17 169.17 23.53 0.435 1514 +1516 4 -15.63 170.83 23.82 0.435 1515 +1517 4 -15.93 172.06 22.23 0.435 1516 +1518 4 -16.16 172.88 21.58 0.435 1517 +1519 4 -16.22 174.47 21.2 0.435 1518 +1520 4 -16.27 176.03 20.83 0.54 1519 +1521 4 -16.43 178.01 21.05 0.54 1520 +1522 4 -16.93 179.72 20.8 0.54 1521 +1523 4 -17.55 181.55 20.96 0.54 1522 +1524 4 -18.77 183.36 21.25 0.54 1523 +1525 4 -18.47 185.5 21.43 0.54 1524 +1526 4 -17.72 187.48 21.55 0.54 1525 +1527 4 -18.03 189.0 21.73 0.54 1526 +1528 4 -19.3 191.46 21.63 0.54 1527 +1529 4 -18.91 193.2 21.09 0.54 1528 +1530 4 -18.65 195.37 20.9 0.54 1529 +1531 4 -18.39 198.45 20.79 0.54 1530 +1532 4 -19.05 201.54 20.63 0.54 1531 +1533 4 -19.92 203.6 19.93 0.54 1532 +1534 4 -20.71 205.91 19.86 0.54 1533 +1535 4 -21.75 208.16 18.88 0.54 1534 +1536 4 -21.61 209.84 18.95 0.54 1535 +1537 4 -22.45 211.58 18.37 0.54 1536 +1538 4 -24.56 213.98 17.36 0.54 1537 +1539 4 -26.24 215.33 17.65 0.54 1538 +1540 4 -27.77 216.85 17.94 0.54 1539 +1541 4 -29.3 218.97 18.28 0.54 1540 +1542 4 -31.19 220.23 17.83 0.54 1541 +1543 4 -33.94 222.94 18.35 0.54 1542 +1544 4 -35.63 224.61 18.58 0.54 1543 +1545 4 -36.53 226.41 17.41 0.54 1544 +1546 4 -37.71 229.4 16.6 0.54 1545 +1547 4 -38.66 230.29 16.7 0.54 1546 +1548 4 -39.74 231.03 16.87 0.54 1547 +1549 4 -40.73 232.02 16.22 0.54 1548 +1550 4 -40.98 234.4 15.51 0.54 1549 +1551 4 -41.28 237.74 14.26 0.54 1550 +1552 4 -42.13 239.8 13.65 0.54 1551 +1553 4 -41.6 241.71 12.87 0.54 1552 +1554 4 -41.19 243.74 12.65 0.54 1553 +1555 4 -41.33 245.7 11.34 0.54 1554 +1556 4 -42.81 248.37 10.68 0.54 1555 +1557 4 -43.38 251.37 9.9 0.54 1556 +1558 4 -44.94 256.24 10.29 0.54 1557 +1559 4 -45.75 259.78 10.26 0.54 1558 +1560 4 -46.31 261.56 9.27 0.54 1559 +1561 4 -46.66 264.63 9.37 0.54 1560 +1562 4 -46.86 266.34 9.03 0.54 1561 +1563 4 -47.79 269.09 9.24 0.54 1562 +1564 4 -48.3 273.22 9.38 0.54 1563 +1565 4 -48.53 275.89 8.76 0.54 1564 +1566 4 -49.27 277.53 8.83 0.54 1565 +1567 4 -11.65 164.37 20.09 1.08 1505 +1568 4 -11.89 164.43 20.12 1.08 1567 +1569 4 -11.64 167.11 20.37 1.08 1568 +1570 4 -11.65 169.85 20.63 0.865 1569 +1571 4 -11.81 173.65 21.02 0.865 1570 +1572 4 -11.53 177.92 21.41 0.865 1571 +1573 4 -11.39 180.56 21.73 0.975 1572 +1574 4 -10.79 183.0 21.92 0.975 1573 +1575 4 -10.02 185.58 22.09 0.975 1574 +1576 4 -9.42 188.02 22.28 0.975 1575 +1577 4 -11.12 192.11 22.84 0.975 1576 +1578 4 -11.1 193.92 23.23 0.975 1577 +1579 4 -12.33 196.94 23.64 0.975 1578 +1580 4 -13.26 199.97 24.02 0.975 1579 +1581 4 -13.87 202.4 24.39 1.08 1580 +1582 4 -13.72 205.59 24.7 1.08 1581 +1583 4 -13.93 207.02 24.32 1.08 1582 +1584 4 -12.94 206.93 25.95 0.54 1583 +1585 4 -12.18 207.4 25.86 0.54 1584 +1586 4 -11.91 207.12 27.17 0.54 1585 +1587 4 -10.96 207.38 27.57 0.54 1586 +1588 4 -9.48 207.43 28.64 0.65 1587 +1589 4 -8.25 208.04 28.81 0.65 1588 +1590 4 -6.69 208.91 29.13 0.65 1589 +1591 4 -4.35 209.96 29.62 0.65 1590 +1592 4 -1.76 211.63 29.7 0.65 1591 +1593 4 1.57 213.79 29.6 0.65 1592 +1594 4 5.23 215.65 29.52 0.65 1593 +1595 4 8.0 217.15 29.86 0.65 1594 +1596 4 9.85 218.04 30.15 0.65 1595 +1597 4 10.79 218.33 30.33 0.65 1596 +1598 4 12.77 219.72 30.28 0.65 1597 +1599 4 14.44 221.11 30.33 0.65 1598 +1600 4 15.07 222.0 29.01 0.65 1599 +1601 4 15.08 221.98 29.16 0.65 1600 +1602 4 15.85 222.44 29.13 0.65 1601 +1603 4 15.8 222.5 28.61 0.65 1602 +1604 4 16.63 222.9 27.66 0.65 1603 +1605 4 16.85 223.59 26.8 0.65 1604 +1606 4 17.56 224.1 26.26 0.65 1605 +1607 4 17.52 224.53 26.3 0.65 1606 +1608 4 18.05 224.3 27.14 0.54 1607 +1609 4 18.36 224.0 27.0 0.54 1608 +1610 4 18.75 223.6 27.91 0.54 1609 +1611 4 19.28 223.68 28.78 0.54 1610 +1612 4 19.95 223.62 29.31 0.54 1611 +1613 4 20.91 223.89 29.78 0.54 1612 +1614 4 21.74 224.28 30.42 0.54 1613 +1615 4 22.2 224.73 30.51 0.54 1614 +1616 4 22.58 224.35 31.34 0.54 1615 +1617 4 22.5 225.33 32.27 0.54 1616 +1618 4 22.65 226.7 32.39 0.54 1617 +1619 4 22.5 227.76 32.58 0.54 1618 +1620 4 22.13 228.12 33.63 0.54 1619 +1621 4 21.74 228.49 34.46 0.54 1620 +1622 4 22.51 230.77 34.77 0.435 1621 +1623 4 23.87 233.07 34.86 0.435 1622 +1624 4 24.09 234.37 35.65 0.435 1623 +1625 4 23.78 237.4 36.05 0.435 1624 +1626 4 23.93 239.37 36.31 0.435 1625 +1627 4 24.38 241.05 36.42 0.435 1626 +1628 4 24.35 243.21 36.34 0.435 1627 +1629 4 24.32 245.05 36.3 0.435 1628 +1630 4 24.27 248.13 36.29 0.435 1629 +1631 4 24.72 251.63 36.53 0.435 1630 +1632 4 25.42 255.5 36.24 0.435 1631 +1633 4 25.34 256.48 35.58 0.435 1632 +1634 4 24.67 258.68 35.17 0.435 1633 +1635 4 25.39 260.99 35.03 0.435 1634 +1636 4 26.22 264.73 34.48 0.435 1635 +1637 4 27.38 266.0 34.05 0.435 1636 +1638 4 28.74 268.61 34.1 0.435 1637 +1639 4 27.51 271.35 34.41 0.435 1638 +1640 4 26.51 273.54 33.88 0.54 1639 +1641 4 25.68 274.37 33.29 0.54 1640 +1642 4 25.67 275.29 33.3 0.54 1641 +1643 4 24.52 224.25 32.36 0.54 1616 +1644 4 25.58 225.03 32.34 0.54 1643 +1645 4 26.86 225.88 32.98 0.54 1644 +1646 4 27.65 227.83 33.4 0.54 1645 +1647 4 27.64 230.27 33.72 0.54 1646 +1648 4 27.35 231.76 34.04 0.54 1647 +1649 4 28.88 232.96 34.32 0.54 1648 +1650 4 29.8 233.58 34.3 0.54 1649 +1651 4 30.74 234.17 34.64 0.54 1650 +1652 4 31.12 234.08 35.5 0.54 1651 +1653 4 32.67 234.68 35.64 0.54 1652 +1654 4 35.62 235.72 36.07 0.54 1653 +1655 4 36.39 236.46 36.23 0.54 1654 +1656 4 36.88 238.11 36.8 0.54 1655 +1657 4 37.07 240.02 37.57 0.54 1656 +1658 4 38.75 242.32 37.72 0.54 1657 +1659 4 40.57 244.76 37.86 0.54 1658 +1660 4 42.41 245.96 38.05 0.54 1659 +1661 4 46.98 248.44 37.87 0.54 1660 +1662 4 50.48 250.76 37.84 0.54 1661 +1663 4 53.24 252.27 38.04 0.54 1662 +1664 4 55.08 252.88 38.08 0.54 1663 +1665 4 56.44 253.65 38.02 0.54 1664 +1666 4 58.12 254.42 38.02 0.54 1665 +1667 4 59.18 255.19 38.0 0.54 1666 +1668 4 19.34 225.08 25.73 0.435 1607 +1669 4 21.17 226.01 25.66 0.435 1668 +1670 4 22.34 226.98 25.19 0.435 1669 +1671 4 23.82 227.94 24.69 0.54 1670 +1672 4 26.39 231.16 24.77 0.54 1671 +1673 4 28.48 232.75 24.27 0.54 1672 +1674 4 30.77 232.92 24.09 0.54 1673 +1675 4 32.74 232.18 23.83 0.54 1674 +1676 4 36.09 232.51 23.55 0.54 1675 +1677 4 38.92 233.14 23.2 0.435 1676 +1678 4 43.64 234.84 22.93 0.435 1677 +1679 4 47.43 237.48 22.84 0.435 1678 +1680 4 49.28 238.68 21.43 0.54 1679 +1681 4 51.85 241.3 21.44 0.54 1680 +1682 4 53.21 245.11 21.69 0.54 1681 +1683 4 53.26 248.1 20.92 0.54 1682 +1684 4 53.55 250.24 21.03 0.54 1683 +1685 4 55.83 253.76 21.16 0.54 1684 +1686 4 57.48 256.67 21.29 0.54 1685 +1687 4 57.79 257.58 21.36 0.54 1686 +1688 4 57.93 261.07 21.68 0.54 1687 +1689 4 59.6 263.37 21.75 0.54 1688 +1690 4 60.48 264.32 21.46 0.54 1689 +1691 4 62.1 265.14 20.85 0.54 1690 +1692 4 63.89 264.6 20.18 0.54 1691 +1693 4 65.71 264.63 20.01 0.54 1692 +1694 4 -14.08 209.9 24.62 1.08 1583 +1695 4 -13.95 213.4 24.94 1.08 1694 +1696 4 -13.35 216.14 25.16 1.08 1695 +1697 4 -13.66 218.28 25.39 1.08 1696 +1698 4 -15.03 220.84 25.77 1.08 1697 +1699 4 -16.41 222.8 26.09 1.08 1698 +1700 4 -17.17 224.47 26.32 1.08 1699 +1701 4 -17.34 227.36 26.62 1.08 1700 +1702 4 -17.19 231.16 26.98 1.08 1701 +1703 4 -16.75 234.36 27.25 1.08 1702 +1704 4 -17.18 237.23 26.29 1.08 1703 +1705 4 -17.48 239.02 26.71 1.08 1704 +1706 4 -18.11 240.86 26.64 1.08 1705 +1707 4 -18.39 242.66 25.57 1.08 1706 +1708 4 -19.02 243.14 26.35 0.65 1707 +1709 4 -20.33 243.83 25.56 0.65 1708 +1710 4 -21.29 244.15 26.89 0.65 1709 +1711 4 -21.74 243.98 28.65 0.65 1710 +1712 4 -23.19 244.51 29.59 0.65 1711 +1713 4 -26.02 245.48 30.62 0.65 1712 +1714 4 -27.69 246.81 31.06 0.65 1713 +1715 4 -30.05 248.52 32.35 0.65 1714 +1716 4 -31.28 249.74 32.58 0.65 1715 +1717 4 -32.6 251.04 33.28 0.65 1716 +1718 4 -34.58 253.61 33.8 0.65 1717 +1719 4 -36.41 254.2 34.03 0.65 1718 +1720 4 -39.15 255.38 34.46 0.65 1719 +1721 4 -41.74 257.03 34.86 0.65 1720 +1722 4 -44.48 258.52 35.26 0.65 1721 +1723 4 -46.01 260.03 35.63 0.54 1722 +1724 4 -47.21 260.01 35.74 0.54 1723 +1725 4 -49.35 261.21 36.12 0.54 1724 +1726 4 -51.02 263.16 36.47 0.54 1725 +1727 4 -53.63 266.04 36.99 0.54 1726 +1728 4 -56.67 268.74 37.53 0.54 1727 +1729 4 -58.05 271.32 37.92 0.54 1728 +1730 4 -59.43 274.2 38.32 0.54 1729 +1731 4 -60.5 276.46 38.65 0.54 1730 +1732 4 -61.58 279.35 39.02 0.54 1731 +1733 4 -63.56 280.08 39.28 0.54 1732 +1734 4 -65.24 281.44 39.56 0.54 1733 +1735 4 -67.53 283.39 39.97 0.54 1734 +1736 4 -68.7 284.54 40.79 0.54 1735 +1737 4 -70.06 287.11 41.25 0.54 1736 +1738 4 -70.49 288.73 41.9 0.54 1737 +1739 4 -70.46 290.23 42.35 0.54 1738 +1740 4 -69.8 290.77 43.02 0.54 1739 +1741 4 -69.26 291.15 43.84 0.54 1740 +1742 4 -70.31 292.18 44.26 0.54 1741 +1743 4 -71.52 293.38 44.64 0.54 1742 +1744 4 -71.68 295.35 44.85 0.54 1743 +1745 4 -71.81 296.69 45.29 0.54 1744 +1746 4 -73.02 297.58 45.64 0.54 1745 +1747 4 -74.21 297.85 46.0 0.54 1746 +1748 4 -75.86 299.17 46.58 0.54 1747 +1749 4 -76.45 299.76 46.92 0.54 1748 +1750 4 -77.45 300.75 47.79 0.54 1749 +1751 4 -77.62 301.18 49.51 0.54 1750 +1752 4 -78.53 301.79 49.65 0.54 1751 +1753 4 -78.86 302.11 51.08 0.54 1752 +1754 4 -79.29 302.22 51.51 0.54 1753 +1755 4 -17.79 245.71 25.81 1.08 1707 +1756 4 -17.95 247.99 26.05 1.08 1755 +1757 4 -17.21 249.38 25.88 1.08 1756 +1758 4 -16.46 251.67 26.03 1.08 1757 +1759 4 -16.93 253.35 26.17 1.08 1758 +1760 4 -18.15 255.17 26.46 1.08 1759 +1761 4 -19.82 258.34 25.41 1.08 1760 +1762 4 -20.59 260.91 25.73 1.08 1761 +1763 4 -20.91 263.96 26.06 1.08 1762 +1764 4 -20.63 268.83 26.42 1.08 1763 +1765 4 -20.07 271.27 26.55 1.19 1764 +1766 4 -19.33 274.16 26.75 1.19 1765 +1767 4 -19.33 275.38 26.88 1.19 1766 +1768 4 -19.12 276.58 28.11 0.865 1767 +1769 4 -19.42 278.11 28.28 0.865 1768 +1770 4 -19.72 279.01 28.47 0.865 1769 +1771 4 -20.34 279.62 28.51 0.865 1770 +1772 4 -20.67 280.85 30.11 0.865 1771 +1773 4 -21.56 281.73 30.43 0.865 1772 +1774 4 -21.99 283.36 31.15 0.865 1773 +1775 4 -23.18 284.53 31.67 0.865 1774 +1776 4 -23.79 286.34 31.99 0.865 1775 +1777 4 -25.13 287.66 32.62 0.865 1776 +1778 4 -26.51 289.01 32.88 0.865 1777 +1779 4 -27.87 291.27 33.3 0.865 1778 +1780 4 -28.64 293.86 33.63 0.865 1779 +1781 4 -28.65 296.29 33.86 0.865 1780 +1782 4 -28.8 298.55 34.24 0.865 1781 +1783 4 -28.79 300.07 34.47 0.865 1782 +1784 4 -30.47 303.85 35.07 0.865 1783 +1785 4 -31.85 307.03 35.51 0.865 1784 +1786 4 -32.63 310.21 35.89 0.865 1785 +1787 4 -34.3 312.78 36.3 0.865 1786 +1788 4 -36.6 315.05 36.73 0.865 1787 +1789 4 -37.54 315.89 37.05 0.865 1788 +1790 4 -38.92 318.77 37.46 0.865 1789 +1791 4 -40.3 321.64 37.86 0.865 1790 +1792 4 -42.89 323.29 38.26 0.865 1791 +1793 4 -44.42 326.01 38.68 0.865 1792 +1794 4 -46.11 329.51 39.17 0.865 1793 +1795 4 -47.21 332.39 40.99 0.865 1794 +1796 4 -47.72 334.12 40.59 0.865 1795 +1797 4 -48.34 335.36 38.88 0.865 1796 +1798 4 -49.4 337.62 37.77 0.865 1797 +1799 4 -50.47 338.68 37.9 0.865 1798 +1800 4 -52.63 341.41 38.28 0.865 1799 +1801 4 -54.76 344.73 38.8 0.865 1800 +1802 4 -55.43 349.03 38.75 0.865 1801 +1803 4 -55.94 352.55 38.84 0.865 1802 +1804 4 -55.08 356.27 38.6 0.865 1803 +1805 4 -54.71 359.25 37.95 0.865 1804 +1806 4 -55.34 362.0 38.2 0.865 1805 +1807 4 -54.82 365.14 37.47 0.865 1806 +1808 4 -53.38 368.86 36.95 0.865 1807 +1809 4 -52.37 372.41 36.67 0.865 1808 +1810 4 -51.94 375.04 35.07 0.865 1809 +1811 4 -50.47 378.74 34.92 0.865 1810 +1812 4 -49.98 381.91 33.91 0.865 1811 +1813 4 -50.57 382.78 32.75 0.865 1812 +1814 4 -51.17 383.99 32.93 0.865 1813 +1815 4 -51.52 384.33 32.99 0.435 1814 +1816 4 -51.82 384.93 33.08 0.865 1815 +1817 4 -51.5 387.06 31.89 0.865 1816 +1818 4 -51.65 388.73 32.07 0.865 1817 +1819 4 -52.87 389.93 32.3 0.865 1818 +1820 4 -54.06 390.8 31.21 0.865 1819 +1821 4 -55.81 392.23 30.67 0.865 1820 +1822 4 -55.97 393.0 30.69 0.865 1821 +1823 4 -56.94 395.16 30.47 0.865 1822 +1824 4 -57.4 396.54 30.57 0.865 1823 +1825 4 -57.73 398.37 30.7 1.3 1824 +1826 4 -57.88 400.03 30.89 0.975 1825 +1827 4 -58.48 403.06 29.79 0.975 1826 +1828 4 -58.77 404.3 29.93 0.975 1827 +1829 4 -59.79 404.09 30.46 0.54 1828 +1830 4 -61.01 403.47 30.52 0.54 1829 +1831 4 -62.07 403.92 30.66 0.54 1830 +1832 4 -63.75 404.36 30.86 0.54 1831 +1833 4 -65.44 405.12 31.02 0.54 1832 +1834 4 -66.97 405.74 29.4 0.54 1833 +1835 4 -68.34 407.08 29.66 0.54 1834 +1836 4 -69.56 408.3 29.89 0.54 1835 +1837 4 -70.93 408.73 30.06 0.54 1836 +1838 4 -72.2 409.67 29.88 0.54 1837 +1839 4 -72.78 409.97 28.45 0.54 1838 +1840 4 -73.63 409.59 27.59 0.54 1839 +1841 4 -74.09 409.46 25.81 0.54 1840 +1842 4 -74.35 409.11 24.59 0.54 1841 +1843 4 -74.54 408.99 24.21 0.54 1842 +1844 4 -74.69 408.54 24.18 0.54 1843 +1845 4 -58.94 404.74 29.92 0.975 1828 +1846 4 -58.5 407.04 30.03 0.975 1845 +1847 4 -58.83 408.88 28.42 0.975 1846 +1848 4 -59.16 410.74 26.67 0.975 1847 +1849 4 -60.12 411.68 26.4 0.975 1848 +1850 4 -62.36 413.31 25.56 0.975 1849 +1851 4 -63.03 415.56 24.85 0.975 1850 +1852 4 -63.49 417.54 25.08 0.865 1851 +1853 4 -64.8 419.45 24.42 0.865 1852 +1854 4 -64.81 420.98 22.83 0.865 1853 +1855 4 -64.64 422.34 21.5 0.865 1854 +1856 4 -64.51 423.12 21.34 0.865 1855 +1857 4 -64.07 423.6 21.2 0.865 1856 +1858 4 -64.23 425.88 19.85 0.865 1857 +1859 4 -64.97 427.53 18.64 0.865 1858 +1860 4 -64.91 430.2 17.92 0.865 1859 +1861 4 -65.28 432.71 15.85 0.865 1860 +1862 4 -65.7 433.72 16.59 0.865 1861 +1863 4 -66.37 435.91 16.1 0.865 1862 +1864 4 -66.93 437.69 15.27 0.865 1863 +1865 4 -67.17 439.14 14.53 0.865 1864 +1866 4 -68.16 439.81 13.86 0.865 1865 +1867 4 -69.28 441.53 13.6 0.865 1866 +1868 4 -70.9 442.84 12.82 0.865 1867 +1869 4 -71.75 444.29 12.06 0.865 1868 +1870 4 -72.49 445.63 10.97 0.865 1869 +1871 4 -73.83 446.97 9.79 0.865 1870 +1872 4 -74.39 448.11 9.04 0.865 1871 +1873 4 -75.42 449.76 7.94 0.865 1872 +1874 4 -75.89 450.83 8.01 0.865 1873 +1875 4 -77.1 451.73 8.21 0.865 1874 +1876 4 -78.48 453.7 8.46 0.865 1875 +1877 4 -79.04 456.07 7.75 0.865 1876 +1878 4 -77.54 459.43 7.94 0.865 1877 +1879 4 -75.96 462.44 7.03 0.865 1878 +1880 4 -75.44 465.57 6.45 0.865 1879 +1881 4 -75.68 468.54 5.86 0.865 1880 +1882 4 -75.19 470.47 4.87 0.865 1881 +1883 4 -74.8 472.53 4.29 0.865 1882 +1884 4 -74.42 474.28 3.66 0.865 1883 +1885 4 -74.74 475.39 3.8 0.865 1884 +1886 4 -75.42 475.77 3.06 0.435 1885 +1887 4 -75.88 476.23 3.15 0.435 1886 +1888 4 -76.82 476.55 2.96 0.435 1887 +1889 4 -77.28 476.1 2.81 0.435 1888 +1890 4 -77.61 476.43 2.65 0.54 1889 +1891 4 -79.59 477.17 2.91 0.54 1890 +1892 4 -79.9 478.69 3.08 0.54 1891 +1893 4 -80.67 479.16 1.38 0.54 1892 +1894 4 -81.7 479.26 0.28 0.54 1893 +1895 4 -82.29 479.55 -1.07 0.54 1894 +1896 4 -82.72 479.38 -2.55 0.54 1895 +1897 4 -83.65 479.7 -2.52 0.54 1896 +1898 4 -85.11 480.23 -3.31 0.54 1897 +1899 4 -85.96 480.46 -4.12 0.54 1898 +1900 4 -86.59 481.1 -4.37 0.54 1899 +1901 4 -87.51 481.41 -5.92 0.54 1900 +1902 4 -87.66 481.58 -7.71 0.54 1901 +1903 4 -88.41 482.0 -8.96 0.54 1902 +1904 4 -89.13 482.72 -10.02 0.54 1903 +1905 4 -89.85 483.45 -11.17 0.54 1904 +1906 4 -73.88 475.57 3.05 0.865 1885 +1907 4 -73.79 477.62 2.57 0.865 1906 +1908 4 -73.62 479.27 1.28 0.865 1907 +1909 4 -74.82 481.66 0.33 0.865 1908 +1910 4 -74.93 483.61 -0.73 0.865 1909 +1911 4 -74.02 485.14 -0.67 0.865 1910 +1912 4 -72.32 487.12 -1.93 0.865 1911 +1913 4 -71.11 490.18 -3.4 0.865 1912 +1914 4 -71.5 492.69 -4.03 0.865 1913 +1915 4 -71.93 494.64 -5.08 0.865 1914 +1916 4 -71.81 496.33 -5.15 0.865 1915 +1917 4 -72.31 498.87 -6.06 0.865 1916 +1918 4 -71.64 499.73 -7.03 0.865 1917 +1919 4 -70.64 503.6 -7.28 0.865 1918 +1920 4 -69.15 505.47 -7.6 0.865 1919 +1921 4 -69.42 508.16 -8.46 0.865 1920 +1922 4 -70.29 509.94 -9.33 0.865 1921 +1923 4 -70.46 511.32 -9.41 0.865 1922 +1924 4 -70.53 513.51 -9.87 0.865 1923 +1925 4 -70.27 516.0 -10.1 0.865 1924 +1926 4 -71.33 518.26 -11.23 0.865 1925 +1927 4 -71.95 520.08 -11.07 0.865 1926 +1928 4 -72.93 522.29 -11.58 0.865 1927 +1929 4 -73.88 523.83 -13.25 0.865 1928 +1930 4 -73.89 525.66 -13.14 0.865 1929 +1931 4 -73.9 529.32 -14.44 0.865 1930 +1932 4 -73.97 529.39 -15.19 0.865 1931 +1933 4 -73.61 531.16 -16.03 0.865 1932 +1934 4 -73.7 533.69 -16.76 0.865 1933 +1935 4 -73.7 535.51 -18.1 0.865 1934 +1936 4 -73.96 537.29 -19.03 0.865 1935 +1937 4 -74.53 539.99 -19.92 0.865 1936 +1938 4 -74.15 542.65 -20.53 0.865 1937 +1939 4 -72.95 545.1 -20.4 0.865 1938 +1940 4 -72.42 548.52 -20.86 0.865 1939 +1941 4 -71.81 551.27 -22.32 0.865 1940 +1942 4 -70.81 554.24 -22.81 0.865 1941 +1943 4 -70.18 556.94 -23.82 0.865 1942 +1944 4 -68.51 558.96 -25.51 0.865 1943 +1945 4 -67.91 560.48 -25.41 0.865 1944 +1946 4 -66.61 561.93 -26.07 0.865 1945 +1947 4 -65.91 563.36 -26.6 0.865 1946 +1948 4 -65.22 566.04 -27.24 0.865 1947 +1949 4 -65.31 567.95 -27.88 0.865 1948 +1950 4 -65.54 570.59 -28.28 0.865 1949 +1951 4 -66.56 574.04 -28.98 0.865 1950 +1952 4 -67.53 578.34 -29.0 0.865 1951 +1953 4 -68.36 581.65 -28.75 0.865 1952 +1954 4 -68.66 585.6 -28.34 0.865 1953 +1955 4 -68.84 588.5 -28.19 0.865 1954 +1956 4 -69.31 591.09 -27.98 0.865 1955 +1957 4 -70.14 594.33 -28.18 0.865 1956 +1958 4 -70.38 596.7 -28.84 0.865 1957 +1959 4 -70.16 598.92 -29.55 0.865 1958 +1960 4 -69.48 600.67 -30.2 0.865 1959 +1961 4 -68.03 601.97 -30.88 0.865 1960 +1962 4 -67.78 602.91 -30.89 0.54 1961 +1963 4 -66.57 605.06 -30.8 0.54 1962 +1964 4 -66.17 605.58 -31.46 0.54 1963 +1965 4 -65.24 606.49 -32.89 0.54 1964 +1966 4 -63.43 608.04 -33.05 0.54 1965 +1967 4 -62.07 608.82 -33.11 0.54 1966 +1968 4 -59.79 609.9 -33.21 0.54 1967 +1969 4 -58.44 610.39 -33.51 0.54 1968 +1970 4 -56.47 611.48 -33.66 0.54 1969 +1971 4 -54.88 612.34 -34.57 0.54 1970 +1972 4 -54.03 612.73 -35.37 0.54 1971 +1973 4 -53.88 612.57 -35.39 0.54 1972 +1974 4 -54.3 613.0 -36.6 0.435 1973 +1975 4 -54.77 613.47 -36.66 0.435 1974 +1976 4 -55.42 613.78 -36.87 0.435 1975 +1977 4 -54.82 614.42 -37.02 0.435 1976 +1978 4 -55.23 614.83 -38.06 0.435 1977 +1979 4 -54.75 615.58 -39.47 0.435 1978 +1980 4 -54.58 616.63 -40.82 0.435 1979 +1981 4 -54.26 617.24 -42.31 0.435 1980 +1982 4 -54.19 617.48 -43.27 0.435 1981 +1983 4 -54.01 617.91 -44.46 0.435 1982 +1984 4 -53.71 618.53 -46.17 0.435 1983 +1985 4 -53.72 619.75 -46.12 0.435 1984 +1986 4 -53.51 621.68 -47.01 0.435 1985 +1987 4 -53.61 623.29 -47.75 0.435 1986 +1988 4 -53.55 625.07 -48.56 0.435 1987 +1989 4 -54.08 626.8 -49.1 0.435 1988 +1990 4 -54.38 628.63 -50.49 0.435 1989 +1991 4 -54.53 630.0 -51.93 0.435 1990 +1992 4 -54.96 632.25 -52.94 0.435 1991 +1993 4 -56.33 633.9 -52.66 0.435 1992 +1994 4 -56.39 634.89 -53.24 0.435 1993 +1995 4 -56.05 635.78 -54.47 0.435 1994 +1996 4 -55.39 636.34 -55.54 0.435 1995 +1997 4 -52.58 613.43 -36.26 0.54 1973 +1998 4 -51.09 614.37 -36.53 0.54 1997 +1999 4 -50.09 615.5 -37.11 0.54 1998 +2000 4 -47.89 617.89 -37.98 0.54 1999 +2001 4 -46.31 618.77 -39.1 0.54 2000 +2002 4 -43.9 620.02 -39.29 0.54 2001 +2003 4 -41.36 621.45 -39.9 0.54 2002 +2004 4 -39.1 623.18 -40.18 0.54 2003 +2005 4 -36.98 625.03 -40.27 0.54 2004 +2006 4 -36.05 626.84 -41.62 0.54 2005 +2007 4 -32.96 629.26 -42.65 0.54 2006 +2008 4 -31.82 631.17 -43.39 0.54 2007 +2009 4 -30.72 634.63 -44.3 0.54 2008 +2010 4 -29.79 636.45 -45.57 0.54 2009 +2011 4 -28.27 637.99 -45.63 0.54 2010 +2012 4 -26.39 639.78 -46.68 0.54 2011 +2013 4 -24.2 640.96 -47.76 0.54 2012 +2014 4 -22.17 641.99 -48.83 0.54 2013 +2015 4 -21.01 642.38 -49.66 0.54 2014 +2016 4 -20.54 642.82 -51.09 0.54 2015 +2017 4 -19.07 644.42 -51.67 0.54 2016 +2018 4 -18.46 645.94 -53.09 0.54 2017 +2019 4 -16.92 649.28 -54.34 0.54 2018 +2020 4 -15.61 651.63 -54.77 0.54 2019 +2021 4 -14.71 653.18 -56.51 0.54 2020 +2022 4 -13.13 656.16 -57.13 0.54 2021 +2023 4 -11.23 657.33 -58.09 0.54 2022 +2024 4 -9.11 658.88 -58.21 0.54 2023 +2025 4 -7.68 660.51 -59.17 0.54 2024 +2026 4 -6.55 662.44 -59.99 0.54 2025 +2027 4 -5.71 664.02 -60.6 0.54 2026 +2028 4 -5.26 665.1 -60.61 0.54 2027 +2029 4 -3.83 667.32 -61.35 0.54 2028 +2030 4 -3.0 668.95 -62.25 0.54 2029 +2031 4 -1.86 672.08 -62.89 0.54 2030 +2032 4 -1.23 674.79 -63.89 0.54 2031 +2033 4 1.18 677.26 -64.02 0.54 2032 +2034 4 4.06 679.87 -64.02 0.54 2033 +2035 4 5.35 680.42 -65.0 0.54 2034 +2036 4 7.82 681.93 -66.22 0.54 2035 +2037 4 10.21 684.13 -66.68 0.54 2036 +2038 4 10.36 684.6 -68.46 0.54 2037 +2039 4 -68.53 604.57 -30.88 0.865 1961 +2040 4 -69.08 609.08 -31.45 0.865 2039 +2041 4 -69.0 614.17 -31.57 0.865 2040 +2042 4 -68.42 616.32 -31.57 0.865 2041 +2043 4 -67.21 619.67 -31.35 0.865 2042 +2044 4 -66.84 625.07 -31.61 0.865 2043 +2045 4 -67.06 630.75 -31.56 0.865 2044 +2046 4 -66.61 633.94 -31.3 0.865 2045 +2047 4 -66.46 637.44 -30.97 0.865 2046 +2048 4 -65.59 640.58 -30.89 0.54 2047 +2049 4 -65.91 644.53 -30.47 0.54 2048 +2050 4 -64.24 649.25 -30.18 0.54 2049 +2051 4 -62.58 652.77 -29.98 0.54 2050 +2052 4 -61.12 655.25 -28.66 0.54 2051 +2053 4 -59.15 659.67 -28.34 0.54 2052 +2054 4 -56.11 663.66 -28.23 0.54 2053 +2055 4 -53.24 668.4 -28.03 0.54 2054 +2056 4 -51.27 673.13 -27.75 0.54 2055 +2057 4 -50.07 679.22 -27.27 0.54 2056 +2058 4 -49.03 684.55 -26.77 0.54 2057 +2059 4 -48.58 689.26 -26.35 0.54 2058 +2060 4 -47.95 693.21 -25.72 0.54 2059 +2061 4 -47.12 696.32 -26.25 0.54 2060 +2062 4 -45.22 698.92 -28.14 0.54 2061 +2063 4 -43.1 701.08 -28.13 0.54 2062 +2064 4 -42.34 703.36 -27.97 0.54 2063 +2065 4 -40.37 706.27 -27.87 0.54 2064 +2066 4 -38.4 709.47 -27.74 0.54 2065 +2067 4 -36.9 713.44 -27.49 0.54 2066 +2068 4 -35.53 717.56 -27.21 0.54 2067 +2069 4 -34.18 720.16 -27.09 0.54 2068 +2070 4 -30.1 723.41 -25.71 0.54 2069 +2071 4 -26.09 725.2 -25.22 0.54 2070 +2072 4 -22.39 726.69 -24.74 0.54 2071 +2073 4 -19.04 728.84 -24.76 0.54 2072 +2074 4 -17.81 729.46 -24.74 0.54 2073 +2075 4 -15.69 732.52 -24.64 0.54 2074 +2076 4 -14.33 735.11 -24.51 0.54 2075 +2077 4 -13.19 736.11 -23.68 0.54 2076 +2078 4 -11.21 738.41 -23.57 0.54 2077 +2079 4 -9.54 739.49 -23.62 0.54 2078 +2080 4 -7.73 740.42 -23.69 0.54 2079 +2081 4 -17.36 277.69 26.92 1.19 1767 +2082 4 -15.39 280.28 26.99 1.19 2081 +2083 4 -13.39 282.85 25.84 1.19 2082 +2084 4 -11.82 284.96 24.78 1.19 2083 +2085 4 -10.56 287.07 23.65 1.19 2084 +2086 4 -8.93 289.09 23.25 1.19 2085 +2087 4 -8.11 290.11 22.28 1.19 2086 +2088 4 -6.9 291.04 22.26 1.19 2087 +2089 4 -5.65 291.83 23.13 0.755 2088 +2090 4 -4.02 293.26 22.67 0.755 2089 +2091 4 -3.27 294.64 22.73 0.755 2090 +2092 4 -2.78 296.0 21.38 1.08 2091 +2093 4 -1.73 298.6 21.55 1.08 2092 +2094 4 -1.02 300.03 21.09 1.08 2093 +2095 4 -0.04 301.18 20.27 1.08 2094 +2096 4 0.25 302.69 20.4 1.08 2095 +2097 4 0.7 304.37 20.52 1.08 2096 +2098 4 1.14 306.06 20.49 1.08 2097 +2099 4 1.18 307.56 19.43 1.08 2098 +2100 4 1.39 309.18 18.43 1.08 2099 +2101 4 1.89 310.03 17.56 0.755 2100 +2102 4 2.2 310.34 17.63 0.755 2101 +2103 4 3.12 311.24 17.78 0.755 2102 +2104 4 4.06 312.43 18.12 1.08 2103 +2105 4 4.95 313.69 17.94 1.08 2104 +2106 4 5.14 314.72 16.74 1.08 2105 +2107 4 4.92 316.75 16.35 1.08 2106 +2108 4 4.92 318.58 16.53 1.08 2107 +2109 4 4.84 319.58 15.73 1.08 2108 +2110 4 5.23 322.22 15.42 1.08 2109 +2111 4 5.35 324.83 15.36 1.08 2110 +2112 4 5.76 326.25 15.0 1.08 2111 +2113 4 6.0 327.82 14.61 1.08 2112 +2114 4 6.98 329.6 13.71 1.08 2113 +2115 4 7.27 332.96 13.94 1.08 2114 +2116 4 7.1 335.85 14.23 1.08 2115 +2117 4 7.55 338.44 14.45 1.08 2116 +2118 4 7.7 341.33 14.71 0.975 2117 +2119 4 7.32 344.13 14.27 0.975 2118 +2120 4 7.16 346.12 14.47 0.975 2119 +2121 4 5.72 348.74 14.18 0.975 2120 +2122 4 4.94 351.03 14.4 0.865 2121 +2123 4 4.62 354.67 14.78 0.865 2122 +2124 4 5.08 357.26 15.0 0.865 2123 +2125 4 6.28 359.11 14.99 0.865 2124 +2126 4 8.1 360.65 14.98 0.865 2125 +2127 4 9.61 362.79 14.96 0.865 2126 +2128 4 10.51 365.85 15.18 0.865 2127 +2129 4 10.8 370.41 15.6 0.865 2128 +2130 4 11.28 374.18 14.71 0.865 2129 +2131 4 12.49 378.15 14.98 0.865 2130 +2132 4 13.09 380.89 15.2 0.865 2131 +2133 4 14.89 386.39 15.5 0.865 2132 +2134 4 16.25 389.6 15.69 0.865 2133 +2135 4 16.25 392.64 15.98 0.865 2134 +2136 4 17.15 395.08 16.21 0.865 2135 +2137 4 18.52 397.07 16.28 0.865 2136 +2138 4 19.73 399.51 16.41 0.865 2137 +2139 4 20.78 402.41 16.59 0.865 2138 +2140 4 20.61 407.73 17.12 0.865 2139 +2141 4 20.7 411.29 16.79 0.865 2140 +2142 4 20.14 414.87 16.27 0.755 2141 +2143 4 19.98 419.9 16.78 0.755 2142 +2144 4 19.66 422.93 17.11 0.755 2143 +2145 4 18.58 425.81 17.49 0.755 2144 +2146 4 18.43 427.18 17.64 0.755 2145 +2147 4 18.88 429.77 17.85 0.755 2146 +2148 4 17.97 431.28 18.08 0.755 2147 +2149 4 16.43 432.48 18.34 0.755 2148 +2150 4 15.96 433.55 18.34 0.755 2149 +2151 4 16.2 436.36 17.98 0.755 2150 +2152 4 17.27 438.02 18.2 0.755 2151 +2153 4 18.34 440.93 18.45 0.755 2152 +2154 4 18.82 442.56 18.88 0.755 2153 +2155 4 18.97 443.93 19.07 0.755 2154 +2156 4 19.27 447.27 19.44 0.755 2155 +2157 4 19.56 450.62 19.74 0.755 2156 +2158 4 20.19 453.33 20.25 0.755 2157 +2159 4 20.94 455.3 20.45 0.755 2158 +2160 4 21.4 457.6 20.64 0.755 2159 +2161 4 22.46 458.97 20.67 0.755 2160 +2162 4 25.04 462.1 21.2 0.755 2161 +2163 4 26.55 466.07 21.44 0.755 2162 +2164 4 27.91 470.5 21.74 0.755 2163 +2165 4 27.89 473.84 22.08 0.755 2164 +2166 4 27.73 475.52 22.25 0.755 2165 +2167 4 28.04 477.66 23.95 0.54 2166 +2168 4 28.02 479.2 24.02 0.54 2167 +2169 4 29.08 480.27 24.02 0.54 2168 +2170 4 29.8 481.69 23.72 0.54 2169 +2171 4 29.64 483.05 23.79 0.54 2170 +2172 4 29.79 484.42 23.99 0.54 2171 +2173 4 29.53 485.89 24.61 0.54 2172 +2174 4 28.98 486.44 25.39 0.54 2173 +2175 4 29.01 488.22 26.02 0.54 2174 +2176 4 28.58 489.55 26.49 0.54 2175 +2177 4 28.94 490.01 26.5 0.54 2176 +2178 4 28.57 490.08 27.45 0.54 2177 +2179 4 27.96 490.68 27.56 0.54 2178 +2180 4 28.41 492.04 27.65 0.54 2179 +2181 4 28.56 494.01 27.91 0.54 2180 +2182 4 29.32 496.3 28.06 0.54 2181 +2183 4 29.76 496.79 27.91 0.54 2182 +2184 4 30.51 498.77 28.04 0.54 2183 +2185 4 30.47 500.33 27.82 0.54 2184 +2186 4 30.32 501.09 27.91 0.54 2185 +2187 4 30.97 501.65 28.36 0.54 2186 +2188 4 31.5 502.03 29.25 0.54 2187 +2189 4 32.59 503.08 29.56 0.54 2188 +2190 4 33.5 503.69 29.54 0.54 2189 +2191 4 34.15 504.26 29.9 0.54 2190 +2192 4 33.99 506.54 30.22 0.54 2191 +2193 4 33.84 508.21 30.4 0.54 2192 +2194 4 33.53 509.12 30.59 0.54 2193 +2195 4 35.06 509.43 30.48 0.435 2194 +2196 4 35.97 511.57 30.68 0.435 2195 +2197 4 37.18 513.69 30.85 0.435 2196 +2198 4 37.04 514.75 31.04 0.435 2197 +2199 4 37.19 516.41 31.26 0.435 2198 +2200 4 38.28 518.06 31.71 0.435 2199 +2201 4 39.65 519.14 31.68 0.435 2200 +2202 4 41.49 521.57 31.98 0.435 2201 +2203 4 41.85 521.81 32.65 0.435 2202 +2204 4 43.07 522.74 32.63 0.435 2203 +2205 4 44.13 523.8 32.7 0.435 2204 +2206 4 45.06 524.72 32.86 0.435 2205 +2207 4 45.85 526.67 33.28 0.435 2206 +2208 4 47.11 528.13 33.91 0.54 2207 +2209 4 48.02 529.06 33.99 0.54 2208 +2210 4 48.39 529.9 34.73 0.54 2209 +2211 4 48.13 531.37 35.42 0.54 2210 +2212 4 48.64 533.6 36.19 0.54 2211 +2213 4 49.72 534.64 36.58 0.54 2212 +2214 4 50.83 536.28 37.09 0.54 2213 +2215 4 51.47 537.45 37.59 0.54 2214 +2216 4 51.81 539.24 38.2 0.54 2215 +2217 4 51.83 540.13 38.5 0.54 2216 +2218 4 51.84 541.34 38.7 0.54 2217 +2219 4 52.15 542.24 38.83 0.54 2218 +2220 4 52.33 543.59 39.32 0.54 2219 +2221 4 53.6 545.36 39.99 0.54 2220 +2222 4 54.28 545.89 40.81 0.54 2221 +2223 4 55.34 546.35 40.83 0.54 2222 +2224 4 56.13 546.78 41.09 0.54 2223 +2225 4 56.77 547.36 41.39 0.54 2224 +2226 4 57.57 548.09 41.93 0.54 2225 +2227 4 57.56 550.21 42.21 0.54 2226 +2228 4 57.72 551.28 42.29 0.54 2227 +2229 4 57.57 552.32 42.56 0.54 2228 +2230 4 58.03 553.09 42.6 0.54 2229 +2231 4 58.34 553.99 42.74 0.54 2230 +2232 4 59.13 554.73 43.11 0.54 2231 +2233 4 59.45 555.63 43.32 0.54 2232 +2234 4 59.32 556.35 43.7 0.54 2233 +2235 4 59.47 558.03 43.94 0.54 2234 +2236 4 58.88 558.3 44.17 0.54 2235 +2237 4 29.04 490.61 26.63 0.54 2177 +2238 4 29.72 492.36 27.64 0.54 2237 +2239 4 30.65 494.47 27.99 0.54 2238 +2240 4 32.98 497.63 28.69 0.54 2239 +2241 4 34.1 499.26 29.35 0.54 2240 +2242 4 34.53 499.43 29.09 0.54 2241 +2243 4 35.37 501.32 28.6 0.54 2242 +2244 4 36.74 502.7 28.61 0.54 2243 +2245 4 37.77 504.43 28.3 0.54 2244 +2246 4 38.65 506.3 28.03 0.54 2245 +2247 4 39.81 507.26 27.49 0.54 2246 +2248 4 41.92 509.73 27.45 0.54 2247 +2249 4 42.23 511.56 27.6 0.54 2248 +2250 4 43.71 512.51 27.26 0.54 2249 +2251 4 44.78 513.28 27.24 0.54 2250 +2252 4 46.29 515.73 27.34 0.54 2251 +2253 4 47.49 518.78 27.44 0.54 2252 +2254 4 48.37 519.74 27.16 0.54 2253 +2255 4 49.59 521.58 27.15 0.54 2254 +2256 4 51.09 522.81 27.13 0.54 2255 +2257 4 51.84 523.29 27.02 0.54 2256 +2258 4 52.76 524.21 26.97 0.54 2257 +2259 4 53.56 524.62 27.46 0.54 2258 +2260 4 54.52 525.19 28.03 0.54 2259 +2261 4 56.24 527.44 28.55 0.54 2260 +2262 4 57.33 528.46 29.0 0.54 2261 +2263 4 58.44 530.41 29.61 0.54 2262 +2264 4 59.99 533.42 30.14 0.54 2263 +2265 4 60.91 535.55 30.41 0.54 2264 +2266 4 61.08 536.92 29.03 0.54 2265 +2267 4 59.7 537.66 29.22 0.54 2266 +2268 4 59.23 538.12 29.16 0.54 2267 +2269 4 59.76 538.5 29.98 0.54 2268 +2270 4 59.88 539.59 29.85 0.54 2269 +2271 4 59.98 539.81 29.25 0.54 2270 +2272 4 59.62 540.17 28.64 0.54 2271 +2273 4 59.29 540.5 28.4 0.54 2272 +2274 4 59.24 541.17 27.94 0.54 2273 +2275 4 59.32 541.68 27.3 0.54 2274 +2276 4 58.81 542.19 26.79 0.54 2275 +2277 4 58.14 543.48 26.23 0.54 2276 +2278 4 58.07 544.76 25.76 0.54 2277 +2279 4 58.32 546.03 25.25 0.54 2278 +2280 4 58.55 547.32 24.67 0.54 2279 +2281 4 58.82 547.67 24.22 0.54 2280 +2282 4 59.4 548.3 24.01 0.54 2281 +2283 4 60.73 549.42 23.54 0.54 2282 +2284 4 61.76 549.92 23.19 0.54 2283 +2285 4 63.43 551.0 23.07 0.54 2284 +2286 4 64.13 552.74 22.58 0.54 2285 +2287 4 64.24 553.84 22.29 0.54 2286 +2288 4 65.11 554.8 21.85 0.54 2287 +2289 4 65.65 555.19 21.08 0.54 2288 +2290 4 66.55 555.81 20.98 0.54 2289 +2291 4 67.24 556.66 20.24 0.54 2290 +2292 4 67.35 556.86 19.72 0.54 2291 +2293 4 68.34 558.0 18.99 0.54 2292 +2294 4 69.21 559.57 18.62 0.54 2293 +2295 4 70.23 560.4 18.14 0.54 2294 +2296 4 70.45 560.79 17.17 0.54 2295 +2297 4 70.86 561.29 16.81 0.54 2296 +2298 4 71.45 561.94 16.52 0.54 2297 +2299 4 72.6 563.83 15.99 0.54 2298 +2300 4 72.7 565.56 15.61 0.54 2299 +2301 4 73.54 568.06 15.03 0.54 2300 +2302 4 74.38 568.75 14.34 0.54 2301 +2303 4 74.67 569.39 12.56 0.54 2302 +2304 4 75.73 570.17 12.39 0.54 2303 +2305 4 76.89 571.45 11.81 0.54 2304 +2306 4 77.94 573.13 11.87 0.54 2305 +2307 4 78.76 575.36 11.1 0.54 2306 +2308 4 79.3 576.06 10.3 0.54 2307 +2309 4 80.31 577.19 9.71 0.54 2308 +2310 4 81.31 578.93 9.17 0.54 2309 +2311 4 82.86 579.76 8.13 0.54 2310 +2312 4 83.76 583.11 8.38 0.54 2311 +2313 4 83.89 585.4 8.52 0.54 2312 +2314 4 83.09 588.03 8.39 0.54 2313 +2315 4 82.89 591.55 8.53 0.54 2314 +2316 4 82.42 594.13 8.74 0.54 2315 +2317 4 82.09 597.81 8.83 0.54 2316 +2318 4 80.69 599.8 8.85 0.54 2317 +2319 4 79.69 600.78 8.21 0.54 2318 +2320 4 26.36 477.48 22.58 0.755 2166 +2321 4 24.42 479.08 23.43 0.755 2320 +2322 4 23.06 481.64 23.96 0.755 2321 +2323 4 21.95 482.74 23.71 0.755 2322 +2324 4 21.76 484.24 25.7 0.755 2323 +2325 4 21.44 485.15 25.82 0.755 2324 +2326 4 21.44 488.19 26.11 0.755 2325 +2327 4 22.34 490.02 26.21 0.54 2326 +2328 4 23.55 491.86 26.27 0.54 2327 +2329 4 24.7 492.57 25.41 0.54 2328 +2330 4 26.64 493.37 25.0 0.54 2329 +2331 4 28.16 494.6 24.99 0.54 2330 +2332 4 29.82 496.6 25.02 0.54 2331 +2333 4 31.5 499.79 25.33 0.54 2332 +2334 4 35.02 503.9 25.71 0.54 2333 +2335 4 36.39 505.89 25.78 0.54 2334 +2336 4 37.44 507.57 25.85 0.54 2335 +2337 4 39.27 508.79 25.87 0.54 2336 +2338 4 41.55 511.1 25.89 0.54 2337 +2339 4 43.37 512.94 25.89 0.54 2338 +2340 4 45.21 515.97 26.41 0.54 2339 +2341 4 46.45 518.1 26.65 0.54 2340 +2342 4 47.53 519.74 27.02 0.54 2341 +2343 4 48.62 522.01 27.43 0.54 2342 +2344 4 50.17 523.2 27.78 0.54 2343 +2345 4 50.85 523.74 28.6 0.54 2344 +2346 4 51.93 524.48 28.81 0.54 2345 +2347 4 53.46 526.01 28.88 0.54 2346 +2348 4 56.05 529.52 29.14 0.54 2347 +2349 4 57.74 531.78 29.58 0.54 2348 +2350 4 58.99 534.18 30.08 0.54 2349 +2351 4 59.92 536.9 30.63 0.54 2350 +2352 4 60.03 537.4 31.74 0.54 2351 +2353 4 59.3 538.72 32.39 0.54 2352 +2354 4 58.51 539.21 30.61 0.54 2353 +2355 4 58.69 540.25 29.33 0.54 2354 +2356 4 58.29 541.25 28.49 0.54 2355 +2357 4 58.14 542.0 28.57 0.54 2356 +2358 4 57.79 542.95 28.32 0.54 2357 +2359 4 57.57 544.41 27.59 0.54 2358 +2360 4 57.43 545.47 26.19 0.54 2359 +2361 4 57.68 547.64 25.92 0.54 2360 +2362 4 58.55 549.2 25.61 0.54 2361 +2363 4 60.81 550.32 25.21 0.54 2362 +2364 4 62.55 551.33 24.39 0.54 2363 +2365 4 64.07 552.86 24.33 0.54 2364 +2366 4 64.52 555.77 24.57 0.54 2365 +2367 4 66.41 556.93 23.6 0.54 2366 +2368 4 67.27 557.6 23.06 0.54 2367 +2369 4 69.63 560.75 22.39 0.54 2368 +2370 4 70.56 562.25 21.01 0.54 2369 +2371 4 71.46 562.88 19.26 0.54 2370 +2372 4 71.6 564.27 19.3 0.54 2371 +2373 4 72.57 565.75 18.3 0.54 2372 +2374 4 72.91 568.45 17.39 0.54 2373 +2375 4 73.87 569.02 16.15 0.54 2374 +2376 4 74.26 569.56 15.34 0.54 2375 +2377 4 74.92 571.33 14.54 0.54 2376 +2378 4 76.82 573.71 13.77 0.54 2377 +2379 4 77.18 574.27 12.73 0.54 2378 +2380 4 78.21 575.39 12.36 0.54 2379 +2381 4 79.55 577.99 12.43 0.54 2380 +2382 4 80.96 580.25 11.3 0.54 2381 +2383 4 81.84 581.2 11.02 0.54 2382 +2384 4 82.74 582.73 11.0 0.54 2383 +2385 4 82.67 584.93 10.54 0.54 2384 +2386 4 82.51 588.13 10.79 0.54 2385 +2387 4 81.97 591.69 10.44 0.54 2386 +2388 4 81.88 593.0 9.67 0.54 2387 +2389 4 81.54 596.06 9.69 0.54 2388 +2390 4 81.34 597.5 9.25 0.54 2389 +2391 4 80.58 599.45 8.0 0.54 2390 +2392 4 79.34 601.89 8.2 0.54 2391 +2393 4 78.44 602.79 6.85 0.54 2392 +2394 4 20.72 483.94 23.94 0.755 2323 +2395 4 19.2 485.14 24.21 0.755 2394 +2396 4 16.73 486.68 24.28 0.755 2395 +2397 4 15.18 489.43 24.38 0.755 2396 +2398 4 14.35 490.85 23.92 0.755 2397 +2399 4 12.92 492.26 23.58 0.755 2398 +2400 4 11.82 493.95 23.63 0.755 2399 +2401 4 9.92 496.43 23.29 0.755 2400 +2402 4 7.41 498.92 23.01 0.755 2401 +2403 4 5.5 501.41 22.6 0.755 2402 +2404 4 4.59 502.93 22.83 0.755 2403 +2405 4 3.9 503.93 22.08 0.755 2404 +2406 4 3.28 506.96 22.44 0.755 2405 +2407 4 1.99 508.53 22.03 0.755 2406 +2408 4 -0.01 509.91 22.05 0.755 2407 +2409 4 -1.77 511.36 21.36 0.755 2408 +2410 4 -4.16 512.8 20.74 0.755 2409 +2411 4 -6.66 514.37 20.37 0.755 2410 +2412 4 -9.32 516.4 20.06 0.755 2411 +2413 4 -11.82 518.26 19.87 0.755 2412 +2414 4 -14.28 520.09 20.05 0.755 2413 +2415 4 -16.46 522.25 20.0 0.755 2414 +2416 4 -18.6 524.05 20.3 0.755 2415 +2417 4 -20.89 525.7 20.67 0.755 2416 +2418 4 -23.94 527.8 21.16 0.755 2417 +2419 4 -26.93 529.84 20.72 0.755 2418 +2420 4 -29.22 531.8 21.05 0.755 2419 +2421 4 -29.98 534.08 21.35 0.755 2420 +2422 4 -30.75 534.84 20.96 0.755 2421 +2423 4 -31.21 536.5 21.16 0.755 2422 +2424 4 -30.76 540.01 21.46 0.755 2423 +2425 4 -30.25 542.53 20.68 0.755 2424 +2426 4 -30.3 545.32 20.51 0.755 2425 +2427 4 -30.29 546.84 19.14 0.755 2426 +2428 4 -30.31 549.89 19.29 0.755 2427 +2429 4 -29.75 552.96 19.23 0.755 2428 +2430 4 -30.09 554.54 18.9 0.755 2429 +2431 4 -31.06 556.7 18.74 0.755 2430 +2432 4 -32.64 557.96 18.4 0.755 2431 +2433 4 -32.86 561.2 18.21 0.755 2432 +2434 4 -33.38 564.45 17.96 0.755 2433 +2435 4 -34.04 566.93 17.68 0.755 2434 +2436 4 -33.96 570.49 17.41 0.755 2435 +2437 4 -33.17 573.98 16.38 0.755 2436 +2438 4 -32.45 577.82 16.32 0.755 2437 +2439 4 -32.12 579.92 15.2 0.755 2438 +2440 4 -32.25 582.78 14.22 0.755 2439 +2441 4 -32.01 584.97 13.8 0.755 2440 +2442 4 -31.58 586.68 13.62 0.755 2441 +2443 4 -30.45 589.2 12.94 0.755 2442 +2444 4 -29.95 590.83 11.99 0.755 2443 +2445 4 -29.68 592.4 11.66 0.755 2444 +2446 4 -29.88 595.32 11.58 0.755 2445 +2447 4 -29.65 597.51 11.17 0.755 2446 +2448 4 -28.28 599.5 11.17 0.755 2447 +2449 4 -26.84 601.72 10.49 0.755 2448 +2450 4 -27.0 604.61 10.79 0.755 2449 +2451 4 -26.27 606.94 10.56 0.755 2450 +2452 4 -25.77 609.69 10.64 0.755 2451 +2453 4 -26.39 612.12 10.93 0.755 2452 +2454 4 -27.3 614.54 11.26 0.755 2453 +2455 4 -28.75 616.58 10.76 0.755 2454 +2456 4 -29.58 619.82 10.55 0.755 2455 +2457 4 -29.82 622.48 10.07 0.755 2456 +2458 4 -30.14 625.24 10.14 0.755 2457 +2459 4 -31.18 628.09 9.23 0.755 2458 +2460 4 -31.97 631.59 9.5 0.755 2459 +2461 4 -33.21 634.65 9.68 0.755 2460 +2462 4 -34.46 637.08 9.95 0.755 2461 +2463 4 -34.52 640.79 9.65 0.755 2462 +2464 4 -35.78 643.25 9.62 0.755 2463 +2465 4 -36.33 645.32 8.9 0.755 2464 +2466 4 -37.28 647.47 8.89 0.755 2465 +2467 4 -38.71 650.71 8.74 0.755 2466 +2468 4 -39.06 654.69 8.85 0.755 2467 +2469 4 -38.94 658.81 9.09 0.755 2468 +2470 4 -38.69 661.92 8.7 0.755 2469 +2471 4 -38.58 665.73 8.9 0.755 2470 +2472 4 -38.48 669.28 8.79 0.755 2471 +2473 4 -36.45 674.25 8.18 0.755 2472 +2474 4 -35.23 677.91 8.42 0.755 2473 +2475 4 -35.36 680.69 7.11 0.755 2474 +2476 4 -35.11 684.39 6.85 0.755 2475 +2477 4 -35.23 686.32 7.57 0.755 2476 +2478 4 -35.07 688.29 7.83 0.755 2477 +2479 4 -35.04 690.69 6.85 0.755 2478 +2480 4 -34.86 693.24 5.88 0.755 2479 +2481 4 -34.95 696.08 5.1 0.755 2480 +2482 4 -35.02 698.27 4.64 0.755 2481 +2483 4 -34.65 700.63 4.07 0.755 2482 +2484 4 -34.07 703.1 3.9 0.755 2483 +2485 4 -32.44 705.74 2.11 0.755 2484 +2486 4 -30.6 706.97 2.06 0.755 2485 +2487 4 -28.65 708.68 1.9 0.755 2486 +2488 4 -27.71 709.59 0.45 0.755 2487 +2489 4 -25.75 710.99 0.26 0.755 2488 +2490 4 -24.15 712.43 -0.41 0.755 2489 +2491 4 -21.64 713.91 -1.26 0.755 2490 +2492 4 -20.49 715.5 -1.96 0.755 2491 +2493 4 -19.15 716.91 -2.25 0.755 2492 +2494 4 -17.57 718.38 -3.09 0.755 2493 +2495 4 -15.77 719.65 -3.57 0.755 2494 +2496 4 -14.31 720.93 -4.04 0.755 2495 +2497 4 -13.02 722.09 -4.96 0.755 2496 +2498 4 -12.3 722.91 -5.48 0.755 2497 +2499 4 0.45 311.01 18.62 0.975 2100 +2500 4 -0.41 312.78 17.74 0.975 2499 +2501 4 -1.24 313.6 17.23 0.975 2500 +2502 4 -1.75 314.11 16.64 0.975 2501 +2503 4 -1.81 316.3 16.33 0.975 2502 +2504 4 -1.73 318.05 15.65 0.975 2503 +2505 4 -2.05 319.58 15.76 0.975 2504 +2506 4 -2.58 321.63 15.25 0.975 2505 +2507 4 -3.23 322.86 15.13 0.975 2506 +2508 4 -4.25 324.19 14.06 0.865 2507 +2509 4 -5.18 325.71 14.3 0.865 2508 +2510 4 -5.49 328.14 14.56 0.865 2509 +2511 4 -4.58 331.49 14.81 0.865 2510 +2512 4 -3.58 333.83 14.42 0.865 2511 +2513 4 -3.49 335.87 13.94 0.865 2512 +2514 4 -3.81 338.62 14.08 0.865 2513 +2515 4 -5.36 341.96 14.47 0.865 2514 +2516 4 -6.25 344.68 13.45 0.865 2515 +2517 4 -7.41 347.64 12.94 0.865 2516 +2518 4 -8.21 349.66 12.76 0.865 2517 +2519 4 -9.21 351.85 12.23 0.865 2518 +2520 4 -9.95 353.8 11.13 0.865 2519 +2521 4 -10.57 356.85 11.42 0.865 2520 +2522 4 -11.34 358.81 11.68 0.865 2521 +2523 4 -12.0 361.28 11.53 0.865 2522 +2524 4 -14.22 363.19 11.01 0.865 2523 +2525 4 -15.83 365.69 10.49 0.865 2524 +2526 4 -18.06 369.41 10.07 0.865 2525 +2527 4 -19.29 373.04 10.54 0.865 2526 +2528 4 -22.14 377.07 10.14 0.865 2527 +2529 4 -23.1 379.24 9.98 0.865 2528 +2530 4 -23.53 380.89 8.84 0.865 2529 +2531 4 -23.88 383.35 8.72 0.865 2530 +2532 4 -24.53 387.03 8.77 0.865 2531 +2533 4 -24.08 389.32 8.95 0.865 2532 +2534 4 -24.09 391.45 9.16 0.865 2533 +2535 4 -24.86 394.03 9.48 0.865 2534 +2536 4 -25.48 395.85 8.05 0.865 2535 +2537 4 -26.13 397.42 7.81 0.865 2536 +2538 4 -26.68 399.8 7.1 0.865 2537 +2539 4 -26.49 400.51 6.33 0.865 2538 +2540 4 -25.58 402.04 6.39 0.865 2539 +2541 4 -24.74 402.73 7.22 0.865 2540 +2542 4 -24.29 404.69 7.51 0.865 2541 +2543 4 -23.23 406.69 7.6 0.755 2542 +2544 4 -22.88 408.46 8.29 0.755 2543 +2545 4 -22.43 409.53 8.35 0.755 2544 +2546 4 -21.7 410.33 8.05 0.755 2545 +2547 4 -20.98 411.14 7.53 0.755 2546 +2548 4 -20.3 412.0 6.66 0.755 2547 +2549 4 -19.27 412.5 6.31 0.755 2548 +2550 4 -18.52 412.96 6.2 0.865 2549 +2551 4 -17.16 414.95 6.27 0.865 2550 +2552 4 -15.9 417.06 5.15 0.865 2551 +2553 4 -14.49 419.23 4.55 0.865 2552 +2554 4 -14.04 422.43 4.83 0.865 2553 +2555 4 -13.9 425.02 3.32 0.865 2554 +2556 4 -14.02 426.97 2.32 0.865 2555 +2557 4 -14.02 429.4 1.04 0.865 2556 +2558 4 -13.44 431.27 0.72 0.865 2557 +2559 4 -12.65 432.3 -0.38 0.865 2558 +2560 4 -11.8 433.29 -1.12 0.865 2559 +2561 4 -10.33 434.26 -1.62 0.865 2560 +2562 4 -9.34 435.12 -2.54 0.865 2561 +2563 4 -7.91 435.84 -3.57 0.865 2562 +2564 4 -6.58 436.96 -3.96 0.865 2563 +2565 4 -5.57 439.61 -4.4 0.865 2564 +2566 4 -5.38 440.92 -5.34 0.865 2565 +2567 4 -4.84 441.91 -6.06 0.865 2566 +2568 4 -4.81 443.41 -7.21 0.865 2567 +2569 4 -4.87 444.69 -7.75 0.865 2568 +2570 4 -5.13 445.57 -8.86 0.865 2569 +2571 4 -5.01 446.65 -8.98 0.865 2570 +2572 4 -4.96 447.81 -9.93 0.865 2571 +2573 4 -5.06 449.15 -10.93 0.865 2572 +2574 4 -4.75 449.29 -11.62 0.54 2573 +2575 4 -3.29 449.98 -12.38 0.54 2574 +2576 4 -2.58 450.49 -13.0 0.54 2575 +2577 4 -2.33 450.54 -13.46 0.54 2576 +2578 4 -1.64 451.07 -14.22 0.54 2577 +2579 4 -0.5 452.39 -15.11 0.54 2578 +2580 4 -0.14 453.85 -15.99 0.54 2579 +2581 4 -0.05 454.99 -16.57 0.54 2580 +2582 4 0.18 455.67 -17.28 0.54 2581 +2583 4 0.48 455.98 -17.35 0.54 2582 +2584 4 0.13 456.62 -17.63 0.54 2583 +2585 4 0.62 457.37 -18.97 0.54 2584 +2586 4 -0.14 458.15 -20.56 0.54 2585 +2587 4 -0.75 459.36 -22.05 0.54 2586 +2588 4 -1.78 460.98 -22.94 0.54 2587 +2589 4 -1.54 462.27 -23.57 0.54 2588 +2590 4 -0.84 464.32 -24.05 0.54 2589 +2591 4 -1.11 464.9 -25.33 0.54 2590 +2592 4 -0.49 465.5 -25.11 0.54 2591 +2593 4 -0.34 466.55 -24.94 0.54 2592 +2594 4 -0.49 467.31 -26.45 0.54 2593 +2595 4 -0.39 468.13 -26.97 0.54 2594 +2596 4 -0.74 470.01 -27.28 0.54 2595 +2597 4 -0.97 470.83 -27.87 0.54 2596 +2598 4 -1.67 472.13 -28.58 0.54 2597 +2599 4 -0.75 473.06 -28.65 0.54 2598 +2600 4 0.2 473.93 -29.71 0.54 2599 +2601 4 0.79 474.26 -29.96 0.54 2600 +2602 4 2.11 475.08 -30.54 0.54 2601 +2603 4 2.81 475.31 -31.25 0.54 2602 +2604 4 3.67 475.98 -31.81 0.54 2603 +2605 4 5.03 477.05 -31.82 0.54 2604 +2606 4 5.69 477.93 -32.93 0.54 2605 +2607 4 6.67 479.09 -33.81 0.54 2606 +2608 4 7.67 481.74 -34.25 0.54 2607 +2609 4 8.44 482.82 -35.8 0.54 2608 +2610 4 9.07 484.33 -37.16 0.54 2609 +2611 4 9.71 485.22 -38.41 0.54 2610 +2612 4 10.16 485.67 -38.41 0.54 2611 +2613 4 11.12 486.86 -39.51 0.54 2612 +2614 4 11.62 487.59 -40.69 0.54 2613 +2615 4 12.5 488.85 -40.96 0.54 2614 +2616 4 13.86 490.84 -40.89 0.54 2615 +2617 4 14.78 491.76 -40.88 0.54 2616 +2618 4 15.2 492.24 -41.18 0.54 2617 +2619 4 15.27 493.08 -41.94 0.54 2618 +2620 4 16.1 493.79 -42.86 0.54 2619 +2621 4 16.49 494.33 -43.6 0.54 2620 +2622 4 16.5 494.62 -45.07 0.54 2621 +2623 4 17.73 495.24 -45.13 0.54 2622 +2624 4 18.31 495.88 -45.34 0.54 2623 +2625 4 18.85 496.56 -46.09 0.54 2624 +2626 4 19.69 497.56 -46.82 0.54 2625 +2627 4 20.38 498.39 -47.49 0.54 2626 +2628 4 21.06 499.85 -48.25 0.54 2627 +2629 4 21.6 501.14 -48.84 0.54 2628 +2630 4 22.39 502.73 -48.76 0.54 2629 +2631 4 22.61 503.49 -49.38 0.54 2630 +2632 4 23.96 504.88 -49.45 0.54 2631 +2633 4 25.57 508.45 -49.93 0.54 2632 +2634 4 26.97 511.91 -50.78 0.54 2633 +2635 4 27.71 513.93 -50.89 0.54 2634 +2636 4 28.54 515.53 -51.56 0.54 2635 +2637 4 28.97 516.64 -51.94 0.54 2636 +2638 4 29.65 518.08 -52.54 0.54 2637 +2639 4 30.79 519.69 -53.39 0.54 2638 +2640 4 32.95 523.04 -54.55 0.54 2639 +2641 4 33.78 525.84 -55.04 0.54 2640 +2642 4 34.99 529.21 -56.49 0.54 2641 +2643 4 35.75 531.81 -57.97 0.54 2642 +2644 4 36.13 533.87 -58.56 0.54 2643 +2645 4 35.91 537.95 -58.37 0.54 2644 +2646 4 36.37 539.31 -59.71 0.54 2645 +2647 4 37.22 541.51 -60.26 0.54 2646 +2648 4 37.72 543.15 -61.28 0.54 2647 +2649 4 38.29 543.73 -61.27 0.54 2648 +2650 4 38.41 544.21 -61.54 0.11 2649 +2651 4 37.6 545.31 -61.8 0.435 2650 +2652 4 36.83 548.18 -61.46 0.435 2651 +2653 4 36.22 550.02 -61.31 0.435 2652 +2654 4 35.87 550.37 -61.69 0.435 2653 +2655 4 35.35 553.01 -61.99 0.435 2654 +2656 4 34.88 554.08 -61.91 0.435 2655 +2657 4 35.14 556.25 -62.18 0.435 2656 +2658 4 35.21 557.09 -63.01 0.435 2657 +2659 4 35.17 557.73 -63.25 0.435 2658 +2660 4 35.41 559.32 -63.79 0.435 2659 +2661 4 35.81 559.85 -64.46 0.435 2660 +2662 4 35.76 560.51 -64.85 0.435 2661 +2663 4 36.27 561.21 -65.89 0.435 2662 +2664 4 36.21 562.19 -66.39 0.435 2663 +2665 4 36.15 562.25 -67.05 0.435 2664 +2666 4 36.99 563.24 -67.71 0.435 2665 +2667 4 38.29 565.32 -68.54 0.435 2666 +2668 4 38.96 565.85 -67.72 0.435 2667 +2669 4 39.41 566.93 -67.72 0.435 2668 +2670 4 39.67 567.27 -68.17 0.435 2669 +2671 4 39.73 567.54 -69.29 0.435 2670 +2672 4 40.12 568.06 -69.95 0.435 2671 +2673 4 40.64 568.76 -70.84 0.435 2672 +2674 4 40.89 569.12 -71.43 0.435 2673 +2675 4 41.23 569.41 -72.72 0.435 2674 +2676 4 42.55 570.23 -73.3 0.435 2675 +2677 4 43.04 570.96 -74.47 0.435 2676 +2678 4 44.59 571.87 -75.89 0.435 2677 +2679 4 46.21 572.71 -76.57 0.435 2678 +2680 4 47.96 574.0 -77.28 0.435 2679 +2681 4 48.98 574.52 -77.86 0.435 2680 +2682 4 49.68 575.06 -78.69 0.435 2681 +2683 4 51.18 576.3 -78.86 0.435 2682 +2684 4 52.38 576.63 -79.02 0.435 2683 +2685 4 53.07 576.56 -79.84 0.435 2684 +2686 4 53.63 576.92 -80.4 0.435 2685 +2687 4 54.5 577.58 -80.94 0.435 2686 +2688 4 38.92 545.0 -61.35 0.54 2649 +2689 4 39.59 545.86 -62.32 0.54 2688 +2690 4 39.83 547.44 -62.8 0.54 2689 +2691 4 40.2 548.91 -63.59 0.54 2690 +2692 4 39.93 549.79 -64.76 0.54 2691 +2693 4 40.73 551.11 -64.25 0.54 2692 +2694 4 42.55 552.96 -64.25 0.54 2693 +2695 4 44.21 554.65 -64.3 0.54 2694 +2696 4 44.58 555.52 -65.24 0.54 2695 +2697 4 45.64 557.2 -65.18 0.54 2696 +2698 4 46.81 559.99 -66.97 0.54 2697 +2699 4 48.13 562.04 -67.51 0.54 2698 +2700 4 49.0 564.21 -67.81 0.54 2699 +2701 4 50.03 565.33 -68.19 0.54 2700 +2702 4 50.9 566.28 -68.55 0.54 2701 +2703 4 52.68 567.85 -68.94 0.54 2702 +2704 4 56.02 571.54 -68.89 0.54 2703 +2705 4 58.84 573.92 -69.67 0.54 2704 +2706 4 60.43 575.37 -70.44 0.54 2705 +2707 4 61.6 576.65 -70.87 0.54 2706 +2708 4 63.19 579.03 -71.7 0.54 2707 +2709 4 63.94 579.81 -71.76 0.54 2708 +2710 4 65.4 581.1 -72.45 0.54 2709 +2711 4 66.7 581.94 -73.17 0.54 2710 +2712 4 69.07 583.76 -73.37 0.54 2711 +2713 4 70.55 584.43 -73.95 0.54 2712 +2714 4 72.2 585.53 -74.23 0.54 2713 +2715 4 73.5 586.37 -74.95 0.54 2714 +2716 4 74.67 587.34 -75.5 0.54 2715 +2717 4 76.08 588.98 -76.59 0.54 2716 +2718 4 78.19 590.26 -76.9 0.54 2717 +2719 4 79.84 591.64 -76.99 0.54 2718 +2720 4 80.71 592.31 -77.6 0.54 2719 +2721 4 82.15 593.33 -78.55 0.54 2720 +2722 4 82.64 594.06 -79.73 0.54 2721 +2723 4 84.0 594.84 -79.86 0.54 2722 +2724 4 84.73 595.34 -80.26 0.54 2723 +2725 4 85.78 596.12 -80.35 0.54 2724 +2726 4 86.62 596.81 -81.11 0.54 2725 +2727 4 -5.68 450.37 -10.83 0.755 2573 +2728 4 -7.62 451.97 -11.56 0.755 2727 +2729 4 -8.69 452.12 -11.59 0.755 2728 +2730 4 -10.72 453.23 -11.83 0.755 2729 +2731 4 -11.21 454.92 -11.91 0.755 2730 +2732 4 -12.07 457.6 -12.63 0.755 2731 +2733 4 -12.78 459.52 -13.43 0.755 2732 +2734 4 -13.79 461.13 -14.09 0.755 2733 +2735 4 -14.92 462.85 -14.51 0.755 2734 +2736 4 -16.0 466.65 -14.1 0.755 2735 +2737 4 -17.08 471.05 -13.58 0.65 2736 +2738 4 -17.55 473.64 -13.28 0.65 2737 +2739 4 -18.17 476.06 -12.99 0.65 2738 +2740 4 -18.93 477.41 -12.79 0.65 2739 +2741 4 -18.92 478.03 -12.72 0.65 2740 +2742 4 -19.99 479.08 -12.52 0.65 2741 +2743 4 -20.0 481.22 -12.32 0.65 2742 +2744 4 -20.47 484.1 -11.99 0.65 2743 +2745 4 -21.39 487.12 -11.61 0.65 2744 +2746 4 -22.53 489.47 -12.03 0.65 2745 +2747 4 -23.69 491.23 -12.66 0.65 2746 +2748 4 -25.08 494.72 -12.35 0.65 2747 +2749 4 -26.47 498.82 -11.82 0.65 2748 +2750 4 -27.38 501.55 -11.47 0.65 2749 +2751 4 -28.46 503.51 -11.17 0.65 2750 +2752 4 -29.07 504.49 -11.02 0.65 2751 +2753 4 -28.35 504.98 -11.42 0.54 2752 +2754 4 -27.59 505.75 -11.41 0.54 2753 +2755 4 -26.52 506.52 -11.44 0.54 2754 +2756 4 -25.61 507.43 -11.43 0.54 2755 +2757 4 -25.62 508.66 -11.31 0.54 2756 +2758 4 -25.5 509.45 -11.63 0.54 2757 +2759 4 -24.78 510.86 -11.86 0.54 2758 +2760 4 -24.04 512.26 -12.01 0.54 2759 +2761 4 -22.72 514.91 -12.41 0.54 2760 +2762 4 -21.39 515.71 -12.76 0.54 2761 +2763 4 -20.04 517.11 -12.96 0.54 2762 +2764 4 -18.72 518.54 -13.41 0.54 2763 +2765 4 -17.36 519.63 -13.58 0.54 2764 +2766 4 -16.54 521.23 -14.33 0.54 2765 +2767 4 -15.85 523.9 -14.89 0.54 2766 +2768 4 -15.57 526.04 -14.86 0.54 2767 +2769 4 -14.71 528.24 -15.25 0.54 2768 +2770 4 -14.13 529.49 -15.49 0.54 2769 +2771 4 -11.55 531.19 -15.62 0.54 2770 +2772 4 -9.73 533.95 -15.53 0.54 2771 +2773 4 -8.89 536.13 -15.92 0.54 2772 +2774 4 -8.8 538.78 -16.35 0.54 2773 +2775 4 -7.45 543.52 -16.1 0.54 2774 +2776 4 -7.16 546.86 -15.79 0.54 2775 +2777 4 -6.71 550.38 -15.49 0.54 2776 +2778 4 -6.26 552.04 -15.37 0.54 2777 +2779 4 -6.58 554.78 -15.08 0.54 2778 +2780 4 -6.43 557.07 -14.86 0.54 2779 +2781 4 -5.68 559.05 -14.74 0.54 2780 +2782 4 -4.0 560.12 -14.79 0.54 2781 +2783 4 -3.71 562.26 -14.61 0.54 2782 +2784 4 -3.24 565.75 -14.08 0.54 2783 +2785 4 -3.1 568.93 -13.79 0.54 2784 +2786 4 -2.49 570.47 -13.69 0.54 2785 +2787 4 -2.65 573.04 -13.35 0.54 2786 +2788 4 -3.35 576.46 -12.2 0.54 2787 +2789 4 -3.06 579.81 -11.9 0.54 2788 +2790 4 -1.85 581.94 -11.8 0.54 2789 +2791 4 -0.34 585.61 -11.58 0.54 2790 +2792 4 1.06 590.57 -10.55 0.54 2791 +2793 4 1.36 592.1 -10.43 0.54 2792 +2794 4 2.42 593.18 -10.43 0.54 2793 +2795 4 3.33 594.09 -10.42 0.54 2794 +2796 4 4.09 596.99 -10.21 0.54 2795 +2797 4 5.18 601.67 -9.4 0.54 2796 +2798 4 6.39 605.03 -9.1 0.54 2797 +2799 4 8.17 608.71 -7.63 0.54 2798 +2800 4 8.66 611.57 -6.94 0.54 2799 +2801 4 8.85 612.9 -6.37 0.54 2800 +2802 4 8.73 614.22 -5.85 0.54 2801 +2803 4 8.63 615.53 -5.1 0.54 2802 +2804 4 8.21 617.15 -4.3 0.54 2803 +2805 4 7.77 618.49 -3.91 0.54 2804 +2806 4 -29.22 505.49 -10.91 0.65 2752 +2807 4 -30.38 510.28 -11.25 0.65 2806 +2808 4 -30.54 512.56 -11.01 0.65 2807 +2809 4 -31.88 517.53 -11.53 0.65 2808 +2810 4 -32.81 520.25 -11.18 0.65 2809 +2811 4 -34.59 524.5 -10.76 0.65 2810 +2812 4 -35.11 527.47 -11.17 0.65 2811 +2813 4 -36.54 531.0 -11.15 0.65 2812 +2814 4 -37.46 534.04 -12.51 0.65 2813 +2815 4 -38.11 536.8 -12.49 0.65 2814 +2816 4 -39.15 539.05 -13.45 0.65 2815 +2817 4 -39.8 541.51 -13.53 0.65 2816 +2818 4 -41.08 544.31 -13.82 0.65 2817 +2819 4 -43.01 547.42 -14.25 0.65 2818 +2820 4 -43.05 550.19 -14.34 0.65 2819 +2821 4 -43.57 552.83 -14.65 0.65 2820 +2822 4 -44.35 554.81 -14.47 0.65 2821 +2823 4 -45.33 556.4 -14.97 0.65 2822 +2824 4 -45.18 558.68 -14.83 0.65 2823 +2825 4 -45.56 560.87 -15.27 0.65 2824 +2826 4 -46.54 563.05 -15.64 0.65 2825 +2827 4 -47.8 564.91 -15.72 0.65 2826 +2828 4 -48.62 566.93 -15.99 0.65 2827 +2829 4 -49.69 569.52 -15.7 0.65 2828 +2830 4 -51.23 572.23 -15.3 0.65 2829 +2831 4 -52.47 575.28 -15.03 0.65 2830 +2832 4 -52.71 577.04 -15.75 0.65 2831 +2833 4 -52.46 581.04 -15.91 0.65 2832 +2834 4 -52.79 585.91 -15.41 0.65 2833 +2835 4 -53.43 588.98 -15.36 0.65 2834 +2836 4 -54.13 591.48 -15.95 0.65 2835 +2837 4 -54.63 593.8 -16.06 0.65 2836 +2838 4 -55.34 595.72 -16.87 0.65 2837 +2839 4 -56.04 597.02 -17.65 0.65 2838 +2840 4 -56.59 599.4 -18.27 0.65 2839 +2841 4 -58.6 603.8 -17.89 0.65 2840 +2842 4 -59.74 607.65 -17.79 0.65 2841 +2843 4 -61.44 612.95 -17.11 0.65 2842 +2844 4 -62.51 614.61 -16.85 0.65 2843 +2845 4 -64.65 617.03 -16.41 0.65 2844 +2846 4 -66.74 620.92 -16.99 0.65 2845 +2847 4 -68.28 626.39 -16.31 0.65 2846 +2848 4 -69.9 630.41 -16.74 0.65 2847 +2849 4 -70.57 634.1 -16.78 0.65 2848 +2850 4 -72.15 636.28 -17.02 0.65 2849 +2851 4 -74.14 639.76 -16.5 0.65 2850 +2852 4 -76.29 642.78 -16.08 0.65 2851 +2853 4 -80.28 645.82 -15.8 0.65 2852 +2854 4 -83.81 648.7 -15.27 0.65 2853 +2855 4 -86.4 652.46 -14.66 0.65 2854 +2856 4 -86.7 653.63 -16.33 0.65 2855 +2857 4 -88.69 656.8 -15.83 0.65 2856 +2858 4 -90.16 660.37 -16.26 0.65 2857 +2859 4 -90.83 664.69 -16.31 0.65 2858 +2860 4 -92.21 668.77 -15.78 0.65 2859 +2861 4 -92.89 672.19 -16.15 0.65 2860 +2862 4 -94.32 674.81 -16.28 0.65 2861 +2863 4 -95.39 676.78 -15.99 0.65 2862 +2864 4 -96.13 678.12 -17.23 0.65 2863 +2865 4 -97.23 680.42 -17.13 0.65 2864 +2866 4 -98.4 681.58 -18.04 0.65 2865 +2867 4 -99.66 684.65 -18.01 0.65 2866 +2868 4 -100.65 686.24 -18.59 0.65 2867 +2869 4 -101.65 687.22 -19.15 0.65 2868 +2870 4 -101.87 688.35 -19.78 0.65 2869 +2871 4 -102.17 690.47 -19.47 0.65 2870 +2872 4 -102.02 693.06 -19.23 0.65 2871 +2873 4 -102.79 694.41 -19.03 0.65 2872 +2874 4 -103.4 696.84 -18.74 0.65 2873 +2875 4 -103.41 699.89 -18.43 0.65 2874 +2876 4 -103.28 701.26 -18.4 0.65 2875 +2877 4 -102.84 703.86 -18.25 0.65 2876 +2878 4 -102.62 706.68 -18.84 0.65 2877 +2879 4 -102.17 708.97 -18.65 0.65 2878 +2880 4 -101.57 712.62 -18.36 0.65 2879 +2881 4 -101.12 716.13 -18.05 0.65 2880 +2882 4 -101.59 719.31 -17.7 0.65 2881 +2883 4 -101.45 723.13 -17.34 0.65 2882 +2884 4 -100.55 727.08 -17.04 0.65 2883 +2885 4 -99.54 730.7 -16.84 0.65 2884 +2886 4 -99.0 736.53 -16.86 0.65 2885 +2887 4 -98.71 738.97 -16.65 0.65 2886 +2888 4 -97.84 739.93 -17.09 0.65 2887 +2889 4 -96.18 741.32 -17.26 0.65 2888 +2890 4 -94.52 743.93 -17.16 0.65 2889 +2891 4 -93.56 748.14 -17.82 0.65 2890 +2892 4 -93.31 750.02 -18.19 0.65 2891 +2893 4 -92.56 752.01 -18.14 0.65 2892 +2894 4 -91.61 753.82 -19.26 0.65 2893 +2895 4 -90.7 754.74 -19.33 0.65 2894 +2896 4 -103.71 688.65 -19.73 0.65 2869 +2897 4 -105.4 690.34 -19.64 0.65 2896 +2898 4 -107.22 692.14 -20.81 0.65 2897 +2899 4 -108.98 692.97 -21.48 0.65 2898 +2900 4 -110.42 694.08 -21.92 0.65 2899 +2901 4 -112.79 695.52 -22.47 0.65 2900 +2902 4 -114.23 696.65 -22.99 0.65 2901 +2903 4 -115.02 697.43 -23.2 0.65 2902 +2904 4 -116.57 700.18 -23.02 0.65 2903 +2905 4 -117.92 701.51 -24.12 0.65 2904 +2906 4 -118.68 703.48 -23.87 0.65 2905 +2907 4 -119.14 706.06 -23.57 0.65 2906 +2908 4 -118.3 710.09 -23.85 0.65 2907 +2909 4 -117.2 712.04 -24.91 0.65 2908 +2910 4 -116.16 715.54 -24.73 0.65 2909 +2911 4 -115.67 719.32 -25.62 0.65 2910 +2912 4 -115.32 721.72 -26.63 0.65 2911 +2913 4 -114.96 723.78 -27.29 0.65 2912 +2914 4 -114.38 725.05 -27.67 0.65 2913 +2915 4 -113.51 726.6 -27.98 0.65 2914 +2916 4 -113.22 728.44 -27.91 0.65 2915 +2917 4 -112.84 730.5 -28.49 0.65 2916 +2918 4 -27.98 401.37 6.92 0.65 2538 +2919 4 -29.04 402.74 7.15 0.65 2918 +2920 4 -31.79 405.45 7.68 0.65 2919 +2921 4 -34.06 407.7 6.67 0.65 2920 +2922 4 -35.9 409.5 7.01 0.65 2921 +2923 4 -38.35 411.92 7.41 0.65 2922 +2924 4 -41.44 414.68 7.43 0.65 2923 +2925 4 -46.14 419.63 7.14 0.65 2924 +2926 4 -48.43 422.49 7.62 0.65 2925 +2927 4 -48.54 425.34 6.78 0.65 2926 +2928 4 -48.64 428.77 6.22 0.65 2927 +2929 4 -48.07 430.64 5.89 0.65 2928 +2930 4 -47.63 433.53 6.06 0.54 2929 +2931 4 -47.99 435.73 5.77 0.54 2930 +2932 4 -48.6 437.55 4.35 0.54 2931 +2933 4 -49.3 438.85 3.63 0.54 2932 +2934 4 -49.29 439.74 5.46 0.54 2933 +2935 4 -50.1 440.54 5.16 0.54 2934 +2936 4 -50.96 441.39 4.26 0.54 2935 +2937 4 -51.52 442.86 3.39 0.54 2936 +2938 4 -52.49 444.74 3.07 0.54 2937 +2939 4 -53.85 447.31 1.86 0.54 2938 +2940 4 -54.82 448.87 1.56 0.54 2939 +2941 4 -54.78 450.35 0.58 0.54 2940 +2942 4 -55.02 452.7 0.0 0.54 2941 +2943 4 -55.12 454.94 -0.91 0.54 2942 +2944 4 -55.78 456.2 -1.17 0.54 2943 +2945 4 -57.93 457.42 -1.09 0.54 2944 +2946 4 -60.72 460.18 -1.02 0.54 2945 +2947 4 -61.87 463.13 -1.44 0.54 2946 +2948 4 -62.44 464.91 -2.35 0.54 2947 +2949 4 -62.81 466.19 -2.88 0.54 2948 +2950 4 -62.67 466.98 -3.04 0.54 2949 +2951 4 -5.99 292.26 22.29 0.865 2088 +2952 4 -5.25 294.24 22.42 0.865 2951 +2953 4 -4.94 296.38 22.6 0.865 2952 +2954 4 -3.89 299.58 22.82 0.865 2953 +2955 4 -1.99 302.56 22.11 0.865 2954 +2956 4 -0.94 304.26 22.18 0.865 2955 +2957 4 -0.79 306.85 22.41 0.865 2956 +2958 4 -1.4 310.18 22.8 0.865 2957 +2959 4 -2.07 313.26 24.29 0.865 2958 +2960 4 -1.92 315.84 24.61 0.865 2959 +2961 4 -2.08 318.11 24.91 0.865 2960 +2962 4 -2.39 321.15 25.24 0.865 2961 +2963 4 -3.31 324.17 25.7 0.865 2962 +2964 4 -4.07 326.74 26.09 0.65 2963 +2965 4 -6.04 328.69 26.61 0.65 2964 +2966 4 -7.57 332.02 27.16 0.65 2965 +2967 4 -8.07 332.51 28.39 0.65 2966 +2968 4 -9.45 333.87 28.64 0.65 2967 +2969 4 -11.59 335.97 29.04 0.65 2968 +2970 4 -12.81 339.01 29.46 0.65 2969 +2971 4 -14.35 342.33 29.92 0.65 2970 +2972 4 -16.34 344.9 30.36 0.65 2971 +2973 4 -18.01 346.25 30.64 0.65 2972 +2974 4 -19.26 348.09 32.3 0.65 2973 +2975 4 -19.83 349.85 33.05 0.65 2974 +2976 4 -20.38 351.0 33.9 0.65 2975 +2977 4 -21.41 352.01 34.62 0.65 2976 +2978 4 -21.71 352.9 34.81 0.65 2977 +2979 4 -21.97 353.78 35.37 0.65 2978 +2980 4 -21.82 356.05 35.65 0.65 2979 +2981 4 -21.83 358.78 35.92 0.65 2980 +2982 4 -21.29 360.38 36.93 0.65 2981 +2983 4 -20.75 362.49 38.54 0.65 2982 +2984 4 -19.8 363.97 39.11 0.65 2983 +2985 4 -19.08 364.47 40.23 0.65 2984 +2986 4 -18.66 364.64 41.56 0.65 2985 +2987 4 -18.04 365.84 41.93 0.65 2986 +2988 4 -17.67 365.79 42.5 0.65 2987 +2989 4 -17.2 365.91 44.37 0.65 2988 +2990 4 -6.61 91.18 9.77 0.435 1189 +2991 4 -7.98 91.62 9.94 0.435 2990 +2992 4 -8.7 91.42 10.44 0.435 2991 +2993 4 -8.69 91.11 10.56 0.65 2992 +2994 4 -8.95 90.75 11.08 0.65 2993 +2995 4 -8.89 90.09 11.62 0.65 2994 +2996 4 -9.16 89.43 11.96 0.65 2995 +2997 4 -9.56 88.31 12.41 0.65 2996 +2998 4 -9.55 87.99 12.53 0.65 2997 +2999 4 -9.83 87.06 12.69 0.65 2998 +3000 4 -9.81 86.44 12.78 0.65 2999 +3001 4 -9.77 86.09 13.2 0.65 3000 +3002 4 -9.87 85.27 13.65 0.65 3001 +3003 4 -9.68 84.79 13.89 0.65 3002 +3004 4 -9.21 84.32 13.95 0.65 3003 +3005 4 -8.85 83.96 14.57 0.65 3004 +3006 4 -8.62 83.72 15.35 0.65 3005 +3007 4 -8.21 83.31 16.42 0.65 3006 +3008 4 -7.9 82.7 16.39 0.65 3007 +3009 4 -7.85 82.04 16.93 0.65 3008 +3010 4 -7.79 81.68 17.42 0.65 3009 +3011 4 -7.91 80.57 17.78 0.435 3010 +3012 4 -7.99 80.05 18.49 0.435 3011 +3013 4 -7.97 79.73 18.53 0.435 3012 +3014 4 -8.26 79.11 18.65 0.435 3013 +3015 4 -8.4 78.63 18.84 0.435 3014 +3016 4 -8.68 78.0 18.96 0.435 3015 diff --git a/demos/Fig5_CellMultiscale/cells/ca1_minimal.p b/demos/Fig5_CellMultiscale/cells/ca1_minimal.p new file mode 100644 index 0000000..4395d62 --- /dev/null +++ b/demos/Fig5_CellMultiscale/cells/ca1_minimal.p @@ -0,0 +1,58 @@ +// genesis +// cell parameter file for the 1991 Traub CA1 hippocampal cell +// "phi" parameter reduced by e-3 +*cartesian +*relative + +*set_global RM 1.0 //ohm*m^2 +*set_global RA 1.0 //ohm*m +*set_global CM 0.03 //F/m^2 +*set_global EREST_ACT -0.06 // volts + +// The format for each compartment parameter line is : +// name parent x y z d ch dens ... +// For channels, "dens" = maximum conductance per unit area of compartment + + +dend_3 none 0 220 0 3.84 +dend_5 . 0 220 0 3.84 +dend_6 . 0 220 0 3.84 +dend_8 . 0 110 0 3.84 + +soma dend_8 0 125 0 8.46 + + +apical_10 soma 0 120 0 4.0 +apical_11 apical_10 0 120 0 3 +apical_12 apical_11 0 120 0 3 +apical_13 apical_12 0 120 0 2.6 +apical_14 apical_13 0 120 0 2.6 +apical_15 apical_14 0 120 0 2.6 +apical_16 apical_15 0 120 0 2.6 +apical_17 apical_16 0 120 0 2.6 +apical_18 apical_17 0 120 0 2.6 +apical_19 apical_18 0 120 0 2.6 + +apical_11_1 apical_10 -60 60 0 2 +apical_11_2 apical_11_1 -60 60 0 1.8 +apical_11_3 apical_11_2 0 80 0 1.5 +apical_11_4 apical_11_3 0 80 0 1.5 + +apical_13_1 apical_12 40 40 0 1.0 +apical_13_2 apical_13_1 40 40 0 1.0 + +apical_14_1 apical_13_2 0 10 0 1.0 +apical_14_2 . 0 10 0 1.0 +apical_14_3 . 0 10 0 1.0 +apical_14_4 . 0 10 0 1.0 +apical_14_5 . 0 10 0 1.0 +apical_14_6 . 0 10 0 1.0 +apical_14_7 . 0 10 0 1.0 +apical_14_8 . 0 10 0 1.0 +apical_14_9 . 0 10 0 1.0 +apical_14_10 . 0 10 0 1.0 +apical_14_11 . 0 10 0 1.0 +apical_14_12 . 0 10 0 1.0 +apical_14_13 . 0 10 0 1.0 +apical_15_1 . 0 30 0 1.0 +apical_15_2 . 0 60 0 1.0 diff --git a/demos/Fig5_CellMultiscale/cells/h10.CNG.swc b/demos/Fig5_CellMultiscale/cells/h10.CNG.swc new file mode 100644 index 0000000..554dbe2 --- /dev/null +++ b/demos/Fig5_CellMultiscale/cells/h10.CNG.swc @@ -0,0 +1,226 @@ +# Original file h10.swc edited by Duncan Donohue using StdSwc version 1.21 on 9/6/05. +# Irregularities and fixes documented in h10.swc.std. See StdSwc1.21.doc for more information. +# +#---------------------------------------------------------------------- +# This file was obtained using ban2swc.pl on file h10.txt +# (Jose Ambros-Ingerson, jose@kiubo.net): Sun Oct 19 18:38:56 2003 +#---------------------------------------------------------------------- +# ORIGINAL_SOURCE +# CREATURE +# REGION +# FIELD/LAYER +# TYPE +# CONTRIBUTOR +# REFERENCE +# RAW +# EXTRAS +# SOMA_AREA +# SHRINKAGE_CORRECTION +# VERSION_NUMBER +# VERSION_DATE +# ********************************************* +# SCALE 1.0 1.0 1.0 + 1 1 0. 23. 0. 3.35 -1 + 2 1 0. 18. 0. 2.5 1 + 3 1 0. 0. 0. 1.058 2 + 4 3 -4.157 -2.778 0. 0.6 3 + 5 3 -5.925 -3.510 -4.62 0.55 4 + 6 3 -15.47 -7.464 -29.560 0.4 5 + 7 3 -23.89 -9.139 -72.72 0.4 6 + 8 3 -24.39 -13.43 -83.51 0.350 6 + 9 3 -9.814 -5.121 -14.780 0.5 5 + 10 3 -15.81 -6.313 -23.93 0.5 9 + 11 3 -65.94 -16.29 -100.4 0.4 10 + 12 3 -54.5 -14.01 -82.960 0.4 10 + 13 3 -17.2 -10.06 -28.09 0.4 9 + 14 3 -78.64 -51.11 -138.70 0.4 13 + 15 3 -41.69 -26.42 -72.15 0.350 13 + 16 3 -10.11 -8.731 -20.330 0.45 4 + 17 3 -14.44 -13.06 -35.11 0.350 16 + 18 3 -26.61 -21.19 -108.7 0.3 17 + 19 3 -24.2 -27.66 -123.4 0.3 17 + 20 3 -32.3 -30.92 -96.08 0.350 16 + 21 3 -45.7 -39.87 -120.2 0.3 20 + 22 3 -56.99 -67.88 -162.60 0.350 20 + 23 3 -8.889 -13.3 0. 0.65 3 + 24 3 -11.39 -15.8 -3.54 0.55 23 + 25 3 -19.39 -23.8 -14.85 0.5 24 + 26 3 -21.7 -25.35 -19.01 0.45 25 + 27 3 -33.25 -33.06 -39.79 0.4 26 + 28 3 -64.36 -45.95 -121.10 0.350 27 + 29 3 -53.54 -53.36 -109.10 0.350 27 + 30 3 -26.32 -28.43 -27.32 0.4 26 + 31 3 -68.78 -46.02 -73.28 0.3 30 + 32 3 -71.820 -73.93 -91.67 0.350 30 + 33 3 -59.82 -84.320 -123.80 0.350 25 + 34 3 -84.52 -121.30 -190.3 0.25 33 + 35 3 -34.39 -38.80 -36.06 0.350 24 + 36 3 -96.61 -80.38 -86.06 0.3 35 + 37 3 -93.98 -128. -107.7 0.3 35 + 38 3 -15.65 -29.64 -17.68 0.5 23 + 39 3 -17.01 -32.9 -21.21 0.5 38 + 40 3 -21.95 -40.29 -34.52 0.4 39 + 41 3 -50.03 -82.33 -110.2 0.3 40 + 42 3 -49.730 -81.87 -109.30 0.350 40 + 43 3 -22.75 -61.78 -65.28 0.3 39 + 44 3 -37.30 -81.9 -74.25 0.3 38 + 45 3 -2.146 -10.790 0. 0.75 3 + 46 3 -24.77 -65.42 -24.490 0.350 45 + 47 3 -54.47 -137.1 -56.64 0.350 46 + 48 3 -55.18 -138.8 -57.4 0.350 46 + 49 3 -2.146 -20.95 -4.21 0.6 45 + 50 3 -2.146 -35.730 -10.33 0.45 49 + 51 3 -22.75 -139.3 -80.89 0.3 50 + 52 3 29. -192.3 -117. 0.350 50 + 53 3 -2.146 -25.57 -6.12 0.55 49 + 54 3 -3.103 -30.38 -7.10 0.5 53 + 55 3 -49.410 -263.2 -54.31 0.350 54 + 56 3 -22.05 -125.60 -26.41 0.3 54 + 57 3 16.990 -121.80 -25.63 0.3 53 + 58 3 2.146 -10.790 0. 0.65 3 + 59 3 2.146 -20.79 0. 0.4 58 + 60 3 2.146 -235.8 0. 0.350 59 + 61 3 2.146 -250.8 0. 0.25 60 + 62 3 4.059 -15.41 0. 0.4 58 + 63 3 8.269 -25.57 0. 0.350 62 + 64 3 35.63 -163.10 -27.90 0.4 63 + 65 3 45.32 -81.02 -13.27 0.3 63 + 66 3 20.13 -54.21 0. 0.350 62 + 67 3 35.25 -130.20 15.41 0.3 66 + 68 3 78.98 -142.3 21.07 0.350 66 + 69 3 8.889 -13.3 0. 0.6 3 + 70 3 16.67 -32.08 8.42 0.5 69 + 71 3 24.45 -50.86 16.84 0.45 70 + 72 3 49.32 -175.9 42.2 0.350 71 + 73 3 84.38 -140.6 38.30 0.350 71 + 74 3 42.45 -141.4 78.51 0.4 70 + 75 3 48.94 -174. 100.7 0.3 74 + 76 3 16.080 -20.490 4.21 0.4 69 + 77 3 99.04 -103.5 52.81 0.3 76 + 78 3 41.550 -45.97 19.13 0.3 76 + 79 3 63.71 -109.60 64.06 0.3 78 + 80 3 75.26 -126.9 77.95 0.2 79 + 81 3 18.29 -12.22 0. 0.6 3 + 82 3 20.79 -14.72 3.54 0.55 81 + 83 3 26.29 -20.22 11.31 0.5 82 + 84 3 101.10 -132.20 101.30 0.350 83 + 85 3 97.5 -67.8 68.54 0.3 83 + 86 3 47.29 -41.22 41.01 0.25 82 + 87 3 21.56 -13.58 3.54 0.5 81 + 88 3 28.09 -16.28 10.61 0.45 87 + 89 3 122.10 -79.11 86.16 0.3 88 + 90 3 85.99 -27.8 50.050 0.3 88 + 91 3 43.12 -22.51 26.87 0.4 87 + 92 3 75.45 -44.11 85.070 0.350 91 + 93 3 97.61 -33.34 110. 0.350 91 + 94 4 0. 41. 0. 2.550 1 + 95 4 0. 127. 0. 0.3 94 + 96 4 5.932 70.820 -6.05 2.25 94 + 97 4 18.37 133.3 -18.73 1.25 96 + 98 4 26.63 153.3 -23.02 0.6 97 + 99 4 56.65 225.8 -38.63 0.3 98 + 100 4 29.63 160.5 -24.580 0.6 98 + 101 4 91.850 253.70 -24.580 0.350 100 + 102 4 63.97 333.1 -24.580 0.350 100 + 103 4 18.37 142.20 -20.48 1.25 97 + 104 4 18.37 145.1 -21.07 1.25 103 + 105 4 28.28 195. -42.12 0.45 104 + 106 4 33.69 222.10 -53.6 0.350 105 + 107 4 39.1 249.3 -65.08 0.25 106 + 108 4 17.47 149.6 -22.98 1.25 104 + 109 4 4.851 213.10 -49.77 0.5 108 + 110 4 -10.07 288.1 -100.9 0.350 109 + 111 4 15.85 157.8 -26.43 1.25 108 + 112 4 15.85 182.3 -31.3 0.5 111 + 113 4 15.85 235.3 -41.84 0.350 112 + 114 4 15.85 272.2 -57.15 0.3 113 + 115 4 15.85 195.10 -33.84 0.350 112 + 116 4 30.09 266.7 -33.84 0.3 115 + 117 4 0.2380 273.5 -33.84 0.3 115 + 118 4 11.72 167.8 -28.57 1.25 111 + 119 4 3.46 187.70 -32.87 1.25 118 + 120 4 -0.506 207.60 -41.28 1.25 119 + 121 4 -3.39 222.10 -47.410 1.25 120 + 122 4 -3.39 223.8 -48.52 1.25 121 + 123 4 -3.39 247.10 -64.070 0.45 122 + 124 4 1.439 271.40 -88.820 0.3 123 + 125 4 -16.080 310.90 -129.1 0.350 123 + 126 4 -3.39 248.70 -65.19 1.25 122 + 127 4 -3.209 249.70 -65.570 1.25 126 + 128 4 1.297 272.3 -75.14 0.5 127 + 129 4 12. 326.1 -111.80 0.350 128 + 130 4 -0.506 263.2 -71.31 1.25 127 + 131 4 0.2450 265.1 -71.7 0.6 130 + 132 4 3.623 273.2 -73.45 0.55 131 + 133 4 46.230 337. -105.2 0.3 132 + 134 4 22.55 368.40 -113.60 0.350 132 + 135 4 19.01 310.40 -81.45 0.45 131 + 136 4 42.74 367.6 -81.45 0.350 135 + 137 4 -0.506 280.90 -74.820 1.25 130 + 138 4 -0.506 284.8 -75.60 0.850 137 + 139 4 14.450 360. -107.4 0.4 138 + 140 4 18.06 378.1 -115. 0.3 139 + 141 4 -14.02 352.8 -104.30 0.850 138 + 142 4 -20.330 384.5 -117.7 0.70 141 + 143 4 -20.330 441.8 -141.4 0.70 142 + 144 4 -20.330 494.40 -163.20 0.45 143 + 145 4 -20.330 544.30 -196.60 0.350 144 + 146 4 -20.330 582.6 -222.10 0.3 145 + 147 4 -20.330 622.5 -248.8 0.3 145 + 148 4 -20.330 462.1 -149.8 0.6 143 + 149 4 -7.321 527.5 -163.10 0.45 148 + 150 4 -1.389 557.30 -169.20 0.350 149 + 151 4 21.51 612.6 -181.10 0.3 150 + 152 4 -1.389 630.90 -183.8 0.25 150 + 153 4 -36.6 543.9 -166.4 0.6 148 + 154 4 -46.36 592.9 -176.4 0.350 153 + 155 4 -46.36 669.6 -208.10 0.25 154 + 156 4 -74.99 662.1 -207.4 0.25 154 + 157 4 -44.44 583.30 -174.4 0.5 153 + 158 4 -44.44 665.30 -174.4 0.350 157 + 159 4 -44.44 705.30 -174.4 0.25 158 + 160 4 -87.3 686.80 -174.4 0.350 157 + 161 4 -121.7 769.90 -174.4 0.25 160 + 162 4 -32.71 414.40 -131.1 0.45 142 + 163 4 -85.74 542.4 -188.5 0.350 162 + 164 4 -120. 625.2 -225.60 0.3 163 + 165 4 -137.4 667. -244.4 0.25 164 + 166 4 -132.4 655.1 -239. 0.2 164 + 167 4 -0.506 290.7 -76.77 0.9 137 + 168 4 6.713 327. -76.77 0.8 167 + 169 4 8.664 336.8 -76.77 0.6 168 + 170 4 12.49 356. -80.67 0.5 169 + 171 4 21.48 401.3 -89.84 0.350 170 + 172 4 13.74 362.3 -76.77 0.5 168 + 173 4 23.12 385. -71.89 0.25 172 + 174 4 13.74 396.6 -69.94 0.350 172 + 175 4 -20.6 391.70 -76.77 0.350 167 + 176 4 -15.83 311.3 -91.59 0.4 126 + 177 4 -28.44 374.70 -118.4 0.3 176 + 178 4 -14.84 249.8 -67.41 0.45 121 + 179 4 -37.12 303.6 -106.30 0.350 178 + 180 4 -55.25 347.3 -138. 0.3 178 + 181 4 -3.209 221.20 -47.02 0.45 120 + 182 4 -3.209 356.6 -73.95 0.350 181 + 183 4 -31.36 289.2 -61.660 0.350 181 + 184 4 -11.94 210.70 -44.35 0.6 119 + 185 4 -36.06 246.9 -62.33 0.5 184 + 186 4 -67.18 322. -96.01 0.3 185 + 187 4 -81.14 291.90 -88.74 0.3 185 + 188 4 1.208 193.10 -34.04 0.4 118 + 189 4 -21.42 306.90 -34.04 0.3 188 + 190 4 -77.13 310.40 -34.04 0.350 188 + 191 4 18.37 165.70 -25.17 0.5 103 + 192 4 25.78 203. -25.17 0.350 191 + 193 4 56.22 356. -25.17 0.3 192 + 194 4 50.36 326.6 -25.17 0.3 192 + 195 4 16.22 176.5 -25.17 0.350 191 + 196 4 -10.31 309.90 -25.17 0.350 195 + 197 4 2.957 243.20 -25.17 0.3 195 + 198 4 -2.105 51.58 -2.15 0.350 94 + 199 4 -20.09 142. -20.48 0.350 198 + 200 4 -3.061 56.39 -3.12 0.3 198 + 201 4 -3.061 76.39 -3.12 0.3 200 + 202 4 -3.061 142.4 -3.12 0.3 201 + 203 4 -3.061 167.4 -3.12 0.3 201 + 204 4 -32.910 128.5 -3.12 0.3 200 diff --git a/demos/Fig5_CellMultiscale/chans/CA1.morph.xml b/demos/Fig5_CellMultiscale/chans/CA1.morph.xml new file mode 100644 index 0000000..2a3815b --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/CA1.morph.xml @@ -0,0 +1,12673 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ModelViewParmSubset_5 + + + + ModelViewParmSubset_5 + + + + + + soma_group + + + + soma_group + + + + + + ModelViewParmSubset_7 + + + + ModelViewParmSubset_7 + + + + + + axon_group + soma_group + + + + + + all + + + + + + ModelViewParmSubset_2 + + + + ModelViewParmSubset_2 + + + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + all + + + + + + + + dendrite_group + + + + + + + + + + dendrite_group + + + + + + + + + + dendrite_group + + + + + + + + all + + + + + + ModelViewParmSubset_2 + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + + + + all + + + + + + + all + + + + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/Ca.xml b/demos/Fig5_CellMultiscale/chans/Ca.xml new file mode 100644 index 0000000..645161c --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/Ca.xml @@ -0,0 +1,62 @@ + + + + + A channel from Maex, R and De Schutter, E. Synchronization of Golgi and Granule Cell Firing in a + Detailed Network Model of the Cerebellar Granule Cell Layer + + + + + + + Voltage-gated Ca2+ channel, based on Traub + + + + Traub, R. + + + Upi Bhalla + NCBS + bhalla - at - ncbs.res.in + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig5_CellMultiscale/chans/CaConc.xml b/demos/Fig5_CellMultiscale/chans/CaConc.xml new file mode 100644 index 0000000..fe10a98 --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/CaConc.xml @@ -0,0 +1,36 @@ + + + + Ca pool + + + Signifies that the ion is involved in a process which alters its concentration + + + + + + + Upi Bhalla + + + + An expontially decaying pool of calcium + + + + Upi Bhalla + National Centre for Biological Sciences, Bangalore, India. + bhalla - at - ncbs.res.in + + + + + + + + + + + + diff --git a/demos/Fig5_CellMultiscale/chans/DoubExpSyn.xml b/demos/Fig5_CellMultiscale/chans/DoubExpSyn.xml new file mode 100644 index 0000000..58cc74e --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/DoubExpSyn.xml @@ -0,0 +1,32 @@ + + + + ChannelML file describing a single synaptic mechanism + + + + + + + Simple example of a synaptic mechanism, which consists of a postsynaptic conductance which changes as + double exponential function of time. Mappings exist for NEURON and GENESIS. + + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Receptor properties + http://senselab.med.yale.edu/senselab/NeuronDB/receptors2.asp + + + + + + + + diff --git a/demos/Fig5_CellMultiscale/chans/Generated.net.xml b/demos/Fig5_CellMultiscale/chans/Generated.net.xml new file mode 100644 index 0000000..d2f3f34 --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/Generated.net.xml @@ -0,0 +1,59 @@ + + + + + +Network structure (NeuroML 1.x) for project: CA1PyramidalCell saved with neuroConstruct v1.7.1 on: 11:29:49, 18-Jul-14 + +Cell Group: CA1_CG contains 1 cells + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/Glu.xml b/demos/Fig5_CellMultiscale/chans/Glu.xml new file mode 100644 index 0000000..c1a7d7c --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/Glu.xml @@ -0,0 +1,16 @@ + + + + + Glutamate receptor synchan, 2 ms tau. + + + + Simple double exponential waveform glu synapse + + + diff --git a/demos/Fig5_CellMultiscale/chans/HChannel.xml b/demos/Fig5_CellMultiscale/chans/HChannel.xml new file mode 100644 index 0000000..c1c91b4 --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/HChannel.xml @@ -0,0 +1,73 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and l traces on single comp with current pulse + + Padraig Gleeson + + + + H current. Comment from original mod: I-h channel from Magee 1998 for distal dendrites + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + diff --git a/demos/Fig5_CellMultiscale/chans/NMDA.xml b/demos/Fig5_CellMultiscale/chans/NMDA.xml new file mode 100644 index 0000000..ce7e3dd --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/NMDA.xml @@ -0,0 +1,16 @@ + + + + + NMDA receptor synchan, 20 ms tau. + + + + Simple double exponential waveform NMDA synapse + + + diff --git a/demos/Fig5_CellMultiscale/chans/hd.xml b/demos/Fig5_CellMultiscale/chans/hd.xml new file mode 100644 index 0000000..a882baa --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/hd.xml @@ -0,0 +1,73 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and l traces on single comp with current pulse + + Padraig Gleeson + + + + H current. Comment from original mod: I-h channel from Magee 1998 for distal dendrites + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/kad.xml b/demos/Fig5_CellMultiscale/chans/kad.xml new file mode 100644 index 0000000..bb7c5af --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/kad.xml @@ -0,0 +1,84 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + A type K channel for distal dendrites. Comment from original mod: K-A channel from Klee Ficker and Heinemann, modified to account for Dax A Current, M.Migliore Jun 1997 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/kap.xml b/demos/Fig5_CellMultiscale/chans/kap.xml new file mode 100644 index 0000000..58fdea0 --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/kap.xml @@ -0,0 +1,86 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + A type K channel. Comment from original mod: K-A channel from Klee Ficker and Heinemann, + modified to account for Dax A Current --- M.Migliore Jun 1997, + modified to be used with cvode M.Migliore 2001 + + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/kdr.xml b/demos/Fig5_CellMultiscale/chans/kdr.xml new file mode 100644 index 0000000..180c563 --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/kdr.xml @@ -0,0 +1,75 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + Delayed rectifier K channel. Comment from original mod: K-DR channel, from Klee Ficker and Heinemann, + modified to account for Dax et al., M.Migliore 1997 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/na3.xml b/demos/Fig5_CellMultiscale/chans/na3.xml new file mode 100644 index 0000000..94e9713 --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/na3.xml @@ -0,0 +1,107 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + Note: the inactivation gate s is not included here as it was disabled in original mod file for Migliore et al. Changing the parameter below ar from 1 will not enable s! + + Padraig Gleeson + + + + Na channel. Comment from original mod: Na current, modified from Jeff Magee. M.Migliore may97, + added sh to account for higher threshold M.Migliore, Apr.2002 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chans/nax.xml b/demos/Fig5_CellMultiscale/chans/nax.xml new file mode 100644 index 0000000..1225d6a --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/nax.xml @@ -0,0 +1,88 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + Na channel for axon. Comment from original mod: Na current for axon. No slow inact. M.Migliore Jul. 1997, + added sh to account for higher threshold M.Migliore, Apr.2002 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + + + diff --git a/demos/Fig5_CellMultiscale/chans/pas.xml b/demos/Fig5_CellMultiscale/chans/pas.xml new file mode 100644 index 0000000..9abffeb --- /dev/null +++ b/demos/Fig5_CellMultiscale/chans/pas.xml @@ -0,0 +1,17 @@ + + + + ChannelML file containing a single Channel description + + + + + + 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. + + + + + + \ No newline at end of file diff --git a/demos/Fig5_CellMultiscale/chem/psd53.g b/demos/Fig5_CellMultiscale/chem/psd53.g new file mode 100644 index 0000000..e120a6a --- /dev/null +++ b/demos/Fig5_CellMultiscale/chem/psd53.g @@ -0,0 +1,477 @@ +//genesis +// kkit Version 11 flat dumpfile + +// Saved on Fri Jun 5 09:12:59 2015 + +include kkit {argv 1} + +FASTDT = 1e-05 +SIMDT = 0.0001 +CONTROLDT = 1 +PLOTDT = 0.2 +MAXTIME = 200 +TRANSIENT_TIME = 2 +VARIABLE_DT_FLAG = 1 +DEFAULT_VOL = 1e-19 +VERSION = 11.0 +setfield /file/modpath value /home2/bhalla/scripts/modules +kparms + +//genesis + +initdump -version 3 -ignoreorphans 1 +simobjdump doqcsinfo filename accessname accesstype transcriber developer \ + citation species tissue cellcompartment methodology sources \ + model_implementation model_validation x y z +simobjdump table input output alloced step_mode stepsize x y z +simobjdump xtree path script namemode sizescale +simobjdump xcoredraw xmin xmax ymin ymax +simobjdump xtext editable +simobjdump xgraph xmin xmax ymin ymax overlay +simobjdump xplot pixflags script fg ysquish do_slope wy +simobjdump group xtree_fg_req xtree_textfg_req plotfield expanded movealone \ + link savename file version md5sum mod_save_flag x y z +simobjdump geometry size dim shape outside xtree_fg_req xtree_textfg_req x y \ + z +simobjdump kpool DiffConst CoInit Co n nInit mwt nMin vol slave_enable \ + geomname xtree_fg_req xtree_textfg_req x y z +simobjdump kreac kf kb notes xtree_fg_req xtree_textfg_req x y z +simobjdump kenz CoComplexInit CoComplex nComplexInit nComplex vol k1 k2 k3 \ + keepconc usecomplex notes xtree_fg_req xtree_textfg_req link x y z +simobjdump stim level1 width1 delay1 level2 width2 delay2 baselevel trig_time \ + trig_mode notes xtree_fg_req xtree_textfg_req is_running x y z +simobjdump xtab input output alloced step_mode stepsize notes editfunc \ + xtree_fg_req xtree_textfg_req baselevel last_x last_y is_running x y z +simobjdump kchan perm gmax Vm is_active use_nernst notes xtree_fg_req \ + xtree_textfg_req x y z +simobjdump transport input output alloced step_mode stepsize dt delay clock \ + kf xtree_fg_req xtree_textfg_req x y z +simobjdump proto x y z +simobjdump text str +simundump geometry /kinetics/geometry 0 1.6667e-21 3 sphere "" white black 5 \ + -4 0 +simundump geometry /kinetics/geometry[1] 0 1e-19 3 sphere "" white black 5 -2 \ + 0 +simundump geometry /kinetics/geometry[2] 0 1e-20 3 sphere "" white black 2 2 \ + 0 +simundump geometry /kinetics/geometry[3] 0 1e-20 3 sphere "" white black 4 8 \ + 0 +simundump geometry /kinetics/geometry[4] 0 1e-20 3 sphere "" white black 2 \ + -17 0 +simundump geometry /kinetics/geometry[5] 0 1e-20 3 sphere "" white black 5 \ + -13 0 +simundump geometry /kinetics/geometry[6] 0 1e-19 3 sphere "" white black 0 7 \ + 0 +simundump geometry /kinetics/geometry[7] 0 1e-20 3 sphere "" white black 0 -3 \ + 0 +simundump geometry /kinetics/geometry[8] 0 1e-20 3 sphere "" white black -1 \ + -18 0 +simundump geometry /kinetics/geometry[9] 0 1e-18 3 sphere "" white black 0 0 \ + 0 +simundump text /kinetics/notes 0 "" +call /kinetics/notes LOAD \ +"" +simundump text /kinetics/geometry/notes 0 "" +call /kinetics/geometry/notes LOAD \ +"" +simundump text /kinetics/geometry[1]/notes 0 "" +call /kinetics/geometry[1]/notes LOAD \ +"" +simundump text /kinetics/geometry[2]/notes 0 "" +call /kinetics/geometry[2]/notes LOAD \ +"" +simundump text /kinetics/geometry[3]/notes 0 "" +call /kinetics/geometry[3]/notes LOAD \ +"" +simundump text /kinetics/geometry[4]/notes 0 "" +call /kinetics/geometry[4]/notes LOAD \ +"" +simundump text /kinetics/geometry[5]/notes 0 "" +call /kinetics/geometry[5]/notes LOAD \ +"" +simundump text /kinetics/geometry[6]/notes 0 "" +call /kinetics/geometry[6]/notes LOAD \ +"" +simundump text /kinetics/geometry[7]/notes 0 "" +call /kinetics/geometry[7]/notes LOAD \ +"" +simundump text /kinetics/geometry[8]/notes 0 "" +call /kinetics/geometry[8]/notes LOAD \ +"" +simundump text /kinetics/geometry[9]/notes 0 "" +call /kinetics/geometry[9]/notes LOAD \ +"" +simundump kreac /kinetics/exocytosis 0 0.01 0 "" white black 4 -5 0 +simundump text /kinetics/exocytosis/notes 0 "" +call /kinetics/exocytosis/notes LOAD \ +"" +simundump kreac /kinetics/endocytosis 0 0 4 "" white black -7 -5 0 +simundump text /kinetics/endocytosis/notes 0 "" +call /kinetics/endocytosis/notes LOAD \ +"" +simundump group /kinetics/PSD 0 0 black x 0 1 "" PSD defaultfile.g 0 0 0 -10 \ + -3 0 +simundump text /kinetics/PSD/notes 0 "" +call /kinetics/PSD/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Rp 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[1] \ + blue 0 -4 1 0 +simundump text /kinetics/PSD/Rp/notes 0 "" +call /kinetics/PSD/Rp/notes LOAD \ +"" +simundump kpool /kinetics/PSD/P 0 0 1 1 6 6 0 0 6 0 /kinetics/geometry[1] 61 \ + 0 -4 -2 0 +simundump text /kinetics/PSD/P/notes 0 "" +call /kinetics/PSD/P/notes LOAD \ +"" +simundump kenz /kinetics/PSD/P/P1 0 0 0 0 0 60 10.417 20 5 0 0 "" red 61 "" \ + -6 -1 0 +simundump text /kinetics/PSD/P/P1/notes 0 "" +call /kinetics/PSD/P/P1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/P/P2 0 0 0 0 0 60 10.417 20 5 0 0 "" red 61 "" \ + -2 -1 0 +simundump text /kinetics/PSD/P/P2/notes 0 "" +call /kinetics/PSD/P/P2/notes LOAD \ +"" +simundump kpool /kinetics/PSD/KK 0 0 3 3 18 18 0 0 6 0 /kinetics/geometry[1] \ + 49 0 -4 4 0 +simundump text /kinetics/PSD/KK/notes 0 "" +call /kinetics/PSD/KK/notes LOAD \ +"" +simundump kenz /kinetics/PSD/KK/KK1 0 0 0 0 0 60 4.1667 40 10 0 0 "" red 49 \ + "" -6 3 0 +simundump text /kinetics/PSD/KK/KK1/notes 0 "" +call /kinetics/PSD/KK/KK1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/KK/KK2 0 0 0 0 0 60 4.1667 40 10 0 0 "" red 49 \ + "" -2 3 0 +simundump text /kinetics/PSD/KK/KK2/notes 0 "" +call /kinetics/PSD/KK/KK2/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Rpp 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[1] \ + 28 0 0 1 0 +simundump text /kinetics/PSD/Rpp/notes 0 "" +call /kinetics/PSD/Rpp/notes LOAD \ +"" +simundump kpool /kinetics/PSD/R 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[1] 4 0 \ + -8 1 0 +simundump text /kinetics/PSD/R/notes 0 "" +call /kinetics/PSD/R/notes LOAD \ +"" +simundump kpool /kinetics/PSD/tot_PSD_R 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry[4] blue 0 -4 7 0 +simundump text /kinetics/PSD/tot_PSD_R/notes 0 "" +call /kinetics/PSD/tot_PSD_R/notes LOAD \ +"" +simundump kpool /kinetics/PSD/psd_inact_CaN 0 0 1 1 6 6 0 0 6 0 \ + /kinetics/geometry[7] blue 0 -12 5 0 +simundump text /kinetics/PSD/psd_inact_CaN/notes 0 "" +call /kinetics/PSD/psd_inact_CaN/notes LOAD \ +"" +simundump kreac /kinetics/PSD/psd_activate_CaN 0 0.27778 1 "" white 0 -11 1 0 +simundump text /kinetics/PSD/psd_activate_CaN/notes 0 "" +call /kinetics/PSD/psd_activate_CaN/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Ca.P 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[7] \ + blue 0 -4 -4 0 +simundump text /kinetics/PSD/Ca.P/notes 0 "" +call /kinetics/PSD/Ca.P/notes LOAD \ +"" +simundump kenz /kinetics/PSD/Ca.P/Ca.P2 0 0 0 0 0 6 1.6667 40 10 0 0 "" red \ + blue "" -2 -3 0 +simundump text /kinetics/PSD/Ca.P/Ca.P2/notes 0 "" +call /kinetics/PSD/Ca.P/Ca.P2/notes LOAD \ +"" +simundump kenz /kinetics/PSD/Ca.P/Ca.P1 0 0 0 0 0 6 1.6667 40 10 0 0 "" red \ + blue "" -6 -3 0 +simundump text /kinetics/PSD/Ca.P/Ca.P1/notes 0 "" +call /kinetics/PSD/Ca.P/Ca.P1/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Ca_input 0 0 0.1 0.1 0.6 0.6 0 0 6 4 \ + /kinetics/geometry[8] 60 black -12 9 0 +simundump text /kinetics/PSD/Ca_input/notes 0 "" +call /kinetics/PSD/Ca_input/notes LOAD \ +"" +simundump kreac /kinetics/PSD/Ca_reac 0 100 100 "" white black -17 6 0 +simundump text /kinetics/PSD/Ca_reac/notes 0 "" +call /kinetics/PSD/Ca_reac/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Ca 0 1e-11 0.1 0.1 0.6 0.6 0 0 6 0 \ + /kinetics/geometry[5] 53 0 -15 2 0 +simundump text /kinetics/PSD/Ca/notes 0 "" +call /kinetics/PSD/Ca/notes LOAD \ +"" +simundump group /kinetics/Bulk 0 yellow black x 0 0 "" Bulk defaultfile.g 0 0 \ + 0 -6 -16 0 +simundump text /kinetics/Bulk/notes 0 "" +call /kinetics/Bulk/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iRpp 0 0 0 0 0 0 0 0 59.999 0 \ + /kinetics/geometry 29 yellow 2 -11 0 +simundump text /kinetics/Bulk/iRpp/notes 0 "" +call /kinetics/Bulk/iRpp/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iRp 0 0 0 0 0 0 0 0 59.999 0 \ + /kinetics/geometry blue yellow -2 -11 0 +simundump text /kinetics/Bulk/iRp/notes 0 "" +call /kinetics/Bulk/iRp/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iR 0 0 4.0001 4.0001 240 240 0 0 59.999 0 \ + /kinetics/geometry 0 yellow -6 -11 0 +simundump text /kinetics/Bulk/iR/notes 0 "Same as Fus3\n" +call /kinetics/Bulk/iR/notes LOAD \ +"Same as Fus3" \ +"" +simundump kpool /kinetics/Bulk/iKK 0 0 1 1 59.999 59.999 0 0 59.999 0 \ + /kinetics/geometry 50 yellow -2 -8 0 +simundump text /kinetics/Bulk/iKK/notes 0 "Same as Ste7\n" +call /kinetics/Bulk/iKK/notes LOAD \ +"Same as Ste7" \ +"" +simundump kenz /kinetics/Bulk/iKK/iKK1 0 0 0 0 0 59.999 0.83335 40 10 0 0 "" \ + red 50 "" -4 -9 0 +simundump text /kinetics/Bulk/iKK/iKK1/notes 0 "" +call /kinetics/Bulk/iKK/iKK1/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/iKK/iKK2 0 0 0 0 0 59.999 0.83335 40 10 0 0 "" \ + red 50 "" 0 -9 0 +simundump text /kinetics/Bulk/iKK/iKK2/notes 0 "" +call /kinetics/Bulk/iKK/iKK2/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iP 0 0 0.50001 0.50001 30 30 0 0 59.999 0 \ + /kinetics/geometry 62 yellow -2 -14 0 +simundump text /kinetics/Bulk/iP/notes 0 "Same as Msg5\n" +call /kinetics/Bulk/iP/notes LOAD \ +"Same as Msg5" \ +"" +simundump kenz /kinetics/Bulk/iP/iP1 0 0 0 0 0 59.999 6.2501 60 15 0 0 "" red \ + 62 "" -4 -13 0 +simundump text /kinetics/Bulk/iP/iP1/notes 0 "" +call /kinetics/Bulk/iP/iP1/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/iP/iP2 0 0 0 0 0 59.999 6.2501 60 15 0 0 "" red \ + 62 "" 0 -13 0 +simundump text /kinetics/Bulk/iP/iP2/notes 0 "" +call /kinetics/Bulk/iP/iP2/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/PKA 0 0 0 0 0 0 0 0 60 0 /kinetics/geometry[3] \ + 43 yellow -3 -5 0 +simundump text /kinetics/Bulk/PKA/notes 0 "" +call /kinetics/Bulk/PKA/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/PKA/PKA1 0 0 0 0 0 60 0.41667 40 10 0 0 "" red \ + 43 "" -4 -7 0 +simundump text /kinetics/Bulk/PKA/PKA1/notes 0 "" +call /kinetics/Bulk/PKA/PKA1/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/PKA/PKA2 0 0 0 0 0 60 0.41667 40 10 0 0 "" red \ + 43 "" 0 -7 0 +simundump text /kinetics/Bulk/PKA/PKA2/notes 0 "" +call /kinetics/Bulk/PKA/PKA2/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/PKA/PKA_exo 0 0 0 0 0 60 0.016667 8 2 0 0 "" \ + red 43 "" 1 -5 0 +simundump text /kinetics/Bulk/PKA/PKA_exo/notes 0 "" +call /kinetics/Bulk/PKA/PKA_exo/notes LOAD \ +"" +simundump kreac /kinetics/Bulk/activate_PKA 0 0.0016667 5 "" white yellow -11 \ + -10 0 +simundump text /kinetics/Bulk/activate_PKA/notes 0 "" +call /kinetics/Bulk/activate_PKA/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/inact_PKA 0 0 1.6 1.6 96 96 0 0 60 0 \ + /kinetics/geometry[2] 51 yellow -12 -6 0 +simundump text /kinetics/Bulk/inact_PKA/notes 0 "" +call /kinetics/Bulk/inact_PKA/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/inact_CaN 0 0 0.2 0.2 12 12 0 0 60 0 \ + /kinetics/geometry[6] blue yellow -13 -18 0 +simundump text /kinetics/Bulk/inact_CaN/notes 0 "" +call /kinetics/Bulk/inact_CaN/notes LOAD \ +"" +simundump kreac /kinetics/Bulk/activate_CaN 0 0.0055556 1 "" white yellow -10 \ + -16 0 +simundump text /kinetics/Bulk/activate_CaN/notes 0 "" +call /kinetics/Bulk/activate_CaN/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/Ca 0 1e-11 0.1 0.1 6 6 0 0 60 0 \ + /kinetics/geometry[2] 50 yellow -15 -13 0 +simundump text /kinetics/Bulk/Ca/notes 0 "" +call /kinetics/Bulk/Ca/notes LOAD \ +"" +simundump kpool /kinetics/Ca_dend_input 0 0 0 0 0 0 0 0 600 0 \ + /kinetics/geometry[9] 60 black -12 -28 0 +simundump text /kinetics/Ca_dend_input/notes 0 "" +call /kinetics/Ca_dend_input/notes LOAD \ +"" +simundump kreac /kinetics/dend_Ca_reac 0 100 100 "" white black -16 -27 0 +simundump text /kinetics/dend_Ca_reac/notes 0 "" +call /kinetics/dend_Ca_reac/notes LOAD \ +"" +simundump kpool /kinetics/Ca 0 1e-11 0 0 0 0 0 0 600 0 /kinetics/geometry[9] \ + 1 black -19 -25 0 +simundump text /kinetics/Ca/notes 0 "" +call /kinetics/Ca/notes LOAD \ +"" +simundump xgraph /graphs/conc1 0 0 800 9.6002e-07 0.10547 0 +simundump xgraph /graphs/conc2 0 0 800 0 18.128 0 +simundump xplot /graphs/conc1/Ca_PSD.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 53 0 0 1 +simundump xplot /graphs/conc1/Ca_Bulk.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 41 0 0 1 +simundump xplot /graphs/conc1/PKA.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 43 0 0 1 +simundump xplot /graphs/conc1/Ca.P.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xplot /graphs/conc1/Ca_dend.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 1 0 0 1 +simundump xplot /graphs/conc2/tot_PSD_R.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xplot /graphs/conc2/Rpp.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 28 0 0 1 +simundump xgraph /moregraphs/conc3 0 0 800 0 33.241 0 +simundump xgraph /moregraphs/conc4 0 0 800 0 2 0 +simundump xcoredraw /edit/draw 0 -21 7 -30 11 +simundump xtree /edit/draw/tree 0 \ + /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \ + "edit_elm.D ; drag_from_edit.w " auto 0.6 +simundump xtext /file/notes 0 1 +xtextload /file/notes \ +"26 Nov 2014. psd51.g: based on psd50.g which was" \ +"based on psd41_back_dend.g." \ +"07 Dec 2014. psd52.g: based on psd51. Slowed down Ca_to_dend by " \ +"10x while retaining Keq." \ +"04 June 2015. psd53.g: Removed the reacts between dend, head and" \ +"psd. Will use diffusion instead." \ +"05 June 2015. psd53.g updated further to use the same name (Ca)" \ +"for Ca_dend, Ca_spine and Ca_PSD so as to get them to diffuse." \ +"" +addmsg /kinetics/Bulk/iRpp /kinetics/exocytosis SUBSTRATE n +addmsg /kinetics/PSD/Rpp /kinetics/exocytosis PRODUCT n +addmsg /kinetics/Bulk/iR /kinetics/endocytosis SUBSTRATE n +addmsg /kinetics/PSD/R /kinetics/endocytosis PRODUCT n +addmsg /kinetics/PSD/KK/KK1 /kinetics/PSD/Rp MM_PRD pA +addmsg /kinetics/PSD/KK/KK2 /kinetics/PSD/Rp REAC sA B +addmsg /kinetics/PSD/P/P2 /kinetics/PSD/Rp MM_PRD pA +addmsg /kinetics/PSD/P/P1 /kinetics/PSD/Rp REAC sA B +addmsg /kinetics/PSD/Ca.P/Ca.P2 /kinetics/PSD/Rp MM_PRD pA +addmsg /kinetics/PSD/Ca.P/Ca.P1 /kinetics/PSD/Rp REAC sA B +addmsg /kinetics/PSD/P/P1 /kinetics/PSD/P REAC eA B +addmsg /kinetics/PSD/P/P2 /kinetics/PSD/P REAC eA B +addmsg /kinetics/PSD/P /kinetics/PSD/P/P1 ENZYME n +addmsg /kinetics/PSD/Rp /kinetics/PSD/P/P1 SUBSTRATE n +addmsg /kinetics/PSD/P /kinetics/PSD/P/P2 ENZYME n +addmsg /kinetics/PSD/Rpp /kinetics/PSD/P/P2 SUBSTRATE n +addmsg /kinetics/PSD/KK/KK1 /kinetics/PSD/KK REAC eA B +addmsg /kinetics/PSD/KK/KK2 /kinetics/PSD/KK REAC eA B +addmsg /kinetics/PSD/KK /kinetics/PSD/KK/KK1 ENZYME n +addmsg /kinetics/PSD/R /kinetics/PSD/KK/KK1 SUBSTRATE n +addmsg /kinetics/PSD/KK /kinetics/PSD/KK/KK2 ENZYME n +addmsg /kinetics/PSD/Rp /kinetics/PSD/KK/KK2 SUBSTRATE n +addmsg /kinetics/PSD/KK/KK2 /kinetics/PSD/Rpp MM_PRD pA +addmsg /kinetics/PSD/P/P2 /kinetics/PSD/Rpp REAC sA B +addmsg /kinetics/exocytosis /kinetics/PSD/Rpp REAC B A +addmsg /kinetics/Bulk/PKA/PKA_exo /kinetics/PSD/Rpp MM_PRD pA +addmsg /kinetics/PSD/Ca.P/Ca.P2 /kinetics/PSD/Rpp REAC sA B +addmsg /kinetics/PSD/KK/KK1 /kinetics/PSD/R REAC sA B +addmsg /kinetics/PSD/P/P1 /kinetics/PSD/R MM_PRD pA +addmsg /kinetics/PSD/Ca.P/Ca.P1 /kinetics/PSD/R MM_PRD pA +addmsg /kinetics/endocytosis /kinetics/PSD/R REAC B A +addmsg /kinetics/PSD/R /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/Rp /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/Rpp /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/psd_inact_CaN REAC A B +addmsg /kinetics/PSD/psd_inact_CaN /kinetics/PSD/psd_activate_CaN SUBSTRATE n +addmsg /kinetics/PSD/Ca /kinetics/PSD/psd_activate_CaN SUBSTRATE n +addmsg /kinetics/PSD/Ca /kinetics/PSD/psd_activate_CaN SUBSTRATE n +addmsg /kinetics/PSD/Ca.P /kinetics/PSD/psd_activate_CaN PRODUCT n +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/Ca.P REAC B A +addmsg /kinetics/PSD/Ca.P/Ca.P2 /kinetics/PSD/Ca.P REAC eA B +addmsg /kinetics/PSD/Ca.P/Ca.P1 /kinetics/PSD/Ca.P REAC eA B +addmsg /kinetics/PSD/Ca.P /kinetics/PSD/Ca.P/Ca.P2 ENZYME n +addmsg /kinetics/PSD/Rpp /kinetics/PSD/Ca.P/Ca.P2 SUBSTRATE n +addmsg /kinetics/PSD/Ca.P /kinetics/PSD/Ca.P/Ca.P1 ENZYME n +addmsg /kinetics/PSD/Rp /kinetics/PSD/Ca.P/Ca.P1 SUBSTRATE n +addmsg /kinetics/PSD/Ca_reac /kinetics/PSD/Ca_input REAC A B +addmsg /kinetics/PSD/Ca_input /kinetics/PSD/Ca_reac SUBSTRATE n +addmsg /kinetics/PSD/Ca /kinetics/PSD/Ca_reac PRODUCT n +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/Ca REAC A B +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/Ca REAC A B +addmsg /kinetics/PSD/Ca_reac /kinetics/PSD/Ca REAC B A +addmsg /kinetics/Bulk/iKK/iKK2 /kinetics/Bulk/iRpp MM_PRD pA +addmsg /kinetics/Bulk/iP/iP2 /kinetics/Bulk/iRpp REAC sA B +addmsg /kinetics/exocytosis /kinetics/Bulk/iRpp REAC A B +addmsg /kinetics/Bulk/PKA/PKA2 /kinetics/Bulk/iRpp MM_PRD pA +addmsg /kinetics/Bulk/PKA/PKA_exo /kinetics/Bulk/iRpp REAC sA B +addmsg /kinetics/Bulk/iKK/iKK1 /kinetics/Bulk/iRp MM_PRD pA +addmsg /kinetics/Bulk/iKK/iKK2 /kinetics/Bulk/iRp REAC sA B +addmsg /kinetics/Bulk/iP/iP2 /kinetics/Bulk/iRp MM_PRD pA +addmsg /kinetics/Bulk/iP/iP1 /kinetics/Bulk/iRp REAC sA B +addmsg /kinetics/Bulk/PKA/PKA1 /kinetics/Bulk/iRp MM_PRD pA +addmsg /kinetics/Bulk/PKA/PKA2 /kinetics/Bulk/iRp REAC sA B +addmsg /kinetics/Bulk/iKK/iKK1 /kinetics/Bulk/iR REAC sA B +addmsg /kinetics/Bulk/iP/iP1 /kinetics/Bulk/iR MM_PRD pA +addmsg /kinetics/Bulk/PKA/PKA1 /kinetics/Bulk/iR REAC sA B +addmsg /kinetics/endocytosis /kinetics/Bulk/iR REAC A B +addmsg /kinetics/Bulk/iKK/iKK1 /kinetics/Bulk/iKK REAC eA B +addmsg /kinetics/Bulk/iKK/iKK2 /kinetics/Bulk/iKK REAC eA B +addmsg /kinetics/Bulk/iKK /kinetics/Bulk/iKK/iKK1 ENZYME n +addmsg /kinetics/Bulk/iR /kinetics/Bulk/iKK/iKK1 SUBSTRATE n +addmsg /kinetics/Bulk/iKK /kinetics/Bulk/iKK/iKK2 ENZYME n +addmsg /kinetics/Bulk/iRp /kinetics/Bulk/iKK/iKK2 SUBSTRATE n +addmsg /kinetics/Bulk/iP/iP1 /kinetics/Bulk/iP REAC eA B +addmsg /kinetics/Bulk/iP/iP2 /kinetics/Bulk/iP REAC eA B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/iP REAC B A +addmsg /kinetics/Bulk/iP /kinetics/Bulk/iP/iP1 ENZYME n +addmsg /kinetics/Bulk/iRp /kinetics/Bulk/iP/iP1 SUBSTRATE n +addmsg /kinetics/Bulk/iP /kinetics/Bulk/iP/iP2 ENZYME n +addmsg /kinetics/Bulk/iRpp /kinetics/Bulk/iP/iP2 SUBSTRATE n +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/PKA REAC B A +addmsg /kinetics/Bulk/PKA/PKA1 /kinetics/Bulk/PKA REAC eA B +addmsg /kinetics/Bulk/PKA/PKA2 /kinetics/Bulk/PKA REAC eA B +addmsg /kinetics/Bulk/PKA/PKA_exo /kinetics/Bulk/PKA REAC eA B +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/PKA/PKA1 ENZYME n +addmsg /kinetics/Bulk/iR /kinetics/Bulk/PKA/PKA1 SUBSTRATE n +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/PKA/PKA2 ENZYME n +addmsg /kinetics/Bulk/iRp /kinetics/Bulk/PKA/PKA2 SUBSTRATE n +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/PKA/PKA_exo ENZYME n +addmsg /kinetics/Bulk/iRpp /kinetics/Bulk/PKA/PKA_exo SUBSTRATE n +addmsg /kinetics/Bulk/inact_PKA /kinetics/Bulk/activate_PKA SUBSTRATE n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_PKA SUBSTRATE n +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/activate_PKA PRODUCT n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_PKA SUBSTRATE n +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/inact_PKA REAC A B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/inact_CaN REAC A B +addmsg /kinetics/Bulk/inact_CaN /kinetics/Bulk/activate_CaN SUBSTRATE n +addmsg /kinetics/Bulk/iP /kinetics/Bulk/activate_CaN PRODUCT n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_CaN SUBSTRATE n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_CaN SUBSTRATE n +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/dend_Ca_reac /kinetics/Ca_dend_input REAC A B +addmsg /kinetics/Ca_dend_input /kinetics/dend_Ca_reac SUBSTRATE n +addmsg /kinetics/Ca /kinetics/dend_Ca_reac PRODUCT n +addmsg /kinetics/dend_Ca_reac /kinetics/Ca REAC B A +addmsg /kinetics/PSD/Ca /graphs/conc1/Ca_PSD.Co PLOT Co *Ca_PSD.Co *53 +addmsg /kinetics/Bulk/Ca /graphs/conc1/Ca_Bulk.Co PLOT Co *Ca_Bulk.Co *41 +addmsg /kinetics/Bulk/PKA /graphs/conc1/PKA.Co PLOT Co *PKA.Co *43 +addmsg /kinetics/PSD/Ca.P /graphs/conc1/Ca.P.Co PLOT Co *Ca.P.Co *blue +addmsg /kinetics/Ca /graphs/conc1/Ca_dend.Co PLOT Co *Ca_dend.Co *1 +addmsg /kinetics/PSD/tot_PSD_R /graphs/conc2/tot_PSD_R.Co PLOT Co *tot_PSD_R.Co *blue +addmsg /kinetics/PSD/Rpp /graphs/conc2/Rpp.Co PLOT Co *Rpp.Co *28 +enddump +// End of dump + +call /kinetics/Bulk/iR/notes LOAD \ +"Same as Fus3" \ +"" +call /kinetics/Bulk/iKK/notes LOAD \ +"Same as Ste7" \ +"" +call /kinetics/Bulk/iP/notes LOAD \ +"Same as Msg5" \ +"" +complete_loading diff --git a/demos/Fig6_NetMultiscale/Fig6A.py b/demos/Fig6_NetMultiscale/Fig6A.py new file mode 100644 index 0000000..b8646bc --- /dev/null +++ b/demos/Fig6_NetMultiscale/Fig6A.py @@ -0,0 +1,503 @@ +#!/usr/bin/env python +#/********************************************************************** +#** This program is part of 'MOOSE', the +#** Messaging Object Oriented Simulation Environment. +#** Copyright (C) 2003-2014 Upinder S. Bhalla. and NCBS +#** It is made available under the terms of the +#** GNU Lesser General Public License version 2.1 +#** See the file COPYING.LIB for the full notice. +#**********************************************************************/ + +''' +This LIF network with Ca plasticity is based on: +David Higgins, Michael Graupner, Nicolas Brunel + Memory Maintenance in Synapses with Calcium-Based + Plasticity in the Presence of Background Activity + PLOS Computational Biology, 2014. + +Implemented by: Aditya Gilra, NCBS, Bangalore, October, 2014. +This variant has 2500 LIF neurons + +Upi Bhalla, Nov 2014: Appended single neuron model. +This script generates Panel A from Figure 6. It is a dummy for showing +the layout, and loads in about 20 seconds. +''' + +## import modules and functions to be used +import numpy as np +import matplotlib.pyplot as plt +import random +import time +import moose +from PyQt5 import Qt, QtCore, QtGui +from numpy import random as nprand +from moose.neuroml.NeuroML import NeuroML +import sys +sys.path.append( "/home/bhalla/moose/trunk/Demos/util" ) +import rdesigneur as rd +import moogli +cellname = "./cells_channels/CA1_nochans.morph.xml" +#cellname = "./ca1_minimal.p" +fname = "fig6bcde" + +############################################# +np.random.seed(100) # set seed for reproducibility of simulations +random.seed(100) # set seed for reproducibility of simulations +moose.seed(100) # set seed for reproducibility of simulations + +############################################# +# All parameters as per: +# David Higgins, Michael Graupner, Nicolas Brunel +# Memory Maintenance in Synapses with Calcium-Based +# Plasticity in the Presence of Background Activity +# PLOS Computational Biology, 2014. +############################################# + +############################################# +# Neuron model +############################################# + +# equation: dv/dt = (1/taum)*(-(v-el)) + inp +# with spike when v>vt, reset to vr + +PI = 3.14159265358979 +useGssa = True +combineSegments = False + +el = -70e-3 #V # Resting potential +vt = -50e-3 #V # Spiking threshold +Rm = 20e6 #Ohm # Only taum is needed, but LIF neuron accepts +Cm = 1e-9 #F # Rm and Cm and constructs taum=Rm*Cm +taum = Rm*Cm #s # Membrane time constant is 20 ms +vr = -60e-3 #V # Reset potential +Iinject = 10e-3/Rm # constant current injection into LIF neuron + # same as setting el=-70+15=-55 mV and inp=0 +noiseInj = True # inject noisy current into each cell: boolean +noiseInjSD = 5e-3/Rm #A # SD of noise added to 'current' + # SD*sqrt(taum) is used as noise current SD + +############################################# +# Network parameters: numbers +############################################# + +N = 2500 # Total number of neurons +fexc = 0.8 # Fraction of exc neurons +NE = int(fexc*N) # Number of excitatory cells +NI = N-NE # Number of inhibitory cells + +############################################# +# Simulation parameters +############################################# + +simtime = 30 #s # Simulation time +interTetInterval = 5.0 # sec +updateDt = 0.2 #s: time to update live display +dt = 1e-3 #s # time step + +############################################# +# Network parameters: synapses (not for ExcInhNetBase) +############################################# + +## With each presynaptic spike in exc / inh neuron, +## J / -g*J is added to post-synaptic Vm -- delta-fn synapse +## Since LIF neuron used below is derived from Compartment class, +## conductance-based synapses (SynChan class) can also be used. + +C = 100 # Number of incoming connections on each neuron (exc or inh) +fC = fexc # fraction fC incoming connections are exc, rest inhibitory +J = 0.2e-3 #V # exc strength is J (in V as we add to voltage) + # Critical J is ~ 0.45e-3 V in paper for N = 10000, C = 1000 + # See what happens for J = 0.2e-3 V versus J = 0.8e-3 V +g = 4.0 # -gJ is the inh strength. For exc-inh balance g >~ f(1-f)=4 +syndelay = dt # synaptic delay: +refrT = 0.0 # s # absolute refractory time + +############################################# +# Ca Plasticity parameters: synapses (not for ExcInhNetBase) +############################################# + +CaPlasticity = True # set it True or False to turn on/off plasticity +tauCa = 22.6936e-3 # s # Ca decay time scale +tauSyn = 346.3615 # s # synaptic plasticity time scale +## in vitro values in Higgins et al 2014, faster plasticity +CaPre = 0.56175 # mM + +CaPost = 1.2964 # mM +## in vivo values in Higgins et al 2014, slower plasticity +#CaPre = 0.33705 # mM +#CaPost = 0.74378 # mM +delayD = 4.6098e-3 # s # CaPre is added to Ca after this delay + # proxy for rise-time of NMDA +thetaD = 1.0 # mM # depression threshold for Ca +thetaP = 1.3 # mM # potentiation threshold for Ca +gammaD = 331.909 # factor for depression term +gammaP = 725.085 # factor for potentiation term + +eqWeight = 0.5 # initial synaptic weight + # gammaP/(gammaP+gammaD) = eq weight w/o noise + # but see eqn (22), noiseSD also appears + +bistable = True # if bistable is True, use bistable potential for weights +noisy = True # use noisy weight updates given by noiseSD +noiseSD = 3.3501 # if noisy, use noiseSD (3.3501 from Higgins et al 2014) +#noiseSD = 0.1 # if bistable==False, use a smaller noise than in Higgins et al 2014 + +############################################# +# Here we set up a single neuron to fit in this network +############################################# + +diffDt = 0.005 +chemDt = 0.005 +ePlotDt = 0.5e-3 +cPlotDt = 0.005 + +############################################# +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + cellProto = [ [cellname, 'elec'] ] + chanProto = [ + ['./cells_channels/hd.xml'], \ + ['./cells_channels/kap.xml'], \ + ['./cells_channels/kad.xml'], \ + ['./cells_channels/kdr.xml'], \ + ['./cells_channels/na3.xml'], \ + ['./cells_channels/nax.xml'], \ + ['./cells_channels/CaConc.xml'], \ + ['./cells_channels/Ca.xml'], \ + ['./cells_channels/NMDA.xml'], \ + ['./cells_channels/Glu.xml'], \ + ['./cells_channels/GABA.xml'] \ + ] + spineProto = [ \ + ['makeSpineProto()', 'spine' ] + ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + passiveDistrib = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", \ + "Em", "-58e-3", "initVm", "-65e-3" ], \ + [ ".", "#axon#", "RA", "0.5" ] \ + ] + chanDistrib = [ \ + ["hd", "#dend#,#apical#,#user#", "Gbar", "5e-2*(1+(p*3e4))" ], \ + ["kdr", "#", "Gbar", "100" ], \ + ["na3", "#soma#,#dend#,#apical#,#user#", "Gbar", "250" ], \ + ["nax", "#axon#", "Gbar", "1250" ], \ + ["nax", "#soma#", "Gbar", "100" ], \ + ["kap", "#axon#,#soma#", "Gbar", "300" ], \ + ["kap", "#dend#,#apical#,#user#", "Gbar", \ + "300*(H(100-p*1e6)) * (1+(p*1e4))" ], \ + ["Ca_conc", "#soma#,#dend#,#apical#,#user#", "tau", "0.0133" ], \ + ["kad", "#dend#,#apical#,#user#", "Gbar", \ + "300*H(p*1e6-100)*(1+p*1e4)" ], \ + ["Ca", "#soma#", "Gbar", "10e-3" ], \ + ["Ca", "#dend#,#apical#,#user#", "Gbar", "50e-3" ], \ + ["GABA", "#dend#,#apical#,#user#", "Gbar", "100*H(250e-6 - p)" ], \ + ] + spineDistrib = [ \ + ["spine", '#apical#,#dend#,#user#', "spineSpacing", "6.2e-6", \ + "spineSpacingDistrib", "1e-6", \ + "angle", "0", \ + "angleDistrib", str( 2*PI ), \ + "size", "1", \ + "sizeDistrib", "0.5" ] \ + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + passiveDistrib = passiveDistrib, \ + spineDistrib = spineDistrib, \ + chanDistrib = chanDistrib, \ + cellProto = cellProto, \ + spineProto = spineProto, \ + chanProto = chanProto, \ + ) + + return rdes + + +############################################# + +def makeDetailedNeuron(): + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + #bcs.addAllPlots() + + +############################################# +# Exc-Inh network base class without connections +############################################# + +class ExcInhNetBase: + """Simulates and plots LIF neurons (exc and inh separate). + Author: Aditya Gilra, NCBS, Bangalore, India, October 2014 + """ + + def __init__(self,N=N,fexc=fexc,el=el,vt=vt,Rm=Rm,Cm=Cm,vr=vr,\ + refrT=refrT,Iinject=Iinject): + """ Constructor of the class """ + + self.N = N # Total number of neurons + self.fexc = fexc # Fraction of exc neurons + self.NmaxExc = int(fexc*N) # max idx of exc neurons, rest inh + + self.el = el # Resting potential + self.vt = vt # Spiking threshold + self.taum = taum # Membrane time constant + self.vr = vr # Reset potential + self.refrT = refrT # Absolute refractory period + self.Rm = Rm # Membrane resistance + self.Cm = Cm # Membrane capacitance + self.Iinject = Iinject # constant input current + self.noiseInjSD = noiseInjSD # SD of injected noise + + self.simif = False # whether the simulation is complete + + self._setup_network() + + def __str__(self): + return "LIF network of %d neurons "\ + "having %d exc." % (self.N,self.NmaxExc) + + def _setup_network(self): + """Sets up the network (_init_network is enough)""" + self.network = moose.LIF( 'network', self.N ); + moose.le( '/network' ) + self.network.vec.Em = self.el + self.network.vec.thresh = self.vt + self.network.vec.refractoryPeriod = self.refrT + self.network.vec.Rm = self.Rm + self.network.vec.vReset = self.vr + self.network.vec.Cm = self.Cm + if not noiseInj: + self.network.vec.inject = self.Iinject + else: + ## inject a constant + noisy current + ## values are set in self.simulate() + self.noiseTables = moose.StimulusTable('noiseTables',self.N) + moose.connect( self.noiseTables, 'output', \ + self.network, 'setInject', 'OneToOne') + + def _init_network(self,v0=el): + """Initialises the network variables before simulation""" + self.network.vec.initVm = v0 + + def _init_plots(self): + ## make a few tables to store a few Vm-s + numVms = 10 + self.plots = moose.Table( '/plotVms', numVms ) + ## draw numVms out of N neurons + nrnIdxs = random.sample(list(range(self.N)),numVms) + for i in range( numVms ): + moose.connect( self.network.vec[nrnIdxs[i]], 'VmOut', \ + self.plots.vec[i], 'input') + + ## make self.N tables to store spikes of all neurons + self.spikes = moose.Table( '/plotSpikes', self.N ) + moose.connect( self.network, 'spikeOut', \ + self.spikes, 'input', 'OneToOne' ) + + ## make 2 tables to store spikes of all exc and all inh neurons + self.spikesExc = moose.Table( '/plotSpikesAllExc' ) + for i in range(self.NmaxExc): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesExc, 'input' ) + self.spikesInh = moose.Table( '/plotSpikesAllInh' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesInh, 'input' ) + + def _plot(self, fig): + """ plots the spike raster for the simulated net""" + plt.figure(1) + + ax = plt.subplot(221) + cleanAx( ax, 'B' ) + plt.ylabel( 'Neuron #', fontsize = 16 ) + for i in range(0,self.NmaxExc): + if i==0: label = 'Exc. spike trains' + else: label = '' + spikes = self.spikes.vec[i].vector + ax.plot(spikes,[i]*len(spikes),\ + 'b.',marker='.', markersize = 2, label=label) + for i in range(self.NmaxExc,self.N): + if i==self.NmaxExc: label = 'Inh. spike trains' + else: label = '' + spikes = self.spikes.vec[i].vector + ax.plot(spikes,[i]*len(spikes),\ + 'r.',marker='.', markersize = 2, label=label) + +############################################# +# Exc-Inh network class with Ca plasticity based connections +# (inherits from ExcInhNetBase) +############################################# + +class ExcInhNet(ExcInhNetBase): + """ Recurrent network simulation """ + + def __init__(self,J=J,incC=C,fC=fC,scaleI=g,syndelay=syndelay,**kwargs): + """Overloads base (parent) class""" + self.J = J # exc connection weight + self.incC = incC # number of incoming connections per neuron + self.fC = fC # fraction of exc incoming connections + self.excC = int(fC*incC)# number of exc incoming connections + self.scaleI = scaleI # inh weight is scaleI*J + self.syndelay = syndelay# synaptic delay + + # call the parent class constructor + ExcInhNetBase.__init__(self,**kwargs) + + def __str__(self): + return "LIF network of %d neurons "\ + "of which %d are exc." % (self.N,self.NmaxExc) + + def _init_network(self,**args): + ExcInhNetBase._init_network(self,**args) + + def _init_plots(self): + ExcInhNetBase._init_plots(self) + + def _setup_network(self): + ## Set up the neurons without connections + ExcInhNetBase._setup_network(self) + + ## Now, add in the connections... + ## Each pre-synaptic spike cause Vm of post-neuron to rise by + ## synaptic weight in one time step i.e. delta-fn synapse. + ## Since LIF neuron is derived from Compartment class, + ## conductance-based synapses (SynChan class) can also be used. + + ## E to E synapses can be plastic + ## Two ways to do this: + ## 1) Each LIF neuron has one incoming postsynaptic SynHandler, + ## which collects the activation from all presynaptic neurons, + ## but then a common Ca pool is used. + ## 2) Each LIF neuron has multiple postsyanptic SynHandlers, + ## one for each pre-synaptic neuron, i.e. one per synapse, + ## then each synapse has a different Ca pool. + ## Here we go with option 2) as per Higgins et al 2014 (Brunel private email) + ## separate SynHandler per EE synapse, thus NmaxExc*excC + if CaPlasticity: + self.synsEE = moose.GraupnerBrunel2012CaPlasticitySynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + else: + self.synsEE = moose.SimpleSynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + moose.useClock( 0, '/network/synsEE', 'process' ) + + ## I to E synapses are not plastic + self.synsIE = moose.SimpleSynHandler( '/network/synsIE', self.NmaxExc ) + ## all synapses to I neurons are not plastic + self.synsI = moose.SimpleSynHandler( '/network/synsI', self.N-self.NmaxExc ) + ## connect all SynHandlers to their respective neurons + + moose.useClock( 0, '/network/synsIE', 'process' ) + moose.useClock( 0, '/network/synsI', 'process' ) + +############################################# +# Make plots +############################################# + +def interlude( view ): + view.yaw( 0.005 ) + +def create_viewer(rdes): + # print "Creating 3D Viewer" + network = moogli.extensions.moose.read(path=rdes.elecid.path, + vertices=10) + # print "Read Network" + network.set("color", moogli.colors.LIGHT_BLUE) + network.groups["spine"].set("color", moogli.colors.ORANGE) + # for dendrite in dendrites.values(): + # dendrite.set_colors(moogli.core.Vec4f(173 / 255.0, 216 / 255.0, 230 / 255.0, 1.0)) + + [shape.set_radius(shape.get_apex_radius() * 4.0) for shape in + list(network.groups["spine"].groups["head"].shapes.values())] + # print "Creating LIFS" + soma = network.shapes[rdes.soma.path] + + center = soma.get_center() + row_axis = moogli.geometry.X_AXIS + row_count = 50 + row_separation = soma.get_base_radius() * 5.0 + col_axis = moogli.geometry.Z_AXIS + col_count = 50 + col_separation = row_separation + radii = soma.get_base_radius() + colors = moogli.colors.GREEN + vertices = 20 + lifs = moogli.shapes.Sphere.grid("LIF", + center, + row_axis, + row_count, + row_separation, + col_axis, + col_count, + col_separation, + radii, + colors, + vertices) + # print "Created LIFS" + # morphology.create_group("dendrites", dendrites, 0.0, 300.0, colormap) + # print "Creating Viewer" + viewer = moogli.Viewer("viewer") # prelude = prelude, interlude = interlude) + # print "Created Viewer" + viewer.attach_shapes(list(network.shapes.values())) + viewer.attach_shapes(list(lifs.shapes.values())) + # print "Attached Shapes" + view = moogli.View("view", interlude=interlude) + viewer.attach_view(view) + # print "Attached View" + viewer.showMaximized() + viewer.start() + view.zoom( 0.4 ) + view.pitch( PI/2.5 ) + return viewer + +if __name__=='__main__': + ## ExcInhNetBase has unconnected neurons, + ## ExcInhNet connects them + ## Instantiate either ExcInhNetBase or ExcInhNet below + #net = ExcInhNetBase(N=N) + net = ExcInhNet(N=N) + print(net) + moose.le( '/' ) + moose.le( '/network' ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + + app = QtGui.QApplication(sys.argv) + viewer = create_viewer(rdes) + app.exec_() diff --git a/demos/Fig6_NetMultiscale/Fig6BCDE.py b/demos/Fig6_NetMultiscale/Fig6BCDE.py new file mode 100644 index 0000000..876be18 --- /dev/null +++ b/demos/Fig6_NetMultiscale/Fig6BCDE.py @@ -0,0 +1,941 @@ +#/********************************************************************** +#** This program is part of 'MOOSE', the +#** Messaging Object Oriented Simulation Environment. +#** Copyright (C) 2003-2014 Upinder S. Bhalla. and NCBS +#** It is made available under the terms of the +#** GNU Lesser General Public License version 2.1 +#** See the file COPYING.LIB for the full notice. +#**********************************************************************/ + +''' +This LIF network with Ca plasticity is based on: +David Higgins, Michael Graupner, Nicolas Brunel + Memory Maintenance in Synapses with Calcium-Based + Plasticity in the Presence of Background Activity + PLOS Computational Biology, 2014. + +Implemented by: Aditya Gilra, NCBS, Bangalore, October, 2014. +This variant has 2500 LIF neurons + +Upi Bhalla, Nov 2014: Appended single neuron model. +This script generates the panels in Figure 6. It takes a long time, +about 65 minutes to run 30 seconds of simulation time. +''' + +from __future__ import print_function + +## import modules and functions to be used +import numpy as np +import matplotlib.pyplot as plt +import random +import time +import moose +from PyQt5 import Qt, QtCore, QtGui +from numpy import random as nprand +from moose.neuroml.NeuroML import NeuroML +import sys +sys.path.append( "/home/bhalla/moose/trunk/Demos/util" ) +import rdesigneur as rd +import moogli +cellname = "./cells_channels/CA1_nochans.morph.xml" +#cellname = "./ca1_minimal.p" +fname = "fig6bcde" + +############################################# +np.random.seed(100) # set seed for reproducibility of simulations +random.seed(100) # set seed for reproducibility of simulations +moose.seed(100) # set seed for reproducibility of simulations + +############################################# +# All parameters as per: +# David Higgins, Michael Graupner, Nicolas Brunel +# Memory Maintenance in Synapses with Calcium-Based +# Plasticity in the Presence of Background Activity +# PLOS Computational Biology, 2014. +############################################# + +############################################# +# Neuron model +############################################# + +# equation: dv/dt = (1/taum)*(-(v-el)) + inp +# with spike when v>vt, reset to vr + +PI = 3.14159265358979 +useGssa = True +combineSegments = False + +el = -70e-3 #V # Resting potential +vt = -50e-3 #V # Spiking threshold +Rm = 20e6 #Ohm # Only taum is needed, but LIF neuron accepts +Cm = 1e-9 #F # Rm and Cm and constructs taum=Rm*Cm +taum = Rm*Cm #s # Membrane time constant is 20 ms +vr = -60e-3 #V # Reset potential +Iinject = 10e-3/Rm # constant current injection into LIF neuron + # same as setting el=-70+15=-55 mV and inp=0 +noiseInj = True # inject noisy current into each cell: boolean +noiseInjSD = 5e-3/Rm #A # SD of noise added to 'current' + # SD*sqrt(taum) is used as noise current SD + +############################################# +# Network parameters: numbers +############################################# + +N = 2500 # Total number of neurons +fexc = 0.8 # Fraction of exc neurons +NE = int(fexc*N) # Number of excitatory cells +NI = N-NE # Number of inhibitory cells + +############################################# +# Simulation parameters +############################################# + +simtime = 30 #s # Simulation time +interTetInterval = 5.0 # sec +updateDt = 0.2 #s: time to update live display +dt = 1e-3 #s # time step + +############################################# +# Network parameters: synapses (not for ExcInhNetBase) +############################################# + +## With each presynaptic spike in exc / inh neuron, +## J / -g*J is added to post-synaptic Vm -- delta-fn synapse +## Since LIF neuron used below is derived from Compartment class, +## conductance-based synapses (SynChan class) can also be used. + +C = 100 # Number of incoming connections on each neuron (exc or inh) +fC = fexc # fraction fC incoming connections are exc, rest inhibitory +J = 0.2e-3 #V # exc strength is J (in V as we add to voltage) + # Critical J is ~ 0.45e-3 V in paper for N = 10000, C = 1000 + # See what happens for J = 0.2e-3 V versus J = 0.8e-3 V +g = 4.0 # -gJ is the inh strength. For exc-inh balance g >~ f(1-f)=4 +syndelay = dt # synaptic delay: +refrT = 0.0 # s # absolute refractory time + +############################################# +# Ca Plasticity parameters: synapses (not for ExcInhNetBase) +############################################# + +CaPlasticity = True # set it True or False to turn on/off plasticity +tauCa = 22.6936e-3 # s # Ca decay time scale +tauSyn = 346.3615 # s # synaptic plasticity time scale +## in vitro values in Higgins et al 2014, faster plasticity +CaPre = 0.56175 # mM + +CaPost = 1.2964 # mM +## in vivo values in Higgins et al 2014, slower plasticity +#CaPre = 0.33705 # mM +#CaPost = 0.74378 # mM +delayD = 4.6098e-3 # s # CaPre is added to Ca after this delay + # proxy for rise-time of NMDA +thetaD = 1.0 # mM # depression threshold for Ca +thetaP = 1.3 # mM # potentiation threshold for Ca +gammaD = 331.909 # factor for depression term +gammaP = 725.085 # factor for potentiation term + +eqWeight = 0.5 # initial synaptic weight + # gammaP/(gammaP+gammaD) = eq weight w/o noise + # but see eqn (22), noiseSD also appears + +bistable = True # if bistable is True, use bistable potential for weights +noisy = True # use noisy weight updates given by noiseSD +noiseSD = 3.3501 # if noisy, use noiseSD (3.3501 from Higgins et al 2014) +#noiseSD = 0.1 # if bistable==False, use a smaller noise than in Higgins et al 2014 + +############################################# +# Here we set up a single neuron to fit in this network +############################################# + +diffDt = 0.005 +chemDt = 0.005 +ePlotDt = 0.5e-3 +cPlotDt = 0.005 + +############################################# +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + cellProto = [ [cellname, 'elec'] ] + chanProto = [ + ['./cells_channels/hd.xml'], \ + ['./cells_channels/kap.xml'], \ + ['./cells_channels/kad.xml'], \ + ['./cells_channels/kdr.xml'], \ + ['./cells_channels/na3.xml'], \ + ['./cells_channels/nax.xml'], \ + ['./cells_channels/CaConc.xml'], \ + ['./cells_channels/Ca.xml'], \ + ['./cells_channels/NMDA.xml'], \ + ['./cells_channels/Glu.xml'], \ + ['./cells_channels/GABA.xml'] \ + ] + spineProto = [ \ + ['makeSpineProto()', 'spine' ] + ] + chemProto = [ \ + [ 'psd53.g', 'ltpModel'] \ + ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + passiveDistrib = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", \ + "Em", "-58e-3", "initVm", "-65e-3" ], \ + [ ".", "#axon#", "RA", "0.5" ] \ + ] + chanDistrib = [ \ + ["hd", "#dend#,#apical#,#user#", "Gbar", "5e-2*(1+(p*3e4))" ], \ + ["kdr", "#", "Gbar", "100" ], \ + ["na3", "#soma#,#dend#,#apical#,#user#", "Gbar", "250" ], \ + ["nax", "#axon#", "Gbar", "1250" ], \ + ["nax", "#soma#", "Gbar", "100" ], \ + ["kap", "#axon#,#soma#", "Gbar", "300" ], \ + ["kap", "#dend#,#apical#,#user#", "Gbar", \ + "300*(H(100-p*1e6)) * (1+(p*1e4))" ], \ + ["Ca_conc", "#soma#,#dend#,#apical#,#user#", "tau", "0.0133" ], \ + ["kad", "#dend#,#apical#,#user#", "Gbar", \ + "300*H(p*1e6-100)*(1+p*1e4)" ], \ + ["Ca", "#soma#", "Gbar", "10e-3" ], \ + ["Ca", "#dend#,#apical#,#user#", "Gbar", "50e-3" ], \ + ["GABA", "#dend#,#apical#,#user#", "Gbar", "100*H(250e-6 - p)" ], \ + ] + spineDistrib = [ \ + ["spine", '#apical#,#dend#,#user#', "spineSpacing", "6.2e-6", \ + "spineSpacingDistrib", "1e-6", \ + "angle", "0", \ + "angleDistrib", str( 2*PI ), \ + "size", "1", \ + "sizeDistrib", "0.5" ] \ + ] + chemDistrib = [ \ + [ "ltpModel", "#apical#,#dend#,#user#", "install", "1" ] \ + ] + + ''' + ''' + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField couplingExpr [wildcard][spatialExpn] + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [ + [ 'Ca_conc', 'Ca', 'psd/Ca_input', 'concInit', 8e-5, 1 ], + [ 'Ca_conc', 'Ca', 'dend/Ca_dend_input', 'concInit', 8e-5, 1 ], + [ 'psd/tot_PSD_R', 'n', 'glu', 'modulation', 0.5, 0.002 ], + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + passiveDistrib = passiveDistrib, \ + spineDistrib = spineDistrib, \ + chanDistrib = chanDistrib, \ + chemDistrib = chemDistrib, \ + cellProto = cellProto, \ + spineProto = spineProto, \ + chanProto = chanProto, \ + chemProto = chemProto, \ + adaptorList = adaptorList + ) + + return rdes + + +############################################# + +def makeDetailedNeuron(): + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + #bcs.addAllPlots() + +def connectDetailedNeuron(): + excProb = 0.00042 + excSeed = 1234 + inhProb = 0.00013 + inhSeed = 4567 + numExc = 0 + numNMDA = 0 + numInh = 0 + delayMax = 0.010 + delayMin = 0.002 + excWeightMax = 360 + nmdaWeightMax = 1 + inhWeightMax = 100 + # Note we use the same seed for all 3 exc connections, to make sure + # they are all equivalent. + seed = excSeed + totGluWt = 0.0 + totNMDAWt = 0.0 + totGABAWt = 0.0 + for x in moose.wildcardFind( '/model/elec/#/glu/##[ISA=Synapse]' ): + exc = moose.connect( '/network', 'spikeOut', x, 'addSpike','sparse') + exc.setRandomConnectivity( excProb, seed ) + seed = seed + 1 + if exc.numEntries > 0: + numExc += exc.numEntries + assert( exc.numEntries == x.numField ) + x.vec.delay = delayMin + nprand.rand( exc.numEntries ) * ( delayMax - delayMin ) + x.vec.weight = nprand.rand( exc.numEntries ) * excWeightMax + #x.parent.tick = 4 + x.parent.parent.tick = 4 + print('+', end=' ') + totGluWt += sum(x.vec.weight) * x.parent.parent.Gbar + + seed = excSeed + for x in moose.wildcardFind( '/model/elec/#/NMDA/##[ISA=Synapse]' ): + #print " x = ", x + exc = moose.connect( '/network', 'spikeOut', x, 'addSpike','sparse') + exc.setRandomConnectivity( excProb, seed ) + seed = seed + 1 + if exc.numEntries > 0: + numNMDA += exc.numEntries + assert( exc.numEntries == x.numField ) + x.vec.delay = delayMin + nprand.rand( exc.numEntries ) * ( delayMax - delayMin ) + x.vec.weight = nprand.rand( exc.numEntries ) * nmdaWeightMax + #x.parent.tick = 4 + x.parent.parent.tick = 4 + print('*', end=' ') + totNMDAWt += sum(x.vec.weight) * x.parent.parent.Gbar + + seed = inhSeed + for x in moose.wildcardFind( '/model/elec/#/GABA/##[ISA=Synapse]' ): + #print x + inh = moose.connect( '/network', 'spikeOut', x, 'addSpike','sparse') + inh.setRandomConnectivity( inhProb, seed ) + seed = seed + 1 + if inh.numEntries > 0: + numInh += inh.numEntries + x.vec.delay = delayMin + nprand.rand( inh.numEntries ) * ( delayMax - delayMin ) + x.vec.weight = nprand.rand( inh.numEntries ) * inhWeightMax + #x.parent.tick = 4 + x.parent.parent.tick = 4 + print('-', end=' ') + totGABAWt += sum(x.vec.weight) * x.parent.parent.Gbar + + print('connectDetailedNeuron: numExc = ', numExc, ', numNMDA=', numNMDA, ', numInh = ', numInh) + print('connectDetailedNeuron: totWts Glu = ', totGluWt, ', NMDA = ', totNMDAWt, ', GABA = ', totGABAWt) + +############################################# +# Exc-Inh network base class without connections +############################################# + +class ExcInhNetBase: + """Simulates and plots LIF neurons (exc and inh separate). + Author: Aditya Gilra, NCBS, Bangalore, India, October 2014 + """ + + def __init__(self,N=N,fexc=fexc,el=el,vt=vt,Rm=Rm,Cm=Cm,vr=vr,\ + refrT=refrT,Iinject=Iinject): + """ Constructor of the class """ + + self.N = N # Total number of neurons + self.fexc = fexc # Fraction of exc neurons + self.NmaxExc = int(fexc*N) # max idx of exc neurons, rest inh + + self.el = el # Resting potential + self.vt = vt # Spiking threshold + self.taum = taum # Membrane time constant + self.vr = vr # Reset potential + self.refrT = refrT # Absolute refractory period + self.Rm = Rm # Membrane resistance + self.Cm = Cm # Membrane capacitance + self.Iinject = Iinject # constant input current + self.noiseInjSD = noiseInjSD # SD of injected noise + + self.simif = False # whether the simulation is complete + + self._setup_network() + + def __str__(self): + return "LIF network of %d neurons "\ + "having %d exc." % (self.N,self.NmaxExc) + + def _setup_network(self): + """Sets up the network (_init_network is enough)""" + self.network = moose.LIF( 'network', self.N ); + moose.le( '/network' ) + self.network.vec.Em = self.el + self.network.vec.thresh = self.vt + self.network.vec.refractoryPeriod = self.refrT + self.network.vec.Rm = self.Rm + self.network.vec.vReset = self.vr + self.network.vec.Cm = self.Cm + if not noiseInj: + self.network.vec.inject = self.Iinject + else: + ## inject a constant + noisy current + ## values are set in self.simulate() + self.noiseTables = moose.StimulusTable('noiseTables',self.N) + moose.connect( self.noiseTables, 'output', \ + self.network, 'setInject', 'OneToOne') + + def _init_network(self,v0=el): + """Initialises the network variables before simulation""" + self.network.vec.initVm = v0 + + def simulate(self,simtime=simtime,dt=dt,plotif=False,**kwargs): + + self.dt = dt + self.simtime = simtime + self.T = np.ceil(simtime/dt) + self.trange = np.arange(0,self.simtime,dt) + + # Build in the LTP stimulus + offset = Iinject * 0.5 + injBaseline = np.repeat( self.Iinject, self.T ) + start = np.ceil( simtime / (interTetInterval * dt) ) + for i in range( 3 ): + end = start + np.ceil( 0.5 / dt ) + injBaseline[ start:end ] += offset + start = start + np.ceil( interTetInterval / dt ) + + for i in range(self.N): + if noiseInj: + ## Gaussian white noise SD added every dt interval should be + ## divided by sqrt(dt), as the later numerical integration + ## will multiply it by dt. + ## See the Euler-Maruyama method, numerical integration in + ## http://www.scholarpedia.org/article/Stochastic_dynamical_systems + self.noiseTables.vec[i].vector = injBaseline + \ + np.random.normal( \ + scale=self.noiseInjSD*np.sqrt(self.Rm*self.Cm/self.dt), \ + size=self.T ) # scale = SD + self.noiseTables.vec[i].stepSize = 0 # use current time + # as x value for interpolation + + + self.noiseTables.vec[i].stopTime = self.simtime + + self._init_network(**kwargs) + if plotif: + self._init_plots() + + + def _init_plots(self): + ## make a few tables to store a few Vm-s + numVms = 10 + self.plots = moose.Table( '/plotVms', numVms ) + ## draw numVms out of N neurons + nrnIdxs = random.sample(list(range(self.N)),numVms) + for i in range( numVms ): + moose.connect( self.network.vec[nrnIdxs[i]], 'VmOut', \ + self.plots.vec[i], 'input') + + ## make self.N tables to store spikes of all neurons + self.spikes = moose.Table( '/plotSpikes', self.N ) + moose.connect( self.network, 'spikeOut', \ + self.spikes, 'input', 'OneToOne' ) + + ## make 2 tables to store spikes of all exc and all inh neurons + self.spikesExc = moose.Table( '/plotSpikesAllExc' ) + for i in range(self.NmaxExc): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesExc, 'input' ) + self.spikesInh = moose.Table( '/plotSpikesAllInh' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesInh, 'input' ) + + def _plot(self, fig): + """ plots the spike raster for the simulated net""" + plt.figure(1) + + ax = plt.subplot(221) + cleanAx( ax, 'B' ) + plt.ylabel( 'Neuron #', fontsize = 16 ) + for i in range(0,self.NmaxExc): + if i==0: label = 'Exc. spike trains' + else: label = '' + spikes = self.spikes.vec[i].vector + ax.plot(spikes,[i]*len(spikes),\ + 'b.',marker='.', markersize = 2, label=label) + for i in range(self.NmaxExc,self.N): + if i==self.NmaxExc: label = 'Inh. spike trains' + else: label = '' + spikes = self.spikes.vec[i].vector + ax.plot(spikes,[i]*len(spikes),\ + 'r.',marker='.', markersize = 2, label=label) + +############################################# +# Exc-Inh network class with Ca plasticity based connections +# (inherits from ExcInhNetBase) +############################################# + +class ExcInhNet(ExcInhNetBase): + """ Recurrent network simulation """ + + def __init__(self,J=J,incC=C,fC=fC,scaleI=g,syndelay=syndelay,**kwargs): + """Overloads base (parent) class""" + self.J = J # exc connection weight + self.incC = incC # number of incoming connections per neuron + self.fC = fC # fraction of exc incoming connections + self.excC = int(fC*incC)# number of exc incoming connections + self.scaleI = scaleI # inh weight is scaleI*J + self.syndelay = syndelay# synaptic delay + + # call the parent class constructor + ExcInhNetBase.__init__(self,**kwargs) + + def __str__(self): + return "LIF network of %d neurons "\ + "of which %d are exc." % (self.N,self.NmaxExc) + + def _init_network(self,**args): + ExcInhNetBase._init_network(self,**args) + + def _init_plots(self): + ExcInhNetBase._init_plots(self) + self.recN = 5 # number of neurons for which to record weights and Ca + if CaPlasticity: + ## make tables to store weights of recN exc synapses + ## for each post-synaptic exc neuron + self.weights = moose.Table( '/plotWeights', self.excC*self.recN ) + for i in range(self.recN): # range(self.N) is too large + for j in range(self.excC): + moose.connect( self.weights.vec[self.excC*i+j], 'requestOut', + self.synsEE.vec[i*self.excC+j].synapse[0], 'getWeight') + + def _setup_network(self): + ## Set up the neurons without connections + ExcInhNetBase._setup_network(self) + + ## Now, add in the connections... + ## Each pre-synaptic spike cause Vm of post-neuron to rise by + ## synaptic weight in one time step i.e. delta-fn synapse. + ## Since LIF neuron is derived from Compartment class, + ## conductance-based synapses (SynChan class) can also be used. + + ## E to E synapses can be plastic + ## Two ways to do this: + ## 1) Each LIF neuron has one incoming postsynaptic SynHandler, + ## which collects the activation from all presynaptic neurons, + ## but then a common Ca pool is used. + ## 2) Each LIF neuron has multiple postsyanptic SynHandlers, + ## one for each pre-synaptic neuron, i.e. one per synapse, + ## then each synapse has a different Ca pool. + ## Here we go with option 2) as per Higgins et al 2014 (Brunel private email) + ## separate SynHandler per EE synapse, thus NmaxExc*excC + if CaPlasticity: + self.synsEE = moose.GraupnerBrunel2012CaPlasticitySynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + else: + self.synsEE = moose.SimpleSynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + moose.useClock( 0, '/network/synsEE', 'process' ) + + ## I to E synapses are not plastic + self.synsIE = moose.SimpleSynHandler( '/network/synsIE', self.NmaxExc ) + ## all synapses to I neurons are not plastic + self.synsI = moose.SimpleSynHandler( '/network/synsI', self.N-self.NmaxExc ) + ## connect all SynHandlers to their respective neurons + for i in range(self.NmaxExc): + moose.connect( self.synsIE.vec[i], 'activationOut', \ + self.network.vec[i], 'activation' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.synsI.vec[i-self.NmaxExc], 'activationOut', \ + self.network.vec[i], 'activation' ) + + ## Connections from some Exc/Inh neurons to each Exc neuron + for i in range(0,self.NmaxExc): + self.synsIE.vec[i].numSynapses = self.incC-self.excC + + ## Connections from some Exc neurons to each Exc neuron + ## draw excC number of neuron indices out of NmaxExc neurons + preIdxs = random.sample(list(range(self.NmaxExc)),self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synidx = i*self.excC+synnum + synHand = self.synsEE.vec[synidx] + + ## connect each synhandler to the post-synaptic neuron + moose.connect( synHand, 'activationOut', \ + self.network.vec[i], 'activation' ) + ## important to set numSynapses = 1 for each synHandler, + ## doesn't create synapses if you set the full array of SynHandlers + synHand.numSynapses = 1 + + synij = synHand.synapse[0] + connectExcId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + if CaPlasticity: + ## set parameters for the Ca Plasticity SynHandler + ## have to be set for each SynHandler + ## doesn't set for full array at a time + synHand.CaInit = 0.0 + synHand.tauCa = tauCa + synHand.tauSyn = tauSyn + synHand.CaPre = CaPre + synHand.CaPost = CaPost + synHand.delayD = delayD + synHand.thetaD = thetaD + synHand.thetaP = thetaP + synHand.gammaD = gammaD + synHand.gammaP = gammaP + synHand.weightMax = 1.0 # bounds on the weight + synHand.weightMin = 0.0 + synHand.weightScale = \ + self.J*2.0 # 0.2 mV, weight*weightScale is activation + # typically weight <~ 0.5, so activation <~ J + synHand.noisy = noisy + synHand.noiseSD = noiseSD + synHand.bistable = bistable + + moose.connect( self.network.vec[i], \ + 'spikeOut', synHand, 'addPostSpike') + synij.weight = eqWeight # activation = weight*weightScale + # weightScale = 2*J + # weight <~ 0.5 + ## Randomly set 5% of them to be 1.0 + if np.random.uniform()<0.05: + synij.weight = 1.0 + else: + synij.weight = self.J # no weightScale here, activation = weight + + ## Connections from some Inh neurons to each Exc neuron + ## draw inhC=incC-excC number of neuron indices out of inhibitory neurons + preIdxs = random.sample(list(range(self.NmaxExc,self.N)),self.incC-self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsIE.vec[i].synapse[synnum] + connectInhId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = -self.scaleI*self.J # activation = weight + + ## Connections from some Exc/Inh neurons to each Inh neuron + for i in range(self.N-self.NmaxExc): + ## each neuron has incC number of synapses + self.synsI.vec[i].numSynapses = self.incC + + ## draw excC number of neuron indices out of NmaxExc neurons + preIdxs = random.sample(list(range(self.NmaxExc)),self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsI.vec[i].synapse[synnum] + connectExcId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = self.J # activation = weight + + ## draw inhC=incC-excC number of neuron indices out of inhibitory neurons + preIdxs = random.sample(list(range(self.NmaxExc,self.N)),self.incC-self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsI.vec[i].synapse[ self.excC + synnum ] + connectInhId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = -self.scaleI*self.J # activation = weight + + moose.useClock( 0, '/network/synsIE', 'process' ) + moose.useClock( 0, '/network/synsI', 'process' ) + +############################################# +# Analysis functions +############################################# + +def rate_from_spiketrain(spiketimes,fulltime,dt,tau=50e-3): + """ + Returns a rate series of spiketimes convolved with a Gaussian kernel; + all times must be in SI units. + """ + sigma = tau/2. + ## normalized Gaussian kernel, integral with dt is normed to 1 + ## to count as 1 spike smeared over a finite interval + norm_factor = 1./(np.sqrt(2.*np.pi)*sigma) + gauss_kernel = np.array([norm_factor*np.exp(-x**2/(2.*sigma**2))\ + for x in np.arange(-5.*sigma,5.*sigma+dt,dt)]) + kernel_len = len(gauss_kernel) + ## need to accommodate half kernel_len on either side of fulltime + rate_full = np.zeros(int(fulltime/dt)+kernel_len) + for spiketime in spiketimes: + idx = int(spiketime/dt) + rate_full[idx:idx+kernel_len] += gauss_kernel + ## only the middle fulltime part of the rate series + ## This is already in Hz, + ## since should have multiplied by dt for above convolution + ## and divided by dt to get a rate, so effectively not doing either. + return rate_full[kernel_len/2:kernel_len/2+int(fulltime/dt)] + +############################################# +# Make plots +############################################# + +def extra_plots(net): + ## extra plots apart from the spike rasters + timeseries = net.trange + ## individual neuron firing rates + fig3 = plt.figure() + plt.subplot(221) + num_to_plot = 10 + #rates = [] + for nrni in range(num_to_plot): + rate = rate_from_spiketrain(\ + net.spikes.vec[nrni].vector,simtime,dt, 1.0 ) + plt.plot(timeseries,rate) + plt.title("Rates of "+str(num_to_plot)+" exc nrns") + plt.ylabel("Hz") + plt.ylim(0,100) + plt.subplot(222) + for nrni in range(num_to_plot): + rate = rate_from_spiketrain(\ + net.spikes.vec[net.NmaxExc+nrni].vector,simtime,dt, 1.0 ) + plt.plot(timeseries,rate) + plt.title("Rates of "+str(num_to_plot)+" inh nrns") + plt.ylim(0,100) + + ## population firing rates + plt.subplot(223) + rate = rate_from_spiketrain(net.spikesExc.vector,simtime,dt)\ + /float(net.NmaxExc) # per neuron + plt.plot(timeseries,rate) + plt.ylim(0,100) + plt.title("Exc population rate") + plt.ylabel("Hz") + plt.xlabel("Time (s)") + plt.subplot(224) + rate = rate_from_spiketrain(net.spikesInh.vector,simtime,dt)\ + /float(net.N-net.NmaxExc) # per neuron + plt.plot(timeseries,rate) + plt.ylim(0,100) + plt.title("Inh population rate") + plt.xlabel("Time (s)") + + fig3.tight_layout() + +def makeScatterPlot( m, n, v ): + fig4 = plt.figure() + + dx = 100e-6 + dy = 100e-6 + x = np.arange( m ) * dx + x = np.tile( x, n ) + y = np.arange( n ) * dy + y = y.repeat( m ) + #z = np.arange( m * n ) + #ret = plt.scatter( x, y, s = 64, c = v, vmin = -0.065, vmax = -0.055 ) + cmap = plt.get_cmap('afmhot') + ret = plt.scatter( x, y, s = 64, c = v, vmin = 0.5, vmax = 1.0, cmap = cmap ) + plt.xlim( -dx, dx * m ) + plt.ylim( -dy, dy * n ) + return fig4, ret + +def buildNeuronPlots( rdes ): + if not moose.exists( '/graphs' ): + graphs = moose.Neutral( '/graphs' ) + vtab = moose.Table( '/graphs/vtab' ) + catab = moose.Table( '/graphs/catab' ) + moose.connect( vtab, "requestOut", rdes.soma, "getVm" ) + caSoma = moose.element( rdes.soma.path + "/Ca_conc" ) + moose.connect( catab, "requestOut", caSoma, "getCa" ) + elist = moose.wildcardFind( '/model/chem/psd/tot_PSD_R[]' ) + rtab = moose.Table2( '/graphs/rtab', len( elist ) ).vec + for i in zip( elist, rtab ): + moose.connect( i[1], "requestOut", i[0], "getN" ) + elist = moose.wildcardFind( '/model/chem/spine/Ca[]' ) + pcatab = moose.Table2( '/graphs/pcatab', len( elist ) ).vec + for i in zip( elist, pcatab ): + moose.connect( i[1], "requestOut", i[0], "getConc" ) + +def cleanAx( ax, label, showXlabel = False ): + ax.spines['top'].set_visible( False ) + ax.spines['right'].set_visible( False ) + ax.tick_params( direction = 'out' ) + if not showXlabel: + ax.set_xticklabels( [] ) + for tick in ax.xaxis.get_major_ticks(): + tick.tick2On = False + for tick in ax.yaxis.get_major_ticks(): + tick.tick2On = False + ax.text( -0.18, 1.0, label, fontsize = 18, weight = 'bold', transform=ax.transAxes ) + + +def saveNeuronPlots( fig, rdes ): + #fig = plt.figure( figsize=(12, 10), facecolor='white' ) + #fig.subplots_adjust( left = 0.18 ) + plt.figure(1) + + ax = plt.subplot(222) + cleanAx( ax, 'C' ) + plt.ylabel( 'Vm (mV)', fontsize = 16 ) + vtab = moose.element( '/graphs/vtab' ) + t = np.arange( 0, len( vtab.vector ), 1 ) * vtab.dt + plt.plot( t, vtab.vector * 1000, label="Vm" ) + #plt.legend() + + ax = plt.subplot(223) + cleanAx( ax, 'D', showXlabel = True ) + pcatab = list( moose.vec( '/graphs/pcatab' ) )[0::50] + t = np.arange( 0, len( pcatab[0].vector ), 1 ) * pcatab[0].dt + for i in pcatab: + plt.plot( t, i.vector * 1000 ) + plt.ylabel( '[Ca] (uM)', fontsize = 16 ) + plt.xlabel( 'Time (s)', fontsize = 16 ) + + ax = plt.subplot(224) + cleanAx( ax, 'E', showXlabel = True ) + rtab = list( moose.vec( '/graphs/rtab' ) )[0::50] + t = np.arange( 0, len( rtab[0].vector ), 1 ) * rtab[0].dt + for i in rtab: + plt.plot( t, i.vector ) + plt.ylabel( '# of inserted GluRs', fontsize = 16 ) + plt.xlabel( 'Time (s)', fontsize = 16 ) + ''' + for i in moose.wildcardFind( '/graphs/#' ): + i.xplot( fname + '.xplot', i.name ) + ''' + +def create_viewer(rdes): + # print "Creating 3D Viewer" + network = moogli.extensions.moose.read(path=rdes.elecid.path, + vertices=10) + # print "Read Network" + network.set("color", moogli.colors.LIGHT_BLUE) + network.groups["spine"].set("color", moogli.colors.ORANGE) + # for dendrite in dendrites.values(): + # dendrite.set_colors(moogli.core.Vec4f(173 / 255.0, 216 / 255.0, 230 / 255.0, 1.0)) + + [shape.set_radius(shape.get_apex_radius() * 4.0) for shape in + list(network.groups["spine"].groups["head"].shapes.values())] + # print "Creating LIFS" + soma = network.shapes[rdes.soma.path] + + center = soma.get_center() + row_axis = moogli.geometry.X_AXIS + row_count = 25 + row_separation = soma.get_base_radius() * 5.0 + col_axis = moogli.geometry.Z_AXIS + col_count = 25 + col_separation = row_separation + radii = soma.get_base_radius() + colors = moogli.colors.GREEN + vertices = 20 + lifs = moogli.shapes.Sphere.grid("LIF", + center, + row_axis, + row_count, + row_separation, + col_axis, + col_count, + col_separation, + radii, + colors, + vertices) + # print "Created LIFS" + # morphology.create_group("dendrites", dendrites, 0.0, 300.0, colormap) + # print "Creating Viewer" + viewer = moogli.Viewer("viewer") # prelude = prelude, interlude = interlude) + # print "Created Viewer" + viewer.attach_shapes(list(network.shapes.values())) + viewer.attach_shapes(list(lifs.shapes.values())) + # print "Attached Shapes" + view = moogli.View("view") + viewer.attach_view(view) + # print "Attached View" + return viewer + +if __name__=='__main__': + plt.ion() + ## ExcInhNetBase has unconnected neurons, + ## ExcInhNet connects them + ## Instantiate either ExcInhNetBase or ExcInhNet below + #net = ExcInhNetBase(N=N) + net = ExcInhNet(N=N) + print(net) + moose.le( '/' ) + moose.le( '/network' ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + buildNeuronPlots( rdes ) + connectDetailedNeuron() + + app = QtGui.QApplication(sys.argv) + viewer = create_viewer(rdes) + viewer.showMaximized() + viewer.start() + app.exec_() + + ## Important to distribute the initial Vm-s + ## else weak coupling gives periodic synchronous firing + plotif = True + net.simulate(simtime,plotif=plotif,\ + v0=np.random.uniform(el-20e-3,vt,size=N)) + + # moose simulation + moose.useClock( 1, '/network', 'process' ) + moose.useClock( 2, '/plotSpikes', 'process' ) + moose.useClock( 3, '/plotVms', 'process' ) + if CaPlasticity: + moose.useClock( 3, '/plotWeights', 'process' ) + moose.useClock( 3, '/plotCa', 'process' ) + moose.setClock( 0, dt ) + moose.setClock( 1, dt ) + moose.setClock( 2, dt ) + moose.setClock( 3, dt ) + #moose.setClock( moose.element( '/cell/hsolve' ), dt ) + moose.setClock( 9, dt ) + + if plotif: + Vm = net.network.vec.Vm + fig = plt.figure( 1, figsize=(12, 10), facecolor='white' ) + fig.subplots_adjust( left = 0.18 ) + fig2, ret = makeScatterPlot( 50, 50, Vm ) + #cellFig = bcs.neuronPlot( '/model/elec', '/model/chem/psd/tot_PSD_R[]' ) + + moose.reinit() + t1 = time.time() + print('starting') + #moose.start(simtime) + for currTime in np.arange( 0, simtime, updateDt ): + moose.start(updateDt) + lastt = net.network.vec.lastEventTime + lastt = np.exp( 2 * (lastt - currTime ) ) + print(currTime, time.time() - t1) + ret.set_array( lastt ) + fig2.canvas.draw() + + print('runtime, t = ', time.time() - t1) + + if plotif: + net._plot( fig ) + + extra_plots(net) + #bcs.displayCellPlots( plt ) + saveNeuronPlots( fig, rdes ) + plt.show() + plt.savefig( fname + '.svg', bbox_inches='tight') + print( "Hit 'enter' to exit" ) + input() diff --git a/demos/Fig6_NetMultiscale/ReducedModel.py b/demos/Fig6_NetMultiscale/ReducedModel.py new file mode 100644 index 0000000..1b73043 --- /dev/null +++ b/demos/Fig6_NetMultiscale/ReducedModel.py @@ -0,0 +1,888 @@ +#/********************************************************************** +#** This program is part of 'MOOSE', the +#** Messaging Object Oriented Simulation Environment. +#** Copyright (C) 2003-2014 Upinder S. Bhalla. and NCBS +#** It is made available under the terms of the +#** GNU Lesser General Public License version 2.1 +#** See the file COPYING.LIB for the full notice. +#**********************************************************************/ + +''' +This LIF network with Ca plasticity is based on: +David Higgins, Michael Graupner, Nicolas Brunel + Memory Maintenance in Synapses with Calcium-Based + Plasticity in the Presence of Background Activity + PLOS Computational Biology, 2014. + +Implemented by: Aditya Gilra, NCBS, Bangalore, October, 2014. +This variant has 400 LIF neurons + +Upi Bhalla, Nov 2014: Appended single neuron model. + +This script is a reduced version of the model that generates the panels +in Figure 6. It takes just a couple of minutes to run 30 seconds of +simulation time. That is, 400 neurons, 1 detailed model with 36 +compartments plus 16 spines each having 2 compartments and 34 molecules, +and lots of synapses. +''' + +from __future__ import print_function + +## import modules and functions to be used +import numpy as np +import matplotlib.pyplot as plt +import random +import time +import moose +from numpy import random as nprand +from moose.neuroml.NeuroML import NeuroML +import sys +sys.path.append( "/home/bhalla/moose/trunk/Demos/util" ) +import rdesigneur as rd +#cellname = "./cells_channels/CA1_nochans.morph.xml" +cellname = "./cells_channels/ca1_minimal.p" +fname = "reduced" + +############################################# +np.random.seed(100) # set seed for reproducibility of simulations +random.seed(100) # set seed for reproducibility of simulations +moose.seed(100) # set seed for reproducibility of simulations + +############################################# +# All parameters as per: +# David Higgins, Michael Graupner, Nicolas Brunel +# Memory Maintenance in Synapses with Calcium-Based +# Plasticity in the Presence of Background Activity +# PLOS Computational Biology, 2014. +############################################# + +############################################# +# Neuron model +############################################# + +# equation: dv/dt = (1/taum)*(-(v-el)) + inp +# with spike when v>vt, reset to vr + +PI = 3.14159265358979 +useGssa = True +combineSegments = False + +el = -70e-3 #V # Resting potential +vt = -50e-3 #V # Spiking threshold +Rm = 20e6 #Ohm # Only taum is needed, but LIF neuron accepts +Cm = 1e-9 #F # Rm and Cm and constructs taum=Rm*Cm +taum = Rm*Cm #s # Membrane time constant is 20 ms +vr = -60e-3 #V # Reset potential +Iinject = 10e-3/Rm # constant current injection into LIF neuron + # same as setting el=-70+15=-55 mV and inp=0 +noiseInj = True # inject noisy current into each cell: boolean +noiseInjSD = 5e-3/Rm #A # SD of noise added to 'current' + # SD*sqrt(taum) is used as noise current SD + +############################################# +# Network parameters: numbers +############################################# + +N = 400 # Total number of neurons +fexc = 0.8 # Fraction of exc neurons +NE = int(fexc*N) # Number of excitatory cells +NI = N-NE # Number of inhibitory cells + +############################################# +# Simulation parameters +############################################# + +simtime = 30 #s # Simulation time +interTetInterval = 5.0 # sec +updateDt = 0.2 #s: time to update live display +dt = 1e-3 #s # time step + +############################################# +# Network parameters: synapses (not for ExcInhNetBase) +############################################# + +## With each presynaptic spike in exc / inh neuron, +## J / -g*J is added to post-synaptic Vm -- delta-fn synapse +## Since LIF neuron used below is derived from Compartment class, +## conductance-based synapses (SynChan class) can also be used. + +C = 100 # Number of incoming connections on each neuron (exc or inh) +fC = fexc # fraction fC incoming connections are exc, rest inhibitory +J = 0.2e-3 #V # exc strength is J (in V as we add to voltage) + # Critical J is ~ 0.45e-3 V in paper for N = 10000, C = 1000 + # See what happens for J = 0.2e-3 V versus J = 0.8e-3 V +g = 4.0 # -gJ is the inh strength. For exc-inh balance g >~ f(1-f)=4 +syndelay = dt # synaptic delay: +refrT = 0.0 # s # absolute refractory time + +############################################# +# Ca Plasticity parameters: synapses (not for ExcInhNetBase) +############################################# + +CaPlasticity = True # set it True or False to turn on/off plasticity +tauCa = 22.6936e-3 # s # Ca decay time scale +tauSyn = 346.3615 # s # synaptic plasticity time scale +## in vitro values in Higgins et al 2014, faster plasticity +CaPre = 0.56175 # mM + +CaPost = 1.2964 # mM +## in vivo values in Higgins et al 2014, slower plasticity +#CaPre = 0.33705 # mM +#CaPost = 0.74378 # mM +delayD = 4.6098e-3 # s # CaPre is added to Ca after this delay + # proxy for rise-time of NMDA +thetaD = 1.0 # mM # depression threshold for Ca +thetaP = 1.3 # mM # potentiation threshold for Ca +gammaD = 331.909 # factor for depression term +gammaP = 725.085 # factor for potentiation term + +eqWeight = 0.5 # initial synaptic weight + # gammaP/(gammaP+gammaD) = eq weight w/o noise + # but see eqn (22), noiseSD also appears + +bistable = True # if bistable is True, use bistable potential for weights +noisy = True # use noisy weight updates given by noiseSD +noiseSD = 3.3501 # if noisy, use noiseSD (3.3501 from Higgins et al 2014) +#noiseSD = 0.1 # if bistable==False, use a smaller noise than in Higgins et al 2014 + +############################################# +# Here we set up a single neuron to fit in this network +############################################# + +diffDt = 0.005 +chemDt = 0.005 +ePlotDt = 0.5e-3 +cPlotDt = 0.005 + +############################################# +def buildRdesigneur(): + ################################################################## + # Here we define which prototypes are to be loaded in to the system. + # Each specification has the format + # source [localName] + # source can be any of + # filename.extension, # Identify type of file by extension, load it. + # function(), # func( name ) builds object of specified name + # file.py:function() , # load Python file, run function(name) in it. + # moose.Classname # Make obj moose.Classname, assign to name. + # path # Already loaded into library or on path. + # After loading the prototypes, there should be an object called 'name' + # in the library. + ################################################################## + cellProto = [ [cellname, 'elec'] ] + chanProto = [ + ['./cells_channels/hd.xml'], \ + ['./cells_channels/kap.xml'], \ + ['./cells_channels/kad.xml'], \ + ['./cells_channels/kdr.xml'], \ + ['./cells_channels/na3.xml'], \ + ['./cells_channels/nax.xml'], \ + ['./cells_channels/CaConc.xml'], \ + ['./cells_channels/Ca.xml'], \ + ['./cells_channels/NMDA.xml'], \ + ['./cells_channels/Glu.xml'], \ + ['./cells_channels/GABA.xml'] \ + ] + spineProto = [ \ + ['makeSpineProto()', 'spine' ] + ] + chemProto = [ \ + [ 'psd53.g', 'ltpModel'] \ + ] + + ################################################################## + # Here we define what goes where, and any parameters. Each distribution + # has the format + # protoName, path, field, expr, [field, expr]... + # where + # protoName identifies the prototype to be placed on the cell + # path is a MOOSE wildcard path specifying where to put things + # field is the field to assign. + # expr is a math expression to define field value. This uses the + # muParser. Built-in variables are p, g, L, len, dia. + # The muParser provides most math functions, and the Heaviside + # function H(x) = 1 for x > 0 is also provided. + ################################################################## + passiveDistrib = [ + [ ".", "#", "RM", "2.8", "CM", "0.01", "RA", "1.5", \ + "Em", "-58e-3", "initVm", "-65e-3" ], \ + [ ".", "#axon#", "RA", "0.5" ] \ + ] + chanDistrib = [ \ + ["hd", "#dend#,#apical#,#user#", "Gbar", "5e-2*(1+(p*3e4))" ], \ + ["kdr", "#", "Gbar", "100" ], \ + ["na3", "#soma#,#dend#,#apical#,#user#", "Gbar", "250" ], \ + ["nax", "#axon#", "Gbar", "1250" ], \ + ["nax", "#soma#", "Gbar", "100" ], \ + ["kap", "#axon#,#soma#", "Gbar", "300" ], \ + ["kap", "#dend#,#apical#,#user#", "Gbar", \ + "300*(H(100-p*1e6)) * (1+(p*1e4))" ], \ + ["Ca_conc", "#soma#,#dend#,#apical#,#user#", "tau", "0.0133" ], \ + ["kad", "#dend#,#apical#,#user#", "Gbar", \ + "300*H(p*1e6-100)*(1+p*1e4)" ], \ + ["Ca", "#soma#", "Gbar", "10e-3" ], \ + ["Ca", "#dend#,#apical#,#user#", "Gbar", "50e-3" ], \ + ["glu", "#dend#,#apical#", "Gbar", "50" ], \ + ["NMDA", "#dend#,#apical#", "Gbar", "20" ], \ + ["GABA", "#dend#,#apical#,#user#", "Gbar", "100*H(250e-6 - p)" ], \ + ] + spineDistrib = [ \ + ["spine", '#apical#', \ + "spineSpacing", "H(p-400e-6)*H(800e-6-p)*10e-6", \ + "spineSpacingDistrib", "1e-6", \ + "angle", "0", \ + "angleDistrib", str( 2*PI ), \ + "size", "1", \ + "sizeDistrib", "0.5" ] \ + ] + chemDistrib = [ \ + [ "ltpModel", "#apical#", "install", "1" ] \ + ] + + ''' + ''' + ###################################################################### + # Here we define the mappings across scales. Format: + # sourceObj sourceField destObj destField couplingExpr [wildcard][spatialExpn] + # where the coupling expression is anything a muParser can evaluate, + # using the input variable x. For example: 8e-5 + 300*x + # For now, let's use existing adaptors which take an offset and scale. + ###################################################################### + adaptorList = [ + [ 'Ca_conc', 'Ca', 'psd/Ca_input', 'concInit', 8e-5, 1 ], + [ 'Ca_conc', 'Ca', 'dend/Ca_dend_input', 'concInit', 8e-5, 1 ], + [ 'psd/tot_PSD_R', 'n', 'glu', 'modulation', 0.5, 0.002 ], + ] + + ###################################################################### + # Having defined everything, now to create the rdesigneur and proceed + # with creating the model. + ###################################################################### + + + rdes = rd.rdesigneur( + useGssa = useGssa, \ + combineSegments = combineSegments, \ + stealCellFromLibrary = True, \ + passiveDistrib = passiveDistrib, \ + spineDistrib = spineDistrib, \ + chanDistrib = chanDistrib, \ + chemDistrib = chemDistrib, \ + cellProto = cellProto, \ + spineProto = spineProto, \ + chanProto = chanProto, \ + chemProto = chemProto, \ + adaptorList = adaptorList + ) + + return rdes + + +############################################# + +def makeDetailedNeuron(): + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + #bcs.addAllPlots() + +def connectDetailedNeuron(): + excProb = 0.005 + excSeed = 1234 + inhProb = 0.005 + inhSeed = 4567 + numExc = 0 + numNMDA = 0 + numInh = 0 + delayMax = 0.010 + delayMin = 0.002 + excWeightMax = 5 + nmdaWeightMax = 2 + inhWeightMax = 50 + # Note we use the same seed for all 3 exc connections, to make sure + # they are all equivalent. + seed = excSeed + totGluWt = 0.0 + totNMDAWt = 0.0 + totGABAWt = 0.0 + for x in moose.wildcardFind( '/model/elec/#/glu/##[ISA=Synapse]' ): + exc = moose.connect( '/network', 'spikeOut', x, 'addSpike','sparse') + exc.setRandomConnectivity( excProb, seed ) + seed = seed + 1 + if exc.numEntries > 0: + numExc += exc.numEntries + assert( exc.numEntries == x.numField ) + x.vec.delay = delayMin + nprand.rand( exc.numEntries ) * ( delayMax - delayMin ) + x.vec.weight = nprand.rand( exc.numEntries ) * excWeightMax + #x.parent.tick = 4 + x.parent.parent.tick = 4 + print('+', end=' ') + totGluWt += sum(x.vec.weight) * x.parent.parent.Gbar + + seed = excSeed + for x in moose.wildcardFind( '/model/elec/#/NMDA/##[ISA=Synapse]' ): + #print " x = ", x + exc = moose.connect( '/network', 'spikeOut', x, 'addSpike','sparse') + exc.setRandomConnectivity( excProb, seed ) + seed = seed + 1 + if exc.numEntries > 0: + numNMDA += exc.numEntries + assert( exc.numEntries == x.numField ) + x.vec.delay = delayMin + nprand.rand( exc.numEntries ) * ( delayMax - delayMin ) + x.vec.weight = nprand.rand( exc.numEntries ) * nmdaWeightMax + #x.parent.tick = 4 + x.parent.parent.tick = 4 + print('*', end=' ') + totNMDAWt += sum(x.vec.weight) * x.parent.parent.Gbar + + seed = inhSeed + for x in moose.wildcardFind( '/model/elec/#/GABA/##[ISA=Synapse]' ): + #print x + inh = moose.connect( '/network', 'spikeOut', x, 'addSpike','sparse') + inh.setRandomConnectivity( inhProb, seed ) + seed = seed + 1 + if inh.numEntries > 0: + numInh += inh.numEntries + x.vec.delay = delayMin + nprand.rand( inh.numEntries ) * ( delayMax - delayMin ) + x.vec.weight = nprand.rand( inh.numEntries ) * inhWeightMax + #x.parent.tick = 4 + x.parent.parent.tick = 4 + print('-', end=' ') + totGABAWt += sum(x.vec.weight) * x.parent.parent.Gbar + + print('connectDetailedNeuron: numExc = ', numExc, ', numNMDA=', numNMDA, ', numInh = ', numInh) + print('connectDetailedNeuron: totWts Glu = ', totGluWt, ', NMDA = ', totNMDAWt, ', GABA = ', totGABAWt) + +############################################# +# Exc-Inh network base class without connections +############################################# + +class ExcInhNetBase: + """Simulates and plots LIF neurons (exc and inh separate). + Author: Aditya Gilra, NCBS, Bangalore, India, October 2014 + """ + + def __init__(self,N=N,fexc=fexc,el=el,vt=vt,Rm=Rm,Cm=Cm,vr=vr,\ + refrT=refrT,Iinject=Iinject): + """ Constructor of the class """ + + self.N = N # Total number of neurons + self.fexc = fexc # Fraction of exc neurons + self.NmaxExc = int(fexc*N) # max idx of exc neurons, rest inh + + self.el = el # Resting potential + self.vt = vt # Spiking threshold + self.taum = taum # Membrane time constant + self.vr = vr # Reset potential + self.refrT = refrT # Absolute refractory period + self.Rm = Rm # Membrane resistance + self.Cm = Cm # Membrane capacitance + self.Iinject = Iinject # constant input current + self.noiseInjSD = noiseInjSD # SD of injected noise + + self.simif = False # whether the simulation is complete + + self._setup_network() + + def __str__(self): + return "LIF network of %d neurons "\ + "having %d exc." % (self.N,self.NmaxExc) + + def _setup_network(self): + """Sets up the network (_init_network is enough)""" + self.network = moose.LIF( 'network', self.N ); + moose.le( '/network' ) + self.network.vec.Em = self.el + self.network.vec.thresh = self.vt + self.network.vec.refractoryPeriod = self.refrT + self.network.vec.Rm = self.Rm + self.network.vec.vReset = self.vr + self.network.vec.Cm = self.Cm + if not noiseInj: + self.network.vec.inject = self.Iinject + else: + ## inject a constant + noisy current + ## values are set in self.simulate() + self.noiseTables = moose.StimulusTable('noiseTables',self.N) + moose.connect( self.noiseTables, 'output', \ + self.network, 'setInject', 'OneToOne') + + def _init_network(self,v0=el): + """Initialises the network variables before simulation""" + self.network.vec.initVm = v0 + + def simulate(self,simtime=simtime,dt=dt,plotif=False,**kwargs): + + self.dt = dt + self.simtime = simtime + self.T = np.ceil(simtime/dt) + self.trange = np.arange(0,self.simtime,dt) + + # Build in the LTP stimulus + offset = Iinject * 0.5 + injBaseline = np.repeat( self.Iinject, self.T ) + start = np.ceil( simtime / (interTetInterval * dt) ) + for i in range( 3 ): + end = start + np.ceil( 0.5 / dt ) + injBaseline[ start:end ] += offset + start = start + np.ceil( interTetInterval / dt ) + + for i in range(self.N): + if noiseInj: + ## Gaussian white noise SD added every dt interval should be + ## divided by sqrt(dt), as the later numerical integration + ## will multiply it by dt. + ## See the Euler-Maruyama method, numerical integration in + ## http://www.scholarpedia.org/article/Stochastic_dynamical_systems + self.noiseTables.vec[i].vector = injBaseline + \ + np.random.normal( \ + scale=self.noiseInjSD*np.sqrt(self.Rm*self.Cm/self.dt), \ + size=self.T ) # scale = SD + self.noiseTables.vec[i].stepSize = 0 # use current time + # as x value for interpolation + + + self.noiseTables.vec[i].stopTime = self.simtime + + self._init_network(**kwargs) + if plotif: + self._init_plots() + + + def _init_plots(self): + ## make a few tables to store a few Vm-s + numVms = 10 + self.plots = moose.Table( '/plotVms', numVms ) + ## draw numVms out of N neurons + nrnIdxs = random.sample(list(range(self.N)),numVms) + for i in range( numVms ): + moose.connect( self.network.vec[nrnIdxs[i]], 'VmOut', \ + self.plots.vec[i], 'input') + + ## make self.N tables to store spikes of all neurons + self.spikes = moose.Table( '/plotSpikes', self.N ) + moose.connect( self.network, 'spikeOut', \ + self.spikes, 'input', 'OneToOne' ) + + ## make 2 tables to store spikes of all exc and all inh neurons + self.spikesExc = moose.Table( '/plotSpikesAllExc' ) + for i in range(self.NmaxExc): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesExc, 'input' ) + self.spikesInh = moose.Table( '/plotSpikesAllInh' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.network.vec[i], 'spikeOut', \ + self.spikesInh, 'input' ) + + def _plot(self, fig): + """ plots the spike raster for the simulated net""" + plt.figure(1) + + ax = plt.subplot(221) + cleanAx( ax, 'B' ) + plt.ylabel( 'Neuron #', fontsize = 16 ) + for i in range(0,self.NmaxExc): + if i==0: label = 'Exc. spike trains' + else: label = '' + spikes = self.spikes.vec[i].vector + ax.plot(spikes,[i]*len(spikes),\ + 'b.',marker='.', markersize = 2, label=label) + for i in range(self.NmaxExc,self.N): + if i==self.NmaxExc: label = 'Inh. spike trains' + else: label = '' + spikes = self.spikes.vec[i].vector + ax.plot(spikes,[i]*len(spikes),\ + 'r.',marker='.', markersize = 2, label=label) + +############################################# +# Exc-Inh network class with Ca plasticity based connections +# (inherits from ExcInhNetBase) +############################################# + +class ExcInhNet(ExcInhNetBase): + """ Recurrent network simulation """ + + def __init__(self,J=J,incC=C,fC=fC,scaleI=g,syndelay=syndelay,**kwargs): + """Overloads base (parent) class""" + self.J = J # exc connection weight + self.incC = incC # number of incoming connections per neuron + self.fC = fC # fraction of exc incoming connections + self.excC = int(fC*incC)# number of exc incoming connections + self.scaleI = scaleI # inh weight is scaleI*J + self.syndelay = syndelay# synaptic delay + + # call the parent class constructor + ExcInhNetBase.__init__(self,**kwargs) + + def __str__(self): + return "LIF network of %d neurons "\ + "of which %d are exc." % (self.N,self.NmaxExc) + + def _init_network(self,**args): + ExcInhNetBase._init_network(self,**args) + + def _init_plots(self): + ExcInhNetBase._init_plots(self) + self.recN = 5 # number of neurons for which to record weights and Ca + if CaPlasticity: + ## make tables to store weights of recN exc synapses + ## for each post-synaptic exc neuron + self.weights = moose.Table( '/plotWeights', self.excC*self.recN ) + for i in range(self.recN): # range(self.N) is too large + for j in range(self.excC): + moose.connect( self.weights.vec[self.excC*i+j], 'requestOut', + self.synsEE.vec[i*self.excC+j].synapse[0], 'getWeight') + + def _setup_network(self): + ## Set up the neurons without connections + ExcInhNetBase._setup_network(self) + + ## Now, add in the connections... + ## Each pre-synaptic spike cause Vm of post-neuron to rise by + ## synaptic weight in one time step i.e. delta-fn synapse. + ## Since LIF neuron is derived from Compartment class, + ## conductance-based synapses (SynChan class) can also be used. + + ## E to E synapses can be plastic + ## Two ways to do this: + ## 1) Each LIF neuron has one incoming postsynaptic SynHandler, + ## which collects the activation from all presynaptic neurons, + ## but then a common Ca pool is used. + ## 2) Each LIF neuron has multiple postsyanptic SynHandlers, + ## one for each pre-synaptic neuron, i.e. one per synapse, + ## then each synapse has a different Ca pool. + ## Here we go with option 2) as per Higgins et al 2014 (Brunel private email) + ## separate SynHandler per EE synapse, thus NmaxExc*excC + if CaPlasticity: + self.synsEE = moose.GraupnerBrunel2012CaPlasticitySynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + else: + self.synsEE = moose.SimpleSynHandler( \ + '/network/synsEE', self.NmaxExc*self.excC ) + moose.useClock( 0, '/network/synsEE', 'process' ) + + ## I to E synapses are not plastic + self.synsIE = moose.SimpleSynHandler( '/network/synsIE', self.NmaxExc ) + ## all synapses to I neurons are not plastic + self.synsI = moose.SimpleSynHandler( '/network/synsI', self.N-self.NmaxExc ) + ## connect all SynHandlers to their respective neurons + for i in range(self.NmaxExc): + moose.connect( self.synsIE.vec[i], 'activationOut', \ + self.network.vec[i], 'activation' ) + for i in range(self.NmaxExc,self.N): + moose.connect( self.synsI.vec[i-self.NmaxExc], 'activationOut', \ + self.network.vec[i], 'activation' ) + + ## Connections from some Exc/Inh neurons to each Exc neuron + for i in range(0,self.NmaxExc): + self.synsIE.vec[i].numSynapses = self.incC-self.excC + + ## Connections from some Exc neurons to each Exc neuron + ## draw excC number of neuron indices out of NmaxExc neurons + preIdxs = random.sample(list(range(self.NmaxExc)),self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synidx = i*self.excC+synnum + synHand = self.synsEE.vec[synidx] + + ## connect each synhandler to the post-synaptic neuron + moose.connect( synHand, 'activationOut', \ + self.network.vec[i], 'activation' ) + ## important to set numSynapses = 1 for each synHandler, + ## doesn't create synapses if you set the full array of SynHandlers + synHand.numSynapses = 1 + + synij = synHand.synapse[0] + connectExcId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + if CaPlasticity: + ## set parameters for the Ca Plasticity SynHandler + ## have to be set for each SynHandler + ## doesn't set for full array at a time + synHand.CaInit = 0.0 + synHand.tauCa = tauCa + synHand.tauSyn = tauSyn + synHand.CaPre = CaPre + synHand.CaPost = CaPost + synHand.delayD = delayD + synHand.thetaD = thetaD + synHand.thetaP = thetaP + synHand.gammaD = gammaD + synHand.gammaP = gammaP + synHand.weightMax = 1.0 # bounds on the weight + synHand.weightMin = 0.0 + synHand.weightScale = \ + self.J*2.0 # 0.2 mV, weight*weightScale is activation + # typically weight <~ 0.5, so activation <~ J + synHand.noisy = noisy + synHand.noiseSD = noiseSD + synHand.bistable = bistable + + moose.connect( self.network.vec[i], \ + 'spikeOut', synHand, 'addPostSpike') + synij.weight = eqWeight # activation = weight*weightScale + # weightScale = 2*J + # weight <~ 0.5 + ## Randomly set 5% of them to be 1.0 + if np.random.uniform()<0.05: + synij.weight = 1.0 + else: + synij.weight = self.J # no weightScale here, activation = weight + + ## Connections from some Inh neurons to each Exc neuron + ## draw inhC=incC-excC number of neuron indices out of inhibitory neurons + preIdxs = random.sample(list(range(self.NmaxExc,self.N)),self.incC-self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsIE.vec[i].synapse[synnum] + connectInhId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = -self.scaleI*self.J # activation = weight + + ## Connections from some Exc/Inh neurons to each Inh neuron + for i in range(self.N-self.NmaxExc): + ## each neuron has incC number of synapses + self.synsI.vec[i].numSynapses = self.incC + + ## draw excC number of neuron indices out of NmaxExc neurons + preIdxs = random.sample(list(range(self.NmaxExc)),self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsI.vec[i].synapse[synnum] + connectExcId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = self.J # activation = weight + + ## draw inhC=incC-excC number of neuron indices out of inhibitory neurons + preIdxs = random.sample(list(range(self.NmaxExc,self.N)),self.incC-self.excC) + ## connect these presynaptically to i-th post-synaptic neuron + for synnum,preIdx in enumerate(preIdxs): + synij = self.synsI.vec[i].synapse[ self.excC + synnum ] + connectInhId = moose.connect( self.network.vec[preIdx], \ + 'spikeOut', synij, 'addSpike') + synij.delay = syndelay + synij.weight = -self.scaleI*self.J # activation = weight + + moose.useClock( 0, '/network/synsIE', 'process' ) + moose.useClock( 0, '/network/synsI', 'process' ) + +############################################# +# Analysis functions +############################################# + +def rate_from_spiketrain(spiketimes,fulltime,dt,tau=50e-3): + """ + Returns a rate series of spiketimes convolved with a Gaussian kernel; + all times must be in SI units. + """ + sigma = tau/2. + ## normalized Gaussian kernel, integral with dt is normed to 1 + ## to count as 1 spike smeared over a finite interval + norm_factor = 1./(np.sqrt(2.*np.pi)*sigma) + gauss_kernel = np.array([norm_factor*np.exp(-x**2/(2.*sigma**2))\ + for x in np.arange(-5.*sigma,5.*sigma+dt,dt)]) + kernel_len = len(gauss_kernel) + ## need to accommodate half kernel_len on either side of fulltime + rate_full = np.zeros(int(fulltime/dt)+kernel_len) + for spiketime in spiketimes: + idx = int(spiketime/dt) + rate_full[idx:idx+kernel_len] += gauss_kernel + ## only the middle fulltime part of the rate series + ## This is already in Hz, + ## since should have multiplied by dt for above convolution + ## and divided by dt to get a rate, so effectively not doing either. + return rate_full[kernel_len/2:kernel_len/2+int(fulltime/dt)] + +############################################# +# Make plots +############################################# + +def extra_plots(net): + ## extra plots apart from the spike rasters + timeseries = net.trange + ## individual neuron firing rates + fig3 = plt.figure() + plt.subplot(221) + num_to_plot = 10 + #rates = [] + for nrni in range(num_to_plot): + rate = rate_from_spiketrain(\ + net.spikes.vec[nrni].vector,simtime,dt, 1.0 ) + plt.plot(timeseries,rate) + plt.title("Rates of "+str(num_to_plot)+" exc nrns") + plt.ylabel("Hz") + plt.ylim(0,100) + plt.subplot(222) + for nrni in range(num_to_plot): + rate = rate_from_spiketrain(\ + net.spikes.vec[net.NmaxExc+nrni].vector,simtime,dt, 1.0 ) + plt.plot(timeseries,rate) + plt.title("Rates of "+str(num_to_plot)+" inh nrns") + plt.ylim(0,100) + + ## population firing rates + plt.subplot(223) + rate = rate_from_spiketrain(net.spikesExc.vector,simtime,dt)\ + /float(net.NmaxExc) # per neuron + plt.plot(timeseries,rate) + plt.ylim(0,100) + plt.title("Exc population rate") + plt.ylabel("Hz") + plt.xlabel("Time (s)") + plt.subplot(224) + rate = rate_from_spiketrain(net.spikesInh.vector,simtime,dt)\ + /float(net.N-net.NmaxExc) # per neuron + plt.plot(timeseries,rate) + plt.ylim(0,100) + plt.title("Inh population rate") + plt.xlabel("Time (s)") + + fig3.tight_layout() + +def makeScatterPlot( m, n, v ): + fig4 = plt.figure() + + dx = 100e-6 + dy = 100e-6 + x = np.arange( m ) * dx + x = np.tile( x, n ) + y = np.arange( n ) * dy + y = y.repeat( m ) + #z = np.arange( m * n ) + #ret = plt.scatter( x, y, s = 64, c = v, vmin = -0.065, vmax = -0.055 ) + cmap = plt.get_cmap('afmhot') + ret = plt.scatter( x, y, s = 64, c = v, vmin = 0.5, vmax = 1.0, cmap = cmap ) + plt.xlim( -dx, dx * m ) + plt.ylim( -dy, dy * n ) + return fig4, ret + +def buildNeuronPlots( rdes ): + if not moose.exists( '/graphs' ): + graphs = moose.Neutral( '/graphs' ) + vtab = moose.Table( '/graphs/vtab' ) + catab = moose.Table( '/graphs/catab' ) + moose.connect( vtab, "requestOut", rdes.soma, "getVm" ) + caSoma = moose.element( rdes.soma.path + "/Ca_conc" ) + moose.connect( catab, "requestOut", caSoma, "getCa" ) + elist = moose.wildcardFind( '/model/chem/psd/tot_PSD_R[]' ) + rtab = moose.Table2( '/graphs/rtab', len( elist ) ).vec + for i in zip( elist, rtab ): + moose.connect( i[1], "requestOut", i[0], "getN" ) + elist = moose.wildcardFind( '/model/chem/spine/Ca[]' ) + pcatab = moose.Table2( '/graphs/pcatab', len( elist ) ).vec + for i in zip( elist, pcatab ): + moose.connect( i[1], "requestOut", i[0], "getConc" ) + +def cleanAx( ax, label, showXlabel = False ): + ax.spines['top'].set_visible( False ) + ax.spines['right'].set_visible( False ) + ax.tick_params( direction = 'out' ) + if not showXlabel: + ax.set_xticklabels( [] ) + for tick in ax.xaxis.get_major_ticks(): + tick.tick2On = False + for tick in ax.yaxis.get_major_ticks(): + tick.tick2On = False + ax.text( -0.18, 1.0, label, fontsize = 18, weight = 'bold', transform=ax.transAxes ) + + +def saveNeuronPlots( fig, rdes ): + #fig = plt.figure( figsize=(12, 10), facecolor='white' ) + #fig.subplots_adjust( left = 0.18 ) + plt.figure(1) + + ax = plt.subplot(222) + cleanAx( ax, 'C' ) + plt.ylabel( 'Vm (mV)', fontsize = 16 ) + vtab = moose.element( '/graphs/vtab' ) + t = np.arange( 0, len( vtab.vector ), 1 ) * vtab.dt + plt.plot( t, vtab.vector * 1000, label="Vm" ) + #plt.legend() + + ax = plt.subplot(223) + cleanAx( ax, 'D', showXlabel = True ) + pcatab = list( moose.vec( '/graphs/pcatab' ) )[0::2] + t = np.arange( 0, len( pcatab[0].vector ), 1 ) * pcatab[0].dt + for i in pcatab: + plt.plot( t, i.vector * 1000 ) + plt.ylabel( '[Ca] (uM)', fontsize = 16 ) + plt.xlabel( 'Time (s)', fontsize = 16 ) + + ax = plt.subplot(224) + cleanAx( ax, 'E', showXlabel = True ) + rtab = list( moose.vec( '/graphs/rtab' ) )[0::2] + t = np.arange( 0, len( rtab[0].vector ), 1 ) * rtab[0].dt + for i in rtab: + plt.plot( t, i.vector ) + plt.ylabel( '# of inserted GluRs', fontsize = 16 ) + plt.xlabel( 'Time (s)', fontsize = 16 ) + ''' + for i in moose.wildcardFind( '/graphs/#' ): + i.xplot( fname + '.xplot', i.name ) + ''' + +if __name__=='__main__': + plt.ion() + ## ExcInhNetBase has unconnected neurons, + ## ExcInhNet connects them + ## Instantiate either ExcInhNetBase or ExcInhNet below + #net = ExcInhNetBase(N=N) + net = ExcInhNet(N=N) + print(net) + moose.le( '/' ) + moose.le( '/network' ) + rdes = buildRdesigneur() + rdes.buildModel( '/model' ) + buildNeuronPlots( rdes ) + connectDetailedNeuron() + + ## Important to distribute the initial Vm-s + ## else weak coupling gives periodic synchronous firing + plotif = True + net.simulate(simtime,plotif=plotif,\ + v0=np.random.uniform(el-20e-3,vt,size=N)) + + # moose simulation + moose.useClock( 1, '/network', 'process' ) + moose.useClock( 2, '/plotSpikes', 'process' ) + moose.useClock( 3, '/plotVms', 'process' ) + if CaPlasticity: + moose.useClock( 3, '/plotWeights', 'process' ) + moose.useClock( 3, '/plotCa', 'process' ) + moose.setClock( 0, dt ) + moose.setClock( 1, dt ) + moose.setClock( 2, dt ) + moose.setClock( 3, dt ) + moose.setClock( 9, dt ) + + if plotif: + Vm = net.network.vec.Vm + fig = plt.figure( 1, figsize=(12, 10), facecolor='white' ) + fig.subplots_adjust( left = 0.18 ) + fig2, ret = makeScatterPlot( 20, 20, Vm ) + title = fig2.text( 0.1, 0.95, "Simulation starting..." ) + + moose.reinit() + t1 = time.time() + print('starting') + for currTime in np.arange( 0, simtime, updateDt ): + moose.start(updateDt) + lastt = net.network.vec.lastEventTime + lastt = np.exp( 2 * (lastt - currTime ) ) + title.set_text( "t = " + str( currTime ) ) + ret.set_array( lastt ) + fig2.canvas.draw() + + print('runtime, t = ', time.time() - t1) + + if plotif: + net._plot( fig ) + + extra_plots(net) + saveNeuronPlots( fig, rdes ) + plt.show() + plt.savefig( fname + '.svg', bbox_inches='tight') + print( "Hit 'enter' to exit" ) + input() diff --git a/demos/Fig6_NetMultiscale/cells_channels/CA1.morph.spines.xml b/demos/Fig6_NetMultiscale/cells_channels/CA1.morph.spines.xml new file mode 100644 index 0000000..028852a --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/CA1.morph.spines.xml @@ -0,0 +1,12658 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + MOOSE NeuroML importer still does not support changing channel parameters post load and inhomogenous tags. Thus this model has been modified. + All inhomogeneous tags have been removed. All changed channel parameters have been hardcoded into modified channels. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + + + + + + axon_group + soma_group + + + + + + + + all + + + all + + + + + + + + soma_group + + + + + + OneSecGrp_SectionRef_5 + + + + + + ModelViewParmSubset_2 + + + + + + all + + + + + + ModelViewParmSubset_2 + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + + + + all + + + + + + + all + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/CA1.morph.xml b/demos/Fig6_NetMultiscale/cells_channels/CA1.morph.xml new file mode 100644 index 0000000..074524a --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/CA1.morph.xml @@ -0,0 +1,12628 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + MOOSE NeuroML importer still does not support changing channel parameters post load and inhomogenous tags. Thus this model has been modified. + All inhomogeneous tags have been removed. All changed channel parameters have been hardcoded into modified channels. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + + + + + + axon_group + soma_group + + + + + + + + all + + + all + + + + + + + + soma_group + + + + + + OneSecGrp_SectionRef_5 + + + + + + ModelViewParmSubset_2 + + + + + + all + + + + + + ModelViewParmSubset_2 + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + + + + all + + + + + + + all + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/CA1_nochans.morph.xml b/demos/Fig6_NetMultiscale/cells_channels/CA1_nochans.morph.xml new file mode 100644 index 0000000..dcae7ae --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/CA1_nochans.morph.xml @@ -0,0 +1,12535 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/CA1spiny.morph.xml b/demos/Fig6_NetMultiscale/cells_channels/CA1spiny.morph.xml new file mode 100644 index 0000000..6041e73 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/CA1spiny.morph.xml @@ -0,0 +1,13066 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + MOOSE NeuroML importer still does not support changing channel parameters post load and inhomogenous tags. Thus this model has been modified. + All inhomogeneous tags have been removed. All changed channel parameters have been hardcoded into modified channels. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + allButSpineShaft + + + + + + axon_group + soma_group + + + + + + + + all + + + all + + + + + + + + soma_group + + + + + + OneSecGrp_SectionRef_5 + + + + + + allButSpineShaft + + + + + + allButSpineShaft + + + + + allButShaft + + + + + + all + + + + + + all + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + + + + all + + + + + + + all + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/CA1spiny7_0.morph.xml b/demos/Fig6_NetMultiscale/cells_channels/CA1spiny7_0.morph.xml new file mode 100644 index 0000000..b2f8ee5 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/CA1spiny7_0.morph.xml @@ -0,0 +1,13118 @@ + + + + + + + Cell exported from NEURON ModelView in NeuroML Level 2 format and imported into neuroConstruct. The densities of hd, kap, kad have been replaced with variable mechanisms recreating the densities as used in the original model from ModelDB. + MOOSE NeuroML importer still does not support changing channel parameters post load and inhomogenous tags. Thus this model has been modified. + All inhomogeneous tags have been removed. All changed channel parameters have been hardcoded into modified channels. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Path Length from root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + allButSpineShaft + + + SomaPlusProxDend + + + axon_group + soma_group + + + + + + + + SomaPlusProxDend + + + axon_group + soma_group + + + + + + SomaPlusProxDend + + + axon_group + soma_group + + + + + + + + all + + + all + + + + + + + This opaque name OneSecGrp_SectionRef_5 means the axon. + + + OneSecGrp_SectionRef_5 + soma_group + + + + + + SomaPlusProxDend + + + axon_group + soma_group + + + + + + allButSpineShaft + + + + + allButShaft + + + + + + all + + + + + + all + + + + OneSecGrp_SectionRef_5 + + + + + + all + + + + + + all + + + + + + + all + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/Ca.xml b/demos/Fig6_NetMultiscale/cells_channels/Ca.xml new file mode 100644 index 0000000..645161c --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/Ca.xml @@ -0,0 +1,62 @@ + + + + + A channel from Maex, R and De Schutter, E. Synchronization of Golgi and Granule Cell Firing in a + Detailed Network Model of the Cerebellar Granule Cell Layer + + + + + + + Voltage-gated Ca2+ channel, based on Traub + + + + Traub, R. + + + Upi Bhalla + NCBS + bhalla - at - ncbs.res.in + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/CaConc.xml b/demos/Fig6_NetMultiscale/cells_channels/CaConc.xml new file mode 100644 index 0000000..fe10a98 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/CaConc.xml @@ -0,0 +1,36 @@ + + + + Ca pool + + + Signifies that the ion is involved in a process which alters its concentration + + + + + + + Upi Bhalla + + + + An expontially decaying pool of calcium + + + + Upi Bhalla + National Centre for Biological Sciences, Bangalore, India. + bhalla - at - ncbs.res.in + + + + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/Ca_conc.xml b/demos/Fig6_NetMultiscale/cells_channels/Ca_conc.xml new file mode 100644 index 0000000..29da3e8 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/Ca_conc.xml @@ -0,0 +1,31 @@ + + + + Ca pool. + + + Signifies that the ion is involved in a process which alters its concentration + + + + + + + + An expontially decaying pool of calcium + + + + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/GABA.xml b/demos/Fig6_NetMultiscale/cells_channels/GABA.xml new file mode 100644 index 0000000..306dd9e --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/GABA.xml @@ -0,0 +1,16 @@ + + + + + GABA receptor synchan, 2 ms tau. + + + + Simple double exponential waveform GABA synapse + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/Glu.xml b/demos/Fig6_NetMultiscale/cells_channels/Glu.xml new file mode 100644 index 0000000..c1a7d7c --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/Glu.xml @@ -0,0 +1,16 @@ + + + + + Glutamate receptor synchan, 2 ms tau. + + + + Simple double exponential waveform glu synapse + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/NMDA.xml b/demos/Fig6_NetMultiscale/cells_channels/NMDA.xml new file mode 100644 index 0000000..ce7e3dd --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/NMDA.xml @@ -0,0 +1,16 @@ + + + + + NMDA receptor synchan, 20 ms tau. + + + + Simple double exponential waveform NMDA synapse + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/Pyramidal_KM.xml b/demos/Fig6_NetMultiscale/cells_channels/Pyramidal_KM.xml new file mode 100644 index 0000000..09239c3 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/Pyramidal_KM.xml @@ -0,0 +1,92 @@ + + + + + Voltage-gated K channel + + + + + + Matteo Farinella + + + + Channel translated from the original .mod file used in Kole MH, Ilschner SU, Kampa BM, Williams SR, Ruben PC, Stuart GJ, Action potential generation requires a high sodium channel density in the axon initial segment. Nat Neurosci. 2008 Feb;11(2):178-86. + Based on I-M (muscarinic K channel) Slow, noninactivating + + + + + Zach Mainen + Salk Institute + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + Matteo Farinella + UCL + m.farinella - at - ucl.ac.uk + + + + + + + Rothman JS, Cathala L, Steuber V, Silver RA, Synaptic depression enables neuronal gain control. Nature. 2009 Jan 14 + http://www.ncbi.nlm.nih.gov/pubmed/19145233?ordinalpos=1&itool=EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DefaultReportPanel.Pubmed_RVDocSum + + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/Traub_KA.xml b/demos/Fig6_NetMultiscale/cells_channels/Traub_KA.xml new file mode 100644 index 0000000..9e507d0 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/Traub_KA.xml @@ -0,0 +1,109 @@ + + + + ChannelML file based on Traub et al. 2003 + + + + + Verified equivalence of NEURON and GENESIS mapping to orig NEURON mod impl at 0.02ms dt with current pulse + In original mod, m is initialised to 0, as opposed to minf at t=0. ChannelML impl corrects this + + Yoana Dimitrova + + + Padraig Gleeson + + + + Potasium A-type conductance (transient, inactivating). Based on NEURON port of FRB L2/3 model from Traub et al 2003. Same channel used in Traub et al 2005 + + + + Maciej Lazarewicz + Conversion of FORTRAN model to NEURON. See Traub et al 2003 for detailed origin of channels + + + Roger D Traub + Conversion of FORTRAN model to NEURON. See Traub et al 2003 for detailed origin of channels + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + Yoana Dimitrova + UCL + + + + + Roger D. Traub, Eberhard H. Buhl, Tengis Gloveli, and Miles A. Whittington +Fast Rhythmic Bursting Can Be Induced in Layer 2/3 Cortical Neurons by Enhancing Persistent Na+ Conductance or by Blocking BK Channels +J Neurophysiol 89: 909-921, 2003 + http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=12574468 + + + + Roger D. Traub, Diego Contreras, Mark O. Cunningham, Hilary Murray, Fiona E. N. LeBeau, Anita Roopun, Andrea Bibbig, W. Bryan Wilent, Michael J. Higley, and Miles A. Whittington +Single-column thalamocortical network model exhibiting gamma oscillations, sleep spindles, and epileptogenic bursts. +J. Neurophysiol. 93, 2194-2232, 2005 + http://www.ncbi.nlm.nih.gov/pubmed/15525801?dopt=Abstract + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + Mechanisms of fast rhythmic bursting in a layer 2/3 cortical neuron (Traub et al 2003) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=20756 + + + + A single column thalamocortical network model (Traub et al 2005) + http://senselab.med.yale.edu/ModelDb/ShowModel.asp?model=45539 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Using broad range of voltages for sufficient coverage + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/Traub_KCaAHP.xml b/demos/Fig6_NetMultiscale/cells_channels/Traub_KCaAHP.xml new file mode 100644 index 0000000..bc5e1b5 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/Traub_KCaAHP.xml @@ -0,0 +1,105 @@ + + + + ChannelML file based on Traub et al. 2003 + + + + + Verified equivalence of NEURON and GENESIS mapping to orig NEURON mod impl at 0.02ms dt with current pulse on single comp incl CaD + In original mod, m is initialised to 0, as opposed to minf at t=0. ChannelML impl corrects this + + + Padraig Gleeson + + + Yoana Dimitrova + + + + [Ca2+] dependent K AHP (afterhyperpolarization) conductance. Based on NEURON port of FRB L2/3 model from Traub et al 2003. Same channel used in Traub et al 2005 + + + + Maciej Lazarewicz + Conversion of FORTRAN model to NEURON. See Traub et al 2003 for detailed origin of channels + + + Roger D Traub + Conversion of FORTRAN model to NEURON. See Traub et al 2003 for detailed origin of channels + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + Yoana Dimitrova + UCL + + + + + Roger D. Traub, Eberhard H. Buhl, Tengis Gloveli, and Miles A. Whittington +Fast Rhythmic Bursting Can Be Induced in Layer 2/3 Cortical Neurons by Enhancing Persistent Na+ Conductance or by Blocking BK Channels +J Neurophysiol 89: 909-921, 2003 + http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=12574468 + + + + Roger D. Traub, Diego Contreras, Mark O. Cunningham, Hilary Murray, Fiona E. N. LeBeau, Anita Roopun, Andrea Bibbig, W. Bryan Wilent, Michael J. Higley, and Miles A. Whittington +Single-column thalamocortical network model exhibiting gamma oscillations, sleep spindles, and epileptogenic bursts. +J. Neurophysiol. 93, 2194-2232, 2005 + http://www.ncbi.nlm.nih.gov/pubmed/15525801?dopt=Abstract + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + Mechanisms of fast rhythmic bursting in a layer 2/3 cortical neuron (Traub et al 2003) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=20756 + + + + A single column thalamocortical network model (Traub et al 2005) + http://senselab.med.yale.edu/ModelDb/ShowModel.asp?model=45539 + + + + + + + + + + + + + + + + + + + + + + + + + This will ensure more points in calcium dependence table + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/ca1_minimal.p b/demos/Fig6_NetMultiscale/cells_channels/ca1_minimal.p new file mode 100644 index 0000000..4395d62 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/ca1_minimal.p @@ -0,0 +1,58 @@ +// genesis +// cell parameter file for the 1991 Traub CA1 hippocampal cell +// "phi" parameter reduced by e-3 +*cartesian +*relative + +*set_global RM 1.0 //ohm*m^2 +*set_global RA 1.0 //ohm*m +*set_global CM 0.03 //F/m^2 +*set_global EREST_ACT -0.06 // volts + +// The format for each compartment parameter line is : +// name parent x y z d ch dens ... +// For channels, "dens" = maximum conductance per unit area of compartment + + +dend_3 none 0 220 0 3.84 +dend_5 . 0 220 0 3.84 +dend_6 . 0 220 0 3.84 +dend_8 . 0 110 0 3.84 + +soma dend_8 0 125 0 8.46 + + +apical_10 soma 0 120 0 4.0 +apical_11 apical_10 0 120 0 3 +apical_12 apical_11 0 120 0 3 +apical_13 apical_12 0 120 0 2.6 +apical_14 apical_13 0 120 0 2.6 +apical_15 apical_14 0 120 0 2.6 +apical_16 apical_15 0 120 0 2.6 +apical_17 apical_16 0 120 0 2.6 +apical_18 apical_17 0 120 0 2.6 +apical_19 apical_18 0 120 0 2.6 + +apical_11_1 apical_10 -60 60 0 2 +apical_11_2 apical_11_1 -60 60 0 1.8 +apical_11_3 apical_11_2 0 80 0 1.5 +apical_11_4 apical_11_3 0 80 0 1.5 + +apical_13_1 apical_12 40 40 0 1.0 +apical_13_2 apical_13_1 40 40 0 1.0 + +apical_14_1 apical_13_2 0 10 0 1.0 +apical_14_2 . 0 10 0 1.0 +apical_14_3 . 0 10 0 1.0 +apical_14_4 . 0 10 0 1.0 +apical_14_5 . 0 10 0 1.0 +apical_14_6 . 0 10 0 1.0 +apical_14_7 . 0 10 0 1.0 +apical_14_8 . 0 10 0 1.0 +apical_14_9 . 0 10 0 1.0 +apical_14_10 . 0 10 0 1.0 +apical_14_11 . 0 10 0 1.0 +apical_14_12 . 0 10 0 1.0 +apical_14_13 . 0 10 0 1.0 +apical_15_1 . 0 30 0 1.0 +apical_15_2 . 0 60 0 1.0 diff --git a/demos/Fig6_NetMultiscale/cells_channels/hd.xml b/demos/Fig6_NetMultiscale/cells_channels/hd.xml new file mode 100644 index 0000000..141c1ac --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/hd.xml @@ -0,0 +1,73 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and l traces on single comp with current pulse + + Padraig Gleeson + + + + H current. Comment from original mod: I-h channel from Magee 1998 for distal dendrites + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/hd_minus73.xml b/demos/Fig6_NetMultiscale/cells_channels/hd_minus73.xml new file mode 100644 index 0000000..38815ff --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/hd_minus73.xml @@ -0,0 +1,73 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and l traces on single comp with current pulse + + Padraig Gleeson + + + + H current. Comment from original mod: I-h channel from Magee 1998 for distal dendrites + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/kad.xml b/demos/Fig6_NetMultiscale/cells_channels/kad.xml new file mode 100644 index 0000000..bb7c5af --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/kad.xml @@ -0,0 +1,84 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + A type K channel for distal dendrites. Comment from original mod: K-A channel from Klee Ficker and Heinemann, modified to account for Dax A Current, M.Migliore Jun 1997 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig6_NetMultiscale/cells_channels/kap.xml b/demos/Fig6_NetMultiscale/cells_channels/kap.xml new file mode 100644 index 0000000..58fdea0 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/kap.xml @@ -0,0 +1,86 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + A type K channel. Comment from original mod: K-A channel from Klee Ficker and Heinemann, + modified to account for Dax A Current --- M.Migliore Jun 1997, + modified to be used with cvode M.Migliore 2001 + + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig6_NetMultiscale/cells_channels/kdr.xml b/demos/Fig6_NetMultiscale/cells_channels/kdr.xml new file mode 100644 index 0000000..180c563 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/kdr.xml @@ -0,0 +1,75 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + Delayed rectifier K channel. Comment from original mod: K-DR channel, from Klee Ficker and Heinemann, + modified to account for Dax et al., M.Migliore 1997 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + K channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table3 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + \ No newline at end of file diff --git a/demos/Fig6_NetMultiscale/cells_channels/na3.xml b/demos/Fig6_NetMultiscale/cells_channels/na3.xml new file mode 100644 index 0000000..5684d19 --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/na3.xml @@ -0,0 +1,107 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + Note: the inactivation gate s is not included here as it was disabled in original mod file for Migliore et al. Changing the parameter below ar from 1 will not enable s! + + Padraig Gleeson + + + + Na channel. Comment from original mod: Na current, modified from Jeff Magee. M.Migliore may97, + added sh to account for higher threshold M.Migliore, Apr.2002 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/nax.xml b/demos/Fig6_NetMultiscale/cells_channels/nax.xml new file mode 100644 index 0000000..3ca589c --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/nax.xml @@ -0,0 +1,88 @@ + + + + ChannelML file containing a single Channel description + + + + + Agreement of generated NEURON and GENESIS to original NEURON mod. Compared voltage and n traces on single comp with current pulse + + Padraig Gleeson + + + + Na channel for axon. Comment from original mod: Na current for axon. No slow inact. M.Migliore Jul. 1997, + added sh to account for higher threshold M.Migliore, Apr.2002 + + + + Michele Migliore + Cited implementer according to ModelDB + + + Padraig Gleeson + UCL + p.gleeson - at - ucl.ac.uk + + + + + Migliore M, Ferrante M, Ascoli GA (2005) Signal propagation in oblique dendrites of CA1 pyramidal cells. J Neurophysiol 94:4145-4155 + http://www.ncbi.nlm.nih.gov/pubmed/16293591 + + + + Na channels + http://senselab.med.yale.edu/senselab/NeuronDB/channelGene2.htm#table2 + + + + CA1 pyramidal neuron: signal propagation in oblique dendrites (Migliore et al 2005) + http://senselab.med.yale.edu/ModelDB/ShowModel.asp?model=55035 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Suggesting using a large table of precomputed rate equation values since original mod didn't use any table, i.e. used continuous values + + + + + + + + diff --git a/demos/Fig6_NetMultiscale/cells_channels/pas.xml b/demos/Fig6_NetMultiscale/cells_channels/pas.xml new file mode 100644 index 0000000..9abffeb --- /dev/null +++ b/demos/Fig6_NetMultiscale/cells_channels/pas.xml @@ -0,0 +1,17 @@ + + + + ChannelML file containing a single Channel description + + + + + + 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. + + + + + + \ No newline at end of file diff --git a/demos/Fig6_NetMultiscale/psd53.g b/demos/Fig6_NetMultiscale/psd53.g new file mode 100644 index 0000000..e120a6a --- /dev/null +++ b/demos/Fig6_NetMultiscale/psd53.g @@ -0,0 +1,477 @@ +//genesis +// kkit Version 11 flat dumpfile + +// Saved on Fri Jun 5 09:12:59 2015 + +include kkit {argv 1} + +FASTDT = 1e-05 +SIMDT = 0.0001 +CONTROLDT = 1 +PLOTDT = 0.2 +MAXTIME = 200 +TRANSIENT_TIME = 2 +VARIABLE_DT_FLAG = 1 +DEFAULT_VOL = 1e-19 +VERSION = 11.0 +setfield /file/modpath value /home2/bhalla/scripts/modules +kparms + +//genesis + +initdump -version 3 -ignoreorphans 1 +simobjdump doqcsinfo filename accessname accesstype transcriber developer \ + citation species tissue cellcompartment methodology sources \ + model_implementation model_validation x y z +simobjdump table input output alloced step_mode stepsize x y z +simobjdump xtree path script namemode sizescale +simobjdump xcoredraw xmin xmax ymin ymax +simobjdump xtext editable +simobjdump xgraph xmin xmax ymin ymax overlay +simobjdump xplot pixflags script fg ysquish do_slope wy +simobjdump group xtree_fg_req xtree_textfg_req plotfield expanded movealone \ + link savename file version md5sum mod_save_flag x y z +simobjdump geometry size dim shape outside xtree_fg_req xtree_textfg_req x y \ + z +simobjdump kpool DiffConst CoInit Co n nInit mwt nMin vol slave_enable \ + geomname xtree_fg_req xtree_textfg_req x y z +simobjdump kreac kf kb notes xtree_fg_req xtree_textfg_req x y z +simobjdump kenz CoComplexInit CoComplex nComplexInit nComplex vol k1 k2 k3 \ + keepconc usecomplex notes xtree_fg_req xtree_textfg_req link x y z +simobjdump stim level1 width1 delay1 level2 width2 delay2 baselevel trig_time \ + trig_mode notes xtree_fg_req xtree_textfg_req is_running x y z +simobjdump xtab input output alloced step_mode stepsize notes editfunc \ + xtree_fg_req xtree_textfg_req baselevel last_x last_y is_running x y z +simobjdump kchan perm gmax Vm is_active use_nernst notes xtree_fg_req \ + xtree_textfg_req x y z +simobjdump transport input output alloced step_mode stepsize dt delay clock \ + kf xtree_fg_req xtree_textfg_req x y z +simobjdump proto x y z +simobjdump text str +simundump geometry /kinetics/geometry 0 1.6667e-21 3 sphere "" white black 5 \ + -4 0 +simundump geometry /kinetics/geometry[1] 0 1e-19 3 sphere "" white black 5 -2 \ + 0 +simundump geometry /kinetics/geometry[2] 0 1e-20 3 sphere "" white black 2 2 \ + 0 +simundump geometry /kinetics/geometry[3] 0 1e-20 3 sphere "" white black 4 8 \ + 0 +simundump geometry /kinetics/geometry[4] 0 1e-20 3 sphere "" white black 2 \ + -17 0 +simundump geometry /kinetics/geometry[5] 0 1e-20 3 sphere "" white black 5 \ + -13 0 +simundump geometry /kinetics/geometry[6] 0 1e-19 3 sphere "" white black 0 7 \ + 0 +simundump geometry /kinetics/geometry[7] 0 1e-20 3 sphere "" white black 0 -3 \ + 0 +simundump geometry /kinetics/geometry[8] 0 1e-20 3 sphere "" white black -1 \ + -18 0 +simundump geometry /kinetics/geometry[9] 0 1e-18 3 sphere "" white black 0 0 \ + 0 +simundump text /kinetics/notes 0 "" +call /kinetics/notes LOAD \ +"" +simundump text /kinetics/geometry/notes 0 "" +call /kinetics/geometry/notes LOAD \ +"" +simundump text /kinetics/geometry[1]/notes 0 "" +call /kinetics/geometry[1]/notes LOAD \ +"" +simundump text /kinetics/geometry[2]/notes 0 "" +call /kinetics/geometry[2]/notes LOAD \ +"" +simundump text /kinetics/geometry[3]/notes 0 "" +call /kinetics/geometry[3]/notes LOAD \ +"" +simundump text /kinetics/geometry[4]/notes 0 "" +call /kinetics/geometry[4]/notes LOAD \ +"" +simundump text /kinetics/geometry[5]/notes 0 "" +call /kinetics/geometry[5]/notes LOAD \ +"" +simundump text /kinetics/geometry[6]/notes 0 "" +call /kinetics/geometry[6]/notes LOAD \ +"" +simundump text /kinetics/geometry[7]/notes 0 "" +call /kinetics/geometry[7]/notes LOAD \ +"" +simundump text /kinetics/geometry[8]/notes 0 "" +call /kinetics/geometry[8]/notes LOAD \ +"" +simundump text /kinetics/geometry[9]/notes 0 "" +call /kinetics/geometry[9]/notes LOAD \ +"" +simundump kreac /kinetics/exocytosis 0 0.01 0 "" white black 4 -5 0 +simundump text /kinetics/exocytosis/notes 0 "" +call /kinetics/exocytosis/notes LOAD \ +"" +simundump kreac /kinetics/endocytosis 0 0 4 "" white black -7 -5 0 +simundump text /kinetics/endocytosis/notes 0 "" +call /kinetics/endocytosis/notes LOAD \ +"" +simundump group /kinetics/PSD 0 0 black x 0 1 "" PSD defaultfile.g 0 0 0 -10 \ + -3 0 +simundump text /kinetics/PSD/notes 0 "" +call /kinetics/PSD/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Rp 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[1] \ + blue 0 -4 1 0 +simundump text /kinetics/PSD/Rp/notes 0 "" +call /kinetics/PSD/Rp/notes LOAD \ +"" +simundump kpool /kinetics/PSD/P 0 0 1 1 6 6 0 0 6 0 /kinetics/geometry[1] 61 \ + 0 -4 -2 0 +simundump text /kinetics/PSD/P/notes 0 "" +call /kinetics/PSD/P/notes LOAD \ +"" +simundump kenz /kinetics/PSD/P/P1 0 0 0 0 0 60 10.417 20 5 0 0 "" red 61 "" \ + -6 -1 0 +simundump text /kinetics/PSD/P/P1/notes 0 "" +call /kinetics/PSD/P/P1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/P/P2 0 0 0 0 0 60 10.417 20 5 0 0 "" red 61 "" \ + -2 -1 0 +simundump text /kinetics/PSD/P/P2/notes 0 "" +call /kinetics/PSD/P/P2/notes LOAD \ +"" +simundump kpool /kinetics/PSD/KK 0 0 3 3 18 18 0 0 6 0 /kinetics/geometry[1] \ + 49 0 -4 4 0 +simundump text /kinetics/PSD/KK/notes 0 "" +call /kinetics/PSD/KK/notes LOAD \ +"" +simundump kenz /kinetics/PSD/KK/KK1 0 0 0 0 0 60 4.1667 40 10 0 0 "" red 49 \ + "" -6 3 0 +simundump text /kinetics/PSD/KK/KK1/notes 0 "" +call /kinetics/PSD/KK/KK1/notes LOAD \ +"" +simundump kenz /kinetics/PSD/KK/KK2 0 0 0 0 0 60 4.1667 40 10 0 0 "" red 49 \ + "" -2 3 0 +simundump text /kinetics/PSD/KK/KK2/notes 0 "" +call /kinetics/PSD/KK/KK2/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Rpp 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[1] \ + 28 0 0 1 0 +simundump text /kinetics/PSD/Rpp/notes 0 "" +call /kinetics/PSD/Rpp/notes LOAD \ +"" +simundump kpool /kinetics/PSD/R 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[1] 4 0 \ + -8 1 0 +simundump text /kinetics/PSD/R/notes 0 "" +call /kinetics/PSD/R/notes LOAD \ +"" +simundump kpool /kinetics/PSD/tot_PSD_R 0 0 0 0 0 0 0 0 6 0 \ + /kinetics/geometry[4] blue 0 -4 7 0 +simundump text /kinetics/PSD/tot_PSD_R/notes 0 "" +call /kinetics/PSD/tot_PSD_R/notes LOAD \ +"" +simundump kpool /kinetics/PSD/psd_inact_CaN 0 0 1 1 6 6 0 0 6 0 \ + /kinetics/geometry[7] blue 0 -12 5 0 +simundump text /kinetics/PSD/psd_inact_CaN/notes 0 "" +call /kinetics/PSD/psd_inact_CaN/notes LOAD \ +"" +simundump kreac /kinetics/PSD/psd_activate_CaN 0 0.27778 1 "" white 0 -11 1 0 +simundump text /kinetics/PSD/psd_activate_CaN/notes 0 "" +call /kinetics/PSD/psd_activate_CaN/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Ca.P 0 0 0 0 0 0 0 0 6 0 /kinetics/geometry[7] \ + blue 0 -4 -4 0 +simundump text /kinetics/PSD/Ca.P/notes 0 "" +call /kinetics/PSD/Ca.P/notes LOAD \ +"" +simundump kenz /kinetics/PSD/Ca.P/Ca.P2 0 0 0 0 0 6 1.6667 40 10 0 0 "" red \ + blue "" -2 -3 0 +simundump text /kinetics/PSD/Ca.P/Ca.P2/notes 0 "" +call /kinetics/PSD/Ca.P/Ca.P2/notes LOAD \ +"" +simundump kenz /kinetics/PSD/Ca.P/Ca.P1 0 0 0 0 0 6 1.6667 40 10 0 0 "" red \ + blue "" -6 -3 0 +simundump text /kinetics/PSD/Ca.P/Ca.P1/notes 0 "" +call /kinetics/PSD/Ca.P/Ca.P1/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Ca_input 0 0 0.1 0.1 0.6 0.6 0 0 6 4 \ + /kinetics/geometry[8] 60 black -12 9 0 +simundump text /kinetics/PSD/Ca_input/notes 0 "" +call /kinetics/PSD/Ca_input/notes LOAD \ +"" +simundump kreac /kinetics/PSD/Ca_reac 0 100 100 "" white black -17 6 0 +simundump text /kinetics/PSD/Ca_reac/notes 0 "" +call /kinetics/PSD/Ca_reac/notes LOAD \ +"" +simundump kpool /kinetics/PSD/Ca 0 1e-11 0.1 0.1 0.6 0.6 0 0 6 0 \ + /kinetics/geometry[5] 53 0 -15 2 0 +simundump text /kinetics/PSD/Ca/notes 0 "" +call /kinetics/PSD/Ca/notes LOAD \ +"" +simundump group /kinetics/Bulk 0 yellow black x 0 0 "" Bulk defaultfile.g 0 0 \ + 0 -6 -16 0 +simundump text /kinetics/Bulk/notes 0 "" +call /kinetics/Bulk/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iRpp 0 0 0 0 0 0 0 0 59.999 0 \ + /kinetics/geometry 29 yellow 2 -11 0 +simundump text /kinetics/Bulk/iRpp/notes 0 "" +call /kinetics/Bulk/iRpp/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iRp 0 0 0 0 0 0 0 0 59.999 0 \ + /kinetics/geometry blue yellow -2 -11 0 +simundump text /kinetics/Bulk/iRp/notes 0 "" +call /kinetics/Bulk/iRp/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iR 0 0 4.0001 4.0001 240 240 0 0 59.999 0 \ + /kinetics/geometry 0 yellow -6 -11 0 +simundump text /kinetics/Bulk/iR/notes 0 "Same as Fus3\n" +call /kinetics/Bulk/iR/notes LOAD \ +"Same as Fus3" \ +"" +simundump kpool /kinetics/Bulk/iKK 0 0 1 1 59.999 59.999 0 0 59.999 0 \ + /kinetics/geometry 50 yellow -2 -8 0 +simundump text /kinetics/Bulk/iKK/notes 0 "Same as Ste7\n" +call /kinetics/Bulk/iKK/notes LOAD \ +"Same as Ste7" \ +"" +simundump kenz /kinetics/Bulk/iKK/iKK1 0 0 0 0 0 59.999 0.83335 40 10 0 0 "" \ + red 50 "" -4 -9 0 +simundump text /kinetics/Bulk/iKK/iKK1/notes 0 "" +call /kinetics/Bulk/iKK/iKK1/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/iKK/iKK2 0 0 0 0 0 59.999 0.83335 40 10 0 0 "" \ + red 50 "" 0 -9 0 +simundump text /kinetics/Bulk/iKK/iKK2/notes 0 "" +call /kinetics/Bulk/iKK/iKK2/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/iP 0 0 0.50001 0.50001 30 30 0 0 59.999 0 \ + /kinetics/geometry 62 yellow -2 -14 0 +simundump text /kinetics/Bulk/iP/notes 0 "Same as Msg5\n" +call /kinetics/Bulk/iP/notes LOAD \ +"Same as Msg5" \ +"" +simundump kenz /kinetics/Bulk/iP/iP1 0 0 0 0 0 59.999 6.2501 60 15 0 0 "" red \ + 62 "" -4 -13 0 +simundump text /kinetics/Bulk/iP/iP1/notes 0 "" +call /kinetics/Bulk/iP/iP1/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/iP/iP2 0 0 0 0 0 59.999 6.2501 60 15 0 0 "" red \ + 62 "" 0 -13 0 +simundump text /kinetics/Bulk/iP/iP2/notes 0 "" +call /kinetics/Bulk/iP/iP2/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/PKA 0 0 0 0 0 0 0 0 60 0 /kinetics/geometry[3] \ + 43 yellow -3 -5 0 +simundump text /kinetics/Bulk/PKA/notes 0 "" +call /kinetics/Bulk/PKA/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/PKA/PKA1 0 0 0 0 0 60 0.41667 40 10 0 0 "" red \ + 43 "" -4 -7 0 +simundump text /kinetics/Bulk/PKA/PKA1/notes 0 "" +call /kinetics/Bulk/PKA/PKA1/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/PKA/PKA2 0 0 0 0 0 60 0.41667 40 10 0 0 "" red \ + 43 "" 0 -7 0 +simundump text /kinetics/Bulk/PKA/PKA2/notes 0 "" +call /kinetics/Bulk/PKA/PKA2/notes LOAD \ +"" +simundump kenz /kinetics/Bulk/PKA/PKA_exo 0 0 0 0 0 60 0.016667 8 2 0 0 "" \ + red 43 "" 1 -5 0 +simundump text /kinetics/Bulk/PKA/PKA_exo/notes 0 "" +call /kinetics/Bulk/PKA/PKA_exo/notes LOAD \ +"" +simundump kreac /kinetics/Bulk/activate_PKA 0 0.0016667 5 "" white yellow -11 \ + -10 0 +simundump text /kinetics/Bulk/activate_PKA/notes 0 "" +call /kinetics/Bulk/activate_PKA/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/inact_PKA 0 0 1.6 1.6 96 96 0 0 60 0 \ + /kinetics/geometry[2] 51 yellow -12 -6 0 +simundump text /kinetics/Bulk/inact_PKA/notes 0 "" +call /kinetics/Bulk/inact_PKA/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/inact_CaN 0 0 0.2 0.2 12 12 0 0 60 0 \ + /kinetics/geometry[6] blue yellow -13 -18 0 +simundump text /kinetics/Bulk/inact_CaN/notes 0 "" +call /kinetics/Bulk/inact_CaN/notes LOAD \ +"" +simundump kreac /kinetics/Bulk/activate_CaN 0 0.0055556 1 "" white yellow -10 \ + -16 0 +simundump text /kinetics/Bulk/activate_CaN/notes 0 "" +call /kinetics/Bulk/activate_CaN/notes LOAD \ +"" +simundump kpool /kinetics/Bulk/Ca 0 1e-11 0.1 0.1 6 6 0 0 60 0 \ + /kinetics/geometry[2] 50 yellow -15 -13 0 +simundump text /kinetics/Bulk/Ca/notes 0 "" +call /kinetics/Bulk/Ca/notes LOAD \ +"" +simundump kpool /kinetics/Ca_dend_input 0 0 0 0 0 0 0 0 600 0 \ + /kinetics/geometry[9] 60 black -12 -28 0 +simundump text /kinetics/Ca_dend_input/notes 0 "" +call /kinetics/Ca_dend_input/notes LOAD \ +"" +simundump kreac /kinetics/dend_Ca_reac 0 100 100 "" white black -16 -27 0 +simundump text /kinetics/dend_Ca_reac/notes 0 "" +call /kinetics/dend_Ca_reac/notes LOAD \ +"" +simundump kpool /kinetics/Ca 0 1e-11 0 0 0 0 0 0 600 0 /kinetics/geometry[9] \ + 1 black -19 -25 0 +simundump text /kinetics/Ca/notes 0 "" +call /kinetics/Ca/notes LOAD \ +"" +simundump xgraph /graphs/conc1 0 0 800 9.6002e-07 0.10547 0 +simundump xgraph /graphs/conc2 0 0 800 0 18.128 0 +simundump xplot /graphs/conc1/Ca_PSD.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 53 0 0 1 +simundump xplot /graphs/conc1/Ca_Bulk.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 41 0 0 1 +simundump xplot /graphs/conc1/PKA.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 43 0 0 1 +simundump xplot /graphs/conc1/Ca.P.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xplot /graphs/conc1/Ca_dend.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 1 0 0 1 +simundump xplot /graphs/conc2/tot_PSD_R.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " blue 0 0 1 +simundump xplot /graphs/conc2/Rpp.Co 3 524288 \ + "delete_plot.w ; edit_plot.D " 28 0 0 1 +simundump xgraph /moregraphs/conc3 0 0 800 0 33.241 0 +simundump xgraph /moregraphs/conc4 0 0 800 0 2 0 +simundump xcoredraw /edit/draw 0 -21 7 -30 11 +simundump xtree /edit/draw/tree 0 \ + /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \ + "edit_elm.D ; drag_from_edit.w " auto 0.6 +simundump xtext /file/notes 0 1 +xtextload /file/notes \ +"26 Nov 2014. psd51.g: based on psd50.g which was" \ +"based on psd41_back_dend.g." \ +"07 Dec 2014. psd52.g: based on psd51. Slowed down Ca_to_dend by " \ +"10x while retaining Keq." \ +"04 June 2015. psd53.g: Removed the reacts between dend, head and" \ +"psd. Will use diffusion instead." \ +"05 June 2015. psd53.g updated further to use the same name (Ca)" \ +"for Ca_dend, Ca_spine and Ca_PSD so as to get them to diffuse." \ +"" +addmsg /kinetics/Bulk/iRpp /kinetics/exocytosis SUBSTRATE n +addmsg /kinetics/PSD/Rpp /kinetics/exocytosis PRODUCT n +addmsg /kinetics/Bulk/iR /kinetics/endocytosis SUBSTRATE n +addmsg /kinetics/PSD/R /kinetics/endocytosis PRODUCT n +addmsg /kinetics/PSD/KK/KK1 /kinetics/PSD/Rp MM_PRD pA +addmsg /kinetics/PSD/KK/KK2 /kinetics/PSD/Rp REAC sA B +addmsg /kinetics/PSD/P/P2 /kinetics/PSD/Rp MM_PRD pA +addmsg /kinetics/PSD/P/P1 /kinetics/PSD/Rp REAC sA B +addmsg /kinetics/PSD/Ca.P/Ca.P2 /kinetics/PSD/Rp MM_PRD pA +addmsg /kinetics/PSD/Ca.P/Ca.P1 /kinetics/PSD/Rp REAC sA B +addmsg /kinetics/PSD/P/P1 /kinetics/PSD/P REAC eA B +addmsg /kinetics/PSD/P/P2 /kinetics/PSD/P REAC eA B +addmsg /kinetics/PSD/P /kinetics/PSD/P/P1 ENZYME n +addmsg /kinetics/PSD/Rp /kinetics/PSD/P/P1 SUBSTRATE n +addmsg /kinetics/PSD/P /kinetics/PSD/P/P2 ENZYME n +addmsg /kinetics/PSD/Rpp /kinetics/PSD/P/P2 SUBSTRATE n +addmsg /kinetics/PSD/KK/KK1 /kinetics/PSD/KK REAC eA B +addmsg /kinetics/PSD/KK/KK2 /kinetics/PSD/KK REAC eA B +addmsg /kinetics/PSD/KK /kinetics/PSD/KK/KK1 ENZYME n +addmsg /kinetics/PSD/R /kinetics/PSD/KK/KK1 SUBSTRATE n +addmsg /kinetics/PSD/KK /kinetics/PSD/KK/KK2 ENZYME n +addmsg /kinetics/PSD/Rp /kinetics/PSD/KK/KK2 SUBSTRATE n +addmsg /kinetics/PSD/KK/KK2 /kinetics/PSD/Rpp MM_PRD pA +addmsg /kinetics/PSD/P/P2 /kinetics/PSD/Rpp REAC sA B +addmsg /kinetics/exocytosis /kinetics/PSD/Rpp REAC B A +addmsg /kinetics/Bulk/PKA/PKA_exo /kinetics/PSD/Rpp MM_PRD pA +addmsg /kinetics/PSD/Ca.P/Ca.P2 /kinetics/PSD/Rpp REAC sA B +addmsg /kinetics/PSD/KK/KK1 /kinetics/PSD/R REAC sA B +addmsg /kinetics/PSD/P/P1 /kinetics/PSD/R MM_PRD pA +addmsg /kinetics/PSD/Ca.P/Ca.P1 /kinetics/PSD/R MM_PRD pA +addmsg /kinetics/endocytosis /kinetics/PSD/R REAC B A +addmsg /kinetics/PSD/R /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/Rp /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/Rpp /kinetics/PSD/tot_PSD_R SUMTOTAL n nInit +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/psd_inact_CaN REAC A B +addmsg /kinetics/PSD/psd_inact_CaN /kinetics/PSD/psd_activate_CaN SUBSTRATE n +addmsg /kinetics/PSD/Ca /kinetics/PSD/psd_activate_CaN SUBSTRATE n +addmsg /kinetics/PSD/Ca /kinetics/PSD/psd_activate_CaN SUBSTRATE n +addmsg /kinetics/PSD/Ca.P /kinetics/PSD/psd_activate_CaN PRODUCT n +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/Ca.P REAC B A +addmsg /kinetics/PSD/Ca.P/Ca.P2 /kinetics/PSD/Ca.P REAC eA B +addmsg /kinetics/PSD/Ca.P/Ca.P1 /kinetics/PSD/Ca.P REAC eA B +addmsg /kinetics/PSD/Ca.P /kinetics/PSD/Ca.P/Ca.P2 ENZYME n +addmsg /kinetics/PSD/Rpp /kinetics/PSD/Ca.P/Ca.P2 SUBSTRATE n +addmsg /kinetics/PSD/Ca.P /kinetics/PSD/Ca.P/Ca.P1 ENZYME n +addmsg /kinetics/PSD/Rp /kinetics/PSD/Ca.P/Ca.P1 SUBSTRATE n +addmsg /kinetics/PSD/Ca_reac /kinetics/PSD/Ca_input REAC A B +addmsg /kinetics/PSD/Ca_input /kinetics/PSD/Ca_reac SUBSTRATE n +addmsg /kinetics/PSD/Ca /kinetics/PSD/Ca_reac PRODUCT n +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/Ca REAC A B +addmsg /kinetics/PSD/psd_activate_CaN /kinetics/PSD/Ca REAC A B +addmsg /kinetics/PSD/Ca_reac /kinetics/PSD/Ca REAC B A +addmsg /kinetics/Bulk/iKK/iKK2 /kinetics/Bulk/iRpp MM_PRD pA +addmsg /kinetics/Bulk/iP/iP2 /kinetics/Bulk/iRpp REAC sA B +addmsg /kinetics/exocytosis /kinetics/Bulk/iRpp REAC A B +addmsg /kinetics/Bulk/PKA/PKA2 /kinetics/Bulk/iRpp MM_PRD pA +addmsg /kinetics/Bulk/PKA/PKA_exo /kinetics/Bulk/iRpp REAC sA B +addmsg /kinetics/Bulk/iKK/iKK1 /kinetics/Bulk/iRp MM_PRD pA +addmsg /kinetics/Bulk/iKK/iKK2 /kinetics/Bulk/iRp REAC sA B +addmsg /kinetics/Bulk/iP/iP2 /kinetics/Bulk/iRp MM_PRD pA +addmsg /kinetics/Bulk/iP/iP1 /kinetics/Bulk/iRp REAC sA B +addmsg /kinetics/Bulk/PKA/PKA1 /kinetics/Bulk/iRp MM_PRD pA +addmsg /kinetics/Bulk/PKA/PKA2 /kinetics/Bulk/iRp REAC sA B +addmsg /kinetics/Bulk/iKK/iKK1 /kinetics/Bulk/iR REAC sA B +addmsg /kinetics/Bulk/iP/iP1 /kinetics/Bulk/iR MM_PRD pA +addmsg /kinetics/Bulk/PKA/PKA1 /kinetics/Bulk/iR REAC sA B +addmsg /kinetics/endocytosis /kinetics/Bulk/iR REAC A B +addmsg /kinetics/Bulk/iKK/iKK1 /kinetics/Bulk/iKK REAC eA B +addmsg /kinetics/Bulk/iKK/iKK2 /kinetics/Bulk/iKK REAC eA B +addmsg /kinetics/Bulk/iKK /kinetics/Bulk/iKK/iKK1 ENZYME n +addmsg /kinetics/Bulk/iR /kinetics/Bulk/iKK/iKK1 SUBSTRATE n +addmsg /kinetics/Bulk/iKK /kinetics/Bulk/iKK/iKK2 ENZYME n +addmsg /kinetics/Bulk/iRp /kinetics/Bulk/iKK/iKK2 SUBSTRATE n +addmsg /kinetics/Bulk/iP/iP1 /kinetics/Bulk/iP REAC eA B +addmsg /kinetics/Bulk/iP/iP2 /kinetics/Bulk/iP REAC eA B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/iP REAC B A +addmsg /kinetics/Bulk/iP /kinetics/Bulk/iP/iP1 ENZYME n +addmsg /kinetics/Bulk/iRp /kinetics/Bulk/iP/iP1 SUBSTRATE n +addmsg /kinetics/Bulk/iP /kinetics/Bulk/iP/iP2 ENZYME n +addmsg /kinetics/Bulk/iRpp /kinetics/Bulk/iP/iP2 SUBSTRATE n +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/PKA REAC B A +addmsg /kinetics/Bulk/PKA/PKA1 /kinetics/Bulk/PKA REAC eA B +addmsg /kinetics/Bulk/PKA/PKA2 /kinetics/Bulk/PKA REAC eA B +addmsg /kinetics/Bulk/PKA/PKA_exo /kinetics/Bulk/PKA REAC eA B +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/PKA/PKA1 ENZYME n +addmsg /kinetics/Bulk/iR /kinetics/Bulk/PKA/PKA1 SUBSTRATE n +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/PKA/PKA2 ENZYME n +addmsg /kinetics/Bulk/iRp /kinetics/Bulk/PKA/PKA2 SUBSTRATE n +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/PKA/PKA_exo ENZYME n +addmsg /kinetics/Bulk/iRpp /kinetics/Bulk/PKA/PKA_exo SUBSTRATE n +addmsg /kinetics/Bulk/inact_PKA /kinetics/Bulk/activate_PKA SUBSTRATE n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_PKA SUBSTRATE n +addmsg /kinetics/Bulk/PKA /kinetics/Bulk/activate_PKA PRODUCT n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_PKA SUBSTRATE n +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/inact_PKA REAC A B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/inact_CaN REAC A B +addmsg /kinetics/Bulk/inact_CaN /kinetics/Bulk/activate_CaN SUBSTRATE n +addmsg /kinetics/Bulk/iP /kinetics/Bulk/activate_CaN PRODUCT n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_CaN SUBSTRATE n +addmsg /kinetics/Bulk/Ca /kinetics/Bulk/activate_CaN SUBSTRATE n +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/Bulk/activate_PKA /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/Bulk/activate_CaN /kinetics/Bulk/Ca REAC A B +addmsg /kinetics/dend_Ca_reac /kinetics/Ca_dend_input REAC A B +addmsg /kinetics/Ca_dend_input /kinetics/dend_Ca_reac SUBSTRATE n +addmsg /kinetics/Ca /kinetics/dend_Ca_reac PRODUCT n +addmsg /kinetics/dend_Ca_reac /kinetics/Ca REAC B A +addmsg /kinetics/PSD/Ca /graphs/conc1/Ca_PSD.Co PLOT Co *Ca_PSD.Co *53 +addmsg /kinetics/Bulk/Ca /graphs/conc1/Ca_Bulk.Co PLOT Co *Ca_Bulk.Co *41 +addmsg /kinetics/Bulk/PKA /graphs/conc1/PKA.Co PLOT Co *PKA.Co *43 +addmsg /kinetics/PSD/Ca.P /graphs/conc1/Ca.P.Co PLOT Co *Ca.P.Co *blue +addmsg /kinetics/Ca /graphs/conc1/Ca_dend.Co PLOT Co *Ca_dend.Co *1 +addmsg /kinetics/PSD/tot_PSD_R /graphs/conc2/tot_PSD_R.Co PLOT Co *tot_PSD_R.Co *blue +addmsg /kinetics/PSD/Rpp /graphs/conc2/Rpp.Co PLOT Co *Rpp.Co *28 +enddump +// End of dump + +call /kinetics/Bulk/iR/notes LOAD \ +"Same as Fus3" \ +"" +call /kinetics/Bulk/iKK/notes LOAD \ +"Same as Ste7" \ +"" +call /kinetics/Bulk/iP/notes LOAD \ +"Same as Msg5" \ +"" +complete_loading diff --git a/demos/README b/demos/README new file mode 100644 index 0000000..bd856f3 --- /dev/null +++ b/demos/README @@ -0,0 +1,33 @@ +Here we have Python scripts that replicate most of the figures in the MOOSE +paper. Most of these can be accessed through the MooseGUI startup screen. +Some of these take a very long time. Approximate runtimes for a 2.2 GHz +core I7 processor are listed here. +Some of these figures/demos depend on the 3-D graphics visualization, which +may not be compiled into your distribution. + +The figure scripts are in the directories Fig_ +and are named Fig2A, Fig3D etc. + +Figure panel Runtime(s) Uses 3-D? Notes +2A 1500 No Generates 2 xplot files for + analysis by Fig2A_analysis.py +2C 6 Yes +2D 35 Yes +2E 5 Yes + +3ABC 2 No This is a GENESIS/KKIT model + definition file loaded by MOOSE. +3D 1 No There is a corresponding + Fig3_NEURON.py for the same + model in NEURON. + +4B 10 Yes +4CDEF 370 No +4GHIJ 300 No + +5A 20 Yes Pops up four windows. +5BCDE 240 No Text only output. + +6A 60 Yes Spines exaggerated for display +6BCDE 3900 No Dumps to SVG. + diff --git a/demos/README.md b/demos/README.md new file mode 100644 index 0000000..30797ae --- /dev/null +++ b/demos/README.md @@ -0,0 +1,3 @@ +[![Build Status](https://travis-ci.org/BhallaLab/moose-examples.svg)](https://travis-ci.org/BhallaLab/moose-examples). + +Examples, tutorial and demo scripts. diff --git a/demos/__init__.py b/demos/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/demos/rxdSpineSize.py b/demos/rxdSpineSize.py new file mode 100644 index 0000000..aa61446 --- /dev/null +++ b/demos/rxdSpineSize.py @@ -0,0 +1,293 @@ +################################################################## +## This program is part of 'MOOSE', the +## Messaging Object Oriented Simulation Environment. +## Copyright (C) 2015 Upinder S. Bhalla. and NCBS +## It is made available under the terms of the +## GNU Lesser General Public License version 2.1 +## See the file COPYING.LIB for the full notice. +## +## rxdSpineSize.py: Builds a cell with spines and a propagating reaction +## wave. Products diffuse into the spine and cause it to get bigger. +################################################################## +import math +import pylab +import numpy +import matplotlib.pyplot as plt +import moose +import sys +sys.path.append( '../util' ) +import rdesigneur as rd +from PyQt5 import QtGui +import moogli +import moogli.extensions.moose +import matplotlib + +PI = 3.141592653 +ScalingForTesting = 10 +RM = 1.0 / ScalingForTesting +RA = 1.0 * ScalingForTesting +CM = 0.01 * ScalingForTesting +runtime = 100.0 +frameruntime = 1.0 +diffConst = 5e-12 +dendLen = 100e-6 +diffLen = 1.0e-6 +dendDia = 2e-6 +somaDia = 5e-6 +concInit = 0.001 # 1 millimolar +spineSpacing = 10e-6 +spineSpacingDistrib = 1e-6 +spineSize = 1.0 +spineSizeDistrib = 0.5 +spineAngle= numpy.pi / 2.0 +spineAngleDistrib = 0.0 + +def makeCellProto( name ): + elec = moose.Neuron( '/library/' + name ) + ecompt = [] + soma = rd.buildCompt( elec, 'soma', somaDia, somaDia, -somaDia, RM, RA, CM ) + dend = rd.buildCompt( elec, 'dend', dendLen, dendDia, 0, RM, RA, CM ) + moose.connect( soma, 'axial', dend, 'raxial' ) + elec.buildSegmentTree() + +def makeChemProto( name ): + chem = moose.Neutral( '/library/' + name ) + comptVol = diffLen * dendDia * dendDia * PI / 4.0 + for i in ( ['dend', comptVol], ['spine', 1e-19], ['psd', 1e-20] ): + print(('making ', i)) + compt = moose.CubeMesh( chem.path + '/' + i[0] ) + compt.volume = i[1] + #x = moose.Pool( compt.path + '/x' ) + #y = moose.BufPool( compt.path + '/y' ) + z = moose.Pool( compt.path + '/z' ) + #x.concInit = 0.0 + #x.diffConst = diffConst + #y.concInit = concInit + z.concInit = 0.0 + z.diffConst = diffConst + nInit = comptVol * 6e23 * concInit + nstr = str( 1/nInit) + + x = moose.Pool( chem.path + '/dend/x' ) + x.diffConst = diffConst + func = moose.Function( x.path + '/func' ) + func.expr = "-x0 * (0.3 - " + nstr + " * x0) * ( 1 - " + nstr + " * x0)" + print((func.expr)) + func.x.num = 1 + moose.connect( x, 'nOut', func.x[0], 'input' ) + moose.connect( func, 'valueOut', x, 'increment' ) + z = moose.element( '/library/' + name + '/dend/z' ) + reac = moose.Reac( '/library/' + name + '/dend/reac' ) + reac.Kf = 1 + reac.Kb = 10 + moose.connect( reac, 'sub', x, 'reac' ) + moose.connect( reac, 'prd', z, 'reac' ) + +def makeSpineProto2( name ): + spine = moose.Neutral( '/library/' + name ) + shaft = rd.buildCompt( spine, 'shaft', 0.5e-6, 0.4e-6, 0, RM, RA, CM ) + head = rd.buildCompt( spine, 'head', 0.5e-6, 0.5e-6, 0.5e-6, RM, RA, CM ) + moose.connect( shaft, 'axial', head, 'raxial' ) + +def makeModel(): + moose.Neutral( '/library' ) + makeCellProto( 'cellProto' ) + makeChemProto( 'cProto' ) + makeSpineProto2( 'spine' ) + rdes = rd.rdesigneur( useGssa = False, \ + combineSegments = False, \ + stealCellFromLibrary = True, \ + meshLambda = 1e-6, \ + cellProto = [['cellProto', 'elec' ]] ,\ + spineProto = [['spineProto', 'spine' ]] ,\ + chemProto = [['cProto', 'chem' ]] ,\ + spineDistrib = [ \ + ['spine', '#', \ + 'spacing', str( spineSpacing ), \ + 'spacingDistrib', str( spineSpacingDistrib ), \ + 'angle', str( spineAngle ), \ + 'angleDistrib', str( spineAngleDistrib ), \ + 'size', str( spineSize ), \ + 'sizeDistrib', str( spineSizeDistrib ) ] \ + ], \ + chemDistrib = [ \ + [ "chem", "dend", "install", "1" ] \ + ], + adaptorList = [ \ + [ 'psd/z', 'n', 'spine', 'psdArea', 10.0e-15, 300e-15 ], \ + ] \ + ) + rdes.buildModel( '/model' ) + x = moose.vec( '/model/chem/dend/x' ) + x.concInit = 0.0 + for i in range( 0,20 ): + x[i].concInit = concInit + +def makePlot( name, srcVec, field ): + tab = moose.Table2('/graphs/' + name + 'Tab', len( srcVec ) ).vec + for i in zip(srcVec, tab): + moose.connect(i[1], 'requestOut', i[0], field) + return tab + + +def displayPlots(): + for x in moose.wildcardFind( '/graphs/#[0]' ): + tab = moose.vec( x ) + for i in range( len( tab ) ): + pylab.plot( tab[i].vector, label=x.name[:-3] + " " + str( i ) ) + pylab.legend() + pylab.figure() + +def main(): + """ + This illustrates the use of rdesigneur to build a simple dendrite with + spines, and then to resize them using spine fields. These are the + fields that would be changed dynamically in a simulation with reactions + that affect spine geometry. + In this simulation there is a propagating reaction wave using a + highly abstracted equation, whose product diffuses into the spines and + makes them bigger. + """ + makeModel() + elec = moose.element( '/model/elec' ) + elec.setSpineAndPsdMesh( moose.element('/model/chem/spine'), moose.element('/model/chem/psd') ) + + eHead = moose.wildcardFind( '/model/elec/#head#' ) + oldDia = [ i.diameter for i in eHead ] + graphs = moose.Neutral( '/graphs' ) + #makePlot( 'psd_x', moose.vec( '/model/chem/psd/x' ), 'getN' ) + #makePlot( 'head_x', moose.vec( '/model/chem/spine/x' ), 'getN' ) + makePlot( 'dend_x', moose.vec( '/model/chem/dend/x' ), 'getN' ) + makePlot( 'dend_z', moose.vec( '/model/chem/dend/z' ), 'getN' ) + makePlot( 'head_z', moose.vec( '/model/chem/spine/z' ), 'getN' ) + makePlot( 'psd_z', moose.vec( '/model/chem/psd/z' ), 'getN' ) + makePlot( 'headDia', eHead, 'getDiameter' ) + + ''' + debug = moose.PyRun( '/pyrun' ) + debug.tick = 10 + debug.runString = """print "RUNNING: ", moose.element( '/model/chem/psd/z' ).n, moose.element( '/model/elec/head0' ).diameter""" + ''' + moose.reinit() + moose.start( runtime ) + + displayPlots() + pylab.plot( oldDia, label = 'old Diameter' ) + pylab.plot( [ i.diameter for i in eHead ], label = 'new Diameter' ) + pylab.legend() + pylab.show() + + app = QtGui.QApplication(sys.argv) + #widget = mv.MoogliViewer( '/model' ) + morphology = moogli.read_morphology_from_moose( name="", path = '/model/elec' ) + widget = moogli.MorphologyViewerWidget( morphology ) + widget.show() + return app.exec_() + quit() + +# Run the 'main' if this script is executed standalone. + +def showVisualization(): + makeModel() + elec = moose.element( '/model/elec' ) + elec.setSpineAndPsdMesh( moose.element('/model/chem/spine'), moose.element('/model/chem/psd') ) + + eHead = moose.wildcardFind( '/model/elec/#head#' ) + oldDia = [ i.diameter for i in eHead ] + graphs = moose.Neutral( '/graphs' ) + #makePlot( 'psd_x', moose.vec( '/model/chem/psd/x' ), 'getN' ) + #makePlot( 'head_x', moose.vec( '/model/chem/spine/x' ), 'getN' ) + makePlot( 'dend_x', moose.vec( '/model/chem/dend/x' ), 'getN' ) + dendZ = makePlot( 'dend_z', moose.vec( '/model/chem/dend/z' ), 'getN' ) + makePlot( 'head_z', moose.vec( '/model/chem/spine/z' ), 'getN' ) + psdZ = makePlot( 'psd_z', moose.vec( '/model/chem/psd/z' ), 'getN' ) + diaTab = makePlot( 'headDia', eHead, 'getDiameter' ) + # print diaTab[0].vector[-1] + # return + dendrite = moose.element("/model/elec/dend") + dendrites = [dendrite.path + "/" + str(i) for i in range(len(dendZ))] + # print dendrites + moose.reinit() + + spineHeads = moose.wildcardFind( '/model/elec/#head#') + # print moose.wildcardFind( '/model/elec/##') + + # print "dendZ", readValues(dendZ) + # print dendrite + + app = QtGui.QApplication(sys.argv) + viewer = create_viewer("/model/elec", dendrite, dendZ, diaTab, psdZ) + viewer.showMaximized() + viewer.start() + return app.exec_() + + +def create_viewer(path, moose_dendrite, dendZ, diaTab, psdZ): + network = moogli.extensions.moose.read(path=path, + vertices=15) + + dendrite = network.groups["dendrite"].shapes[moose_dendrite.path] + chem_compt_group = dendrite.subdivide(len(dendZ)) + normalizer = moogli.utilities.normalizer(0.0, + 300.0, + clipleft=True, + clipright=True) + colormap = moogli.colors.MatplotlibColorMap(matplotlib.cm.rainbow) + mapper = moogli.utilities.mapper(colormap, normalizer) + + def readValues(tables): + values = [] + for i in range(len(tables)): + values.append(tables[i].vector[-1]) + return values + + def prelude(view): + view.home() + view.pitch(math.pi / 3.0) + view.zoom(0.3) + network.groups["soma"].set("color", moogli.colors.RED) + network.groups["spine"].groups["shaft"].set("color", + moogli.colors.RED) + + def interlude(view): + moose.start(frameruntime) + network.groups["spine"].groups["head"].set("radius", + readValues(diaTab), + lambda x: x * 0.5e6) + network.groups["spine"].groups["head"].set("color", + readValues(psdZ), + mapper) + chem_compt_group.set("color", + readValues(dendZ), + mapper) + if moose.element("/clock").currentTime >= runtime: + view.stop() + + viewer = moogli.Viewer("Viewer") + viewer.attach_shapes(list(network.shapes.values())) + viewer.detach_shape(dendrite) + viewer.attach_shapes(list(chem_compt_group.shapes.values())) + + view = moogli.View("main-view", + prelude=prelude, + interlude=interlude) + cb = moogli.widgets.ColorBar(id="cb", + title="Molecule #", + text_color=moogli.colors.BLACK, + position=moogli.geometry.Vec3f(0.975, 0.5, 0.0), + size=moogli.geometry.Vec3f(0.30, 0.05, 0.0), + text_font="/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf", + orientation=math.pi / 2.0, + text_character_size=20, + label_formatting_precision=0, + colormap=moogli.colors.MatplotlibColorMap(matplotlib.cm.rainbow), + color_resolution=100, + scalar_range=moogli.geometry.Vec2f(0.0, + 300.0)) + view.attach_color_bar(cb) + viewer.attach_view(view) + return viewer + + +if __name__ == '__main__': + showVisualization() diff --git a/demos/squid/README.txt b/demos/squid/README.txt new file mode 100644 index 0000000..221cc0a --- /dev/null +++ b/demos/squid/README.txt @@ -0,0 +1,14 @@ +This is the port of Hodgkin-Huxley Squid Giant Axon demo from +GENESIS. Run `python squid_demo.py` to start the GUI. Open help.org in +a text editor or help.html in a web-browser (or click `Help` button in +the GUI) to read the tutorial. + +The biophysical model is in `squid.py`. The electronics setup is in +`electronics.py`. The combination of squid axon model and the +electronics is in squid_setup.py. All these can be run without any GUI +dependency. To run squid_demo.py you need PyQt and matplotlib with Qt +backend installed. + +Author: Subhasis Ray +Place: NCBS, Bangalore, INDIA +Date: 21 September 2012 diff --git a/demos/squid/channeleditor.py b/demos/squid/channeleditor.py new file mode 100644 index 0000000..09ac719 --- /dev/null +++ b/demos/squid/channeleditor.py @@ -0,0 +1,147 @@ +# channeleditor.py --- +# +# Filename: channeleditor.py +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Wed Jul 18 19:06:39 2012 (+0530) +# Version: +# Last-Updated: Wed Aug 8 16:36:10 2012 (+0530) +# By: Subhasis Ray +# Update #: 179 +# URL: +# Keywords: +# Compatibility: +# +# + +# Commentary: +# +# A widget for editing Hodgkin-Huxley type ion channels. +# +# + +# Change log: +# +# +# + +# Code: + +import sys +from PyQt5 import QtGui, QtCore +from numpy import * +import ast + +class GateEditor(QtGui.QWidget): + """Utility to edit gate equations. + + It provides two line edits to enter the alpha and beta equations + directly. + """ + def __init__(self, *args): + QtGui.QWidget.__init__(self, *args) + self.useVButton = QtGui.QRadioButton('Use V', self) + self.useVButton.setChecked(True) + self.useCaButton = QtGui.QRadioButton('Use Ca', self) + self.useCaButton.setChecked(False) + self.symbolGroup = QtGui.QGroupBox(self) + layout = QtGui.QHBoxLayout() + # self.symbolGroup.setExclusive(True) + layout.addWidget(self.useVButton) + layout.addWidget(self.useCaButton) + self.symbolGroup.setLayout(layout) + self.inputPanel = QtGui.QFrame(self) + self.minVLabel = QtGui.QLabel('Minimum', self) + self.maxVLabel = QtGui.QLabel('Maximum', self) + self.divsVLabel = QtGui.QLabel('Number of divisions', self) + self.minVEdit = QtGui.QLineEdit(self) + self.maxVEdit = QtGui.QLineEdit(self) + self.divsVEdit = QtGui.QLineEdit(self) + self.equation = '(A + B * V) / (C + exp((V + D)/F))' + self.alphaText = 'Equation for forward rate \u03B1 ' + self.betaText = 'Equation for backward rate \u03B2 ' + self.minfText = 'Equation for m\u221E ' + self.taumText = 'Equation for \u03C4m ' + self.alphaLabel = QtGui.QLabel(self.minfText, self) + self.betaLabel = QtGui.QLabel(self.taumText, self) + self.alphaEdit = QtGui.QLineEdit(self) + self.betaEdit = QtGui.QLineEdit(self) + self.formCombo = QtGui.QComboBox(self) + self.formCombo.addItem('m\u221E - \u03C4m') + self.formCombo.addItem('\u03B1 - \u03B2') + self.okButton = QtGui.QPushButton('OK', self) + layout = QtGui.QGridLayout(self.inputPanel) + layout.addWidget(self.minVLabel, 0, 0) + layout.addWidget(self.minVEdit, 0, 1) + layout.addWidget(self.maxVLabel, 0, 3) + layout.addWidget(self.maxVEdit, 0, 4) + layout.addWidget(self.divsVLabel, 0, 6) + layout.addWidget(self.divsVEdit, 0, 7) + layout.addWidget(self.formCombo, 1, 0, 1, 4) + layout.addWidget(self.alphaLabel, 2, 0, 1, 2) + layout.addWidget(self.alphaEdit, 2, 2, 1, 7) + layout.addWidget(self.betaLabel, 3, 0, 1, 2) + layout.addWidget(self.betaEdit, 3, 2, 1, 7) + self.inputPanel.setLayout(layout) + layout = QtGui.QVBoxLayout(self) + layout.addWidget(self.symbolGroup) + layout.addWidget(self.inputPanel) + layout.addWidget(self.okButton) + self.setLayout(layout) + self.connect(self.okButton, QtCore.SIGNAL('clicked()'), self.evalGateExpressions) + # self.connect(self.useVButton, QtCore.SIGNAL('toggled(bool)'), self.toggleInputPanel) + self.connect(self.formCombo, QtCore.SIGNAL('currentIndexChanged(int)'), self.switchEquationForm) + + def toggleInputPanel(self, on): + self.inputPanel.setVisible(on) + self.adjustSize() + + def switchEquationForm(self, index): + if index == 1: + self.alphaLabel.setText(self.alphaText) + self.betaLabel.setText(self.betaText) + elif index == 0: + self.alphaLabel.setText(self.minfText) + self.betaLabel.setText(self.taumText) + + def evalGateExpressions(self): + """Evaluate the expressions supplied by user to obtain the + arrays for the gate tables.""" + vmin = float(str(self.minVEdit.text())) + vmax = float(str(self.maxVEdit.text())) + vdivs = float(str(self.divsVEdit.text())) + vrange = linspace(vmin, vmax, vdivs+1) + a_expr = str(self.alphaEdit.text()) + b_expr = str(self.betaEdit.text()) + a = zeros(vdivs+1) + b = zeros(vdivs+1) + if self.useVButton.isChecked(): + symbol = 'V' + elif self.useCaButton.isChecked(): + symbol = 'Ca' + code = """for ii in range(len(vrange)): + %s = vrange[ii] + a[ii] = %s + b[ii] = %s + """ % (symbol, a_expr, b_expr) + print(code) + tree = compile(code, '', 'exec') + exec(tree) + print(a, b) + return {'min': vmin, + 'max': vmax, + 'divs': vdivs, + 'a': a, + 'b': b} + + # 0.5 * (1-exp(-(V-10)/10)) +if __name__ == '__main__': + app = QtGui.QApplication(sys.argv) + QtGui.qApp = app + editor = GateEditor() + editor.show() + sys.exit(app.exec_()) + +# +# channeleditor.py ends here diff --git a/demos/squid/electronics.py b/demos/squid/electronics.py new file mode 100644 index 0000000..2f356e3 --- /dev/null +++ b/demos/squid/electronics.py @@ -0,0 +1,116 @@ +# electronics.py --- +# +# Filename: electronics.py +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Wed Feb 22 00:53:38 2012 (+0530) +# Version: +# Last-Updated: Tue Jul 10 10:28:40 2012 (+0530) +# By: subha +# Update #: 221 +# URL: +# Keywords: +# Compatibility: +# +# + +# Commentary: +# +# +# +# + +# Change log: +# +# 2012-02-22 23:22:30 (+0530) Subha - the circuitry put in a class. +# + +# Code: + +import numpy +import moose + +class ClampCircuit(moose.Neutral): + """Container for a Voltage-Clamp/Current clamp circuit.""" + defaults = { + 'level1': 25.0, + 'width1': 50.0, + 'delay1': 2.0, + 'delay2': 1e6, + 'trigMode': 0, + 'delay3': 1e9 + } + def __init__(self, path, compartment): + moose.Neutral.__init__(self, path) + self.pulsegen = moose.PulseGen(path+"/pulse") # holding voltage/current generator + self.pulsegen.count = 2 + self.pulsegen.firstLevel = 25.0 + self.pulsegen.firstWidth = 50.0 + self.pulsegen.firstDelay = 2.0 + self.pulsegen.secondDelay = 0.0 + self.pulsegen.trigMode = 2 + self.gate = moose.PulseGen(path+"/gate") # holding voltage/current generator + self.gate.level[0] = 1.0 + self.gate.delay[0] = 0.0 + self.gate.width[0] = 1e9 + moose.connect(self.gate, 'output', self.pulsegen, 'input') + self.lowpass = moose.RC(path+"/lowpass") # lowpass filter + self.lowpass.R = 1.0 + self.lowpass.C = 0.03 + self.vclamp = moose.DiffAmp(path+"/vclamp") + self.vclamp.gain = 0.0 + self.vclamp.saturation = 1e10 + self.iclamp = moose.DiffAmp(path+"/iclamp") + self.iclamp.gain = 0.0 + self.iclamp.saturation = 1e10 + self.pid = moose.PIDController(path+"/pid") + self.pid.gain = 0.5 + self.pid.tauI = 0.02 + self.pid.tauD = 0.005 + self.pid.saturation = 1e10 + # Connect current clamp circuitry + moose.connect(self.pulsegen, "output", self.iclamp, "plusIn") + moose.connect(self.iclamp, "output", compartment, "injectMsg") + # Connect voltage clamp circuitry + moose.connect(self.pulsegen, "output", self.lowpass, "injectIn") + moose.connect(self.lowpass, "output", self.vclamp, "plusIn") + moose.connect(self.vclamp, "output", self.pid, "commandIn") + moose.connect(compartment, "VmOut", self.pid, "sensedIn") + moose.connect(self.pid, "output", compartment, "injectMsg") + current_table = moose.Table("/data/Im") + moose.connect(current_table, "requestOut", compartment, "getIm") + + def configure_pulses(self, baseLevel=0.0, firstLevel=0.1, firstDelay=5.0, firstWidth=40.0, secondLevel=0.0, secondDelay=1e6, secondWidth=0.0, singlePulse=True): + """Set up the pulse generator.""" + self.pulsegen.baseLevel = baseLevel + self.pulsegen.firstLevel = firstLevel + self.pulsegen.firstWidth = firstWidth + self.pulsegen.firstDelay = firstDelay + self.pulsegen.secondLevel = secondLevel + self.pulsegen.secondDelay = secondDelay + self.pulsegen.secondWidth = secondWidth + if singlePulse: + self.pulsegen.trigMode = 1 + else: + self.pulsegen.trigMode = 0 + + def do_voltage_clamp(self): + """Switch to voltage clamp circuitry. After this the simdt may + need to be changed for correct performance.""" + self.vclamp.gain = 1.0 + self.iclamp.gain = 0.0 + self.pid.gain = 0.5 + self.pid.tauD = 0.005 + self.pid.tauI = 0.02 + + def do_current_clamp(self): + """Switch to current clamp circuitry. After this the simdt may + need to be changed for correct performance.""" + self.iclamp.gain = 1.0 + self.vclamp.gain = 0.0 + self.pid.gain = 0.0 + + +# +# electronics.py ends here diff --git a/demos/squid/help.html b/demos/squid/help.html new file mode 100644 index 0000000..617a710 --- /dev/null +++ b/demos/squid/help.html @@ -0,0 +1,587 @@ + + + + +Simulation of squid axon with Hodgkin-Huxley ion channels + + + + + + + + + + + + + +
+ +
+ +
+

Simulation of squid axon with Hodgkin-Huxley ion channels

+ + + + +
+

1 Navigation: navigation toolbar is located at bottom of the plots

+
+ +

This uses the built-in navigation toolbar of matplotlib [click to + open in your default web-browser]. +

+ +
+

./images/navigationtoolbar.jpg

+

Navigation toolbar for plots

+
+ +

+ You can hover the mouse cursor on any icon on this toolbar to get a + brief tool-tip. To summarize: +

+ +
+ +
+

1.1 Zoom

+
+ +
    +
  1. Zoom-in: +
      +
    1. Zoom-in both X and Y axes: +
        +
      • click on the subplot you want to zoom and scroll mouse + wheel down, or +
      • +
      • click magnifier icon and press left mouse button on the + subplot and drag. This will zoom the subplot to the + rectangle you cover by this. +
      • +
      • click compass icon and press right mouse button on the plot + and drag towards top-right. +
      • +
      + +
    2. +
    3. Zoom-in along X-axis: +
        +
      • click compass icon and press right mouse button on the plot + and drag towards right. +
      • +
      + +
    4. +
    5. Zoom-in along Y-axis: +
        +
      • click compass icon and press right mouse button on the plot + and drag upwards. +
      • +
      + +
    6. +
    + +
  2. +
  3. Zoom-out: +
      +
    1. Zoom-out both X and Y axes: +
        +
      • click on the subplot you want to zoom and scroll mouse wheel up, or +
      • +
      • click magnifier icon and press right mouse button on the + plot and drag. The whole visible axis area will fit into + the rectangle you cover by this. +
      • +
      • click compass icon and press right mouse button on the plot + and drag towards bottom-left. +
      • +
      + +
    2. +
    3. Zoom-out whole plot window along X-axis: +
        +
      • click compass icon and press right mouse button on the plot + and drag towards left. +
      • +
      + +
    4. +
    5. Zoom-out Y-axis: +
        +
      • click compass icon and press right mouse button on the plot + and drag downwards. +
      • +
      + +
    6. +
    + +
  4. +
  5. Go forward/backward in zoom stack: + click right/left arrow icon. +
  6. +
+ +
+ +
+ +
+

1.2 Pan:

+
+ +

click compass-icon and left click-and-drag +

+ +
+ +
+

1.3 Reset to initial plot state:

+
+ +

click home icon. +

+ +
+ +
+

1.4 Change spacing and position of subplots:

+
+ +

click button with four green arrow-heads pointing (this is called + the Subplot-Configuration button). +

+ +
+ +
+

1.5 Configure axes:

+
+ +

click green tick-mark. In the pop-up dialog select the axis you want + to modify and click OK. In the next dialog you can set the range of + X and Y values for the axes and modify several other properties. +

+ +
+ +
+

1.6 Save plot:

+
+ +

click floppy-disk icon. +

+
+
+ +
+ +
+

2 Rearranging the frames on small screens

+
+ +

The default layout of the squid demo may exceed available screen + size on your system. But you can always undock the control panels + and put them one over the other to save screen space. To undock all + panels in one go, click the "Undock all" button in the tool bar. +

+

+ To move or float a single panel, click the left mouse button on its + title bar (in the same horizontal line with the expand buttons) of + any of the panels and drag. You can choose to leave it floating or + drop it somewhere (top, left, bottom or right of the plot window) in + the main window to reposition it. You can drop multiple panels in + the same location. Then they will be put as multiple tabs over one + another. +

+

+ An undocked panel will be always on top of the main window. If this + is a problem, you can close it by clicking the close button. You can + make it visible again by clicking "Show all" button on the tool bar. +

+
+ +
+ +
+

3 The SQUID tutorial

+
+ +

The following is adapted from the GENESIS squid demo notes with + modifications for MOOSE by Subhasis Ray, September 2012. +

+

+ The original header was: +

+ +
+ +

+ SQUID +

+

+ An Introductory Tutorial for GENESIS, XODUS, and the HODGKIN-HUXLEY model +

+

+ By M. Nelson, Caltech, April 1989 - Modified by D. Beeman, June 1991, Dec 1994 + ­ Modified by E. Vigmond, September 1993 +

+ +
+ +

+ In the process of working through this tutorial, you will learn + something about the Hodgkin-Huxley model. This program may serve as + a good starting point for those of you who plan to work on + single-cell models for a course project. +

+ +
+ +
+

3.1 The Model

+
+ +

For the time being, we are going to simulate a single axon + compartment with active Na and K conductances, as described by Hodgkin + and Huxley for the squid giant axon. In other tutorials we will link + compartments together to form a simple model of an entire neuron with + a soma and dendrites (the Neuron tutorial), model a cable with many + compartments (the cable tutorial), and build neural circuits with + connected neurons (MultiCell and tritonia). For now, we confine + ourselves to a single axon compartment. +

+
+ +
+ +
+

3.2 Running the Simulation

+
+ +

The model has already been initialized with some reasonable + parameter values, so all you have to do to run the simulation is: +

+

+ click on the ``Run`` button in the toolbar. +

+

+ The simulation which you just observed was for a constant current + pulse, which is shown in the lower left graph panel. The upper left + graph shows the membrane potential. You can see that 3 action + potentials were generated during this 50 msec simulation. Now let's + change the injection current and see what happens. +

+

+ At the bottom of the left panel is a widget labeled "Electronics" + and inside it there are two tabs labeled ``Current clamp`` and + ``Voltage clamp``. Select the ``Current clamp`` tab and you will + see a series of labeled text boxes with default values. In order + to change the injection current: +

+

+ position the cursor to the right of the last digit in the "First + Pulse Current" field and click in the text box with the left mouse + button. +

+

+ Let's change the peak injection current from 0.1 to 1.0. +

+

+ type <BACKSPACE> to delete the 0.1 and then type 1.0 +

+

+ The value in the dialog field should now be 1.0. +

+

+ Now we'll run the simulation again. +

+

+ click the "Run" button on the toolbar again. +

+

+ There should be a dramatic change in the time-course of the + membrane potential at this higher current injection level. + Experiment with the injection level to see what happens to the + axon at higher injection currents. Also try decreasing the + injection level until an action potential is no longer elicited by + the stimulus. What is the threshold for producing an action + potential in this compartment? +

+

+ You may also experiment with trains of short pulses. Set the + "First Pulse Width" dialog field to 1 msec and click on the + "Single Pulse" drop down box and select "Pulse Train". Now vary + "First Onset Delay". What is the minimum interval between action + potentials that you can achieve? +

+
+ +
+ +
+

3.3 Voltage Clamping

+
+ +

You can also perform voltage clamp experiments in this simulation. +

+

+ click on the "Voltage clamp" tab header at the bottom of the + control form under "Electronics". +

+

+ Again, reasonable default values have been selected , so all you + have to do to run the voltage clamp simulation is: +

+

+ click the "Run" button on the control form +

+
+ +
+ +
+

3.4 Changing Extracellular Concentrations

+
+ +

You can alter the extracellular concentrations of the ions through + the "Channels" panel. Any changes in concentration will cause the + reversal potentials to be recalculated. To reset the values back + to the initial ones, just click on the "Restore defaults" button + in the top tool bar. +

+
+ +
+ +
+

3.5 Controlling Graphs

+
+ +

The graph of the clamp current (lower left panel) has gone off + scale. In order to rescale the graph: +

+

+ click on the button with green tick mark in the navigation toolbar + at the bottom of the plots. +

+

+ A dialog containing drop-down to select the subplot should appear. + Select the "Injection current" and click OK. Another dialog box + will appear with text boxes for `Min` and `Max` values for X-Axis + and Y-Axis. Adjust for Y axis to bring the graph into range and + press "Apply". +

+ +

+ The top toolbar has an "Overlay plots" button. When it is + checked, any existing plots in the graph will be held and new + simulation results will be overlayed. Try this now. +

+

+ Click "Overlay plots" and run the simulation at several values of + the clamp voltage. Do the first run with "Overlay plots" button + unchecked so that all previous graphs are cleared at this + run. Then click this button to checked state and do the subsequent + runs. +

+
+ +
+ +
+

3.6 State Plots

+
+ +

One can learn a great deal by studying plots in which one of the + Hodgkin-Huxley channel activation parameters (the K activation + "n", the Na activation "m", or the Na inactivation "h") is plotted + as a function of the membrane potential, V. (See, for example, + Chapter 5 of "Methods in Neuronal Modeling", by Koch and Segev.) +

+

+ In order to view such a plot, click the left mouse button on the + button labeled "State plot" in the top toolbar. The label will + change to "State Plot Visible", and a state plot graph will + appear. Clicking the button again will hide the graph. The + default plot is to show the K channel "n" parameter on the y-axis + and the membrane potential on the x-axis. The drop-down menus at + the top of the window allow you to change these defaults. +

+
+ +
+ +
+

3.7 Channel Blocking

+
+ +

In order to explore the effects of blocking one of the channels, + you may click on one of the check boxes in the "Channels" panel + for blocking and unblocking a channel. When a channel is blocked, + its conductance is set to zero. Activation parameters for a + blocked channel are still calculated and may be plotted, but are + relatively meaningless because they will have no effect on the + membrane potential. +

+
+ +
+ +
+

3.8 Saving Graphs

+
+ +

You can save a graph to file by clicking the save button in the + navigation toolbar. In the file dialog you can select from several + formats including PDF, JPEG, PNG and SVG. +

+
+ +
+ +
+

3.9 Units used in the simulation

+
+ +

Units: +

+ ++ + + + + + + + + + + + + + + +
quantityunit
timemsec
lengthum (microns)
potentialmV
conductancemS (mmho)
resistancekohm
capacitanceuF
specific axial resistancekohm-cm
specific membrane conductancemS/cm2
specific membrane capacitanceuF/cm2
+ + +
+
+
+
+ +
+

Date: 2012-09-25 17:03:29 IST

+

Author: Subhasis Ray

+

Org version 7.8.11 with Emacs version 23

+Validate XHTML 1.0 + +
+ + diff --git a/demos/squid/help.org b/demos/squid/help.org new file mode 100644 index 0000000..2b47b4e --- /dev/null +++ b/demos/squid/help.org @@ -0,0 +1,242 @@ +Simulation of squid axon with Hodgkin-Huxley ion channels + +#+AUTHOR: Subhasis Ray + +* Navigation: navigation toolbar is located at bottom of the plots + This uses the built-in navigation toolbar of [[http://matplotlib.org/users/navigation_toolbar.html][matplotlib]] [click to + open in your default web-browser]. + +#+CAPTION: Navigation toolbar for plots +#+LABEL: fignavigationtoolbar +[[./images/navigationtoolbar.jpg]] + + You can hover the mouse cursor on any icon on this toolbar to get a + brief tool-tip. To summarize: + +** Zoom + 1. Zoom-in: + 1) Zoom-in both X and Y axes: + - click on the subplot you want to zoom and scroll mouse + wheel down, or + - click magnifier icon and press left mouse button on the + subplot and drag. This will zoom the subplot to the + rectangle you cover by this. + - click compass icon and press right mouse button on the plot + and drag towards top-right. + 2) Zoom-in along X-axis: + - click compass icon and press right mouse button on the plot + and drag towards right. + 3) Zoom-in along Y-axis: + - click compass icon and press right mouse button on the plot + and drag upwards. + 2. Zoom-out: + 1) Zoom-out both X and Y axes: + - click on the subplot you want to zoom and scroll mouse wheel up, or + - click magnifier icon and press right mouse button on the + plot and drag. The whole visible axis area will fit into + the rectangle you cover by this. + - click compass icon and press right mouse button on the plot + and drag towards bottom-left. + 2) Zoom-out whole plot window along X-axis: + - click compass icon and press right mouse button on the plot + and drag towards left. + 3) Zoom-out Y-axis: + - click compass icon and press right mouse button on the plot + and drag downwards. + 3. Go forward/backward in zoom stack: + click right/left arrow icon. +** Pan: + click compass-icon and left click-and-drag +** Reset to initial plot state: + click home icon. +** Change spacing and position of subplots: + click button with four green arrow-heads pointing (this is called + the Subplot-Configuration button). +** Configure axes: + click green tick-mark. In the pop-up dialog select the axis you want + to modify and click OK. In the next dialog you can set the range of + X and Y values for the axes and modify several other properties. +** Save plot: + click floppy-disk icon. + +* Rearranging the frames on small screens + The default layout of the squid demo may exceed available screen + size on your system. But you can always undock the control panels + and put them one over the other to save screen space. To undock all + panels in one go, click the "Undock all" button in the tool bar. + + To move or float a single panel, click the left mouse button on its + title bar (in the same horizontal line with the expand buttons) of + any of the panels and drag. You can choose to leave it floating or + drop it somewhere (top, left, bottom or right of the plot window) in + the main window to reposition it. You can drop multiple panels in + the same location. Then they will be put as multiple tabs over one + another. + + An undocked panel will be always on top of the main window. If this + is a problem, you can close it by clicking the close button. You can + make it visible again by clicking "Show all" button on the tool bar. + +* The SQUID tutorial + The following is adapted from the GENESIS squid demo notes with + modifications for MOOSE by Subhasis Ray, September 2012. + + The original header was: + + ----------------------------------------------------------------------------- + + SQUID + + An Introductory Tutorial for GENESIS, XODUS, and the HODGKIN-HUXLEY model + + By M. Nelson, Caltech, April 1989 - Modified by D. Beeman, June 1991, Dec 1994 + \- Modified by E. Vigmond, September 1993 + + ----------------------------------------------------------------------------- + + In the process of working through this tutorial, you will learn + something about the Hodgkin-Huxley model. This program may serve as + a good starting point for those of you who plan to work on + single-cell models for a course project. + +** The Model + For the time being, we are going to simulate a single axon + compartment with active Na and K conductances, as described by Hodgkin + and Huxley for the squid giant axon. In other tutorials we will link + compartments together to form a simple model of an entire neuron with + a soma and dendrites (the Neuron tutorial), model a cable with many + compartments (the cable tutorial), and build neural circuits with + connected neurons (MultiCell and tritonia). For now, we confine + ourselves to a single axon compartment. + +** Running the Simulation + The model has already been initialized with some reasonable + parameter values, so all you have to do to run the simulation is: + + click on the ``Run`` button in the toolbar. + + The simulation which you just observed was for a constant current + pulse, which is shown in the lower left graph panel. The upper left + graph shows the membrane potential. You can see that 3 action + potentials were generated during this 50 msec simulation. Now let's + change the injection current and see what happens. + + At the bottom of the left panel is a widget labeled "Electronics" + and inside it there are two tabs labeled ``Current clamp`` and + ``Voltage clamp``. Select the ``Current clamp`` tab and you will + see a series of labeled text boxes with default values. In order + to change the injection current: + + position the cursor to the right of the last digit in the "First + Pulse Current" field and click in the text box with the left mouse + button. + + Let's change the peak injection current from 0.1 to 1.0. + + type to delete the 0.1 and then type 1.0 + + The value in the dialog field should now be 1.0. + + Now we'll run the simulation again. + + click the "Run" button on the toolbar again. + + There should be a dramatic change in the time-course of the + membrane potential at this higher current injection level. + Experiment with the injection level to see what happens to the + axon at higher injection currents. Also try decreasing the + injection level until an action potential is no longer elicited by + the stimulus. What is the threshold for producing an action + potential in this compartment? + + You may also experiment with trains of short pulses. Set the + "First Pulse Width" dialog field to 1 msec and click on the + "Single Pulse" drop down box and select "Pulse Train". Now vary + "First Onset Delay". What is the minimum interval between action + potentials that you can achieve? + +** Voltage Clamping + You can also perform voltage clamp experiments in this simulation. + + click on the "Voltage clamp" tab header at the bottom of the + control form under "Electronics". + + Again, reasonable default values have been selected , so all you + have to do to run the voltage clamp simulation is: + + click the "Run" button on the control form + +** Changing Extracellular Concentrations + You can alter the extracellular concentrations of the ions through + the "Channels" panel. Any changes in concentration will cause the + reversal potentials to be recalculated. To reset the values back + to the initial ones, just click on the "Restore defaults" button + in the top tool bar. + +** Controlling Graphs + The graph of the clamp current (lower left panel) has gone off + scale. In order to rescale the graph: + + click on the button with green tick mark in the navigation toolbar + at the bottom of the plots. + + A dialog containing drop-down to select the subplot should appear. + Select the "Injection current" and click OK. Another dialog box + will appear with text boxes for `Min` and `Max` values for X-Axis + and Y-Axis. Adjust for Y axis to bring the graph into range and + press "Apply". + + + The top toolbar has an "Overlay plots" button. When it is + checked, any existing plots in the graph will be held and new + simulation results will be overlayed. Try this now. + + Click "Overlay plots" and run the simulation at several values of + the clamp voltage. Do the first run with "Overlay plots" button + unchecked so that all previous graphs are cleared at this + run. Then click this button to checked state and do the subsequent + runs. + +** State Plots + One can learn a great deal by studying plots in which one of the + Hodgkin-Huxley channel activation parameters (the K activation + "n", the Na activation "m", or the Na inactivation "h") is plotted + as a function of the membrane potential, V. (See, for example, + Chapter 5 of "Methods in Neuronal Modeling", by Koch and Segev.) + + In order to view such a plot, click the left mouse button on the + button labeled "State plot" in the top toolbar. The label will + change to "State Plot Visible", and a state plot graph will + appear. Clicking the button again will hide the graph. The + default plot is to show the K channel "n" parameter on the y-axis + and the membrane potential on the x-axis. The drop-down menus at + the top of the window allow you to change these defaults. + +** Channel Blocking + In order to explore the effects of blocking one of the channels, + you may click on one of the check boxes in the "Channels" panel + for blocking and unblocking a channel. When a channel is blocked, + its conductance is set to zero. Activation parameters for a + blocked channel are still calculated and may be plotted, but are + relatively meaningless because they will have no effect on the + membrane potential. + +** Saving Graphs + You can save a graph to file by clicking the save button in the + navigation toolbar. In the file dialog you can select from several + formats including PDF, JPEG, PNG and SVG. + +** Units used in the simulation + Units: + | quantity | unit | + |-------------------------------+--------------| + | time | msec | + | length | um (microns) | + | potential | mV | + | conductance | mS (mmho) | + | resistance | kohm | + | capacitance | uF | + | specific axial resistance | kohm-cm | + | specific membrane conductance | mS/cm^2 | + | specific membrane capacitance | uF/cm^2 | + diff --git a/demos/squid/images/navigationtoolbar.jpg b/demos/squid/images/navigationtoolbar.jpg new file mode 100644 index 0000000..a7ba52a Binary files /dev/null and b/demos/squid/images/navigationtoolbar.jpg differ diff --git a/demos/squid/squid.py b/demos/squid/squid.py new file mode 100644 index 0000000..a8a75c7 --- /dev/null +++ b/demos/squid/squid.py @@ -0,0 +1,376 @@ +# squid.py --- +# +# Filename: squid.py +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Mon Feb 13 11:35:11 2012 (+0530) +# Version: +# Last-Updated: Thu Sep 20 14:05:27 2012 (+0530) +# By: subha +# Update #: 771 +# URL: +# Keywords: +# Compatibility: +# +# + +# Commentary: +# +# Rewrite of the squid demo for new moose. +# +# + +# Change log: +# +# +# + +# Code: +import sys +sys.path.append('../../python') + +import numpy +import moose + +GAS_CONSTANT = 8.314 +FARADAY = 9.65e4 +CELSIUS_TO_KELVIN = 273.15 + +class IonChannel(moose.HHChannel): + """Enhanced version of HHChannel with setupAlpha that takes a dict + of parameters.""" + def __init__(self, name, compartment, specific_gbar, e_rev, Xpower, Ypower=0.0, Zpower=0.0): + """Instantuate an ion channel. + + name -- name of the channel. + + compartment -- moose.Compartment object that contains the channel. + + specific_gbar -- specific value of maximum conductance. + + e_rev -- reversal potential of the channel. + + Xpower -- exponent for the first gating parameter. + + Ypower -- exponent for the second gatinmg component. + """ + moose.HHChannel.__init__(self, '%s/%s' % (compartment.path, name)) + self.Gbar = specific_gbar * compartment.area + self.Ek = e_rev + self.Xpower = Xpower + self.Ypower = Ypower + self.Zpower = Zpower + moose.connect(self, 'channel', compartment, 'channel') + + def setupAlpha(self, gate, params, vdivs, vmin, vmax): + """Setup alpha and beta parameters of specified gate. + + gate -- 'X'/'Y'/'Z' string initial of the gate. + + params -- dict of parameters to compute alpha and beta, the rate constants for gates. + + vdivs -- number of divisions in the interpolation tables for alpha and beta parameters. + + vmin -- minimum voltage value for the alpha/beta lookup tables. + + vmax -- maximum voltage value for the alpha/beta lookup tables. + """ + if gate == 'X' and self.Xpower > 0: + gate = moose.HHGate(self.path + '/gateX') + elif gate == 'Y' and self.Ypower > 0: + gate = moose.HHGate(self.path + '/gateY') + else: + return False + gate.setupAlpha([params['A_A'], + params['A_B'], + params['A_C'], + params['A_D'], + params['A_F'], + params['B_A'], + params['B_B'], + params['B_C'], + params['B_D'], + params['B_F'], + vdivs, vmin, vmax]) + return True + + @property + def alpha_m(self): + if self.Xpower == 0: + return numpy.array([]) + return numpy.array(moose.HHGate('%s/gateX' % (self.path)).tableA) + @property + def beta_m(self): + if self.Xpower == 0: + return numpy.array([]) + return numpy.array(moose.HHGate('%s/gateX' % (self.path)).tableB) - numpy.array(moose.HHGate('%s/gateX' % (self.path)).tableA) + @property + def alpha_h(self): + if self.Ypower == 0: + return numpy.array([]) + return numpy.array(moose.HHGate('%s/gateY' % (self.path)).tableA) + @property + def beta_h(self): + if self.Ypower == 0: + return numpy.array([]) + return numpy.array(moose.HHGate('%s/gateY' % (self.path)).tableB) - numpy.array(moose.HHGate('%s/gateY' % (self.path)).tableA) + +class SquidAxon(moose.Compartment): + EREST_ACT = 0.0 # can be -70 mV if not following original HH convention + VMIN = -30.0 + VMAX = 120.0 + VDIVS = 150 + defaults = { + 'temperature': CELSIUS_TO_KELVIN + 6.3, + 'K_out': 10.0, + 'Na_out': 460.0, + 'K_in': 301.4, + 'Na_in': 70.96, + 'Cl_out': 540.0, + 'Cl_in': 100.0, + 'length': 500, # um + 'diameter': 500, # um + 'Em': EREST_ACT + 10.613, + 'initVm': EREST_ACT, + 'specific_cm': 1.0, # uF/cm^2 + 'specific_gl': 0.3, # mmho/cm^2 + 'specific_ra': 0.030, # kohm-cm + 'specific_gNa': 120.0, # mmho/cm^2 + 'specific_gK': 36.0 # mmho/cm^2 + } + + Na_m_params = {'A_A':0.1 * (25.0 + EREST_ACT), + 'A_B': -0.1, + 'A_C': -1.0, + 'A_D': -25.0 - EREST_ACT, + 'A_F':-10.0, + 'B_A': 4.0, + 'B_B': 0.0, + 'B_C': 0.0, + 'B_D': 0.0 - EREST_ACT, + 'B_F': 18.0} + Na_h_params = {'A_A': 0.07, + 'A_B': 0.0, + 'A_C': 0.0, + 'A_D': 0.0 - EREST_ACT, + 'A_F': 20.0, + 'B_A': 1.0, + 'B_B': 0.0, + 'B_C': 1.0, + 'B_D': -30.0 - EREST_ACT, + 'B_F': -10.0} + K_n_params = {'A_A': 0.01*(10.0 + EREST_ACT), + 'A_B': -0.01, + 'A_C': -1.0, + 'A_D': -10.0 - EREST_ACT, + 'A_F': -10.0, + 'B_A': 0.125, + 'B_B': 0.0, + 'B_C': 0.0, + 'B_D': 0.0 - EREST_ACT, + 'B_F': 80.0} + """Compartment class enhanced with specific values of passive + electrical properties set and calculated using dimensions.""" + def __init__(self, path): + moose.Compartment.__init__(self, path) + self.temperature = SquidAxon.defaults['temperature'] + self.K_out = SquidAxon.defaults['K_out'] + self.Na_out = SquidAxon.defaults['Na_out'] + # Modified internal concentrations used to give HH values of + # equilibrium constants from the Nernst equation at 6.3 deg C. + # HH 1952a, p. 455 + self.K_in = SquidAxon.defaults['K_in'] + self.Na_in = SquidAxon.defaults['Na_in'] + self.Cl_out = SquidAxon.defaults['Cl_out'] + self.Cl_in = SquidAxon.defaults['Cl_in'] + + self.length = SquidAxon.defaults['length'] + self.diameter = SquidAxon.defaults['diameter'] + self.Em = SquidAxon.defaults['Em'] + self.initVm = SquidAxon.defaults['initVm'] + self.specific_cm = SquidAxon.defaults['specific_cm'] + self.specific_gl = SquidAxon.defaults['specific_gl'] + self.specific_ra = SquidAxon.defaults['specific_ra'] + + self.Na_channel = IonChannel('Na', self, + 0.0, + self.VNa, + Xpower=3.0, + Ypower=1.0) + self.Na_channel.setupAlpha('X', SquidAxon.Na_m_params, + SquidAxon.VDIVS, + SquidAxon.VMIN, + SquidAxon.VMAX) + self.Na_channel.setupAlpha('Y', SquidAxon.Na_h_params, + SquidAxon.VDIVS, + SquidAxon.VMIN, + SquidAxon.VMAX) + self.K_channel = IonChannel('K', self, + 0.0, + self.VK, + Xpower=4.0) + self.K_channel.setupAlpha('X', SquidAxon.K_n_params, + SquidAxon.VDIVS, + SquidAxon.VMIN, + SquidAxon.VMAX) + self.specific_gNa = SquidAxon.defaults['specific_gNa'] + self.specific_gK = SquidAxon.defaults['specific_gK'] + + @classmethod + def reversal_potential(cls, temp, c_out, c_in): + """Compute the reversal potential based on Nernst equation.""" + # NOTE the 70 mV added for compatibility with original HH + return (GAS_CONSTANT * temp / FARADAY) * 1000.0 * numpy.log(c_out/c_in) + 70.0 + cls.EREST_ACT + + + @property + def xarea(self): + """Area of cross section in cm^2 when length and diameter are in um""" + return 1e-8 * numpy.pi * self.diameter * self.diameter / 4.0 # cm^2 + + @property + def area(self): + """Area in cm^2 when length and diameter are in um""" + return 1e-8 * self.length * numpy.pi * self.diameter # cm^2 + + @property + def specific_ra(self): + return self.Ra * self.xarea / self.length + @specific_ra.setter + def specific_ra(self, value): + self.Ra = value * self.length / self.xarea + + @property + def specific_cm(self): + return self.Cm / self.area + @specific_cm.setter + def specific_cm(self, value): + self.Cm = value * self.area + + @property + def specific_gl(self): + return 1.0/(self.Rm * self.area) + @specific_gl.setter + def specific_gl(self, value): + self.Rm = 1.0/(value * self.area) + + @property + def specific_rm(self): + return self.Rm * self.area + @specific_rm.setter + def specific_rm(self, value): + self.Rm = value / self.area + + @property + def specific_gNa(self): + return self.Na_channel.Gbar / self.area + + @specific_gNa.setter + def specific_gNa(self, value): + self.Na_channel.Gbar = value * self.area + + @property + def specific_gK(self): + return self.K_channel.Gbar / self.area + + @specific_gK.setter + def specific_gK(self, value): + self.K_channel.Gbar = value * self.area + + @property + def VK(self): + """Reversal potential of K+ channels""" + return SquidAxon.reversal_potential(self.temperature, self.K_out, self.K_in) + + @property + def VNa(self): + """Reversal potential of Na+ channels""" + return SquidAxon.reversal_potential(self.temperature, self.Na_out, self.Na_in) + + def updateEk(self): + """Update the channels' Ek""" + self.Na_channel.Ek = self.VNa + self.K_channel.Ek = self.VK + + + @property + def celsius(self): + return self.temperature - CELSIUS_TO_KELVIN + + @celsius.setter + def celsius(self, celsius): + self.temperature = celsius + CELSIUS_TO_KELVIN + + def use_defaults(self): + for field, value in list(SquidAxon.defaults.items()): + setattr(self, field, value) + +class SquidModel(moose.Neutral): + """Container for squid demo.""" + def __init__(self, path): + moose.Neutral.__init__(self, path) + self.squid_axon = SquidAxon(path+'/squid_axon') + print(self.squid_axon.Na_channel.Gbar, self.squid_axon.K_channel.Gbar) + self.current_clamp = moose.PulseGen(path+'/pulsegen') + self.current_clamp.firstDelay = 5.0 # ms + self.current_clamp.firstWidth = 40 # ms + self.current_clamp.firstLevel = 0.1 # uA + self.current_clamp.secondDelay = 1e9 + print('Current clamp connected:', moose.connect(self.current_clamp, 'output', self.squid_axon, 'injectMsg')) + + self.Vm_table = moose.Table('%s/Vm' % (self.path)) + moose.connect(self.Vm_table, 'requestOut', self.squid_axon, 'getVm') + self.gK_table = moose.Table('%s/gK' % (self.path)) + moose.connect(self.gK_table, 'requestOut', self.squid_axon.K_channel, 'getGk') + self.gNa_table = moose.Table('%s/gNa' % (self.path)) + moose.connect(self.gNa_table, 'requestOut', self.squid_axon.Na_channel, 'getGk') + self.clocks_assigned = False + + def run(self, runtime, simdt=1e-6): + self.squid_axon.updateEk() + moose.setClock(0, simdt) + moose.setClock(1, simdt) + moose.setClock(2, simdt) + moose.setClock(3, simdt) + if not self.clocks_assigned: + moose.useClock(0, '%s/#[TYPE=Compartment]' % (self.path), 'init') + moose.useClock(0, '%s/#[TYPE=PulseGen]' % (self.path), 'process') + moose.useClock(1, '%s/#[TYPE=Compartment]' % (self.path), 'process') + moose.useClock(2, '%s/#[TYPE=HHChannel]' % (self.squid_axon.path), 'process') + moose.useClock(3, '%s/#[TYPE=Table]' % (self.path), 'process') + self.clocks_assigned = True + moose.reinit() + moose.start(runtime) + + def save_data(self): + self.Vm_table.xplot('Vm.dat', 'Vm') + print('Vm saved to Vm.dat') + if hasattr(self, 'gK_table'): + self.gK_table.xplot('gK.dat', 'gK') + numpy.savetxt('K_alpha_n.dat', self.squid_axon.K_channel.alpha_m) + numpy.savetxt('K_beta_n.dat', self.squid_axon.K_channel.beta_m) + print('K conductance saved to gK.dat') + if hasattr(self, 'gNa_table'): + self.gNa_table.xplot('gNa.dat', 'gNa') + numpy.savetxt('Na_alpha_m.dat', self.squid_axon.Na_channel.alpha_m) + numpy.savetxt('Na_beta_m.dat', self.squid_axon.Na_channel.beta_m) + numpy.savetxt('Na_alpha_h.dat', self.squid_axon.Na_channel.alpha_h) + numpy.savetxt('Na_beta_h.dat', self.squid_axon.Na_channel.beta_h) + print('Na conductance saved to gNa.dat') + + + +def test(runtime=100.0, simdt=1e-2): + model = SquidModel('model') + model.run(runtime, simdt) + model.save_data() + +if __name__ == '__main__': + # unittest.main() + test() + + + +# +# squid.py ends here diff --git a/demos/squid/squid_demo.py b/demos/squid/squid_demo.py new file mode 100644 index 0000000..9e9344a --- /dev/null +++ b/demos/squid/squid_demo.py @@ -0,0 +1,899 @@ +#!/usr/bin/env python + # -*- coding: utf-8 -*- +# squidgui.py --- +# +# Filename: squidgui.py +# Description: +# Author: +# Maintainer: +# Created: Mon Jul 9 18:23:55 2012 (+0530) +# Version: +# Last-Updated: Tue May 3 00:18:47 2016 (-0400) +# By: subha +# Update #: 1078 +# URL: +# Keywords: +# Compatibility: +# +# + +# Commentary: +# +# +# +# + +# Change log: +# +# +# +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth +# Floor, Boston, MA 02110-1301, USA. +# +# + +# Code: + +import sys +sys.path.append('../../python') +import os +os.environ['NUMPTHREADS'] = '1' + +from collections import defaultdict +import time + +from PyQt5 import QtGui +from PyQt5 import QtCore +import numpy +from matplotlib.figure import Figure +from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas, NavigationToolbar2QT as NavigationToolbar + +import moose + +from squid import * +from squid_setup import SquidSetup +from electronics import ClampCircuit + + +tooltip_Nernst = """

Ionic equilibrium potential

+

+The equilibrium potential for ion C is given by Nernst equation: +

+EC = (RT/zF) * ln([C]out / [C]in) +

+where R is the ideal gas constant (8.3145 J/mol K),
+ T is absolute temperature,
+ z is the valence of the ion,
+ F is Faraday's constant 96480 C/mol,
+ [C]out is concentration of C outside the membrane,
+ [C]in is concentration of C inside the membrane.""" + +tooltip_Erest = """

Resting membrane potential

+

+The resting membrane potential is determined by the ionic +concentrations inside and outside the cell membrane and is given by +the Goldman-Hodgkin-Katz equation: +

+ +V = (RT/F) * ln((PK[K+]out + PNa[Na+]out + PCl[Cl-]in) / (PK[K+]in + PNa[Na+]in + PCl[Cl-]out)) + +

+where PC is the permeability of the membrane to ion C. + +""" + +tooltip_NaChan = """

Na+ channel conductance

+

+The Na+ channel conductance in squid giant axon is given by: + +

GNa = ḠNa * m3 * h

+ +and the current through this channel is: +

+INa = GNa * (V - ENa) = ḠNa * m3 * h * (V - ENa) +

+ +where ḠNa is the peak conductance of Na+ channel, m is +the fraction of activation gates open and h is the fraction of +deactivation gates open. The transition from open to closed state has +first order kinetics: +

dm/dt = αm * ( 1 - m) - βm * m

+and similarly for h. + +The steady state values are: +

m∞ = αm/(αm + βm)

+and time constant for steady state is: +

τm = 1/ (αm + βm)

+and similarly for h. +""" + +tooltip_KChan = """

K+ channel conductance

+

The K+ channel conductance in squid giant axon is given by: + +

GK = ḠK * n4

+ +and the current through this channel is: +

+IK = GK * (V - EK) = ḠK * n4 * (V - EK) +

+where ḠK is the peak conductance of K+ channel, +n is the fraction of activation gates open. The transition from open +to closed state has first order kinetics:

dn/dt = αn * +( 1 - n) - βn * n

. + +The steady state values are: +

+n∞ = αn/(αn + βn) +

+and time constant for steady state is: +

+τn = 1/ (αn + βn) + +

+and similarly for h. +""" + +tooltip_Im = """

Membrane current

+

+The current through the membrane is given by: +

+Im = Cm dV/dt + IK + INa + IL +

+ = Cm dV/dt + GK(V, t) * (V - EK) + GNa * (V - ENa) + GL * (V - EL) +

+where GL is the leak current and EL is the leak reversal potential. + +""" + +default_line_edit_size = QtCore.QSize(80, 25) +def set_default_line_edit_size(widget): + widget.setMinimumSize(default_line_edit_size) + widget.setMaximumSize(default_line_edit_size) + + +class SquidGui(QtGui.QMainWindow): + defaults = {} + defaults.update(SquidAxon.defaults) + defaults.update(ClampCircuit.defaults) + defaults.update({'runtime': 50.0, + 'simdt': 0.01, + 'plotdt': 0.1, + 'vclamp.holdingV': 0.0, + 'vclamp.holdingT': 10.0, + 'vclamp.prepulseV': 0.0, + 'vclamp.prepulseT': 0.0, + 'vclamp.clampV': 50.0, + 'vclamp.clampT': 20.0, + 'iclamp.baseI': 0.0, + 'iclamp.firstI': 0.1, + 'iclamp.firstT': 40.0, + 'iclamp.firstD': 5.0, + 'iclamp.secondI': 0.0, + 'iclamp.secondT': 0.0, + 'iclamp.secondD': 0.0 + }) + def __init__(self, *args): + QtGui.QMainWindow.__init__(self, *args) + self.squid_setup = SquidSetup() + self._plotdt = SquidGui.defaults['plotdt'] + self._plot_dict = defaultdict(list) + self.setWindowTitle('Squid Axon simulation') + self.setDockNestingEnabled(True) + self._createRunControl() + self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self._runControlDock) + self._runControlDock.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures) + self._createChannelControl() + self._channelCtrlBox.setWindowTitle('Channel properties') + self._channelControlDock.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures) + self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self._channelControlDock) + self._createElectronicsControl() + self._electronicsDock.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures) + self._electronicsDock.setWindowTitle('Electronics') + self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self._electronicsDock) + self._createPlotWidget() + self.setCentralWidget(self._plotWidget) + self._createStatePlotWidget() + self._createHelpMessage() + self._helpWindow.setVisible(False) + self._statePlotWidget.setWindowFlags(QtCore.Qt.Window) + self._statePlotWidget.setWindowTitle('State plot') + self._initActions() + self._createRunToolBar() + self._createPlotToolBar() + + def getFloatInput(self, widget, name): + try: + return float(str(widget.text())) + except ValueError: + QtGui.QMessageBox.critical(self, 'Invalid input', 'Please enter a valid number for {}'.format(name)) + raise + + + def _createPlotWidget(self): + self._plotWidget = QtGui.QWidget() + self._plotFigure = Figure() + self._plotCanvas = FigureCanvas(self._plotFigure) + self._plotCanvas.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self._plotCanvas.updateGeometry() + self._plotCanvas.setParent(self._plotWidget) + self._plotCanvas.mpl_connect('scroll_event', self._onScroll) + self._plotFigure.set_canvas(self._plotCanvas) + # Vm and command voltage go in the same subplot + self._vm_axes = self._plotFigure.add_subplot(2,2,1, title='Membrane potential') + self._vm_axes.set_ylim(-20.0, 120.0) + # Channel conductances go to the same subplot + self._g_axes = self._plotFigure.add_subplot(2,2,2, title='Channel conductance') + self._g_axes.set_ylim(0.0, 0.5) + # Injection current for Vclamp/Iclamp go to the same subplot + self._im_axes = self._plotFigure.add_subplot(2,2,3, title='Injection current') + self._im_axes.set_ylim(-0.5, 0.5) + # Channel currents go to the same subplot + self._i_axes = self._plotFigure.add_subplot(2,2,4, title='Channel current') + self._i_axes.set_ylim(-10, 10) + for axis in self._plotFigure.axes: + axis.set_autoscale_on(False) + layout = QtGui.QVBoxLayout() + layout.addWidget(self._plotCanvas) + self._plotNavigator = NavigationToolbar(self._plotCanvas, self._plotWidget) + layout.addWidget(self._plotNavigator) + self._plotWidget.setLayout(layout) + + def _createStatePlotWidget(self): + self._statePlotWidget = QtGui.QWidget() + self._statePlotFigure = Figure() + self._statePlotCanvas = FigureCanvas(self._statePlotFigure) + self._statePlotCanvas.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self._statePlotCanvas.updateGeometry() + self._statePlotCanvas.setParent(self._statePlotWidget) + self._statePlotFigure.set_canvas(self._statePlotCanvas) + self._statePlotFigure.subplots_adjust(hspace=0.5) + self._statePlotAxes = self._statePlotFigure.add_subplot(2,1,1, title='State plot') + self._state_plot, = self._statePlotAxes.plot([], [], label='state') + self._activationParamAxes = self._statePlotFigure.add_subplot(2,1,2, title='H-H activation parameters vs time') + self._activationParamAxes.set_xlabel('Time (ms)') + #for axis in self._plotFigure.axes: + # axis.autoscale(False) + self._stateplot_xvar_label = QtGui.QLabel('Variable on X-axis') + self._stateplot_xvar_combo = QtGui.QComboBox() + self._stateplot_xvar_combo.addItems(['V', 'm', 'n', 'h']) + self._stateplot_xvar_combo.setCurrentIndex(0) + self._stateplot_xvar_combo.setEditable(False) + self.connect(self._stateplot_xvar_combo, + QtCore.SIGNAL('currentIndexChanged(const QString&)'), + self._statePlotXSlot) + self._stateplot_yvar_label = QtGui.QLabel('Variable on Y-axis') + self._stateplot_yvar_combo = QtGui.QComboBox() + self._stateplot_yvar_combo.addItems(['V', 'm', 'n', 'h']) + self._stateplot_yvar_combo.setCurrentIndex(2) + self._stateplot_yvar_combo.setEditable(False) + self.connect(self._stateplot_yvar_combo, + QtCore.SIGNAL('currentIndexChanged(const QString&)'), + self._statePlotYSlot) + self._statePlotNavigator = NavigationToolbar(self._statePlotCanvas, self._statePlotWidget) + frame = QtGui.QFrame() + frame.setFrameStyle(QtGui.QFrame.StyledPanel + QtGui.QFrame.Raised) + layout = QtGui.QHBoxLayout() + layout.addWidget(self._stateplot_xvar_label) + layout.addWidget(self._stateplot_xvar_combo) + layout.addWidget(self._stateplot_yvar_label) + layout.addWidget(self._stateplot_yvar_combo) + frame.setLayout(layout) + self._closeStatePlotAction = QtGui.QAction('Close', self) + self.connect(self._closeStatePlotAction, QtCore.SIGNAL('triggered()'), self._statePlotWidget.close) + self._closeStatePlotButton = QtGui.QToolButton() + self._closeStatePlotButton.setDefaultAction(self._closeStatePlotAction) + layout = QtGui.QVBoxLayout() + layout.addWidget(frame) + layout.addWidget(self._statePlotCanvas) + layout.addWidget(self._statePlotNavigator) + layout.addWidget(self._closeStatePlotButton) + self._statePlotWidget.setLayout(layout) + # Setting the close event so that when the help window is + # closed the ``State plot`` button becomes unchecked + self._statePlotWidget.closeEvent = lambda event: self._showStatePlotAction.setChecked(False) + + def _createRunControl(self): + self._runControlBox = QtGui.QGroupBox(self) + self._runControlBox.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + self._runTimeLabel = QtGui.QLabel("Run time (ms)", self._runControlBox) + self._simTimeStepLabel = QtGui.QLabel("Simulation time step (ms)", self._runControlBox) + self._runTimeEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['runtime']), self._runControlBox) + set_default_line_edit_size(self._runTimeEdit) + self._simTimeStepEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['simdt']), self._runControlBox) + set_default_line_edit_size(self._simTimeStepEdit) + layout = QtGui.QGridLayout() + layout.addWidget(self._runTimeLabel, 0, 0) + layout.addWidget(self._runTimeEdit, 0, 1) + layout.addWidget(self._simTimeStepLabel, 1, 0) + layout.addWidget(self._simTimeStepEdit, 1, 1) + layout.setColumnStretch(2, 1.0) + layout.setRowStretch(2, 1.0) + self._runControlBox.setLayout(layout) + self._runControlDock = QtGui.QDockWidget('Simulation', self) + self._runControlDock.setWidget(self._runControlBox) + + def _createChannelControl(self): + self._channelControlDock = QtGui.QDockWidget('Channels', self) + self._channelCtrlBox = QtGui.QGroupBox(self) + self._naConductanceToggle = QtGui.QCheckBox('Block Na+ channel', self._channelCtrlBox) + self._naConductanceToggle.setToolTip('%s' % (tooltip_NaChan)) + self._kConductanceToggle = QtGui.QCheckBox('Block K+ channel', self._channelCtrlBox) + self._kConductanceToggle.setToolTip('%s' % (tooltip_KChan)) + self._kOutLabel = QtGui.QLabel('[K+]out (mM)', self._channelCtrlBox) + self._kOutEdit = QtGui.QLineEdit('%g' % (self.squid_setup.squid_axon.K_out), + self._channelCtrlBox) + self._kOutLabel.setToolTip('%s' % (tooltip_Nernst)) + self._kOutEdit.setToolTip('%s' % (tooltip_Nernst)) + set_default_line_edit_size(self._kOutEdit) + self._naOutLabel = QtGui.QLabel('[Na+]out (mM)', self._channelCtrlBox) + self._naOutEdit = QtGui.QLineEdit('%g' % (self.squid_setup.squid_axon.Na_out), + self._channelCtrlBox) + self._naOutLabel.setToolTip('%s' % (tooltip_Nernst)) + self._naOutEdit.setToolTip('%s' % (tooltip_Nernst)) + set_default_line_edit_size(self._naOutEdit) + self._kInLabel = QtGui.QLabel('[K+]in (mM)', self._channelCtrlBox) + self._kInEdit = QtGui.QLineEdit('%g' % (self.squid_setup.squid_axon.K_in), + self._channelCtrlBox) + self._kInEdit.setToolTip(tooltip_Nernst) + self._naInLabel = QtGui.QLabel('[Na+]in (mM)', self._channelCtrlBox) + self._naInEdit = QtGui.QLineEdit('%g' % (self.squid_setup.squid_axon.Na_in), + self._channelCtrlBox) + self._naInEdit.setToolTip('%s' % (tooltip_Nernst)) + self._temperatureLabel = QtGui.QLabel('Temperature (C)', self._channelCtrlBox) + self._temperatureEdit = QtGui.QLineEdit('%g' % (self.defaults['temperature'] - CELSIUS_TO_KELVIN), + self._channelCtrlBox) + self._temperatureEdit.setToolTip('%s' % (tooltip_Nernst)) + set_default_line_edit_size(self._temperatureEdit) + for child in self._channelCtrlBox.children(): + if isinstance(child, QtGui.QLineEdit): + set_default_line_edit_size(child) + layout = QtGui.QGridLayout(self._channelCtrlBox) + layout.addWidget(self._naConductanceToggle, 0, 0) + layout.addWidget(self._kConductanceToggle, 1, 0) + layout.addWidget(self._naOutLabel, 2, 0) + layout.addWidget(self._naOutEdit, 2, 1) + layout.addWidget(self._naInLabel, 3, 0) + layout.addWidget(self._naInEdit, 3, 1) + layout.addWidget(self._kOutLabel, 4, 0) + layout.addWidget(self._kOutEdit, 4, 1) + layout.addWidget(self._kInLabel, 5, 0) + layout.addWidget(self._kInEdit, 5, 1) + layout.addWidget(self._temperatureLabel, 6, 0) + layout.addWidget(self._temperatureEdit, 6, 1) + layout.setRowStretch(7, 1.0) + self._channelCtrlBox.setLayout(layout) + self._channelControlDock.setWidget(self._channelCtrlBox) + return self._channelCtrlBox + + def __get_stateplot_data(self, name): + data = [] + if name == 'V': + data = self.squid_setup.vm_table.vector + elif name == 'm': + data = self.squid_setup.m_table.vector + elif name == 'h': + data = self.squid_setup.h_table.vector + elif name == 'n': + data = self.squid_setup.n_table.vector + else: + raise ValueError('Unrecognized selection: %s' % (name)) + return numpy.asarray(data) + + def _statePlotYSlot(self, selectedItem): + ydata = self.__get_stateplot_data(str(selectedItem)) + self._state_plot.set_ydata(ydata) + self._statePlotAxes.set_ylabel(selectedItem) + if str(selectedItem) == 'V': + self._statePlotAxes.set_ylim(-20, 120) + else: + self._statePlotAxes.set_ylim(0, 1) + self._statePlotCanvas.draw() + + def _statePlotXSlot(self, selectedItem): + xdata = self.__get_stateplot_data(str(selectedItem)) + self._state_plot.set_xdata(xdata) + self._statePlotAxes.set_xlabel(selectedItem) + if str(selectedItem) == 'V': + self._statePlotAxes.set_xlim(-20, 120) + else: + self._statePlotAxes.set_xlim(0, 1) + self._statePlotCanvas.draw() + + def _createElectronicsControl(self): + """Creates a tabbed widget of voltage clamp and current clamp controls""" + self._electronicsTab = QtGui.QTabWidget(self) + self._electronicsTab.addTab(self._getIClampCtrlBox(), 'Current clamp') + self._electronicsTab.addTab(self._getVClampCtrlBox(), 'Voltage clamp') + self._electronicsDock = QtGui.QDockWidget(self) + self._electronicsDock.setWidget(self._electronicsTab) + + def _getVClampCtrlBox(self): + vClampPanel = QtGui.QGroupBox(self) + self._vClampCtrlBox = vClampPanel + self._holdingVLabel = QtGui.QLabel("Holding Voltage (mV)", vClampPanel) + self._holdingVEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['vclamp.holdingV']), vClampPanel) + self._holdingTimeLabel = QtGui.QLabel("Holding Time (ms)", vClampPanel) + self._holdingTimeEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['vclamp.holdingT']), vClampPanel) + self._prePulseVLabel = QtGui.QLabel("Pre-pulse Voltage (mV)", vClampPanel) + self._prePulseVEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['vclamp.prepulseV']), vClampPanel) + self._prePulseTimeLabel = QtGui.QLabel("Pre-pulse Time (ms)", vClampPanel) + self._prePulseTimeEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['vclamp.prepulseT']), vClampPanel) + self._clampVLabel = QtGui.QLabel("Clamp Voltage (mV)", vClampPanel) + self._clampVEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['vclamp.clampV']), vClampPanel) + self._clampTimeLabel = QtGui.QLabel("Clamp Time (ms)", vClampPanel) + self._clampTimeEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['vclamp.clampT']), vClampPanel) + for child in vClampPanel.children(): + if isinstance(child, QtGui.QLineEdit): + set_default_line_edit_size(child) + layout = QtGui.QGridLayout(vClampPanel) + layout.addWidget(self._holdingVLabel, 0, 0) + layout.addWidget(self._holdingVEdit, 0, 1) + layout.addWidget(self._holdingTimeLabel, 1, 0) + layout.addWidget(self._holdingTimeEdit, 1, 1) + layout.addWidget(self._prePulseVLabel, 2, 0) + layout.addWidget(self._prePulseVEdit, 2, 1) + layout.addWidget(self._prePulseTimeLabel,3,0) + layout.addWidget(self._prePulseTimeEdit, 3, 1) + layout.addWidget(self._clampVLabel, 4, 0) + layout.addWidget(self._clampVEdit, 4, 1) + layout.addWidget(self._clampTimeLabel, 5, 0) + layout.addWidget(self._clampTimeEdit, 5, 1) + layout.setRowStretch(6, 1.0) + vClampPanel.setLayout(layout) + return self._vClampCtrlBox + + def _getIClampCtrlBox(self): + iClampPanel = QtGui.QGroupBox(self) + self._iClampCtrlBox = iClampPanel + self._baseCurrentLabel = QtGui.QLabel("Base Current Level (uA)",iClampPanel) + self._baseCurrentEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.baseI']),iClampPanel) + self._firstPulseLabel = QtGui.QLabel("First Pulse Current (uA)", iClampPanel) + self._firstPulseEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.firstI']), iClampPanel) + self._firstDelayLabel = QtGui.QLabel("First Onset Delay (ms)", iClampPanel) + self._firstDelayEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.firstD']),iClampPanel) + self._firstPulseWidthLabel = QtGui.QLabel("First Pulse Width (ms)", iClampPanel) + self._firstPulseWidthEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.firstT']), iClampPanel) + self._secondPulseLabel = QtGui.QLabel("Second Pulse Current (uA)", iClampPanel) + self._secondPulseEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.secondI']), iClampPanel) + self._secondDelayLabel = QtGui.QLabel("Second Onset Delay (ms)", iClampPanel) + self._secondDelayEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.secondD']),iClampPanel) + self._secondPulseWidthLabel = QtGui.QLabel("Second Pulse Width (ms)", iClampPanel) + self._secondPulseWidthEdit = QtGui.QLineEdit('%g' % (SquidGui.defaults['iclamp.secondT']), iClampPanel) + self._pulseMode = QtGui.QComboBox(iClampPanel) + self._pulseMode.addItem("Single Pulse") + self._pulseMode.addItem("Pulse Train") + for child in iClampPanel.children(): + if isinstance(child, QtGui.QLineEdit): + set_default_line_edit_size(child) + layout = QtGui.QGridLayout(iClampPanel) + layout.addWidget(self._baseCurrentLabel, 0, 0) + layout.addWidget(self._baseCurrentEdit, 0, 1) + layout.addWidget(self._firstPulseLabel, 1, 0) + layout.addWidget(self._firstPulseEdit, 1, 1) + layout.addWidget(self._firstDelayLabel, 2, 0) + layout.addWidget(self._firstDelayEdit, 2, 1) + layout.addWidget(self._firstPulseWidthLabel, 3, 0) + layout.addWidget(self._firstPulseWidthEdit, 3, 1) + layout.addWidget(self._secondPulseLabel, 4, 0) + layout.addWidget(self._secondPulseEdit, 4, 1) + layout.addWidget(self._secondDelayLabel, 5, 0) + layout.addWidget(self._secondDelayEdit, 5, 1) + layout.addWidget(self._secondPulseWidthLabel, 6, 0) + layout.addWidget(self._secondPulseWidthEdit, 6, 1) + layout.addWidget(self._pulseMode, 7, 0, 1, 2) + layout.setRowStretch(8, 1.0) + # layout.setSizeConstraint(QtGui.QLayout.SetFixedSize) + iClampPanel.setLayout(layout) + return self._iClampCtrlBox + + def _overlayPlots(self, overlay): + if not overlay: + for axis in (self._plotFigure.axes + self._statePlotFigure.axes): + title = axis.get_title() + axis.clear() + axis.set_title(title) + suffix = '' + else: + suffix = '_%d' % (len(self._plot_dict['vm'])) + self._vm_axes.set_xlim(0.0, self._runtime) + self._g_axes.set_xlim(0.0, self._runtime) + self._im_axes.set_xlim(0.0, self._runtime) + self._i_axes.set_xlim(0.0, self._runtime) + self._vm_plot, = self._vm_axes.plot([], [], label='Vm%s'%(suffix)) + self._plot_dict['vm'].append(self._vm_plot) + self._command_plot, = self._vm_axes.plot([], [], label='command%s'%(suffix)) + self._plot_dict['command'].append(self._command_plot) + # Channel conductances go to the same subplot + self._gna_plot, = self._g_axes.plot([], [], label='Na%s'%(suffix)) + self._plot_dict['gna'].append(self._gna_plot) + self._gk_plot, = self._g_axes.plot([], [], label='K%s'%(suffix)) + self._plot_dict['gk'].append(self._gk_plot) + # Injection current for Vclamp/Iclamp go to the same subplot + self._iclamp_plot, = self._im_axes.plot([], [], label='Iclamp%s'%(suffix)) + self._vclamp_plot, = self._im_axes.plot([], [], label='Vclamp%s'%(suffix)) + self._plot_dict['iclamp'].append(self._iclamp_plot) + self._plot_dict['vclamp'].append(self._vclamp_plot) + # Channel currents go to the same subplot + self._ina_plot, = self._i_axes.plot([], [], label='Na%s'%(suffix)) + self._plot_dict['ina'].append(self._ina_plot) + self._ik_plot, = self._i_axes.plot([], [], label='K%s'%(suffix)) + self._plot_dict['ik'].append(self._ik_plot) + # self._i_axes.legend() + # State plots + self._state_plot, = self._statePlotAxes.plot([], [], label='state%s'%(suffix)) + self._plot_dict['state'].append(self._state_plot) + self._m_plot, = self._activationParamAxes.plot([],[], label='m%s'%(suffix)) + self._h_plot, = self._activationParamAxes.plot([], [], label='h%s'%(suffix)) + self._n_plot, = self._activationParamAxes.plot([], [], label='n%s'%(suffix)) + self._plot_dict['m'].append(self._m_plot) + self._plot_dict['h'].append(self._h_plot) + self._plot_dict['n'].append(self._n_plot) + if self._showLegendAction.isChecked(): + for axis in (self._plotFigure.axes + self._statePlotFigure.axes): + axis.legend() + + def _updateAllPlots(self): + self._updatePlots() + self._updateStatePlot() + + def _updatePlots(self): + if len(self.squid_setup.vm_table.vector) <= 0: + return + vm = numpy.asarray(self.squid_setup.vm_table.vector) + cmd = numpy.asarray(self.squid_setup.cmd_table.vector) + ik = numpy.asarray(self.squid_setup.ik_table.vector) + ina = numpy.asarray(self.squid_setup.ina_table.vector) + iclamp = numpy.asarray(self.squid_setup.iclamp_table.vector) + vclamp = numpy.asarray(self.squid_setup.vclamp_table.vector) + gk = numpy.asarray(self.squid_setup.gk_table.vector) + gna = numpy.asarray(self.squid_setup.gna_table.vector) + time_series = numpy.linspace(0, self._plotdt * len(vm), len(vm)) + self._vm_plot.set_data(time_series, vm) + time_series = numpy.linspace(0, self._plotdt * len(cmd), len(cmd)) + self._command_plot.set_data(time_series, cmd) + time_series = numpy.linspace(0, self._plotdt * len(ik), len(ik)) + self._ik_plot.set_data(time_series, ik) + time_series = numpy.linspace(0, self._plotdt * len(ina), len(ina)) + self._ina_plot.set_data(time_series, ina) + time_series = numpy.linspace(0, self._plotdt * len(iclamp), len(iclamp)) + self._iclamp_plot.set_data(time_series, iclamp) + time_series = numpy.linspace(0, self._plotdt * len(vclamp), len(vclamp)) + self._vclamp_plot.set_data(time_series, vclamp) + time_series = numpy.linspace(0, self._plotdt * len(gk), len(gk)) + self._gk_plot.set_data(time_series, gk) + time_series = numpy.linspace(0, self._plotdt * len(gna), len(gna)) + self._gna_plot.set_data(time_series, gna) + # self._vm_axes.margins(y=0.1) + # self._g_axes.margin(y=0.1) + # self._im_axes.margins(y=0.1) + # self._i_axes.margins(y=0.1) + if self._autoscaleAction.isChecked(): + for axis in self._plotFigure.axes: + axis.relim() + axis.margins(0.1, 0.1) + axis.autoscale_view(tight=True) + else: + self._vm_axes.set_ylim(-20.0, 120.0) + self._g_axes.set_ylim(0.0, 0.5) + self._im_axes.set_ylim(-0.5, 0.5) + self._i_axes.set_ylim(-10, 10) + self._vm_axes.set_xlim(0.0, time_series[-1]) + self._g_axes.set_xlim(0.0, time_series[-1]) + self._im_axes.set_xlim(0.0, time_series[-1]) + self._i_axes.set_xlim(0.0, time_series[-1]) + self._plotCanvas.draw() + + def _updateStatePlot(self): + if len(self.squid_setup.vm_table.vector) <= 0: + return + sx = str(self._stateplot_xvar_combo.currentText()) + sy = str(self._stateplot_yvar_combo.currentText()) + xdata = self.__get_stateplot_data(sx) + ydata = self.__get_stateplot_data(sy) + minlen = min(len(xdata), len(ydata)) + self._state_plot.set_data(xdata[:minlen], ydata[:minlen]) + self._statePlotAxes.set_xlabel(sx) + self._statePlotAxes.set_ylabel(sy) + if sx == 'V': + self._statePlotAxes.set_xlim(-20, 120) + else: + self._statePlotAxes.set_xlim(0, 1) + if sy == 'V': + self._statePlotAxes.set_ylim(-20, 120) + else: + self._statePlotAxes.set_ylim(0, 1) + self._activationParamAxes.set_xlim(0, self._runtime) + m = self.__get_stateplot_data('m') + n = self.__get_stateplot_data('n') + h = self.__get_stateplot_data('h') + time_series = numpy.linspace(0, self._plotdt*len(m), len(m)) + self._m_plot.set_data(time_series, m) + time_series = numpy.linspace(0, self._plotdt*len(h), len(h)) + self._h_plot.set_data(time_series, h) + time_series = numpy.linspace(0, self._plotdt*len(n), len(n)) + self._n_plot.set_data(time_series, n) + if self._autoscaleAction.isChecked(): + for axis in self._statePlotFigure.axes: + axis.relim() + axis.set_autoscale_on(True) + axis.autoscale_view(True) + self._statePlotCanvas.draw() + + def _runSlot(self): + if moose.isRunning(): + print('Stopping simulation in progress ...') + moose.stop() + self._runtime = self.getFloatInput(self._runTimeEdit, self._runTimeLabel.text()) + self._overlayPlots(self._overlayAction.isChecked()) + self._simdt = self.getFloatInput(self._simTimeStepEdit, self._simTimeStepLabel.text()) + clampMode = None + singlePulse = True + if self._electronicsTab.currentWidget() == self._vClampCtrlBox: + clampMode = 'vclamp' + baseLevel = self.getFloatInput(self._holdingVEdit, self._holdingVLabel.text()) + firstDelay = self.getFloatInput(self._holdingTimeEdit, self._holdingTimeLabel.text()) + firstWidth = self.getFloatInput(self._prePulseTimeEdit, self._prePulseTimeLabel.text()) + firstLevel = self.getFloatInput(self._prePulseVEdit, self._prePulseVLabel.text()) + secondDelay = firstWidth + secondWidth = self.getFloatInput(self._clampTimeEdit, self._clampTimeLabel.text()) + secondLevel = self.getFloatInput(self._clampVEdit, self._clampVLabel.text()) + if not self._autoscaleAction.isChecked(): + self._im_axes.set_ylim(-10.0, 10.0) + else: + clampMode = 'iclamp' + baseLevel = self.getFloatInput(self._baseCurrentEdit, self._baseCurrentLabel.text()) + firstDelay = self.getFloatInput(self._firstDelayEdit, self._firstDelayLabel.text()) + firstWidth = self.getFloatInput(self._firstPulseWidthEdit, self._firstPulseWidthLabel.text()) + firstLevel = self.getFloatInput(self._firstPulseEdit, self._firstPulseLabel.text()) + secondDelay = self.getFloatInput(self._secondDelayEdit, self._secondDelayLabel.text()) + secondLevel = self.getFloatInput(self._secondPulseEdit, self._secondPulseLabel.text()) + secondWidth = self.getFloatInput(self._secondPulseWidthEdit, self._secondPulseWidthLabel.text()) + singlePulse = (self._pulseMode.currentIndex() == 0) + if not self._autoscaleAction.isChecked(): + self._im_axes.set_ylim(-0.4, 0.4) + self.squid_setup.clamp_ckt.configure_pulses(baseLevel=baseLevel, + firstDelay=firstDelay, + firstWidth=firstWidth, + firstLevel=firstLevel, + secondDelay=secondDelay, + secondWidth=secondWidth, + secondLevel=secondLevel, + singlePulse=singlePulse) + if self._kConductanceToggle.isChecked(): + self.squid_setup.squid_axon.specific_gK = 0.0 + else: + self.squid_setup.squid_axon.specific_gK = SquidAxon.defaults['specific_gK'] + if self._naConductanceToggle.isChecked(): + self.squid_setup.squid_axon.specific_gNa = 0.0 + else: + self.squid_setup.squid_axon.specific_gNa = SquidAxon.defaults['specific_gNa'] + self.squid_setup.squid_axon.celsius = self.getFloatInput(self._temperatureEdit, self._temperatureLabel.text()) + self.squid_setup.squid_axon.K_out = self.getFloatInput(self._kOutEdit, self._kOutLabel.text()) + self.squid_setup.squid_axon.Na_out = self.getFloatInput(self._naOutEdit, self._naOutLabel.text()) + self.squid_setup.squid_axon.K_in = self.getFloatInput(self._kInEdit, self._kInLabel.text()) + self.squid_setup.squid_axon.Na_in = self.getFloatInput(self._naInEdit, self._naInLabel.text()) + self.squid_setup.squid_axon.updateEk() + self.squid_setup.schedule(self._simdt, self._plotdt, clampMode) + # The following line is for use with Qthread + self.squid_setup.run(self._runtime) + self._updateAllPlots() + + def _toggleDocking(self, on): + self._channelControlDock.setFloating(on) + self._electronicsDock.setFloating(on) + self._runControlDock.setFloating(on) + + def _restoreDocks(self): + self._channelControlDock.setVisible(True) + self._electronicsDock.setVisible(True) + self._runControlDock.setVisible(True) + + def _initActions(self): + self._runAction = QtGui.QAction(self.tr('Run'), self) + self._runAction.setShortcut(self.tr('F5')) + self._runAction.setToolTip('Run simulation (F5)') + self.connect(self._runAction, QtCore.SIGNAL('triggered()'), self._runSlot) + self._resetToDefaultsAction = QtGui.QAction(self.tr('Restore defaults'), self) + self._resetToDefaultsAction.setToolTip('Reset all settings to their default values') + self.connect(self._resetToDefaultsAction, QtCore.SIGNAL('triggered()'), self._useDefaults) + self._showLegendAction = QtGui.QAction(self.tr('Display legend'), self) + self._showLegendAction.setCheckable(True) + self.connect(self._showLegendAction, QtCore.SIGNAL('toggled(bool)'), self._showLegend) + self._showStatePlotAction = QtGui.QAction(self.tr('State plot'), self) + self._showStatePlotAction.setCheckable(True) + self._showStatePlotAction.setChecked(False) + self.connect(self._showStatePlotAction, QtCore.SIGNAL('toggled(bool)'), self._statePlotWidget.setVisible) + self._autoscaleAction = QtGui.QAction(self.tr('Auto-scale plots'), self) + self._autoscaleAction.setCheckable(True) + self._autoscaleAction.setChecked(False) + self.connect(self._autoscaleAction, QtCore.SIGNAL('toggled(bool)'), self._autoscale) + self._overlayAction = QtGui.QAction('Overlay plots', self) + self._overlayAction.setCheckable(True) + self._overlayAction.setChecked(False) + self._dockAction = QtGui.QAction('Undock all', self) + self._dockAction.setCheckable(True) + self._dockAction.setChecked(False) + self.connect(self._dockAction, QtCore.SIGNAL('toggled(bool)'), self._toggleDocking) + self._restoreDocksAction = QtGui.QAction('Show all', self) + self.connect(self._restoreDocksAction, QtCore.SIGNAL('triggered()'), self._restoreDocks) + self._quitAction = QtGui.QAction(self.tr('&Quit'), self) + self._quitAction.setShortcut(self.tr('Ctrl+Q')) + self.connect(self._quitAction, QtCore.SIGNAL('triggered()'), QtGui.qApp.closeAllWindows) + + + + def _createRunToolBar(self): + self._simToolBar = self.addToolBar(self.tr('Simulation control')) + self._simToolBar.addAction(self._quitAction) + self._simToolBar.addAction(self._runAction) + self._simToolBar.addAction(self._resetToDefaultsAction) + self._simToolBar.addAction(self._dockAction) + self._simToolBar.addAction(self._restoreDocksAction) + + def _createPlotToolBar(self): + self._plotToolBar = self.addToolBar(self.tr('Plotting control')) + self._plotToolBar.addAction(self._showLegendAction) + self._plotToolBar.addAction(self._autoscaleAction) + self._plotToolBar.addAction(self._overlayAction) + self._plotToolBar.addAction(self._showStatePlotAction) + self._plotToolBar.addAction(self._helpAction) + self._plotToolBar.addAction(self._helpBiophysicsAction) + + def _showLegend(self, on): + if on: + for axis in (self._plotFigure.axes + self._statePlotFigure.axes): + axis.legend().set_visible(True) + else: + for axis in (self._plotFigure.axes + self._statePlotFigure.axes): + axis.legend().set_visible(False) + self._plotCanvas.draw() + self._statePlotCanvas.draw() + + def _autoscale(self, on): + if on: + for axis in (self._plotFigure.axes + self._statePlotFigure.axes): + axis.relim() + axis.set_autoscale_on(True) + axis.autoscale_view(True) + else: + for axis in self._plotFigure.axes: + axis.set_autoscale_on(False) + self._vm_axes.set_ylim(-20.0, 120.0) + self._g_axes.set_ylim(0.0, 0.5) + self._im_axes.set_ylim(-0.5, 0.5) + self._i_axes.set_ylim(-10, 10) + self._plotCanvas.draw() + self._statePlotCanvas.draw() + + def _useDefaults(self): + self._runTimeEdit.setText('%g' % (self.defaults['runtime'])) + self._simTimeStepEdit.setText('%g' % (self.defaults['simdt'])) + self._overlayAction.setChecked(False) + self._naConductanceToggle.setChecked(False) + self._kConductanceToggle.setChecked(False) + self._kOutEdit.setText('%g' % (SquidGui.defaults['K_out'])) + self._naOutEdit.setText('%g' % (SquidGui.defaults['Na_out'])) + self._kInEdit.setText('%g' % (SquidGui.defaults['K_in'])) + self._naInEdit.setText('%g' % (SquidGui.defaults['Na_in'])) + self._temperatureEdit.setText('%g' % (SquidGui.defaults['temperature'] - CELSIUS_TO_KELVIN)) + self._holdingVEdit.setText('%g' % (SquidGui.defaults['vclamp.holdingV'])) + self._holdingTimeEdit.setText('%g' % (SquidGui.defaults['vclamp.holdingT'])) + self._prePulseVEdit.setText('%g' % (SquidGui.defaults['vclamp.prepulseV'])) + self._prePulseTimeEdit.setText('%g' % (SquidGui.defaults['vclamp.prepulseT'])) + self._clampVEdit.setText('%g' % (SquidGui.defaults['vclamp.clampV'])) + self._clampTimeEdit.setText('%g' % (SquidGui.defaults['vclamp.clampT'])) + self._baseCurrentEdit.setText('%g' % (SquidGui.defaults['iclamp.baseI'])) + self._firstPulseEdit.setText('%g' % (SquidGui.defaults['iclamp.firstI'])) + self._firstDelayEdit.setText('%g' % (SquidGui.defaults['iclamp.firstD'])) + self._firstPulseWidthEdit.setText('%g' % (SquidGui.defaults['iclamp.firstT'])) + self._secondPulseEdit.setText('%g' % (SquidGui.defaults['iclamp.secondI'])) + self._secondDelayEdit.setText('%g' % (SquidGui.defaults['iclamp.secondD'])) + self._secondPulseWidthEdit.setText('%g' % (SquidGui.defaults['iclamp.secondT'])) + self._pulseMode.setCurrentIndex(0) + + def _onScroll(self, event): + if event.inaxes is None: + return + axes = event.inaxes + zoom = 0.0 + if event.button == 'up': + zoom = -1.0 + elif event.button == 'down': + zoom = 1.0 + if zoom != 0.0: + self._plotNavigator.push_current() + axes.get_xaxis().zoom(zoom) + axes.get_yaxis().zoom(zoom) + self._plotCanvas.draw() + + def closeEvent(self, event): + QtGui.qApp.closeAllWindows() + + def _showBioPhysicsHelp(self): + self._createHelpMessage() + self._helpMessageText.setText('

%s

%s

%s

%s

%s

' % + (tooltip_Nernst, + tooltip_Erest, + tooltip_KChan, + tooltip_NaChan, + tooltip_Im)) + self._helpWindow.setVisible(True) + + def _showRunningHelp(self): + self._createHelpMessage() + self._helpMessageText.setSource(QtCore.QUrl(self._helpBaseURL)) + self._helpWindow.setVisible(True) + + def _createHelpMessage(self): + if hasattr(self, '_helpWindow'): + return + self._helpWindow = QtGui.QWidget() + self._helpWindow.setWindowFlags(QtCore.Qt.Window) + layout = QtGui.QVBoxLayout() + self._helpWindow.setLayout(layout) + self._helpMessageArea = QtGui.QScrollArea() + self._helpMessageText = QtGui.QTextBrowser() + self._helpMessageText.setOpenExternalLinks(True) + self._helpMessageArea.setWidget(self._helpMessageText) + layout.addWidget(self._helpMessageText) + self._squidGuiPath = os.path.dirname(os.path.abspath(__file__)) + self._helpBaseURL = os.path.join(self._squidGuiPath,'help.html') + self._helpMessageText.setSource(QtCore.QUrl(self._helpBaseURL)) + self._helpMessageText.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self._helpMessageArea.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self._helpMessageText.setMinimumSize(800, 600) + self._closeHelpAction = QtGui.QAction('Close', self) + self.connect(self._closeHelpAction, QtCore.SIGNAL('triggered()'), self._helpWindow.close) + # Setting the close event so that the ``Help`` button is + # unchecked when the help window is closed + self._helpWindow.closeEvent = lambda event: self._helpAction.setChecked(False) + self._helpTOCAction = QtGui.QAction('Help running demo', self) + self.connect(self._helpTOCAction, QtCore.SIGNAL('triggered()'), self._jumpToHelpTOC) + # This panel is for putting two buttons using horizontal + # layout + panel = QtGui.QFrame() + panel.setFrameStyle(QtGui.QFrame.StyledPanel + QtGui.QFrame.Raised) + layout.addWidget(panel) + layout = QtGui.QHBoxLayout() + panel.setLayout(layout) + self._helpAction = QtGui.QAction('Help running', self) + self.connect(self._helpAction, QtCore.SIGNAL('triggered()'), self._showRunningHelp) + self._helpBiophysicsAction = QtGui.QAction('Help biophysics', self) + self.connect(self._helpBiophysicsAction, QtCore.SIGNAL('triggered()'), self._showBioPhysicsHelp) + self._helpTOCButton = QtGui.QToolButton() + self._helpTOCButton.setDefaultAction(self._helpTOCAction) + self._helpBiophysicsButton = QtGui.QToolButton() + self._helpBiophysicsButton.setDefaultAction(self._helpBiophysicsAction) + layout.addWidget(self._helpTOCButton) + layout.addWidget(self._helpBiophysicsButton) + self._closeHelpButton = QtGui.QToolButton() + self._closeHelpButton.setDefaultAction(self._closeHelpAction) + layout.addWidget(self._closeHelpButton) + + def _jumpToHelpTOC(self): + self._helpMessageText.setSource(QtCore.QUrl(self._helpBaseURL)) + +if __name__ == '__main__': + app = QtGui.QApplication(sys.argv) + app.connect(app, QtCore.SIGNAL('lastWindowClosed()'), app, QtCore.SLOT('quit()')) + QtGui.qApp = app + squid_gui = SquidGui() + squid_gui.show() + print(squid_gui.size()) + sys.exit(app.exec_()) + +# +# squidgui.py ends here diff --git a/demos/squid/squid_setup.py b/demos/squid/squid_setup.py new file mode 100644 index 0000000..6f24e46 --- /dev/null +++ b/demos/squid/squid_setup.py @@ -0,0 +1,118 @@ +# squid_demo.py --- +# +# Filename: squid_demo.py +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Wed Feb 22 23:24:21 2012 (+0530) +# Version: +# Last-Updated: Tue Mar 6 23:25:50 2012 (+0530) +# By: Subhasis Ray +# Update #: 162 +# URL: +# Keywords: +# Compatibility: +# +# + +# Commentary: +# +# +# +# + +# Change log: +# +# +# + +# Code: + +import moose + +from squid import SquidAxon +from electronics import ClampCircuit + +class SquidSetup(object): + def __init__(self): + self.scheduled = False + self.model_container = moose.Neutral('/model') + self.data_container = moose.Neutral('/data') + self.squid_axon = SquidAxon('/model/squid_axon') + self.clamp_ckt = ClampCircuit('/model/electronics', self.squid_axon) + self.simdt = 0.0 + self.plotdt = 0.0 + self.setup_recording() + + def setup_recording(self): + # Setup data collection + self.vm_table = moose.Table('/data/Vm') + moose.connect(self.vm_table, 'requestOut', self.squid_axon, 'getVm') + self.cmd_table = moose.Table('/data/command') + moose.connect(self.cmd_table, 'requestOut', self.clamp_ckt.vclamp, 'getOutputValue') + self.iclamp_table = moose.Table('/data/Iclamp') + moose.connect(self.iclamp_table, 'requestOut', self.clamp_ckt.iclamp, 'getOutputValue') + self.vclamp_table = moose.Table('/data/Vclamp') + moose.connect(self.vclamp_table, 'requestOut', self.clamp_ckt.pid, 'getOutputValue') + self.m_table = moose.Table('/data/m') + moose.connect(self.m_table, 'requestOut', self.squid_axon.Na_channel, 'getX') + self.h_table = moose.Table('/data/h') + moose.connect(self.h_table, 'requestOut', self.squid_axon.Na_channel, 'getY') + self.n_table = moose.Table('/data/n') + moose.connect(self.n_table, 'requestOut', self.squid_axon.K_channel, 'getX') + self.ina_table = moose.Table('/data/INa') + moose.connect(self.ina_table, 'requestOut', self.squid_axon.Na_channel, 'getIk') + self.ik_table = moose.Table('/data/IK') + moose.connect(self.ik_table, 'requestOut', self.squid_axon.K_channel, 'getIk') + self.gna_table = moose.Table('/data/GNa') + moose.connect(self.gna_table, 'requestOut', self.squid_axon.Na_channel, 'getGk') + self.gk_table = moose.Table('/data/GK') + moose.connect(self.gk_table, 'requestOut', self.squid_axon.K_channel, 'getGk') + + def schedule(self, simdt, plotdt, clampmode): + self.simdt = simdt + self.plotdt = plotdt + if clampmode == 'vclamp': + self.clamp_ckt.do_voltage_clamp() + else: + self.clamp_ckt.do_current_clamp() + moose.setClock(0, simdt) + moose.setClock(1, simdt) + moose.setClock(2, simdt) + moose.setClock(3, plotdt) + # Ensure we do not create multiple scheduling + if not self.scheduled: + moose.useClock(0, '%s/#[TYPE=Compartment]' % (self.model_container.path), 'init') + moose.useClock(0, '%s/##' % (self.clamp_ckt.path), 'process') + moose.useClock(1, '%s/#[TYPE=Compartment]' % (self.model_container.path), 'process') + moose.useClock(2, '%s/#[TYPE=HHChannel]' % (self.squid_axon.path), 'process') + moose.useClock(3, '%s/#[TYPE=Table]' % (self.data_container.path), 'process') + self.scheduled = True + moose.reinit() + + def run(self, runtime): + moose.start(runtime) + + def save_data(self): + for child in self.data_container.children: + tab = moose.Table(child) + tab.xplot('%s.dat' % (tab.name), tab.name) + +import sys +clamp_mode = 'vclamp' +if __name__ == '__main__': + demo = SquidSetup() + if len(sys.argv) > 1: + clamp_mode = sys.argv[1] + # The pulsegen object needs different values for different clamp modes + if clamp_mode == 'iclamp': + demo.clamp_ckt.configure_pulses() + else: + demo.clamp_ckt.configure_pulses(baseLevel=0.0, firstDelay=10.0, firstLevel=SquidAxon.EREST_ACT, firstWidth=0.0, secondDelay=0.0, secondLevel=50.0+SquidAxon.EREST_ACT, secondWidth=20.0) + demo.schedule(1e-2, 0.01, clamp_mode) + + demo.run(50.0) + demo.save_data() + +# +# squid_demo.py ends here diff --git a/demos/squid/test_squid.py b/demos/squid/test_squid.py new file mode 100644 index 0000000..005cb16 --- /dev/null +++ b/demos/squid/test_squid.py @@ -0,0 +1,117 @@ +# test_squid.py --- +# +# Filename: test_squid.py +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Wed Feb 22 00:41:36 2012 (+0530) +# Version: +# Last-Updated: Wed Feb 22 00:41:51 2012 (+0530) +# By: Subhasis Ray +# Update #: 2 +# URL: +# Keywords: +# Compatibility: +# +# + +# Commentary: +# +# +# +# + +# Change log: +# +# +# + +# Code: + +import unittest +import pylab +from squid import SquidModel + +class SquidAxonTest(unittest.TestCase): + def setUp(self): + self.vrange = numpy.linspace(SquidModel.VMIN, SquidModel.VMAX, SquidModel.VDIVS+1) + self.model = SquidModel('testSquidAxon') + + def calc_alpha_beta(self, params, table='A'): + denominator = params[table+'_C'] + numpy.exp((self.vrange+params[table+'_D'])/params[table+'_F']) + numerator = params[table+'_A'] + params[table+'_B'] * self.vrange + y = numpy.zeros(len(self.vrange)) + singularities = numpy.nonzero(denominator == 0.0)[0] + self.assertLessEqual(len(singularities), 1) + if len(singularities) == 1: + y[:singularities[0]] = numerator[:singularities[0]]/denominator[:singularities[0]] + y[singularities[0]] = params[table+'_B'] * params[table+'_F'] + y[singularities[0]+1:] = numerator[singularities[0]+1:]/denominator[singularities[0]+1:] + elif len(singularities) == 0: + y[:] = numerator[:]/denominator[:] + return y + + def test_Na_alpha_m(self): + alpha_m = self.calc_alpha_beta(SquidModel.Na_m_params, 'A') + difference = numpy.sqrt(numpy.mean((alpha_m - self.model.Na_channel.alpha_m)**2)) + pylab.title('Na_alpha_m') + pylab.plot(alpha_m, label='python') + pylab.plot(self.model.Na_channel.alpha_m, label='moose') + pylab.legend() + pylab.show() + self.assertLessEqual(difference, numpy.mean(alpha_m)*1e-6) + + def test_Na_beta_m(self): + beta_m = self.calc_alpha_beta(SquidModel.Na_m_params, 'B') + difference = numpy.sqrt(numpy.mean((beta_m - self.model.Na_channel.beta_m)**2)) + pylab.title('Na_beta_m') + pylab.plot(beta_m, label='python') + pylab.plot(self.model.Na_channel.beta_m, label='moose') + pylab.legend() + pylab.show() + self.assertLessEqual(difference, numpy.mean(beta_m)*1e-6) + + def test_Na_alpha_h(self): + alpha_h = self.calc_alpha_beta(SquidModel.Na_h_params, 'A') + difference = numpy.sqrt(numpy.mean((alpha_h - self.model.Na_channel.alpha_h)**2)) + pylab.title('Na_alpha_h') + pylab.plot(alpha_h, label='python') + pylab.plot(self.model.Na_channel.alpha_h, label='moose') + pylab.legend() + pylab.show() + self.assertLessEqual(difference, numpy.mean(alpha_h)*1e-6) + + def test_Na_beta_h(self): + beta_h = self.calc_alpha_beta(SquidModel.Na_h_params, 'B') + difference = numpy.sqrt(numpy.mean((beta_h - self.model.Na_channel.beta_h)**2)) + pylab.title('Na_beta_h') + pylab.plot(beta_h, label='python') + pylab.plot(self.model.Na_channel.beta_h, label='moose') + pylab.legend() + pylab.show() + self.assertLessEqual(difference, numpy.mean(beta_h)*1e-6) + + def test_K_alpha_m(self): + alpha_m = self.calc_alpha_beta(SquidModel.K_n_params, 'A') + difference = numpy.sqrt(numpy.mean((alpha_m - self.model.K_channel.alpha_m)**2)) + pylab.title('K_alpha_n') + pylab.plot(alpha_m, label='python') + pylab.plot(self.model.K_channel.alpha_m, label='moose') + pylab.legend() + pylab.show() + self.assertLessEqual(difference, numpy.mean(alpha_m)*1e-6) + + def test_K_beta_m(self): + beta_m = self.calc_alpha_beta(SquidModel.K_n_params, 'B') + difference = numpy.sqrt(numpy.mean((beta_m - self.model.K_channel.beta_m)**2)) + pylab.title('K_beta_n') + pylab.plot(beta_m, label='python') + pylab.plot(self.model.K_channel.beta_m, label='moose') + pylab.legend() + pylab.show() + self.assertLessEqual(difference, numpy.mean(beta_m)*1e-6) + + + +# +# test_squid.py ends here diff --git a/drawsbml b/drawsbml new file mode 160000 index 0000000..3805a2d --- /dev/null +++ b/drawsbml @@ -0,0 +1 @@ +Subproject commit 3805a2dd2b5bc218df3300bb36631a1059c5e895 diff --git a/global_constants.py b/global_constants.py deleted file mode 100644 index 247b5cb..0000000 --- a/global_constants.py +++ /dev/null @@ -1,3 +0,0 @@ -from PreferencesPresenter import PreferencesPresenter - -preferences = PreferencesPresenter() diff --git a/loaderdialog.py b/loaderdialog.py deleted file mode 100644 index d49e1ce..0000000 --- a/loaderdialog.py +++ /dev/null @@ -1,112 +0,0 @@ -# fileloader.py --- -# -# Filename: fileloader.py -# Description: -# Author: -# Maintainer: -# Created: Mon Feb 25 15:59:54 2013 (+0530) -# Version: -# Last-Updated: Wed May 22 12:30:14 2013 (+0530) -# By: subha -# Update #: 106 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# Dialog for loading model files -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: - -import sys -from PyQt4 import QtGui,QtCore,Qt -import moose -import os -import posixpath - -class LoaderDialog(QtGui.QFileDialog): - # Update ftypes to include new file types - ftypes='All Supported Files (*.cspace *.g *.xml *.p);; CSPACE (*.cspace);; GENESIS (*.g);; GENESIS Prototype (*.p);; NeuroML/SBML (*.xml)' - target_default = '' # The default target when loading a model - def __init__(self, *args): - self.modelpath = None - super(LoaderDialog, self).__init__(*args) - self.setNameFilter(self.tr(self.ftypes)) - self.setNameFilterDetailsVisible(True) - self.setReadOnly(True) - self.setFileMode(self.ExistingFile) - # self.targetPanel = QtGui.QFrame() - # self.targetLabel = QtGui.QLabel('Model name') - # self.targetText = QtGui.QLineEdit(self.target_default) - # form = QtGui.QFormLayout() - # form.addRow(self.targetLabel, self.targetText) - # self.modelChoiceBox = QtGui.QGroupBox('Model name') - # self.replaceExistingButton = QtGui.QRadioButton('&Replace current model') - # self.mergeExistingButton = QtGui.QRadioButton('&Keep current model') - # self.replaceExistingButton.setChecked(True) - # vbox = QtGui.QVBoxLayout() - # vbox.addWidget(self.replaceExistingButton) - # vbox.addWidget(self.mergeExistingButton) - # self.modelChoiceBox.setLayout(vbox) - # self.targetPanel.setLayout(form) - # self.layout().addWidget(self.targetPanel) - # self.layout().addWidget(self.modelChoiceBox) - self.fileSelected.connect(self.fileSelectedSlot) - - def fileSelectedSlot(self, fpath): - """On selecting a file, this function will cause the target location to change to: - - /model/filename_minus_extension - - """ - self.modelpath = os.path.splitext(os.path.basename(str(fpath)))[0] - - # def isReplace(self): - # return self.replaceExistingButton.isChecked() - - # def isMerge(self): - # return self.mergeExistingButton.isChecked() - - def getTargetPath(self): - return self.modelpath - - -if __name__ == '__main__': - app = QtGui.QApplication(sys.argv) - QtGui.qApp = app - mw = LoaderDialog() - mw.show() - # mw.exec_() - sys.exit(app.exec_()) - - - -# -# fileloader.py ends here diff --git a/moose b/moose new file mode 100755 index 0000000..d4b51ed --- /dev/null +++ b/moose @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import moosegui +print( moosegui.__file__ ) +moosegui.main( ) diff --git a/moosegui/GenericTypes.py b/moosegui/GenericTypes.py new file mode 100644 index 0000000..c4ef7ab --- /dev/null +++ b/moosegui/GenericTypes.py @@ -0,0 +1,34 @@ +"""GenericTypes + +This class fixes the pytho2 and python3 related issues with PyQt5 + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import sys +import os + +from PyQt5 import QtCore + +if sys.version_info >= (3, 0): + + class QVariant(str): + """docstring for QVariant""" + def __init__(self, val): + super(QVariant, self).__init__() + self.val = val + + def toString( self ): + return "%s" % self.val + +else: + QVariant = QtCore.QVariant + diff --git a/mgui.py b/moosegui/MWindow.py similarity index 60% rename from mgui.py rename to moosegui/MWindow.py index 0ecb96f..379957c 100644 --- a/mgui.py +++ b/moosegui/MWindow.py @@ -1,123 +1,63 @@ -# mgui.py --- -# -# Filename: mgui.py -# Description: +# -*- coding: utf-8 -*- + # Author: "Subhasis", "HarshaRani","Aviral Goel" -# Maintainer: HarshaRani +# Maintainer: HarshaRani, Dilawar Singh # Created: Mon Nov 12 09:38:09 2012 (+0530) -# Version: -# Last-Updated: Fri Sep 20 00:54:33 2018 (+0530) -# By: Harsha -# Update #: -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# The gui driver -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -'''' -2018 -Sep 20 : Lot of duplicate code removed - Function call made when filename or filepath is passed in command line -Sep 19 : From the cmd line if a directory is passed, then Gui opens up the dialog file for the folder, - window is resized to maximum width, clean warning message if filename or path is wrong - Added model info QmessageBox -Sep 7 : popup is closed if exist -2017 -Aug 31 : Pass file from the command to load into gui - : added dsolver in disableModel function is used to unset the solver for the model - into moose-gui which are not to be run. - -Oct 5 : clean up with round trip of dialog_exe - -''' -# Code: + +import os import imp import inspect -import code import traceback -import sys -sys.path.append('../python') -#sys.path.append('utils') -import os -from collections import defaultdict -import posixpath # We use this to create MOOSE paths -from PyQt4 import QtGui, QtCore, Qt -import config -import mplugin -import moose -import mexception -from moose import utils -from mload import loadFile -from loaderdialog import LoaderDialog -from shell import get_shell_class -from objectedit import ObjectEditDockWidget -from newmodeldialog import DialogWidget import re -from biomodelsclient import BioModelsClientWidget -from PyQt4 import Qt, QtCore, QtGui -from PyQt4.QtGui import * -from MdiArea import MdiArea -import os -from moose.chemUtil.add_Delete_ChemicalSolver import * -#from setsolver import * -from defines import * +import sys +import code + from collections import OrderedDict +from PyQt5 import QtGui, QtCore, Qt +from PyQt5.QtWidgets import QMainWindow, QAction, QApplication +from PyQt5.QtWidgets import QDockWidget, QMdiArea, QMenu +from PyQt5.QtWidgets import QActionGroup, QSizePolicy, QDialog +from PyQt5.QtWidgets import QGridLayout, QPushButton +from PyQt5.QtWidgets import QHBoxLayout, QMessageBox + +# moose +import moose -__author__ = 'Subhasis Ray , HarshaRani, Aviral Goel, NCBS' +# moosegui +from moosegui import config +from moosegui import mplugin +from moosegui import mexception +from moosegui import mload +from moosegui.loaderdialog import LoaderDialog +from moosegui.shell import get_shell_class +from moosegui.objectedit import ObjectEditDockWidget +from moosegui.newmodeldialog import DialogWidget +from moosegui.biomodelsclient import BioModelsClientWidget +from moosegui.MdiArea import MdiArea +from moosegui.plugins import defines + +# Logger +import logging +logger_ = logging.getLogger("moosegui.window") # This maps model subtypes to corresponding plugin names. Should be # moved to a separate property file perhaps -subtype_plugin_map = { 'genesis/kkit': 'kkit' - , 'cspace/': 'kkit' - , 'xml/sbml': 'kkit' - , 'xml/neuroml': 'NeuroKit' - } - -#APPLICATION_ICON_PATH = os.path.join( os.path.dirname(os.path.realpath(__file__)) -# , "icons/moose_icon.png" -# ) - +subtype_plugin_map = { + 'genesis/kkit': 'kkit' + , 'cspace/': 'kkit' + , 'xml/sbml': 'kkit' + , 'xml/neuroml': 'NeuroKit' + } def busyCursor(): app = QtGui.qApp - app.setOverrideCursor(QtGui.QCursor(Qt.Qt.BusyCursor)) #shows a hourglass - or a busy/working arrow + app.setOverrideCursor(QtGui.QCursor(Qt.Qt.BusyCursor)) def freeCursor(): app = QtGui.qApp app.restoreOverrideCursor() - - -class MWindow(QtGui.QMainWindow): +class MWindow(QMainWindow): """The main window for MOOSE GUI. This is the driver class that uses the mplugin API. mplugin based @@ -150,7 +90,7 @@ class MWindow(QtGui.QMainWindow): """ def __init__(self, *args): - QtGui.QMainWindow.__init__(self, *args) + QMainWindow.__init__(self, *args) self.setWindowTitle('MOOSE') self.pluginNames = None self.plugin = None @@ -170,26 +110,13 @@ def __init__(self, *args): self.setDockOptions(self.AnimatedDocks and self.AllowNestedDocks and self.AllowTabbedDocks) self.mdiArea = MdiArea() - self.quitAction = QtGui.QAction('&Quit', self) - self.connect(self.quitAction, QtCore.SIGNAL('triggered()'), self.quit) - self.quitAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8)) + self.quitAction = QAction('&Quit', self) + self.quitAction.triggered.connect(self.quit) + self.quitAction.setShortcut("Ctrl+Q") self.getMyDockWidgets() self.setCentralWidget(self.mdiArea) - #self.setWindowIcon(QIcon(APPLICATION_ICON_PATH)) - - # pixmap = QPixmap("icons/moose_icon.png") - # pixmap = pixmap.scaled(self.mdiArea.size()) - # self.mdiArea.setStyleSheet("QMdiArea { background-image: url(icons/moose_icon_large.png); }") - # palette = QPalette() - # palette.setBrush(QPalette.Background, QBrush(pixmap)) - # self.setPalette(palette) - - - # self.mdiArea.setStyleSheet("border-image: url(icons/moose_icon_large.png)") - # self.mdiArea.setBackground(QBrush(pixmap)) - - self.mdiArea.setViewMode(QtGui.QMdiArea.TabbedView) + self.mdiArea.setViewMode(QMdiArea.TabbedView) self.mdiArea.subWindowActivated.connect(self.switchSubwindowSlot) self.setPlugin('default', '/') self.plugin.getEditorView().getCentralWidget().parent().close() @@ -217,17 +144,17 @@ def __init__(self, *args): self.show() self.createPopup() freeCursor() - reply = QtGui.QMessageBox.information(self,"Model file can not open","At present python file cann\'t be laoded into GUI",QtGui.QMessageBox.Ok) - if reply == QtGui.QMessageBox.Ok: - QtGui.QApplication.restoreOverrideCursor() + reply = QMessageBox.information(self,"Model file can not open","At present python file cann\'t be laoded into GUI", QMessageBox.Ok) + if reply == QMessageBox.Ok: + QApplication.restoreOverrideCursor() return if not os.path.exists(cmdfilepath): self.setWindowState(QtCore.Qt.WindowMaximized) self.show() self.createPopup() - reply = QtGui.QMessageBox.information(self,"Model file can not open","File Not Found \n \nCheck filename or filepath\n ",QtGui.QMessageBox.Ok) - if reply == QtGui.QMessageBox.Ok: - QtGui.QApplication.restoreOverrideCursor() + reply = QMessageBox.information(self,"Model file can not open","File Not Found \n \nCheck filename or filepath\n ", QMessageBox.Ok) + if reply == QMessageBox.Ok: + QApplication.restoreOverrideCursor() return if os.path.isdir(cmdfilepath): self.setWindowState(QtCore.Qt.WindowMaximized) @@ -271,36 +198,31 @@ def __init__(self, *args): self.createPopup() def createPopup(self): - self.popup = dialog = QDialog(self) - #dialog.setWindowFlags(Qt.Qt.Dialog | Qt.Qt.FramelessWindowHint) - dialog.setWindowFlags(Qt.Qt.Dialog | Qt.Qt.CustomizeWindowHint) - #dialog.setStyleSheet("border:1px solid rgb(0, 0, 0); ") - qapp = QApplication.desktop().screenGeometry(); - dialog.setGeometry((qapp.bottomLeft().x()+100),(qapp.bottomLeft().y()-250),100,100) - #dialog.move(qapp.bottomLeft().x()+10,qapp.bottomLeft().y()-10) - layout = QGridLayout() - self.setStyleSheet("QPushButton{border-radius: 5px; border-color: rgb(0,0,0); border-width: 2px; border-style: outset; padding-top: 2px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px}") - #self.setStyleSheet("QToolTip{border-radius: 5px; border-width: 2px; border-style: outset; padding-top: 2px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; color: black}") + self.popup = dialog = QDialog() createKineticModelButton = QPushButton("Create Kinetic Model") loadKineticModelButton = QPushButton("Load Model") loadNeuronalModelButton = QPushButton("Load Neuronal Model") - layout.setContentsMargins(QtCore.QMargins(20,20,20,20)) - - self.menuitems = OrderedDict([("Fig2C" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2C.py"), - ("Fig2D (35s)", "../moose-examples/paper-2015/Fig2_elecModels/Fig2D.py"), - ("Fig2E" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2E.py"), - ("Fig3B_Gssa", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), - ("Fig3C_Gsl", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), - ("Fig3D", "../moose-examples/paper-2015/Fig3_chemModels/Fig3D.py"), - ("Fig4B", "../moose-examples/paper-2015/Fig4_ReacDiff/Fig4B.py" ), - ("Fig4K", "../moose-examples/paper-2015/Fig4_ReacDiff/rxdSpineSize.py"), - ("Fig5A (20s)", "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5A.py"), - ("Fig5BCD (240s)" , "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5BCD.py"), - ("Fig6A (60s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/Fig6A.py" ), - ("ReducedModel (200s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/ReducedModel.py"), - ("Squid" , "../moose-examples/squid/squid_demo.py") - ]) - layout.setContentsMargins(QtCore.QMargins(20,20,20,20)) + + # setup layout. + layout = QGridLayout() + _m = 15 + layout.setContentsMargins(QtCore.QMargins(_m, _m, _m, _m)) + + self.menuitems = [ + ("Fig2C" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2C.py"), + ("Fig2D (35s)", "../moose-examples/paper-2015/Fig2_elecModels/Fig2D.py"), + ("Fig2E" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2E.py"), + ("Fig3B_Gssa", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), + ("Fig3C_Gsl", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), + ("Fig3D", "../moose-examples/paper-2015/Fig3_chemModels/Fig3D.py"), + ("Fig4B", "../moose-examples/paper-2015/Fig4_ReacDiff/Fig4B.py" ), + ("Fig4K", "../moose-examples/paper-2015/Fig4_ReacDiff/rxdSpineSize.py"), + ("Fig5A (20s)", "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5A.py"), + ("Fig5BCD (240s)" , "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5BCD.py"), + ("Fig6A (60s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/Fig6A.py" ), + ("ReducedModel (200s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/ReducedModel.py"), + ("Squid" , "../moose-examples/squid/squid_demo.py") + ] layout1 = QHBoxLayout() layout1.addWidget(createKineticModelButton) layout1.addWidget(loadKineticModelButton) @@ -310,10 +232,7 @@ def createPopup(self): layout5 = QHBoxLayout() layout6 = QHBoxLayout() layout7 = QHBoxLayout() - listofButtons = {} - for i in range(0,len(self.menuitems)): - k = self.menuitems.popitem(0) - t = k[0] + for i, k in enumerate( self.menuitems ): button = QPushButton(k[0]) if k[0] == "Fig2E": button.setToolTip("Illustrates loading a model from an SWC file, inserting channels, and running it") @@ -368,35 +287,44 @@ def createPopup(self): layout.addLayout(layout5,4,0) layout.addLayout(layout6,5,0) layout.addLayout(layout7,6,0) - dialog.setStyleSheet("border:1px solid rgb(0, 0, 0); ") - dialog.setLayout(layout) + self.popup.setStyleSheet("border:1px solid rgb(0, 0, 0); ") + self.popup.setLayout(layout) createKineticModelButton.clicked.connect(self.newModelDialogSlot) loadKineticModelButton.clicked.connect(self.loadModelDialogSlot) loadNeuronalModelButton.clicked.connect(self.loadModelDialogSlot) - - dialog.show() - freeCursor() - return dialog - def run_genesis_script(self,filepath,solver): - self.popup.hide() + # Create the popup and move to the middle of destop app. + qApp = QApplication.desktop() + qAppScreen = qApp.screenGeometry(); + self.popup.setGeometry((qAppScreen.bottomLeft().x()+100),(qAppScreen.bottomLeft().y()-250),100,100) + self.popup.move( qApp.availableGeometry().center() ) + self.popup.setWindowFlags( Qt.Qt.WindowStaysOnTopHint | + Qt.Qt.X11BypassWindowManagerHint # else it wont go on top. + ) + self.popup.show() + + def run_genesis_script(self, filepath, solver): + if self.popup: + self.popup.hide() abspath = os.path.abspath(filepath) directory, modulename = os.path.split(abspath) modelName = os.path.splitext(modulename)[0] - ret = loadFile(str(abspath),'%s' %(modelName),solver,merge=False) + ret = mload.loadFile(str(abspath),'%s' %(modelName),solver,merge=False) self.setPlugin("kkit", ret["model"].path) self.setCurrentView("run") widget = self.plugin.view.getSchedulingDockWidget().widget() widget.runSimulation() def run_python_script(self, filepath): + """ Execute a python script """ busyCursor() import subprocess, shlex t = os.path.abspath(filepath) directory, filename = os.path.split(t) - p = subprocess.Popen(["python", filename], cwd=directory) + logger_.info( "Executing %s" % filepath ) + p = subprocess.Popen([ sys.executable, filename], cwd=directory) p.wait() freeCursor() @@ -404,16 +332,15 @@ def quit(self): QtGui.qApp.closeAllWindows() def handleException(self, t, v, s): - """This handler will show warning messages for error exceptions. Show + """ + This handler will show warning messages for error exceptions. Show info at status bar for non-error exceptions. It will replace sys.excepthook and has the same signature (except being bound to this object). - t : exception type - - v : exception value - - s: traceback object. + t : exception type + v : exception value + s: traceback object. """ traceback.print_exception(t, v, s) @@ -422,43 +349,50 @@ def handleException(self, t, v, s): if isinstance(v, mexception.MooseInfo): self.statusBar().showMessage(title, 5000) elif isinstance(v, mexception.MooseWarning): - QtGui.QMessageBox.warning(self, title, '\n'.join((title, trace))) + QMessageBox.warning(self, title, '\n'.join((title, trace))) else: - QtGui.QMessageBox.critical(self, title, '\n'.join((title, trace))) + QMessageBox.critical(self, title, '\n'.join((title, trace))) def getPluginNames(self): - """Return pluginNames attribute or create it by retrieving + """ + Return pluginNames attribute or create it by retrieving available plugin names from plugin/list.txt file. - """ if self.pluginNames is None: - with open(os.path.join(config.MOOSE_GUI_DIR, - 'plugins', - 'list.txt')) as lfile: + pluginF = os.path.join( config.MOOSE_GUI_DIR, 'plugins', 'list.txt' ) + with open( pluginF, 'r' ) as lfile: self.pluginNames = [line.strip() for line in lfile] self.pluginNames = [name for name in self.pluginNames if name] - return self.pluginNames - def loadPluginModule(self, name, re=False): + def loadPluginModule(self, name, _reload=False): """Load a plugin module by name. First check if the plugin is already loaded. If so return the existing one. Otherwise, search load the plugin as a python module from {MOOSE_GUI_DIRECTORY}/plugins directory. - If re is True, the plugin is reloaded. + If re is True, the plugin is _reloaded. + """ - if (not re) and name in sys.modules: + logger_.info("Loading plugin '%s' from %s" % (name, config.MOOSE_PLUGIN_DIR)) + if (not _reload) and name in sys.modules: + logger_.debug( "\tThis plugin is already loaded" ) return sys.modules[name] + fp, pathname, description = imp.find_module(name, [config.MOOSE_PLUGIN_DIR]) try: module = imp.load_module(name, fp, pathname, description) - finally: - if fp: - fp.close() + except Exception as e: + module = "" + extra = traceback.format_exc() + logger_.warn( "Could not load module %s: '%s'" % (fp, extra)) + + if fp: + fp.close() return module + def getMyDockWidgets(self): """Return a list of dockwidgets that belong to the top level. This is needed to keep them separate from those @@ -467,7 +401,7 @@ def getMyDockWidgets(self): Currently we only have shell for this.""" if not hasattr(self, 'dockWidgets') or self.dockWidgets is None: self.dockWidgets = {} - dockWidget = QtGui.QDockWidget('Python') + dockWidget = QDockWidget('Python') dockWidget.setWidget(self.getShellWidget()) self.dockWidgets[dockWidget] = True self.addDockWidget(Qt.Qt.BottomDockWidgetArea, dockWidget) @@ -477,48 +411,51 @@ def getMyDockWidgets(self): self.objectEditDockWidget = dockWidget self.addDockWidget(Qt.Qt.RightDockWidgetArea, dockWidget) dockWidget.setVisible(False) - return self.dockWidgets.keys() + return list(self.dockWidgets.keys()) def getShellWidget(self): - """Create an instance of shell widget. This can be either a + """ + Create an instance of shell widget. This can be either a QSciQScintialla widget or a PyCute widget (extends QTextArea) - if the first is not available""" + if the first is not available. + """ + + # raise DeprecationWarning("ShellWidget is no longer supported.") if not hasattr(self, 'shellWidget') or self.shellWidget is None: - self.shellWidget = get_shell_class()( code.InteractiveInterpreter() - , message='MOOSE version %s' % (moose._moose.__version__) - ) + self.shellWidget = get_shell_class()( + code.InteractiveInterpreter() + , message='MOOSE version %s' % (moose._moose.__version__) + ) self.shellWidget.interpreter.runsource('from moose import *') self.shellWidget.setVisible(False) return self.shellWidget - def loadPluginClass(self, name, re=False): + def loadPluginClass(self, name, _reload=False): """Load the plugin class from a plugin module. A plugin module should have only one subclass of MoosePluginBase. Otherwise the first such class found will be loaded. """ - try: + if name in self._loadedPlugins: return self._loadedPlugins[name] - except KeyError: - pluginModule = self.loadPluginModule(name, re=re) - for classname, classobj in inspect.getmembers(pluginModule, inspect.isclass): - if issubclass(classobj, mplugin.MoosePluginBase): - self._loadedPlugins[name] = classobj - # classobj.getEditorView().getCentralWidget().editObject.connect(self.objectEditSlot) - return self._loadedPlugins[name] - raise Exception('No plugin with name: %s' % (name)) - def setPlugin(self, name, root='/'): - """Set the current plugin to use. + pluginModule = self.loadPluginModule(name, _reload=_reload) + for classname, classobj in inspect.getmembers(pluginModule, inspect.isclass): + if issubclass(classobj, mplugin.MoosePluginBase): + self._loadedPlugins[name] = classobj + return self._loadedPlugins[name] - This - + errMsg = 'No plugin found with name: %s' % name + errMsg += ". Available: '{}'".format(', '.join(self._loadedPlugins.keys())) + logger_.error(errMsg) + raise IndexError(errMsg) + def setPlugin(self, name, root='/'): + """Set the current plugin to use. 1. sets the `plugin` attribute. - 2. updates menus by clearing and reinstating menus including anything provided by the plugin. - 3. sets the current view to the plugins editor view. """ @@ -530,15 +467,13 @@ def setPlugin(self, name, root='/'): if self._loadedModels[i][0]== root: c = moose.Clock('/clock') compts = moose.wildcardFind(root+'/##[ISA=ChemCompt]') - for simdt in CHEMICAL_SIMULATION_DT_CLOCKS: + for simdt in defines.CHEMICAL_SIMULATION_DT_CLOCKS: c.tickDt[simdt] = self._loadedModels[i][3] - for plotdt in CHEMICAL_PLOT_UPDATE_INTERVAL_CLOCKS: + for plotdt in defines.CHEMICAL_PLOT_UPDATE_INTERVAL_CLOCKS: c.tickDt[plotdt] = self._loadedModels[i][4] if compts: - #setCompartmentSolver(self._loadedModels[i][0],"gsl") - mooseAddChemSolver(self._loadedModels[i][0],"gsl") - #addSolver(self._loadedModels[i][0],"gsl") + moose.mooseAddChemSolver(self._loadedModels[i][0],"gsl") else: c.tickDt[7] = self._loadedModels[i][3] c.tickDt[8] = self._loadedModels[i][4] @@ -567,8 +502,10 @@ def setPlugin(self, name, root='/'): self.setCurrentView('run') if name == 'kkit': - self.objectEditDockWidget.objectNameChanged.connect(self.plugin.getEditorView().getCentralWidget().updateItemSlot) - self.objectEditDockWidget.colorChanged.connect(self.plugin.getEditorView().getCentralWidget().updateColorSlot) + self.objectEditDockWidget.objectNameChanged.connect( + self.plugin.getEditorView().getCentralWidget().updateItemSlot) + self.objectEditDockWidget.colorChanged.connect( + self.plugin.getEditorView().getCentralWidget().updateColorSlot) self.setCurrentView('editor') freeCursor() return self.plugin @@ -578,7 +515,7 @@ def updateExistingMenu(self, menu): already exists. If so, update the same and return True. Otherwise return False. """ - if not isinstance(menu, QtGui.QMenu): + if not isinstance(menu, QMenu): return False for action in self.menuBar().actions(): if menu.title() == action.text(): @@ -600,19 +537,18 @@ def updateMenus(self): """ self.menuBar().clear() self.getPluginsMenu() - menus = [self.getFileMenu(), - self.getEditMenu(), - self.getViewMenu(), - #self.getRunMenu(), - #self.getConnectMenu(), - self.getHelpMenu()] - for menu in menus: - self.menuBar().addMenu(menu) + menus = [self.getFileMenu() + , self.getEditMenu() + , self.getViewMenu(), + self.getHelpMenu() + ] + [ self.menuBar().addMenu(menu) for menu in menus ] for menu in self.plugin.getMenus(): if not self.updateExistingMenu(menu): - if not self.menuBar().isEmpty(): - action.menu().addSeparator() + # bug: action was empty here. + #if not self.menuBar().isEmpty(): + # action.menu().addSeparator() self.menuBar().addMenu(menu) menus[0].addSeparator() menus[0].addAction(self.quitAction) @@ -624,10 +560,9 @@ def updateToolbars(self): self.toolBars.extend(self.getMyToolBars()) self.toolBars.extend(self.plugin.getToolBars()) self.toolBars.extend(self.plugin.getCurrentView().getToolBars()) - if len(self.toolBars): - for toolbar in self.toolBars: - self.addToolBar(toolbar) - toolbar.setVisible(True) + for toolbar in self.toolBars: + toolbar.setVisible(True) + self.addToolBar(toolbar) def switchSubwindowSlot(self, window): """Change view based on what subwindow `window` is activated.""" @@ -660,15 +595,15 @@ def setCurrentView(self, view): title = widget.modelRoot+'/model' #subwin.setWindowTitle('%s: %s' % (view, widget.modelRoot)) subwin.setWindowTitle('%s: %s' % (view, title)) - subwin.setSizePolicy(QtGui.QSizePolicy.Minimum | - QtGui.QSizePolicy.Expanding, - QtGui.QSizePolicy.Minimum | - QtGui.QSizePolicy.Expanding) + subwin.setSizePolicy(QSizePolicy.Minimum | + QSizePolicy.Expanding, + QSizePolicy.Minimum | + QSizePolicy.Expanding) subwin.resize(600, 400) # Make dockwidgets from other views invisible and make those # from current view visible or add them if not already part of # main window. - dockWidgets = set([dockWidget for dockWidget in self.findChildren(QtGui.QDockWidget)]) + dockWidgets = set([dockWidget for dockWidget in self.findChildren(QDockWidget)]) for dockWidget in dockWidgets: if dockWidget not in self.dockWidgets: dockWidget.setVisible(False) @@ -706,98 +641,100 @@ def getMyToolBars(self): def getFileMenu(self): if self.fileMenu is None: - self.fileMenu = QtGui.QMenu('&File') + self.fileMenu = QMenu('&File') else: self.fileMenu.clear() if not hasattr(self, 'newModelAction'): - self.newModelAction = QtGui.QAction('New', self) - self.newModelAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+N", None, QtGui.QApplication.UnicodeUTF8)) - self.connect(self.newModelAction, QtCore.SIGNAL('triggered()'), self.newModelDialogSlot) + self.newModelAction = QAction('New', self) + self.newModelAction.setShortcut("Ctrl+N") + self.newModelAction.triggered.connect(self.newModelDialogSlot) + self.fileMenu.addAction(self.newModelAction) if not hasattr(self, 'loadModelAction'): - self.loadModelAction = QtGui.QAction('L&oad model', self) - self.loadModelAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+O", None, QtGui.QApplication.UnicodeUTF8)) - self.connect(self.loadModelAction, QtCore.SIGNAL('triggered()'), self.loadModelDialogSlot) + self.loadModelAction = QAction('L&oad model', self) + self.loadModelAction.setShortcut("Ctrl+O") + self.loadModelAction.triggered.connect(self.loadModelDialogSlot) + self.fileMenu.addAction(self.loadModelAction) if not hasattr(self, 'Paper_2015'): self.menuitems = OrderedDict([ - ("Fig2C (6s)" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2C.py"), - ("Fig2D (35s)", "../moose-examples/paper-2015/Fig2_elecModels/Fig2D.py"), - ("Fig2E (5s)" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2E.py"), - ("Fig3B_Gssa (2s)", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), - ("Fig3C_Gsl (2s)", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), - ("Fig3D (1s)", "../moose-examples/paper-2015/Fig3_chemModels/Fig3D.py"), - ("Fig4B (10s)", "../moose-examples/paper-2015/Fig4_ReacDiff/Fig4B.py" ), - ("Fig4K", "../moose-examples/paper-2015/Fig4_ReacDiff/rxdSpineSize.py"), - ("Fig5A (20s)", "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5A.py"), - ("Fig5BCD (240s)" , "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5BCD.py"), - ("Fig6A (60s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/Fig6A.py" ), - ("ReducedModel (200s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/ReducedModel.py"), - ("Squid" , "../moose-examples/squid/squid_demo.py") - ]) - self.subMenu = QtGui.QMenu('Demos') + ("Fig2C (6s)" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2C.py"), + ("Fig2D (35s)", "../moose-examples/paper-2015/Fig2_elecModels/Fig2D.py"), + ("Fig2E (5s)" , "../moose-examples/paper-2015/Fig2_elecModels/Fig2E.py"), + ("Fig3B_Gssa (2s)", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), + ("Fig3C_Gsl (2s)", "../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g"), + ("Fig3D (1s)", "../moose-examples/paper-2015/Fig3_chemModels/Fig3D.py"), + ("Fig4B (10s)", "../moose-examples/paper-2015/Fig4_ReacDiff/Fig4B.py" ), + ("Fig4K", "../moose-examples/paper-2015/Fig4_ReacDiff/rxdSpineSize.py"), + ("Fig5A (20s)", "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5A.py"), + ("Fig5BCD (240s)" , "../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5BCD.py"), + ("Fig6A (60s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/Fig6A.py" ), + ("ReducedModel (200s)", "../moose-examples/paper-2015/Fig6_NetMultiscale/ReducedModel.py"), + ("Squid" , "../moose-examples/squid/squid_demo.py") + ]) + self.subMenu = QMenu('Demos') for i in range(0,len(self.menuitems)): k = self.menuitems.popitem(0) if k[0] == "Fig2C (6s)": - self.Fig2Caction = QtGui.QAction('Fig2C (6s)', self) + self.Fig2Caction = QAction('Fig2C (6s)', self) self.Fig2Caction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig2_elecModels/Fig2C.py')) self.subMenu.addAction(self.Fig2Caction) elif k[0] == "Fig2D (35s)": - self.Fig2Daction = QtGui.QAction('Fig2D (35s)', self) + self.Fig2Daction = QAction('Fig2D (35s)', self) self.Fig2Daction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig2_elecModels/Fig2D.py')) self.subMenu.addAction(self.Fig2Daction) elif k[0] == "Fig2E (5s)": - self.Fig2Eaction = QtGui.QAction('Fig2E (5s)', self) + self.Fig2Eaction = QAction('Fig2E (5s)', self) self.Fig2Eaction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig2_elecModels/Fig2E.py')) self.subMenu.addAction(self.Fig2Eaction) elif k[0] == "Fig3B_Gssa (2s)": - self.Fig3B_Gssaaction = QtGui.QAction('Fig3B_Gssa (2s)', self) + self.Fig3B_Gssaaction = QAction('Fig3B_Gssa (2s)', self) self.Fig3B_Gssaaction.triggered.connect(lambda :self.run_genesis_script('../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g',"gssa")) self.subMenu.addAction(self.Fig3B_Gssaaction) elif k[0] == "Fig3C_Gsl (2s)": - self.Fig3C_Gslaction = QtGui.QAction('Fig3C_Gsl (2s)', self) + self.Fig3C_Gslaction = QAction('Fig3C_Gsl (2s)', self) self.Fig3C_Gslaction.triggered.connect(lambda :self.run_genesis_script('../moose-examples/paper-2015/Fig3_chemModels/Fig3ABC.g',"gsl")) self.subMenu.addAction(self.Fig3C_Gslaction) elif k[0] == "Fig3D (1s)": - self.Fig3Daction = QtGui.QAction('Fig3D (1s)', self) + self.Fig3Daction = QAction('Fig3D (1s)', self) self.Fig3Daction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig3_chemModels/Fig3D.py')) self.subMenu.addAction(self.Fig3Daction) elif k[0] == "Fig4B (10s)": - self.Fig4Baction = QtGui.QAction('Fig4B (10s)', self) + self.Fig4Baction = QAction('Fig4B (10s)', self) self.Fig4Baction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig4_ReacDiff/Fig4B.py')) self.subMenu.addAction(self.Fig4Baction) elif k[0] == "Fig4K": - self.Fig4Kaction = QtGui.QAction('Fig4K', self) + self.Fig4Kaction = QAction('Fig4K', self) self.Fig4Kaction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig4_ReacDiff/rxdSpineSize.py')) self.subMenu.addAction(self.Fig4Kaction) elif k[0] == "Fig5A (20s)": - self.Fig5Aaction = QtGui.QAction('Fig5A (20s)', self) + self.Fig5Aaction = QAction('Fig5A (20s)', self) self.Fig5Aaction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5A.py')) self.subMenu.addAction(self.Fig5Aaction) elif k[0] == "Fig5BCD (240s)": - self.Fig5BCDaction = QtGui.QAction('Fig5BCD (240s)', self) + self.Fig5BCDaction = QAction('Fig5BCD (240s)', self) self.Fig5BCDaction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig5_CellMultiscale/Fig5BCD.py')) self.subMenu.addAction(self.Fig5BCDaction) elif k[0] == "Fig6A (60s)": - self.Fig6Aaction = QtGui.QAction('Fig6A (60s)', self) + self.Fig6Aaction = QAction('Fig6A (60s)', self) self.Fig6Aaction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig6_NetMultiscale/Fig6A.py')) self.subMenu.addAction(self.Fig6Aaction) elif k[0] == "ReducedModel (200s)": - self.ReducedModelaction = QtGui.QAction('ReducedModel (200s)', self) + self.ReducedModelaction = QAction('ReducedModel (200s)', self) self.ReducedModelaction.triggered.connect(lambda :self.run_python_script('../moose-examples/paper-2015/Fig6_NetMultiscale/ReducedModel.py')) self.subMenu.addAction(self.ReducedModelaction) else: - self.Squidaction = QtGui.QAction('Squid', self) + self.Squidaction = QAction('Squid', self) self.Squidaction.triggered.connect(lambda :self.run_python_script('../moose-examples/squid/squid_demo.py')) self.subMenu.addAction(self.Squidaction) self.fileMenu.addMenu(self.subMenu) if not hasattr(self,'loadedModels'): - self.loadedModelAction = QtGui.QAction('Recently Loaded Models',self) + self.loadedModelAction = QAction('Recently Loaded Models',self) self.loadedModelAction.setCheckable(False) - #self.fileMenu.addAction(QtGui.QAction(self.loadedModelAction,checkable=True)) + #self.fileMenu.addAction(QAction(self.loadedModelAction,checkable=True)) if bool(self._loadedModels): self.fileMenu.addSeparator() self.fileMenu.addAction(self.loadedModelAction) @@ -807,15 +744,16 @@ def getFileMenu(self): self.fileMenu.addSeparator() if not hasattr(self,'connectBioModelAction'): - self.connectBioModelAction = QtGui.QAction('&Connect BioModels', self) - self.connectBioModelAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+B", None, QtGui.QApplication.UnicodeUTF8)) - self.connect(self.connectBioModelAction, QtCore.SIGNAL('triggered()'), self.connectBioModel) + self.connectBioModelAction = QAction('&Connect BioModels', self) + self.connectBioModelAction.setShortcut("Ctrl+B") + self.connectBioModelAction.triggered.connect(self.connectBioModel) + self.fileMenu.addAction(self.connectBioModelAction) return self.fileMenu def getEditMenu(self): if self.editMenu is None: - self.editMenu = QtGui.QMenu('&Edit') + self.editMenu = QMenu('&Edit') else: self.editMenu.clear() #self.editMenu.addActions(self.getEditActions()) @@ -824,52 +762,24 @@ def getEditMenu(self): def getPluginsMenu(self): """Populate plugins menu if it does not exist already.""" if (not hasattr(self, 'pluginsMenu')) or (self.pluginsMenu is None): - self.pluginsMenu = QtGui.QMenu('&Plugins') + self.pluginsMenu = QMenu('&Plugins') mapper = QtCore.QSignalMapper(self) - pluginsGroup = QtGui.QActionGroup(self) + pluginsGroup = QActionGroup(self) pluginsGroup.setExclusive(True) for pluginName in self.getPluginNames(): - action = QtGui.QAction(pluginName, self) + action = QAction(pluginName, self) action.setObjectName(pluginName) action.setCheckable(True) - mapper.setMapping(action, QtCore.QString(pluginName)) - self.connect(action, QtCore.SIGNAL('triggered()'), mapper, QtCore.SLOT('map()')) + mapper.setMapping(action, pluginName) + action.triggered.connect(mapper.map) self.pluginsMenu.addAction(action) pluginsGroup.addAction(action) - self.connect(mapper, QtCore.SIGNAL('mapped(const QString &)'), self.setPlugin) - #self.pluginsMenu.addMenu(self.defaultPluginMenu) - #self.pluginsMenu.addMenu(self.kkitPluginMenu) - #self.pluginsMenu.addMenu(self.neurokitPluginMenu) - #openRootAction = self.defaultPluginMenu.addAction("/") - #openRootAction.triggered.connect(lambda : self.setPlugin("default", "/") ) - # if (not hasattr(self, 'loadedModelAction')) or (self.loadedModelAction is None) : - # self.loadedModelAction = QtGui.QAction("kkit",self) - # self.loadedModelAction.addMenu('test') - # self.pluginsMenu.addAction(self.loadedModelAction) - # self.pluginsMenu.addMenu(self.insertkkitMenu) - # self.insertMapperkkit = QtCore.QSignalMapper(self) - #insertMapperkkit,actions = self.getInsertkkitActions(self.loadedModels) - # ignored_bases = ['ZPool', 'Msg', 'Panel', 'SolverBase', 'none'] - # ignored_classes = ['ZPool','ZReac','ZMMenz','ZEnz','CplxEnzBase'] - # classlist = [ch[0].name for ch in moose.element('/classes').children - # if (ch[0].baseClass not in ignored_bases) - # and (ch[0].name not in (ignored_bases + ignored_classes)) - # and not ch[0].name.startswith('Zombie') - # and not ch[0].name.endswith('Base') - # ] - # insertMapper, actions = self.getInsertActions(classlist) - # for action in actions: - # self.insertMenu.addAction(action) - # self.connect(insertMapper, QtCore.SIGNAL('mapped(const QString&)'), self.tree.insertElementSlot) - # self.editAction = QtGui.QAction('Edit', self.treeMenu) - # self.editAction.triggered.connect(self.editCurrentObjectSlot) - # self.tree.elementInserted.connect(self.elementInsertedSlot) - # self.treeMenu.addAction(self.editAction) + mapper.mapped.connect(self.setPlugin) return self.pluginsMenu def getHelpMenu(self): if self.helpMenu is None: - self.helpMenu = QtGui.QMenu('&Help') + self.helpMenu = QMenu('&Help') else: self.helpMenu.clear() self.helpMenu.addActions(self.getHelpActions()) @@ -877,7 +787,7 @@ def getHelpMenu(self): ''' def getConnectMenu(self): if self.connectMenu is None: - self.connectMenu = QtGui.QMenu('&Connect') + self.connectMenu = QMenu('&Connect') else: self.connectMenu.clear() self.connectMenu.addActions(self.getConnectActions()) @@ -885,7 +795,7 @@ def getConnectMenu(self): ''' def getViewMenu(self): if (not hasattr(self, 'viewMenu')) or (self.viewMenu is None): - self.viewMenu = QtGui.QMenu('&View') + self.viewMenu = QMenu('&View') else: self.viewMenu.clear() self.viewMenu.addActions(self.getViewActions()) @@ -895,42 +805,7 @@ def getViewMenu(self): self.subWindowMenu.addActions(self.getSubWindowActions()) return self.viewMenu - # def getSubWindowVisibilityActions(self): - # if not hasattr(self, 'subwindowToToggles'): - # self.subWindowToToggle = QtGui.QSignalMapper() - # self.toggleToSubWindow = QtGui.QSignalMapper() - # for subwindow in self.mdiArea.subWindowList(): - # if self.subWindowToToggle.mapping(subwindow) is None: - # action = QtGui.QAction('Show: %s' % (subwindow.windowTitle), self) - # self.toggleToSubWindow.setMapping(action, subwindow) - # self.connect(action, QtCore.SIGNAL('triggered()'), - # self.toggleToSubWindow, - # QtCore.SLOT('mapped(QWidget*)')) - # self.subWindowToToggle.setMapping(subwindow, action) - # self.connect(subwindow, QtCore.SIGNAL('closed()') - - # self.subWindowVisibilityMenu = QtGui.Q - # for subwin in self.mdiArea.subWindowList(): - - # Removed from the menu - # def getRunMenu(self): - # if (not hasattr(self, 'runMenu')) or (self.runMenu is None): - # self.runMenu = QtGui.QMenu('&Run') - # else: - # self.runMenu.clear() - # self.runMenu.addActions(self.getRunActions()) - # return self.runMenu - def getEditActions(self): - - # self.editActions = [] - # if (not hasattr(self, 'editActions')) or (self.editActions is None): - # self.setModelRootAction = QtGui.QAction('&Set model root', self) - # self.setModelRootAction.triggered.connect(self.showSetModelRootDialog) - # self.setDataRootAction = QtGui.QAction('Set &data root', self) - # self.setDataRootAction.triggered.connect(self.showSetDataRootDialog) - # self.editActions = [self.setModelRootAction, self.setDataRootAction] - # return self.editActions return None def showSetModelRootDialog(self): @@ -944,7 +819,10 @@ def showSetModelRootDialog(self): subwin.setWindowTitle(root) def showSetDataRootDialog(self): - root, ok = QtGui.QInputDialog.getText(self, 'Data Root', 'Enter the data root path:', text=moose.element(self.plugin.dataRoot).path) + root, ok = QtGui.QInputDialog.getText( + self, 'Data Root', 'Enter the data root path:' + , text=moose.element(self.plugin.dataRoot).path + ) if not ok: return root = str(root) #convert from QString to python str @@ -952,34 +830,35 @@ def showSetDataRootDialog(self): for subwin in self.mdiArea.subWindowList(): if hasattr(subwin.widget(), 'dataRoot'): subwin.setWindowTitle(root) + return def getViewActions(self): if (not hasattr(self, 'viewActions')) or (self.viewActions is None): - self.editorViewAction = QtGui.QAction('&Editor view', self) + self.editorViewAction = QAction('&Editor view', self) self.editorViewAction.triggered.connect(self.openEditorView) - #self.plotViewAction = QtGui.QAction('&Plot view', self) + #self.plotViewAction = QAction('&Plot view', self) #self.plotViewAction.triggered.connect(self.openPlotView) - self.runViewAction = QtGui.QAction('&Run view', self) + self.runViewAction = QAction('&Run view', self) self.runViewAction.triggered.connect(self.openRunView) #self.viewActions = [self.editorViewAction, self.plotViewAction, self.runViewAction] self.viewActions = [self.editorViewAction, self.runViewAction] return self.viewActions def setTabbedView(self): - self.mdiArea.setViewMode(QtGui.QMdiArea.TabbedView) + self.mdiArea.setViewMode(QMdiArea.TabbedView) def setSubWindowView(self): - self.mdiArea.setViewMode(QtGui.QMdiArea.SubWindowView) + self.mdiArea.setViewMode(QMdiArea.SubWindowView) def getSubWindowActions(self): if not hasattr(self, 'subWindowActions') or self.subWindowActions is None: - self.tabbedViewAction = QtGui.QAction('&Tabbed view', self) + self.tabbedViewAction = QAction('&Tabbed view', self) self.tabbedViewAction.triggered.connect(self.setTabbedView) - self.subWindowViewAction = QtGui.QAction('&SubWindow view', self) + self.subWindowViewAction = QAction('&SubWindow view', self) self.subWindowViewAction.triggered.connect(self.setSubWindowView) - self.tileSubWindowsAction = QtGui.QAction('Ti&le subwindows', self) + self.tileSubWindowsAction = QAction('Ti&le subwindows', self) self.tileSubWindowsAction.triggered.connect(self.mdiArea.tileSubWindows) - self.cascadeSubWindowsAction = QtGui.QAction('&Cascade subwindows', self) + self.cascadeSubWindowsAction = QAction('&Cascade subwindows', self) self.cascadeSubWindowsAction.triggered.connect(self.mdiArea.cascadeSubWindows) self.subWindowActions = [self.tabbedViewAction, self.subWindowViewAction, @@ -992,39 +871,22 @@ def getDockWidgetsToggleActions(self): widgets """ - return [widget.toggleViewAction() for widget in self.findChildren(QtGui.QDockWidget)] - # Removed form the menu item - # def getRunActions(self): - # if (not hasattr(self, 'runActions')) or \ - # (self.runActions is None): - # self.startAction = QtGui.QAction('Start', self) - # self.startAction.triggered.connect(self.resetAndStartSimulation) - # self.pauseAction = QtGui.QAction('Pause', self) - # self.pauseAction.triggered.connect(self.pauseSimulation) - # self.continueAction = QtGui.QAction('Continue', self) - # self.continueAction.triggered.connect(self.continueSimulation) - # self.runActions = [self.startAction, self.pauseAction, self.continueAction] - # return self.runActions + return [widget.toggleViewAction() for widget in self.findChildren(QDockWidget)] def getHelpActions(self): if (not hasattr(self, 'helpActions')) or (self.helpActions is None): - self.actionAbout = QtGui.QAction('About MOOSE', self) - self.connect(self.actionAbout, QtCore.SIGNAL('triggered()'), self.showAboutMoose) - self.actionBuiltInDocumentation = QtGui.QAction('Built-in documentation', self) - self.connect(self.actionBuiltInDocumentation, QtCore.SIGNAL('triggered()'), self.showBuiltInDocumentation) - self.actionGuiBug = QtGui.QAction('Report gui bug', self) - self.connect(self.actionGuiBug, QtCore.SIGNAL('triggered()'), self.reportGuiBug) - self.actionCoreBug = QtGui.QAction('Report core bug', self) - self.connect(self.actionCoreBug, QtCore.SIGNAL('triggered()'), self.reportCoreBug) - self.helpActions = [self.actionAbout, self.actionBuiltInDocumentation, self.actionCoreBug,self.actionGuiBug] + self.actionAbout = QAction('About MOOSE', self) + self.actionAbout.triggered.connect(self.showAboutMoose) + self.actionBuiltInDocumentation = QAction('Built-in documentation', self) + self.actionBuiltInDocumentation.triggered.connect(self.showBuiltInDocumentation) + self.actionGuiBug = QAction('Report gui bug', self) + self.actionGuiBug.triggered.connect(self.reportGuiBug) + self.actionCoreBug = QAction('Report pymoose bug', self) + self.actionCoreBug.triggered.connect(self.reportCoreBug) + self.helpActions = [self.actionAbout, self.actionBuiltInDocumentation + , self.actionCoreBug,self.actionGuiBug] return self.helpActions - # Removed from the main menu item replace with File menu - # def getConnectActions(self): - # if(not hasattr(self,'connectActions')) or(self.connectActions is None): - # self.actionBioModel = QtGui.QAction('BioModels',self) - # self.connect(self.actionBioModel, QtCore.SIGNAL('triggered()'), self.connectBioModel) - # self.connectActions = [self.actionBioModel] - # return self.connectActions + def connectBioModel(self): connecttoBioModel = BioModelsClientWidget() @@ -1035,7 +897,7 @@ def connectBioModel(self): head, fileName = os.path.split(filepath) modelName = os.path.splitext(fileName)[0] pwe = moose.getCwe() - ret = loadFile(str(filepath), '/model/%s' % (modelName), merge=False) + ret = mload.loadFile(str(filepath), '/model/%s' % (modelName), merge=False) self.objectEditSlot('/',False) pluginLookup = '%s/%s' % (ret['modeltype'], ret['subtype']) try: @@ -1060,40 +922,22 @@ def connectBioModel(self): def showAboutMoose(self): - with open(config.MOOSE_ABOUT_FILE, 'r') as aboutfile: - QtGui.QMessageBox.about(self, 'About MOOSE', ''.join(aboutfile.readlines())) + about = "

MOOSE simulator

" + about += 'MOOSE Website' + about += "

VERSION " + moose.__version__ + "

" + QMessageBox.about(self, 'About MOOSE', about ) - def showDocumentation(self, source): + def showDocumentation(self): QtGui.QDesktopServices.openUrl(QtCore.QUrl(config.MOOSE_DOC_URL)) - ''' - if not hasattr(self, 'documentationViewer'): - self.documentationViewer = QtGui.QTextBrowser() - self.documentationViewer.setOpenLinks(True) - self.documentationViewer.setOpenExternalLinks(True) - #print " path ",config.settings[config.KEY_DOCS_DIR], os.path.join(config.settings[config.KEY_DOCS_DIR], 'html'), os.path.join(config.settings[config.KEY_DOCS_DIR], 'images') - self.documentationViewer.setSearchPaths([config.settings[config.KEY_DOCS_DIR], - os.path.join(config.settings[config.KEY_DOCS_DIR], 'html'), - os.path.join(config.settings[config.KEY_DOCS_DIR], 'images')]) - self.documentationViewer.setMinimumSize(800, 480) - self.documentationViewer.setSource(QtCore.QUrl(source)) - result = self.documentationViewer.loadResource(QtGui.QTextDocument.HtmlResource, self.documentationViewer.source()) - if not result.isValid(): - QtGui.QMessageBox.warning(self, 'Could not access documentation', 'The link %s could not be accessed' % (source)) - return - self.documentationViewer.setWindowTitle(source) - self.documentationViewer.reload() - self.documentationViewer.setVisible(True) - ''' + def reportGuiBug(self): QtGui.QDesktopServices.openUrl(QtCore.QUrl(config.MOOSE_GUI_BUG_URL)) + def reportCoreBug(self): QtGui.QDesktopServices.openUrl(QtCore.QUrl(config.MOOSE_CORE_BUG_URL)) - ''' - def reportBug(self): - QtGui.QDesktopServices.openUrl(QtCore.QUrl(config.MOOSE_REPORT_BUG_URL)) - ''' + def showBuiltInDocumentation(self): - self.showDocumentation('moose_builtins.html') + self.showDocumentation( ) # openEditorView, openPlotView and openRunView are identical # except the view they ask from the plugin. Consider using a @@ -1149,6 +993,7 @@ def resetAndStartSimulation(self): def pauseSimulation(self): moose.stop() + ''' def continueSimulation(self): """TODO implement this somewhere else""" @@ -1158,10 +1003,10 @@ def continueSimulation(self): simtime = 1.0 moose.start(simtime) ''' - #Harsha: added visible=True so that loadModelDialogSlot and NewModelDialogSlot call this function - # to clear out object path + def objectEditSlot(self, mobj, visible=True): """Slot for switching the current object in object editor.""" + logger_.debug("objectEditSlot is called: dropped event") self.objectEditDockWidget.setObject(mobj) self.objectEditDockWidget.setVisible(visible) @@ -1171,8 +1016,6 @@ def objectEditSlot(self, mobj, visible=True): def loadedModelsAction(self,modelPath,pluginName): - #Harsha: added under file Menu, Recently Loaded Models - #All the previously loaded chemical models, solver's and table's ticks are made -1 for model in self._loadedModels: self.disableModel(model[0]) @@ -1185,16 +1028,12 @@ def loadedModelsAction(self,modelPath,pluginName): if compt: self.simulationdt = c.tickDt[11] self.plotdt = c.tickDt[16] - #index = [(ind, self._loadedModels[ind].index(modelPath)) for ind in xrange(len(self.loadedModels)) if item in self._loadedModels[ind]] - # for i,j in enumerate(self._loadedModels): - # if j[0] == modelPath: - # #del(self._loadedModels[i]) - # pass - # break - self._loadedModels.append([modelPath,pluginName,action,self.simulationdt,self.plotdt]) - if len(self._loadedModels)>5: - self._loadedModels.pop(0) + self._loadedModels.append( + [ modelPath,pluginName,action,self.simulationdt,self.plotdt ] + ) + if len(self._loadedModels) > 5: + self._loadedModels.pop( 0 ) def disableModel(self, modelPath): compt = moose.wildcardFind(modelPath + '/##[ISA=ChemCompt]') @@ -1289,9 +1128,9 @@ def displaymodelInfo(self,ret): noOfEnz = len(moose.wildcardFind(ret['model'].path+'/##[ISA=EnzBase]')) noOfStimtab = len(moose.wildcardFind(ret['model'].path+'/##[ISA=StimulusTable]')) - reply = QtGui.QMessageBox.information(self,"Model Info","Model has : \n %s Compartment \t \n %s Group \t \n %s Pool \t \n %s Function \t \n %s reaction \t \n %s Enzyme \t \n %s StimulusTable" %(noOfCompt, grp, noOfPool, noOfFunc, noOfReac, noOfEnz, noOfStimtab)) - if reply == QtGui.QMessageBox.Ok: - QtGui.QApplication.restoreOverrideCursor() + reply = QMessageBox.information(self,"Model Info","Model has : \n %s Compartment \t \n %s Group \t \n %s Pool \t \n %s Function \t \n %s reaction \t \n %s Enzyme \t \n %s StimulusTable" %(noOfCompt, grp, noOfPool, noOfFunc, noOfReac, noOfEnz, noOfStimtab)) + if reply == QMessageBox.Ok: + QApplication.restoreOverrideCursor() return def checkPlugin(self,dialog): @@ -1300,8 +1139,8 @@ def checkPlugin(self,dialog): modelName = dialog.getTargetPath() if '/' in modelName: raise mexception.ElementNameError('Model name cannot contain `/`') - ret = loadFile(str(fileName),'%s' %(modelName),merge=False) - #ret = loadFile(str(fileName), '/model/%s' % (modelName), merge=False) + ret = mload.loadFile(str(fileName),'%s' %(modelName),merge=False) + #ret = mload.loadFile(str(fileName), '/model/%s' % (modelName), merge=False) #This will clear out object editor's objectpath and make it invisible self.objectEditSlot('/',False) #if subtype is None, in case of cspace then pluginLookup = /cspace/None @@ -1325,23 +1164,23 @@ def dialog_check(self,ret): if pluginName == 'kkit': if (ret['subtype'] == 'sbml' and ret['foundlib'] == False): - reply = QtGui.QMessageBox.question(self, "python-libsbml is not found.","\n Read SBML is not possible.\n This can be installed using \n \n pip python-libsbml or \n apt-get install python-libsbml", - QtGui.QMessageBox.Ok) - if reply == QtGui.QMessageBox.Ok: - QtGui.QApplication.restoreOverrideCursor() + reply = QMessageBox.question(self, "python-libsbml is not found.","\n Read SBML is not possible.\n This can be installed using \n \n pip python-libsbml or \n apt-get install python-libsbml", + QMessageBox.Ok) + if reply == QMessageBox.Ok: + QApplication.restoreOverrideCursor() return valid, ret else: if ret['loaderror'] != "": - reply = QtGui.QMessageBox.question(self, "Model can't be loaded", ret['loaderror']+" \n \n Do you want another file", - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + reply = QMessageBox.question(self, "Model can't be loaded", ret['loaderror']+" \n \n Do you want another file", + QMessageBox.Yes | QMessageBox.No) + if reply == QMessageBox.Yes: dialog = LoaderDialog(self,self.tr('Load model from file')) if dialog.exec_(): pluginName = None ret,pluginName = self.checkPlugin(dialog) valid,ret = self.dialog_check(ret) else: - QtGui.QApplication.restoreOverrideCursor() + QApplication.restoreOverrideCursor() return valid,ret else: valid = True @@ -1358,14 +1197,7 @@ def newModelDialogSlot(self): raise mexception.ElementNameError('Model path cannot be empty') if re.search('[ /]',modelPath) is not None: raise mexception.ElementNameError('Model path should not containe / or whitespace') - #plugin = str(newModelDialog.submenu.currentText()) plugin = str(newModelDialog.getcurrentRadioButton()) - #Harsha: All model will be forced to load/build under /model, - #2014 sep 10: All the model will be forced to load/build model under /modelName/model - ''' - modelContainer = moose.Neutral('/model') - modelRoot = moose.Neutral('%s/%s' % (modelContainer.path, modelPath)) - ''' if moose.exists(modelPath+'/model'): moose.delete(modelPath) @@ -1379,34 +1211,4 @@ def newModelDialogSlot(self): modelAnno.dirpath = " " self.loadedModelsAction(modelRoot.path,plugin) self.setPlugin(plugin, modelRoot.path) - #Harsha: This will clear out object editor's objectpath and make it invisible self.objectEditSlot('/', False) - -def main(): - # create the GUI application - app = QtGui.QApplication(sys.argv) - QtGui.qApp = app - #icon = QtGui.QIcon(os.path.join(config.KEY_ICON_DIR,'moose_icon.png')) - #app.setWindowIcon(icon) - # instantiate the main window - #moose.loadModel('../Demos/Genesis_files/Kholodenko.g','/kho') - mWindow = MWindow() - mWindow.setWindowState(QtCore.Qt.WindowMaximized) - sys.excepthook = mWindow.handleException - # show it - mWindow.show() - # start the Qt main loop execution, exiting from this script - #http://code.google.com/p/subplot/source/browse/branches/mzViewer/PyMZViewer/mpl_custom_widget.py - #http://eli.thegreenplace.net/files/prog_code/qt_mpl_bars.py.txt - #http://lionel.textmalaysia.com/a-simple-tutorial-on-gui-programming-using-qt-designer-with-pyqt4.html - #http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg13241.html - # with the same return code of Qt application - config.settings[config.KEY_FIRSTTIME] = 'False' # string not boolean - sys.exit(app.exec_()) - - -if __name__ == '__main__': - main() - -# -# mgui.py ends here diff --git a/MdiArea.py b/moosegui/MdiArea.py similarity index 76% rename from MdiArea.py rename to moosegui/MdiArea.py index 005bf7c..d13cbf6 100644 --- a/MdiArea.py +++ b/moosegui/MdiArea.py @@ -1,10 +1,12 @@ -from PyQt4 import Qt, QtCore, QtGui -from PyQt4.QtGui import * +from PyQt5.QtGui import QImage, QPainter, QColor, QBrush +from PyQt5.QtWidgets import QMdiArea +from PyQt5 import QtCore import os -APPLICATION_BACKGROUND_PATH = os.path.join( os.path.dirname(os.path.realpath(__file__)) - , "icons/moose_icon_large.png" - ) +APPLICATION_BACKGROUND_PATH = os.path.join( + os.path.dirname(os.path.realpath(__file__)) + , "icons/moose_icon_large.png" + ) class MdiArea(QMdiArea): diff --git a/moosegui/PlotWidgetContainer.py b/moosegui/PlotWidgetContainer.py new file mode 100644 index 0000000..c534469 --- /dev/null +++ b/moosegui/PlotWidgetContainer.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +__author__ = "Aviral Goel" +__credits__ = ["Upi Lab"] +__license__ = "GPL3" +__maintainer__ = "Aviral Goel", "HarshaRani" +__email__ = "goel.aviral@gmail.com" + +from PyQt5 import QtCore +from PyQt5.QtWidgets import QWidget, QSizePolicy +from PyQt5.QtWidgets import QVBoxLayout +from PyQt5.QtWidgets import QScrollArea +from PyQt5.QtWidgets import QSplitter + +# MOOSE gui +from moosegui import sidebar + +# MOOSE +import moose + +ELECTRICAL = 0 +CHEMICAL = 1 + +class PlotWidgetContainer(QWidget): + + def __init__(self, modelRoot, *args, **kwargs): + super(PlotWidgetContainer, self).__init__(*args) + self.modelRoot = modelRoot + if len(moose.wildcardFind(modelRoot + "/##[ISA=ChemCompt]")) == 0: + self.modelType = ELECTRICAL + else: + self.modelType = CHEMICAL + + self.model = moose.element(self.modelRoot) + if self.modelRoot != "/": + self.modelRoot = self.findModelPath(self.modelRoot) + if moose.exists(modelRoot + "/data"): + self.data = moose.element(self.modelRoot + "/data") + else: + self.data = moose.Neutral(self.modelRoot + "/data") + else: + self.data = moose.element("/data") + + self._layout = QVBoxLayout() + self.graphs = QSplitter() + self.graphs.setOrientation(QtCore.Qt.Vertical) + self.graphsArea = QScrollArea() + self.rowIndex = 0 + self.graphs.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding) + self.setAcceptDrops(True) + self.graphsArea.setWidget(self.graphs) + self.graphsArea.setWidgetResizable(True) + self.graphWidgets = [] + self._layout.addWidget(self.graphsArea) + self.setLayout(self._layout) + + for graph in self.data.children: + self.addPlotWidget(graph = graph) + + if len(self.data.children) == 0: + self.addPlotWidget() + + def mooseIsInstance(self,element, classNames): + return moose.element(element).__class__.__name__ in classNames + + + def findModelPath(self,element): + child = element + while not self.mooseIsInstance(element, "Shell"): + child = moose.element(element).path + element = moose.element(element).parent + return child + + def deleteWidget(self, graphWidget): + # print("Deleted => ", graphWidget) + self.graphWidgets.remove(graphWidget) + graphWidget.setParent(None) + graphWidget.close() + + def createMenuBar(self): + bar = sidebar.sidebar() + bar.addAction(sidebar.add_graph_action(bar, lambda event: self.addPlotWidget() )) + return bar + + def addPlotWidget(self, row = None, col = 0, graph = None): + if graph == None: + graph = moose.Neutral(self.data.path + "/graph_" + str(self.rowIndex)) + + + if row == None: + row = self.rowIndex + + #if self.modelType == ELECTRICAL: + # for axes in list(widget.canvas.axes.values()): + # axes.set_ylim(bottom = -0.07, top= 0.03) + + # FIXME: + # Has been removed? See #23 + # widget = default.PlotWidget(self.model, graph, self.rowIndex, self) + ## self.graphs.addWidget(widget) + ## self.rowIndex += 1 + ## self.graphWidgets.append(widget) + ## widget.widgetClosedSignal.connect(self.deleteWidget) + ## widget.addGraph.connect(lambda event : self.addPlotWidget()) + ## return widget + + def showPlotView(self): + pass + + def setModelRoot(self, *args): + pass + + def getMenus(self, *args): + return [] + + def setDataRoot(self, *args): + pass + + def updatePlots(self): + for graphWidget in self.graphWidgets: + graphWidget.updatePlots() + + def rescalePlots(self): + for graphWidget in self.graphWidgets: + graphWidget.rescalePlots() + + def extendXAxes(self, xlim): + for graphWidget in self.graphWidgets: + graphWidget.extendXAxes(xlim) + + def plotAllData(self): + for graphWidget in self.graphWidgets: + graphWidget.plotAllData() diff --git a/RunWidget.py b/moosegui/RunWidget.py similarity index 81% rename from RunWidget.py rename to moosegui/RunWidget.py index dd78a2f..e9ce380 100644 --- a/RunWidget.py +++ b/moosegui/RunWidget.py @@ -1,13 +1,12 @@ - # -*- coding: utf-8 -*- -from __future__ import print_function -"""Sidebar for plugins. The sidebar comprises of actions. +""" +Sidebar for plugins. The sidebar comprises of actions. Currently mode, connect and settings are defined. + """ __author__ = "Aviral Goel" -__credits__ = ["Upi Lab"] __license__ = "GPL3" __version__ = "1.0.0" __maintainer__ = "Aviral Goel" @@ -17,21 +16,25 @@ import sys import os -import SettingsDialog -from PyQt4 import QtGui, Qt -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QScrollArea -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QSplitter + +from PyQt5.QtWidgets import QScrollArea +from PyQt5.QtWidgets import QGridLayout +from PyQt5.QtWidgets import QSplitter +from PyQt5.QtWidgets import QWidget + +from moosegui import SettingsDialog class RunWidget(QSplitter): + """ Run view """ def __init__(self, modelRoot, *args, **kwargs): super(RunWidget, self).__init__(None) self.modelRoot = modelRoot + self.topWidget = QWidget() layout = QGridLayout() - self.setLayout(layout) + self.topWidget.setLayout(layout) self.plotWidgetContainer = None + def setChildWidget(self, widget, wrap, row, col, rowspan = 1, colspan = 1): if wrap: scrollArea = QScrollArea() diff --git a/SettingsDialog.py b/moosegui/SettingsDialog.py similarity index 52% rename from SettingsDialog.py rename to moosegui/SettingsDialog.py index bd6ce56..f565e0a 100644 --- a/SettingsDialog.py +++ b/moosegui/SettingsDialog.py @@ -1,8 +1,7 @@ - # -*- coding: utf-8 -*- -from __future__ import print_function -"""Dialog for settings. Currently only plot settings are supported +""" +Dialog for settings. Currently only plot settings are supported """ __author__ = "Aviral Goel" @@ -15,13 +14,12 @@ import sys -import os -from PyQt4 import QtGui, Qt -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QLabel -from PyQt4.QtGui import QComboBox -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QTabWidget +from PyQt5 import Qt +from PyQt5.QtWidgets import QWidget +from PyQt5.QtWidgets import QLabel +from PyQt5.QtWidgets import QComboBox +from PyQt5.QtWidgets import QGridLayout +from PyQt5.QtWidgets import QTabWidget class SettingsWidget(QTabWidget): def __init__( self @@ -40,7 +38,7 @@ def plotSettingsPage(self): layout = QGridLayout() page.setLayout(layout) index = 0 - for key, values in self.plotFieldMap.iteritems() : + for key, values in list(self.plotFieldMap.items()) : label = QLabel(key, page) combo = QComboBox(page) for value in values: @@ -50,32 +48,21 @@ def plotSettingsPage(self): index += 1 return page - # combo.move(50, 50) - # self.lbl.move(50, 150) - - # combo.activated[str].connect(self.onActivated) - - # self.setGeometry(300, 300, 300, 200) - # self.setWindowTitle('QtGui.QComboBox') - # self.show() - - def main(): - app = QtGui.QApplication(sys.argv) - window = QtGui.QMainWindow() + from PyQt5.QtWidgets import QApplication + app = QApplication(sys.argv) dialog = SettingsWidget({ - 'LeakyIaF':['Vm'], - 'Compartment':['Vm','Im'], - 'HHChannel':['Ik','Gk'], - 'ZombiePool':['n','conc'], - 'ZombieBufPool':['n','conc'], - 'HHChannel2D':['Ik','Gk'], - 'CaConc':['Ca'] - } - ) + 'LeakyIaF':['Vm'], + 'Compartment':['Vm','Im'], + 'HHChannel':['Ik','Gk'], + 'ZombiePool':['n','conc'], + 'ZombieBufPool':['n','conc'], + 'HHChannel2D':['Ik','Gk'], + 'CaConc':['Ca'] + } + ) dialog.show() sys.exit(app.exec_()) - if __name__ == "__main__": main() diff --git a/moosegui/TooltipInfo.py b/moosegui/TooltipInfo.py new file mode 100644 index 0000000..538e06d --- /dev/null +++ b/moosegui/TooltipInfo.py @@ -0,0 +1,29 @@ +"""TooltipInfo.py: + +Keeps all TooltipInfo here. + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import sys +import os + +tooltip_info_dict_ = { + "CubeMesh": "Cubical compartment", + "CylMesh": "Cylinderical compartment", + "Pool": "A Pool is a collection of molecules of a given species in a given cellular compartment.\n It can undergo reactions that convert it into other pool(s). \nParameters: initConc (Initial concentration), diffConst (diffusion constant). Variable: conc (Concentration)", + "BufPool": "A BufPool is a buffered pool. \nIt is a collection of molecules of a given species in a given cellular compartment, that are always present at the same concentration.\n This is set by the initConc parameter. \nIt can undergo reactions in the same way as a pool.", + "Function": "A Func computes an arbitrary mathematical expression of one or more input concentrations of Pools. The output can be used to control the concentration of another Pool, or as an input to another Func", + "StimulusTable": "A StimulusTable stores an array of values that are read out during a simulation, and typically control the concentration of one of the pools in the model. \nParameters: size of table, values of entries, start and stop times, and an optional loopTime that defines the period over which the StimulusTable should loop around to repeat its values", + "Reac": "A Reac is a chemical reaction that converts substrates into products, and back. \nThe rates of these conversions are specified by the rate constants Kf and Kb respectively.", + "MMenz": "An MMenz is the Michaelis-Menten version of an enzyme activity of a given Pool.\n The MMenz must be created on a pool and can only catalyze a single reaction with a specified substrate(s). \nIf a given enzyme species can have multiple substrates, then multiple MMenz activites must be created on the parent Pool. \nThe rate of an MMenz is V [S].[E].kcat/(Km + [S]). There is no enzyme-substrate complex. Parameters: Km and kcat.", + "Enz": "An Enz is an enzyme activity of a given Pool. The Enz must be created on a pool and can only catalyze a single reaction with a specified substrate(s). \nIf a given enzyme species can have multiple substrates, then multiple Enz activities must be created on the parent Pool. \nThe reaction for an Enz is E + S <===> E.S ---> E + P. \nThis means that a new Pool, the enzyme-substrate complex E.S, is always formed when you create an Enz. \nParameters: Km and kcat, or alternatively, K1, K2 and K3. Km = (K2+K3)/K1" +} diff --git a/moosegui/__init__.py b/moosegui/__init__.py new file mode 100644 index 0000000..04710fb --- /dev/null +++ b/moosegui/__init__.py @@ -0,0 +1,3 @@ +from __future__ import print_function, division, absolute_import +import matplotlib +# matplotlib.use('Qt5Agg') diff --git a/moosegui/__main__.py b/moosegui/__main__.py new file mode 100644 index 0000000..24031be --- /dev/null +++ b/moosegui/__main__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +def main(): + import moosegui.mgui + moosegui.mgui.main() + +if __name__ == '__main__': + main() diff --git a/biomodelsclient.py b/moosegui/biomodelsclient.py similarity index 79% rename from biomodelsclient.py rename to moosegui/biomodelsclient.py index 6a24ba2..a7c2bf8 100644 --- a/biomodelsclient.py +++ b/moosegui/biomodelsclient.py @@ -1,6 +1,4 @@ -# biomodelsclient.py --- -# -# Filename: biomodelsclient.py +# -*- coding: utf-8 -*- # Description: # Author: Subhasis Ray # Maintainer: @@ -9,83 +7,45 @@ # Last-Updated: Wed Dec 11 15:47:32 2010 (+0530) # By: # Update #: -# URL: -# Keywords: -# Compatibility: -# -# -# Commentary: -# -# This is a client for Biomodels database SOAP service. -# It imitates the SOAP client written in JAVA -# availabele at biomodels website. +import os +import pickle +import moose -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# -# Code: +from PyQt5.Qt import Qt +from PyQt5 import QtCore, QtGui +from PyQt5.QtWidgets import QDialog, QWidget +from moosegui import config from suds.client import Client from suds.transport.http import HttpTransport as SudsHttpTransport -import os -import config -import pickle -import moose BIOMODELS_WSDL_URI = 'http://www.ebi.ac.uk/biomodels-main/services/BioModelsWebServices?wsdl' proxyOpts = dict() -for k,v in {'http':'http_proxy','https':'https_proxy'}.items(): - if os.environ.has_key(v): +for k,v in list({'http':'http_proxy','https':'https_proxy'}.items()): + if v in os.environ: httpProxy = os.environ[v].replace('http://', '') proxyOpts[k] = httpProxy[0:httpProxy.rfind('/',0,len(httpProxy))] - elif os.environ.has_key(v.upper()): + elif v.upper() in os.environ: HttpProxy = os.environ[v.upper()].replace('http://', '') proxyOpts[k] = HttpProxy[0:HttpProxy.rfind('/',0,len(HttpProxy))] -''' -class HttpTransport(SudsHttpTransport): - """HttpTransport which properly obeys the ``*_proxy`` environment variables.""" - def u2handlers(self): - return [] -''' class BioModelsClient(Client): def __init__(self, WSDL_URI=BIOMODELS_WSDL_URI): - """Initialize the client with the available queries listed in - the WSDL file. All the queries can be executed using the following syntax: - - client.service.queryToBeExecuted() - """ - try: - Client.__init__(self, WSDL_URI,proxy=proxyOpts) - #Client.__init__(self, WSDL_URI,transport=HttpTransport()) - except Exception, e: - print e + """Initialize the client with the available queries listed in + the WSDL file. All the queries can be executed using the following syntax: + + client.service.queryToBeExecuted() + """ + try: + Client.__init__(self, WSDL_URI,proxy=proxyOpts) + except Exception as e: + print(e) -from PyQt4.Qt import Qt -from PyQt4 import QtCore, QtGui -class BioModelsClientWidget(QtGui.QDialog): +class BioModelsClientWidget(QDialog): """This is a widget with a Biomodels Client. It provides simple access to the biomodel queries and gives the user a view of the results""" @@ -102,10 +62,10 @@ class BioModelsClientWidget(QtGui.QDialog): ('Model Ids by Publication', 'getModelsIdByPublication'), ('Model Ids by Taxonomy', 'getModelsIdByTaxonomy'),] def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + QWidget.__init__(self, parent) self.setWindowTitle('Connect to BioModels') - self.client = BioModelsClient() - self.queryPanel = QtGui.QWidget(self) + self.client = BioModelsClient() + self.queryPanel = QWidget(self) self.queryModelLabel = QtGui.QLabel('Get ', self.queryPanel) self.queryModelCombo = QtGui.QComboBox(self.queryPanel) self.queryLineEdit = QtGui.QLineEdit(self.queryPanel) @@ -125,7 +85,7 @@ def __init__(self, parent=None): layout.addWidget(self.queryPanel) layout.addWidget(self.resultsPanel) - self.queryPanel1 = QtGui.QWidget(self) + self.queryPanel1 = QWidget(self) self.importButton = QtGui.QPushButton('Import',self.queryPanel1) self.importButton.setEnabled(False) self.closeButton = QtGui.QPushButton('Close',self.queryPanel1) @@ -139,8 +99,8 @@ def __init__(self, parent=None): self.setupActions() self.client.set_options(proxy=proxyOpts) - # TODO: - # proxy = [ can be set using set_option(proxy={'http':'proxyhost:port', ...}) function + # TODO: + # proxy = [ can be set using set_option(proxy={'http':'proxyhost:port', ...}) function def setupActions(self): self.connect(self.queryLineEdit, QtCore.SIGNAL('returnPressed()'), self.runQuery) @@ -156,7 +116,7 @@ def downloadModel(self): """ If user select multi row, only data from currentRow is downloaded and loaded into moose """ selectedRow = self.resultsPanel.currentRow() modelId = self.resultsPanel.item(selectedRow, 0).text() - modelSBML = unicode(self.client.service.getModelSBMLById(modelId)).encode("utf-8") + modelSBML = str(self.client.service.getModelSBMLById(modelId)).encode("utf-8") self.filePath = os.path.join(config.settings[config.KEY_LOCAL_DEMOS_DIR], str(modelId)+'.xml') f = open(str(self.filePath), 'w') f.write(modelSBML) @@ -181,7 +141,7 @@ def getTargetPath(self): return str(self.filePath) def runQuery(self): - print 'Running query .....' + print('Running query .....') #self.resultsPanel.cellClicked.connect(self.enableDownload) progressDialog = QtGui.QProgressDialog() progressDialog.setLabelText('Retrieving data from BioModels Database') @@ -237,7 +197,7 @@ def runQuery(self): progressDialog.setValue(r) if progressDialog.wasCanceled(): return 0 - name = unicode(self.client.service.getModelNameById(item)).encode("utf-8") + name = str(self.client.service.getModelNameById(item)).encode("utf-8") r = r+1 pickleResult.update({item:name}) updatepickleFile = True @@ -253,12 +213,12 @@ def runQuery(self): pickleResult = {} pickleResult[argument] = name; - except KeyError, e: - print 'A KeyError - "%s"' % str(e) ,' not found in ',filename + except KeyError as e: + print(('A KeyError - "%s"' % str(e) ,' not found in ',filename)) QtGui.QMessageBox.critical(None, "BioModels Database"," The Id "+ str(e) +" not found in "+ filename,QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default,QtGui.QMessageBox.NoButton) display = False if display: - for value,name in pickleResult.items(): + for value,name in list(pickleResult.items()): self.resultsPanel.insertRow(row) item = QtGui.QTableWidgetItem(self.tr(value)) item.setFlags(item.flags() & ~Qt.ItemIsEditable) @@ -273,7 +233,7 @@ def runQuery(self): if progressDialog: progressDialog.close() #self.importButton.setEnabled(True) - print 'Finished running query' + print('Finished running query') def enableimportButton(self): self.importButton.setEnabled(True) diff --git a/checkcombobox.py b/moosegui/checkcombobox.py similarity index 69% rename from checkcombobox.py rename to moosegui/checkcombobox.py index 70d3c07..8f111b0 100644 --- a/checkcombobox.py +++ b/moosegui/checkcombobox.py @@ -1,54 +1,13 @@ -# checkcombobox.py --- -# -# Filename: checkcombobox.py # Description: # Author: # Maintainer: # Created: Wed Jun 5 15:06:21 2013 (+0530) # Version: -# Last-Updated: Wed Jun 5 18:42:50 2013 (+0530) -# By: subha -# Update #: 188 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# ComboBox with checkable items. Inspired by the same in libqxt. -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: import sys - -from PyQt4 import QtCore, QtGui -from PyQt4.Qt import Qt +from PyQt5 import QtCore, QtGui +from PyQt5.Qt import Qt +from PyQt5.QtWidgets import QComboBox, QApplication, QMainWindow from collections import defaultdict class CheckComboBoxModel(QtGui.QStandardItemModel): @@ -62,13 +21,13 @@ def flags(self, index): return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled def data(self, index, role): - if index.isValid() and role == Qt.CheckStateRole: + if index and role == Qt.CheckStateRole: return QtCore.QVariant(self.checked_dict[index]) else: return QtGui.QStandardItemModel.data(self, index, role) def setData(self, index, value, role=Qt.EditRole): - if not index.isValid(): + if not index: return False ok = QtGui.QStandardItemModel.setData(self, index, value, role) if ok and role == Qt.CheckStateRole: @@ -85,15 +44,13 @@ def __init__(self, parent): def eventFilter(self, obj, event): etype = event.type() if etype == event.KeyPress or etype == event.KeyRelease: - if obj == self and \ - (event.key() == Qt.Key_UP or - event.key() == Qt.Key_Down): + if obj == self and event.key() == Qt.Key_UP or event.key() == Qt.Key_Down: self.parent().showPopup() return True elif event.key() == Qt.Key_Enter or \ - event.key() == Qt.Key_Return or \ - event.key() == Qt.Key_Escape: - QtGui.QComboBox.hidePopup(self.parent()) + event.key() == Qt.Key_Return or \ + event.key() == Qt.Key_Escape: + QComboBox.hidePopup(self.parent()) if event.key() != Qt.Key_Escape: return True elif etype == event.MouseButtonPress: @@ -102,11 +59,11 @@ def eventFilter(self, obj, event): self.parent()._containerMousePress = False return False -class CheckComboBox(QtGui.QComboBox): +class CheckComboBox(QComboBox): """Specialization of QComboBox to allow checkable items. This is inspired by the same class in Qxt""" def __init__(self, *args): - QtGui.QComboBox.__init__(self, *args) + QComboBox.__init__(self, *args) self._containerMousePress = False self.setModel(CheckComboBoxModel()) self.activated.connect(self.toggleCheckState) @@ -119,7 +76,7 @@ def __init__(self, *args): def hidePopup(self): """This is to disable hiding of the popup when an item is clicked.""" if self._containerMousePress: - QtGui.QComboBox.hidePopup(self) + QComboBox.hidePopup(self) def itemCheckState(self, index): return self.itemData(index, Qt.CheckStateRole).toInt()[0] @@ -135,14 +92,14 @@ def checkedItems(self): def setCheckedItems(self, textItemList): for text in textItemList: index = self.findText(text) - if index.isValid(): + if index: self.setItemCheckState(index, Qt.Checked) else: self.setItemCheckState(index, Qt.Unchecked) def toggleCheckState(self, index): value = self.itemData(index, Qt.CheckStateRole) - if value.isValid(): + if value: state = value.toInt()[0] if state == Qt.Checked: self.setItemData(index, Qt.Unchecked, Qt.CheckStateRole) @@ -151,8 +108,8 @@ def toggleCheckState(self, index): def main(): """Test main: load a model and display the tree for it""" - app = QtGui.QApplication([]) - mainwin = QtGui.QMainWindow() + app = QApplication([]) + mainwin = QMainWindow() mainwin.setWindowTitle('CheckComboBox test') box = CheckComboBox() for ii in range(5): @@ -161,9 +118,6 @@ def main(): mainwin.show() sys.exit(app.exec_()) + if __name__ == '__main__': main() - - -# -# checkcombobox.py ends here diff --git a/colormaps/fire b/moosegui/colormaps/fire similarity index 100% rename from colormaps/fire rename to moosegui/colormaps/fire diff --git a/colormaps/greenfire b/moosegui/colormaps/greenfire similarity index 100% rename from colormaps/greenfire rename to moosegui/colormaps/greenfire diff --git a/colormaps/grey b/moosegui/colormaps/grey similarity index 100% rename from colormaps/grey rename to moosegui/colormaps/grey diff --git a/colormaps/heat b/moosegui/colormaps/heat similarity index 100% rename from colormaps/heat rename to moosegui/colormaps/heat diff --git a/colormaps/jet b/moosegui/colormaps/jet similarity index 100% rename from colormaps/jet rename to moosegui/colormaps/jet diff --git a/colormaps/rainbow2.pkl b/moosegui/colormaps/rainbow2.pkl similarity index 100% rename from colormaps/rainbow2.pkl rename to moosegui/colormaps/rainbow2.pkl diff --git a/colormaps/redhot b/moosegui/colormaps/redhot similarity index 100% rename from colormaps/redhot rename to moosegui/colormaps/redhot diff --git a/moosegui/config.py b/moosegui/config.py new file mode 100644 index 0000000..241dd50 --- /dev/null +++ b/moosegui/config.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +# Filename: config.py +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Sat Feb 13 16:07:56 2010 (+0530) +# Version: + +import os +import sys +from PyQt5 import QtCore + +# Logger +import logging +logging.basicConfig(level=logging.DEBUG) + +KEY_UNDO_LENGTH = 'main/undolength' +KEY_WINDOW_GEOMETRY = 'main/geometry' +KEY_WINDOW_LAYOUT = 'main/layout' +KEY_RUNTIME_AUTOHIDE = 'main/rtautohide' +KEY_DEMOS_DIR = 'main/demosdir' +KEY_DOCS_DIR = 'main/docsdir' +KEY_HOME_DIR = 'main/homedir' +KEY_ICON_DIR = 'main/icondir' +KEY_COLORMAP_DIR = 'main/colormapdir' +KEY_BIOMODEL_DIR = 'main/biomodelsdir' +KEY_LOCAL_DEMOS_DIR = 'main/localdemosdir' +KEY_MOOSE_LOCAL_DIR = 'main/localdir' +KEY_NUMPTHREADS = 'main/numpthreads' +KEY_LOCAL_BUILD = 'main/localbuild' +KEY_LAST_PLUGIN = 'main/lastplugin' + +# These are the keys for mode specific configuration. +# Ideally the default values should be provided by the plugin. +# We use the QSettings to remember the last values +KEY_KINETICS_SIMDT = 'kinetics/simdt' +KEY_KINETICS_PLOTDT = 'kinetics/plotdt' +KEY_ELECTRICAL_SIMDT = 'electrical/simdt' +KEY_ELECTRICAL_PLOTDT = 'electrical/plotdt' +KEY_SIMTIME = 'main/simtime' + +QT_VERSION = ('%s' % QtCore.QT_VERSION_STR).split('.') +QT_MAJOR_VERSION = int(QT_VERSION[0]) +QT_MINOR_VERSION = int(QT_VERSION[1]) + +MOOSE_DOC_URL = 'http://moose.ncbs.res.in/builtins_classes/moose_builtins.html' +MOOSE_REPORT_BUG_URL = 'http://github.com/BhallaLab/moose/issues' +MOOSE_GUI_BUG_URL = 'https://github.com/BhallaLab/moose-gui/issues' +MOOSE_CORE_BUG_URL = 'https://github.com/BhallaLab/moose-core/issues' +MOOSE_DOCS_DIR = '/usr/share/doc/moose' + +MOOSE_GUI_DIR = os.path.dirname(os.path.abspath(__file__)) +assert os.path.exists(MOOSE_GUI_DIR) +MOOSE_PLUGIN_DIR = os.path.join(MOOSE_GUI_DIR, 'plugins') +assert os.path.exists(MOOSE_PLUGIN_DIR) +MOOSE_ICON_DIR = os.path.join(MOOSE_GUI_DIR, 'icons' ) +assert os.path.exists(MOOSE_ICON_DIR) +NEUROKIT_PLUGIN_DIR = os.path.join(MOOSE_GUI_DIR, 'plugins/NeuroKit') +MOOSE_NUMPTHREADS = '1' + +MOOSE_UNDO_LENGTH = 128 # Arbitrary undo length + +# It is important that MOOSE_PLUGIN_DIR is added to system path. This is ued to +# search multiple plugins. +sys.path.append( MOOSE_PLUGIN_DIR ) + + +def qvalue( qsetting, key ): + """ Return value as unicode from QSetting object. + Calling toString is not compatible with python3. + """ + return qsetting.value( key ) + + +class MooseSetting(dict): + """ + dict-like access to QSettings. + + This subclass of dict wraps a QSettings object and lets one set + and get values as Python strings rather than QVariant. + + This is supposed to be a singleton in the whole application (all + QSettings are with same parameters). + """ + _instance = None + def __new__(cls, *args, **kwargs): + # This is designed to check if the class has been + # instantiated, if so, returns the single instance, otherwise + # creates it. + if cls._instance is None: + cls._instance = super(MooseSetting, cls).__new__(cls, *args, **kwargs) + QtCore.QCoreApplication.setOrganizationName('NCBS Bangalore') + QtCore.QCoreApplication.setOrganizationDomain('ncbs.res.in') + QtCore.QCoreApplication.setApplicationName('MOOSE') + cls._instance.qsettings = QtCore.QSettings() + # If this is the first time, then set some defaults + cls._instance.qsettings.setValue(KEY_COLORMAP_DIR, os.path.join(MOOSE_GUI_DIR, 'colormaps')) + cls._instance.qsettings.setValue(KEY_BIOMODEL_DIR, os.path.join(MOOSE_GUI_DIR, 'bioModels')) + cls._instance.qsettings.setValue(KEY_ICON_DIR, os.path.join(MOOSE_GUI_DIR, 'icons')) + cls._instance.qsettings.setValue(KEY_NUMPTHREADS, '1') + cls._instance.qsettings.setValue(KEY_UNDO_LENGTH, ('%s' % MOOSE_UNDO_LENGTH)) + # These are to be checked at every run + cls._instance.qsettings.setValue(KEY_HOME_DIR, os.environ['HOME']) + cls._instance.qsettings.setValue(KEY_DOCS_DIR, MOOSE_DOCS_DIR) + return cls._instance + + def __init__(self, *args, **kwargs): + super(MooseSetting, self).__init__(self, *args, **kwargs) + + def __iter__(self): + return ('%s' % key for key in self.qsettings.allKeys()) + + def __setitem__(self, key, value): + if isinstance(key, type("")): + self.qsettings.setValue(key, value) + else: + raise TypeError('Expect only strings as keys') + + def __getitem__(self, key): + val = qvalue( self.qsettings, key ) + return val + + def keys(self): + return ['%s' % key for key in self.qsettings.allKeys()] + + def values(self): + return [ qvalue(self.qsettings, key) for key in self.qsettings.allKeys()] + + def itervalues(self): + return ( qvalue(self.qsettings, key) for key in self.qsettings.allKeys()) + +settings = MooseSetting() diff --git a/configwidget.py b/moosegui/configwidget.py similarity index 74% rename from configwidget.py rename to moosegui/configwidget.py index 87d10c3..3051910 100644 --- a/configwidget.py +++ b/moosegui/configwidget.py @@ -1,57 +1,19 @@ -# firsttime.py --- -# -# Filename: firsttime.py +# -*- coding: utf-8 -*- + # Description: # Author: Subhasis Ray # Maintainer: # Created: Sun Jul 11 15:31:00 2010 (+0530) -# Version: -# Last-Updated: Sat Sep 22 15:30:15 2012 (+0530) -# By: subha -# Update #: 505 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# Wizard to take the user through selection of some basic -# configurations for MOOSE gui. -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: import shutil import os -import config -from PyQt4 import QtGui, QtCore -import config -from utils import * + +from PyQt5 import QtGui, QtCore +from PyQt5.QtWidgets import QWidget + +from moosegui import config +from moosegui import config +from moosegui.utils import * class ConfigWidget(QtGui.QDialog): """Widget to configure MOOSE.""" @@ -76,7 +38,7 @@ def __init__(self, *args, **kwargs): def _createGeneralPanel(self): if hasattr(self, 'generalPanel'): return self.generalPanel - self.generalPanel = QtGui.QWidget(self) + self.generalPanel = QWidget(self) self.generalPanelLabel = QtGui.QLabel(self.generalPanel) self.generalPanelLabel.setText('
General configuration for MOOSE
') self.colormapDirLabel = QtGui.QLabel('Colormap directory', diff --git a/defaults.py b/moosegui/defaults.py similarity index 93% rename from defaults.py rename to moosegui/defaults.py index f7a5138..992e515 100644 --- a/defaults.py +++ b/moosegui/defaults.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + __credits__ = ["Upi Lab"] __author__ = "Subhasis" __license__ = "GPL3" @@ -12,10 +14,11 @@ 'Compartment':['Vm','Im'], 'HHChannel':['Ik','Gk'], 'ZombiePool':['n','conc'], - 'ZombieBufPool':['n','conc'], + 'ZombieBufPool':['n','conc'], 'HHChannel2D':['Ik','Gk'], 'CaConc':['Ca'] } + FIELD_UNITS={ 'volume':'m3', 'Kd' : 'mM', diff --git a/moosegui/examples.py b/moosegui/examples.py new file mode 100644 index 0000000..f2c80df --- /dev/null +++ b/moosegui/examples.py @@ -0,0 +1,65 @@ +"""examples.py: + +Here is dictionary of demos. + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Dev,opment" + +import sys +import os + +from collections import OrderedDict + +examples_ = [ + ("Fig2C" , "demos/Fig2_elecModels/Fig2C.py") + , ("Fig2D (35s)","demos/Fig2_elecModels/Fig2D.py") + , ("Fig2E","demos/Fig2_elecModels/Fig2E.py") + , ("Fig3B_Gssa","demos/Fig3_chemModels/Fig3ABC.g") + , ("Fig3C_Gsl","demos/Fig3_chemModels/Fig3ABC.g") + , ("Fig3D","demos/Fig3_chemModels/Fig3D.py") + , ("Fig4B","demos/Fig4_ReacDiff/Fig4B.py" ) + , ("Fig4K", "demos/Fig4_ReacDiff/rxdSpineSize.py") + , ("Fig5A (20s)","demos/Fig5_CellMultiscale/Fig5A.py") + , ("Fig5BCD (240s)","demos/Fig5_CellMultiscale/Fig5BCD.py") + , ("Fig6A (60s)","demos/Fig6_NetMultiscale/Fig6A.py" ) + , ("Reduced6 (200s)","demos/Fig6_NetMultiscale/ReducedModel.py") + , ("Squid" , "demos/squid/squid_demo.py") + ] + +description_ = { + "Fig2E": + ("Illustrates loading a mod, from an SWC file, inserting chann,s, and running it") + , "Fig2D (35s)": + ("Illustrates loading a mod, from an SWC file, inserting spines, and running it") + , "Fig2C": + ("Illustrates building a pan, of multiscale mod,s to test neuronal plasticity in different contexts") + , "Fig3B_Gssa": + ("Loades Repressilator mod, into Gui with Gssa solver and runs the mod,") + , "Fig3C_Gsl": + ("Loades Repressilator mod, into Gui with Gsl solver and runs the mod,") + , "Fig3D": + ("This example implements a reaction-diffusion like system which is bistable and propagates losslessly") + , "Fig4B": + ("This program builds a multiscale mod, with a few spines inserted into a simplified c,lular morphology. Each spine has a signaling mod, in it too. The program doesn't run the mod,, it just displays it in 3D") + , "Fig4K": + ("Builds a c,l with spines and a propagating reaction wave") + , "Fig5A (20s)": + ("Illustrates building a pan, of multiscale mod,s to test neuronal plasticity in different contexts") + , "Fig5BCD (240s)": + ("Illustrates building a pan, of multiscale mod,s to test neuronal plasticity in different contexts") + , "Fig6A (60s)": + ("This LIF network with Ca plasticity is based on: Memory Maintenance in Synapses with Calcium-Based Plasticity in the Presence of Background Activity PLOS Computational Biology, 2014") + , "Reduced6 (200s)": + ("This is the Reduced version of LIF network with Ca plasticity mod, based on: Memory Maintenance in Synapses with Calcium-Based Plasticity in the Presence of Background Activity PLOS Computational Biology, 2014") + , "Squid": + ("squid Demo") + } + diff --git a/moosegui/global_constants.py b/moosegui/global_constants.py new file mode 100644 index 0000000..3a5724c --- /dev/null +++ b/moosegui/global_constants.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from moosegui.plugins.PreferencesPresenter import PreferencesPresenter +preferences = PreferencesPresenter() diff --git a/icons/classIcon/BufPool.png b/moosegui/icons/BufPool.png similarity index 100% rename from icons/classIcon/BufPool.png rename to moosegui/icons/BufPool.png diff --git a/icons/classIcon/CubeMesh.png b/moosegui/icons/CubeMesh.png similarity index 100% rename from icons/classIcon/CubeMesh.png rename to moosegui/icons/CubeMesh.png diff --git a/icons/classIcon/CylMesh.png b/moosegui/icons/CylMesh.png similarity index 100% rename from icons/classIcon/CylMesh.png rename to moosegui/icons/CylMesh.png diff --git a/icons/classIcon/Enz.png b/moosegui/icons/Enz.png similarity index 100% rename from icons/classIcon/Enz.png rename to moosegui/icons/Enz.png diff --git a/icons/classIcon/FuncPool.png b/moosegui/icons/FuncPool.png similarity index 100% rename from icons/classIcon/FuncPool.png rename to moosegui/icons/FuncPool.png diff --git a/icons/classIcon/Function.png b/moosegui/icons/Function.png similarity index 100% rename from icons/classIcon/Function.png rename to moosegui/icons/Function.png diff --git a/icons/classIcon/MMenz.png b/moosegui/icons/MMenz.png similarity index 100% rename from icons/classIcon/MMenz.png rename to moosegui/icons/MMenz.png diff --git a/icons/classIcon/Pool.png b/moosegui/icons/Pool.png similarity index 100% rename from icons/classIcon/Pool.png rename to moosegui/icons/Pool.png diff --git a/icons/QMdiBackground.png b/moosegui/icons/QMdiBackground.png similarity index 100% rename from icons/QMdiBackground.png rename to moosegui/icons/QMdiBackground.png diff --git a/icons/classIcon/Reac.png b/moosegui/icons/Reac.png similarity index 100% rename from icons/classIcon/Reac.png rename to moosegui/icons/Reac.png diff --git a/icons/classIcon/StimulusTable.png b/moosegui/icons/StimulusTable.png similarity index 100% rename from icons/classIcon/StimulusTable.png rename to moosegui/icons/StimulusTable.png diff --git a/icons/classIcon/SumFunc.png b/moosegui/icons/SumFunc.png similarity index 100% rename from icons/classIcon/SumFunc.png rename to moosegui/icons/SumFunc.png diff --git a/icons/add.png b/moosegui/icons/add.png similarity index 100% rename from icons/add.png rename to moosegui/icons/add.png diff --git a/icons/add_graph.png b/moosegui/icons/add_graph.png similarity index 100% rename from icons/add_graph.png rename to moosegui/icons/add_graph.png diff --git a/icons/arrow.png b/moosegui/icons/arrow.png similarity index 100% rename from icons/arrow.png rename to moosegui/icons/arrow.png diff --git a/icons/arrow_undo.png b/moosegui/icons/arrow_undo.png similarity index 100% rename from icons/arrow_undo.png rename to moosegui/icons/arrow_undo.png diff --git a/icons/clone.svg b/moosegui/icons/clone.svg similarity index 98% rename from icons/clone.svg rename to moosegui/icons/clone.svg index bb18fd9..7d7e374 100644 --- a/icons/clone.svg +++ b/moosegui/icons/clone.svg @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/icons/connection.png b/moosegui/icons/connection.png similarity index 100% rename from icons/connection.png rename to moosegui/icons/connection.png diff --git a/icons/continue.png b/moosegui/icons/continue.png similarity index 100% rename from icons/continue.png rename to moosegui/icons/continue.png diff --git a/icons/delete.svg b/moosegui/icons/delete.svg similarity index 100% rename from icons/delete.svg rename to moosegui/icons/delete.svg diff --git a/icons/delete_graph.png b/moosegui/icons/delete_graph.png similarity index 100% rename from icons/delete_graph.png rename to moosegui/icons/delete_graph.png diff --git a/icons/grid.png b/moosegui/icons/grid.png similarity index 100% rename from icons/grid.png rename to moosegui/icons/grid.png diff --git a/icons/hand.png b/moosegui/icons/hand.png similarity index 100% rename from icons/hand.png rename to moosegui/icons/hand.png diff --git a/icons/help.png b/moosegui/icons/help.png similarity index 100% rename from icons/help.png rename to moosegui/icons/help.png diff --git a/icons/hopfield.png b/moosegui/icons/hopfield.png similarity index 100% rename from icons/hopfield.png rename to moosegui/icons/hopfield.png diff --git a/icons/list.png b/moosegui/icons/list.png similarity index 100% rename from icons/list.png rename to moosegui/icons/list.png diff --git a/icons/moose_icon.png b/moosegui/icons/moose_icon.png similarity index 100% rename from icons/moose_icon.png rename to moosegui/icons/moose_icon.png diff --git a/icons/moose_icon_64x64.png b/moosegui/icons/moose_icon_64x64.png similarity index 100% rename from icons/moose_icon_64x64.png rename to moosegui/icons/moose_icon_64x64.png diff --git a/icons/moose_icon_large.png b/moosegui/icons/moose_icon_large.png similarity index 100% rename from icons/moose_icon_large.png rename to moosegui/icons/moose_icon_large.png diff --git a/icons/move.svg b/moosegui/icons/move.svg similarity index 96% rename from icons/move.svg rename to moosegui/icons/move.svg index 5dd4d9a..25d2706 100644 --- a/icons/move.svg +++ b/moosegui/icons/move.svg @@ -1,39 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/plot.svg b/moosegui/icons/plot.svg similarity index 100% rename from icons/plot.svg rename to moosegui/icons/plot.svg diff --git a/icons/reset.png b/moosegui/icons/reset.png similarity index 100% rename from icons/reset.png rename to moosegui/icons/reset.png diff --git a/icons/run.png b/moosegui/icons/run.png similarity index 100% rename from icons/run.png rename to moosegui/icons/run.png diff --git a/icons/runtime.png b/moosegui/icons/runtime.png similarity index 100% rename from icons/runtime.png rename to moosegui/icons/runtime.png diff --git a/icons/squid.png b/moosegui/icons/squid.png similarity index 100% rename from icons/squid.png rename to moosegui/icons/squid.png diff --git a/icons/stop.png b/moosegui/icons/stop.png similarity index 100% rename from icons/stop.png rename to moosegui/icons/stop.png diff --git a/icons/straight_connector_with_filled_circles.png b/moosegui/icons/straight_connector_with_filled_circles.png similarity index 100% rename from icons/straight_connector_with_filled_circles.png rename to moosegui/icons/straight_connector_with_filled_circles.png diff --git a/icons/wrench.png b/moosegui/icons/wrench.png similarity index 100% rename from icons/wrench.png rename to moosegui/icons/wrench.png diff --git a/moosegui/loaderdialog.py b/moosegui/loaderdialog.py new file mode 100644 index 0000000..15fa1ea --- /dev/null +++ b/moosegui/loaderdialog.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Description: +# Author: +# Maintainer: +# Created: Mon Feb 25 15:59:54 2013 (+0530) + +import sys +import moose +import os +import posixpath +from PyQt5 import QtGui, QtCore +from PyQt5.QtWidgets import QFileDialog, QApplication + +class LoaderDialog(QFileDialog): + # Update ftypes to include new file types + ftypes='All Supported Files (*.cspace *.g *.xml *.p);; CSPACE (*.cspace);; GENESIS (*.g);; GENESIS Prototype (*.p);; NeuroML/SBML (*.xml)' + target_default = '' # The default target when loading a model + def __init__(self, *args): + self.modelpath = None + super(LoaderDialog, self).__init__(*args) + self.setNameFilter(self.tr(self.ftypes)) + self.setFileMode(self.ExistingFile) + self.fileSelected.connect(self.fileSelectedSlot) + + def fileSelectedSlot(self, fpath): + """On selecting a file, this function will cause the target location to change to: + + /model/filename_minus_extension + + """ + self.modelpath = os.path.splitext(os.path.basename(str(fpath)))[0] + + # def isReplace(self): + # return self.replaceExistingButton.isChecked() + + # def isMerge(self): + # return self.mergeExistingButton.isChecked() + + def getTargetPath(self): + return self.modelpath + + +if __name__ == '__main__': + app = QApplication(sys.argv) + QtGui.qApp = app + mw = LoaderDialog() + mw.show() + # mw.exec_() + sys.exit(app.exec_()) + + + +# +# fileloader.py ends here diff --git a/mexception.py b/moosegui/mexception.py similarity index 90% rename from mexception.py rename to moosegui/mexception.py index 53a728b..c2836b8 100644 --- a/mexception.py +++ b/moosegui/mexception.py @@ -57,17 +57,17 @@ class MooseWarning(Warning): def __init__(self, *args, **kwargs): Warning.__init__(self, *args, **kwargs) -class MooseError(StandardError): +class MooseError(Exception): def __init__(self, *args, **kwargs): - StandardError.__init__(self, *args, **kwargs) + Exception.__init__(self, *args, **kwargs) class FileLoadError(MooseError): def __init__(self, *args, **kwargs): - StandardError.__init__(self, *args, **kwargs) + Exception.__init__(self, *args, **kwargs) class ElementNameError(MooseError): def __init__(self, *args, **kwargs): - StandardError.__init__(self, *args, **kwargs) + Exception.__init__(self, *args, **kwargs) # # mexception.py ends here diff --git a/moosegui/mgui.py b/moosegui/mgui.py new file mode 100644 index 0000000..71cb6a1 --- /dev/null +++ b/moosegui/mgui.py @@ -0,0 +1,30 @@ +# Filename: moosegui.py +# Description: Graphical user interface of MOOSE simulator. +# Author: Subhasis Ray, Harsha Rani, Dilawar Singh +# Maintainer: +# Created: Mon Nov 12 09:38:09 2012 (+0530) + +__author__ = 'Subhasis Ray , HarshaRani, Aviral Goel, NCBS Bangalore' + +import sys +from PyQt5.QtWidgets import QApplication +from PyQt5 import QtGui, QtCore +from moosegui import config +from moosegui import MWindow as MWindow + +app_ = None + +def main(): + # create the GUI application + global app_ + app_ = QApplication(sys.argv) + QtGui.qApp = app_ + mWindow = MWindow.MWindow() + mWindow.setWindowState(QtCore.Qt.WindowMaximized) + sys.excepthook = mWindow.handleException + mWindow.show() + sys.exit( app_.exec_() ) + +if __name__ == '__main__': + main() + diff --git a/mload.py b/moosegui/mload.py similarity index 86% rename from mload.py rename to moosegui/mload.py index 3b97832..4bb8dab 100644 --- a/mload.py +++ b/moosegui/mload.py @@ -1,68 +1,28 @@ -# mload.py --- -# -# Filename: mload.py +# -*- coding: utf-8 -*- + # Description: # Author: Subhasis # Maintainer:HarshaRani # Created: Fri Feb 8 09:38:40 2013 (+0530) -# Version: -# Last-Updated: Wed Oct 5 15:16:35 2017 (+0530) -# By: HarshaRani -# Update #: 213 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# Utility to load models and detect filetype. -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# -# Code: -''' -Oct 5 : check is made for kkit model - -- Atleast one compartment should exists - -- Atleast 2 pool should exists -Oct 4 : clean up for python3 -''' -import moose -from moose import neuroml -import mtypes -from mexception import FileLoadError import posixpath +from PyQt5 import QtGui, QtCore, Qt from os.path import basename from os.path import splitext -from PyQt4 import QtGui, QtCore, Qt -from plugins.setsolver import * -from moose.SBML import * -from plugins.kkitOrdinateUtil import * + +# moosegui +from moosegui.plugins.kkitOrdinateUtil import * +from moosegui import mtypes +from moosegui.mexception import FileLoadError +from moosegui.plugins.setsolver import * + +# moose import moose._moose as moose import moose.utils as mutils +import moose +from moose import neuroml +from moose.SBML import * + def loadGenCsp(target,filename,solver="gsl"): target = target.replace(" ", "") path = '/'+target @@ -205,8 +165,8 @@ def loadFile(filename, target, solver="gsl", merge=True): if subtype == 'neuroml': popdict, projdict = neuroml.loadNeuroML_L123(filename) # Circus to get the container of populations from loaded neuroml - for popinfo in popdict.values(): - for cell in popinfo[1].values(): + for popinfo in list(popdict.values()): + for cell in list(popinfo[1].values()): solver = moose.HSolve(cell.path + "/hsolve") solver.target = cell.path # model = cell.parent diff --git a/mplot.py b/moosegui/mplot.py similarity index 69% rename from mplot.py rename to moosegui/mplot.py index 7d75392..411e99c 100644 --- a/mplot.py +++ b/moosegui/mplot.py @@ -1,94 +1,22 @@ -# mplot.py --- -# # Filename: mplot.py # Description: # Author: # Maintainer: # Created: Mon Mar 11 20:24:26 2013 (+0530) -# Version: -# Last-Updated: Wed Apr 11 15:32:35 2018 (+0530) -# By: Harsha -# Update #: -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# Moose plot widget default implementation. This should be rich enough -# to suffice for most purposes. -# -# - -# Change log: -# 2018 April 11: In chemical model, now pool can be ploted as number or concentration. -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: -""" - *TODO* - - 1) Option for default colors, markers, etc. - - 2) Option for configuring number of rows and columns of - subplots. (I think matplotlib grids will be a bit too much to - implement). Problem is this has to be done before actual axes are - created (as far as I know). Idea: can we do something like movable - widgets example in Qt? - - 3) Option for selecting any line or set of lines and change its - configuration (as in dataviz). - - 4) Association between plots and the data source. - - 5) Lots and lots of scipy/numpy/scikits/statsmodels utilities can be added. To - start with, we should have - a)digital filters - b) fft - c) curve fitting - - 6) For (5), think of another layer of plugins. Think of this as a - standalone program. All these facilities should again be - pluggable. We do not want to overwhelm novice users with fancy - machine-learning stuff. They should be made available only on - request. - - There is a proposal for data analysis library by Andrew Davison ... - -""" - __author__ = "Subhasis Ray" + import sys import numpy as np -from PyQt4 import QtGui, QtCore -from PyQt4.Qt import Qt -from matplotlib import mlab + +from PyQt5 import QtGui, QtCore +from PyQt5.Qt import Qt + from matplotlib.figure import Figure -from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas -from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar -#from moose import utils +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar + import moose -from PyQt4.QtCore import * class CanvasWidget(FigureCanvas): """Widget to draw plots on. @@ -102,8 +30,7 @@ class CanvasWidget(FigureCanvas): this). """ - updateSignal = pyqtSignal() - + updateSignal = QtCore.pyqtSignal() def __init__(self, model, graph, index, *args, **kwargs): self.model = model self.graph = graph @@ -201,7 +128,7 @@ def callAxesFn(self, fname, *args, **kwargs): return fn(*args, **kwargs) def resize_event(self, event): - print("Resize event called ", event) + print(("Resize event called ", event)) def toggleGrid(self): self.gridMode = not self.gridMode @@ -215,12 +142,11 @@ def setXLimit(self, minX, maxX): self.draw() -import sys import os -import config import unittest +from moosegui import config -from PyQt4.QtTest import QTest +from PyQt5.QtTest import QTest class CanvasWidgetTests(unittest.TestCase): def setUp(self): diff --git a/mplugin.py b/moosegui/mplugin.py similarity index 87% rename from mplugin.py rename to moosegui/mplugin.py index c4ea6d0..4e037ce 100644 --- a/mplugin.py +++ b/moosegui/mplugin.py @@ -1,51 +1,13 @@ -# mplugin.py --- -# +# -*- coding: utf-8 -*- + # Filename: mplugin.py # Description: # Author: # Maintainer: # Created: Tue Oct 2 17:25:41 2012 (+0530) -# Version: -# Last-Updated: Thu Jul 18 10:51:48 2013 (+0530) -# By: subha -# Update #: 297 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# This is to be the base class for all MOOSE GUI plugins. -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: - -from PyQt4 import QtGui,QtCore,Qt + +from PyQt5 import QtCore +from PyQt5.QtWidgets import QWidget, QAction import moose class MoosePluginBase(QtCore.QObject): @@ -63,8 +25,10 @@ class MoosePluginBase(QtCore.QObject): and getViews() functions. """ + modelRootChanged = QtCore.pyqtSignal(object, name='modelRootChanged') dataRootChanged = QtCore.pyqtSignal(object, name='dataRootChanged') + def __init__(self, root='/', mainwindow=None): """Create a plugin object whose model is the tree rooted at `root` and whose widgets will be displayed in `mainwindow`. @@ -250,7 +214,7 @@ def __init__(self, plugin, *args): super(RunBase, self).__init__(plugin) -class EditorWidgetBase(QtGui.QWidget): +class EditorWidgetBase(QWidget): """Base class for central widget displayed in editor view. The widget should display the model components in the tree rooted @@ -268,7 +232,7 @@ class EditorWidgetBase(QtGui.QWidget): """ editObject = QtCore.pyqtSignal('PyQt_PyObject') def __init__(self, *args): - QtGui.QWidget.__init__(self, *args) + QWidget.__init__(self, *args) self.modelRoot = '/' self._menus = [] self._toolBars = [] @@ -293,12 +257,9 @@ def getInsertActions(self, classlist): if len(self._insertActions) == 0: self._insertMapper = QtCore.QSignalMapper(self) for classname in classlist: - action = QtGui.QAction(classname, self) - self._insertMapper.setMapping(action, QtCore.QString(classname)) - self.connect(action, - QtCore.SIGNAL('triggered()'), - self._insertMapper, - QtCore.SLOT('map()')) + action = QAction(classname, self) + self._insertMapper.setMapping(action, classname) + action.triggered.connect(self._insertMapper.map) doc = moose.element('/classes/%s' % (classname)).docs doc = doc.split('Description:')[-1].split('Name:')[0].strip() action.setToolTip(doc) @@ -347,8 +308,3 @@ def sizeHint(self): def getCurrentMobj(self): raise NotImplementedError('should be reimplemented in subclass') - - - -# -# mplugin.py ends here diff --git a/msearch.py b/moosegui/msearch.py similarity index 96% rename from msearch.py rename to moosegui/msearch.py index 63fa809..9c580e6 100644 --- a/msearch.py +++ b/moosegui/msearch.py @@ -50,12 +50,13 @@ """ import sys -from PyQt4 import QtGui, QtCore -from PyQt4.Qt import Qt +from PyQt5 import QtGui, QtCore +from PyQt5.QtWidgets import QWidget +from PyQt5.Qt import Qt import moose -class SearchWidget(QtGui.QWidget): +class SearchWidget(QWidget): """Widget to search MOOSE model tree using wildcards. SIGNALS: @@ -66,7 +67,7 @@ class SearchWidget(QtGui.QWidget): executed = QtCore.pyqtSignal(list, name='executed') def __init__(self, *args): - QtGui.QWidget.__init__(self, *args) + QWidget.__init__(self, *args) layout = QtGui.QVBoxLayout() self.modeCombo = QtGui.QComboBox() self.modeCombo.addItem('Basic', QtCore.QVariant(QtCore.QString('basic'))) @@ -91,7 +92,7 @@ def switchModeSlot(self, text): def getBasicPanel(self): """Create a widget for basic level usage.""" if not hasattr(self, '_basicPanel'): - self._basicPanel = QtGui.QWidget() + self._basicPanel = QWidget() self.searchRootEdit = QtGui.QLineEdit() self.searchRootEdit.returnPressed.connect(self.searchSlot) self.searchRootLabel = QtGui.QLabel('Search under') @@ -131,7 +132,7 @@ def getAdvancedPanel(self): """Create a panel for advanced users who can enter the search string directly.""" if not hasattr(self, '_advancedPanel'): - self._advancedPanel = QtGui.QWidget(self) + self._advancedPanel = QWidget(self) self._searchEdit = QtGui.QLineEdit() self._searchEdit.returnPressed.connect(self.searchSlot) self._searchLabel = QtGui.QLabel('Search string:') diff --git a/mtoolbutton.py b/moosegui/mtoolbutton.py similarity index 52% rename from mtoolbutton.py rename to moosegui/mtoolbutton.py index c4d72ed..cbf04b5 100644 --- a/mtoolbutton.py +++ b/moosegui/mtoolbutton.py @@ -1,60 +1,27 @@ -# mtoolbutton.py --- -# -# Filename: mtoolbutton.py +# -*- coding: utf-8 -*- + # Description: Subclass of QToolButton to allow drag and drop # Author: # Maintainer: # Created: Fri Jun 14 14:24:11 2013 (+0530) -# Version: -# Last-Updated: Fri Jun 14 16:28:51 2013 (+0530) -# By: subha -# Update #: 89 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# -# Code: import sys -from PyQt4 import QtGui, QtCore -from PyQt4.Qt import Qt +from PyQt5 import QtGui, QtCore +from PyQt5.QtWidgets import QToolButton, QToolBar, QMainWindow +from PyQt5.QtWidgets import QApplication, QTextBrowser +from PyQt5.Qt import Qt -class MToolButton(QtGui.QToolButton): - """QToolButton subclass with dragEvent reimplemented. It sends the +import logging +logger_ = logging.getLogger('mtoolbutton') + +class MToolButton(QToolButton): + """ + QToolButton subclass with dragEvent reimplemented. It sends the text of the ToolButton as the mimedata. """ def __init__(self, *args): - QtGui.QToolButton.__init__(self, *args) + QToolButton.__init__(self, *args) self.dragStartPosition = QtCore.QPoint(0,0) def mousePressEvent(self, event): @@ -64,56 +31,55 @@ def mousePressEvent(self, event): def mouseMoveEvent(self, event): if not (event.buttons() & Qt.LeftButton): return - if (event.pos() - self.dragStartPosition).manhattanLength() < QtGui.QApplication.startDragDistance(): + if (event.pos() - self.dragStartPosition).manhattanLength() < QApplication.startDragDistance(): return drag = QtGui.QDrag(self) mimeData = QtCore.QMimeData() mimeData.setText(self.text()) drag.setMimeData(mimeData) - # print '1111', mimeData.text() - dropAction = drag.exec_(Qt.CopyAction) + drag.exec_(Qt.CopyAction) -class MyWidget(QtGui.QTextBrowser): +class MyWidget(QTextBrowser): """Class for testing the drag and drop ability of MToolButton""" def __init__(self, *args): - QtGui.QTextBrowser.__init__(self, *args) + QTextBrowser.__init__(self, *args) self.dropCount = 0 self.setPlainText('Drops: %d' % (self.dropCount)) self.setAcceptDrops(True) def dragEnterEvent(self, event): - print '2222', event.mimeData().text() + print(('2222', event.mimeData().text())) if event.mimeData().hasFormat('text/plain'): event.acceptProposedAction() - print '3333 accepted ' + print('3333 accepted ') def dragMoveEvent(self, event): """This must be reimplemented to accept the event in case of QTextBrowser. Not needed in QWidgets in general.""" - print '4444' + print('4444') event.acceptProposedAction() def dropEvent(self, event): - print '5555', event.mimeData().text() + print(('5555', event.mimeData().text())) self.dropCount += 1 self.setPlainText('`%s` dropped: %d times' % (event.mimeData().text(), self.dropCount)) event.acceptProposedAction() - QtGui.QTextBrowser.dropEvent(self, event) + QTextBrowser.dropEvent(self, event) def test_main(): """Test main: see if drag and drop is working""" - app = QtGui.QApplication(sys.argv) - mainwin = QtGui.QMainWindow() + app = QApplication(sys.argv) + mainwin = QMainWindow() mainwin.setWindowTitle('MTooButton') - toolbar = QtGui.QToolBar() + toolbar = QToolBar() mainwin.addToolBar(toolbar) button = MToolButton() button.setText('test') toolbar.addWidget(button) browser = MyWidget(mainwin) - print browser.acceptDrops() + print((browser.acceptDrops())) mainwin.setCentralWidget(browser) mainwin.show() sys.exit(app.exec_()) diff --git a/mtree.py b/moosegui/mtree.py similarity index 72% rename from mtree.py rename to moosegui/mtree.py index a95a776..f6480ac 100644 --- a/mtree.py +++ b/moosegui/mtree.py @@ -1,56 +1,15 @@ -# mtree.py --- -# -# Filename: mtree.py +# -*- coding: utf-8 -*- + # Description: # Author: Subhasis Ray # Maintainer: # Created: Tue May 14 11:51:35 2013 (+0530) -# Version: -# Last-Updated: Fri Jun 14 16:13:08 2013 (+0530) -# By: subha -# Update #: 154 -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# Implementation of moose tree widget. This can be used by multiple -# components in the moose gui. -# -# - -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: - -import sys -from PyQt4 import QtGui, QtCore -from PyQt4.Qt import Qt -import moose +from PyQt5 import QtCore +from PyQt5.Qt import Qt +from PyQt5.QtWidgets import QTreeWidgetItem, QTreeWidget + +import moose class MooseTreeModel(QtCore.QAbstractItemModel): """Tree model for the MOOSE element tree. @@ -117,22 +76,21 @@ def flags(self, index): return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable -class MooseTreeItem(QtGui.QTreeWidgetItem): +class MooseTreeItem(QTreeWidgetItem): def __init__(self, *args): - QtGui.QTreeWidgetItem.__init__(self, *args) - self.mobj = None + QTreeWidgetItem.__init__(self, *args) + self.mobj = None def setObject(self, element): self.mobj = moose.element(element) - self.setText(0, QtCore.QString(self.mobj.path.rpartition('/')[-1])) - self.setText(1, QtCore.QString(self.mobj.className)) - #self.setToolTip(0, QtCore.QString('class:' + self.mooseObj_.className)) + self.setText(0, self.mobj.path.rpartition('/')[-1]) + self.setText(1, self.mobj.className) def updateSlot(self): - self.setText(0, QtCore.QString(self.mobj.name)) + self.setText(0, self.mobj.name) -class MooseTreeWidget(QtGui.QTreeWidget): +class MooseTreeWidget(QTreeWidget): """Widget for displaying MOOSE model tree. """ @@ -159,10 +117,10 @@ def __init__(self, *args): elementInserted(melement) emitted when a new element is inserted. """ - QtGui.QTreeWidget.__init__(self, *args) + QTreeWidget.__init__(self, *args) self.header().hide() - self.rootElement = moose.element('/') - self.odict = {} + self.rootElement = moose.element('/') + self.odict = {} self.recreateTree() def setupTree(self, obj, parent, odict): @@ -183,19 +141,19 @@ def setupTree(self, obj, parent, odict): for ii in MooseTreeWidget.ignored: if obj.path.startswith(ii): return None - item = MooseTreeItem(parent) - item.setObject(obj) - odict[obj] = item + item = MooseTreeItem(parent) + item.setObject(obj) + odict[obj] = item # TODO: check and verify that this still works with synapses - # there have been change in API. - Subha, Fri Sep 19 19:04:35 IST 2014 - for child in obj.children: + for child in obj.children: ch = child if child.name in obj.getFieldNames('fieldElementFinfo'): ch = obj.getField(child.name) for elm in ch: self.setupTree(moose.element(elm), item, odict) - return item + return item def recreateTree(self, root=None): """Clears the current tree and recreates the tree. If root is not @@ -220,7 +178,7 @@ def insertElementSlot(self, class_name): under currently selected element in the model tree.""" # print 'Inserting element ...', class_name current = self.currentItem() - print 'CLASS NAME:', class_name + print(('CLASS NAME:', class_name)) self.insertChildElement(current, class_name) def insertChildElement(self, item, class_name, name=''): @@ -242,25 +200,28 @@ def setCurrentItem(self, item): - adds ability to set item by corresponding moose object. """ - if isinstance(item, QtGui.QTreeWidgetItem): - QtGui.QTreeWidget.setCurrentItem(self, item) + if isinstance(item, QTreeWidgetItem): + QTreeWidget.setCurrentItem(self, item) return mobj = moose.element(item) - QtGui.QTreeWidget.setCurrentItem(self, self.odict[mobj]) + QTreeWidget.setCurrentItem(self, self.odict[mobj]) def updateItemSlot(self, element): self.odict[element].updateSlot() def main(): - """Test main: load a model and display the tree for it""" - model = moose.Neutral('/model') - moose.loadModel('../Demos/Genesis_files/Kholodenko.g', '/model/Kholodenko') - # tab = moose.element('/model/Kholodenko/graphs/conc1/MAPK_PP.Co') - # print tab - # for t in tab.children: - # print t - app = QtGui.QApplication(sys.argv) - mainwin = QtGui.QMainWindow() + """ + Test main: load a model and display the tree for it + """ + import sys + import os + sdir = os.path.dirname(__file__) + from PyQt5.QtWidgets import QApplication, QMainWindow + # model = moose.Neutral('/model') + modelfile = os.path.join(sdir, '../data/Kholodenko.g') + moose.loadModel(modelfile, '/model') + app = QApplication(sys.argv) + mainwin = QMainWindow() mainwin.setWindowTitle('Model tree test') tree = MooseTreeWidget() tree.recreateTree(root='/model/') @@ -268,10 +229,6 @@ def main(): mainwin.show() sys.exit(app.exec_()) - if __name__ == "__main__": main() - -# -# mtree.py ends here diff --git a/mtypes.py b/moosegui/mtypes.py similarity index 98% rename from mtypes.py rename to moosegui/mtypes.py index 9d04c5a..69a9a88 100644 --- a/mtypes.py +++ b/moosegui/mtypes.py @@ -45,7 +45,7 @@ # Code: -from __future__ import print_function + import re import moose @@ -143,7 +143,7 @@ def isNeuroML(filename): """ doc = md.parse(filename) for child in doc.childNodes: - print(child.nodeName, child.nodeType == child.ELEMENT_NODE) + print((child.nodeName, child.nodeType == child.ELEMENT_NODE)) if child.nodeType == child.ELEMENT_NODE and \ (child.nodeName == 'networkml' or \ child.nodeName == 'morphml' or \ diff --git a/neuroextractor.py b/moosegui/neuroextractor.py similarity index 100% rename from neuroextractor.py rename to moosegui/neuroextractor.py diff --git a/moosegui/newmodeldialog.py b/moosegui/newmodeldialog.py new file mode 100644 index 0000000..ebbdb9d --- /dev/null +++ b/moosegui/newmodeldialog.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +import re + +from PyQt5 import QtGui, QtCore +from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QDialog +from PyQt5.QtWidgets import QGridLayout, QLabel, QLineEdit +from PyQt5.QtWidgets import QHBoxLayout + +class DialogWidget(QDialog): + def __init__(self,parent=None): + QWidget.__init__(self, parent) + self.warning = None + self._currentRadioButton ="kkit" + self.layout = QGridLayout() + self.modelPathLabel = QLabel('Model Name') + self.modelPathEdit = QLineEdit('') + self.layout.addWidget(self.modelPathLabel, 0, 0) + self.layout.addWidget(self.modelPathEdit, 0, 1,1,1) + self.hbox = QHBoxLayout() + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok) + self.buttonBox.accepted.connect(self.validateAccept) + self.hbox.addWidget(self.buttonBox,1) + self.buttonBox1 = QDialogButtonBox(QDialogButtonBox.Cancel) + self.buttonBox1.rejected.connect(self.Cancel) + self.hbox.addWidget(self.buttonBox1,0) + self.layout.addLayout(self.hbox,1,1) + self.setLayout(self.layout) + + def Cancel (self): + self.close() + + def validateAccept(self): + text = str(self.modelPathEdit.text()) + self.layout.removeWidget(self.warning) + #replace / to _ + text = text.replace('/','_') + + #print(self.layout.widgets()) + if len(text) == 0: + self.warning = QtGui.QLabel("Model name cannot be empty!") + self.layout.addWidget(self.warning, 1, 0, 1, -1) + elif not re.match("^[a-zA-Z]+.*",text): + self.warning = QtGui.QLabel("Start special characters not allowed!") + self.layout.addWidget(self.warning, 1, 0, 1, -1) + else: + self.accept() + return False + + def getcurrentRadioButton(self): + return self._currentRadioButton + +if __name__ == '__main__': + from PyQt5.QtWidgets import QApplication + app = QApplication([]) + widget = DialogWidget() + widget.setWindowTitle('New Model') + widget.setMinimumSize(400, 200) + widget.show() + app.exec_() + + diff --git a/moosegui/objectedit.py b/moosegui/objectedit.py new file mode 100644 index 0000000..320cfcd --- /dev/null +++ b/moosegui/objectedit.py @@ -0,0 +1,422 @@ +# -*- coding: utf-8 -*- +# Description: +# Author: Subhasis Ray +# Maintainer: +# Created: Wed Jun 30 11:18:34 2010 (+0530) + +import sys +from collections import deque +import numpy as np + +from PyQt5 import QtCore +from PyQt5.QtWidgets import QTextEdit, QWidget, QLineEdit +from PyQt5.QtWidgets import QVBoxLayout, QSizePolicy, QSplitter +from PyQt5.QtWidgets import QTableView, QDockWidget, QPushButton +from PyQt5.QtWidgets import QColorDialog, QMessageBox + +import moose +from moosegui import defaults +from moose.chemUtil.chemConnectUtil import getColor + +#these fields will be ignored +extra_fields = [ + 'this', + 'me', + 'parent', + 'path', + 'children', + 'linearSize', + 'objectDimensions', + 'lastDimension', + 'localNumField', + 'pathIndices', + 'msgOut', + 'msgIn', + 'diffConst', + 'speciesId', + 'Coordinates', + 'neighbors', + 'DiffusionArea', + 'DiffusionScaling', + 'x', + 'x0', + 'x1', + 'dx', + 'nx', + 'y', + 'y0', + 'y1', + 'dy', + 'ny', + 'z', + 'z0', + 'z1', + 'dz', + 'nz', + 'coords', + 'isToroid', + 'preserveNumEntries', + # 'numKm', + 'numSubstrates', + 'concK1', + 'meshToSpace', + 'spaceToMesh', + 'surface', + 'method', + 'alwaysDiffuse', + 'numData', + 'numField', + 'valueFields', + 'sourceFields', + 'motorConst', + 'destFields', + 'dt', + 'tick', + 'idValue', + 'index', + 'fieldIndex' +] + + +class ObjectEditModel(QtCore.QAbstractTableModel): + """Model class for editing MOOSE elements. This is not to be used + directly, except that its undo and redo slots should be connected + to by the GUI actions for the same. + + SIGNALS: + + objectNameChanged(PyQt_PyObject): when a moose object's name is + changed, this signal is emitted with the object as argument. This + can be captured by widgets that display the object name. + + dataChanged: emitted when any data is changed in the moose object + + """ + + objectNameChanged = QtCore.pyqtSignal('PyQt_PyObject') + dataChanged = QtCore.pyqtSignal(QtCore.QModelIndex, QtCore.QModelIndex) + + def __init__(self, + datain, + headerdata=['Field', 'Value'], + undolen=100, + parent=None, + *args): + QtCore.QAbstractTableModel.__init__(self, parent, *args) + self.fieldFlags = {} + self.fields = [] + self.mooseObject = datain + self.headerdata = headerdata + self.undoStack = deque(maxlen=undolen) + self.redoStack = deque(maxlen=undolen) + self.checkState_ = False + + for fieldName in self.mooseObject.getFieldNames('valueFinfo'): + if fieldName in extra_fields: + continue + self.fields.append(fieldName) + if (isinstance (self.mooseObject,moose.ChemCompt) or \ + isinstance(self.mooseObject,moose.ReacBase) or \ + isinstance(moose.element(moose.element(self.mooseObject).parent),moose.EnzBase) \ + ): + pass + else: + self.fields.append("Color") + + flag = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable + self.fieldFlags[fieldName] = flag + + if (isinstance(self.mooseObject, moose.ReacBase)): + self.fields.append("Kd") + flag = QtCore.Qt.ItemIsEnabled + self.fieldFlags[fieldName] = flag + + def rowCount(self, parent): + return len(self.fields) + + def columnCount(self, parent): + return len(self.headerdata) + + def setData(self, index, value, role=QtCore.Qt.EditRole): + if not index.isValid() or index.row() >= len( + self.fields) or index.column() != 1: + return False + field = self.fields[index.row()] + if (role == QtCore.Qt.CheckStateRole): + if (index.column() == 1): + self.checkState_ = value + return True + + else: + # convert Qt datastructure to Python string + value = value.strip() + if len(value) == 0: + return False + if field == "Notes": + field = "notes" + ann = moose.Annotator(self.mooseObject.path + '/info') + oldValue = ann.getField(field) + value = type(oldValue)(value) + ann.setField(field, value) + self.undoStack.append((index, oldValue)) + elif field == "vector": + for ch in ['[', ']']: + if ch in value: + value = value.replace(ch, " ") + value = value.replace(",", " ") + valuelist = [] + if value.find(',') != -1: + valuelist = value.split(",") + elif value.find(' ') != -1: + valuelist = value.split(" ") + else: + valuelist = value + self.mooseObject.setField(field, np.array(valuelist, dtype=np.float)) + else: + oldValue = self.mooseObject.getField(field) + if field != "isBuffered": + value = type(oldValue)(value) + self.mooseObject.setField(field, value) + else: + if self.mooseObject.className == "ZombiePool" or self.mooseObject.className == "ZombieBufPool": + QMessageBox.warning( + None, 'Solver is set, Could not set the value', + '\n Unset the solver by clicking \n run widget -> Preferences -> Exponential Euler->Apply' + ) + else: + if value.lower() in ("yes", "true", "t", "1"): + self.mooseObject.setField(field, True) + else: + self.mooseObject.setField(field, False) + self.undoStack.append((index, oldValue)) + if field == 'name': + self.emit(QtCore.SIGNAL('objectNameChanged(PyQt_PyObject)'), + self.mooseObject) + return True + + self.dataChanged.emit(index, index) + return True + + def data(self, index, role): + ret = None + field = self.fields[index.row()] + if index.column() == 0 and role == QtCore.Qt.DisplayRole: + try: + ret = '%s (%s)' % (field, defaults.FIELD_UNITS[field]) + except KeyError: + ret = field + return ret + + if index.column() == 1: + if role == QtCore.Qt.CheckStateRole: + if (str(field) == "plot Conc") or (str(field) == "plot n"): + return self.checkState_ + elif (role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole): + try: + if (str(field) == "Color"): + return QPushButton("Press Me!") + if (str(field) == "Kd"): + Kd = 0 + if self.mooseObject.className == "ZombieReac" or self.mooseObject.className == "Reac": + if self.mooseObject.numSubstrates > 1 or self.mooseObject.numProducts > 1: + if self.mooseObject.Kf != 0: + Kd = self.mooseObject.Kb / self.mooseObject.Kf + ret = QtCore.QVariant(QtCore.QString(str(Kd))) + if ((str(field) != "Notes") and (str(field) != "className") + and (str(field) != "Kd")): + ret = self.mooseObject.getField(str(field)) + ret = QtCore.QString(str(ret)) + elif (str(field) == "className"): + ret = self.mooseObject.getField(str(field)) + if 'Zombie' in ret: + ret = ret.split('Zombie')[1] + ret = QtCore.QString(str(ret)) + elif (str(field) == "Notes"): + astr = self.mooseObject.path + '/info' + mastr = moose.Annotator(astr) + ret = (mastr).getField(str('notes')) + ret = (QtCore.QString(str(ret))) + except ValueError: + ret = None + return ret + + def headerData(self, col, orientation, role): + if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: + return (self.headerdata[col]) + return "" + + +class ObjectEditView(QTableView): + """View class for object editor. + + This class creates an instance of ObjectEditModel using the moose + element passed as its first argument. + + undolen - specifies the size of the undo stack. By default set to + OBJECT_EDIT_UNDO_LENGTH constant in defaults.py. Specify something smaller if + large number of objects are likely to be edited. + + To enable undo/redo conect the corresponding actions from the gui + to view.model().undo and view.model().redo slots. + """ + + def __init__(self, + mobject, + undolen=defaults.OBJECT_EDIT_UNDO_LENGTH, + parent=None): + QTableView.__init__(self, parent) + vh = self.verticalHeader() + vh.setVisible(False) + hh = self.horizontalHeader() + hh.setStretchLastSection(True) + self.setAlternatingRowColors(True) + self.resizeColumnsToContents() + self.setModel(ObjectEditModel(mobject, undolen=undolen)) + self.colorButton = QPushButton() + self.colorDialog = QColorDialog() + self.textEdit = QTextEdit() + try: + notesIndex = self.model().fields.index("Notes") + self.setIndexWidget(self.model().index(notesIndex, 1), + self.textEdit) + info = moose.Annotator(self.model().mooseObject.path + '/info') + self.textEdit.setText(QtCore.QString(info.getField('notes'))) + self.setRowHeight(notesIndex, self.rowHeight(notesIndex) * 3) + + # self.colorDialog.colorSelected.connect( + # lambda color: + # + # self.setColor(getColor(self.model().mooseObject.path+'/info')[1]) + except: + pass + + try: + self.colorButton.clicked.connect(self.colorDialog.show) + self.colorButton.setFocusPolicy(QtCore.Qt.NoFocus) + self.colorDialog.colorSelected.connect( + lambda color: self.colorButton.setStyleSheet( + "QPushButton {" + "background-color: {0}; color: {0};". + format(color.name()) + "}")) + # FIXME: + # colorIndex = self.model().fields.index("Color") + # self.setIndexWidget(self.model().index(colorIndex, 1), self.colorButton) + self.setColor(getColor(self.model().mooseObject.path + '/info')[1]) + except: + pass + print('Created view with %s' % (mobject)) + + def setColor(self, color): + self.colorButton.setStyleSheet( + "QPushButton {" + + "background-color: {0}; color: {0};".format(color) + "}") + self.colorDialog.setCurrentColor(color) + + def dataChanged(self, tl, br): + QTableView.dataChanged.emit(tl, br) + self.viewport().update() + + +class ObjectEditDockWidget(QDockWidget): + """A dock widget whose title is set by the current moose + object. Allows switching the moose object. It stores the created + view in a dict for future use. + + TODO possible performance issue: storing the views (along with + their models) ensures the undo history for each object is + retained. But without a limit on the number of views stored, it + will be wasteful on memory. + + """ + objectNameChanged = QtCore.pyqtSignal('PyQt_PyObject') + colorChanged = QtCore.pyqtSignal(object, object) + + def __init__(self, mobj='/', parent=None, flags=None): + QDockWidget.__init__(self, parent=parent) + mobj = moose.element(mobj) + #self.view = view = ObjectEditView(mobj) + self.view = view = ObjectEditView(mobj) + self.view_dict = {mobj: view} + base = QWidget() + layout = QVBoxLayout() + base.setLayout(layout) + layout.addWidget(self.view) + layout.addWidget(QTextEdit()) + self.setWidget(base) + self.setWindowTitle('Edit: %s' % (mobj.path)) + # self.view.colorDialog.colorSelected.connect(self.colorChangedEmit) + + # def clearDict(self): + # self.view_dict.clear() + + def setObject(self, mobj): + element = moose.element(mobj) + try: + view = self.view_dict[element] + except KeyError: + view = ObjectEditView(element) + self.view_dict[element] = view + view.model().objectNameChanged.connect(self.emitObjectNameChanged) + view.colorDialog.colorSelected.connect(lambda color: self.colorChanged. + emit(element, color)) + textEdit = QTextEdit() + view.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) + textEdit.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) + base = QSplitter() + base.setOrientation(QtCore.Qt.Vertical) + layout = QVBoxLayout() + layout.addWidget(view) #, 0, 0) + lineedit = QLineEdit("Notes:") + lineedit.setReadOnly(True) + layout.addWidget(lineedit) + + if (isinstance(mobj, moose.PoolBase) + or isinstance(mobj, moose.ReacBase) + or isinstance(mobj, moose.EnzBase)): + info = moose.Annotator(mobj.path + '/info') + textEdit.setText(QtCore.QString(info.getField('notes'))) + textEdit.textChanged.connect(lambda: info.setField( + 'notes', str(textEdit.toPlainText()))) + layout.addWidget(textEdit) #,1,0) + base.setLayout(layout) + self.setWidget(base) + self.setWindowTitle('Edit: %s' % (element.path)) + view.update() + + def emitObjectNameChanged(self, mobj): + self.objectNameChanged.emit(mobj) + self.setWindowTitle('Edit:%s' % (mobj.path)) + + def undo(self): + if len(self.undoStack) == 0: + raise RuntimeWarning('No more undo information') + index, oldvalue, = self.undoStack.pop() + field = self.fields[index.row()] + currentvalue = self.mooseObject.getField(field) + oldvalue = type(currentvalue)(oldvalue) + self.redoStack.append((index, str(currentvalue))) + self.mooseObject.setField(field, oldvalue) + if field == 'name': + self.objectNameChanged.emit(self.mooseObject) + self.dataChanged.emit(index, index) + +def main(): + from PyQt5.QtWidgets import QApplication, QMainWindow, QAction + app = QApplication(sys.argv) + mainwin = QMainWindow() + c = moose.Compartment("test") + view = ObjectEditView(c, undolen=3) + mainwin.setCentralWidget(view) + action = QAction('Undo', mainwin) + action.setShortcut('Ctrl+z') + action.triggered.connect(view.model().undo) + mainwin.menuBar().addAction(action) + action = QAction('Redo', mainwin) + action.setShortcut('Ctrl+y') + action.triggered.connect(view.model().redo) + mainwin.menuBar().addAction(action) + mainwin.show() + sys.exit(app.exec_()) + + +if __name__ == "__main__": + main() diff --git a/plugins/NeuroKit.py b/moosegui/plugins/NeuroKit.py similarity index 91% rename from plugins/NeuroKit.py rename to moosegui/plugins/NeuroKit.py index 00785c7..290da77 100644 --- a/plugins/NeuroKit.py +++ b/moosegui/plugins/NeuroKit.py @@ -20,8 +20,8 @@ # from collections import defaultdict # import numpy as np # import re -# from PyQt4 import QtGui, QtCore -# from PyQt4.Qt import Qt +# from PyQt5 import QtGui, QtCore +# from PyQt5.Qt import Qt # from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar # import moose @@ -31,12 +31,12 @@ # from msearch import SearchWidget # from checkcombobox import CheckComboBox import sys -import default -import NeuroKitEditor -import NeuroKitRunner +from . import default +from . import NeuroKitEditor +from . import NeuroKitRunner import mplugin import moose -from PyQt4.QtGui import QWidget +from PyQt5.QtGui import QWidget # import NeuroKitPlotter # import NeuroKitRunner diff --git a/plugins/NeuroKitEditor.py b/moosegui/plugins/NeuroKitEditor.py similarity index 95% rename from plugins/NeuroKitEditor.py rename to moosegui/plugins/NeuroKitEditor.py index e0f9c81..9d538ef 100644 --- a/plugins/NeuroKitEditor.py +++ b/moosegui/plugins/NeuroKitEditor.py @@ -17,29 +17,29 @@ import moose import pprint # import NeuroKitEditorWidget -import default - -from PyQt4 import QtGui -from PyQt4 import QtCore -from PyQt4 import Qt -from PyQt4.QtGui import QPushButton -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QHBoxLayout -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QDialog -from PyQt4.QtGui import QTableWidget -from PyQt4.QtGui import QTableWidgetItem -from PyQt4.QtGui import QCheckBox -from PyQt4.QtGui import QComboBox - -from default import * +from . import default + +from PyQt5 import QtGui +from PyQt5 import QtCore +from PyQt5 import Qt +from PyQt5.QtGui import QPushButton +from PyQt5.QtGui import QWidget +from PyQt5.QtGui import QHBoxLayout +from PyQt5.QtGui import QGridLayout +from PyQt5.QtGui import QDialog +from PyQt5.QtGui import QTableWidget +from PyQt5.QtGui import QTableWidgetItem +from PyQt5.QtGui import QCheckBox +from PyQt5.QtGui import QComboBox + +from .default import * from mplugin import * import moose import neuroextractor import moogli import numpy as np from global_constants import preferences -from NeuroKitVisualizer import MorphologyEditor +from .NeuroKitVisualizer import MorphologyEditor class NeuroKitEditor(mplugin.EditorBase): @@ -142,7 +142,7 @@ def createCentralWidget(self): self.morphology = self.createMorphology(self.geometry) self.morphology.set_compartment_order( - map(lambda x : x.path, self.compartmentOrder) + [x.path for x in self.compartmentOrder] ) self.vms = np.empty(len(self.compartmentOrder), dtype=np.float, order='C') diff --git a/plugins/NeuroKitRunner.py b/moosegui/plugins/NeuroKitRunner.py similarity index 95% rename from plugins/NeuroKitRunner.py rename to moosegui/plugins/NeuroKitRunner.py index 9e7f57c..5cfe2b8 100644 --- a/plugins/NeuroKitRunner.py +++ b/moosegui/plugins/NeuroKitRunner.py @@ -9,17 +9,17 @@ from mplot import CanvasWidget import RunWidget from PlotWidgetContainer import PlotWidgetContainer -from NeuroKitVisualizer import MorphologySimulator -from PyQt4 import QtGui, Qt -from PyQt4.QtGui import QLabel -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QToolBar -from PyQt4.QtGui import QPushButton -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QTextEdit +from .NeuroKitVisualizer import MorphologySimulator +from PyQt5 import QtGui, Qt +from PyQt5.QtGui import QLabel +from PyQt5.QtGui import QWidget +from PyQt5.QtGui import QToolBar +from PyQt5.QtGui import QPushButton +from PyQt5.QtGui import QGridLayout +from PyQt5.QtGui import QTextEdit import pprint -# from PyQt4.QtGui import QToolBa -from default import * +# from PyQt5.QtGui import QToolBa +from .default import * import moose import neuroextractor import moogli @@ -74,7 +74,7 @@ def createCentralWidget(self): self.morphology = self.createMorphology(self.geometry) self.morphology.set_compartment_order( - map(lambda x : x.path, self.compartmentOrder) + [x.path for x in self.compartmentOrder] ) self.vms = np.empty(len(self.compartmentOrder), dtype=np.float, order='C') diff --git a/plugins/NeuroKitVisualizer.py b/moosegui/plugins/NeuroKitVisualizer.py similarity index 83% rename from plugins/NeuroKitVisualizer.py rename to moosegui/plugins/NeuroKitVisualizer.py index 046df19..932d3f3 100644 --- a/plugins/NeuroKitVisualizer.py +++ b/moosegui/plugins/NeuroKitVisualizer.py @@ -1,20 +1,23 @@ -from PyQt4 import QtGui, Qt, QtCore -from PyQt4.QtGui import QLabel -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QToolBar -from PyQt4.QtGui import QPushButton -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QTextEdit -from PyQt4.QtCore import QMimeData -from PyQt4.QtGui import QDrag -from PyQt4.QtGui import QPixmap -from PyQt4.QtGui import QPainter -from PyQt4.QtGui import QFont -from PyQt4.QtCore import QPoint +from PyQt5 import QtGui, Qt, QtCore +from PyQt5.QtGui import QLabel +from PyQt5.QtGui import QWidget +from PyQt5.QtGui import QToolBar +from PyQt5.QtGui import QPushButton +from PyQt5.QtGui import QGridLayout +from PyQt5.QtGui import QTextEdit +from PyQt5.QtCore import QMimeData +from PyQt5.QtGui import QDrag +from PyQt5.QtGui import QPixmap +from PyQt5.QtGui import QPainter +from PyQt5.QtGui import QFont +from PyQt5.QtCore import QPoint + import moose -import default import moogli +from moosegui.config import _logger +from moosegui.plugins import default + class MorphologyEditor(moogli.MorphologyViewer): def __init__(self, morphology, width, height, plugin): @@ -26,12 +29,12 @@ def __init__(self, morphology, width, height, plugin): self.plugin = plugin def start(self): - self._timer.timeout.connect(self.next) + self._timer.timeout.connect(self.__next__) self._timer.start(0) @QtCore.pyqtSlot() def show(self): - self._timer.timeout.connect(self.next) + self._timer.timeout.connect(self.__next__) super(MorphologyEditor, self).show() self._timer.start(0) @@ -40,7 +43,7 @@ def hide(self): self._timer.stop() super(MorphologyEditor, self).hide() - def next(self): + def __next__(self): self.frame() info_id = self.select_info.get_id() info_event = self.select_info.get_event_type() @@ -59,12 +62,12 @@ def __init__(self, morphology, width, height, plugin): self.plugin = plugin def start(self): - self._timer.timeout.connect(self.next) + self._timer.timeout.connect(self.__next__) self._timer.start(0) @QtCore.pyqtSlot() def show(self): - self._timer.timeout.connect(self.next) + self._timer.timeout.connect(self.__next__) super(MorphologySimulator, self).show() self._timer.start(0) @@ -74,10 +77,7 @@ def hide(self): super(MorphologySimulator, self).hide() def start_drag(self, info_id): - # pixmap = QPixmap() - # painter = QPainter( pixmap ) - # painter.setFont( QFont("Arial") ); - # painter.drawText( QPoint(100, 100), info_id ); + _logger.info( "started dragging" ) mimeData = QMimeData() mimeData.data =("/" + info_id.partition("/")[2].partition("/")[0], moose.element(info_id)) mimeData.setText(info_id) @@ -88,12 +88,12 @@ def start_drag(self, info_id): drag.setPixmap(pixmap) # drag.setHotSpot(e.pos() - self.rect().topLeft()) dropAction = drag.start(QtCore.Qt.MoveAction) - print(" => ", dropAction) + print((" => ", dropAction)) self.select_info.set_event_type(0) self._timer.start(0) return - def next(self): + def __next__(self): self.frame() info_id = self.select_info.get_id() info_event = self.select_info.get_event_type() diff --git a/plugins/PreferencesPresenter.py b/moosegui/plugins/PreferencesPresenter.py similarity index 97% rename from plugins/PreferencesPresenter.py rename to moosegui/plugins/PreferencesPresenter.py index 7b4a368..b8487fe 100644 --- a/plugins/PreferencesPresenter.py +++ b/moosegui/plugins/PreferencesPresenter.py @@ -1,22 +1,25 @@ -from __future__ import print_function +# -*- coding: utf-8 -*- + import sys -from PyQt4 import Qt, QtGui, QtCore -from PyQt4.QtCore import QObject -from PyQt4.QtCore import pyqtSignal -from PyQt4.QtGui import QColor -from PyQt4.QtGui import QGroupBox -from PreferencesView import PreferencesView -import moose -from defines import * import json import os -PREFERENCES_FILEPATH = os.path.join( os.path.dirname(os.path.abspath(__file__)) - , "datastore/preferences.json" - ) +from PyQt5 import Qt +from PyQt5.QtCore import QObject +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtGui import QColor -class PreferencesPresenter(QObject): +import moose +from moosegui.plugins.PreferencesView import PreferencesView +from moosegui.plugins.defines import * + +PREFERENCES_FILEPATH = os.path.join( + os.path.dirname(os.path.abspath(__file__)) + , "datastore/preferences.json" + ) + +class PreferencesPresenter(QObject): electricalSimulationIntervalChanged = pyqtSignal(float) electricalPlotUpdateIntervalChanged = pyqtSignal(float) electricalDefaultSimulationRuntimeChanged = pyqtSignal(float) @@ -439,7 +442,8 @@ def cancelElectricalVisualizationSettings(self): def main(): - app = QtGui.QApplication(sys.argv) + from PyQt5.QtWidgets import QApplication + app = QApplication(sys.argv) preferences = PreferencesPresenter() preferences.view.show() sys.exit(app.exec_()) diff --git a/plugins/PreferencesView.py b/moosegui/plugins/PreferencesView.py similarity index 79% rename from plugins/PreferencesView.py rename to moosegui/plugins/PreferencesView.py index 1699c9a..94ecef8 100644 --- a/plugins/PreferencesView.py +++ b/moosegui/plugins/PreferencesView.py @@ -1,46 +1,41 @@ -from __future__ import print_function -import PyQt4 -from PyQt4 import Qt, QtGui, QtCore -from PyQt4.QtCore import pyqtSignal -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QButtonGroup -from PyQt4.QtGui import QRadioButton -from PyQt4.QtGui import QVBoxLayout -from PyQt4.QtGui import QLabel -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QLineEdit -from PyQt4.QtGui import QDoubleValidator -from PyQt4.QtGui import QComboBox -from PyQt4.QtGui import QTabWidget -from PyQt4.QtGui import QPushButton -from PyQt4.QtGui import QColorDialog -from PyQt4.QtGui import QColor -from PyQt4.QtGui import QSizePolicy +# -*- coding: utf-8 -*- + import sys +import logging + +from PyQt5 import Qt, QtCore +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtWidgets import QWidget, QButtonGroup, QRadioButton, QApplication +from PyQt5.QtWidgets import QLineEdit, QGridLayout +from PyQt5.QtWidgets import QLabel +from PyQt5.QtWidgets import QTabWidget, QPushButton, QColorDialog +# from PyQt5.QtWidgets import QSizePolicy +from PyQt5.QtWidgets import QApplication +from PyQt5.QtGui import QDoubleValidator class PreferencesView(QTabWidget): - - closed = pyqtSignal() + closed = pyqtSignal() def __init__(self, parent = None): super(PreferencesView, self).__init__(parent) - self.setWindowTitle("Preferences") - # self.setFixedSize(self.maximumSize()) - # self.setMinimumSize(self.maximumSize()) - # self.setMaximumSize(self.maximumSize()) + # If QApplication does not exists then don't do anything. + if QApplication.instance() is None: + logging.warn("No QApplication exists. Won't do anything.") + return -1 - # self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) + self.setWindowTitle("Preferences") self.chemicalSimulationDt = self.createFloatingPointEditor() self.chemicalDiffusionDt = self.createFloatingPointEditor() self.chemicalPlotUpdateInterval = self.createFloatingPointEditor() self.chemicalDefaultSimulationRuntime = self.createFloatingPointEditor() self.chemicalGuiUpdateInterval = self.createFloatingPointEditor() self.chemicalSolver = QButtonGroup() - self.chemicalSolvers = { "Exponential Euler" : QRadioButton("Exponential Euler") - , "Gillespie" : QRadioButton("Gillespie") - , "Runge Kutta" : QRadioButton("Runge Kutta") - } + self.chemicalSolvers = { + "Exponential Euler" : QRadioButton("Exponential Euler") + , "Gillespie" : QRadioButton("Gillespie") + , "Runge Kutta" : QRadioButton("Runge Kutta") + } self.chemicalSimulationApply = QPushButton("Apply") self.chemicalSimulationCancel = QPushButton("Cancel") self.electricalSimulationDt = self.createFloatingPointEditor() @@ -48,9 +43,10 @@ def __init__(self, parent = None): self.electricalDefaultSimulationRuntime = self.createFloatingPointEditor() self.electricalGuiUpdateInterval = self.createFloatingPointEditor() self.electricalSolver = QButtonGroup() - self.electricalSolvers = { "Gillespie" : QRadioButton("Gillespie") - , "Runge Kutta" : QRadioButton("Runge Kutta") - } + self.electricalSolvers = { + "Gillespie" : QRadioButton("Gillespie") + , "Runge Kutta" : QRadioButton("Runge Kutta") + } self.electricalSimulationApply = QPushButton("Apply") self.electricalSimulationCancel = QPushButton("Cancel") self.electricalVisualizationApply = QPushButton("Apply") @@ -72,13 +68,13 @@ def closeEvent(self, event): def create(self): # Set up the column titles self.setUsesScrollButtons(True) - self.setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) - self.addTab( self.createChemicalSettingsTab(),"Chemical") - self.addTab( self.createElectricalSettingsTab(),"Electrical") + self.setFocusPolicy(QtCore.Qt.NoFocus) + self.addTab( self.createChemicalSettingsTab(), "Chemical") + self.addTab( self.createElectricalSettingsTab(), "Electrical") def createChemicalSettingsTab(self): chemicalSettingsTab = QWidget() - layout = QtGui.QGridLayout() + layout = QGridLayout() chemicalSettingsTab.setLayout(layout) layout.addWidget(QLabel('Simulation dt'), 0, 0) @@ -102,7 +98,7 @@ def createChemicalSettingsTab(self): for solver in self.chemicalSolvers: layout.addWidget(self.chemicalSolvers[solver], 5 + index, 1) self.chemicalSolver.addButton(self.chemicalSolvers[solver], index) - self.chemicalSolvers[solver].setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) + self.chemicalSolvers[solver].setFocusPolicy(QtCore.Qt.NoFocus) index += 1 self.chemicalSolver.setExclusive(True) @@ -128,13 +124,12 @@ def createElectricalSettingsTab(self): electricalSettingsTab.setTabShape(QTabWidget.Triangular) electricalSettingsTab.setDocumentMode(True) electricalSettingsTab.setUsesScrollButtons(True) - electricalSettingsTab.setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) + electricalSettingsTab.setFocusPolicy(QtCore.Qt.NoFocus) return electricalSettingsTab def createElectricalSimulationSettingsTab(self): - widget = QWidget() - layout = QtGui.QGridLayout() + layout = QGridLayout() widget.setLayout(layout) layout.addWidget(QLabel('Simulation dt'), 0, 0) @@ -155,7 +150,7 @@ def createElectricalSimulationSettingsTab(self): for solver in self.electricalSolvers: # layout.addWidget(self.electricalSolvers[solver], 5 + index, 1) self.electricalSolver.addButton(self.electricalSolvers[solver], index) - self.electricalSolvers[solver].setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) + self.electricalSolvers[solver].setFocusPolicy(QtCore.Qt.NoFocus) index += 1 self.electricalSolver.setExclusive(True) @@ -169,7 +164,7 @@ def createElectricalSimulationSettingsTab(self): def createElectricalSimulationVisualizationTab(self): widget = QWidget() - layout = QtGui.QGridLayout() + layout = QGridLayout() widget.setLayout(layout) layout.addWidget(QLabel('Base Membrane Voltage'), 1, 0) @@ -179,7 +174,7 @@ def createElectricalSimulationVisualizationTab(self): self.electricalBaseColorDialog.setOption(QColorDialog.ShowAlphaChannel, True) layout.addWidget(self.electricalBaseColorButton, 2, 1) self.electricalBaseColorButton.clicked.connect(self.electricalBaseColorDialog.show) - self.electricalBaseColorButton.setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) + self.electricalBaseColorButton.setFocusPolicy(QtCore.Qt.NoFocus) self.electricalBaseColorDialog.colorSelected.connect( lambda color: self.electricalBaseColorButton.setStyleSheet( "QPushButton {" @@ -195,7 +190,7 @@ def createElectricalSimulationVisualizationTab(self): self.electricalPeakColorDialog.setOption(QColorDialog.ShowAlphaChannel, True) layout.addWidget(self.electricalPeakColorButton, 4, 1) self.electricalPeakColorButton.clicked.connect(self.electricalPeakColorDialog.show) - self.electricalPeakColorButton.setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) + self.electricalPeakColorButton.setFocusPolicy(QtCore.Qt.NoFocus) self.electricalPeakColorDialog.colorSelected.connect( lambda color: self.electricalPeakColorButton.setStyleSheet( "QPushButton {" @@ -208,7 +203,7 @@ def createElectricalSimulationVisualizationTab(self): self.electricalBackgroundColorDialog.setOption(QColorDialog.ShowAlphaChannel, True) layout.addWidget(self.electricalBackgroundColorButton, 5, 1) self.electricalBackgroundColorButton.clicked.connect(self.electricalBackgroundColorDialog.show) - self.electricalBackgroundColorButton.setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) + self.electricalBackgroundColorButton.setFocusPolicy(QtCore.Qt.NoFocus) self.electricalBackgroundColorDialog.colorSelected.connect( lambda color: self.electricalBackgroundColorButton.setStyleSheet( "QPushButton {" @@ -229,7 +224,7 @@ def createFloatingPointEditor(self, value = 0.0, minValue = float("-inf"), maxVa return floatingPointEditor def main(): - app = QtGui.QApplication(sys.argv) + app = QApplication(sys.argv) widget = PreferencesView() widget.show() sys.exit(app.exec_()) diff --git a/plugins/README b/moosegui/plugins/README similarity index 100% rename from plugins/README rename to moosegui/plugins/README diff --git a/plugins/Runner.py b/moosegui/plugins/Runner.py similarity index 91% rename from plugins/Runner.py rename to moosegui/plugins/Runner.py index e2dd0aa..c541e41 100644 --- a/plugins/Runner.py +++ b/moosegui/plugins/Runner.py @@ -1,9 +1,9 @@ import math import moose -from PyQt4 import Qt, QtGui, QtCore -from PyQt4.QtCore import QTimer -from PyQt4.QtCore import QObject -from PyQt4.QtCore import pyqtSignal +from PyQt5 import Qt, QtGui, QtCore +from PyQt5.QtCore import QTimer +from PyQt5.QtCore import QObject +from PyQt5.QtCore import pyqtSignal class Runner(QObject): """Helper class to control simulation execution @@ -59,9 +59,9 @@ def runSimulation(self, runTime): # print(self.simulationInterval) # print(self.runSequence) self.simulationStarted.emit(self.clock.currentTime + self.runTime) - QTimer.singleShot(0, self.next) + QTimer.singleShot(0, self.__next__) - def next(self): + def __next__(self): if self.pause: return if len(self.runSequence) == 0: @@ -69,19 +69,19 @@ def next(self): return moose.start(self.runSequence.pop(0)) self.simulationProgressed.emit(self.clock.currentTime) - QTimer.singleShot(0, self.next) + QTimer.singleShot(0, self.__next__) def pauseSimulation(self): self.pause = True def unpauseSimulation(self): self.pause = False - self.next() + next(self) def togglePauseSimulation(self): if self.pause : self.pause = False - self.next() + next(self) else: self.pause = True diff --git a/plugins/__init__.py b/moosegui/plugins/__init__.py similarity index 100% rename from plugins/__init__.py rename to moosegui/plugins/__init__.py diff --git a/plugins/buildkkit.py b/moosegui/plugins/buildkkit.py similarity index 83% rename from plugins/buildkkit.py rename to moosegui/plugins/buildkkit.py index 6e85d60..291d5a0 100644 --- a/plugins/buildkkit.py +++ b/moosegui/plugins/buildkkit.py @@ -1,25 +1,31 @@ +# -*- coding: utf-8 -*- + import sys import os import math import re -from PyQt4 import QtGui, QtCore, Qt -#import pygraphviz as pgv -import networkx as nx -#sys.path.insert(0, '/home/harsha/BuildQ/gui') -import numpy as np -import config import pickle -from default import * -from moose import * -sys.path.append('plugins') -from mplugin import * -from kkitUtil import * -from kkitQGraphics import PoolItem, ReacItem,EnzItem,CplxItem,ComptItem -from kkitViewcontrol import * -from kkitCalcArrow import * -from kkitOrdinateUtil import * import posixpath -from mtoolbutton import MToolButton + +from PyQt5 import QtGui, QtCore, Qt +from PyQt5.QtWidgets import QFileDialog, QWidget +from PyQt5.QtWidgets import QGraphicsScene, QMenu, QMessageBox + +if __name__ == "__main__": + from PyQt5.QtWidgets import QApplication + app = QApplication(sys.argv) + +import networkx as nx +import numpy as np + +from moosegui import config +from moosegui.plugins.default import * +from moosegui.plugins.kkitUtil import * +from moosegui.plugins.kkitQGraphics import * +from moosegui.plugins.kkitViewcontrol import * +from moosegui.plugins.kkitCalcArrow import * +from moosegui.plugins import kkitOrdinateUtil +from moosegui.mtoolbutton import MToolButton class KkitPlugin(MoosePlugin): """Default plugin for MOOSE GUI""" @@ -66,25 +72,25 @@ class KkitEditorView(MooseEditorView): def __init__(self, plugin): MooseEditorView.__init__(self, plugin) ''' - self.insertMenu = QtGui.QMenu('Insert') + self.insertMenu = QMenu('Insert') sortList = ['CubeMesh','CylMesh','Pool','FuncPool','SumFunc','Reac','Enz','MMenz','StimulusTable','Table'] for slist in sortList: action = QtGui.QAction(moose.element('/classes/'+slist).name, self.insertMenu) self._toolBars.append(action) ''' - self.fileinsertMenu = QtGui.QMenu('&File') + self.fileinsertMenu = QMenu('&File') if not hasattr(self,'SaveModelAction'): self.saveModelAction = QtGui.QAction('SaveToSBMLFile', self) - self.saveModelAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+S", None, QtGui.QApplication.UnicodeUTF8)) - self.connect(self.saveModelAction, QtCore.SIGNAL('triggered()'), self.SaveModelDialogSlot) + self.saveModelAction.setShortcut( "Ctrl+S" ) + self.saveModelAction.triggered.connect(self.SaveModelDialogSlot) self.fileinsertMenu.addAction(self.saveModelAction) + self._menus.append(self.fileinsertMenu) def SaveModelDialogSlot(self): type_sbml = 'SBML' - print " here in saveModelDialog" filters = {'SBML(*.xml)': type_sbml} - filename,filter_ = QtGui.QFileDialog.getSaveFileNameAndFilter(None,'Save File','',';;'.join(filters)) + filename,filter_ = QFileDialog.getSaveFileNameAndFilter(None,'Save File','',';;'.join(filters)) extension = "" if str(filename).rfind('.') != -1: filename = filename[:str(filename).rfind('.')] @@ -93,7 +99,6 @@ def SaveModelDialogSlot(self): if filename: filename = filename+extension if filters[str(filter_)] == 'SBML': - print "here",filename," ",self.plugin.modelRoot moose.writeSBML(str(filename),self.plugin.modelRoot) def getToolPanes(self): return super(KkitEditorView, self).getToolPanes() @@ -117,18 +122,18 @@ def getCentralWidget(self): class KineticsWidget(EditorWidgetBase): def __init__(self, *args): - EditorWidgetBase.__init__(self, *args) + EditorWidgetBase.__init__(self, *args) self.setAcceptDrops(True) self.border = 10 - self.sceneContainer = QtGui.QGraphicsScene(self) + self.sceneContainer = QGraphicsScene(self) self.sceneContainer.setSceneRect(self.sceneContainer.itemsBoundingRect()) self.sceneContainer.setBackgroundBrush(QtGui.QColor(230,220,219,120)) - self.insertMenu = QtGui.QMenu('&Insert') + self.insertMenu = QMenu('&Insert') self._menus.append(self.insertMenu) self.insertMapper = QtCore.QSignalMapper(self) - classlist = ['CubeMesh','CylMesh','Pool','FuncPool','SumFunc','Reac','Enz','MMenz','StimulusTable','Table'] + classlist = ['CubeMesh','CylMesh','Pool', 'Reac','Enz','MMenz','StimulusTable','Table'] insertMapper, actions = self.getInsertActions(classlist) for action in actions: @@ -150,14 +155,14 @@ def sizeHint(self): def updateModelView(self): #print "update model view",self.modelRoot if self.modelRoot == '/': - m = wildcardFind('/##[ISA=ChemCompt]') + m = moose.wildcardFind('/##[ISA=ChemCompt]') else: - m = wildcardFind(self.modelRoot+'/##[ISA=ChemCompt]') + m = moose.wildcardFind(self.modelRoot+'/##[ISA=ChemCompt]') #print "111",self.modelRoot,m if not m: # when we want an empty GraphicView while creating new model, # then remove all the view and add an empty view - if hasattr(self, 'view') and isinstance(self.view, QtGui.QWidget): + if hasattr(self, 'view') and isinstance(self.view, QWidget): self.layout().removeWidget(self.view) self.view = GraphicalView(self.sceneContainer,self.border,self) self.layout().addWidget(self.view) @@ -180,20 +185,17 @@ def updateModelView(self): colormap_file.close() # Compartment and its members are setup """ - self.meshEntry,self.xmin,self.xmax,self.ymin,self.ymax,self.noPositionInfo = setupMeshObj(self.modelRoot) - # srcdesConnection dictonary will have connection information between src and des """ + o, self.meshEntry, self.xmin, self.xmax, self.ymin, \ + self.ymax, self.noPositionInfo = kkitOrdinateUtil.setupMeshObj(self.modelRoot) self.srcdesConnection = {} - setupItem(self.modelRoot,self.srcdesConnection) + kkitOrdinateUtil.setupItem(self.modelRoot,self.srcdesConnection) if self.noPositionInfo: self.autocoordinates = True - QtGui.QMessageBox.warning(self, - 'No coordinates found for the model', - '\n Automatic layouting will be done') - #raise Exception('Unsupported kkit version') - - - self.xmin,self.xmax,self.ymin,self.ymax,self.autoCordinatepos = autoCoordinates(self.meshEntry,self.srcdesConnection) + QMessageBox.warning(self, + 'No coordinates found for the model', + '\n Automatic layouting will be done') + kkitOrdinateUtil.autoCoordinates(self.meshEntry,self.srcdesConnection) # Scale factor to translate the x -y position to fit the Qt graphicalScene, scene width. """ if self.xmax-self.xmin != 0: @@ -223,28 +225,23 @@ def updateModelView(self): # All the moose Object are connected for visualization self.drawLine_arrow(itemignoreZooming=False) - if hasattr(self, 'view') and isinstance(self.view, QtGui.QWidget): + if hasattr(self, 'view') and isinstance(self.view,QWidget): self.layout().removeWidget(self.view) self.view = GraphicalView(self.sceneContainer,self.border,self) hLayout = QtGui.QGridLayout(self) - self.setLayout(hLayout) + self.setLayout(hLayout) hLayout.addWidget(self.view) #self.layout().addWidget(self.view) def mooseObjOntoscene(self): # All the compartments are put first on to the scene \ # Need to do: Check With upi if empty compartments exist - for cmpt in sorted(self.meshEntry.iterkeys()): + for cmpt in sorted(self.meshEntry.keys()): self.createCompt(cmpt) self.qGraCompt[cmpt] - #comptRef = self.qGraCompt[cmpt] - #Enzymes of all the compartments are placed first, \ - # so that when cplx (which is pool object) queries for its parent, it gets its \ - # parent enz co-ordinates with respect to QGraphicsscene """ - - for cmpt,memb in self.meshEntry.items(): - for enzObj in find_index(memb,'enzyme'): + for cmpt,memb in list(self.meshEntry.items()): + for enzObj in memb.get('enzyme', []): enzinfo = enzObj.path+'/info' if enzObj.className == 'ZEnz': enzItem = EnzItem(enzObj,self.qGraCompt[cmpt]) @@ -253,32 +250,32 @@ def mooseObjOntoscene(self): self.setupDisplay(enzinfo,enzItem,"enzyme") self.setupSlot(enzObj,enzItem) - for cmpt,memb in self.meshEntry.items(): - for poolObj in find_index(memb,'pool'): + for cmpt,memb in list(self.meshEntry.items()): + for poolObj in kkitOrdinateUtil.find_index(memb,'pool'): poolinfo = poolObj.path+'/info' poolItem = PoolItem(poolObj,self.qGraCompt[cmpt]) self.setupDisplay(poolinfo,poolItem,"pool") self.setupSlot(poolObj,poolItem) - for cplxObj in find_index(memb,'cplx'): + for cplxObj in kkitOrdinateUtil.find_index(memb,'cplx'): cplxinfo = (cplxObj[0].parent).path+'/info' cplxItem = CplxItem(cplxObj,self.mooseId_GObj[element(cplxObj[0]).parent.getId()]) self.setupDisplay(cplxinfo,cplxItem,"cplx") self.setupSlot(cplxObj,cplxItem) - for reaObj in find_index(memb,'reaction'): + for reaObj in kkitOrdinateUtil.find_index(memb,'reaction'): reainfo = reaObj.path+'/info' reaItem = ReacItem(reaObj,self.qGraCompt[cmpt]) self.setupDisplay(reainfo,reaItem,"reaction") self.setupSlot(reaObj,reaItem) - for tabObj in find_index(memb,'table'): + for tabObj in kkitOrdinateUtil.find_index(memb,'table'): tabinfo = tabObj.path+'/info' tabItem = PoolItem(tabObj,self.qGraCompt[cmpt]) self.setupDisplay(tabinfo,tabItem,"tab") self.setupSlot(tabObj,tabItem) # compartment's rectangle size is calculated depending on children - for k, v in self.qGraCompt.items(): + for k, v in list(self.qGraCompt.items()): rectcompt = v.childrenBoundingRect() v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) v.setPen(QtGui.QPen(Qt.QColor(66,66,66,100), 5, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) @@ -339,7 +336,7 @@ def updateItemSlot(self, mooseObject): #slot for updating the display item. #In this case if the name is updated from the keyboard both in mooseobj and gui gets updation changedItem = '' - for item in self.sceneContainer.items(): + for item in list(self.sceneContainer.items()): if isinstance(item,PoolItem): if mooseObject.getId() == element(item.mobj).getId(): item.updateSlot() @@ -349,7 +346,7 @@ def updateItemSlot(self, mooseObject): def positionChange(self,mooseObject): #If the item position changes, the corresponding arrow's are calculated if isinstance(element(mooseObject),CubeMesh): - for k, v in self.qGraCompt.items(): + for k, v in list(self.qGraCompt.items()): mesh = mooseObject.path+'/mesh[0]' if k.path == mesh: for rectChilditem in v.childItems(): @@ -357,7 +354,7 @@ def positionChange(self,mooseObject): else: mobj = self.mooseId_GObj[mooseObject.getId()] self.updateArrow(mobj) - for k, v in self.qGraCompt.items(): + for k, v in list(self.qGraCompt.items()): rectcompt = v.childrenBoundingRect() v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) @@ -366,7 +363,7 @@ def emitItemtoEditor(self,mooseObject): self.editObject.emit(mooseObject.path) def drawLine_arrow(self, itemignoreZooming=False): - for inn,out in self.srcdesConnection.items(): + for inn,out in list(self.srcdesConnection.items()): # self.srcdesConnection is dictionary which contains key,value \ # key is Enzyme or Reaction and value [[list of substrate],[list of product]] (tuple) # key is FuncBase and value is [list of pool] (list) @@ -374,7 +371,7 @@ def drawLine_arrow(self, itemignoreZooming=False): #src = self.mooseId_GObj[inn] if isinstance(out,tuple): if len(out[0])== 0: - print inn.className + ':' +inn[0].name+ " doesn't output message" + print(inn.className + ':' +inn[0].name+ " doesn't output message") else: src = self.mooseId_GObj[inn] for items in (items for items in out[0] ): @@ -382,7 +379,7 @@ def drawLine_arrow(self, itemignoreZooming=False): self.lineCord(src,des,items,itemignoreZooming) if len(out[1]) == 0: - print inn.className + ':' +inn[0].name+ " doesn't output message" + print(inn.className + ':' +inn[0].name+ " doesn't output message") else: for items in (items for items in out[1] ): des = self.mooseId_GObj[element(items[0]).getId()] @@ -390,7 +387,7 @@ def drawLine_arrow(self, itemignoreZooming=False): elif isinstance(out,list): if len(out) == 0: - print "Func pool doesn't have sumtotal" + print("Func pool doesn't have sumtotal") else: src = self.mooseId_GObj[element(inn).getId()] for items in (items for items in out ): @@ -401,7 +398,7 @@ def lineCord(self,src,des,type_no,itemignoreZooming): endtype = type_no[1] line = 0 if (src == "") and (des == ""): - print "Source or destination is missing or incorrect" + print("Source or destination is missing or incorrect") return srcdes_list = [src,des,endtype,line] arrow = calcArrow(srcdes_list,itemignoreZooming,self.iconScale) @@ -414,14 +411,14 @@ def lineCord(self,src,des,type_no,itemignoreZooming): line = line +1 if type_no[2] > 5: - print "Higher order reaction will not be displayed" + print("Higher order reaction will not be displayed") def drawLine(self,srcdes_list,arrow): src = srcdes_list[0] des = srcdes_list[1] endtype = srcdes_list[2] line = srcdes_list[3] - source = element(next((k for k,v in self.mooseId_GObj.items() if v == src), None)) + source = element(next((k for k,v in list(self.mooseId_GObj.items()) if v == src), None)) for l,v,o in self.object2line[src]: if v == des and o ==line: l.setPolygon(arrow) @@ -441,7 +438,7 @@ def drawLine(self,srcdes_list,arrow): if ( (endtype == 's') or (endtype == 'p')): pen.setColor(QtCore.Qt.red) elif(endtype != 'cplx'): - p1 = (next((k for k,v in self.mooseId_GObj.items() if v == src), None)) + p1 = (next((k for k,v in list(self.mooseId_GObj.items()) if v == src), None)) pinfo = p1.path+'/info' color,bgcolor = getColor(pinfo,self.colorMap) pen.setColor(color) @@ -478,7 +475,7 @@ def cplxUpdatearrow(self,srcdes): # srcdes which is 'EnzItem' from this,get ChildItems are retrived (b'cos cplx is child of zombieEnz) #And cplxItem is passed for updatearrow - #Note: Here at this point enzItem has just one child which is cplxItem and childItems returns, PyQt4.QtGui.QGraphicsEllipseItem,CplxItem + #Note: Here at this point enzItem has just one child which is cplxItem and childItems returns, PyQt5.QtGui.QGraphicsEllipseItem,CplxItem #Assuming CplxItem is always[1], but still check if not[0], if something changes in structure one need to keep an eye. if (srcdes.childItems()[1],CplxItem): self.updateArrow(srcdes.childItems()[1]) @@ -514,14 +511,14 @@ def keyPressEvent(self,event): self.view.fitInView(self.sceneContainer.itemsBoundingRect().x()-10,self.sceneContainer.itemsBoundingRect().y()-10,self.sceneContainer.itemsBoundingRect().width()+20,self.sceneContainer.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio) def updateItemTransformationMode(self, on): - for v in self.sceneContainer.items(): + for v in list(self.sceneContainer.items()): if( not isinstance(v,ComptItem)): #if ( isinstance(v, PoolItem) or isinstance(v, ReacItem) or isinstance(v, EnzItem) or isinstance(v, CplxItem) ): if isinstance(v,KineticsDisplayItem): v.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, on) def updateScale( self, scale ): - for item in self.sceneContainer.items(): + for item in list(self.sceneContainer.items()): if isinstance(item,KineticsDisplayItem): item.refresh(scale) #iteminfo = item.mobj.path+'/info' @@ -544,7 +541,7 @@ def updateScale( self, scale ): item.bg.setRect(0, 0, item.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '), item.gobj.boundingRect().height()) self.drawLine_arrow(itemignoreZooming=False) - for k, v in self.qGraCompt.items(): + for k, v in list(self.qGraCompt.items()): rectcompt = v.childrenBoundingRect() comptPen = v.pen() comptWidth = self.defaultComptsize*self.iconScale @@ -553,7 +550,6 @@ def updateScale( self, scale ): v.setRect(rectcompt.x()-comptWidth,rectcompt.y()-comptWidth,(rectcompt.width()+2*comptWidth),(rectcompt.height()+2*comptWidth)) if __name__ == "__main__": - app = QtGui.QApplication(sys.argv) size = QtCore.QSize(1024 ,768) modelPath = 'Kholodenko' #modelPath = 'acc61' @@ -563,24 +559,18 @@ def updateScale( self, scale ): modelPath = '5AreacB' itemignoreZooming = False try: - filepath = '../../Demos/Genesis_files/'+modelPath+'.g' - #filepath = '/home/harsha/genesis_files/gfile/'+modelPath+'.g' - print filepath - f = open(filepath, "r") - loadModel(filepath,'/'+modelPath) - + sdir = os.path.dirname(__file__) + filepath = os.path.join(sdir, '../../data/Kholodenko.g') + print(filepath) + moose.loadModel(filepath, '/'+modelPath) moose.le('/'+modelPath+'/kinetics') dt = KineticsWidget() dt.modelRoot ='/'+modelPath - ''' Loading moose signalling model in python ''' - #execfile('/home/harsha/BuildQ/Demos/Genesis_files/scriptKineticModel.py') - #dt.modelRoot = '/model' - dt.updateModelView() dt.show() - except IOError, what: + except IOError as what: (errno, strerror) = what - print "Error number",errno,"(%s)" %strerror + print("Error number",errno,"(%s)" %strerror) sys.exit(0) sys.exit(app.exec_()) diff --git a/moosegui/plugins/constants.py b/moosegui/plugins/constants.py new file mode 100644 index 0000000..e8eeaf0 --- /dev/null +++ b/moosegui/plugins/constants.py @@ -0,0 +1,24 @@ +INVALID = 6 + +INTERIOR = 7 +BOUNDARY = 8 + +SAME_OBJECT = 9 +OTHER_OBJECT = 10 +NO_OBJECT = 11 + +RUBBERBAND_SELECTION = 12 +VALID = 13 + +ITEM = 0 +CONNECTOR = 1 +CONNECTION = 2 +EMPTY = 3 + +COMPARTMENT = 14 +COMPARTMENT_BOUNDARY = 4 +COMPARTMENT_INTERIOR = 5 + +GROUP = 15 +GROUP_BOUNDARY = 16 +GROUP_INTERIOR = 17 diff --git a/plugins/datastore/preferences.json b/moosegui/plugins/datastore/preferences.json similarity index 100% rename from plugins/datastore/preferences.json rename to moosegui/plugins/datastore/preferences.json diff --git a/plugins/default.py b/moosegui/plugins/default.py similarity index 63% rename from plugins/default.py rename to moosegui/plugins/default.py index 3cb2840..0475a0e 100644 --- a/plugins/default.py +++ b/moosegui/plugins/default.py @@ -1,104 +1,45 @@ -# default.py --- -# -# Filename: default.py +# -*- coding: utf-8 -*- + # Description: # Author: Subhasis Ray # Maintainer: # Created: Tue Nov 13 15:58:31 2012 (+0530) -# Version: -# Last-Updated: Mon Sep 10 23:35:00 2018 (+0530) -# By: Harsha -# Update #: -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# The default placeholder plugin for MOOSE -# -# -# Change log: -# -# -# -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: -''' -2018 -Sep 10: replace addSolver to mooseAddChemSolver from moose.chemUtil's -2013 -Oct 5: could not recreate if object already exist in moose which was allowed earlier - now if object exist need to use element which is cleaned here - -''' import sys -import config import pickle import os from collections import defaultdict import numpy as np -from PyQt4 import QtGui, QtCore -from PyQt4.Qt import Qt -import moose -from moose import utils -import mtree -from mtoolbutton import MToolButton -from msearch import SearchWidget -from checkcombobox import CheckComboBox - -from mplugin import MoosePluginBase, EditorBase, EditorWidgetBase, PlotBase, RunBase -#from defaultToolPanel import DefaultToolPanel -#from DataTable import DataTable from matplotlib import rcParams +from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar rcParams.update({'figure.autolayout': True}) -from matplotlib.lines import Line2D -from PlotWidgetContainer import PlotWidgetContainer - -from PyQt4 import QtCore, QtGui -from PyQt4.QtGui import QDoubleValidator -from kkitUtil import getColor -from Runner import Runner -# from Runner import Runner -# from __future__ import print_function -from PyQt4 import QtGui, QtCore -from PyQt4.QtGui import QToolBar -from PyQt4.QtGui import QToolButton -from PyQt4.QtGui import QLabel -from PyQt4.QtGui import QIcon -from PyQt4.QtGui import QLineEdit -from PyQt4.QtGui import QErrorMessage -from PyQt4.QtGui import QSizeGrip -from PyQt4.QtGui import QIcon -from PyQt4.QtGui import QPixmap -from PyQt4.QtGui import QAction -from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar -#from EventBlocker import EventBlocker -# from PlotNavigationToolbar import PlotNavigationToolbar -from global_constants import preferences -#from setsolver import * -from moose.chemUtil.add_Delete_ChemicalSolver import * + +from PyQt5 import QtCore, QtGui +from PyQt5.QtCore import Qt +from PyQt5.QtCore import pyqtSlot, pyqtSignal + +from PyQt5.QtWidgets import QToolBar, QToolButton +from PyQt5.QtWidgets import QLabel, QLineEdit +from PyQt5.QtWidgets import QAction, QSizePolicy +from PyQt5.QtWidgets import QWidget, QHBoxLayout +from PyQt5.QtWidgets import QScrollArea, QGridLayout, QMessageBox +from PyQt5.QtWidgets import QMenu, QApplication, QDockWidget +from PyQt5.QtWidgets import QFrame, QFileDialog, QVBoxLayout + +# moose +import moose + +# moosegui +from moosegui.global_constants import preferences +from moosegui.mtoolbutton import MToolButton +from moosegui.checkcombobox import CheckComboBox +from moosegui.mplugin import MoosePluginBase, EditorBase, EditorWidgetBase, RunBase +from moosegui.plugins.kkitUtil import getColor +from moosegui.plugins.Runner import Runner +from moosegui import config +from moosegui import mtree +from moosegui.PlotWidgetContainer import PlotWidgetContainer ELECTRICAL_MODEL = 0 CHEMICAL_MODEL = 1 @@ -107,8 +48,7 @@ class MoosePlugin(MoosePluginBase): """Default plugin for MOOSE GUI""" def __init__(self, root, mainwindow): MoosePluginBase.__init__(self, root, mainwindow) - #print "mplugin ",self.getRunView() - #self.connect(self, QtCore.SIGNAL("tableCreated"),self.getRunView().getCentralWidget().plotAllData) + def getPreviousPlugin(self): return None @@ -132,13 +72,7 @@ def getEditorView(self): self.currentView = self.editorView return self.editorView - def getPlotView(self): - if not hasattr(self, 'plotView'): - self.plotView = PlotView(self) - return self.plotView - def getRunView(self): - if not hasattr(self, 'runView') or self.runView is None: self.runView = RunView(self.modelRoot, self) return self.runView @@ -158,7 +92,7 @@ def __init__(self, plugin): self.__initToolBars() def __initMenus(self): - editMenu = QtGui.QMenu('&Edit') + editMenu = QMenu('&Edit') for menu in self.getCentralWidget().getMenus(): editMenu.addMenu(menu) self._menus.append(editMenu) @@ -243,7 +177,7 @@ class DefaultEditorWidget(EditorWidgetBase): """ def __init__(self, *args): EditorWidgetBase.__init__(self, *args) - layout = QtGui.QHBoxLayout() + layout = QHBoxLayout() self.setLayout(layout) self.tree = MooseTreeEditor() self.tree.setAcceptDrops(True) @@ -254,11 +188,12 @@ def getTreeMenu(self): try: return self.treeMenu except AttributeError: - self.treeMenu = QtGui.QMenu() + self.treeMenu = QMenu() + self.tree.setContextMenuPolicy(Qt.CustomContextMenu) self.tree.customContextMenuRequested.connect(lambda : self.treeMenu.exec_(QtGui.QCursor.pos()) ) # Inserting a child element - self.insertMenu = QtGui.QMenu('Insert') + self.insertMenu = QMenu('Insert') self._menus.append(self.insertMenu) self.treeMenu.addMenu(self.insertMenu) self.insertMapper = QtCore.QSignalMapper(self) @@ -273,8 +208,8 @@ def getTreeMenu(self): insertMapper, actions = self.getInsertActions(classlist) for action in actions: self.insertMenu.addAction(action) - self.connect(insertMapper, QtCore.SIGNAL('mapped(const QString&)'), self.tree.insertElementSlot) - self.editAction = QtGui.QAction('Edit', self.treeMenu) + insertMapper.mapped.connect(self.tree.insertElementSlot) + self.editAction = QAction('Edit', self.treeMenu) self.editAction.triggered.connect(self.editCurrentObjectSlot) self.tree.elementInserted.connect(self.elementInsertedSlot) self.treeMenu.addAction(self.editAction) @@ -305,7 +240,7 @@ def sizeHint(self): def getToolBars(self): if not hasattr(self, '_insertToolBar'): - self._insertToolBar = QtGui.QToolBar('Insert') + self._insertToolBar = QToolBar('Insert') return self._toolBars for action in self.insertMenu.actions(): button = MToolButton() @@ -320,9 +255,7 @@ def getToolBars(self): # View for running a simulation and runtime visualization # ############################################################ - - -from mplot import CanvasWidget +from moosegui.mplot import CanvasWidget class RunView(RunBase): """A default runtime view implementation. This should be @@ -331,8 +264,8 @@ class RunView(RunBase): canvas: widget for plotting dataRoot: location of data tables - """ + def __init__(self, modelRoot, *args, **kwargs): RunBase.__init__(self, *args, **kwargs) self.modelRoot = modelRoot @@ -386,10 +319,10 @@ def getSchedulingDockWidget(self): """Create and/or return a widget for schduling""" if hasattr(self, 'schedulingDockWidget') and self.schedulingDockWidget is not None: return self.schedulingDockWidget - self.schedulingDockWidget = QtGui.QDockWidget('Scheduling') - self.schedulingDockWidget.setFeatures( QtGui.QDockWidget.NoDockWidgetFeatures); + self.schedulingDockWidget = QDockWidget('Scheduling') + self.schedulingDockWidget.setFeatures( QDockWidget.NoDockWidgetFeatures); self.schedulingDockWidget.setWindowFlags(Qt.CustomizeWindowHint) - titleWidget = QtGui.QWidget(); + titleWidget = QWidget(); self.schedulingDockWidget.setTitleBarWidget(titleWidget) widget = SchedulingWidget() widget.setDataRoot(self.dataRoot) @@ -398,83 +331,12 @@ def getSchedulingDockWidget(self): widget.runner.simulationStarted.connect(self._centralWidget.extendXAxes) widget.runner.simulationProgressed.connect(self._centralWidget.updatePlots) widget.runner.simulationFinished.connect(self._centralWidget.rescalePlots) - # widget.runner.simulationContinued.connect(self._centralWidget.extendXAxes) widget.runner.simulationReset.connect(self._centralWidget.plotAllData) self._toolBars += widget.getToolBars() return self.schedulingDockWidget -''' -class MooseRunner(QtCore.QObject): - """Helper class to control simulation execution - See: http://doc.qt.digia.com/qq/qq27-responsive-guis.html : - 'Solving a Problem Step by Step' for design details. - """ - resetAndRun = QtCore.pyqtSignal(name='resetAndRun') - update = QtCore.pyqtSignal(name='update') - currentTime = QtCore.pyqtSignal(float, name='currentTime') - finished = QtCore.pyqtSignal(name='finished') - - def __init__( self - , runTime - , updateInterval - ): - QtCore.QObject.__init__(self) - # if (MooseRunner.inited): - # return - self.runTime = runTime - self.updateInterval = updateInterval - self._updateInterval = 100e-3 - self._simtime = 0.0 - self._clock = moose.Clock('/clock') - self._pause = False - self.dataRoot = '/data' - self.modelRoot = '/model' - #MooseRunner.inited = True - - def doResetAndRun(self, tickDtMap, tickTargetMap, simtime, updateInterval): - self._pause = False - self._updateInterval = 0.1 #updateInterval - self._simtime = simtime - utils.updateTicks(tickDtMap) - utils.assignTicks(tickTargetMap) - self.resetAndRun.emit() - moose.reinit() - QtCore.QTimer.singleShot(0, self.run) - - def run(self): - """Run simulation for a small interval.""" - print("simtime => ", self._simtime) - print("update interval => ", self._updateInterval) - print("current time => ", self._clock.currentTime) - print("Base dt => ", self._clock.baseDt) - if self._clock.currentTime >= self._simtime: - self.finished.emit() - return - if self._pause: - return - toRun = self._simtime - self._clock.currentTime - if toRun > self._updateInterval: - toRun = self._updateInterval - if toRun < self._clock.baseDt: - return - moose.start(toRun) - self.update.emit() - self.currentTime.emit(self._clock.currentTime) - QtCore.QTimer.singleShot(0, self.run) - - def continueRun(self, simtime, updateInterval): - """Continue running without reset for `simtime`.""" - self._simtime = simtime - self._updateInterval = updateInterval - self._pause = False - QtCore.QTimer.singleShot(0, self.run) - - def stop(self): - """Pause simulation""" - self._pause = True -''' -class SchedulingWidget(QtGui.QWidget): +class SchedulingWidget(QWidget): """Widget for scheduling. Important member fields: @@ -502,20 +364,11 @@ class SchedulingWidget(QtGui.QWidget): continueRun = QtCore.pyqtSignal(float, float, name='continueRun') def __init__(self, *args, **kwargs): - QtGui.QWidget.__init__(self, *args, **kwargs) + QWidget.__init__(self, *args, **kwargs) self.simulationInterval = None self.updateInterval = None self.runTime = None - # if not self.advanceOptiondisplayed: - # self.advancedOptionsWidget.hide() - - # self.__getUpdateIntervalWidget() - #layout.addWidget(self.__getUpdateIntervalWidget()) - # spacerItem = QtGui.QSpacerItem(450, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - # layout.addItem(spacerItem) - # self.setLayout(layout) - # self._toolBars.append( self.modelRoot = None self.dataRoot = None self.runner = Runner() @@ -530,10 +383,6 @@ def __init__(self, *args, **kwargs): self.runner.simulationProgressed.connect(self.updateCurrentSimulationRuntime) self.continueFlag = False self.preferences.applyChemicalSettings.connect(self.resetSimulation) - # self.resetAndRunButton.clicked.connect(self.resetAndRunSlot) - # self.continueButton.clicked.connect(self.doContinueRun) - # self.continueRun.connect(self.runner.continueRun) - # self.stopButton.clicked.connect(self.runner.stop) def updateCurrentSimulationRuntime(self, time): self.currentSimulationRuntime.setText(str(time)) @@ -545,30 +394,33 @@ def getSchedulerToolBar(self): bar = QToolBar("Run", self) - self.resetAction = bar.addAction( QIcon('icons/arrow_undo.png') - , 'Reset' - , self.resetSimulation - ) + self.resetAction = bar.addAction( + QtGui.QIcon( os.path.join( config.MOOSE_ICON_DIR, 'reset.png' ) ) + , 'Reset' + , self.resetSimulation + ) self.resetAction.setToolTip('Reset simulation.') - self.runAction = bar.addAction( QIcon('icons/run.png') - , 'Run' - , self.runSimulation - ) + self.runAction = bar.addAction( + QtGui.QIcon( os.path.join( config.MOOSE_ICON_DIR, 'run.png') ) + , 'Run' + , self.runSimulation + ) self.runAction.setToolTip('Run simulation.') - self.stopAction = bar.addAction( QIcon('icons/stop.png') - , 'Stop' - , self.runner.togglePauseSimulation - ) + self.stopAction = bar.addAction( + QtGui.QIcon( os.path.join( config.MOOSE_ICON_DIR, 'stop.png') ) + , 'Stop' + , self.runner.togglePauseSimulation + ) self.stopAction.setToolTip('Stop simulation.') bar.addSeparator() runtimeLabel = QLabel('Run for') self.simulationRuntime = QLineEdit() - self.simulationRuntime.setValidator(QDoubleValidator()) + self.simulationRuntime.setValidator(QtGui.QDoubleValidator()) self.simulationRuntime.setFixedWidth(75) bar.addWidget(runtimeLabel) bar.addWidget(self.simulationRuntime) @@ -576,13 +428,10 @@ def getSchedulerToolBar(self): bar.addSeparator() #: current time - # spacer.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) - # self._runToolBar.addWidget(spacer) - # self._runToolBar.addWidget(QtGui.QLabel('Current time')) self.currentSimulationRuntime = QLineEdit() # 6 digits self.currentSimulationRuntime.setToolTip('Current simulation runtime.') self.currentSimulationRuntime.setFixedWidth(75) - self.currentSimulationRuntime.setValidator(QDoubleValidator()) + self.currentSimulationRuntime.setValidator(QtGui.QDoubleValidator()) self.currentSimulationRuntime.setText("0.0") self.currentSimulationRuntime.setReadOnly(True) @@ -590,7 +439,6 @@ def getSchedulerToolBar(self): bar.addWidget(QLabel("Current Time : ")) bar.addWidget(self.currentSimulationRuntime) bar.addWidget(QLabel(" (s)")) - # self._runToolBar.addWidget(self.()) bar.addSeparator() @@ -601,13 +449,6 @@ def getSchedulerToolBar(self): bar.addWidget(self.preferencesButton) return bar - # def updateTickswidget(self): - # if self.advanceOptiondisplayed: - # self.advancedOptionsWidget.hide() - # self.advanceOptiondisplayed = False - # else: - # self.advancedOptionsWidget.show() - # self.advanceOptiondisplayed = True def continueSimulation(self): self.runner.continueSimulation( self.runTime @@ -661,12 +502,6 @@ def runSimulation(self): self.checkConsistency() self.continueSimulation = True self.runner.runSimulation(self.runtime) - # return - # if self.continueFlag: - # self.continueSimulation() - # else: - # self.runner.runSimulation() - # self.continueFlag = True def setParameters(self): if self.modelType == ELECTRICAL_MODEL: @@ -683,7 +518,6 @@ def setChemicalParameters(self): self.simulationRuntime.setText(str(chemicalPreferences["simulation"]["default-runtime"])) self.runTime = float(self.simulationRuntime.text()) self.solver = chemicalPreferences["simulation"]["solver"] - #print(self.solver) def setElectricalParameters(self): electricalPreferences = self.preferences.getElectricalPreferences() @@ -694,27 +528,12 @@ def setElectricalParameters(self): self.simulationRuntime.setText(str(electricalPreferences["simulation"]["default-runtime"])) self.runTime = float(self.simulationRuntime.text()) self.solver = electricalPreferences["simulation"]["solver"] - #print(self.solver) def checkConsistency(self): if self.updateInterval < self.simulationInterval : self.updateInterval = self.simulationInterval - - # print("Hello") - # dialog = QErrorMessage() - # dialog.showMessage( - # """GUI Update interval should be greater than Simulation Interval. - # Please update these values in Edit > Preferences.""" - # ) - # return False if self.runTime < self.updateInterval : self.runTime = self.updateInterval - # dialog = QErrorMessage() - # dialog.showMessage( - # """Simulation runtime should greater than GUI Update interval. - # Please update the runtime in the Scheduling Toolbar""" - # ) - # return False return True def solverStatus(self): @@ -742,45 +561,29 @@ def solverStatus(self): nameRE = nameRE+"\n "+res.className + " --> "+res.parent.name+ " --> "+res.name if status == -1: - QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: Reaction path not yet assigned.\n ") + QMessageBox.warning(None,"Could not Run the model","Warning: Reaction path not yet assigned.\n ") return -1 if status == 1: - #QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: Missing a reactant in a Reac or Enz.\n ") - QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: Missing a reactant in %s " %(nameRE)) + #QMessageBox.warning(None,"Could not Run the model","Warning: Missing a reactant in a Reac or Enz.\n ") + QMessageBox.warning(None,"Could not Run the model","Warning: Missing a reactant in %s " %(nameRE)) return 1 elif status == 2: - QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: Missing a substrate in an MMenz %s " %(nameRE)) - #QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: Missing a substrate in an MMenz.\n ") + QMessageBox.warning(None,"Could not Run the model","Warning: Missing a substrate in an MMenz %s " %(nameRE)) + #QMessageBox.warning(None,"Could not Run the model","Warning: Missing a substrate in an MMenz.\n ") return 2 elif status == 4: - QtGui.QMessageBox.warning(None,"Could not Run the model"," Warning: Compartment not defined.\n ") + QMessageBox.warning(None,"Could not Run the model"," Warning: Compartment not defined.\n ") return 4 elif status == 8: - QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: Neither Ksolve nor Dsolve defined.\n ") + QMessageBox.warning(None,"Could not Run the model","Warning: Neither Ksolve nor Dsolve defined.\n ") return 8 elif status == 16: - QtGui.QMessageBox.warning(None,"Could not Run the model","Warning: No objects found on path.\n ") + QMessageBox.warning(None,"Could not Run the model","Warning: No objects found on path.\n ") return 16 elif status == 0: - print "Successfully built stoichiometry matrix.\n " + print("Successfully built stoichiometry matrix.\n ") # moose.reinit() return 0 - # def setElectricalParameters(self): - # chemicalPreferences = self.preferences.getChemicalPreferences() - # self.updateInterval = chemicalPreferences["guiUpdateInterval"] - # self.simulationInterval = chemicalPreferences["simulationInterval"] - # chemicalPreferences["diffusionInterval"] - # chemicalPreferences - # self. chemicalPreferences - # self. chemicalPreferences - # self. chemicalPreferences - # self. runTime = float(self.simulationRuntime.text()) - - def __getAdvanceOptionsButton(self): - icon = QtGui.QIcon(os.path.join(config.settings[config.KEY_ICON_DIR],'arrow.png')) - # self.advancedOptionsButton.setIcon(QtGui.QIcon(icon)) - # self.advancedOptionsButton.setToolButtonStyle( Qt.ToolButtonTextBesideIcon ); - return self.advancedOptionsButton def preferencesToggler(self): visibility = not self.preferences.getView().isVisible() @@ -796,7 +599,7 @@ def updateCurrentTime(self): def updateTextFromTick(self, tickNo): tick = moose.vector('/clock/tick')[tickNo] widget = self.tickListWidget.layout().itemAtPosition(tickNo + 1, 1).widget() - if widget is not None and isinstance(widget, QtGui.QLineEdit): + if widget is not None and isinstance(widget, QLineEdit): widget.setText(str(tick.dt)) def updateFromMoose(self): @@ -811,10 +614,9 @@ def getSimTime(self): try: time = float(str(self.simtimeEdit.text())) return time - except ValueError, e: - QtGui.QMessageBox.warning(self, 'Invalid value', 'Specified runtime was meaningless.') - return 0 - + except ValueError: + QMessageBox.warning(self, 'Invalid value', 'Specified runtime was meaningless.') + return 0.0 def setDataRoot(self, root='/data'): self.dataRoot = moose.element(root).path @@ -844,13 +646,6 @@ def setModelType(self): legend = None canvas = None -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QSizeGrip -from PyQt4.QtGui import QLayout -from PyQt4.QtGui import QScrollArea -from PyQt4.QtGui import QMenu -from PyQt4.QtCore import pyqtSlot,SIGNAL,SLOT, Signal, pyqtSignal - class PlotWidget(QWidget): """A wrapper over CanvasWidget to handle additional MOOSE-specific stuff. @@ -859,9 +654,6 @@ class PlotWidget(QWidget): dataRoot - path to the container of data tables. - TODO: do we really need this separation or should we go for - standardizing location of data with respect to model root. - pathToLine - map from moose path to Line2D objects in plot. Can one moose table be plotted multiple times? Maybe yes (e.g., when you want multiple other tables to be compared with the same data). @@ -872,6 +664,7 @@ class PlotWidget(QWidget): widgetClosedSignal = pyqtSignal(object) addGraph = pyqtSignal(object) + def __init__(self, model, graph, index, parentWidget, *args, **kwargs): super(PlotWidget, self).__init__() self.model = model @@ -880,81 +673,56 @@ def __init__(self, model, graph, index, parentWidget, *args, **kwargs): self.menu = self.getContextMenu() self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.connect( self - , SIGNAL("customContextMenuRequested(QPoint)") - , self - , SLOT("contextMenuRequested(QPoint)") - ) + self.customContextMenuRequested.connect(self.contextMenuRequested) + # self.connect( self + # , SIGNAL("customContextMenuRequested(QPoint)") + # , self + # , SLOT("contextMenuRequested(QPoint)") + # ) self.canvas = CanvasWidget(self.model, self.graph, self.index) self.canvas.setParent(self) self.navToolbar = NavigationToolbar(self.canvas, self) self.hackNavigationToolbar() self.canvas.mpl_connect('pick_event',self.togglePlot) - # self.canvas. - # self.navToolbar.addSeparator() - layout = QtGui.QGridLayout() - # canvasScrollArea = QScrollArea() - # canvasScrollArea.setWidget(self.canvas) + layout = QGridLayout() layout.addWidget(self.navToolbar, 0, 0) layout.addWidget(self.canvas, 1, 0) self.setLayout(layout) - # self.setAcceptDrops(True) - #self.modelRoot = '/' self.pathToLine = defaultdict(set) self.lineToDataSource = {} self.axesRef = self.canvas.addSubplot(1, 1) - # box = self.axesRef.get_position() - # self.axesRef.set_position([box.x0, box.y0, box.width * 0.8, box.height]) - self.legend = None - # layout.setSizeConstraint( QLayout.SetNoConstraint ) - # self.setSizePolicy( QtGui.QSizePolicy.Expanding - # , QtGui.QSizePolicy.Expanding - # ) - - desktop = QtGui.QApplication.desktop() - # print("**********************") - # print(desktop.screenGeometry()) - # print("***********************") - self.setMinimumSize(desktop.screenGeometry().width() / 4, desktop.screenGeometry().height() / 3) - # self.setMaximumSize(desktop.screenGeometry().width() / 2, desktop.screenGeometry().height() / 2) - # self.setMinimumSize(self.width(), self.height()) - # self.setMaximumSize(2 * self.width(), 2* self.height()) - # QtCore.QObject.connect(utils.tableEmitter,QtCore.SIGNAL("tableCreated()"),self.plotAllData) + desktop = QApplication.desktop() + self.setMinimumSize(desktop.screenGeometry().width()//4, desktop.screenGeometry().height()//3) self.canvas.updateSignal.connect(self.plotAllData) self.plotAllData() - # self.plotView = PlotView(model, graph, index, self) - #self.dataTable = DataTable() - #utils.tableCreated.connect(plotAllData) - # self.plotAllData() - # self.setSizePolicy(QtGui.QSizePolicy.Fixed, - # QtGui.QSizePolicy.Expanding) def hackNavigationToolbar(self): # ADD Graph Action - pixmap = QPixmap("icons/add_graph.png") - icon = QIcon(pixmap) + pixmap = QtGui.QPixmap( + os.path.join( config.MOOSE_ICON_DIR, 'add_graph.png' ) + ) + icon = QtGui.QIcon(pixmap) action = QAction(icon, "Add a graph", self.navToolbar) # self.navToolbar.addAction(action) - action.triggered.connect(self.addGraph.emit) + action.triggered.connect( self.addGraph.emit ) self.navToolbar.insertAction(self.navToolbar.actions()[0], action) # Delete Graph Action - pixmap = QPixmap("icons/delete_graph.png") - icon = QIcon(pixmap) + pixmap = QtGui.QPixmap( os.path.join( config.MOOSE_ICON_DIR, + "delete_graph.png") ) + icon = QtGui.QIcon(pixmap) action = QAction(icon, "Delete this graph", self.navToolbar) - # self.navToolbar.addAction(action) action.triggered.connect(self.delete) - self.navToolbar.insertAction(self.navToolbar.actions()[1], action) #Toggle Grid Action - - pixmap = QPixmap("icons/grid.png") - icon = QIcon(pixmap) + pixmap = QtGui.QPixmap( + os.path.join( config.MOOSE_ICON_DIR, "grid.png" ) + ) + icon = QtGui.QIcon(pixmap) action = QAction(icon, "Toggle Grid", self.navToolbar) - # self.navToolbar.addAction(action) action.triggered.connect(self.canvas.toggleGrid) self.navToolbar.insertAction(self.navToolbar.actions()[2], action) self.navToolbar.insertSeparator(self.navToolbar.actions()[3]) @@ -970,7 +738,7 @@ def toggleLegend(self): self.canvas.draw() def getContextMenu(self): - menu = QMenu() + menu = QMenu() # closeAction = menu.addAction("Delete") exportCsvAction = menu.addAction("Export to CSV") exportCsvAction.triggered.connect(self.saveAllCsv) @@ -986,11 +754,13 @@ def getContextMenu(self): return menu def deleteGraph(self): - print("Deleting " + self.graph.path) + """ If there is only one graph in the view, please don't delete it """ + print( "Deleting %s " % self.graph.path) moose.delete(self.graph.path) def delete(self, event): - print("Deleting PlotWidget") + """FIXME: The last element should not be deleted """ + _logger.info("Deleting PlotWidget " ) self.deleteGraph() self.close() self.widgetClosedSignal.emit(self) @@ -1001,16 +771,6 @@ def configure(self, event): @pyqtSlot(QtCore.QPoint) def contextMenuRequested(self,point): - # menu = QtGui.QMenu() - - # # action1 = menu.addAction("Set Size 100x100") - # # action2 = menu.addAction("Set Size 500x500") - - - # # self.connect(action2,SIGNAL("triggered()"), - # # self,SLOT("slotShow500x500()")) - # # self.connect(action1,SIGNAL("triggered()"), - # # self,SLOT("slotShow100x100()")) self.menu.exec_(self.mapToGlobal(point)) def setModelRoot(self, path): @@ -1021,7 +781,6 @@ def setDataRoot(self, path): #plotAllData() def genColorMap(self,tableObject): - #print "tableObject in colorMap ",tableObject species = tableObject+'/info' colormap_file = open(os.path.join(config.settings[config.KEY_COLORMAP_DIR], 'rainbow2.pkl'),'rb') self.colorMap = pickle.load(colormap_file) @@ -1042,9 +801,8 @@ def genColorMap(self,tableObject): color = 'white' return color - def removePlot(self, table): - print("removePlot =>", table) + print(("removePlot =>", table)) moose.delete(table) self.plotAllData() @@ -1193,7 +951,7 @@ def addRasterPlot(self, eventtable, yoffset=0, *args, **kwargs): return self.canvas.plot(eventtable.vector, y, '|') def updatePlots(self): - for path, lines in self.pathToLine.items(): + for path, lines in list(self.pathToLine.items()): element = moose.element(path) if isinstance(element, moose.Table2): tab = moose.Table2(path) @@ -1206,7 +964,7 @@ def updatePlots(self): self.canvas.draw() def extendXAxes(self, xlim): - for axes in self.canvas.axes.values(): + for axes in list(self.canvas.axes.values()): # axes.autoscale(False, axis='x', tight=True) axes.set_xlim(right=xlim) axes.autoscale_view(tight=True, scalex=True, scaley=True) @@ -1217,7 +975,7 @@ def rescalePlots(self): ideally we should set xlim from simtime. """ - for axes in self.canvas.axes.values(): + for axes in list(self.canvas.axes.values()): axes.autoscale(True, tight=True) axes.relim() axes.autoscale_view(tight=True,scalex=True,scaley=True) @@ -1238,35 +996,35 @@ def saveCsv(self, line, directory): name = moose.element(nameVec[0]).name filename = str(directory)+'/'+'%s.csv' %(name) np.savetxt(filename, np.vstack((x, y)).transpose()) - print 'Saved data from %s and %s in %s' % (xSrc.path, ySrc.path, filename) + print('Saved data from %s and %s in %s' % (xSrc.path, ySrc.path, filename)) def saveAllCsv(self): """Save data for all currently plotted lines""" #Harsha: Plots were saved in GUI folder instead provided QFileDialog box to save to #user choose - fileDialog2 = QtGui.QFileDialog(self) - fileDialog2.setFileMode(QtGui.QFileDialog.Directory) + fileDialog2 = QFileDialog(self) + fileDialog2.setFileMode(QFileDialog.Directory) fileDialog2.setWindowTitle('Select Directory to save plots') - fileDialog2.setOptions(QtGui.QFileDialog.ShowDirsOnly) - fileDialog2.setLabelText(QtGui.QFileDialog.Accept, self.tr("Save")) - targetPanel = QtGui.QFrame(fileDialog2) - targetPanel.setLayout(QtGui.QVBoxLayout()) + fileDialog2.setOptions(QFileDialog.ShowDirsOnly) + fileDialog2.setLabelText(QFileDialog.Accept, self.tr("Save")) + targetPanel = QFrame(fileDialog2) + targetPanel.setLayout(QVBoxLayout()) layout = fileDialog2.layout() layout.addWidget(targetPanel) if fileDialog2.exec_(): directory = fileDialog2.directory().path() - for line in self.lineToDataSource.keys(): - self.saveCsv(line,directory) + for line in list(self.lineToDataSource.keys()): + self.saveCsv(line,directory) def getMenus(self): if not hasattr(self, '_menus'): self._menus = [] - self.plotAllAction = QtGui.QAction('Plot all data', self) + self.plotAllAction = QAction('Plot all data', self) self.plotAllAction.triggered.connect(self.plotAllData) - self.plotMenu = QtGui.QMenu('Plot') + self.plotMenu = QMenu('Plot') self.plotMenu.addAction(self.plotAllAction) - self.saveAllCsvAction = QtGui.QAction('Save all data in CSV files', self) + self.saveAllCsvAction = QAction('Save all data in CSV files', self) self.saveAllCsvAction.triggered.connect(self.saveAllCsv) self.plotMenu.addAction(self.saveAllCsvAction) self._menus.append(self.plotMenu) @@ -1281,156 +1039,7 @@ def getMenus(self): # Plot view - select fields to record # ################################################### -''' -class PlotView(PlotBase): - """View for selecting fields on elements to plot.""" - def __init__(self, model, graph, index, *args): - PlotBase.__init__(self, *args) - self.model = model - self.graph = graph - self.index = index - # self.plugin.modelRootChanged.connect(self.getSelectionPane().setSearchRoot) - # self.plugin.dataRootChanged.connect(self.setDataRoot) - # self.dataRoot = self.plugin.dataRoot - - def setDataRoot(self, root): - self.dataRoot = moose.element(root).path - - def getToolPanes(self): - return (self.getFieldSelectionDock(), ) - - def getSelectionPane(self): - """Creates a widget to select elements and fields for plotting. - search-root, field-name, comparison operator , value - """ - if not hasattr(self, '_selectionPane'): - self._searchWidget = SearchWidget() - self._searchWidget.setSearchRoot(self.model.path) - self._fieldLabel = QtGui.QLabel('Field to plot') - self._fieldEdit = QtGui.QLineEdit() - self._fieldEdit.returnPressed.connect(self._searchWidget.searchSlot) - self._selectionPane = QtGui.QWidget() - layout = QtGui.QHBoxLayout() - layout.addWidget(self._fieldLabel) - layout.addWidget(self._fieldEdit) - self._searchWidget.layout().addLayout(layout) - self._selectionPane = self._searchWidget - self._selectionPane.layout().addStretch(1) - return self._selectionPane - - def getOperationsPane(self): - """TODO: complete this""" - if hasattr(self, 'operationsPane'): - return self.operationsPane - self.operationsPane = QtGui.QWidget() - self._createTablesButton = QtGui.QPushButton('Create tables for recording selected fields', self.operationsPane) - self._createTablesButton.clicked.connect(self.setupRecording) - layout = QtGui.QVBoxLayout() - self.operationsPane.setLayout(layout) - layout.addWidget(self._createTablesButton) - return self.operationsPane - - def getFieldSelectionDock(self): - if not hasattr(self, '_fieldSelectionDock'): - self._fieldSelectionDock = QtGui.QDockWidget('Search and select elements') - self._fieldSelectionWidget = QtGui.QWidget() - layout = QtGui.QVBoxLayout() - self._fieldSelectionWidget.setLayout(layout) - layout.addWidget(self.getSelectionPane()) - layout.addWidget(self.getOperationsPane()) - self._fieldSelectionDock.setWidget(self._fieldSelectionWidget) - return self._fieldSelectionDock - - def getCentralWidget(self): - if not hasattr(self, '_centralWidget') or self._centralWidget is None: - self._centralWidget = PlotSelectionWidget(self.model, self.graph) - self.getSelectionPane().executed.connect(self.selectElements) - return self._centralWidget - - def selectElements(self, elements): - """Refines the selection. - - Currently checks if _fieldEdit has an entry and if so, selects - only elements which have that field, and ticks the same in the - PlotSelectionWidget. - - """ - field = str(self._fieldEdit.text()).strip() - if len(field) == 0: - self.getCentralWidget().setSelectedElements(elements) - return - classElementDict = defaultdict(list) - for epath in elements: - el = moose.element(epath) - classElementDict[el.className].append(el) - refinedList = [] - elementFieldList = [] - for className, elist in classElementDict.items(): - if field in elist[0].getFieldNames('valueFinfo'): - refinedList +=elist - elementFieldList += [(el, field) for el in elist] - self.getCentralWidget().setSelectedElements(refinedList) - self.getCentralWidget().setSelectedFields(elementFieldList) - - - def setupRecording(self): - """Create the tables for recording selected data and connect them.""" - for element, field in self.getCentralWidget().getSelectedFields(): - #createRecordingTable(element, field, self._recordingDict, self._reverseDict, self.dataRoot) - #harsha:CreateRecordingTable function is moved to python/moose/utils.py file as create function - #as this is required when I drop table on to the plot - utils.create(self.plugin.modelRoot,moose.element(element),field,"Table2") - #self.dataTable.create(self.plugin.modelRoot, moose.element(element), field) - #self.updateCallback() - - def createRecordingTable(self, element, field): - """Create table to record `field` from element `element` - - Tables are created under `dataRoot`, the names are generally - created by removing `/model` in the beginning of `elementPath` - and replacing `/` with `_`. If this conflicts with an existing - table, the id value of the target element (elementPath) is - appended to the name. - - """ - if len(field) == 0 or ((element, field) in self._recordingDict): - return - # The table path is not foolproof - conflict is - # possible: e.g. /model/test_object and - # /model/test/object will map to same table. So we - # check for existing table without element field - # path in recording dict. - relativePath = element.path.partition('/model[0]/')[-1] - if relativePath.startswith('/'): - relativePath = relativePath[1:] - #Convert to camelcase - if field == "concInit": - field = "ConcInit" - elif field == "conc": - field = "Conc" - elif field == "nInit": - field = "NInit" - elif field == "n": - field = "N" - elif field == "volume": - field = "Volume" - elif field == "diffConst": - field ="DiffConst" - - tablePath = relativePath.replace('/', '_') + '.' + field - tablePath = re.sub('.', lambda m: {'[':'_', ']':'_'}.get(m.group(), m.group()),tablePath) - tablePath = self.dataRoot + '/' +tablePath - if moose.exists(tablePath): - tablePath = '%s_%d' % (tablePath, element.getId().value) - if not moose.exists(tablePath): - table = moose.Table(tablePath) - print 'Created', table.path, 'for plotting', '%s.%s' % (element.path, field) - target = element - moose.connect(table, 'requestOut', target, 'get%s' % (field)) - self._recordingDict[(target, field)] = table - self._reverseDict[table] = (target, field) -''' -class PlotSelectionWidget(QtGui.QScrollArea): +class PlotSelectionWidget(QScrollArea): """Widget showing the fields of specified elements and their plottable fields. User can select any number of fields for plotting and click a button to generate the tables for recording data. @@ -1440,10 +1049,10 @@ class PlotSelectionWidget(QtGui.QScrollArea): """ def __init__(self, model, graph, *args): - QtGui.QScrollArea.__init__(self, *args) + QScrollArea.__init__(self, *args) self.model = moose.element(model.path + "/model") self.modelRoot = self.model.path - self.setLayout(QtGui.QVBoxLayout(self)) + self.setLayout(QVBoxLayout(self)) self.layout().addWidget(self.getPlotListWidget()) self.setDataRoot(self.model.path) self._elementWidgetsDict = {} # element path to corresponding qlabel and fields combo @@ -1452,10 +1061,10 @@ def getPlotListWidget(self): """An internal widget to display the list of elements and their plottable fields in comboboxes.""" if not hasattr(self, '_plotListWidget'): - self._plotListWidget = QtGui.QWidget(self) - layout = QtGui.QGridLayout(self._plotListWidget) + self._plotListWidget = QWidget(self) + layout = QGridLayout(self._plotListWidget) self._plotListWidget.setLayout(layout) - layout.addWidget(QtGui.QLabel('

Elements matching search criterion will be listed here

'), 0, 0) + layout.addWidget(QLabel('

Elements matching search criterion will be listed here

'), 0, 0) return self._plotListWidget def setSelectedElements(self, elementlist): @@ -1476,19 +1085,19 @@ def setSelectedElements(self, elementlist): del w del item self._elementWidgetsDict.clear() - label = QtGui.QLabel('Element') - label.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + label = QLabel('Element') + label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.getPlotListWidget().layout().addWidget(label, 0, 0, 1, 2) - self.getPlotListWidget().layout().addWidget(QtGui.QLabel('Fields to plot'), 0, 2, 1, 1) + self.getPlotListWidget().layout().addWidget(QLabel('Fields to plot'), 0, 2, 1, 1) for ii, entry in enumerate(elementlist): el = moose.element(entry) plottableFields = [] - for field, dtype in moose.getFieldDict(el.className, 'valueFinfo').items(): + for field, dtype in list(moose.getFieldDict(el.className, 'valueFinfo').items()): if dtype == 'double': plottableFields.append(field) if len(plottableFields) == 0: continue - elementLabel = QtGui.QLabel(el.path) + elementLabel = QLabel(el.path) fieldsCombo = CheckComboBox(self) fieldsCombo.addItem('') for item in plottableFields: @@ -1508,7 +1117,7 @@ def setDataRoot(self, path): def getSelectedFields(self): """Returns a list containing (element, field) for all selected fields""" ret = [] - for el, widgets in self._elementWidgetsDict.items(): + for el, widgets in list(self._elementWidgetsDict.items()): combo = widgets[1] for ii in range(combo.count()): field = str(combo.itemText(ii)).strip() @@ -1531,5 +1140,3 @@ def setSelectedFields(self, elementFieldList): if idx >= 0: combo.setItemData(idx, QtCore.QVariant(Qt.Checked), Qt.CheckStateRole) combo.setCurrentIndex(idx) -# -# default.py ends here diff --git a/plugins/defines.py b/moosegui/plugins/defines.py similarity index 86% rename from plugins/defines.py rename to moosegui/plugins/defines.py index 0f550e4..e08598b 100644 --- a/plugins/defines.py +++ b/moosegui/plugins/defines.py @@ -1,7 +1,10 @@ +"""defines.py: +Various clocks used in moose. +""" + ELECTRICAL_SIMULATION_DT_CLOCKS = [1,2,3,4,5,6,7] ELECTRICAL_PLOT_UPDATE_INTERVAL_CLOCKS = [8] ELECTRICAL_DIFFUSION_INTERVAL_CLOCKS = [10] - CHEMICAL_SIMULATION_DT_CLOCKS = [11, 12, 13, 14, 15, 16, 17] CHEMICAL_PLOT_UPDATE_INTERVAL_CLOCKS = [18] CHEMICAL_DIFFUSION_DT_CLOCKS = [10] diff --git a/moosegui/plugins/kkit.py b/moosegui/plugins/kkit.py new file mode 100644 index 0000000..f755ef0 --- /dev/null +++ b/moosegui/plugins/kkit.py @@ -0,0 +1,1107 @@ +# -*- coding: utf-8 -*- + +__author__ = "HarshaRani" +__credits__ = ["Upi Lab"] +__license__ = "GPL3" +__version__ = "1.0.0" +__maintainer__ = "HarshaRani" +__email__ = "hrani@ncbs.res.in" +__status__ = "Development" +__updated__ = "Feb 22 2019" + +import os +import sys +import re +import math + +from PyQt5.QtWidgets import QApplication + +# For testing: QApplication must be created before any other widget. +if __name__ == "__main__": + app = QApplication(sys.argv) + +from PyQt5 import QtGui, QtCore, Qt +from PyQt5.QtWidgets import QWidget, QGridLayout, QFileDialog +from PyQt5.QtWidgets import QMenu, QAction, QGraphicsScene +from PyQt5.QtWidgets import QToolBar +from PyQt5.QtGui import QColor + +# moosegui +from moosegui import RunWidget +from moosegui import mplugin, config +from moosegui.mtoolbutton import MToolButton +from moosegui.plugins.default import MoosePlugin, MooseEditorView, RunView +from moosegui.plugins import kkitUtil, kkitOrdinateUtil +from moosegui.plugins import kkitQGraphics +from moosegui.plugins import kkitViewcontrol +from moosegui.PlotWidgetContainer import PlotWidgetContainer + +# moose +import moose + +# Logging +import logging +logger_ = logging.getLogger('gui.plugins.kkit') + +class KkitPlugin(MoosePlugin): + """ + Default plugin for MOOSE GUI + """ + + def __init__(self, *args): + MoosePlugin.__init__(self, *args) + self.view = None + self.fileinsertMenu = QMenu('&File') + + if not hasattr(self, 'SaveModelAction'): + #self.fileinsertMenu.addSeparator() + self.saveModelAction = QAction('Save', self) + self.saveModelAction.setShortcut("Ctrl+S") + self.saveModelAction.triggered.connect(self.SaveModelDialogSlot) + self.fileinsertMenu.addAction(self.saveModelAction) + + self._menus.append(self.fileinsertMenu) + self.getEditorView() + + def SaveModelDialogSlot(self): + + dirpath = "" + if not dirpath: + dirpath = os.path.expanduser("~") + filters = {'SBML(*.xml)': 'SBML', 'Genesis(*.g)': 'Genesis'} + filename, filter_ = QFileDialog.getSaveFileNameAndFilter( + None, 'Save File', dirpath, "SBML(*.xml);;Genesis(*.g)") + if str(filename).rfind('.') != -1: + filename = filename[:str(filename).rfind('.')] + + if filename: + filename = filename + if filters[str(filter_)] == 'SBML': + self.coOrdinates = {} + self.plugin = KkitEditorView(self).getCentralWidget().plugin + self.coOrdinates = KkitEditorView( + self).getCentralWidget().getsceneCord() + #writeerror = moose.writeSBML(self.modelRoot,str(filename),self.coOrdinates) + writeerror = -2 + writtentofile = "/test.xml" + writeerror, consistencyMessages, writtentofile = moose.SBML.mooseWriteSBML( + self.modelRoot, str(filename), self.coOrdinates) + if writeerror == -2: + QtGui.QMessageBox.warning(None, 'Could not save the Model', + consistencyMessages) + elif writeerror == -1: + QtGui.QMessageBox.warning( + None, 'Could not save the Model', + '\n This model is not valid SBML Model, failed in the consistency check' + ) + elif writeerror == 1: + QtGui.QMessageBox.information( + None, 'Saved the Model', + '\n File saved to \'{filename}\''.format( + filename=filename + '.xml'), QtGui.QMessageBox.Ok) + elif writeerror == 0: + QtGui.QMessageBox.information( + None, 'Could not save the Model', + '\nThe filename could not be opened for writing') + + elif filters[str(filter_)] == 'Genesis': + moose.Annotator(self.modelRoot + '/info') + self.coOrdinates = {} + ss = KkitEditorView(self).getCentralWidget().mooseId_GObj + for k, v in ss.items(): + if moose.exists(moose.element(k).path + '/info'): + annoInfo = moose.Annotator(k.path + '/info') + x = annoInfo.x * 10 + y = -annoInfo.y * 10 + self.coOrdinates[k] = {'x': x, 'y': y} + + error, written = moose.mooseWriteKkit(self.modelRoot, + str(filename), + self.coOrdinates) + if written == False: + QtGui.QMessageBox.information(None, + 'Could not save the Model', + '\nCheck the file') + else: + if error == "": + QtGui.QMessageBox.information( + None, 'Saved the Model', + '\n File saved to \'{filename}\''.format( + filename=filename + '.g'), + QtGui.QMessageBox.Ok) + else: + QtGui.QMessageBox.information( + None, 'Saved the Model but ...', + '{error}'.format(error=error), + QtGui.QMessageBox.Ok) + + def getPreviousPlugin(self): + return None + + def getNextPlugin(self): + return None + + def getAdjacentPlugins(self): + return [] + + def getViews(self): + return self._views + + def getCurrentView(self): + return self.currentView + + def getEditorView(self): + if not hasattr(self, 'editorView'): + self.editorView = KkitEditorView(self) + self.editorView.getCentralWidget().editObject.connect( + self.mainWindow.objectEditSlot) + self.currentView = self.editorView + return self.editorView + + def getRunView(self): + if self.view is None: + self.view = AnotherKkitRunView(self.modelRoot, self) + return self.view + + if self.view is not None: + return AnotherKkitRunView(self.modelRoot, self) + if self.view is not None: + return self.view + self.view = RunView(self.modelRoot, self) + graphView = self.view._centralWidget + graphView.setDataRoot(self.modelRoot) + graphView.plotAllData() + self._kkitWidget = self.view.plugin.getEditorView().getCentralWidget() + self.runView = KkitRunView(self, self._kkitWidget) + self.currentRunView = self.ruAnotherKkitRunViewnView.getCentralWidget() + graphView.layout().addWidget(self.currentRunView, 0, 0, 2, 1) + return self.view + + +class AnotherKkitRunView(RunView): + def __init__(self, modelRoot, plugin, *args): + RunView.__init__(self, modelRoot, plugin, *args) + self.modelRoot = modelRoot + self.plugin = plugin + self.schedular = None + + def setSolverFromSettings(self, chemicalSettings): + self.setSolver(self.modelRoot, + chemicalSettings["simulation"]["solver"]) + + def createCentralWidget(self): + self._centralWidget = RunWidget.RunWidget(self.modelRoot) + self.kkitRunView = KkitRunView(self.plugin) + self.plotWidgetContainer = PlotWidgetContainer(self.modelRoot) + self._centralWidget.setChildWidget(self.kkitRunView.getCentralWidget(), + False, 0, 0, 1, 1) + self._centralWidget.setChildWidget(self.plotWidgetContainer, False, 0, + 1, 1, 2) + self._centralWidget.setPlotWidgetContainer(self.plotWidgetContainer) + self.schedular = self.getSchedulingDockWidget().widget() + self.schedular.runner.simulationProgressed.connect( + self.kkitRunView.getCentralWidget().updateValue) + self.schedular.runner.simulationProgressed.connect( + self.kkitRunView.getCentralWidget().changeBgSize) + self.schedular.runner.simulationReset.connect( + self.kkitRunView.getCentralWidget().resetColor) + self.schedular.preferences.applyChemicalSettings.connect( + self.setSolverFromSettings) + compt = moose.wildcardFind(self.modelRoot + '/##[ISA=ChemCompt]') + ann = moose.Annotator(self.modelRoot + '/info') + if compt: + self.runTime = moose.element(ann).runtime + solver = moose.element(ann).solver + else: + self.runTime = 100 + solver = "gsl" + self.schedular.simulationRuntime.setText(str(self.runTime)) + chemprefs = self.schedular.preferences.getChemicalPreferences() + c = moose.Clock('/clock') + self.simulationdt = c.tickDt[11] + self.plotdt = c.tickDt[18] + chemprefs["simulation"]["simulation-dt"] = self.simulationdt + chemprefs["simulation"]["plot-update-interval"] = self.plotdt + chemprefs["simulation"]["gui-update-interval"] = 2 * self.plotdt + chemprefs["simulation"]["solver"] = "Runge Kutta" + if solver == "gsl": + chemprefs["simulation"]["solver"] = "Runge Kutta" + elif solver == "gssa": + chemprefs["simulation"]["solver"] = "Gillespie" + elif solver == "ee" or solver == " ": + chemprefs["simulation"]["solver"] = "Exponential Euler" + else: + chemprefs["simulation"]["solver"] = "Runge Kutta" + self.schedular.preferences.setChemicalPreferences() + return self._centralWidget + + def setSolver(self, modelRoot, solver=None): + if solver == None: + reinit = moose.mooseAddChemSolver( + modelRoot, + self.getSchedulingDockWidget().widget().solver) + if reinit: + self.getSchedulingDockWidget().widget().resetSimulation() + else: + reinit = moose.mooseAddChemSolver(modelRoot, solver) + if reinit: + self.getSchedulingDockWidget().widget().resetSimulation() + + #self.kkitRunView.getCentralWidget().addSolver(solver) + + def getCentralWidget(self): + if self._centralWidget is None: + self.createCentralWidget() + return self._centralWidget + + +class KkitRunView(MooseEditorView): + def __init__(self, plugin): + MooseEditorView.__init__(self, plugin) + self.plugin = plugin + + def getCentralWidget(self): + if self._centralWidget is None: + self._centralWidget = KineticRunWidget(self.plugin) + self._centralWidget.editor = self.plugin.editorView + self._centralWidget.setModelRoot(self.plugin.modelRoot) + return self._centralWidget + + +class KkitEditorView(MooseEditorView): + def __init__(self, plugin): + MooseEditorView.__init__(self, plugin) + + def getCentralWidget(self): + if self._centralWidget is None: + self._centralWidget = kineticEditorWidget(self.plugin) + self._centralWidget.setModelRoot(self.plugin.modelRoot) + return self._centralWidget + + +class KineticsWidget(mplugin.EditorWidgetBase): + def __init__(self, plugin, *args): + mplugin.EditorWidgetBase.__init__(self, *args) + self.plugin = plugin + self.border = 5 + self.comptPen = 5 + self.iconScale = 1 + self.arrowsize = 2 + self.reset() + + self.defaultSceneheight = 1 #800#1000 + self.defaultScenewidth = 1 #000#2400 + self.positionInfoExist = True + self.defaultComptsize = 5 + self.srcdesConnection = {} + self.meshEntry = {} + self.mooseId_GObj = {} + self.qGraCompt = {} + self.qGraGrp = {} + self.xyCord = {} + self.editor = None + + def reset(self): + self.createdItem = {} + #This are created at drawLine + self.lineItem_dict = {} + self.itemignoreZooming = False + if hasattr(self, 'sceneContainer'): + self.sceneContainer.clear() + self.sceneContainer = QGraphicsScene(self) + self.sceneContainer.setItemIndexMethod(QGraphicsScene.NoIndex) + self.sceneContainer.setBackgroundBrush(QColor(230, 220, 219, 120)) + + def getsceneCord(self): + self.cord = {} + self.view.setRefWidget("runView") + for item in self.sceneContainer.items(): + if isinstance(item, kkitQGraphics.KineticsDisplayItem): + self.cord[item.mobj] = { + 'x': item.scenePos().x(), + 'y': item.scenePos().y() + } + return self.cord + + def updateModelView(self): + self.initMooseObject() + logger_.info( "updateModelView called ... %s" % str(self.m) ) + if not self.m: + if hasattr(self, 'view') and isinstance(self.view, QWidget): + self.layout().removeWidget(self.view) + + self.view = kkitViewcontrol.GraphicalView(self.modelRoot, + self.sceneContainer, + self.border, self, + self.createdItem) + + if isinstance(self, kineticEditorWidget): + self.view.setRefWidget("editorView") + self.view.setAcceptDrops(True) + elif isinstance(self, KineticRunWidget): + self.view.setRefWidget("runView") + + self.view.dropped.connect(self.objectEditSlot) + hLayout = QGridLayout(self) + self.setLayout(hLayout) + hLayout.addWidget(self.view, 0, 0) + return + + if hasattr(self, 'view') and isinstance(self.view, QWidget): + self.layout().removeWidget(self.view) + + self.view = kkitViewcontrol.GraphicalView(self.modelRoot, + self.sceneContainer, self.border, self, self.createdItem) + + if isinstance(self, kineticEditorWidget): + self.mooseObjOntoscene() + self.drawLine_arrow() + self.view.setRefWidget("editorView") + self.view.setAcceptDrops(True) + self.view.dropped.connect(self.objectEditSlot) + hLayout = QGridLayout(self) + self.setLayout(hLayout) + hLayout.addWidget(self.view) + elif isinstance(self, KineticRunWidget): + self.view.setRefWidget("runView") + hLayout = QGridLayout(self) + self.setLayout(hLayout) + hLayout.addWidget(self.view) + self.view.fitInView( + self.sceneContainer.itemsBoundingRect().x() - 10, + self.sceneContainer.itemsBoundingRect().y() - 10, + self.sceneContainer.itemsBoundingRect().width() + 20, + self.sceneContainer.itemsBoundingRect().height() + 20, + Qt.Qt.IgnoreAspectRatio) + else: + logger_.warning("Unhandled type: %s:%s" % (type(self),self)) + + def initMooseObject(self): + self.m = moose.wildcardFind(self.modelRoot + '/##[ISA=ChemCompt]') + if self.m: + self.srcdesConnection = {} + if self.meshEntry: + self.meshEntry.clear() + else: + self.meshEntry = {} + self.objPar, self.meshEntry, self.xmin, self.xmax, self.ymin\ + , self.ymax, self.noPositionInfo = kkitOrdinateUtil.setupMeshObj(self.modelRoot) + self.autocoordinates = False + if self.srcdesConnection: + self.srcdesConnection.clear() + else: + self.srcdesConnection = {} + + kkitOrdinateUtil.setupItem(self.modelRoot, self.srcdesConnection) + if not self.noPositionInfo: + self.autocoordinates = True + kkitOrdinateUtil.autoCoordinates(self.meshEntry, + self.srcdesConnection) + + self.size = QtCore.QSize(1000, 550) + + def sizeHint(self): + return QtCore.QSize(800, 400) + + def updateItemSlot(self, mooseObject): + for item in self.sceneContainer.items(): + if isinstance(item, kkitQGraphics.PoolItem): + if mooseObject.getId() == moose.element(item.mobj).getId(): + item.updateSlot() + # once the text is edited in editor, laydisplay gets updated + # in turn resize the length, positionChanged signal shd be + # emitted. + self.positionChange(mooseObject) + self.view.removeConnector() + self.view.showConnector(item) + + def updateColorSlot(self, mooseObject, colour): + #Color slot for changing background color for Pool,Enz and group from objecteditor + anninfo = moose.Annotator(mooseObject.path + '/info') + textcolor, bgcolor = kkitUtil.getColor(anninfo) + anninfo.color = str(colour.name()) + + if mooseObject.className == "Neutral": + item = self.qGraGrp[mooseObject] + item.setPen( + QtGui.QPen(QtGui.QColor(colour), + item.pen().width(), + item.pen().style(), + item.pen().capStyle(), + item.pen().joinStyle())) + + elif (isinstance(mooseObject, moose.PoolBase) \ + or isinstance(mooseObject, moose.EnzBase) ): + item = self.mooseId_GObj[mooseObject] + item.updateColor(colour) + + def mooseObjOntoscene(self): + # All the compartments are put first on to the scene \ + # Need to do: Check With upi if empty compartments exist + self.qGraCompt = {} + self.qGraGrp = {} + self.mooseId_GObj = {} + if self.qGraCompt: + self.qGraCompt.clear() + else: + self.qGraCompt = {} + + if self.qGraGrp: + self.qGraGrp.clear() + else: + self.qGraGrp = {} + + if self.qGraGrp: + self.qGraGrp.clear() + else: + self.qGraGrp = {} + + if self.mooseId_GObj: + self.mooseId_GObj.clear() + else: + self.mooseId_GObj = {} + + logger_.debug( "self.objPar: " + str(self.objPar) ) + for k, v in self.objPar.items(): + if isinstance(moose.element(k), moose.ChemCompt): + self.createCompt(k) + self.qGraCompt[k] + + elif isinstance(moose.element(k), moose.Neutral): + if len(self.meshEntry[k]): + if isinstance(moose.element(v), moose.ChemCompt): + group_parent = self.qGraCompt[v] + elif isinstance(moose.element(v), moose.Neutral): + group_parent = self.qGraGrp[v] + self.createGroup(k, group_parent) + + for cmpt_grp, memb in self.meshEntry.items(): + if len(memb): + if isinstance(moose.element(cmpt_grp), moose.ChemCompt): + qtGrpparent = self.qGraCompt[cmpt_grp] + elif isinstance(moose.element(cmpt_grp), moose.Neutral): + qtGrpparent = self.qGraGrp[cmpt_grp] + for mclass in [ + "enzyme", "pool", "reaction", "cplx", "function", + "stimTab" + ]: + self.mObjontoscene(memb, mclass, qtGrpparent) + + self.groupChildrenBoundingRect() + # compartment's rectangle size is calculated depending on children + self.comptChildrenBoundingRect() + + def mObjontoscene(self, memb, mclass, qtGrpparent): + try: + memb[mclass] + except KeyError: + pass + else: + for mObj in memb[mclass]: + minfo = mObj.path + '/info' + if mObj.className in ['Enz', "ZombieEnz"]: + mItem = kkitQGraphics.EnzItem(mObj, qtGrpparent) + + elif mObj.className in ['MMenz', "ZombieMMenz"]: + mItem = kkitQGraphics.MMEnzItem(mObj, qtGrpparent) + + elif isinstance(moose.element(mObj), + moose.PoolBase) and mclass != "cplx": + # depending on Editor Widget or Run widget pool will be + # created a PoolItem or PoolItemCircle + mItem = self.makePoolItem(mObj, qtGrpparent) + + elif isinstance(moose.element(mObj), moose.ReacBase): + mItem = kkitQGraphics.ReacItem(mObj, qtGrpparent) + + elif mclass == "cplx": + minfo = (mObj.parent).path + '/info' + mItem = kkitQGraphics.CplxItem( + mObj, self.mooseId_GObj[moose.element(mObj).parent]) + self.mooseId_GObj[moose.element(mObj.getId())] = mItem + + elif mclass == "function": + if isinstance(moose.element(mObj.parent), moose.PoolBase): + minfo = moose.element(mObj).path + '/info' + moose.Annotator(minfo) + qtGrpparent = self.mooseId_GObj[moose.element( + mObj.parent)] + mItem = kkitQGraphics.FuncItem(mObj, qtGrpparent) + + elif mclass == "stimTab": + minfo = mObj.path + '/info' + mItem = kkitQGraphics.TableItem(mObj, qtGrpparent) + self.mooseId_GObj[moose.element(mObj.getId())] = mItem + self.setupDisplay(minfo, mItem, mclass) + + def createGroup(self, key, parent): + self.new_GRP = kkitQGraphics.GRPItem(parent, 0, 0, 0, 0, key) + self.qGraGrp[key] = self.new_GRP + self.new_GRP.setRect(20, 20, 20, 20) + + def groupChildrenBoundingRect(self): + for k, v in self.qGraGrp.items(): + grpcolor = moose.Annotator(moose.element(k.path + '/info')).color + # TODO: One may need to calculate explicitly the boundary for Group + # also if there is a cross-group connection, then + # childrenBoundrect() will take the QPolygonItem position + rectcompt = v.childrenBoundingRect() + v.setRect(rectcompt.x() - 10, + rectcompt.y() - 10, + rectcompt.width() + 20, + rectcompt.height() + 20) + v.setPen( + QtGui.QPen(Qt.QColor(grpcolor), self.comptPen, Qt.Qt.SolidLine, + Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) + + def comptChildrenBoundingRect(self): + for k, v in self.qGraCompt.items(): + # compartment's rectangle size is calculated depending on children + rectcompt = kkitUtil.calculateChildBoundingRect(v) + v.setRect(rectcompt.x() - 10, + rectcompt.y() - 10, (rectcompt.width() + 20), + (rectcompt.height() + 20)) + v.setPen( + QtGui.QPen(Qt.QColor(66, 66, 66, 100), self.comptPen, + Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) + + def createCompt(self, key): + logger_.debug( "Creating new compartment %s" % key) + self.new_Compt = kkitQGraphics.ComptItem(self, 0, 0, 0, 0, key) + self.qGraCompt[key] = self.new_Compt + self.new_Compt.setRect(10, 10, 10, 10) + self.sceneContainer.addItem(self.new_Compt) + + def setupDisplay(self, info, graphicalObj, objClass): + Annoinfo = moose.Annotator(info) + # For Reaction and Complex object I have skipped the process to get the + # facecolor and background color. + # we are not using these colors for displaying the object so just + # passing dummy color white + if (objClass == "reaction" or objClass == "cplx" + or objClass == "Function" or objClass == "StimulusTable"): + textcolor, bgcolor = QColor("white"), QColor("white") + elif (objClass == "enzyme"): + textcolor, bgcolor = kkitUtil.getColor(info) + if bgcolor.name() == "#ffffff" or bgcolor == "white": + bgcolor = kkitUtil.getRandColor() + Annoinfo.color = str(bgcolor.name()) + else: + textcolor, bgcolor = kkitUtil.getColor(info) + if bgcolor.name() == "#ffffff" or bgcolor == "white": + bgcolor = kkitUtil.getRandColor() + Annoinfo.color = str(bgcolor.name()) + if isinstance(self, kineticEditorWidget): + funct = ["Function", "ZombieFunction"] + comptt = ["CubeMesh", "CylMesh"] + + if objClass in funct: + poolt = ["ZombieBufPool", "BufPool"] + if graphicalObj.mobj.parent.className in poolt: + xpos = 0 + ypos = 30 + if graphicalObj.mobj.parent.className in comptt: + xpos, ypos = self.positioninfo(info) + else: + xpos, ypos = self.positioninfo(info) + + elif isinstance(self, KineticRunWidget): + self.editormooseId_GObj = self.editor.getCentralWidget( + ).mooseId_GObj + editorItem = self.editormooseId_GObj[moose.element(info).parent] + xpos = editorItem.scenePos().x() + ypos = editorItem.scenePos().y() + graphicalObj.setDisplayProperties(xpos, ypos, textcolor, bgcolor) + + def positioninfo(self, iteminfo): + ''' + By this time, model loaded from kkit,cspace,SBML would have info + field created and co-ordinates are added either by autocoordinates (for + cspace,SBML(unless it is not saved from moose)) or from kkit. + ''' + x = float(moose.element(iteminfo).getField('x')) + y = float(moose.element(iteminfo).getField('y')) + return x, y + + def drawLine_arrow(self, itemignoreZooming=False): + for inn, out in self.srcdesConnection.items(): + #print "inn ",inn, " out ",out + # self.srcdesConnection is dictionary which contains key,value \ + # key is Enzyme or Reaction and value [[list of substrate],[list of product]] (tuple) + # key is Function and value is [list of pool] (list) + + #src = self.mooseId_GObj[inn] + linetype = "regular" + if isinstance(out, tuple): + src = self.mooseId_GObj[inn] + if len(out[0]) == 0: + print(inn.className + ' : ' + inn.name + + " doesn't output message") + else: + for items in (items for items in out[0]): + if re.search("xfer", moose.element(items[0]).name): + xrefPool = items[0].name[:items[0].name. + index("_xfer_")] + xrefCompt = items[0].name[items[0].name. + index("_xfer_") + + len("_xfer_"):] + orgCompt = moose.wildcardFind(self.modelRoot + + '/##[FIELD(name)=' + + xrefCompt + ']')[0] + orgPool = moose.wildcardFind(orgCompt.path + + '/##[FIELD(name)=' + + xrefPool + ']')[0] + itemslist = list(items) + itemslist[0] = orgPool + items = tuple(itemslist) + linetype = "crosscompt" + des = self.mooseId_GObj[moose.element(items[0])] + self.lineCord(src, des, items, itemignoreZooming, + linetype) + if len(out[1]) == 0: + print(inn.className + ' : ' + inn.name + + " doesn't output message") + else: + for items in (items for items in out[1]): + if re.search("xfer", moose.element(items[0]).name): + xrefPool = items[0].name[:items[0].name. + index("_xfer_")] + xrefCompt = items[0].name[items[0].name. + index("_xfer_") + + len("_xfer_"):] + orgCompt = moose.wildcardFind(self.modelRoot + + '/##[FIELD(name)=' + + xrefCompt + ']')[0] + orgPool = moose.wildcardFind(orgCompt.path + + '/##[FIELD(name)=' + + xrefPool + ']')[0] + itemslist = list(items) + itemslist[0] = orgPool + items = tuple(itemslist) + linetype = "crosscompt" + des = self.mooseId_GObj[moose.element(items[0])] + self.lineCord(src, des, items, itemignoreZooming, + linetype) + elif isinstance(out, list): + if len(out) == 0: + if inn.className == "StimulusTable": + print(inn.name + " doesn't have output") + elif inn.className == "ZombieFunction" or inn.className == "Function": + print(inn.name + " doesn't have sumtotal ") + else: + src = self.mooseId_GObj[inn] + for items in (items for items in out): + if re.search("xfer", moose.element(items[0]).name): + xrefPool = items[0].name[:items[0].name. + index("_xfer_")] + xrefCompt = items[0].name[items[0].name. + index("_xfer_") + + len("_xfer_"):] + orgCompt = moose.wildcardFind(self.modelRoot + + '/##[FIELD(name)=' + + xrefCompt + ']')[0] + orgPool = moose.wildcardFind(orgCompt.path + + '/##[FIELD(name)=' + + xrefPool + ']')[0] + itemslist = list(items) + itemslist[0] = orgPool + items = tuple(itemslist) + linetype = "crosscompt" + des = self.mooseId_GObj[moose.element(items[0])] + self.lineCord(src, des, items, itemignoreZooming, + linetype) + + def lineCord(self, src, des, type_no, itemignoreZooming, linetype): + srcdes_list = [] + endtype = type_no[1] + line = 0 + if (src == "") and (des == ""): + print("Source or destination is missing or incorrect") + return + srcdes_list = [src, des, endtype, line] + arrow = kkitUtil.calcArrow(srcdes_list, itemignoreZooming, + self.iconScale) + self.drawLine(srcdes_list, arrow, linetype) + + while (type_no[2] > 1 and line <= (type_no[2] - 1)): + srcdes_list = [src, des, endtype, line] + arrow = kkitUtil.calcArrow(srcdes_list, itemignoreZooming, + self.iconScale) + self.drawLine(srcdes_list, arrow, linetype) + line = line + 1 + + if type_no[2] > 5: + print("Higher order reaction will not be displayed") + + def drawLine(self, srcdes_list, arrow, linetype="solid"): + src = srcdes_list[0] + des = srcdes_list[1] + endtype = srcdes_list[2] + line = srcdes_list[3] + source = moose.element( + next((k for k, v in self.mooseId_GObj.items() if v == src), None)) + for l, v, et, o in self.object2line[src]: + if v == des and o == line: + l.setPolygon(arrow) + arrowPen = l.pen() + arrowPenWidth = self.arrowsize * self.iconScale + arrowPen.setColor(l.pen().color()) + arrowPen.setWidth(arrowPenWidth) + l.setPen(arrowPen) + return + qgLineitem = self.sceneContainer.addPolygon(arrow) + qgLineitem.setParentItem(src.parentItem()) + pen = QtGui.QPen(QtCore.Qt.green, 0, Qt.Qt.SolidLine, Qt.Qt.RoundCap, + Qt.Qt.RoundJoin) + if linetype == "crosscompt": + pen.setStyle(Qt.Qt.CustomDashLine) + pen.setDashPattern([1, 5, 1, 5]) + + pen.setWidth(self.arrowsize) + + # Green is default color moose.ReacBase and derivatives - already set above + if isinstance(source, moose.EnzBase): + if ((endtype == 's') or (endtype == 'p')): + pen.setColor(QtCore.Qt.red) + elif (endtype != 'cplx'): + p1 = (next( + (k for k, v in self.mooseId_GObj.items() if v == src), + None)) + pinfo = p1.parent.path + '/info' + color, bgcolor = kkitUtil.getColor(pinfo) + #color = QColor(color[0],color[1],color[2]) + pen.setColor(bgcolor) + + elif isinstance(source, moose.PoolBase) or isinstance( + source, moose.Function): + pen.setColor(QtCore.Qt.blue) + elif isinstance(source, moose.StimulusTable): + pen.setColor(QtCore.Qt.yellow) + self.lineItem_dict[qgLineitem] = srcdes_list + self.object2line[src].append((qgLineitem, des, endtype, line)) + self.object2line[des].append((qgLineitem, src, endtype, line)) + qgLineitem.setPen(pen) + + def positionChange(self, mooseObject): + #If the item position changes, the corresponding arrow's are calculated + for k, v in self.qGraCompt.items(): + for rectChilditem in v.childItems(): + self.updateArrow(rectChilditem) + if isinstance(rectChilditem, kkitQGraphics.GRPItem): + for grpChilditem in rectChilditem.childItems(): + self.updateArrow(grpChilditem) + if isinstance(grpChilditem, + kkitQGraphics.KineticsDisplayItem): + if moose.exists(grpChilditem.mobj.path + '/info'): + #print grpChilditem.mobj.name, grpChilditem.scenePos() + moose.element( + grpChilditem.mobj.path + + '/info').x = grpChilditem.scenePos().x() + moose.element( + grpChilditem.mobj.path + + '/info').y = grpChilditem.scenePos().y() + if isinstance(rectChilditem, kkitUtil.KineticsDisplayItem): + if moose.exists(rectChilditem.mobj.path + '/info'): + moose.element( + rectChilditem.mobj.path + + '/info').x = rectChilditem.scenePos().x() + moose.element( + rectChilditem.mobj.path + + '/info').y = rectChilditem.scenePos().y() + + rectcompt = kkitUtil.calculateChildBoundingRect(v) + comptBoundingRect = v.boundingRect() + if not comptBoundingRect.contains(rectcompt): + self.updateCompartmentSize(v) + else: + rectcompt = kkitUtil.calculateChildBoundingRect(v) + v.setRect(rectcompt.x() - 10, + rectcompt.y() - 10, (rectcompt.width() + 20), + (rectcompt.height() + 20)) + + def positionChange_old(self, mooseObject): + # If the item position changes, the corresponding arrow's are calculated + if isinstance(moose.element(mooseObject), kkitQGraphics.ChemCompt): + for k, v in self.qGraCompt.items(): + mesh = moose.element(mooseObject).path + if k.path == mesh: + for rectChilditem in v.childItems(): + if isinstance(rectChilditem, + kkitQGraphics.KineticsDisplayItem): + if moose.exists(rectChilditem.mobj.path): + iInfo = rectChilditem.mobj.path + '/info' + moose.Annotator(iInfo) + if isinstance( + moose.element(rectChilditem.mobj.path), + moose.PoolBase): + t = moose.element(rectChilditem.mobj.path) + moose.element(t).children + for items in moose.element(t).children: + if isinstance(moose.element(items), + moose.Function): + test = moose.element(items.path + + '/x') + for i in moose.element( + test).neighbors['input']: + j = self.mooseId_GObj[ + moose.element(i)] + self.updateArrow(j) + self.updateArrow(rectChilditem) + elif moose.element(mooseObject).className == 'Neutral': + for k, v in self.qGraGrp.items(): + for grpChilditem in v.childItems(): + if isinstance(grpChilditem, + kkitQGraphics.KineticsDisplayItem): + if moose.exists(grpChilditem.mobj.path): + iInfo = grpChilditem.mobj.path + '/info' + moose.Annotator(iInfo) + + if isinstance(moose.element(grpChilditem.mobj.path), + moose.PoolBase): + t = moose.element(grpChilditem.mobj.path) + moose.element(t).children + for items in moose.element(t).children: + if isinstance(moose.element(items), + moose.Function): + test = moose.element(items.path + '/x') + for i in moose.element( + test).neighbors['input']: + j = self.mooseId_GObj[moose.element(i)] + self.updateArrow(j) + self.updateArrow(grpChilditem) + rectgrp = kkitUtil.calculateChildBoundingRect(v) + v.setRect(rectgrp.x() - 10, + rectgrp.y() - 10, (rectgrp.width() + 20), + (rectgrp.height() + 20)) + for k, v in self.qGraCompt.items(): + rectcompt = kkitUtil.calculateChildBoundingRect(v) + comptBoundingRect = v.boundingRect() + if not comptBoundingRect.contains(rectcompt): + self.updateCompartmentSize(v) + + else: + rectcompt = kkitUtil.calculateChildBoundingRect(v) + v.setRect(rectcompt.x() - 10, + rectcompt.y() - 10, + rectcompt.width() + 20, + rectcompt.height() + 20) + else: + mobj = self.mooseId_GObj[moose.element(mooseObject)] + self.updateArrow(mobj) + for k, v in self.qGraCompt.items(): + rectcompt = kkitUtil.calculateChildBoundingRect(v) + comptBoundingRect = v.boundingRect() + if not comptBoundingRect.contains(rectcompt): + self.updateCompartmentSize(v) + + else: + rectcompt = kkitUtil.calculateChildBoundingRect(v) + v.setRect(rectcompt.x() - 10, + rectcompt.y() - 10, + rectcompt.width() + 20, + rectcompt.height() + 20) + + def updateGrpSize(self, grp): + childrenBoundary = kkitUtil.calculateChildBoundingRect(grp) + x = childrenBoundary.x() + y = childrenBoundary.y() + height = childrenBoundary.height() + width = childrenBoundary.width() + grp.setRect(x - 10, y - 10, width + 20, height + 20) + + def updateCompartmentSize(self, compartment): + compartmentBoundary = compartment.rect() + childrenBoundary = kkitUtil.calculateChildBoundingRect(compartment) + x = min(compartmentBoundary.x(), childrenBoundary.x()) + y = min(compartmentBoundary.y(), childrenBoundary.y()) + width = max(compartmentBoundary.width(), childrenBoundary.width()) + height = max(compartmentBoundary.height(), childrenBoundary.height()) + compartment.setRect(x - 10, y - 10, width + 20, height + 20) + + def updateArrow(self, qGTextitem): + #if there is no arrow to update then return + listItem = self.object2line[qGTextitem] + for ql, va, endtype, order in listItem: + srcdes = [] + srcdes = self.lineItem_dict[ql] + # Checking if src (srcdes[0]) or des (srcdes[1]) is ZombieEnz, + # if yes then need to check if cplx is connected to any mooseObject, + # so that when Enzyme is moved, cplx connected arrow to other + # mooseObject(poolItem) should also be updated + if( type(srcdes[0]) == kkitQGraphics.EnzItem \ + or type(srcdes[0] == kkitQGraphics.MMEnzItem)): + self.cplxUpdatearrow(srcdes[0]) + elif( type(srcdes[1]) == kkitQGraphics.EnzItem \ + or type(srcdes[1] == kkitQGraphics.MMEnzItem)): + self.cplxUpdatearrow(srcdes[1]) + arrow = kkitUtil.calcArrow(srcdes, self.itemignoreZooming, + self.iconScale) + ql.setPolygon(arrow) + + def cplxUpdatearrow(self, srcdes): + # srcdes which is 'EnzItem' from this,get ChildItems are retrived (b'cos cplx is child of zombieEnz) + #And cplxItem is passed for updatearrow + for item in srcdes.childItems(): + if isinstance(item, kkitQGraphics.CplxItem): + self.updateArrow(item) + + def positionChange1(self, mooseObject): + #If the item position changes, the corresponding arrow's are calculated + if ( (isinstance(moose.element(mooseObject), moose.CubeMesh)) \ + or (isinstance(moose.element(mooseObject), moose.CylMesh))): + v = self.qGraCompt[mooseObject] + for rectChilditem in v.childItems(): + self.updateArrow(rectChilditem) + else: + mobj = self.mooseId_GObj[mooseObject.getId()] + self.updateArrow(mobj) + mooseObjcompt = self.findparent(mooseObject) + v = self.qGraCompt[mooseObjcompt] + #childBoundingRect = v.childrenBoundingRect() + childBoundingRect = kkitUtil.calculateChildBoundingRect(v) + comptBoundingRect = v.boundingRect() + rectcompt = comptBoundingRect.united(childBoundingRect) + comptPen = v.pen() + comptWidth = 5 + comptPen.setWidth(comptWidth) + v.setPen(comptPen) + if not comptBoundingRect.contains(childBoundingRect): + v.setRect(rectcompt.x() - comptWidth, + rectcompt.y() - comptWidth, + rectcompt.width() + (comptWidth * 2), + rectcompt.height() + (comptWidth * 2)) + + +class kineticEditorWidget(KineticsWidget): + def __init__(self, plugin, *args): + + KineticsWidget.__init__(self, plugin, *args) + self.plugin = plugin + self.insertMenu = QMenu('&Insert') + self._menus.append(self.insertMenu) + self.insertMapper = QtCore.QSignalMapper(self) + classlist = [ + 'CubeMesh', 'CylMesh', 'Pool', 'BufPool', 'Function', 'Reac', + 'Enz', 'MMenz', 'StimulusTable' + ] + self.toolTipinfo = { + "CubeMesh": + "", + "CylMesh": + "", + "Pool": + "A Pool is a collection of molecules of a given species in a given cellular compartment.\n It can undergo reactions that convert it into other pool(s). \nParameters: initConc (Initial concentration), diffConst (diffusion constant). Variable: conc (Concentration)", + "BufPool": + "A BufPool is a buffered pool. \nIt is a collection of molecules of a given species in a given cellular compartment, that are always present at the same concentration.\n This is set by the initConc parameter. \nIt can undergo reactions in the same way as a pool.", + "Function": + "A Func computes an arbitrary mathematical expression of one or more input concentrations of Pools. The output can be used to control the concentration of another Pool, or as an input to another Func", + "StimulusTable": + "A StimulusTable stores an array of values that are read out during a simulation, and typically control the concentration of one of the pools in the model. \nParameters: size of table, values of entries, start and stop times, and an optional loopTime that defines the period over which the StimulusTable should loop around to repeat its values", + "Reac": + "A Reac is a chemical reaction that converts substrates into products, and back. \nThe rates of these conversions are specified by the rate constants Kf and Kb respectively.", + "MMenz": + "An MMenz is the Michaelis-Menten version of an enzyme activity of a given Pool.\n The MMenz must be created on a pool and can only catalyze a single reaction with a specified substrate(s). \nIf a given enzyme species can have multiple substrates, then multiple MMenz activites must be created on the parent Pool. \nThe rate of an MMenz is V [S].[E].kcat/(Km + [S]). There is no enzyme-substrate complex. Parameters: Km and kcat.", + "Enz": + "An Enz is an enzyme activity of a given Pool. The Enz must be created on a pool and can only catalyze a single reaction with a specified substrate(s). \nIf a given enzyme species can have multiple substrates, then multiple Enz activities must be created on the parent Pool. \nThe reaction for an Enz is E + S <===> E.S ---> E + P. \nThis means that a new Pool, the enzyme-substrate complex E.S, is always formed when you create an Enz. \nParameters: Km and kcat, or alternatively, K1, K2 and K3. Km = (K2+K3)/K1" + } + insertMapper, actions = self.getInsertActions(classlist) + for action in actions: + self.insertMenu.addAction(action) + doc = self.toolTipinfo[str(action.text())] + if doc == "": + classname = str(action.text()) + doc = moose.element('/classes/%s' % (classname)).docs + doc = doc.split('Description:')[-1].split('Name:')[0].strip() + action.setToolTip(doc) + + def GrViewresize(self, event): + #when Gui resize and event is sent which inturn call resizeEvent of qgraphicsview + pass + #self.view.resizeEvent1(event) + + def makePoolItem(self, poolObj, qGraCompt): + return kkitQGraphics.PoolItem(poolObj, qGraCompt) + + def getToolBars(self): + #Add specific tool items with respect to kkit + if not hasattr(self, '_insertToolBar'): + self._insertToolBar = QToolBar('Insert') + self._toolBars.append(self._insertToolBar) + for action in self.insertMenu.actions(): + button = MToolButton() + button.setDefaultAction(action) + iconPath = os.path.join(config.MOOSE_ICON_DIR, action.text() + '.png') + assert os.path.exists(iconPath), "Does not exists %s" % iconPath + button.setIcon(QtGui.QIcon(iconPath)) + self._insertToolBar.addWidget(button) + return self._toolBars + +class KineticRunWidget(KineticsWidget): + def __init__(self, plugin, *args): + KineticsWidget.__init__(self, plugin, *args) + + def showEvent(self, event): + self.refresh() + # pass + def refresh(self): + self.sceneContainer.clear() + self.Comptexist = moose.wildcardFind(self.modelRoot + + '/##[ISA=ChemCompt]') + if self.Comptexist: + # pass + self.initMooseObject() + self.mooseObjOntoscene() + self.drawLine_arrow(itemignoreZooming=False) + + def makePoolItem(self, poolObj, qGraCompt): + return kkitQGraphics.PoolItemCircle(poolObj, qGraCompt) + + def getToolBars(self): + return self._toolBars + + def updateValue(self): + for item in self.sceneContainer.items(): + if isinstance(item, kkitQGraphics.ReacItem) \ + or isinstance(item, kkitQGraphics.MMEnzItem) \ + or isinstance(item, kkitQGraphics.EnzItem) \ + or isinstance(item, kkitQGraphics.PoolItemCircle) \ + or isinstance(item, kkitQGraphics.CplxItem): + item.updateValue(item.mobj) + + def changeBgSize(self): + for item in self.sceneContainer.items(): + if isinstance(item, kkitQGraphics.PoolItemCircle): + initialConc = moose.element(item.mobj).concInit + presentConc = moose.element(item.mobj).conc + if initialConc != 0: + ratio = presentConc / initialConc + else: + ratio = presentConc + if ratio > '10': + ratio = 9 + if ratio < '0.0': + ratio = 0.1 + item.updateRect(math.sqrt(abs(ratio))) + + def resetColor(self): + for item in self.sceneContainer.items(): + if isinstance(item, kkitQGraphics.PoolItemCircle): + item.returnEllispeSize() + + +if __name__ == "__main__": + size = QtCore.QSize(1024, 768) + sdir = os.path.dirname(__file__) + modelPath = 'Kholodenko' + itemignoreZooming = False + try: + filepath = os.path.join(sdir, '../../data/' + modelPath + '.g') + print("%s" % (filepath)) + moose.loadModel(filepath, '/' + modelPath) + dt = KineticsWidget( "kkit" ) + dt.modelRoot = '/' + modelPath + dt.updateModelView() + dt.show() + except IOError as e: + print(e) + sys.exit(app.exec_()) diff --git a/plugins/kkitCalcArrow.py b/moosegui/plugins/kkitCalcArrow.py similarity index 95% rename from plugins/kkitCalcArrow.py rename to moosegui/plugins/kkitCalcArrow.py index 4a3128f..83764ba 100644 --- a/plugins/kkitCalcArrow.py +++ b/moosegui/plugins/kkitCalcArrow.py @@ -7,8 +7,8 @@ __status__ = "Development" __updated__ = "Jul 27 2017" -from PyQt4.QtGui import QPolygonF -from PyQt4.QtCore import QLineF,QPointF +from PyQt5.QtGui import QPolygonF +from PyQt5.QtCore import QLineF,QPointF from math import sin,cos,atan2,radians from kkitQGraphics import PoolItem #, ReacItem,EnzItem,CplxItem,ComptItem @@ -80,9 +80,9 @@ def calcArrow(srcdes_list,itemignoreZooming,iconScale): destIntersects, lineDestPoint = calcLineRectIntersection(desRect, tmpLine) if not srcIntersects: - print 'Source does not intersect line. Arrow points:',lineSrcPoint,src.mobj.name, src.mobj.className + print('Source does not intersect line. Arrow points:',lineSrcPoint,src.mobj.name, src.mobj.className) if not destIntersects: - print 'Dest does not intersect line. Arrow points:', lineDestPoint, des.mobj.name, des.mobj.className + print('Dest does not intersect line. Arrow points:', lineDestPoint, des.mobj.name, des.mobj.className) '''src and des are connected with line co-ordinates Arrow head is drawned if the distance between src and des line is >8 just for clean appeareance diff --git a/moosegui/plugins/kkitOrdinateUtil.py b/moosegui/plugins/kkitOrdinateUtil.py new file mode 100644 index 0000000..51685a7 --- /dev/null +++ b/moosegui/plugins/kkitOrdinateUtil.py @@ -0,0 +1,418 @@ +# -*- coding: utf-8 -*- + +__author__ = "HarshaRani" +__credits__ = ["Upi Lab"] +__license__ = "GPL3" +__version__ = "1.0.0" +__maintainer__ = "HarshaRani" +__email__ = "hrani@ncbs.res.in" +__status__ = "Development" +__updated__ = "Oct 26 2018" + +import collections +import numpy as np +from networkx.drawing.nx_agraph import graphviz_layout +import networkx as nx +import re + +from PyQt5.QtGui import QColor + +import moose + +from moosegui.plugins.kkitUtil import colorCheck, findGroup_compt + + +def getxyCord(xcord, ycord, list1): + for item in list1: + if not isinstance(item, moose.Function): + objInfo = item.path + '/info' + xcord.append(xyPosition(objInfo, 'x')) + ycord.append(xyPosition(objInfo, 'y')) + + +def xyPosition(objInfo, xory): + try: + return moose.element(objInfo).getField(xory) + except ValueError: + return 0.0, 0.0 + + +def populateMeshEntry(meshEntry, parent, types, obj): + try: + meshEntry[moose.element(parent.path)][types] + except KeyError: + # Key is not present + meshEntry[moose.element(parent.path)].update( + {types: [moose.element(obj)]}) + else: + mlist = meshEntry[moose.element(parent.path)][types] + mlist.append(moose.element(obj)) + + +def updateMeshObj(modelRoot): + meshEntry = {} + if meshEntry: + meshEntry.clear() + else: + meshEntry = {} + + objPar = collections.OrderedDict() + for compt in moose.wildcardFind(modelRoot + '/##[ISA=ChemCompt]'): + try: + meshEntry[moose.element(compt)] + except KeyError: + # Compt is not present + meshEntry[moose.element(compt)] = {} + objPar[moose.element(compt)] = moose.element('/') + + for grp in moose.wildcardFind(compt.path + '/##[TYPE=Neutral]'): + try: + meshEntry[moose.element(grp)] + except KeyError: + # Grp is not present + grp_cmpt = findGroup_compt(grp.parent) + meshEntry[moose.element(grp)] = {} + objPar[moose.element(grp)] = moose.element(grp_cmpt) + + for compt in moose.wildcardFind(modelRoot + '/##[ISA=ChemCompt]'): + for m in moose.wildcardFind(compt.path + '/##[ISA=PoolBase]'): + grp_cmpt = findGroup_compt(m) + if isinstance(moose.element(grp_cmpt), moose.Neutral): + if isinstance(moose.element(m.parent), moose.EnzBase): + populateMeshEntry(meshEntry, grp_cmpt, "cplx", m) + else: + populateMeshEntry(meshEntry, grp_cmpt, "pool", m) + else: + if isinstance(moose.element(m.parent), moose.EnzBase): + populateMeshEntry(meshEntry, compt, "cplx", m) + else: + populateMeshEntry(meshEntry, compt, "pool", m) + + for r in moose.wildcardFind(compt.path + '/##[ISA=ReacBase]'): + rgrp_cmpt = findGroup_compt(r) + if isinstance(moose.element(rgrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, rgrp_cmpt, "reaction", r) + else: + populateMeshEntry(meshEntry, compt, "reaction", r) + + for e in moose.wildcardFind(compt.path + '/##[ISA=EnzBase]'): + egrp_cmpt = findGroup_compt(e) + if isinstance(moose.element(egrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, egrp_cmpt, "enzyme", e) + else: + populateMeshEntry(meshEntry, compt, "enzyme", e) + + for f in moose.wildcardFind(compt.path + '/##[ISA=Function]'): + fgrp_cmpt = findGroup_compt(f) + if isinstance(moose.element(fgrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, fgrp_cmpt, "function", f) + else: + populateMeshEntry(meshEntry, compt, "function", f) + + for t in moose.wildcardFind(compt.path + '/##[ISA=StimulusTable]'): + tgrp_cmpt = findGroup_compt(t) + if isinstance(moose.element(tgrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, tgrp_cmpt, "stimTab", t) + else: + populateMeshEntry(meshEntry, compt, "stimTab", t) + return (objPar, meshEntry) + + +def setupMeshObj(modelRoot): + ''' + Setup compartment and its members pool,reaction,enz cplx under + self.meshEntry dictionaries, self.meshEntry with "key" as compartment, + value is key2:list where key2 represents moose object type,list of objects + of a perticular type e.g self.meshEntry[meshEnt] = { 'reaction': + reaction_list,'enzyme':enzyme_list,'pool':poollist,'cplx': cplxlist} + ''' + + xmin = 0.0 + xmax = 1.0 + ymin = 0.0 + ymax = 1.0 + positionInfoExist = True + meshEntry = {} + if meshEntry: + meshEntry.clear() + else: + meshEntry = {} + xcord = [] + ycord = [] + objPar = collections.OrderedDict() + + for compt in moose.wildcardFind(modelRoot + '/##[ISA=ChemCompt]'): + groupColor = [] + try: + meshEntry[moose.element(compt)] + except KeyError: + # Compt is not present + meshEntry[moose.element(compt)] = {} + objPar[moose.element(compt)] = moose.element('/') + + for grp in moose.wildcardFind(compt.path + '/##[TYPE=Neutral]'): + grpinfo = moose.Annotator(moose.element(grp).path + '/info') + validatecolor = colorCheck(grpinfo.color, "bg") + validatedgrpcolor = str(QColor(validatecolor).name()) + + groupColor.append(validatedgrpcolor) + grp_cmpt = findGroup_compt(grp.parent) + + try: + meshEntry[moose.element(grp)] + except KeyError: + # Grp is not present + meshEntry[moose.element(grp)] = {} + objPar[moose.element(grp)] = moose.element(grp_cmpt) + + for compt in moose.wildcardFind(modelRoot + '/##[ISA=ChemCompt]'): + for m in moose.wildcardFind(compt.path + '/##[ISA=PoolBase]'): + if not re.search("xfer", m.name): + grp_cmpt = findGroup_compt(m) + xcord.append(xyPosition(m.path + '/info', 'x')) + ycord.append(xyPosition(m.path + '/info', 'y')) + if isinstance(moose.element(grp_cmpt), moose.Neutral): + if isinstance(moose.element(m.parent), moose.EnzBase): + populateMeshEntry(meshEntry, grp_cmpt, "cplx", m) + else: + populateMeshEntry(meshEntry, grp_cmpt, "pool", m) + else: + if isinstance(moose.element(m.parent), moose.EnzBase): + populateMeshEntry(meshEntry, compt, "cplx", m) + else: + populateMeshEntry(meshEntry, compt, "pool", m) + + for r in moose.wildcardFind(compt.path + '/##[ISA=ReacBase]'): + rgrp_cmpt = findGroup_compt(r) + xcord.append(xyPosition(r.path + '/info', 'x')) + ycord.append(xyPosition(r.path + '/info', 'y')) + if isinstance(moose.element(rgrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, rgrp_cmpt, "reaction", r) + else: + populateMeshEntry(meshEntry, compt, "reaction", r) + + for e in moose.wildcardFind(compt.path + '/##[ISA=EnzBase]'): + egrp_cmpt = findGroup_compt(e) + xcord.append(xyPosition(e.path + '/info', 'x')) + ycord.append(xyPosition(e.path + '/info', 'y')) + if isinstance(moose.element(egrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, egrp_cmpt, "enzyme", e) + else: + populateMeshEntry(meshEntry, compt, "enzyme", e) + + for f in moose.wildcardFind(compt.path + '/##[ISA=Function]'): + fgrp_cmpt = findGroup_compt(f) + if isinstance(moose.element(fgrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, fgrp_cmpt, "function", f) + else: + populateMeshEntry(meshEntry, compt, "function", f) + + for t in moose.wildcardFind(compt.path + '/##[ISA=StimulusTable]'): + tgrp_cmpt = findGroup_compt(t) + xcord.append(xyPosition(t.path + '/info', 'x')) + ycord.append(xyPosition(t.path + '/info', 'y')) + if isinstance(moose.element(tgrp_cmpt), moose.Neutral): + populateMeshEntry(meshEntry, tgrp_cmpt, "stimTab", t) + else: + populateMeshEntry(meshEntry, compt, "stimTab", t) + + xmin = min(xcord) + xmax = max(xcord) + ymin = min(ycord) + ymax = max(ycord) + positionInfoExist = not (len(np.nonzero(xcord)[0]) == 0 + and len(np.nonzero(ycord)[0]) == 0) + return (objPar, meshEntry, xmin, xmax, ymin, ymax, positionInfoExist) + + +def setupItem(modelPath, cntDict): + # This function collects information of what is connected to what. \ + # eg. substrate and product connectivity to reaction's and enzyme's \ + # sumtotal connectivity to its pool are collected + #print " setupItem" + sublist = [] + prdlist = [] + zombieType = ['ReacBase', 'EnzBase', 'Function', 'StimulusTable'] + for baseObj in zombieType: + path = '/##[ISA=' + baseObj + ']' + if modelPath != '/': + path = modelPath + path + if ((baseObj == 'ReacBase') or (baseObj == 'EnzBase')): + for items in moose.wildcardFind(path): + sublist = [] + prdlist = [] + uniqItem, countuniqItem = countitems(items, 'subOut') + subNo = uniqItem + for sub in uniqItem: + sublist.append( + (moose.element(sub), 's', countuniqItem[sub])) + + uniqItem, countuniqItem = countitems(items, 'prd') + prdNo = uniqItem + if (len(subNo) == 0 or len(prdNo) == 0): + print("Substrate Product is empty ", path, " ", items) + + for prd in uniqItem: + prdlist.append( + (moose.element(prd), 'p', countuniqItem[prd])) + + if (baseObj == 'CplxEnzBase'): + uniqItem, countuniqItem = countitems(items, 'toEnz') + for enzpar in uniqItem: + sublist.append((moose.element(enzpar), 't', + countuniqItem[enzpar])) + + uniqItem, countuniqItem = countitems(items, 'cplxDest') + for cplx in uniqItem: + prdlist.append( + (moose.element(cplx), 'cplx', countuniqItem[cplx])) + + if (baseObj == 'EnzBase'): + uniqItem, countuniqItem = countitems(items, 'enzDest') + for enzpar in uniqItem: + sublist.append((moose.element(enzpar), 't', + countuniqItem[enzpar])) + cntDict[items] = sublist, prdlist + elif baseObj == 'Function': + for items in moose.wildcardFind(path): + sublist = [] + prdlist = [] + item = items.path + '/x[0]' + uniqItem, countuniqItem = countitems(item, 'input') + for funcpar in uniqItem: + sublist.append((moose.element(funcpar), 'sts', + countuniqItem[funcpar])) + + uniqItem, countuniqItem = countitems(items, 'valueOut') + for funcpar in uniqItem: + prdlist.append((moose.element(funcpar), 'stp', + countuniqItem[funcpar])) + cntDict[items] = sublist, prdlist + + else: + for tab in moose.wildcardFind(path): + tablist = [] + uniqItem, countuniqItem = countitems(tab, 'output') + for tabconnect in uniqItem: + tablist.append((moose.element(tabconnect), 'tab', + countuniqItem[tabconnect])) + cntDict[tab] = tablist + + +def countitems(mitems, objtype): + items = [] + items = moose.element(mitems).neighbors[objtype] + uniqItems = set(items) + #countuniqItemsauto = Counter(items) + countuniqItems = dict((i, items.count(i)) for i in items) + return (uniqItems, countuniqItems) + + +def recalculatecoordinatesforKkit(mObjlist, xcord, ycord): + positionInfoExist = not(len(np.nonzero(xcord)[0]) == 0 \ + and len(np.nonzero(ycord)[0]) == 0) + + if positionInfoExist: + # Here all the object has been taken now recalculate and reassign back x + # and y co-ordinates + xmin = min(xcord) + xmax = max(xcord) + ymin = min(ycord) + ymax = max(ycord) + for merts in mObjlist: + objInfo = merts.path + '/info' + if moose.exists(objInfo): + Ix = (xyPosition(objInfo, 'x') - xmin) / (xmax - xmin) + Iy = (ymin - xyPosition(objInfo, 'y')) / (ymax - ymin) + moose.element(objInfo).x = Ix * 1000 + moose.element(objInfo).y = Iy * 800 + + +def autoCoordinates(meshEntry, srcdesConnection): + G = nx.Graph() + for cmpt, memb in meshEntry.items(): + if memb in ["enzyme"]: + for enzObj in find_index(memb, 'enzyme'): + #G.add_node(enzObj.path) + G.add_node(enzObj.path, + label='', + shape='ellipse', + color='', + style='filled', + fontname='Helvetica', + fontsize=12, + fontcolor='blue') + for cmpt, memb in meshEntry.items(): + #if memb.has_key + if memb in ["pool", "cplx", "reaction"]: + for poolObj in find_index(memb, 'pool'): + #G.add_node(poolObj.path) + G.add_node(poolObj.path, + label=poolObj.name, + shape='box', + color='', + style='filled', + fontname='Helvetica', + fontsize=9, + fontcolor='blue') + for cplxObj in find_index(memb, 'cplx'): + G.add_node(cplxObj.path) + G.add_node(cplxObj.path, + label=cplxObj.name, + shape='box', + color='', + style='filled', + fontname='Helvetica', + fontsize=12, + fontcolor='blue') + #G.add_edge((cplxObj.parent).path,cplxObj.path) + for reaObj in find_index(memb, 'reaction'): + #G.add_node(reaObj.path) + G.add_node(reaObj.path, label='', shape='circle', color='') + + for inn, out in list(srcdesConnection.items()): + if isinstance(out, tuple): + if len(out[0]) == 0: + print(inn.className + ':' + inn.name + + " doesn't have input message") + else: + for items in (items for items in out[0]): + G.add_edge(moose.element(items[0]).path, inn.path) + if len(out[1]) == 0: + print(inn.className + ':' + inn.name + + "doesn't have output mssg") + else: + for items in (items for items in out[1]): + G.add_edge(inn.path, moose.element(items[0]).path) + elif isinstance(out, list): + if len(out) == 0: + print("Func pool doesn't have sumtotal") + else: + for items in (items for items in out): + G.add_edge(moose.element(items[0]).path, inn.path) + + position = graphviz_layout(G) + xcord, ycord = [], [] + for item in position.items(): + xy = item[1] + xroundoff = round(xy[0], 0) + yroundoff = round(xy[1], 0) + xcord.append(xroundoff) + ycord.append(yroundoff) + + for item in position.items(): + xy = item[1] + anno = moose.Annotator(item[0] + '/info') + anno.x = xy[0] + anno.y = xy[1] + + +def find_index(value, key): + """ + Value.get(key) to avoid expection which would raise if empty value in + dictionary for a given key. + """ + if key in value: + return value[key] + else: + raise ValueError("key '%s' not found" % key) diff --git a/moosegui/plugins/kkitQGraphics.py b/moosegui/plugins/kkitQGraphics.py new file mode 100644 index 0000000..8d8823d --- /dev/null +++ b/moosegui/plugins/kkitQGraphics.py @@ -0,0 +1,740 @@ +# -*- coding: utf-8 -*- + +__author__ = "HarshaRani" +__credits__ = ["Upi Lab"] +__license__ = "GPL3" +__version__ = "1.0.0" +__maintainer__ = "HarshaRani" +__email__ = "hrani@ncbs.res.in" +__status__ = "Development" +__updated__ = "Sep 19 2017" + +import os + +from PyQt5 import QtGui, QtCore, Qt +from PyQt5.QtWidgets import QGraphicsPixmapItem, QGraphicsWidget +from PyQt5.QtWidgets import QGraphicsRectItem, QGraphicsItem +from PyQt5.QtWidgets import QGraphicsObject, QGraphicsPathItem +from PyQt5.QtWidgets import QGraphicsEllipseItem + +from moosegui.plugins import constants +from moosegui import config + +import moose + + +class KineticsDisplayItem(QGraphicsWidget): + """Base class for display elemenets in kinetics layout""" + + name = constants.ITEM + defaultFontName = "Helvetica" + defaultFontSize = 10 + qgtextItemSelectedChange = QtCore.pyqtSignal('PyQt_PyObject') + + def __init__(self, mooseObject, parent=None): + QGraphicsObject.__init__(self, parent) + self.mobj = mooseObject + self.gobj = None + self.pressed = False + self.setFlag(QGraphicsItem.ItemIsSelectable, True) + self.setFlag(QGraphicsItem.ItemIsMovable, True) + self.setAcceptHoverEvents(True) + self.setFocusPolicy(QtCore.Qt.StrongFocus) + if QtCore.QT_VERSION >= 0x040600: + self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, 1) + self.setFlag(QGraphicsItem.ItemIgnoresTransformations, False) + + def getParentMooseObject(self): + return moose.element(self.mobj).parent + + def getParentGraphicsObject(self): + return self.parentItem() + + def setDisplayProperties(self, dinfo): + self.setGeometry(dinfo.x, dinfo.y) + + def paint(self, painter=None, option=None, widget=None): + #If item is selected + if self.hasFocus() or self.isSelected(): + painter.setPen( + QtGui.QPen(QtCore.Qt.black, 1.8, Qt.Qt.DashLine, + Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) + painter.drawRect(self.boundingRect()) + + # def mouseDoubleClickEvent(self, event): + # self.emit(QtCore.SIGNAL("qgtextDoubleClick(PyQt_PyObject)"),moose.element(self.mobj)) + + def itemChange(self, change, value): + #pass + #if change == QGraphicsItem.ItemPositionChange: + #print "itemChange ---->",self.mobj + # self.emit(QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"),self.mobj) + if change == QGraphicsItem.ItemSelectedChange and value == True: + self.qgtextPositionChange.emit( moose.element(self.mobj) ) + # self.emit(QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"), + # moose.element(self.mobj)) + return QGraphicsItem.itemChange(self, change, value) + + +class FuncItem(KineticsDisplayItem): + name = constants.ITEM + """Class for displaying Functions""" + #fontMetrics = None + font = QtGui.QFont(KineticsDisplayItem.defaultFontName) + font.setPointSize(KineticsDisplayItem.defaultFontSize) + fontMetrics = QtGui.QFontMetrics(font) + + def __init__(self, mobj, parent): + super(FuncItem, self).__init__(mobj, parent) + self.setFlag(QGraphicsItem.ItemIsMovable, True) + iconmap_file = (os.path.join(config.settings[config.KEY_ICON_DIR], + 'classIcon/Function.png')) + self.funcImage = QtGui.QImage(iconmap_file).scaled(15, 33) + self.bg = QGraphicsRectItem(self) + self.bg.setAcceptHoverEvents(True) + self.gobj = QGraphicsPixmapItem( + QtGui.QPixmap.fromImage(self.funcImage), self.bg) + self.gobj.setAcceptHoverEvents(True) + self.gobj.mobj = self.mobj + funcdoc = (moose.element(self.mobj.path)).expr + self.gobj.setToolTip(funcdoc) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + """Set the display properties of this item.""" + poolt = ["ZombieBufPool", "BufPool", "ZombiePool", "Pool"] + if self.gobj.mobj.parent.className in poolt: + self.setGeometry(0, 30, + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + else: + self.setGeometry(x, y, + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + self.bg.setBrush(QtGui.QBrush(bgcolor)) + self.setFlag(QGraphicsItem.ItemIsMovable, False) + + def refresh(self, scale): + pass + + def boundingRect(self): + ''' reimplimenting boundingRect for redrawning ''' + return QtCore.QRectF(0, 0, + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + + def updateSlot(self): + return None + + def updateColor(self, bgcolor): + return None + + def updateRect(self, ratio): + return None + + def returnColor(self): + return (self.bg.brush().color()) + + def updateValue(self, gobj, funcdoc='Not Available'): + self.gobj.setToolTip(funcdoc) + + +class PoolItem(KineticsDisplayItem): + name = constants.ITEM + """Class for displaying pools. Uses a QGraphicsSimpleTextItem to + display the name.""" + #fontMetrics = None + font = QtGui.QFont(KineticsDisplayItem.defaultFontName) + font.setPointSize(KineticsDisplayItem.defaultFontSize) + fontMetrics = QtGui.QFontMetrics(font) + + def __init__(self, mobj, parent): + KineticsDisplayItem.__init__(self, mobj, parent) + self.bg = QGraphicsRectItem(self) + self.bg.setAcceptHoverEvents(True) + self.gobj = QtGui.QGraphicsSimpleTextItem(self.mobj.name, self.bg) + self.gobj.mobj = self.mobj + self._conc = self.mobj.conc + self._n = self.mobj.n + doc = "Conc\t: " + str(self._conc) + "\nn\t: " + str(self._n) + self.gobj.setToolTip(doc) + self.gobj.setFont(PoolItem.font) + if not PoolItem.fontMetrics: + PoolItem.fontMetrics = QtGui.QFontMetrics(self.gobj.font()) + self.bg.setRect( + 0, 0, + self.gobj.boundingRect().width() + + PoolItem.fontMetrics.width(' '), + self.gobj.boundingRect().height()) + self.bg.setPen(Qt.QColor(0, 0, 0, 0)) + self.gobj.setPos(PoolItem.fontMetrics.width(' '), 0) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + """Set the display properties of this item.""" + self.setGeometry( + x, y, + self.gobj.boundingRect().width() + PoolItem.fontMetrics.width(''), + self.gobj.boundingRect().height()) + self.bg.setBrush(QtGui.QBrush(bgcolor)) + + def refresh(self, scale): + fontsize = KineticsDisplayItem.defaultFontSize * scale + font = QtGui.QFont(KineticsDisplayItem.defaultFontName) + if (fontsize < 1): + fontsize = self.gobj.font().pointSize() + font.setPointSize(fontsize) + #self.gobj.setFont(PoolItem.font) + self.gobj.setFont(font) + + def boundingRect(self): + ''' reimplimenting boundingRect for redrawning ''' + return QtCore.QRectF( + 0, 0, + self.gobj.boundingRect().width() + + PoolItem.fontMetrics.width(' '), + self.gobj.boundingRect().height()) + + def updateSlot(self): + #This func will adjust the background color with respect to text size + self.gobj.setText(self.mobj.name) + self.bg.setRect( + 0, 0, + self.gobj.boundingRect().width() + + PoolItem.fontMetrics.width(' '), + self.gobj.boundingRect().height()) + self.setGeometry( + self.pos().x(), + self.pos().y(), + self.gobj.boundingRect().width() + PoolItem.fontMetrics.width(''), + self.gobj.boundingRect().height()) + + def updateColor(self, bgcolor): + self.bg.setBrush(QtGui.QBrush(QtGui.QColor(bgcolor))) + + def updateRect(self, ratio=1.0): + width = self.gobj.boundingRect().width() + PoolItem.fontMetrics.width( + ' ') + height = self.gobj.boundingRect().height() + adjustw = width * ratio + adjusth = height * ratio + self.bg.setRect(width / 2 - abs(adjustw / 2), + height / 2 - abs(adjusth / 2), adjustw, adjusth) + + def returnColor(self): + return (self.bg.brush().color()) + + def updateValue(self, gobj): + self._gobj = gobj + if (isinstance(self._gobj, moose.PoolBase)): + self._conc = self.mobj.conc + self._n = self.mobj.n + doc = "Conc\t: " + str(self._conc) + "\nn\t: " + str(self._n) + self.gobj.setToolTip(doc) + + +class PoolItemCircle(PoolItem): + name = constants.ITEM + + def __init__(self, *args, **kwargs): + PoolItem.__init__(self, *args, **kwargs) + self.setFlag(QGraphicsItem.ItemIsMovable, True) + self.bgColor = QGraphicsEllipseItem(self) + self.bgColor.setFlag(QGraphicsItem.ItemStacksBehindParent, True) + self.bgColor.setRect(((self.gobj.boundingRect().width() + + PoolItem.fontMetrics.width(' ')) / 2) - 5, + self.gobj.boundingRect().height() / 2 - 5, 10, 10) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + self.setGeometry( + x, y, + self.gobj.boundingRect().width() + + PoolItem.fontMetrics.width(' '), + self.gobj.boundingRect().height()) + self.bgColor.setBrush( + QtGui.QBrush( + QtGui.QColor(bgcolor.red(), bgcolor.green(), bgcolor.blue(), + 255))) + + def updateRect(self, ratio): + width = self.gobj.boundingRect().width() + PoolItem.fontMetrics.width( + ' ') + height = self.gobj.boundingRect().height() + adjustw = width * ratio + adjusth = height * ratio + self.bgColor.setRect(width / 2 - abs(adjustw / 2), + height / 2 - abs(adjusth / 2), adjustw, adjusth) + self.updateValue(self.gobj) + + def returnEllispeSize(self): + self.bgColor.setRect(((self.gobj.boundingRect().width() + + PoolItem.fontMetrics.width(' ')) / 2) - 5, + self.gobj.boundingRect().height() / 2 - 5, 10, 10) + + def refresh(self, scale): + fontsize = KineticsDisplayItem.defaultFontSize * scale + font = QtGui.QFont(KineticsDisplayItem.defaultFontName) + if (fontsize < 1): + fontsize = self.gobj.font().pointSize() + font.setPointSize(fontsize) + self.gobj.setFont(font) + + def MooseRef(self): + return self.gobj.mobj + + +class TableItem(KineticsDisplayItem): + defaultWidth = 30 + defaultHeight = 30 + defaultPenWidth = 2 + name = constants.ITEM + + def __init__(self, *args, **kwargs): + KineticsDisplayItem.__init__(self, *args, **kwargs) + + points = [ + QtCore.QPointF(0, TableItem.defaultWidth / 2), + QtCore.QPointF(TableItem.defaultHeight / 2 - 2, 0), + QtCore.QPointF(TableItem.defaultWidth / 2 + 2, 0), + QtCore.QPointF(TableItem.defaultWidth, + TableItem.defaultHeight / 2), + ] + + path = QtGui.QPainterPath() + path.moveTo(points[0]) + for p in points[1:]: + path.lineTo(p) + path.moveTo(p) + path.moveTo(0, 0) + path.lineTo(TableItem.defaultWidth, 0) + path.moveTo(-(TableItem.defaultWidth / 3), TableItem.defaultHeight / 4) + path.lineTo((TableItem.defaultWidth + 10), TableItem.defaultHeight / 4) + + self.gobj = QGraphicsPathItem(path, self) + #self.gobj.setToolTip("Need to see what to show unlike conc/nint for pool") + tabledoc = (moose.element(self.mobj.path)).outputValue + self.gobj.setToolTip(str(tabledoc)) + self.gobj.setPen( + QtGui.QPen(QtCore.Qt.black, 2, Qt.Qt.SolidLine, Qt.Qt.RoundCap, + Qt.Qt.RoundJoin)) + self.gobj.mobj = self.mobj + + def refresh(self, scale): + defaultWidth = TableItem.defaultWidth * scale + defaultHeight = TableItem.defaultHeight * scale + points = [ + QtCore.QPointF(0, defaultWidth / 2), + QtCore.QPointF(defaultHeight / 2 - 2, 0), + QtCore.QPointF(defaultWidth / 2 + 2, 0), + QtCore.QPointF(defaultWidth, defaultHeight / 2) + ] + path = QtGui.QPainterPath() + path.moveTo(points[0]) + for p in points[1:]: + path.lineTo(p) + path.moveTo(p) + path.moveTo(0, 0) + path.lineTo(defaultWidth, 0) + path.moveTo(-(defaultWidth / 3), defaultHeight / 4) + path.lineTo((defaultWidth + 10), defaultHeight / 4) + self.gobj.setPath(path) + TablePen = self.gobj.pen() + tableWidth = TableItem.defaultPenWidth * scale + TablePen.setWidth(tableWidth) + self.gobj.setPen(TablePen) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + """Set the display properties of this item.""" + # TODO: check the table bounding reactangle b'cos selection looks ugly + self.setGeometry(x, y, + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + + +class ReacItem(KineticsDisplayItem): + defaultWidth = 30 + defaultHeight = 30 + defaultPenWidth = 2 + name = constants.ITEM + + def __init__(self, *args, **kwargs): + KineticsDisplayItem.__init__(self, *args, **kwargs) + points = [ + QtCore.QPointF(ReacItem.defaultWidth / 4, 0), + QtCore.QPointF(0, ReacItem.defaultHeight / 4), + QtCore.QPointF(ReacItem.defaultWidth, ReacItem.defaultHeight / 4), + QtCore.QPointF(3 * ReacItem.defaultWidth / 4, + ReacItem.defaultHeight / 2) + ] + path = QtGui.QPainterPath() + path.moveTo(points[0]) + for p in points[1:]: + path.lineTo(p) + path.moveTo(p) + self.gobj = QGraphicsPathItem(path, self) + self.gobj.setPen( + QtGui.QPen(QtCore.Qt.black, 2, Qt.Qt.SolidLine, Qt.Qt.RoundCap, + Qt.Qt.RoundJoin)) + self.gobj.mobj = self.mobj + self._Kf = self.gobj.mobj.Kf + self._Kb = self.gobj.mobj.Kb + doc = "Kf\t: " + str(self._Kf) + "\nKb\t: " + str(self._Kb) + self.gobj.setToolTip(doc) + + def updateValue(self, gobj): + self._gobj = gobj + if (isinstance(self._gobj, moose.ReacBase)): + self._Kf = self._gobj.Kf + self._Kb = self._gobj.Kb + doc = "Kf\t: " + str(self._Kf) + "\nKb\t: " + str(self._Kb) + self.gobj.setToolTip(doc) + + def refresh(self, scale): + defaultWidth = ReacItem.defaultWidth * scale + defaultHeight = ReacItem.defaultHeight * scale + points = [ + QtCore.QPointF(defaultWidth / 4, 0), + QtCore.QPointF(0, defaultHeight / 4), + QtCore.QPointF(defaultWidth, defaultHeight / 4), + QtCore.QPointF(3 * defaultWidth / 4, defaultHeight / 2) + ] + path = QtGui.QPainterPath() + path.moveTo(points[0]) + for p in points[1:]: + path.lineTo(p) + path.moveTo(p) + + self.gobj.setPath(path) + ReacPen = self.gobj.pen() + defaultpenwidth = ReacItem.defaultPenWidth + reacWidth = defaultpenwidth * scale + ReacPen.setWidth(reacWidth) + self.gobj.setPen(ReacPen) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + """Set the display properties of this item.""" + self.setGeometry(x, y, + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + + +class EnzItem(KineticsDisplayItem): + defaultWidth = 20 + defaultHeight = 10 + name = constants.ITEM + + def __init__(self, *args, **kwargs): + KineticsDisplayItem.__init__(self, *args, **kwargs) + self.gobj = QGraphicsEllipseItem(0, 0, EnzItem.defaultWidth, + EnzItem.defaultHeight, self) + self.gobj.mobj = self.mobj + self._Km = self.gobj.mobj.Km + self._Kcat = self.gobj.mobj.kcat + doc = "Km\t: " + str(self._Km) + "\nKcat\t: " + str(self._Kcat) + self.gobj.setToolTip(doc) + + def updateValue(self, gobj): + self._gobj = gobj + if (isinstance(self.gobj, moose.EnzBase)): + self._Km = self._gobj.Km + self._Kcat = self._gobj.kcat + doc = "Km\t: " + str(self._Km) + "\nKcat\t: " + str(self._Kcat) + self.gobj.setToolTip(doc) + + def updateColor(self, bgcolor): + self.gobj.setBrush(QtGui.QBrush(QtGui.QColor(bgcolor))) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + """Set the display properties of this item.""" + self.setGeometry(x, y, + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + self.gobj.setBrush(QtGui.QBrush(bgcolor)) + + def refresh(self, scale): + defaultWidth = EnzItem.defaultWidth * scale + defaultHeight = EnzItem.defaultHeight * scale + self.gobj.setRect(0, 0, defaultWidth, defaultHeight) + + +class MMEnzItem(EnzItem): + name = constants.ITEM + + def __init__(self, *args, **kwargs): + EnzItem.__init__(self, *args, **kwargs) + + +class CplxItem(KineticsDisplayItem): + defaultWidth = 10 + defaultHeight = 10 + name = constants.ITEM + + def __init__(self, *args, **kwargs): + KineticsDisplayItem.__init__(self, *args, **kwargs) + self.gobj = QGraphicsRectItem(0, 0, CplxItem.defaultWidth, + CplxItem.defaultHeight, self) + self.gobj.mobj = self.mobj + self._conc = self.mobj.conc + self._n = self.mobj.n + doc = "Conc\t: " + str(self._conc) + "\nn\t: " + str(self._n) + self.gobj.setToolTip(doc) + + def updateValue(self, gobj): + self._gobj = gobj + if (isinstance(self._gobj, moose.PoolBase)): + self._conc = self.mobj.conc + self._n = self.mobj.n + doc = "Conc\t: " + str(self._conc) + "\nn\t: " + str(self._n) + self.gobj.setToolTip(doc) + + def setDisplayProperties(self, x, y, textcolor, bgcolor): + """Set the display properties of this item.""" + self.setGeometry(self.gobj.boundingRect().width() / 2, + self.gobj.boundingRect().height(), + self.gobj.boundingRect().width(), + self.gobj.boundingRect().height()) + self.setFlag(QGraphicsItem.ItemIsMovable, False) + + def refresh(self, scale): + defaultWidth = CplxItem.defaultWidth * scale + defaultHeight = CplxItem.defaultHeight * scale + + self.gobj.setRect(0, 0, defaultWidth, defaultHeight) + + +class GRPItem(QGraphicsRectItem): + #This is used for displaying Grp Item + name = constants.GROUP + + def __init__(self, parent, x, y, w, h, item): + QGraphicsRectItem.__init__(self, x, y, w, h, parent) + self.mobj = item + self.setFlag(QGraphicsItem.ItemIsMovable, True) + self.setFlag(QGraphicsItem.ItemIsSelectable) + self.setAcceptHoverEvents(True) + self.setToolTip(self.mobj.name) + if config.QT_MINOR_VERSION >= 6: + self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, 1) + + def itemChange(self, change, value): + if change == QGraphicsItem.ItemPositionChange: + self.qgtextItemSelectedChange.emit(self.mobj) + # self.grpEmitter.emit( + # QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"), + # self.mobj) + if change == QGraphicsItem.ItemSelectedChange and value == True: + self.qgtextItemSelectedChange.emit(self.mobj) + # self.grpEmitter.emit( + # QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"), + # self.mobj) + + return QGraphicsItem.itemChange(self, change, value) + + +class ComptItem(QGraphicsRectItem): + name = constants.COMPARTMENT + + def __init__(self, parent, x, y, w, h, item): + self.cmptEmitter = QtCore.QObject() + iParent = item + ''' + self._rect = QtCore.QRectF(x,y,w,h) + self._scene = parent + print "self comptItem",self._scene.sceneContainer ," and",self._scene.sceneContainer.graphicsView + self.mouseOver = False + self.resizeHandleSize = 4.0 + self.mousePressPos = None + self.mouseMovePos = None + self.mouseIsPressed = False + #self.setAcceptsHoverEvents(True) + self.updateResizeHandles() + ''' + if hasattr(iParent, "__iter__"): + self.mobj = iParent[0] + else: + self.mobj = iParent + self.layoutWidgetPt = parent + QGraphicsRectItem.__init__(self, x, y, w, h) + + self.setFlag(QGraphicsItem.ItemIsMovable, True) + self.setFlag(QGraphicsItem.ItemIsSelectable) + #self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, 1) + QT_VERSION = str(QtCore.QT_VERSION_STR).split('.') + QT_MINOR_VERSION = int(QT_VERSION[1]) + if QT_MINOR_VERSION >= 6: + #if config.QT_MINOR_VERSION >= 6: + self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, 1) + self.setAcceptHoverEvents(True) + self.setToolTip(iParent.name) + + ''' + def hoverEnterEvent(self, event): + self.updateResizeHandles() + self.mouseOver = True + self.prepareGeometryChange() + + def hoverLeaveEvent(self, event): + self.mouseOver = False + self.prepareGeometryChange() + + def hoverMoveEvent(self, event): + + if self.topLeft.contains(event.scenePos()) or self.bottomRight.contains(event.scenePos()): + self.setCursor(QtCore.Qt.SizeFDiagCursor) + elif self.topRight.contains(event.scenePos()) or self.bottomLeft.contains(event.scenePos()): + self.setCursor(QtCore.Qt.SizeBDiagCursor) + else: + self.setCursor(QtCore.Qt.SizeAllCursor) + + QGraphicsRectItem.hoverMoveEvent(self, event) + + def mousePressEvent(self, event): + """ + Capture mouse press events and find where the mosue was pressed on the object + """ + self.mousePressPos = event.scenePos() + self.mouseIsPressed = True + self.rectPress = copy.deepcopy(self._rect) + + # Top left corner + if self.topLeft.contains(event.scenePos()): + self.mousePressArea = 'topleft' + # top right corner + elif self.topRight.contains(event.scenePos()): + self.mousePressArea = 'topright' + # bottom left corner + elif self.bottomLeft.contains(event.scenePos()): + self.mousePressArea = 'bottomleft' + # bottom right corner + elif self.bottomRight.contains(event.scenePos()): + self.mousePressArea = 'bottomright' + # entire rectangle + else: + self.mousePressArea = None + + QGraphicsRectItem.mousePressEvent(self, event) + + def mouseReleaseEvent(self, event): + """ + Capture nmouse press events. + """ + self.mouseIsPressed = False + + self.updateResizeHandles() + self.prepareGeometryChange() + + QGraphicsRectItem.mouseReleaseEvent(self, event) + + def mouseMoveEvent(self, event): + """ + Handle mouse move events. + """ + self.mouseMovePos = event.scenePos() + + if self.mouseIsPressed: + # Move top left corner + if self.mousePressArea=='topleft': + self._rect.setTopLeft(self.rectPress.topLeft()-(self.mousePressPos-self.mouseMovePos)) + # Move top right corner + elif self.mousePressArea=='topright': + self._rect.setTopRight(self.rectPress.topRight()-(self.mousePressPos-self.mouseMovePos)) + # Move bottom left corner + elif self.mousePressArea=='bottomleft': + self._rect.setBottomLeft(self.rectPress.bottomLeft()-(self.mousePressPos-self.mouseMovePos)) + # Move bottom right corner + elif self.mousePressArea=='bottomright': + self._rect.setBottomRight(self.rectPress.bottomRight()-(self.mousePressPos-self.mouseMovePos)) + # Move entire rectangle, don't resize + else: + self._rect.moveCenter(self.rectPress.center()-(self.mousePressPos-self.mouseMovePos)) + + self.updateResizeHandles() + self.prepareGeometryChange() + + QGraphicsRectItem.mousePressEvent(self, event) + + def boundingRect(self): + """ + Return bounding rectangle + """ + return self._boundingRect + + def updateResizeHandles(self): + """ + Update bounding rectangle and resize handles + """ + self.offset = self.resizeHandleSize*(self._scene.sceneContainer.graphicsView.mapToScene(1,0)-self._scene.sceneContainer.graphicsView.mapToScene(0,1)).x() + + self._boundingRect = self._rect.adjusted(-self.offset, self.offset, self.offset, -self.offset) + + # Note: this draws correctly on a view with an inverted y axes. i.e. QGraphicsView.scale(1,-1) + self.topLeft = QtCore.QRectF(self._boundingRect.topLeft().x(), self._boundingRect.topLeft().y() - 2*self.offset, + 2*self.offset, 2*self.offset) + self.topRight = QtCore.QRectF(self._boundingRect.topRight().x() - 2*self.offset, self._boundingRect.topRight().y() - 2*self.offset, + 2*self.offset, 2*self.offset) + self.bottomLeft = QtCore.QRectF(self._boundingRect.bottomLeft().x(), self._boundingRect.bottomLeft().y(), + 2*self.offset, 2*self.offset) + self.bottomRight = QtCore.QRectF(self._boundingRect.bottomRight().x() - 2*self.offset, self._boundingRect.bottomRight().y(), + 2*self.offset, 2*self.offset) + + def paint(self, painter, option, widget): + """ + Paint Widget + """ + + # show boundingRect for debug purposes + painter.setPen(QtGui.QPen(QtCore.Qt.red, 0, QtCore.Qt.DashLine)) + painter.drawRect(self._boundingRect) + + # Paint rectangle + painter.setPen(QtGui.QPen(QtCore.Qt.black, 0, QtCore.Qt.SolidLine)) + painter.drawRect(self._rect) + + # If mouse is over, draw handles + if self.mouseOver: + # if rect selected, fill in handles + if self.isSelected(): + painter.setBrush(QtGui.QBrush(QtGui.QColor(0,0,0))) + painter.drawRect(self.topLeft) + painter.drawRect(self.topRight) + painter.drawRect(self.bottomLeft) + painter.drawRect(self.bottomRight) + ''' + + def pointerLayoutpt(self): + return (self.layoutWidgetPt) + + # def mouseDoubleClickEvent(self, event): + # self.cmptEmitter.emit(QtCore.SIGNAL("qgtextDoubleClick(PyQt_PyObject)"),moose.element(self.mooseObj_)) + + def itemChange(self, change, value): + if change == QGraphicsItem.ItemPositionChange: + self.cmptEmitter.emit( + QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"), + self.mobj) + if change == QGraphicsItem.ItemSelectedChange and value == True: + self.qgtextPositionChange.emit(self.mobj) + # self.cmptEmitter.emit( + # QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"), + # self.mobj) + return QGraphicsItem.itemChange(self, change, value) + + +if __name__ == '__main__': + import sys + from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene + app = QApplication(sys.argv) + a = moose.Pool('pool') + b = moose.Reac('reac') + c = moose.Enz('enzyme') + gview = QGraphicsView() + scene = QGraphicsScene(gview) + reacItem = ReacItem(b) + reacItem.setDisplayProperties(50, 5, QtGui.QColor('yellow'), + QtGui.QColor('green')) + enzItem = EnzItem(c) + enzItem.setDisplayProperties(100, 10, QtGui.QColor('blue'), + QtGui.QColor('yellow')) + scene.addItem(reacItem) + scene.addItem(enzItem) + gview.setScene(scene) + gview.show() + sys.exit(app.exec_()) diff --git a/plugins/kkitUtil.py b/moosegui/plugins/kkitUtil.py similarity index 71% rename from plugins/kkitUtil.py rename to moosegui/plugins/kkitUtil.py index 09170c2..8c431e0 100644 --- a/plugins/kkitUtil.py +++ b/moosegui/plugins/kkitUtil.py @@ -1,43 +1,47 @@ +# -*- coding: utf-8 -*- + __author__ = "HarshaRani" -__credits__ = ["Upi Lab"] -__license__ = "GPL3" -__version__ = "1.0.0" +__credits__ = ["Bhalla Lab, NCBS Bangalore"] +__license__ = "GPLv3" __maintainer__ = "HarshaRani" __email__ = "hrani@ncbs.res.in" -__status__ = "Development" -__updated__ = "Oct 11 2018" - -''' -2018 -Oct 11: when collision is handled an update of position is done -Sep 28: spell corrected cyclMesh to cylMesh -Sep 17: when vertical or horizontal layout is applied for group, compartment size is recalculated -Sep 11: group size is calculated based on sceneBoundingRect for compartment size -2017 -Oct 18 some of the function moved to this file from kkitOrdinateUtils -''' -from moose import Annotator,element,ChemCompt -from kkitQGraphics import PoolItem, ReacItem,EnzItem,CplxItem,GRPItem,ComptItem -from PyQt4 import QtCore,QtGui,QtSvg -from PyQt4.QtGui import QColor + import numpy as np import os -import config import pickle import random import matplotlib +from PyQt5 import QtCore, QtGui, QtSvg +from PyQt5.QtGui import QColor + +# MOOSE +from moose import Annotator, element, ChemCompt + +# MOOSE gui +from moosegui.plugins.kkitQGraphics import PoolItem, EnzItem, GRPItem +from moosegui import config + colormap_file = open(os.path.join(config.settings[config.KEY_COLORMAP_DIR], 'rainbow2.pkl'),'rb') colorMap = pickle.load(colormap_file) colormap_file.close() -ignoreColor= ["mistyrose","antiquewhite","aliceblue","azure","bisque","black","blanchedalmond","blue","cornsilk","darkolivegreen","darkslategray","dimgray","floralwhite","gainsboro","ghostwhite","honeydew","ivory","lavender","lavenderblush","lemonchiffon","lightcyan","lightgoldenrodyellow","lightgray","lightyellow","linen","mediumblue","mintcream","navy","oldlace","papayawhip","saddlebrown","seashell","snow","wheat","white","whitesmoke","aquamarine","lightsalmon","moccasin","limegreen","snow","sienna","beige","dimgrey","lightsage"] +ignoreColor= ["mistyrose", "antiquewhite", "aliceblue", "azure", "bisque", + "black", "blanchedalmond", "blue", "cornsilk", "darkolivegreen", + "darkslategray", "dimgray", "floralwhite", "gainsboro", "ghostwhite", + "honeydew", "ivory", "lavender", "lavenderblush", "lemonchiffon", + "lightcyan", "lightgoldenrodyellow", "lightgray", "lightyellow", + "linen", "mediumblue", "mintcream", "navy", "oldlace", "papayawhip", + "saddlebrown", "seashell", "snow", "wheat", "white", "whitesmoke", + "aquamarine", "lightsalmon", "moccasin", "limegreen", "snow", "sienna", + "beige", "dimgrey", "lightsage"] + matplotcolor = {} -for name,hexno in matplotlib.colors.cnames.iteritems(): +for name,hexno in matplotlib.colors.cnames.items(): matplotcolor[name]=hexno def getRandColor(): - k = random.choice(matplotcolor.keys()) + k = random.choice(list(matplotcolor.keys())) if k in ignoreColor: return getRandColor() else: @@ -70,12 +74,11 @@ def getColor(iteminfo): return(textcolor,bgcolor) def colorCheck(fc_bgcolor,fcbg): - """ textColor or background can be anything like string or tuple or list \ - if string its taken as colorname further down in validColorcheck checked for valid color, \ - but for tuple and list its taken as r,g,b value. + """ + textColor or background can be anything like string or tuple or list \ + if string its taken as colorname further down in validColorcheck checked for valid color, \ + but for tuple and list its taken as r,g,b value. """ - #import re - #fc_bgcolor = re.sub('[^a-zA-Z0-9-_*.]', '', fc_bgcolor) if isinstance(fc_bgcolor,str): if fc_bgcolor.startswith("#"): fc_bgcolor = QColor(fc_bgcolor) @@ -97,11 +100,6 @@ def colorCheck(fc_bgcolor,fcbg): return(fc_bgcolor) def validColorcheck(color): - ''' - Both in Qt4.7 and 4.8 if not a valid color it makes it as back but in 4.7 there will be a warning mssg which is taken here - checking if textcolor or backgroundcolor is valid color, if 'No' making white color as default - where I have not taken care for checking what will be backgroundcolor for textcolor or textcolor for backgroundcolor - ''' if QColor(color).isValid(): return (QColor(color)) else: @@ -118,10 +116,7 @@ def moveMin(reference, collider, layoutPt,margin): else: yDistance = referenceRect.y() + referenceRect.height() / 2.0 + colliderRect.height() / 2.0 + margin - colliderRect.y() - #if xDistance > yDistance: collider.moveBy(xDistance, yDistance) - #else: - # collider.moveBy(xDistance, 0.0) layoutPt.drawLine_arrow(itemignoreZooming=False) def moveX(reference, collider, layoutPt, margin): @@ -136,22 +131,20 @@ def handleCollisions(compartments, moveCallback, layoutPt,margin = 5.0): if len(compartments) is 0 : return compartments = sorted(compartments, key = lambda c: c.sceneBoundingRect().center().x()) reference = compartments.pop(0); - print (reference.name) referenceRect = reference.sceneBoundingRect() - colliders = filter( lambda compartment : referenceRect.intersects(compartment.sceneBoundingRect()) - , compartments - ) + colliders = [compartment for compartment in compartments + if referenceRect.intersects(compartment.sceneBoundingRect()) + ] for collider in colliders: moveCallback(reference, collider, layoutPt,margin) - #print (reference.mobj).parent + if isinstance(element(((reference.mobj).parent)),ChemCompt): v = layoutPt.qGraCompt[element(((reference.mobj).parent))] - #layoutPt.updateCompartmentSize(x) rectcompt = calculateChildBoundingRect(v) comptBoundingRect = v.boundingRect() if not comptBoundingRect.contains(rectcompt): layoutPt.updateCompartmentSize(v) - + else: rectcompt = calculateChildBoundingRect(v) v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) @@ -181,17 +174,14 @@ def calculateChildBoundingRect(compt): xpos.append(l.sceneBoundingRect().bottomRight().x()) ypos.append(l.sceneBoundingRect().y()) ypos.append(l.sceneBoundingRect().bottomRight().y()) - ''' - xpos.append(l.rect().x()) - xpos.append(l.boundingRect().bottomRight().x()) - ypos.append(l.rect().y()) - ypos.append(l.boundingRect().bottomRight().y()) - ''' if (isinstance(l,PoolItem) or isinstance(l,EnzItem)): ''' For Enz cplx height and for pool function height needs to be taken''' for ll in l.childItems(): - ''' eleminating polygonItem (arrow) [This is happen in cross-compartment model that arrow from one compartment will be child] - pool's outboundary RectItem and Enz's outerboundary Ellipse is eleminating since its same + ''' eleminating polygonItem (arrow) [This is happen in + cross-compartment model that arrow from one compartment will be + child] + pool's outboundary RectItem and Enz's outerboundary Ellipse + is eleminating since its samee ''' if ( (not isinstance(ll,QtGui.QGraphicsPolygonItem)) and (not isinstance(ll,QtGui.QGraphicsRectItem)) and @@ -221,4 +211,4 @@ def findGroup(melement): def findGroup_compt(melement): while not (mooseIsInstance(melement, ["Neutral","CubeMesh", "CylMesh"])): melement = melement.parent - return melement \ No newline at end of file + return melement diff --git a/plugins/kkitViewcontrol.py b/moosegui/plugins/kkitViewcontrol.py similarity index 55% rename from plugins/kkitViewcontrol.py rename to moosegui/plugins/kkitViewcontrol.py index 1f80fca..7a79f68 100644 --- a/plugins/kkitViewcontrol.py +++ b/moosegui/plugins/kkitViewcontrol.py @@ -1,68 +1,61 @@ +# -*- coding: utf-8 -*- + __author__ = "HarshaRani" __credits__ = ["Upi Lab"] __license__ = "GPL3" -__version__ = "1.0.0" __maintainer__ = "HarshaRani" __email__ = "hrani@ncbs.res.in" -__status__ = "Development" -__updated__ = "Oct 27 2018" - -''' -2018 -Oct 27 : When group is moved within another group, outer group is resize inturn compartmet is also resized -Oct 10 : Groups are handled with collision detection, - messagebox when object moved from one group to another - layout updated when object moved etc -Sep 18 : one can close the messagebox if doesn't want to plot -Sep 07 : when object qgraphicalparent is changed then connecting arrow's parent also need to be changed -Jun 08 : If object is moved from one group or compartment to another group or with in same Compartment, - then both at moose level (group or compartment path is updated ) and qt level the setParentItem is set - -If object is moved to Empty place or not allowed place in the GUI its moved back to origin position - -also some clean up when object is just clicked in QsvgItem and v/s clicked and some action done - -with Rubber selection if object are moved then group size is updated -2017 -Oct 03 : At mousePressEvent, a clean way of checking on what object mouse press Event happened is checked. - This is after group is added where Group Interior and Boundary is checked, with in groupInterior if click in - on COMPARTMENT BOUNDARY is clicked then COMPARTMENT_BOUNDARY is return, else top most group object is returned. -Sep 20 : Group related function added - -resolveGroupInteriorAndBoundary, findGraphic_groupcompt, graphicsIsInstance - -@resolveItem,editorMousePressEvent,editorMouseMoveEvent,editorMouseReleaseEvent checks made for group - -''' -import sys -from modelBuild import * -from constants import * -from PyQt4.QtGui import QPixmap, QImage, QPen, QGraphicsPixmapItem, QGraphicsLineItem -from PyQt4.QtCore import pyqtSignal -from kkitUtil import * -#from setsolver import * -from PyQt4 import QtSvg -from moose import utils -from functools import partial +import os +from functools import partial -class GraphicalView(QtGui.QGraphicsView): - - def __init__(self, modelRoot,parent,border,layoutPt,createdItem): - QtGui.QGraphicsView.__init__(self,parent) - +from PyQt5 import QtSvg, Qt, QtGui, QtCore +from PyQt5.QtWidgets import QGraphicsLineItem, QApplication +from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView +from PyQt5.QtWidgets import QMenu, QMessageBox, QGraphicsPolygonItem +from PyQt5.QtWidgets import QGraphicsItem, QPushButton, QRubberBand + +# MOOSE +import moose + +# moosegui +from moosegui.plugins import kkitUtil +from moosegui.plugins import modelBuild +from moosegui.plugins import constants +from moosegui.plugins import kkitQGraphics +from moosegui.plugins import kkitOrdinateUtil + +# logger +from moosegui import config +import logging +logger_ = logging.getLogger("moosegui.kkit.viewcontrol") + +SDIR_ = os.path.dirname(__file__) + +class GraphicalView(QGraphicsView): + # NOTE: why this is not inside __init__? See + # https://stackoverflow.com/a/2971426/1805129 and cry! + dropped = QtCore.pyqtSignal('PyQt_PyObject') + + def __init__(self, modelRoot, parent, border, layoutPt, createdItem): + QGraphicsView.__init__(self, parent) + logging.debug( "Creating GraphicalView " ) self.state = None - self.move = False + self.move = False self.resetState() - self.connectionSign = None - self.connectionSource = None - self.expectedConnection = None - self.selections = [] - self.connector = None - self.connectionSignImagePath = "../gui/icons/connection.png" - self.connectionSignImage = QImage(self.connectionSignImagePath) - - # self.expectedConnectionPen = QPen() + self.connectionSign = None + self.connectionSource = None + self.expectedConnection = None + self.selections = [] + self.connector = None + self.connectionSignImagePath = os.path.join(SDIR_, "../icons/connection.png") + assert os.path.exists( self.connectionSignImagePath ) + self.connectionSignImage = QtGui.QImage(self.connectionSignImagePath) self.setScene(parent) self.modelRoot = modelRoot self.sceneContainerPt = parent - self.sceneContainerPt.setItemIndexMethod(QtGui.QGraphicsScene.NoIndex) - self.setDragMode(QtGui.QGraphicsView.RubberBandDrag) + self.sceneContainerPt.setItemIndexMethod(QGraphicsScene.NoIndex) + self.setDragMode(QGraphicsView.RubberBandDrag) self.itemSelected = False self.customrubberBand = None self.rubberbandWidth = 0 @@ -75,47 +68,57 @@ def __init__(self, modelRoot,parent,border,layoutPt,createdItem): self.layoutPt = layoutPt # All the object which are stacked on the scene are listed self.stackOrder = self.sceneContainerPt.items(Qt.Qt.DescendingOrder) - #From stackOrder selecting only compartment - self.cmptStackorder = [i for i in self.stackOrder if isinstance(i,ComptItem)] + # From stackOrder selecting only compartment + self.cmptStackorder = [ + i for i in self.stackOrder if isinstance(i, kkitQGraphics.ComptItem)] self.viewBaseType = " " self.iconScale = 1 self.arrowsize = 2 self.defaultComptsize = 5 - self.connectorlist = {"plot": None ,"clone": None,"move": None,"delete": None} - self.setHorizontalScrollBarPolicy(PyQt4.QtCore.Qt.ScrollBarAlwaysOn) - self.setVerticalScrollBarPolicy(PyQt4.QtCore.Qt.ScrollBarAlwaysOn) - - def setRefWidget(self,path): + self.connectorlist = { + "plot": None, + "clone": None, + "move": None, + "delete": None} + self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) + self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) + + def setRefWidget(self, path): self.viewBaseType = path - - def resizeEvent(self, event): - #print event.size().width(),event.size().height() - self.fitInView(self.sceneContainerPt.itemsBoundingRect().x()-10,self.sceneContainerPt.itemsBoundingRect().y()-10,self.sceneContainerPt.itemsBoundingRect().width()+20,self.sceneContainerPt.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio) - #print("Called =>", event) + def resizeEvent(self, event): + self.fitInView( + self.sceneContainerPt.itemsBoundingRect().x() - 10, + self.sceneContainerPt.itemsBoundingRect().y() - 10, + self.sceneContainerPt.itemsBoundingRect().width() + 20, + self.sceneContainerPt.itemsBoundingRect().height() + 20, + Qt.Qt.IgnoreAspectRatio) return - + def resolveCompartmentInteriorAndBoundary(self, item, position): - bound = item.rect().adjusted(3,3,-3,-3) - return COMPARTMENT_INTERIOR if bound.contains(item.mapFromScene(position)) else COMPARTMENT_BOUNDARY + bound = item.rect().adjusted(3, 3, -3, -3) + return constants.COMPARTMENT_INTERIOR if bound.contains( + item.mapFromScene(position)) else constants.COMPARTMENT_BOUNDARY def resolveGroupInteriorAndBoundary(self, item, position): bound = item.rect().adjusted(3,3,-3,-3) - return GROUP_INTERIOR if bound.contains(item.mapFromScene(position)) else GROUP_BOUNDARY + return constants.GROUP_INTERIOR \ + if bound.contains(item.mapFromScene(position)) \ + else constants.GROUP_BOUNDARY def resetState(self): - self.state = { "press" : { "mode" : INVALID - , "item" : None - , "sign" : None - , "pos" : None - , "scenepos" : None - } - , "move" : { "happened": False - } - , "release" : { "mode" : INVALID - , "item" : None - , "sign" : None - } + self.state = { + "press" : { + "mode": constants.INVALID + , "item" : None + , "sign" : None + , "pos" : None + , "scenepos" : None } + , "move" : { "happened": False } + , "release" : { "mode" : constants.INVALID + , "item" : None + , "sign" : None + } } @@ -127,36 +130,35 @@ def resolveItem(self, items, position): comptInteriorfound = False comptBoundary = [] - # If clicked , moved and dropped then drop object should not take polygonItem it shd take Goup or compartment - #(this is checked is self.state["move"]), else qpolygonItem then deleting the connection b/w 2 objects - #move is True the + # If clicked , moved and dropped then drop object should not take + # polygonItem it shd take Goup or compartment + # (this is checked is self.state["move"]), else qpolygonItem then + # deleting the connection b/w 2 objects move is True. for item in items: if isinstance(item, QtSvg.QGraphicsSvgItem): - return (item, CONNECTOR) + return (item, constants.CONNECTOR) if not self.state["move"]["happened"]: for item in items: - if isinstance(item, QtGui.QGraphicsPolygonItem): - return (item, CONNECTION) + if isinstance(item, QGraphicsPolygonItem): + return (item, constants.CONNECTION) for item in items: - if hasattr(item, "name"): - if item.name == ITEM: - return (item, ITEM) - if item.name == GROUP: - gsolution = (item, self.resolveGroupInteriorAndBoundary(item, position)) - if gsolution[1] == GROUP_BOUNDARY: - return gsolution - elif gsolution[1] == GROUP_INTERIOR: - groupInteriorfound = True - groupList.append(gsolution) - if item.name == COMPARTMENT: - csolution = (item, self.resolveCompartmentInteriorAndBoundary(item, position)) - if csolution[1] == COMPARTMENT_BOUNDARY: - return csolution - # elif csolution[1] == COMPARTMENT_INTERIOR: - # comptInteriorfound = True - # comptBoundary.append(csolution) + if not hasattr(item, "name"): + continue + if item.name == constants.ITEM: + return item, constants.ITEM + if item.name == constants.GROUP: + gsolution = (item, self.resolveGroupInteriorAndBoundary(item, position)) + if gsolution[1] == constants.GROUP_BOUNDARY: + return gsolution + elif gsolution[1] == constants.GROUP_INTERIOR: + groupInteriorfound = True + groupList.append(gsolution) + if item.name == constants.COMPARTMENT: + csolution = (item, self.resolveCompartmentInteriorAndBoundary(item, position)) + if csolution[1] == constants.COMPARTMENT_BOUNDARY: + return csolution if groupInteriorfound: if comptInteriorfound: @@ -165,7 +167,7 @@ def resolveItem(self, items, position): return groupList[0] else: if csolution is None: - return (None, EMPTY) + return (None, constants.EMPTY) return csolution def findGraphic_groupcompt(self,gelement): @@ -174,70 +176,76 @@ def findGraphic_groupcompt(self,gelement): return gelement def graphicsIsInstance(self, gelement, classNames): + assert '.' not in gelement.__class__.__name__ return gelement.__class__.__name__ in classNames def editorMousePressEvent(self, event): self.clickPosition = self.mapToScene(event.pos()) (item, itemType) = self.resolveItem(self.items(event.pos()), self.clickPosition) if event.buttons() == QtCore.Qt.LeftButton: - self.state["press"]["mode"] = VALID + self.state["press"]["mode"] = constants.VALID self.state["press"]["item"] = item self.state["press"]["type"] = itemType self.state["press"]["pos"] = event.pos() if isinstance(item, QtSvg.QGraphicsSvgItem): - ##This is kept for reference, so that if object (P,R,E,Tab,Fun) is moved outside the compartment, - #then it need to be pull back to original position + # This is kept for reference, so that if object (P,R,E,Tab,Fun) + # is moved outside the compartment, then it need to be pull back + # to original position self.state["press"]["scenepos"] = item.parent().scenePos() - if itemType == COMPARTMENT_INTERIOR or itemType == GROUP_BOUNDARY or itemType == GROUP_INTERIOR: + if itemType == constants.COMPARTMENT_INTERIOR \ + or itemType == constants.GROUP_BOUNDARY \ + or itemType == constants.GROUP_INTERIOR: self.removeConnector() - - elif itemType == ITEM: + + elif itemType == constants.ITEM: if not self.move: self.showConnector(self.state["press"]["item"]) else: - #If right button clicked self.resetState() - # if itemType == GROUP_INTERIOR: - # print " self.layoutPt.qGraGrp ",item, item.childItems() - # grouplist = [] - # for i in item.childItems(): - # if isinstance(i,KineticsDisplayItem): - # grouplist.append(i) - # popupmenu = QtGui.QMenu('PopupMenu', self) - # popupmenu.addAction("LinearLayout", lambda : handleCollisions(list(grouplist), moveX, self.layoutPt)) - # popupmenu.addAction("VerticalLayout" ,lambda : handleCollisions(list(grouplist), moveMin, self.layoutPt )) - # popupmenu.exec_(self.mapToGlobal(event.pos())) - # self.layoutPt.updateGrpSize(item) - - if itemType == GROUP_BOUNDARY: - popupmenu = QtGui.QMenu('PopupMenu', self) + if itemType == constants.GROUP_BOUNDARY: + popupmenu = QMenu('PopupMenu', self) popupmenu.addAction("DeleteGroup", lambda : self.deleteGroup(item,self.layoutPt)) - popupmenu.addAction("LinearLayout", lambda : handleCollisions(list(self.layoutPt.qGraGrp.values()), moveX, self.layoutPt)) - popupmenu.addAction("VerticalLayout" ,lambda : handleCollisions(list(self.layoutPt.qGraGrp.values()), moveMin, self.layoutPt )) - - #popupmenu.addAction("CloneGroup" ,lambda : handleCollisions(comptList, moveMin, self.layoutPt )) + popupmenu.addAction("LinearLayout" + , lambda: kkitUtil.handleCollisions( + list(self.layoutPt.qGraGrp.values() ), kkitUtil.moveX, self.layoutPt) + ) + popupmenu.addAction("VerticalLayout" + , lambda : kkitUtil.handleCollisions( + list(self.layoutPt.qGraGrp.values()), kkitUtil.moveMin, self.layoutPt + ) + ) popupmenu.exec_(self.mapToGlobal(event.pos())) - - elif itemType == COMPARTMENT_BOUNDARY: + + elif itemType == constants.COMPARTMENT_BOUNDARY: if len(list(self.layoutPt.qGraCompt.values())) > 1: - popupmenu = QtGui.QMenu('PopupMenu', self) - #popupmenu.addAction("DeleteCmpt", lambda : self.deleteCmpt(item,self.layoutPt)) - popupmenu.addAction("LinearLayout", lambda : handleCollisions(list(self.layoutPt.qGraCompt.values()), moveX, self.layoutPt)) - popupmenu.addAction("VerticalLayout" ,lambda : handleCollisions(list(self.layoutPt.qGraCompt.values()), moveMin, self.layoutPt )) + popupmenu = QMenu('PopupMenu', self) + popupmenu.addAction("LinearLayout" + , lambda : kkitUtil.handleCollisions( + list(self.layoutPt.qGraCompt.values()), kkitUtil.moveX, self.layoutPt + ) + ) + popupmenu.addAction("VerticalLayout" + , lambda : kkitUtil.handleCollisions( + list(self.layoutPt.qGraCompt.values()), kkitUtil.moveMin, self.layoutPt + ) + ) popupmenu.exec_(self.mapToGlobal(event.pos())) - def editorMouseMoveEvent(self,event): - if self.state["press"]["mode"] == INVALID: + logger_.debug( "editorMouseMoveEvent %s" % str(event)) + if self.state["press"]["mode"] == constants.INVALID: self.state["move"]["happened"] = False return if self.move: - #This part of the code is when rubberband selection is done and move option is selected + # This part of the code is when rubberband selection is done and + # move option is selected initial = self.mapToScene(self.state["press"]["pos"]) final = self.mapToScene(event.pos()) displacement = final - initial for item in self.selectedItems: - if isinstance(item, KineticsDisplayItem) and not isinstance(item,ComptItem) and not isinstance(item,CplxItem): + if isinstance(item, kkitQGraphics.KineticsDisplayItem) \ + and not isinstance(item, kkitQGraphics.ComptItem) \ + and not isinstance(item, kkitQGraphics.CplxItem): item.moveBy(displacement.x(), displacement.y()) self.layoutPt.positionChange(item.mobj.path) self.state["press"]["pos"] = event.pos() @@ -246,19 +254,20 @@ def editorMouseMoveEvent(self,event): self.state["move"]["happened"] = True itemType = self.state["press"]["type"] item = self.state["press"]["item"] - if itemType == CONNECTOR: + if itemType == constants.CONNECTOR: actionType = str(item.data(0).toString()) if actionType == "move": - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) + QApplication.setOverrideCursor( + QtGui.QCursor(QtCore.Qt.CrossCursor)) initial = self.mapToScene(self.state["press"]["pos"]) final = self.mapToScene(event.pos()) displacement = final-initial self.removeConnector() item.parent().moveBy(displacement.x(), displacement.y()) - #self.layoutPt.updateArrow(item.parent()) - if isinstance(item.parent(),PoolItem): + # self.layoutPt.updateArrow(item.parent()) + if isinstance(item.parent(), kkitQGraphics.PoolItem): for funcItem in item.parent().childItems(): - if isinstance(funcItem,FuncItem): + if isinstance(funcItem, kkitQGraphics.FuncItem): self.layoutPt.updateArrow(funcItem) self.state["press"]["pos"] = event.pos() self.layoutPt.positionChange(item.parent().mobj) @@ -271,92 +280,97 @@ def editorMouseMoveEvent(self,event): pen = QtGui.QPen(QtGui.QBrush(QtGui.QColor("black")), 1) pen.setWidthF(1.5) painter.setPen(pen) - painter.drawLine(12,7,12,17) - painter.drawLine(7,12,17,12) + painter.drawLine(12, 7, 12, 17) + painter.drawLine(7, 12, 17, 12) painter.end() - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(pixmap)) + QApplication.setOverrideCursor(QtGui.QCursor(pixmap)) - if itemType == ITEM: + if itemType == constants.ITEM: self.drawExpectedConnection(event) - if itemType == COMPARTMENT_BOUNDARY or itemType == GROUP_BOUNDARY: + if itemType == constants.COMPARTMENT_BOUNDARY or itemType == constants.GROUP_BOUNDARY: '''When Comparement or group is moved from boundary''' initial = self.mapToScene(self.state["press"]["pos"]) final = self.mapToScene(event.pos()) displacement = final - initial item.moveBy(displacement.x(), displacement.y()) - if isinstance(item.parentItem(),GRPItem): + if isinstance(item.parentItem(), kkitQGraphics.GRPItem): self.layoutPt.updateGrpSize(item.parentItem()) self.layoutPt.positionChange(item.mobj.path) self.state["press"]["pos"] = event.pos() - if itemType == COMPARTMENT_INTERIOR or itemType == GROUP_INTERIOR: + if itemType == constants.COMPARTMENT_INTERIOR or itemType == constants.GROUP_INTERIOR: if self.customrubberBand == None: - self.customrubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle,self) + self.customrubberBand = QRubberBand(QRubberBand.Rectangle,self) self.customrubberBand.show() startingPosition = self.state["press"]["pos"] endingPosition = event.pos() - displacement = endingPosition - startingPosition + displacement = endingPosition - startingPosition - x0 = startingPosition.x() + x0 = startingPosition.x() x1 = endingPosition.x() - y0 = startingPosition.y() - y1 = endingPosition.y() - - if displacement.x() < 0 : - x0,x1= x1,x0 + y0 = startingPosition.y() - if displacement.y() < 0 : - y0,y1= y1,y0 + if displacement.x() < 0: + x0, x1 = x1, x0 - self.customrubberBand.setGeometry(QtCore.QRect(QtCore.QPoint(x0, y0), QtCore.QSize(abs(displacement.x()), abs(displacement.y())))) + self.customrubberBand.setGeometry( + QtCore.QRect( + QtCore.QPoint(x0, y0) + , QtCore.QSize(abs(displacement.x()), abs(displacement.y())) + ) + ) def editorMouseReleaseEvent(self,event): if self.move: self.move = False self.setCursor(Qt.Qt.ArrowCursor) - if self.state["press"]["mode"] == INVALID: - self.state["release"]["mode"] = INVALID + if self.state["press"]["mode"] == constants.INVALID: + self.state["release"]["mode"] = constants.INVALID self.resetState() return - self.clickPosition = self.mapToScene(event.pos()) - (item, itemType) = self.resolveItem(self.items(event.pos()), self.clickPosition) - self.state["release"]["mode"] = VALID + self.clickPosition = self.mapToScene(event.pos()) + (item, itemType) = self.resolveItem( + self.items(event.pos()), self.clickPosition) + self.state["release"]["mode"] = constants.VALID self.state["release"]["item"] = item self.state["release"]["type"] = itemType clickedItemType = self.state["press"]["type"] - if clickedItemType == ITEM: + if clickedItemType == constants.ITEM: if not self.state["move"]["happened"]: if not self.move: self.showConnector(self.state["press"]["item"]) - self.layoutPt.plugin.mainWindow.objectEditSlot(self.state["press"]["item"].mobj, True) + self.layoutPt.plugin.mainWindow.objectEditSlot( + self.state["press"]["item"].mobj, True) # compartment's rectangle size is calculated depending on children - #self.layoutPt.comptChilrenBoundingRect() + # self.layoutPt.comptChilrenBoundingRect() l = self.modelRoot if self.modelRoot.find('/',1) > 0: l = self.modelRoot[0:self.modelRoot.find('/',1)] linfo = moose.Annotator(l+'/info') for k,v in self.layoutPt.qGraGrp.items(): - rectgrp = calculateChildBoundingRect(v) + rectgrp = kkitUtil.calculateChildBoundingRect(v) v.setRect(rectgrp.x()-10,rectgrp.y()-10,(rectgrp.width()+20),(rectgrp.height()+20)) for k, v in self.layoutPt.qGraCompt.items(): rectcompt = v.childrenBoundingRect() if linfo.modeltype == "new_kkit": - #if newly built model then compartment is size is fixed for some size. + # if newly built model then compartment is size is + # fixed for some size. comptBoundingRect = v.boundingRect() if not comptBoundingRect.contains(rectcompt): self.layoutPt.updateCompartmentSize(v) else: - #if already built model then compartment size depends on max and min objects - rectcompt = calculateChildBoundingRect(v) + # if already built model then compartment size depends + # on max and min objects + rectcompt = kkitUtil.calculateChildBoundingRect(v) v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) else: #When group is moved then compartment need to be update which is done here - if isinstance(self.state["release"]["item"], KineticsDisplayItem): + if isinstance(self.state["release"]["item"], kkitQGraphics.KineticsDisplayItem): if not moose.element(self.state["press"]["item"].mobj) == moose.element(self.state["release"]["item"].mobj): self.populate_srcdes( self.state["press"]["item"].mobj , self.state["release"]["item"].mobj @@ -366,7 +380,7 @@ def editorMouseReleaseEvent(self,event): self.removeExpectedConnection() self.removeConnector() self.move = False - elif clickedItemType == CONNECTOR: + elif clickedItemType == constants.CONNECTOR: actionType = str(self.state["press"]["item"].data(0).toString()) pressItem = self.state["press"]["item"] initscenepos = self.state["press"]["scenepos"] @@ -376,7 +390,7 @@ def editorMouseReleaseEvent(self,event): movedGraphObj = self.state["press"]["item"].parent() if actionType == "move": - if itemType == EMPTY: + if itemType == constants.EMPTY: self.objectpullback("Empty",item,movedGraphObj,xx,yy) else: @@ -384,22 +398,22 @@ def editorMouseReleaseEvent(self,event): if movedGraphObj.parentItem() != grpCmpt: '''Not same compartment/group to which it belonged to ''' - if isinstance(movedGraphObj,FuncItem): + if isinstance(movedGraphObj, kkitQGraphics.FuncItem): funcPool = moose.element((movedGraphObj.mobj.neighbors['valueOut'])[0]) parentGrapItem = self.layoutPt.mooseId_GObj[moose.element(funcPool)] if parentGrapItem.parentItem() != grpCmpt: self.objectpullback("Functionparent",grpCmpt,movedGraphObj,xx,yy) - if isinstance(movedGraphObj,(EnzItem,MMEnzItem)): + if isinstance(movedGraphObj, (kkitQGraphics.EnzItem, moose.MMEnzItem)): parentPool = moose.element((movedGraphObj.mobj.neighbors['enzDest'])[0]) - if isinstance(parentPool,PoolBase): + if isinstance(parentPool, moose.PoolBase): if moose.exists(grpCmpt.mobj.path+'/'+parentPool.name): if moose.exists(grpCmpt.mobj.path+'/'+parentPool.name+'/'+movedGraphObj.name): self.objectpullback("Enzyme",grpCmpt,movedGraphObj,xx,yy) else: - reply = QtGui.QMessageBox.question(self, "Moving the Object",'Do want to move \'{movedGraphObj}\' \n from \'{parent}\' to \'{grpCmpt}\''.format(movedGraphObj=movedGraphObj.mobj.name,parent= movedGraphObj.parentItem().mobj.name,grpCmpt=grpCmpt.mobj.name), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.No: + reply = QMessageBox.question(self, "Moving the Object",'Do want to move \'{movedGraphObj}\' \n from \'{parent}\' to \'{grpCmpt}\''.format(movedGraphObj=movedGraphObj.mobj.name,parent= movedGraphObj.parentItem().mobj.name,grpCmpt=grpCmpt.mobj.name), + QMessageBox.Yes | QMessageBox.No) + if reply == QMessageBox.No: movedGraphObj.moveBy(-xx,-yy) self.layoutPt.updateArrow(movedGraphObj) @@ -412,37 +426,36 @@ def editorMouseReleaseEvent(self,event): if moose.exists(grpCmpt.mobj.path+'/'+movedGraphObj.mobj.name): self.objectpullback("All",grpCmpt,movedGraphObj,xx,yy) else: - reply = QtGui.QMessageBox.question(self, "Moving the Object",'Do want to move \'{movedGraphObj}\' \n from \'{parent}\' to \'{grpCmpt}\''.format(movedGraphObj=movedGraphObj.mobj.name,parent= movedGraphObj.parentItem().mobj.name,grpCmpt=grpCmpt.mobj.name), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.No: + reply = QMessageBox.question(self, "Moving the Object",'Do want to move \'{movedGraphObj}\' \n from \'{parent}\' to \'{grpCmpt}\''.format(movedGraphObj=movedGraphObj.mobj.name,parent= movedGraphObj.parentItem().mobj.name,grpCmpt=grpCmpt.mobj.name), + QMessageBox.Yes | QMessageBox.No) + if reply == QMessageBox.No: movedGraphObj.moveBy(-xx,-yy) self.layoutPt.updateArrow(movedGraphObj) else: self.moveObjSceneParent(grpCmpt,movedGraphObj,item.pos(),self.mapToScene(event.pos())) else: '''Same compt/grp to which it was belong to ''' - if isinstance(movedGraphObj,KineticsDisplayItem): + if isinstance(movedGraphObj, kkitQGraphics.KineticsDisplayItem): itemPath = movedGraphObj.mobj.path if moose.exists(itemPath): iInfo = itemPath+'/info' anno = moose.Annotator(iInfo) eventpos = self.mapToScene(event.pos()) - itempos = item.pos() - x = eventpos.x()+(15/2)#-itempos.x() - y = eventpos.y()+(2/2)#-itempos.y() + x = eventpos.x()+(15/2) + y = eventpos.y()+(2/2) anno.x = x anno.y = y self.layoutPt.updateArrow(itemPath) - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) + QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) self.layoutPt.updateGrpSize(movedGraphObj.parentItem()) self.layoutPt.positionChange(movedGraphObj.mobj) self.updateScale(self.iconScale) - if isinstance(grpCmpt,GRPItem): + if isinstance(grpCmpt, kkitQGraphics.GRPItem): self.layoutPt.updateGrpSize(movedGraphObj.parentItem()) - elif isinstance(grpCmpt,ComptItem): + elif isinstance(grpCmpt, kkitQGraphics.ComptItem): self.layoutPt.updateCompartmentSize(movedGraphObj.parentItem()) - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) + QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) if actionType == "delete": self.removeConnector() @@ -454,125 +467,138 @@ def editorMouseReleaseEvent(self,event): pen = QtGui.QPen(QtGui.QBrush(QtGui.QColor("black")), 1) pen.setWidthF(1.5) painter.setPen(pen) - painter.drawLine(8,8,16,16) - painter.drawLine(8,16,16,8) + painter.drawLine(8, 8, 16, 16) + painter.drawLine(8, 16, 16, 8) painter.end() - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(pixmap)) - reply = QtGui.QMessageBox.question(self, "Deleting Object","Do want to delete object and its connections", - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: - #delete solver first as topology is changing - mooseDeleteChemSolver(self.layoutPt.modelRoot) + QApplication.setOverrideCursor(QtGui.QCursor(pixmap)) + reply = QMessageBox.question( + self, + "Deleting Object", + "Do want to delete object and its connections", + QMessageBox.Yes | QMessageBox.No) + if reply == QMessageBox.Yes: + # delete solver first as topology is changing + moose.mooseDeleteChemSolver(self.layoutPt.modelRoot) self.deleteObj([item.parent()]) - QtGui.QApplication.restoreOverrideCursor() + QApplication.restoreOverrideCursor() else: - QtGui.QApplication.restoreOverrideCursor() + QApplication.restoreOverrideCursor() elif actionType == "plot": element = moose.element(item.parent().mobj.path) if isinstance (element,moose.PoolBase): - msgBox = QtGui.QMessageBox() + msgBox = QMessageBox() msgBox.setText('What to plot?') - self.pushButtonNumber = QtGui.QPushButton(('Number'))#, QtGui.QMessageBox.YesRole) - self.pushButtonConc = QtGui.QPushButton('Concentration')#, QtGui.QMessageBox.NoRole + self.pushButtonNumber = QPushButton(('Number')) + self.pushButtonConc = QPushButton('Concentration') self.pushButtonConc.setAutoDefault(False) self.pushButtonNumber.setAutoDefault(False) - msgBox.addButton(self.pushButtonNumber,QtGui.QMessageBox.YesRole) - msgBox.addButton(self.pushButtonConc,QtGui.QMessageBox.NoRole) + msgBox.addButton(self.pushButtonNumber,QMessageBox.YesRole) + msgBox.addButton(self.pushButtonConc,QMessageBox.NoRole) msgBox.buttonClicked.connect(partial(self.onClicked, str(self.modelRoot),element)) msgBox.exec_() self.removeConnector() elif actionType == "clone": if self.state["move"]["happened"]: - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) + QApplication.setOverrideCursor( + QtGui.QCursor(Qt.Qt.ArrowCursor)) self.state["press"]["item"].parent().mobj cloneObj = self.state["press"]["item"] posWrtComp = self.mapToScene(event.pos()) - itemAtView = self.sceneContainerPt.itemAt(self.mapToScene(event.pos())) + itemAtView = self.sceneContainerPt.itemAt( + self.mapToScene(event.pos())) self.removeConnector() - if isinstance(itemAtView,ComptItem) or isinstance(itemAtView, GRPItem): - #Solver should be deleted - ## if there is change in 'Topology' of the model - ## or if copy has to made then oject should be in unZombify mode - mooseDeleteChemSolver(self.layoutPt.modelRoot) - #As name is suggesting, if item is Compartment, then search in qGraCompt and if group then qGraGrp - if isinstance(itemAtView,ComptItem): - lKey = [key for key, value in self.layoutPt.qGraCompt.iteritems() if value == itemAtView][0] - if isinstance (itemAtView, GRPItem): - lKey = [key for key, value in self.layoutPt.qGraGrp.iteritems() if value == itemAtView][0] + if isinstance(itemAtView, kkitQGraphics.ComptItem) \ + or isinstance(itemAtView, kkitQGraphics.GRPItem): + moose.mooseDeleteChemSolver(self.layoutPt.modelRoot) + + # As name is suggesting, if item is Compartment, then + # search in qGraCompt and if group then qGraGrp + if isinstance(itemAtView, kkitQGraphics.ComptItem): + lKey = [key for key, value in self.layoutPt.qGraCompt.iteritems() + if value == itemAtView][0] + if isinstance (itemAtView, kkitQGraphics.GRPItem): + lKey = [key for key, value in self.layoutPt.qGraGrp.iteritems() + if value == itemAtView][0] iR = 0 iP = 0 t = moose.element(cloneObj.parent().mobj) name = t.name - if isinstance(cloneObj.parent().mobj,PoolBase): - retValue = self.objExist(lKey.path,name,iP) - if retValue != None: + if isinstance(cloneObj.parent().mobj, moose.PoolBase): + retValue = self.objExist(lKey.path, name, iP) + if retValue is not None: name += retValue pmooseCp = moose.copy(t,lKey.path,name,1) if pmooseCp.path != '/': ct = moose.element(pmooseCp) concInit = pmooseCp.concInit[0] - #this is b'cos if pool copied across the comptartment, - #then it doesn't calculate nInit according but if one set - #concInit then it would, just a hack + # this is b'cos if pool copied across the comptartment, + # then it doesn't calculate nInit according but if one set + # concInit then it would, just a hack ct.concInit = concInit - #itemAtView = self.state["release"]["item"] poolObj = moose.element(ct) - poolinfo = moose.element(poolObj.path+'/info') - qGItem = PoolItem(poolObj,itemAtView) + poolinfo = moose.element( + poolObj.path + '/info') + qGItem = kkitQGraphics.PoolItem(poolObj, itemAtView) self.layoutPt.mooseId_GObj[poolObj] = qGItem - #bgcolor = getRandColor() - color,bgcolor = getColor(poolinfo) - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y(),color,bgcolor) - self.emit(QtCore.SIGNAL("dropped"),poolObj) - - if isinstance(cloneObj.parent().mobj,ReacBase): - retValue = self.objExist(lKey.path,name,iR) - if retValue != None : + color, bgcolor = kkitUtil.getColor(poolinfo) + qGItem.setDisplayProperties( + posWrtComp.x(), posWrtComp.y(), color, bgcolor) + self.dropped.emit(poolObj) + + if isinstance(cloneObj.parent().mobj, moose.ReacBase): + retValue = self.objExist(lKey.path, name, iR) + if retValue is not None: name += retValue - rmooseCp = moose.copy(t,lKey.path,name,1) + rmooseCp = moose.copy(t, lKey.path, name, 1) if rmooseCp.path != '/': ct = moose.element(rmooseCp) reacObj = moose.element(ct) - reacinfo = moose.Annotator(reacObj.path+'/info') - qGItem = ReacItem(reacObj,itemAtView) + moose.Annotator(reacObj.path + '/info') + qGItem = kkitQGraphics.ReacItem(reacObj, itemAtView) self.layoutPt.mooseId_GObj[reacObj] = qGItem posWrtComp = self.mapToScene(event.pos()) qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y(),"white", "white") - self.emit(QtCore.SIGNAL("dropped"),reacObj) + self.dropped.emit(reacObj) self.updateScale(self.iconScale) else: - if itemAtView == None: - QtGui.QMessageBox.information(None,'Dropping Not possible ','Dropping not allowed outside the compartment',QtGui.QMessageBox.Ok) + if itemAtView is None: + QMessageBox.information( + None, + 'Dropping Not possible ', + 'Dropping not allowed outside the compartment', + QMessageBox.Ok) else: srcdesString = ((self.state["release"]["item"]).mobj).className - QtGui.QMessageBox.information(None,'Dropping Not possible','Dropping on \'{srcdesString}\' not allowed'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) + QMessageBox.information(None,'Dropping Not possible','Dropping on \'{srcdesString}\' not allowed'.format(srcdesString = srcdesString),QMessageBox.Ok) - if clickedItemType == CONNECTION: - popupmenu = QtGui.QMenu('PopupMenu', self) - popupmenu.addAction("Delete", lambda : self.deleteConnection(item)) + if clickedItemType == constants.CONNECTION: + popupmenu = QMenu('PopupMenu', self) + popupmenu.addAction("Delete", lambda: self.deleteConnection(item)) popupmenu.exec_(self.mapToGlobal(event.pos())) - if clickedItemType == COMPARTMENT_BOUNDARY or clickedItemType == GROUP_BOUNDARY: + if clickedItemType == constants.COMPARTMENT_BOUNDARY \ + or clickedItemType == constants.GROUP_BOUNDARY: if item != None: item.setSelected(True) if not self.state["move"]["happened"]: self.layoutPt.plugin.mainWindow.objectEditSlot(self.state["press"]["item"].mobj, True) self.resetState() - if clickedItemType == COMPARTMENT_INTERIOR or clickedItemType == GROUP_INTERIOR: + if clickedItemType == constants.COMPARTMENT_INTERIOR \ + or clickedItemType == constants.GROUP_INTERIOR: if self.state["move"]["happened"]: startingPosition = self.state["press"]["pos"] endingPosition = event.pos() - displacement = endingPosition - startingPosition - x0 = startingPosition.x() + displacement = endingPosition - startingPosition + x0 = startingPosition.x() x1 = endingPosition.x() - y0 = startingPosition.y() + y0 = startingPosition.y() y1 = endingPosition.y() - if displacement.x() < 0 : - x0,x1= x1,x0 + if displacement.x() < 0: + x0, x1 = x1, x0 if displacement.y() < 0 : y0,y1= y1,y0 @@ -580,17 +606,19 @@ def editorMouseReleaseEvent(self,event): self.selectedItems = selectedItems = self.items(x0,y0,abs(displacement.x()), abs(displacement.y())) self.selectSelections(selectedItems) for item in selectedItems: - if isinstance(item, KineticsDisplayItem) and not isinstance(item,ComptItem): + if isinstance( item, kkitQGraphics.KineticsDisplayItem) \ + and not isinstance( item, kkitQGraphics.ComptItem): item.setSelected(True) if self.customrubberBand != None: self.customrubberBand.hide() self.customrubberBand = None - popupmenu = QtGui.QMenu('PopupMenu', self) + popupmenu = QMenu('PopupMenu', self) popupmenu.addAction("Delete", lambda: self.deleteSelections(x0,y0,x1,y1)) popupmenu.addAction("Zoom", lambda: self.zoomSelections(x0,y0,x1,y1)) popupmenu.addAction("Move", lambda: self.moveSelections()) popupmenu.exec_(self.mapToGlobal(event.pos())) + self.resetState() def onClicked(self,modelRoot,element, btn): @@ -608,15 +636,11 @@ def onClicked(self,modelRoot,element, btn): else: plotType = "Conc" - tablePath = moose.utils.create_table_path(moose.element(self.modelRoot), self.graph, element, plotType) - table = moose.utils.create_table(tablePath, element, plotType,"Table2") - ''' - tablePath = utils.create_table_path(moose.element(self.modelRoot), self.graph, element, "Conc") - table = utils.create_table(tablePath, element, "Conc","Table2") - ''' + tablePath = moose.utils.create_table_path( + moose.element(self.modelRoot), self.graph, element, plotType) + moose.utils.create_table(tablePath, element, plotType,"Table2") self.layoutPt.plugin.view.getCentralWidget().plotWidgetContainer.plotAllData() - reply = QtGui.QMessageBox.information(self, "plot Object","Plot is added to Graph1", - QtGui.QMessageBox.Ok) + QMessageBox.information(self, "plot Object", "Plot is added to Graph1", QMessageBox.Ok) self.removeConnector() def objectpullback(self,messgtype,item,movedGraphObj,xx,yy): @@ -641,30 +665,30 @@ def objectpullback(self,messgtype,item,movedGraphObj,xx,yy): elif messgtype.lower() =="functionparent": messgstr = "The Function parent \'{0}\' doesn't exist in \'{2}\' {1} \n If you need to move the function to {1} first move the parent pool".format(movedGraphObj.mobj.parent.name,desObj,item.mobj.name) - QtGui.QMessageBox.warning(None,'Could not move the object', messgstr ) - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) + QMessageBox.warning(None,'Could not move the object', messgstr ) + QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) - def moveObjSceneParent(self,item,movedGraphObj,itempos,eventpos): + def moveObjSceneParent(self,item, movedGraphObj, itempos, eventpos): ''' Scene parent object needs to be updated ''' - if isinstance(movedGraphObj,FuncItem): + if isinstance(movedGraphObj, kkitQGraphics.FuncItem): return prevPar = movedGraphObj.parentItem() movedGraphObj.setParentItem(item) - if isinstance(movedGraphObj,ReacItem): + if isinstance(movedGraphObj, kkitQGraphics.ReacItem): for ll in self.layoutPt.object2line[movedGraphObj]: ll[0].setParentItem(item) moose.move(movedGraphObj.mobj, item.mobj) self.layoutPt.plugin.mainWindow.objectEditSlot(movedGraphObj.mobj, True) - if isinstance(movedGraphObj ,PoolItem): + if isinstance(movedGraphObj, moose.PoolItem): ''' if pool is moved, a check is made to see if this pool is parent of a enzyme if yes then Graphicalparent is changed, and not moose path since it will be taken care while we move pool ''' pl = (movedGraphObj.mobj).neighbors['nOut'] for es in pl: - if isinstance(moose.element(es), EnzBase): + if isinstance(moose.element(es), moose.EnzBase): if moose.element(moose.element(es).neighbors['enzDest'][0]) == movedGraphObj.mobj: enzGrapObj = self.layoutPt.mooseId_GObj[moose.element(es)] enzXpos = enzGrapObj.scenePos().x() @@ -680,74 +704,78 @@ def moveObjSceneParent(self,item,movedGraphObj,itempos,eventpos): self.setnewPostion(movedGraphObj,itempos,eventpos) self.layoutPt.updateArrow(movedGraphObj) self.layoutPt.positionChange(movedGraphObj.mobj) - if isinstance(prevPar,GRPItem): + if isinstance(prevPar, kkitQGraphics.GRPItem): if item != prevPar: self.layoutPt.updateGrpSize(prevPar) self.layoutPt.updateGrpSize(item) def setnewPostion(self,movedGraphObj,itempos,eventpos): - if isinstance(movedGraphObj,KineticsDisplayItem): + if isinstance(movedGraphObj, kkitQGraphics.KineticsDisplayItem): itemPath = movedGraphObj.mobj.path if moose.exists(itemPath): iInfo = itemPath+'/info' - anno = moose.Annotator(iInfo) + moose.Annotator(iInfo) x = eventpos.x()+(15/2)-itempos.x() y = eventpos.y()+(2/2)-itempos.y() - if isinstance(movedGraphObj,ReacItem) or isinstance(movedGraphObj,EnzItem) or isinstance(movedGraphObj,MMEnzItem): + if isinstance(movedGraphObj, kkitQGraphics.ReacItem) \ + or isinstance(movedGraphObj, kkitQGraphics.EnzItem) \ + or isinstance(movedGraphObj, kkitQGraphics.MMEnzItem): movedGraphObj.setGeometry(x,y, movedGraphObj.gobj.boundingRect().width(), movedGraphObj.gobj.boundingRect().height()) - elif isinstance(movedGraphObj,PoolItem): - movedGraphObj.setGeometry(x, y,movedGraphObj.gobj.boundingRect().width() - +PoolItem.fontMetrics.width(' '), + elif isinstance(movedGraphObj, moose.PoolItem): + movedGraphObj.setGeometry(x, y, movedGraphObj.gobj.boundingRect().width() + + moose.PoolItem.fontMetrics.width(' '), movedGraphObj.gobj.boundingRect().height()) - movedGraphObj.bg.setRect(0, 0, movedGraphObj.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '), movedGraphObj.gobj.boundingRect().height()) - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) + movedGraphObj.bg.setRect(0, 0, + movedGraphObj.gobj.boundingRect().width() + moose.PoolItem.fontMetrics.width(' '), movedGraphObj.gobj.boundingRect().height()) + QApplication.setOverrideCursor(QtGui.QCursor(Qt.Qt.ArrowCursor)) def deleteGroup(self,item,layoutPt): - reply = QtGui.QMessageBox.question(self, "Deleting Object",'Do want to delete group \'{groupname}\' and its children and connections'.format(groupname=item.mobj.name), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: - mooseDeleteChemSolver(self.layoutPt.modelRoot) + reply = QMessageBox.question(self + , "Deleting Object" + , "Do want to delete group \ + '{}' and its children and connections".format(item.mobj.name) + , QMessageBox.Yes | QMessageBox.No + ) + if reply == QMessageBox.Yes: + moose.mooseDeleteChemSolver(self.layoutPt.modelRoot) key = [k for k,v in self.layoutPt.qGraGrp.items() if v == item] if key[0] in self.layoutPt.qGraGrp: self.layoutPt.qGraGrp.pop(key[0]) self.groupItemlist1 = item.childItems() - self.groupItemlist = [ i for i in self.groupItemlist1 if not isinstance(i,QtGui.QGraphicsPolygonItem)] + self.groupItemlist = [ i for i in self.groupItemlist1 if not isinstance(i, QGraphicsPolygonItem)] self.deleteObj(self.groupItemlist) self.deleteItem(item) def drawExpectedConnection(self, event): self.connectionSource = self.state["press"]["item"] - sourcePoint = self.connectionSource.mapToScene( + sourcePoint = self.connectionSource.mapToScene( self.connectionSource.boundingRect().center() - ) + ) destinationPoint = self.mapToScene(event.pos()) if self.expectedConnection is None: - self.expectedConnection = QGraphicsLineItem( sourcePoint.x() - , sourcePoint.y() - , destinationPoint.x() - , destinationPoint.y() - ) - self.expectedConnection.setPen(QPen(Qt.Qt.DashLine)) + self.expectedConnection = QGraphicsLineItem( + sourcePoint.x(), sourcePoint.y(), destinationPoint.x(), destinationPoint.y()) + self.expectedConnection.setPen(QtGui.QPen(Qt.Qt.DashLine)) self.sceneContainerPt.addItem(self.expectedConnection) else: - self.expectedConnection.setLine( sourcePoint.x() - , sourcePoint.y() - , destinationPoint.x() - , destinationPoint.y() - ) + self.expectedConnection.setLine( + sourcePoint.x(), + sourcePoint.y(), + destinationPoint.x(), + destinationPoint.y()) def removeExpectedConnection(self): self.sceneContainerPt.removeItem(self.expectedConnection) self.expectedConnection = None - self.connectionSource = None + self.connectionSource = None def removeConnector(self): try: - for l,k in self.connectorlist.items(): + for l, k in list(self.connectorlist.items()): if k is not None: self.sceneContainerPt.removeItem(k) self.connectorlist[l] = None @@ -760,34 +788,42 @@ def showConnector(self, item): self.connectionSource = item rectangle = item.boundingRect() - for l in self.connectorlist.keys(): + for l in list(self.connectorlist.keys()): self.xDisp = 0 self.yDisp = 0 self.connectionSign = None - if isinstance(item.mobj,PoolBase) or isinstance(item.mobj,ReacBase): + if isinstance(item.mobj, moose.PoolBase) \ + or isinstance(item.mobj, moose.ReacBase): if l == "clone": - self.connectionSign = QtSvg.QGraphicsSvgItem('icons/clone.svg') + self.connectionSign = QtSvg.QGraphicsSvgItem( + os.path.join(config.MOOSE_ICON_DIR, 'clone.svg') + ) self.connectionSign.setData(0, QtCore.QVariant("clone")) self.connectionSign.setParent(self.connectionSource) self.connectionSign.setScale( - (1.0 * rectangle.height()) / self.connectionSign.boundingRect().height() - ) + (1.0 * rectangle.height()) / + self.connectionSign.boundingRect().height() + ) position = item.mapToParent(rectangle.bottomLeft()) self.xDisp = 15 self.yDisp = 2 self.connectionSign.setZValue(1) - self.connectionSign.setToolTip("Click and drag to clone the object") - self.connectorlist["clone"] = self.connectionSign - - if isinstance(item.mobj,PoolBase): + self.connectionSign.setToolTip( + "Click and drag to clone the object") + self.connectorlist["clone"] = self.connectionSign + + if isinstance(item.mobj, moose.PoolBase): if l == "plot": - self.connectionSign = QtSvg.QGraphicsSvgItem('icons/plot.svg') + self.connectionSign = QtSvg.QGraphicsSvgItem( + os.path.join(config.MOOSE_ICON_DIR, 'plot.svg') + ) self.connectionSign.setData(0, QtCore.QVariant("plot")) self.connectionSign.setParent(self.connectionSource) self.connectionSign.setScale( - (1.0 * rectangle.height()) / self.connectionSign.boundingRect().height() - ) + (1.0 * rectangle.height()) / + self.connectionSign.boundingRect().height() + ) position = item.mapToParent(rectangle.bottomRight()) #self.xDisp = 15 #self.yDisp = 2 @@ -796,166 +832,179 @@ def showConnector(self, item): self.connectorlist["plot"] = self.connectionSign if l == "move": - if ((item.mobj.parent.className == "ZombieEnz") or (item.mobj.parent.className == "Enz")): + if ((item.mobj.parent.className == "ZombieEnz") + or (item.mobj.parent.className == "Enz")): pass else: - self.connectionSign = QtSvg.QGraphicsSvgItem('icons/move.svg') + self.connectionSign = QtSvg.QGraphicsSvgItem( + os.path.join(config.MOOSE_ICON_DIR, 'move.svg') + ) self.connectionSign.setData(0, QtCore.QVariant("move")) self.connectionSign.setParent(self.connectionSource) self.connectionSign.setToolTip("Drag to move.") - if ( item.mobj.className == "ZombieFunction" or item.mobj.className == "Function"): + if (item.mobj.className == + "ZombieFunction" or item.mobj.className == "Function"): self.connectionSign.setScale( - (0.75 * rectangle.height()) / self.connectionSign.boundingRect().height() - ) + (0.75 * rectangle.height()) / + self.connectionSign.boundingRect().height() + ) else: self.connectionSign.setScale( - (1 * rectangle.height()) / self.connectionSign.boundingRect().height() - ) + (1 * rectangle.height()) / + self.connectionSign.boundingRect().height() + ) position = item.mapToParent(rectangle.topLeft()) self.xDisp = 15 self.yDisp = 2 self.connectionSign.setZValue(1) self.connectorlist["move"] = self.connectionSign elif l == "delete": - if ((item.mobj.parent.className == "ZombieEnz") or (item.mobj.parent.className == "Enz")): + if ((item.mobj.parent.className == "ZombieEnz") + or (item.mobj.parent.className == "Enz")): pass else: - self.connectionSign = QtSvg.QGraphicsSvgItem('icons/delete.svg') + self.connectionSign = QtSvg.QGraphicsSvgItem( + os.path.join(config.MOOSE_ICON_DIR, 'delete.svg') + ) self.connectionSign.setParent(self.connectionSource) self.connectionSign.setData(0, QtCore.QVariant("delete")) - if ( item.mobj.className == "ZombieFunction" or item.mobj.className == "Function"): + if (item.mobj.className == + "ZombieFunction" or item.mobj.className == "Function"): self.connectionSign.setScale( - (0.75 * rectangle.height()) / self.connectionSign.boundingRect().height() - ) + (0.75 * rectangle.height()) / + self.connectionSign.boundingRect().height() + ) else: self.connectionSign.setScale( - (1.0 * rectangle.height()) / self.connectionSign.boundingRect().height() - ) + (1.0 * rectangle.height()) / + self.connectionSign.boundingRect().height() + ) position = item.mapToParent(rectangle.topRight()) self.connectionSign.setZValue(1) self.connectionSign.setToolTip("Delete the object") self.connectorlist["delete"] = self.connectionSign - if self.connectionSign != None: - self.connectionSign.setFlag(QtGui.QGraphicsItem.ItemIsSelectable,True) + if self.connectionSign is not None: + self.connectionSign.setFlag( + QGraphicsItem.ItemIsSelectable, True) self.connectionSign.setParentItem(item.parentItem()) - self.connectionSign.setPos(0.0,0.0) - self.connectionSign.moveBy( position.x()-self.xDisp - , position.y() +self.yDisp - rectangle.height() / 2.0 - ) + self.connectionSign.setPos(0.0, 0.0) + self.connectionSign.moveBy( + position.x() - self.xDisp, + position.y() + self.yDisp - rectangle.height() / 2.0) - def objExist(self,path,name,index): + def objExist(self, path, name, index): if index == 0: - fPath = path+'/'+name + fPath = path + '/' + name else: - fPath = path+'/'+name+'_'+str(index) + fPath = path + '/' + name + '_' + str(index) if moose.exists(fPath): index += 1 - return self.objExist(path,name,index) + return self.objExist(path, name, index) else: if index == 0: return else: - return ('_'+str(index)) + return ('_' + str(index)) def selectSelections(self, selections): - for selection in selections : - if isinstance(selection, KineticsDisplayItem): + for selection in selections: + if isinstance(selection, kkitQGraphics.KineticsDisplayItem): self.selections.append(selection) def deselectSelections(self): for selection in self.selections: selection.setSelected(False) - self.selections = [] + self.selections = [] def mousePressEvent(self, event): - selectedItem = None if self.viewBaseType == "editorView": return self.editorMousePressEvent(event) - - elif self.viewBaseType == "runView": + if self.viewBaseType == "runView": pos = event.pos() item = self.itemAt(pos) - if item: - itemClass = type(item).__name__ - if ( itemClass!='ComptItem' and itemClass != 'QGraphicsPolygonItem' and - itemClass != 'QGraphicsEllipseItem' and itemClass != 'QGraphicsRectItem'): - self.setCursor(Qt.Qt.CrossCursor) - mimeData = QtCore.QMimeData() - mimeData.setText(item.mobj.name) - mimeData.setData("text/plain", "") - mimeData.data =(self.modelRoot,item.mobj) - drag = QtGui.QDrag(self) - drag.setMimeData(mimeData) - dropAction = drag.start(QtCore.Qt.MoveAction) - self.setCursor(Qt.Qt.ArrowCursor) + if not item: + return + itemClass = type(item).__name__ + if itemClass in ['ComptItem', 'QGraphicsPolygonItem', + 'QGraphicsEllipseItem', 'QGraphicsRectItem' ]: + return + self.setCursor(Qt.Qt.CrossCursor) + mimeData = QtCore.QMimeData() + mimeData.setText(item.mobj.name) + mimeData.setData("text/plain", "") + mimeData.data = (self.modelRoot, item.mobj) + drag = QtGui.QGrag(self) + drag.setMimeData(mimeData) + drag.start(QtCore.Qt.MoveAction) + self.setCursor(Qt.Qt.ArrowCursor) - - def mouseMoveEvent(self,event): + def mouseMoveEvent(self, event): if self.viewBaseType == "editorView": return self.editorMouseMoveEvent(event) - def mouseReleaseEvent(self, event): if self.viewBaseType == "editorView": for preSelectedItem in self.sceneContainerPt.selectedItems(): preSelectedItem.setSelected(False) return self.editorMouseReleaseEvent(event) - - return - - if self.state["press"]["mode"] == CONNECTION: - desPos =self.mapToScene(event.pos()) - destination = self.items(event.pos()) - src = self.state["press"]["item"] - des = [j for j in destination if isinstance(j,KineticsDisplayItem)] - if len(des): - self.populate_srcdes(src.mobj,des[0].mobj) - self.setCursor(Qt.Qt.ArrowCursor) - QtGui.QGraphicsView.mouseReleaseEvent(self, event) + return None + # if self.state["press"]["mode"] == constants.CONNECTION: + # destination = self.items(event.pos()) + # src = self.state["press"]["item"] + # des = [ + # j for j in destination if isinstance(j, kkitQGraphics.KineticsDisplayItem)] + # if len(des): + # self.populate_srcdes(src.mobj,des[0].mobj) + # self.setCursor(Qt.Qt.ArrowCursor) + # QGraphicsView.mouseReleaseEvent(self, event) def updateItemTransformationMode(self, on): for v in self.sceneContainerPt.items(): - #v.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations,on) - if( not isinstance(v,ComptItem)): - #if ( isinstance(v, PoolItem) or isinstance(v, ReacItem) or isinstance(v, EnzItem) or isinstance(v, CplxItem) ): - if isinstance(v,KineticsDisplayItem): - v.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, on) + if( not isinstance(v, kkitQGraphics.ComptItem)): + if isinstance(v, kkitQGraphics.KineticsDisplayItem): + v.setFlag(QGraphicsItem.ItemIgnoresTransformations, on) def keyPressEvent(self,event): key = event.key() self.removeConnector() - if (key == Qt.Qt.Key_A and (event.modifiers() & Qt.Qt.ShiftModifier)): # 'A' fits the view to iconScale factor + if (key == Qt.Qt.Key_A and (event.modifiers() & Qt.Qt.ShiftModifier)): itemignoreZooming = False self.updateItemTransformationMode(itemignoreZooming) - #self.fitInView(self.sceneContainerPt.itemsBoundingRect().x()-10,self.sceneContainerPt.itemsBoundingRect().y()-10,self.sceneContainerPt.itemsBoundingRect().width()+20,self.sceneContainerPt.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio) self.layoutPt.drawLine_arrow(itemignoreZooming=False) - elif (key == Qt.Qt.Key_Less or key == Qt.Qt.Key_Minus):# and (event.modifiers() & Qt.Qt.ShiftModifier)): # '<' key. zooms-in to iconScale factor + # and (event.modifiers() & Qt.Qt.ShiftModifier)): # '<' key. zooms-in + # to iconScale factor + elif (key == Qt.Qt.Key_Less or key == Qt.Qt.Key_Minus): self.iconScale *= 0.8 - self.updateScale( self.iconScale ) + self.updateScale(self.iconScale) - elif (key == Qt.Qt.Key_Greater or key == Qt.Qt.Key_Plus):# and (event.modifiers() & Qt.Qt.ShiftModifier)): # '>' key. zooms-out to iconScale factor + # and (event.modifiers() & Qt.Qt.ShiftModifier)): # '>' key. zooms-out + # to iconScale factor + elif (key == Qt.Qt.Key_Greater or key == Qt.Qt.Key_Plus): self.iconScale *= 1.25 - self.updateScale( self.iconScale ) + self.updateScale(self.iconScale) - elif (key == Qt.Qt.Key_Period): # '.' key, lower case for '>' zooms in - self.scale(1.1,1.1) + elif (key == Qt.Qt.Key_Period): # '.' key, lower case for '>' zooms in + self.scale(1.1, 1.1) - elif (key == Qt.Qt.Key_Comma): # ',' key, lower case for '<' zooms in - self.scale(1/1.1,1/1.1) + elif (key == Qt.Qt.Key_Comma): # ',' key, lower case for '<' zooms in + self.scale(1 / 1.1, 1 / 1.1) elif (key == Qt.Qt.Key_A): # 'a' fits the view to initial value where iconscale=1 self.iconscale = 1 self.updateScale( 1 ) - self.fitInView(self.sceneContainerPt.itemsBoundingRect().x()-10,self.sceneContainerPt.itemsBoundingRect().y()-10,self.sceneContainerPt.itemsBoundingRect().width()+20,self.sceneContainerPt.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio) + self.fitInView(self.sceneContainerPt.itemsBoundingRect().x()-10 + , self.sceneContainerPt.itemsBoundingRect().y()-10 + , self.sceneContainerPt.itemsBoundingRect().width()+20 + , self.sceneContainerPt.itemsBoundingRect().height()+20 + , Qt.Qt.IgnoreAspectRatio) + def updateScale( self, scale ): for item in self.sceneContainerPt.items(): - if isinstance(item,KineticsDisplayItem): + if isinstance(item, kkitQGraphics.KineticsDisplayItem): item.refresh(scale) - xpos = item.pos().x() - ypos = item.pos().y() self.layoutPt.drawLine_arrow(itemignoreZooming=False) self.layoutPt.comptChildrenBoundingRect() @@ -963,17 +1012,20 @@ def moveSelections(self): self.setCursor(Qt.Qt.CrossCursor) self.move = True return - + def GrVfitinView(self): itemignoreZooming = False self.layoutPt.updateItemTransformationMode(itemignoreZooming) - self.fitInView(self.sceneContainerPt.itemsBoundingRect().x()-10,self.sceneContainerPt.itemsBoundingRect().y()-10,self.sceneContainerPt.itemsBoundingRect().width()+20,self.sceneContainerPt.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio) + self.fitInView( + self.sceneContainerPt.itemsBoundingRect().x() - 10, + self.sceneContainerPt.itemsBoundingRect().y() - 10, + self.sceneContainerPt.itemsBoundingRect().width() + 20, + self.sceneContainerPt.itemsBoundingRect().height() + 20, + Qt.Qt.IgnoreAspectRatio) self.layoutPt.drawLine_arrow(itemignoreZooming=False) def deleteSelections(self,x0,y0,x1,y1): if( x1-x0 > 0 and y1-y0 >0): - # self.rubberbandlist = self.sceneContainerPt.items(self.mapToScene(QtCore.QRect(x0, y0, x1 - x0, y1 - y0)).boundingRect(), Qt.Qt.IntersectsItemShape) - # for unselectitem in self.rubberbandlist: self.rubberbandlist_qpolygon = [] for unselectitem in self.rubberbandlist_qpolygon: if unselectitem.isSelected() == True: @@ -981,7 +1033,7 @@ def deleteSelections(self,x0,y0,x1,y1): self.rubberbandlist_qpolygon = self.sceneContainerPt.items(self.mapToScene(QtCore.QRect(x0, y0, x1 - x0, y1 - y0)).boundingRect(), Qt.Qt.IntersectsItemShape) for item in self.rubberbandlist_qpolygon: ''' in RubberbandSelection if entire group object contains then group is removed,if partly selected then group is retained''' - if isinstance(item,GRPItem): + if isinstance(item, kkitQGraphics.GRPItem): if not (self.mapToScene(QtCore.QRect(x0, y0, x1 - x0, y1 - y0)).boundingRect()).contains(item.sceneBoundingRect()): self.rubberbandlist_qpolygon.remove(item) @@ -990,17 +1042,23 @@ def deleteSelections(self,x0,y0,x1,y1): def deleteObj(self,item): self.rubberbandlist = item - mooseDeleteChemSolver(self.layoutPt.modelRoot) - self.list_EnzReccplx = [ i for i in self.rubberbandlist if (isinstance(i,MMEnzItem) or isinstance(i,EnzItem) or isinstance(i,CplxItem) or isinstance(i,ReacItem) )] - self.list_PFS = [ i for i in self.rubberbandlist if (isinstance(i,PoolItem) or isinstance(i,TableItem) or isinstance(i,FuncItem) )] - self.grp = [ i for i in self.rubberbandlist if isinstance(i,GRPItem)] + moose.mooseDeleteChemSolver(self.layoutPt.modelRoot) + self.list_EnzReccplx = [ i for i in self.rubberbandlist if + (isinstance(i, moose.MMEnzItem) or isinstance(i, moose.EnzItem) + or isinstance(i, moose.CplxItem) or isinstance(i, moose.ReacItem) )] + self.list_PFS = [ i for i in self.rubberbandlist if + (isinstance(i, moose.PoolItem) or isinstance(i, + kkitQGraphics.TableItem) or isinstance(i, kkitQGraphics.FuncItem) )] + self.grp = [ i for i in self.rubberbandlist if isinstance(i, + kkitQGraphics.GRPItem) ] for item in self.list_EnzReccplx: #First Loop to remove all the enz b'cos if parent (which is a Pool) is removed, #then it will created problem at qgraphicalitem not having parent. #So first delete enz, then Reac and then delete pool self.deleteItem(item) for item in self.list_PFS: - if isinstance(item,PoolItem) or isinstance(item,BufPool): + if isinstance(item, moose.PoolItem) \ + or isinstance(item, moose.BufPool): plot = moose.wildcardFind(self.layoutPt.modelRoot+'/data/graph#/#') for p in plot: if len(p.neighbors['requestOut']): @@ -1014,43 +1072,43 @@ def deleteObj(self,item): if key[0] in self.layoutPt.qGraGrp: self.layoutPt.qGraGrp.pop(key[0]) self.groupItemlist1 = item.childItems() - self.groupItemlist = [ i for i in self.groupItemlist1 if not isinstance(i,QtGui.QGraphicsPolygonItem)] + self.groupItemlist = [ i for i in self.groupItemlist1 if not isinstance(i,QGraphicsPolygonItem)] self.deleteObj(self.groupItemlist) self.deleteItem(item) def deleteObject2line(self,qpolygonline,src,des,endt): object2lineInfo = self.layoutPt.object2line[des] if len(object2lineInfo) == 1: - for polygon,objdes,endtype,numL in object2lineInfo: + for polygon, objdes, endtype, numL in object2lineInfo: if polygon == qpolygonline and objdes == src and endtype == endt: del(self.layoutPt.object2line[des]) else: print( " check this condition when is len is single and else condition",qpolygonline, objdes,endtype) else: n = 0 - for polygon,objdes,endtype,numL in object2lineInfo: + for polygon, objdes, endtype, numL in object2lineInfo: if polygon == qpolygonline and objdes == src and endtype == endt: - tup = object2lineInfo[:n]+object2lineInfo[n+1:] + tup = object2lineInfo[:n] + object2lineInfo[n + 1:] self.layoutPt.object2line[des] = tup - #d[keyNo].append((a,b,c)) + # d[keyNo].append((a,b,c)) else: n = n+1 def deleteConnection(self,item): #Delete moose connection, i.e one can click on connection arrow and delete the connection - reply = QtGui.QMessageBox.question(self, "Deleting Object","Do want to delete object and its connections", - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: - mooseDeleteChemSolver(self.layoutPt.modelRoot) + reply = QMessageBox.question(self, "Deleting Object","Do want to delete object and its connections", + QMessageBox.Yes | QMessageBox.No) + if reply == QMessageBox.Yes: + moose.mooseDeleteChemSolver(self.layoutPt.modelRoot) msgIdforDeleting = " " - if isinstance(item,QtGui.QGraphicsPolygonItem): + if isinstance(item, QGraphicsPolygonItem): src = self.layoutPt.lineItem_dict[item] lineItem_value = self.layoutPt.lineItem_dict[item] i = iter(lineItem_value) source = i.next() destination = i.next() endt = i.next() - numl = i.next() + i.next() self.deleteObject2line(item,source,destination,endt) self.deleteObject2line(item,destination,source,endt) try: @@ -1073,7 +1131,7 @@ def deleteConnection(self,item): if src[2] == "t": if msg.destFieldsOnE2[0] == "enzDest": # delete indivial msg if later adding parent is possible - # msgIdforDeleting = msg + # msgIdforDeleting = msg # moose.delete(msgIdforDeleting) # self.sceneContainerPt.removeItem(item) self.deleteItem(gItem) @@ -1082,7 +1140,7 @@ def deleteConnection(self,item): self.getMsgId(src,srcZero,srcOne,item) moose.delete(msgIdforDeleting) self.sceneContainerPt.removeItem(item) - setupItem(self.modelRoot,self.layoutPt.srcdesConnection) + modelBuild.setupItem(self.modelRoot,self.layoutPt.srcdesConnection) for msg in moose.element(srcZero[0].parent).msgIn: if moose.element(msg.e2.path) == moose.element(srcZero[0].parent.path): if src[2] == 't': @@ -1130,12 +1188,12 @@ def deleteConnection(self,item): else: pass - def deleteSceneObj(self,msgIdforDeleting,item): + def deleteSceneObj(self, msgIdforDeleting, item): moose.delete(msgIdforDeleting) self.sceneContainerPt.removeItem(item) - setupItem(self.modelRoot,self.layoutPt.srcdesConnection) + modelBuild.setupItem(self.modelRoot, self.layoutPt.srcdesConnection) - def getMsgId(self,src,srcZero,srcOne,item): + def getMsgId(self, src, srcZero, srcOne, item): for msg in srcZero[0].msgOut: msgIdforDeleting = " " if moose.element(msg.e2.path) == moose.element(srcOne[0].path): @@ -1143,69 +1201,75 @@ def getMsgId(self,src,srcZero,srcOne,item): # substrate connection for R,E if msg.srcFieldsOnE1[0] == "subOut": msgIdforDeleting = msg - self.deleteSceneObj(msgIdforDeleting,item) + self.deleteSceneObj(msgIdforDeleting, item) return elif src[2] == 'p': # product connection for R,E if msg.srcFieldsOnE1[0] == "prdOut": msgIdforDeleting = msg - self.deleteSceneObj(msgIdforDeleting,item) - return + self.deleteSceneObj(msgIdforDeleting, item) + return elif src[2] == 't': if msg.srcFieldsOnE1[0] == "enzOut": - gItem =self.layoutPt.mooseId_GObj[moose.element(srcZero[0])] + gItem = self.layoutPt.mooseId_GObj[ + moose.element(srcZero[0])] self.deleteItem(gItem) return elif src[2] == 'tab': - #stimulation Table connection + # stimulation Table connection if msg.srcFieldsOnE1[0] == "output": msgIdforDeleting = msg - self.deleteSceneObj(msgIdforDeleting,item) - return - - def deleteItem(self,item): - #delete Items + self.deleteSceneObj(msgIdforDeleting, item) + return + def deleteItem(self, item): + # delete Items self.layoutPt.plugin.mainWindow.objectEditSlot('/', False) - if isinstance(item,KineticsDisplayItem) or isinstance(item,GRPItem): + if isinstance(item, kkitQGraphics.KineticsDisplayItem) \ + or isinstance(item, kkitQGraphics.GRPItem): if moose.exists(item.mobj.path): - if isinstance(item,PoolItem) or isinstance(item,BufPool): + if isinstance(item, moose.PoolItem) or isinstance(item, moose.BufPool): # pool is item is removed, then check is made if its a parent to any # enz if 'yes', then enz and its connection are removed before # removing Pool for items in moose.element(item.mobj.path).children: - if isinstance(moose.element(items), EnzBase): - gItem = self.layoutPt.mooseId_GObj[moose.element(items)] + if isinstance(moose.element(items), moose.EnzBase): + gItem = self.layoutPt.mooseId_GObj[ + moose.element(items)] for l in self.layoutPt.object2line[gItem]: # Need to check if the connection on the scene exist # or its removed from some other means - # E.g Enz to pool and pool to Enz is connected, - # when enz is removed the connection is removed, - # but when pool tried to remove then qgraphicscene says + # E.g Enz to pool and pool to Enz is connected, + # when enz is removed the connection is removed, + # but when pool tried to remove then qgraphicscene says # "item scene is different from this scene" - sceneItems = self.sceneContainerPt.items() + sceneItems = list( + self.sceneContainerPt.items()) if l[0] in sceneItems: - #deleting the connection which is connected to Enz + # deleting the connection which is + # connected to Enz self.sceneContainerPt.removeItem(l[0]) moose.delete(items) self.sceneContainerPt.removeItem(gItem) - #If pool/bufpool is input to a function and if pool/bufpool is removed then function is also removed. + # If pool/bufpool is input to a function and if + # pool/bufpool is removed then function is also removed. for msg in moose.element(item.mobj.path).msgOut: - if (moose.element(msg.e2.path).className == "Variable" and msg.destFieldsOnE2[0]=="input"): + if (moose.element(msg.e2.path).className == + "Variable" and msg.destFieldsOnE2[0] == "input"): funcp = moose.element(msg.e2.path).parent - pool = moose.element(funcp).parent self.deleteItem(self.layoutPt.mooseId_GObj[funcp]) for l in self.layoutPt.object2line[item]: - sceneItems = self.sceneContainerPt.items() + sceneItems = list(self.sceneContainerPt.items()) if l[0] in sceneItems: self.sceneContainerPt.removeItem(l[0]) self.sceneContainerPt.removeItem(item) moose.delete(item.mobj) - for key, value in self.layoutPt.object2line.items(): - self.layoutPt.object2line[key] = filter( lambda tup: tup[1] != item ,value) + for key, value in list(self.layoutPt.object2line.items()): + self.layoutPt.object2line[key] = [ + tup for tup in value if tup[1] != item] self.layoutPt.getMooseObj() - setupItem(self.modelRoot,self.layoutPt.srcdesConnection) + kkitOrdinateUtil.setupItem(self.modelRoot, self.layoutPt.srcdesConnection) def zoomSelections(self, x0, y0, x1, y1): p0 = self.mapToScene(x0, y0) @@ -1213,13 +1277,13 @@ def zoomSelections(self, x0, y0, x1, y1): self.fitInView(QtCore.QRectF(p0, p1), Qt.Qt.KeepAspectRatio) self.deselectSelections() return - - def wheelEvent(self,event): - factor = 1.41 ** (event.delta() / 240.0) + def wheelEvent(self, event): + pD = event.angleDelta().y() + factor = 1.41 ** (pD / 240.0) + logger_.debug( "WheelEvent %s and factor: %s" % (pD, factor)) self.scale(factor, factor) - def dragEnterEvent(self, event): if self.viewBaseType == "editorView": if event.mimeData().hasFormat('text/plain'): @@ -1234,41 +1298,55 @@ def dragMoveEvent(self, event): else: pass - def eventFilter(self, source, event): - if self.viewBase == "editorView": - if (event.type() == QtCore.QEvent.Drop): - pass - else: - pass - def dropEvent(self, event): - """Insert an element of the specified class in drop location""" - """ Pool and reaction should have compartment as parent, dropping outside the compartment is not allowed """ - """ Enz should be droped on the PoolItem which inturn will be under compartment""" + """Insert an element of the specified class in drop location + + Pool and reaction should have compartment as parent, dropping outside + the compartment is not allowed. + + Enz should be droped on the PoolItem which inturn will be under compartment + + """ if self.viewBaseType == "editorView": if not event.mimeData().hasFormat('text/plain'): + logger_.warn("MIMEData is not text/plain. Doing nothing ...") return event_pos = event.pos() string = str(event.mimeData().text()) - createObj(self.viewBaseType,self,self.modelRoot,string,event_pos,self.layoutPt) + modelBuild.createObj( + self.viewBaseType, + self, + self.modelRoot, + string, + event_pos, + self.layoutPt + ) + else: + logger_.debug("Not in editorView ") + return - def populate_srcdes(self,src,des): + def populate_srcdes(self, src, des): self.modelRoot = self.layoutPt.modelRoot callsetupItem = True - #print " populate_srcdes ",src,des - srcClass = moose.element(src).className + # print " populate_srcdes ",src,des + srcClass = moose.element(src).className if 'Zombie' in srcClass: srcClass = srcClass.split('Zombie')[1] desClass = moose.element(des).className if 'Zombie' in desClass: desClass = desClass.split('Zombie')[1] - if ( isinstance(moose.element(src),PoolBase) and ( (isinstance(moose.element(des),ReacBase) ) or isinstance(moose.element(des),EnzBase) )): - #If one to tries to connect pool to Reac/Enz (substrate to Reac/Enz), check if already (product to Reac/Enz) exist. - #If exist then connection not allowed one need to delete the msg and try connecting back. - #And in moose Enzyme can't have 2nd order reaction. + if ( isinstance(moose.element(src), moose.PoolBase) + and ( + (isinstance(moose.element(des), moose.ReacBase) ) + or isinstance(moose.element(des), moose.EnzBase))): + # If one to tries to connect pool to Reac/Enz (substrate to + # Reac/Enz), check if already (product to Reac/Enz) exist. + # If exist then connection not allowed one need to delete the msg + # and try connecting back. + # And in moose Enzyme can't have 2nd order reaction. founds, foundp = False,False - if isinstance(moose.element(des),EnzBase): + if isinstance(moose.element(des), moose.EnzBase): if len(moose.element(des).neighbors["subOut"]) > 0: founds = True @@ -1282,78 +1360,101 @@ def populate_srcdes(self,src,des): moose.connect(des, 'sub', src, 'reac', 'OneToOne') elif foundp: srcdesString = srcClass+' is already connected as '+ '\'Product\''+' to '+desClass +' \n \nIf you wish to connect this object then first delete the exist connection' - QtGui.QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) + QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QMessageBox.Ok) elif founds: srcdesString = desClass+' has already connected to a'+ '\'Substrate\''+' \n \nIn moose Enzyme\'s can not have second order reaction. If you wish to connect this object then first delete the exist connection' - QtGui.QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) + QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QMessageBox.Ok) - elif (isinstance (moose.element(src),PoolBase) and (isinstance(moose.element(des),Function))): + elif (isinstance (moose.element(src), moose.PoolBase) and + (isinstance(moose.element(des), moose.Function))): numVariables = des.numVars expr = "" - expr = (des.expr+'+'+'x'+str(numVariables)) + expr = (des.expr + '+' + 'x' + str(numVariables)) expr = expr.lstrip("0 +") - expr = expr.replace(" ","") + expr = expr.replace(" ", "") des.expr = expr - moose.connect( src, 'nOut', des.x[numVariables], 'input' ) - - elif ( isinstance(moose.element(src),Function) and (moose.element(des).className=="Pool") or - isinstance(moose.element(src),ZombieFunction) and (moose.element(des).className=="ZombiePool") - ): - if ((element(des).parent).className != 'Enz'): - #moose.connect(src, 'valueOut', des, 'increment', 'OneToOne') - found = False - if len(moose.element(src).neighbors["valueOut"]): - for psl in moose.element(src).neighbors["valueOut"]: - if moose.element(psl) == moose.element(des): - found = True - if found == False: - moose.connect(src, 'valueOut', des, 'setN', 'OneToOne') - else: - srcdesString = '\"'+moose.element(src).name+'\" is already connected to \"'+ moose.element(des).name +'\" \n' - QtGui.QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) - - + moose.connect(src, 'nOut', des.x[numVariables], 'input') + + elif (isinstance(moose.element(src), moose.Function) and + (moose.element(des).className == "Pool") + or isinstance(moose.element(src), moose.ZombieFunction) and + (moose.element(des).className == "ZombiePool") + ): + if ((moose.element(des).parent).className != 'Enz'): + found = False + if len(moose.element(src).neighbors["valueOut"]): + for psl in moose.element(src).neighbors["valueOut"]: + if moose.element(psl) == moose.element(des): + found = True + if not found: + moose.connect(src, 'valueOut', des, 'setN', 'OneToOne') else: - srcdesString = element(src).className+'-- EnzCplx' - QtGui.QMessageBox.information(None,'Connection Not possible','\'{srcdesString}\' not allowed to connect'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) + srcdesString = moose.element(src).className+'-- EnzCplx' + QMessageBox.information(None + , 'Connection Not possible','\'{}\' not allowed to connect'.format(srcdesString) + , QMessageBox.Ok + ) callsetupItem = False - elif ( isinstance(moose.element(src),Function) and (moose.element(des).className=="BufPool") or - isinstance(moose.element(src),ZombieFunction) and (moose.element(des).className=="ZombieBufPool") + elif (isinstance(moose.element(src), moose.Function) and + (moose.element(des).className=="BufPool") + or isinstance(moose.element(src), moose.ZombieFunction) and + (moose.element(des).className=="ZombieBufPool") ): moose.connect(src, 'valueOut', des, 'setN', 'OneToOne') - elif ( isinstance(moose.element(src),Function) and (isinstance(moose.element(des),ReacBase) ) or - isinstance(moose.element(src),ZombieFunction) and (moose.element(des).className=="ZombieReac") + elif ( isinstance(moose.element(src), moose.Function) and + (isinstance(moose.element(des), moose.ReacBase)) + or isinstance(moose.element(src), moose.ZombieFunction) and + (moose.element(des).className=="ZombieReac") ): moose.connect(src, 'valueOut', des, 'setNumKf', 'OneToOne') - elif (((isinstance(moose.element(src),ReacBase))or (isinstance(moose.element(src),EnzBase))) and (isinstance(moose.element(des),PoolBase))): - founds,foundp = False,False - if isinstance(moose.element(src),EnzBase): + elif ((isinstance(moose.element(src), moose.ReacBase) \ + or isinstance(moose.element(src), moose.EnzBase)) \ + and isinstance(moose.element(des), moose.PoolBase)): + founds, foundp = False, False + if isinstance(moose.element(src), moose.EnzBase): if len(moose.element(src).neighbors["prdOut"]) > 0: foundp = True - for msg in src.msgOut: if moose.element(msg.e2.path) == des: if msg.srcFieldsOnE1[0] == "subOut": founds = True if founds == False and foundp == False: - #moose.connect(src, 'prd', des, 'reac', 'OneToOne') moose.connect(src, 'prd', des, 'reac', 'OneToOne') elif foundp: - srcdesString = srcClass+' is already connected as '+ '\'Product\''+' to '+desClass +' \n \nIn moose Enzyme\'s can not have second order reaction. If you wish to connect this object then first delete the exist connection' - QtGui.QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) + srcdesString = srcClass + ' is already connected as ' \ + + "'Product' + to {}\n\n'".format(desClass) + \ + 'In MOOSE, Enzyme\'s can not have second order reaction.'+\ + ' If you wish to connect this object then first delete'+\ + ' the existing connection.' + QMessageBox.information( None + , 'Connection Not possible','{}'.format(srcdesString) + , QMessageBox.Ok + ) elif founds: - srcdesString = desClass+' is already connected as '+'\'Substrate\''+' to '+srcClass +' \n \nIf you wish to connect this object then first delete the exist connection' - QtGui.QMessageBox.information(None,'Connection Not possible','{srcdesString}'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) - elif( isinstance(moose.element(src),StimulusTable) and (isinstance(moose.element(des),PoolBase) ) ): + srcdesString = desClass+' is already connected as '+\ + '\'Substrate\''+' to '+srcClass +\ + ' \n\nIf you wish to connect this object '+\ + ' then first delete the exist connection.' + QMessageBox.information(None + ,'Connection Not possible' + , srcdesString + , QMessageBox.Ok) + elif( isinstance(moose.element(src), moose.StimulusTable) \ + and (isinstance(moose.element(des), moose.PoolBase)) + ): moose.connect(src, 'output', des, 'setConcInit', 'OneToOne') else: srcString = moose.element(src).className desString = moose.element(des).className - srcdesString = srcString+'--'+desString - QtGui.QMessageBox.information(None,'Connection Not possible','\'{srcdesString}\' not allowed to connect'.format(srcdesString = srcdesString),QtGui.QMessageBox.Ok) + srcdesString = srcString + '--' + desString + QMessageBox.information( + None, + 'Connection Not possible', + '\'{}\' not allowed to connect'.format(srcdesString), + QMessageBox.Ok) callsetupItem = False - + if callsetupItem: self.layoutPt.getMooseObj() - setupItem(self.modelRoot,self.layoutPt.srcdesConnection) + kkitOrdinateUtil.setupItem(self.modelRoot,self.layoutPt.srcdesConnection) self.layoutPt.drawLine_arrow(False) diff --git a/plugins/list.txt b/moosegui/plugins/list.txt similarity index 93% rename from plugins/list.txt rename to moosegui/plugins/list.txt index c3e68ca..7eaf8f2 100644 --- a/plugins/list.txt +++ b/moosegui/plugins/list.txt @@ -1,3 +1,2 @@ kkit NeuroKit - diff --git a/moosegui/plugins/modelBuild.py b/moosegui/plugins/modelBuild.py new file mode 100644 index 0000000..3a12a9f --- /dev/null +++ b/moosegui/plugins/modelBuild.py @@ -0,0 +1,359 @@ +# -*- coding: utf-8 -*- + +__author__ = "Harsha Rani" +__credits__ = ["Upi Lab"] +__license__ = "GPLv3" +__maintainer__ = "Harsha Rani, Dilawar Singh" +__email__ = "hrani@ncbs.res.in" + +import moose +from moosegui.plugins import kkitQGraphics +from moosegui.plugins import kkitUtil +from PyQt5 import Qt, QtCore +from PyQt5 import QtGui +from PyQt5.QtWidgets import QGraphicsScene, QMessageBox + +import logging +logger_ = logging.getLogger("moosegui.plugin.kkit") + +def updateCompartmentSize(qGraCompt): + #childBoundingRect = qGraCompt.childrenBoundingRect() + childBoundingRect = kkitUtil.calculateChildBoundingRect(qGraCompt) + comptBoundingRect = qGraCompt.boundingRect() + rectcompt = comptBoundingRect.united(childBoundingRect) + comptPen = qGraCompt.pen() + comptWidth = 1 + comptPen.setWidth(comptWidth) + qGraCompt.setPen(comptPen) + if not comptBoundingRect.contains(childBoundingRect): + qGraCompt.setRect(rectcompt.x() - comptWidth, + rectcompt.y() - comptWidth, + rectcompt.width() + (comptWidth * 2), + rectcompt.height() + (comptWidth * 2)) + + +def checkCreate(scene, view, modelpath, mobj, string, ret_string, num, + event_pos, layoutPt): + # The variable 'compt' will be empty when dropping cubeMesh,cyclMesh, + # but rest it shd be compartment + logger_.debug( "checkCreate is called") + if moose.exists(modelpath + '/info'): + moose.Annotator((moose.element(modelpath + '/info'))).modeltype + itemAtView = view.sceneContainerPt.itemAt(view.mapToScene(event_pos)) + pos = view.mapToScene(event_pos) + modelpath = moose.element(modelpath) + if num: + string_num = ret_string + str(num) + else: + string_num = ret_string + if string == "CubeMesh" or string == "CylMesh": + if string == "CylMesh": + mobj = moose.CylMesh(modelpath.path + '/' + string_num) + else: + mobj = moose.CubeMesh(modelpath.path + '/' + string_num) + + mobj.volume = 1e-15 + qGItem = kkitQGraphics.ComptItem(scene, + pos.toPoint().x(), + pos.toPoint().y(), 100, 100, mobj) + qGItem.setPen( + QtGui.QPen(Qt.QColor(66, 66, 66, 100), 1, Qt.Qt.SolidLine, + Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) + view.sceneContainerPt.addItem(qGItem) + + qGItem.cmptEmitter.connect( + qGItem.cmptEmitter, + QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"), + layoutPt.positionChange1) + + qGItem.cmptEmitter.connect( + qGItem.cmptEmitter, + QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"), + layoutPt.objectEditSlot) + layoutPt.qGraCompt[mobj] = qGItem + + # Attach a drop signal. + qGItem.dropped.emit() + + elif string == "Pool" or string == "BufPool": + #getting pos with respect to compartment otherwise if compartment is moved then pos would be wrong + posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() + if string == "Pool": + poolObj = moose.Pool(mobj.path + '/' + string_num) + else: + poolObj = moose.BufPool(mobj.path + '/' + string_num) + + poolinfo = moose.Annotator(poolObj.path + '/info') + + qGItem = kkitQGraphics.PoolItem(poolObj, itemAtView) + layoutPt.mooseId_GObj[poolObj] = qGItem + posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() + bgcolor = kkitUtil.getRandColor() + qGItem.setDisplayProperties(posWrtComp.x(), posWrtComp.y(), + QtGui.QColor('green'), bgcolor) + poolinfo.color = str(bgcolor.getRgb()) + qGItem.dropped.emit() + + kkitUtil.setupItem(modelpath.path, layoutPt.srcdesConnection) + layoutPt.drawLine_arrow(False) + x, y = roundoff(qGItem.scenePos(), layoutPt) + poolinfo.x = x + poolinfo.y = y + #Dropping is on compartment then update Compart size + if isinstance(mobj, moose.ChemCompt): + compt = layoutPt.qGraCompt[moose.element(mobj)] + updateCompartmentSize(compt) + + elif string == "Reac": + posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() + reacObj = moose.Reac(mobj.path + '/' + string_num) + reacinfo = moose.Annotator(reacObj.path + '/info') + qGItem = kkitQGraphics.ReacItem(reacObj, itemAtView) + qGItem.setDisplayProperties(posWrtComp.x(), posWrtComp.y(), "white", + "white") + layoutPt.mooseId_GObj[reacObj] = qGItem + qGItem.dopped.emit() + # view.emit(QtCore.SIGNAL("dropped"), reacObj) + kkitUtil.setupItem(modelpath.path, layoutPt.srcdesConnection) + layoutPt.drawLine_arrow(False) + #Dropping is on compartment then update Compart size + if isinstance(mobj, moose.ChemCompt): + compt = layoutPt.qGraCompt[moose.element(mobj)] + updateCompartmentSize(compt) + x, y = roundoff(qGItem.scenePos(), layoutPt) + reacinfo.x = x + reacinfo.y = y + + elif string == "StimulusTable": + posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() + tabObj = moose.StimulusTable(mobj.path + '/' + string_num) + tabinfo = moose.Annotator(tabObj.path + '/info') + qGItem = kkitQGraphics.TableItem(tabObj, itemAtView) + qGItem.setDisplayProperties(posWrtComp.x(), posWrtComp.y(), + QtGui.QColor('white'), + QtGui.QColor('white')) + layoutPt.mooseId_GObj[tabObj] = qGItem + qGItem.dropped.emit() + # view.emit(QtCore.SIGNAL("dropped"), tabObj) + kkitUtil.setupItem(modelpath.path, layoutPt.srcdesConnection) + layoutPt.drawLine_arrow(False) + # Dropping is on compartment then update Compart size + if isinstance(mobj, moose.ChemCompt): + compt = layoutPt.qGraCompt[moose.element(mobj)] + updateCompartmentSize(compt) + x, y = roundoff(qGItem.scenePos(), layoutPt) + tabinfo.x = x + tabinfo.y = y + + elif string == "Function": + posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() + funcObj = moose.Function(mobj.path + '/' + string_num) + funcinfo = moose.Annotator(funcObj.path + '/info') + #moose.connect( funcObj, 'valueOut', mobj ,'setN' ) + poolclass = ["ZombieBufPool", "BufPool"] + comptclass = ["CubeMesh", "cyclMesh"] + + if mobj.className in poolclass: + funcParent = layoutPt.mooseId_GObj[moose.element(mobj.path)] + elif mobj.className in comptclass: + funcParent = layoutPt.qGraCompt[moose.element(mobj)] + posWrtComp = funcParent.mapFromScene(pos).toPoint() + elif mobj.className in "Neutral": + funcParent = layoutPt.qGraGrp[moose.element(mobj)] + + qGItem = kkitQGraphics.FuncItem(funcObj, funcParent) + qGItem.setDisplayProperties(posWrtComp.x(), posWrtComp.y(), + QtGui.QColor('red'), QtGui.QColor('green')) + layoutPt.mooseId_GObj[funcObj] = qGItem + qGItem.dropped.emit() + # view.emit(QtCore.SIGNAL("dropped"), funcObj) + kkitUtil.setupItem(modelpath.path, layoutPt.srcdesConnection) + layoutPt.drawLine_arrow(False) + #Dropping is on compartment then update Compart size + mooseCmpt = findCompartment(mobj) + if isinstance(mooseCmpt, moose.ChemCompt): + compt = layoutPt.qGraCompt[moose.element(mooseCmpt)] + updateCompartmentSize(compt) + x, y = roundoff(qGItem.scenePos(), layoutPt) + funcinfo.x = x + funcinfo.y = y + + elif string == "Enz" or string == "MMenz": + # FIXME: If 2 enz has same pool parent, then pos of the 2nd enz shd be + # displaced by some position, need to check how to deal with it + posWrtComp = pos + if ((mobj.parent).className == "Enz"): + QMessageBox.information( + None, "Drop Not possible", + "'{}' has to have Pool as its parent and not Enzyme Complex". + format(string), QMessageBox.Ok) + return None + else: + enzparent = findCompartment(mobj) + parentcompt = layoutPt.qGraCompt[enzparent] + if string == "Enz": + enzObj = moose.Enz(moose.element(mobj).path + '/' + string_num) + enzinfo = moose.Annotator(enzObj.path + '/info') + moose.connect(enzObj, 'enz', mobj, 'reac') + qGItem = kkitQGraphics.EnzItem(enzObj, parentcompt) + layoutPt.mooseId_GObj[enzObj] = qGItem + posWrtComp = pos + bgcolor = kkitUtil.getRandColor() + qGItem.setDisplayProperties(posWrtComp.x(), + posWrtComp.y() - 40, + QtGui.QColor('green'), bgcolor) + x, y = roundoff(qGItem.scenePos(), layoutPt) + enzinfo.x = x + enzinfo.y = y + enzinfo.color = str(bgcolor.name()) + enzinfo.textColor = str(QtGui.QColor('green').name()) + moose.Annotator(enzinfo) + Enz_cplx = enzObj.path + '/' + string_num + '_cplx' + cplxItem = moose.Pool(Enz_cplx) + moose.Annotator(cplxItem.path + '/info') + qGEnz = layoutPt.mooseId_GObj[enzObj] + kkitQGraphics.CplxItem(cplxItem, qGEnz) + layoutPt.mooseId_GObj[cplxItem] = qGItem + enzboundingRect = qGEnz.boundingRect() + moose.connect(enzObj, 'cplx', cplxItem, 'reac') + qGItem.setDisplayProperties(int(enzboundingRect.height() / 2), + enzboundingRect.height() - 40, + QtGui.QColor('white'), + QtGui.QColor('white')) + qGItem.dropped.emit() + # view.emit(QtCore.SIGNAL("dropped"), enzObj) + else: + enzObj = moose.MMenz(mobj.path + '/' + string_num) + enzinfo = moose.Annotator(enzObj.path + '/info') + moose.connect(mobj, "nOut", enzObj, "enzDest") + qGItem = kkitQGraphics.MMEnzItem(enzObj, parentcompt) + posWrtComp = pos + bgcolor = kkitUtil.getRandColor() + qGItem.setDisplayProperties(posWrtComp.x(), + posWrtComp.y() - 30, + QtGui.QColor('green'), bgcolor) + enzinfo.color = str(bgcolor.name()) + layoutPt.mooseId_GObj[enzObj] = qGItem + qGItem.dropped.emit() + # view.emit(QtCore.SIGNAL("dropped"), enzObj) + x, y = roundoff(qGItem.scenePos(), layoutPt) + enzinfo.x = x + enzinfo.y = y + kkitUtil.setupItem(modelpath.path, layoutPt.srcdesConnection) + layoutPt.drawLine_arrow(False) + + # Dropping is on compartment then update Compart size + if isinstance(enzparent, moose.ChemCompt): + updateCompartmentSize(parentcompt) + if view.iconScale != 1: + view.updateScale(view.iconScale) + +def createObj(scene, view, modelpath, string, pos, layoutPt): + logger_.debug( "Crating object %s, %s, %s" % (modelpath, string, str(pos))) + assert isinstance(view.sceneContainerPt, QGraphicsScene) + event_pos, num, ret_string = pos, 0, "" + pos = view.mapToScene(event_pos) + itemAt = view.sceneContainerPt.itemAt(float(pos.x()), float(pos.y()), QtGui.QTransform()) + logger_.debug( "\tItem At %s" % str(itemAt)) + moose.wildcardFind(modelpath + '/##[ISA=ChemCompt]') + moose.mooseDeleteChemSolver(modelpath) + mobj = None + + if itemAt is not None: + itemAtView = view.sceneContainerPt.itemAt(view.mapToScene(event_pos)) + itemClass = type(itemAtView).__name__ + if (itemClass == 'QGraphicsRectItem'): + mobj = itemAtView.parentItem().mobj + elif (itemClass == 'QGraphicsSvgItem'): + mobj = itemAtView.parent().mobj + else: + mobj = itemAtView.mobj + + if string == "CubeMesh" or string == "CylMesh": + ret_string, num = findUniqId(moose.element(modelpath), "Compartment", 0) + comptexist = moose.wildcardFind(modelpath + '/##[ISA=ChemCompt]') + if not len(comptexist): + if itemAt is not None: + QMessageBox.information( + None, 'Drop Not possible', + "'{}' currently single compartment model building is allowed" + .format(string), QMessageBox.Ok) + return False + else: + # create Rect here. + logger_.info("Mesh is not available") + mobj = moose.element(modelpath) + return True + else: + QMessageBox.information( + None, 'Drop Not possible', + "'{}' currently single compartment model building is allowed" .format(string) + , QMessageBox.Ok) + return False + + elif string == "Pool" or string == "BufPool" or string == "Reac" or string == "StimulusTable": + if itemAt == None: + QMessageBox.information( + None, 'Drop Not possible', + "'{}' has to have compartment as its parent".format(string), QMessageBox.Ok) + return False + else: + mobj = findCompartment(mobj) + ret_string, num = findUniqId(mobj, string, num) + return True + + elif string == "Function": + #mobj = findCompartment(mobj) + ret_string, num = findUniqId(mobj, string, num) + return True + elif string == "Enz" or string == "MMenz": + if itemAt != None: + if ((mobj).className != "Pool" and (mobj).className != "BufPool"): + QMessageBox.information( + None, 'Drop Not possible', + "'{}' has to have Pool as its parent".format(string), + QMessageBox.Ok) + return False + else: + ret_string, num = findUniqId(mobj, string, num) + return True + else: + QMessageBox.information( + None, 'Drop Not possible', + "'{}' has to have Pool as its parent".format(string), + QMessageBox.Ok) + return False + + if ret_string.strip(): + checkCreate(scene, view, modelpath, mobj, string, ret_string, num, + event_pos, layoutPt) + + +def roundoff(scenePos, layoutPt): + xtest = scenePos.x() / layoutPt.defaultScenewidth + xroundoff = round(xtest, 1) + + ytest = scenePos.y() / layoutPt.defaultSceneheight + yroundoff = round(ytest, 1) + + return (xroundoff, yroundoff) + + +def findUniqId(mobj, string, num): + if num == 0: + path = mobj.path + '/' + string + else: + path = mobj.path + '/' + string + str(num) + if not moose.exists(path): + return (string, num) + else: + num += 1 + return findUniqId(mobj, string, num) + +def findCompartment(mooseObj): + if mooseObj.path == '/': + return None + elif isinstance(mooseObj, kkitQGraphics.ChemCompt): + return (mooseObj) + else: + return findCompartment(moose.element(mooseObj.parent)) diff --git a/plugins/setsolver.py b/moosegui/plugins/setsolver.py similarity index 96% rename from plugins/setsolver.py rename to moosegui/plugins/setsolver.py index f55b067..f365898 100644 --- a/plugins/setsolver.py +++ b/moosegui/plugins/setsolver.py @@ -1,3 +1,5 @@ +from __future__ import print_function + import moose def deleteSolver(modelRoot): @@ -61,7 +63,7 @@ def setCompartmentSolver(modelRoot,solver): compts = moose.wildcardFind(modelRoot+'/##[ISA=ChemCompt]') if ( len(compts) > 3 ): - print "Warning: setSolverOnCompt Cannot handle " , + print("Warning: setSolverOnCompt Cannot handle ", end=' ') len(compts) , " chemical compartments\n" return; @@ -94,4 +96,4 @@ def setCompartmentSolver(modelRoot,solver): stoichList[1].buildXreacs (stoichList [2]) for i in stoichList: - i.filterXreacs() \ No newline at end of file + i.filterXreacs() diff --git a/plugins/test_plotwidget.py b/moosegui/plugins/test_plotwidget.py similarity index 96% rename from plugins/test_plotwidget.py rename to moosegui/plugins/test_plotwidget.py index 72c0a33..f2fbf4b 100644 --- a/plugins/test_plotwidget.py +++ b/moosegui/plugins/test_plotwidget.py @@ -47,15 +47,15 @@ import sys import os import numpy as np -from PyQt4 import QtGui, QtCore -from PyQt4.Qt import Qt +from PyQt5 import QtGui, QtCore +from PyQt5.Qt import Qt from matplotlib import mlab from matplotlib.figure import Figure from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar import unittest sys.path.append('..') -from default import PlotWidget +from .default import PlotWidget import moose import config diff --git a/scishell.py b/moosegui/scishell.py similarity index 96% rename from scishell.py rename to moosegui/scishell.py index a9a63de..95f349e 100644 --- a/scishell.py +++ b/moosegui/scishell.py @@ -27,10 +27,10 @@ import os, sys -from PyQt4 import QtCore, QtGui -from PyQt4.QtCore import Qt +from PyQt5 import QtCore, QtGui +from PyQt5.QtCore import Qt -from PyQt4.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs +from PyQt5.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs class History: """ Backup and restore history between sessions @@ -234,7 +234,7 @@ def paste(self): """ Reimplemented slot to handle the paste action. """ - lines = unicode(QApplication.clipboard().text()) + lines = str(QApplication.clipboard().text()) self.__executeLines(lines) @@ -242,7 +242,7 @@ def __middleMouseButton(self): """ Private method to handle the middle mouse button press. """ - lines = unicode(QApplication.clipboard().text(QClipboard.Selection)) + lines = str(QApplication.clipboard().text(QClipboard.Selection)) self.__executeLines(lines) @@ -338,7 +338,7 @@ def keyPressEvent(self, ev): if(ctrl): QsciScintilla.keyPressEvent(self, ev) - elif(self.keymap.has_key(key)): + elif(key in self.keymap): self.keymap[key]() # See it is text to insert. @@ -362,7 +362,7 @@ def __QScintillaTab(self): self.SendScintilla(QsciScintilla.SCI_TAB) elif self.__isCursorOnLastLine(): line, index = self.getCursorPosition() - buf = unicode(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") + buf = str(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") if self.more and not buf[:index-len(sys.ps2)].strip(): self.SendScintilla(QsciScintilla.SCI_TAB) @@ -427,7 +427,7 @@ def __QScintillaNewline(self): self.incrementalSearchActive = False line, col = self.__getEndPos() self.setCursorPosition(line,col) - buf = unicode(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") + buf = str(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") self.insert('\n') self.__executeCommand(buf) @@ -500,7 +500,7 @@ def __QScintillaLineUp(self): self.SendScintilla(QsciScintilla.SCI_LINEUP) else: line, col = self.__getEndPos() - buf = unicode(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") + buf = str(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") if buf and self.incrementalSearchActive: if self.incrementalSearchString: idx = self.__rsearchHistory(self.incrementalSearchString, @@ -530,7 +530,7 @@ def __QScintillaLineDown(self): self.SendScintilla(QsciScintilla.SCI_LINEDOWN) else: line, col = self.__getEndPos() - buf = unicode(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") + buf = str(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") if buf and self.incrementalSearchActive: if self.incrementalSearchString: idx = self.__searchHistory(self.incrementalSearchString, self.histidx) @@ -627,14 +627,14 @@ def __showDynCompletion(self): # get line line, col = self.__getEndPos() self.setCursorPosition(line,col) - buf = unicode(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") + buf = str(self.text(line)).replace(sys.ps1, "").replace(sys.ps2, "") text = buf.split()[-1][:-1] try: locals = self.interpreter.locals obj = eval(text, globals(), self.interpreter.locals) l = dir(obj) - l = filter(lambda x : not x.startswith('__'), l) + l = [x for x in l if not x.startswith('__')] self.__showCompletions(l, text) except : pass @@ -672,11 +672,11 @@ def __completionListSelected(self, id, txt): # Remove already written characters line, col = self.__getEndPos() self.setCursorPosition(line,col) - buf = unicode(self.text(line)) + buf = str(self.text(line)) ind = len(buf) - buf.rfind(".") - 1 if id == 1: - txt = unicode(txt[ind:]) + txt = str(txt[ind:]) #if self.completionText != "": # txt = txt.replace(self.completionText, "") self.__insertText(txt) diff --git a/shell.py b/moosegui/shell.py similarity index 93% rename from shell.py rename to moosegui/shell.py index 2eeafb5..b63dbcd 100644 --- a/shell.py +++ b/moosegui/shell.py @@ -1,24 +1,26 @@ # -*- python -*- # -# OpenAlea.Visualea: OpenAlea graphical user interface +# OpenAlea.Visualea: OpenAlea graphical user interface # -# Copyright 2006 INRIA - CIRAD - INRA +# Copyright 2006 INRIA - CIRAD - INRA # -# File author(s): Samuel Dufour-Kowalski -# Christophe Pradal +# File author(s): Samuel Dufour-Kowalski +# Christophe Pradal # -# Distributed under the CeCILL v2 License. -# See accompanying file LICENSE.txt or copy at -# http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +# Distributed under the CeCILL v2 License. +# See accompanying file LICENSE.txt or copy at +# http://www.cecill.info/licences/Licence_CeCILL_V2-en.html # -# OpenAlea WebSite : http://openalea.gforge.inria.fr +# OpenAlea WebSite : http://openalea.gforge.inria.fr # # Fri Mar 15 15:10:58 IST 2013: This file was obtained from: # http://obswww.unige.ch/~revaz/git/old.glups-4.0/glups/shell.py - +# Wednesday 12 June 2019 08:37:21 PM IST +# + Ported to Qt5 # Subhasis Ray __doc__=""" -This module implements a QT4 python interpreter widget. +This module implements a Qt5 python interpreter widget. It is inspired bu PyCute : http://gerard.vermeulen.free.fr """ @@ -26,11 +28,11 @@ __revision__=" $Id: shell.py 579 2007-06-13 10:27:57Z dufourko $" -import os, sys -from PyQt4 import QtCore, QtGui -from PyQt4.QtGui import QTextEdit, QTextCursor -from PyQt4.QtCore import Qt - +import os +import sys +from PyQt5.QtWidgets import QTextEdit +from PyQt5.QtGui import QTextCursor +from PyQt5 import QtCore, QtGui class History: """ Backup and restore history between sessions @@ -65,13 +67,10 @@ def get_shell_class(): # Test QScintilla try: - from scishell import SciShell + from .scishell import SciShell return SciShell - except ImportError: return PyCutExt - - class MultipleRedirection: """ Dummy file which redirects stream to multiple file """ @@ -123,7 +122,7 @@ def __init__(self, interpreter, message="", log='', parent=None): # to exit the main interpreter by a Ctrl-D if PyCute has no parent if parent is None: - self.eofKey = Qt.Key_D + self.eofKey = QtCore.Qt.Key_D else: self.eofKey = None @@ -134,7 +133,7 @@ def __init__(self, interpreter, message="", log='', parent=None): # last line + last incomplete lines - self.line = QtCore.QString() + self.line = "" self.lines = [] # the cursor position in the last line self.point = 0 @@ -268,7 +267,7 @@ def writelines(self, text): """ Simulate stdin, stdout, and stderr. """ - map(self.write, text) + list(map(self.write, text)) def fakeUser(self, lines): @@ -276,7 +275,7 @@ def fakeUser(self, lines): Simulate a user: lines is a sequence of strings, (Python statements). """ for line in lines: - self.line = QtCore.QString(line.rstrip()) + self.line = line.rstrip() self.write(self.line) self.write('\n') self.__run() @@ -291,12 +290,12 @@ def __run(self): (3) the interpreter fails, finds errors and writes them to sys.stderr """ self.pointer = 0 - self.history.append(QtCore.QString(self.line)) - self.H.append(QtCore.QString(self.line)) # Added by yr + self.history.append(self.line) + self.H.append(self.line) try: self.lines.append(str(self.line)) - except Exception,e: - print e + except Exception as e: + print(e) source = '\n'.join(self.lines) self.more = self.interpreter.runsource(source) diff --git a/moosegui/sidebar.py b/moosegui/sidebar.py new file mode 100644 index 0000000..cb42999 --- /dev/null +++ b/moosegui/sidebar.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- + +""" +Sidebar for plugins. The sidebar comprises of actions. +Currently mode, connect and settings are defined. +""" + +__author__ = "Aviral Goel" +__email__ = "goel.aviral@gmail.com" +__credits__ = ["NCBS Bangalore"] +__license__ = "GPL3" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh " +__status__ = "Development" + + +import sys +import os +from PyQt5.QtWidgets import QDialog +from PyQt5.QtWidgets import QHBoxLayout +from PyQt5.QtWidgets import QAction, QToolBar +from PyQt5.QtGui import QPixmap, QIcon + +from moosegui import SettingsDialog +from moosegui import config + +import logging +logger_ = logging.getLogger("sidebar") + +ICON_DIRECTORY = "../icons" +HAND_ICON_FILENAME = "hand.png" +CONNECTOR_ICON_FILENAME = "straight_connector_with_filled_circles.png" +WRENCH_ICON_FILENAME = "wrench.png" +DELETE_GRAPH_ICON_FILENAME = "add_graph.png" +ADD_GRAPH_ICON_FILENAME = "delete_graph.png" +LIST_ICON_FILENAME = "list.png" + + +def create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ): + pixmap = QPixmap(icon_path) + icon = QIcon(pixmap) + action = QAction(icon, text, parent) + action.triggered.connect(callback) + action.setCheckable(checkable) + action.setChecked(checked) + return action + +def do_nothing(event, msg): + logger_.debug( "do_nothing: %s" % msg ) + +def mode_action( parent + , callback = lambda ev: do_nothing(ev, "Action clicked") + , text = "Mode" + , checkable = True + , checked = True + , icon_path = os.path.join( ICON_DIRECTORY + , HAND_ICON_FILENAME + ) + ): + return create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ) + +def add_graph_action( parent + , callback = lambda event: do_nothing(event, "Add Graph Clicked!") + , text = "Add Graph" + , checkable = False + , checked = False + , icon_path = os.path.join( ICON_DIRECTORY + , ADD_GRAPH_ICON_FILENAME + ) + ): + return create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ) + +def delete_graph_action( parent + , callback = lambda event: do_nothing(event, "Delete Graph Clicked!") + , text = "Delete Graph" + , checkable = False + , checked = False + , icon_path = os.path.join( ICON_DIRECTORY + , DELETE_GRAPH_ICON_FILENAME + ) + ): + return create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ) + +def list_action( parent + , callback = lambda event: do_nothing(event, "List Clicked!") + , text = "Show List" + , checkable = False + , checked = False + , icon_path = os.path.join( ICON_DIRECTORY + , LIST_ICON_FILENAME + ) + ): + return create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ) + +def connector_action( parent + , callback = lambda event: do_nothing(event, "Connector Clicked!") + , text = "Mode" + , checkable = True + , checked = False + , icon_path = os.path.join( ICON_DIRECTORY , CONNECTOR_ICON_FILENAME) + ): + return create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ) + +def settings_action( parent + , callback = (lambda event: do_nothing(event, "Settings Clicked")) + , text = "Mode" + , checkable = False + , checked = False + , icon_path = os.path.join(ICON_DIRECTORY, WRENCH_ICON_FILENAME) + ): + return create_action( parent + , callback + , text + , checkable + , checked + , icon_path + ) + +def sidebar(): + return QToolBar() + + +def main(): + from PyQt5.QtWidgets import QApplication, QMainWindow + app = QApplication(sys.argv) + window = QMainWindow() + widget = SettingsDialog.SettingsWidget({ + 'LeakyIaF':['Vm'], + 'Compartment':['Vm','Im'], + 'HHChannel':['Ik','Gk'], + 'ZombiePool':['n','conc'], + 'ZombieBufPool':['n','conc'], + 'HHChannel2D':['Ik','Gk'], + 'CaConc':['Ca'] + }) + d = QDialog() + l = QHBoxLayout() + d.setLayout(l) + l.addWidget(widget) + bar = sidebar() + bar.addAction(mode_action(bar)) + bar.addAction(connector_action(bar)) + bar.addAction(settings_action(bar, d.show)) + window.addToolBar(bar) + window.show() + sys.exit(app.exec_()) + +if __name__ == "__main__": + main() diff --git a/utils.py b/moosegui/utils.py similarity index 90% rename from utils.py rename to moosegui/utils.py index 6873a9c..3687184 100644 --- a/utils.py +++ b/moosegui/utils.py @@ -47,7 +47,7 @@ import shutil import os -from PyQt4 import QtGui, QtCore +from PyQt5 import QtGui, QtCore def resizeWidthToContents(lineEdit): """Resize a QLineEdit object to fit its content.""" @@ -82,13 +82,13 @@ def copyTree(src, dst, progressDialog=None): dst = dst.strip() errors = [] if not os.access(src, os.R_OK + os.X_OK): - print 'Failed to access directory', src + print(('Failed to access directory', src)) return - print 'Copying %s to : %s' % (src, dst) + print(('Copying %s to : %s' % (src, dst))) if not os.access(src, os.R_OK + os.X_OK): try: os.makedirs(dst) - except OSError, e: + except OSError as e: # print e errors.append(e) totalsize = 0 @@ -97,7 +97,7 @@ def copyTree(src, dst, progressDialog=None): srcname = os.path.join(dirpath, fname) try: totalsize += os.path.getsize(srcname) - except OSError, e: + except OSError as e: # print e errors.append(e) if progressDialog: @@ -108,7 +108,7 @@ def copyTree(src, dst, progressDialog=None): # print 'Destination dir', dstdir, dirpath[len(src)+1:] try: os.makedirs(dstdir) - except OSError, e: + except OSError as e: # print e errors.append(e) # print 'Copying files from %s to %s' % (dirpath, dstdir) @@ -118,7 +118,7 @@ def copyTree(src, dst, progressDialog=None): # print 'Copying:', srcname, 'to', dstname try: shutil.copy2(srcname, dstname) - except IOError, e: + except IOError as e: # print e errors.append(e) size += os.path.getsize(srcname) @@ -127,11 +127,11 @@ def copyTree(src, dst, progressDialog=None): if progressDialog.wasCanceled(): return errors else: - print 'Copied %d bytes of %d.' % (size, totalsize) + print(('Copied %d bytes of %d.' % (size, totalsize))) if progressDialog: progressDialog.close() else: - print 'Finished.' + print('Finished.') return errors diff --git a/newmodeldialog.py b/newmodeldialog.py deleted file mode 100644 index 6b5bf80..0000000 --- a/newmodeldialog.py +++ /dev/null @@ -1,71 +0,0 @@ -import os -from PyQt4 import QtGui, QtCore,Qt -import config -from mplugin import MoosePluginBase, EditorBase, EditorWidgetBase, PlotBase, RunBase -import re - -class DialogWidget(QtGui.QDialog): - def __init__(self,parent=None): - QtGui.QWidget.__init__(self, parent) - self.warning = None - self._currentRadioButton ="kkit" - self.layout = QtGui.QGridLayout() - self.modelPathLabel = QtGui.QLabel('Model Name') - self.modelPathEdit = QtGui.QLineEdit('') - self.layout.addWidget(self.modelPathLabel, 0, 0) - self.layout.addWidget(self.modelPathEdit, 0, 1,1,1) - # self.defaultRadio = QtGui.QRadioButton('default') - # #self.defaultRadio.setChecked(True); - # self.kkitRadio = QtGui.QRadioButton('kkit') - # self.kkitRadio.setChecked(True) - # self.defaultRadio.toggled.connect(lambda : self.setcurrentRadioButton('default')) - # self.kkitRadio.toggled.connect(lambda : self.setcurrentRadioButton('kkit')) - # layout.addWidget(self.defaultRadio,2,1) - # layout.addWidget(self.kkitRadio,2,0) - self.hbox = QtGui.QHBoxLayout() - self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok) - self.connect(self.buttonBox, QtCore.SIGNAL('accepted()'), self.validateAccept) - self.hbox.addWidget(self.buttonBox,1) - - self.buttonBox1 = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel) - self.connect(self.buttonBox1, QtCore.SIGNAL('rejected()'), self.Cancel) - self.hbox.addWidget(self.buttonBox1,0) - #self.hbox.setBackgroundColor(Blue) - #self.modelPathEdit.returnPressed.connect(self.validateAccept) - # self.connect(self.buttonBox, QtCore.SIGNAL('rejected()'), self.reject) - #self.hbox.addStretch(1) - self.layout.addLayout(self.hbox,1,1) - self.setLayout(self.layout) - - def Cancel (self): - self.close() - - def validateAccept(self): - text = str(self.modelPathEdit.text()) - self.layout.removeWidget(self.warning) - #replace / to _ - text = text.replace('/','_') - - #print(self.layout.widgets()) - if len(text) == 0: - self.warning = QtGui.QLabel("Model name cannot be empty!") - self.layout.addWidget(self.warning, 1, 0, 1, -1) - elif not re.match("^[a-zA-Z]+.*",text): - self.warning = QtGui.QLabel("Start special characters not allowed!") - self.layout.addWidget(self.warning, 1, 0, 1, -1) - else: - self.accept() - return False - - def getcurrentRadioButton(self): - return self._currentRadioButton - -if __name__ == '__main__': - app =QtGui.QApplication([]) - widget = DialogWidget() - widget.setWindowTitle('New Model') - widget.setMinimumSize(400, 200) - widget.show() - app.exec_() - - diff --git a/objectedit.py b/objectedit.py deleted file mode 100644 index 11a35b6..0000000 --- a/objectedit.py +++ /dev/null @@ -1,553 +0,0 @@ -# objectedit.py --- -# -# Filename: objectedit.py -# Description: -# Author: Subhasis Ray -# Maintainer: -# Created: Wed Jun 30 11:18:34 2010 (+0530) -# Version: -# Last-Updated: Fri Feb 01 11:05:59 2017 (+0530) -# By: Harsha -# Update #: -# URL: -# Keywords: -# Compatibility: -# -# - -# Commentary: -# -# This code is for a widget to edit MOOSE objects. We can now track if -# a field is a Value field and make it editable accordingly. There -# seems to be no clean way of determining whether the field is worth -# plotting (without a knowledge of the model/biology there is no way -# we can tell this). But we can of course check if the field is a -# numeric one. -# -# - -# Change log: -# -# Wed Jun 30 11:18:34 2010 (+0530) - Originally created by Subhasis -# Ray, the model and the view -# -# Modified/adapted to dh_branch by Chaitanya/Harsharani -# -# Thu Apr 18 18:37:31 IST 2013 - Reintroduced into multiscale GUI by -# Subhasis -# -# Fri Apr 19 15:05:53 IST 2013 - Subhasis added undo redo -# feature. Create ObjectEditModel as part of ObjectEditView. -# Tue Mar 7 16:10:54 IST 2017 - Harsha now Pool or BufPool can be interchangable -# by setting/unsetting isbuffered field -# Fri May 17 23:45:59 2017 (+0530) - Harsha added, notes header, -# Kd is calculated for the second order reaction and value is displayed -# Tue Jun 18 12:10:54 IST 2018 - Harsha now group boundary color can be editable from the object editor -# Mon Sep 10 16:21:00 IST 2018 - When name is edited, the editorTitle gets updated -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth -# Floor, Boston, MA 02110-1301, USA. -# -# - -# Code: -import PyQt4 -from PyQt4 import QtCore -from PyQt4 import QtGui -from PyQt4.QtGui import QTextEdit -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QVBoxLayout -from PyQt4.QtGui import QSizePolicy -from PyQt4.QtCore import QMargins -from PyQt4.QtGui import QSplitter -import sys -from collections import deque -import traceback - -#sys.path.append('../python') -import moose -import defaults -import config -#from plugins.kkitUtil import getColor -from moose.chemUtil.chemConnectUtil import getColor - -#these fields will be ignored -extra_fields = ['this', - 'me', - 'parent', - 'path', - 'children', - 'linearSize', - 'objectDimensions', - 'lastDimension', - 'localNumField', - 'pathIndices', - 'msgOut', - 'msgIn', - 'diffConst', - 'speciesId', - 'Coordinates', - 'neighbors', - 'DiffusionArea', - 'DiffusionScaling', - 'x', - 'x0', - 'x1', - 'dx', - 'nx', - 'y', - 'y0', - 'y1', - 'dy', - 'ny', - 'z', - 'z0', - 'z1', - 'dz', - 'nz', - 'coords', - 'isToroid', - 'preserveNumEntries', - # 'numKm', - 'numSubstrates', - 'concK1', - 'meshToSpace', - 'spaceToMesh', - 'surface', - 'method', - 'alwaysDiffuse', - 'numData', - 'numField', - 'valueFields', - 'sourceFields', - 'motorConst', - 'destFields', - 'dt', - 'tick', - 'idValue', - 'index', - 'fieldIndex' - ] - - -class ObjectEditModel(QtCore.QAbstractTableModel): - """Model class for editing MOOSE elements. This is not to be used - directly, except that its undo and redo slots should be connected - to by the GUI actions for the same. - - SIGNALS: - - objectNameChanged(PyQt_PyObject): when a moose object's name is - changed, this signal is emitted with the object as argument. This - can be captured by widgets that display the object name. - - dataChanged: emitted when any data is changed in the moose object - - """ - objectNameChanged = QtCore.pyqtSignal('PyQt_PyObject') - # dataChanged = QtCore.pyqtSignal('PyQt_PyObject') - def __init__(self, datain, headerdata=['Field','Value'], undolen=100, parent=None, *args): - QtCore.QAbstractTableModel.__init__(self, parent, *args) - self.fieldFlags = {} - self.fields = [] - self.mooseObject = datain - self.headerdata = headerdata - self.undoStack = deque(maxlen=undolen) - self.redoStack = deque(maxlen=undolen) - self.checkState_ = False - - for fieldName in self.mooseObject.getFieldNames('valueFinfo'): - if fieldName in extra_fields : - continue - - value = self.mooseObject.getField(fieldName) - self.fields.append(fieldName) - #harsha: For signalling models will be pulling out notes field from Annotator - # can updates if exist for other types also - if (isinstance (self.mooseObject,moose.ChemCompt) or \ - isinstance(self.mooseObject,moose.ReacBase) or \ - isinstance(moose.element(moose.element(self.mooseObject).parent),moose.EnzBase) \ - ): - pass - else: - self.fields.append("Color") - - flag = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable - self.fieldFlags[fieldName] = flag - - if ( isinstance(self.mooseObject, moose.ReacBase) ) : - self.fields.append("Kd") - flag = QtCore.Qt.ItemIsEnabled - self.fieldFlags[fieldName] = flag - - def rowCount(self, parent): - return len(self.fields) - - def columnCount(self, parent): - return len(self.headerdata) - - def setData(self, index, value, role=QtCore.Qt.EditRole): - if not index.isValid() or index.row () >= len(self.fields) or index.column() != 1: - return False - field = self.fields[index.row()] - if (role == QtCore.Qt.CheckStateRole): - if (index.column() == 1): - self.checkState_ = value - return True - - else: - value = str(value.toString()).strip() # convert Qt datastructure to Python string - if len(value) == 0: - return False - if field == "Notes": - field = "notes" - ann = moose.Annotator(self.mooseObject.path+'/info') - oldValue = ann.getField(field) - value = type(oldValue)(value) - ann.setField(field,value) - self.undoStack.append((index,oldValue)) - elif field == "vector": - for ch in ['[',']']: - if ch in value: - value = value.replace(ch," ") - value = value.replace(",", " ") - valuelist = [] - if value.find(',') != -1: - valuelist = value.split(",") - elif value.find(' ') != -1: - valuelist = value.split(" ") - else: - valuelist = value - vectorlist = [] - for d in valuelist: - try: - float(d) - vectorlist.append(float(d)) - except: - pass - from numpy import array - a = array( vectorlist ) - self.mooseObject.setField(field, a) - - else: - oldValue = self.mooseObject.getField(field) - if field != "isBuffered": - value = type(oldValue)(value) - self.mooseObject.setField(field, value) - else: - if self.mooseObject.className == "ZombiePool" or self.mooseObject.className =="ZombieBufPool": - QtGui.QMessageBox.warning(None,'Solver is set, Could not set the value','\n Unset the solver by clicking \n run widget -> Preferences -> Exponential Euler->Apply') - else: - if value.lower() in ("yes", "true", "t", "1"): - self.mooseObject.setField(field, True) - else: - self.mooseObject.setField(field, False) - self.undoStack.append((index, oldValue)) - if field == 'name': - self.emit(QtCore.SIGNAL('objectNameChanged(PyQt_PyObject)'), self.mooseObject) - return True - - self.dataChanged.emit(index, index) - return True - - def undo(self): - print ('Undo') - if len(self.undoStack) == 0: - raise Info('No more undo information') - index, oldvalue, = self.undoStack.pop() - field = self.fields[index.row()] - currentvalue = self.mooseObject.getField(field) - oldvalue = type(currentvalue)(oldvalue) - self.redoStack.append((index, str(currentvalue))) - self.mooseObject.setField(field, oldvalue) - if field == 'name': - self.objectNameChanged.emit(self.mooseObject) - self.emit(QtCore.SIGNAL('dataChanged(const QModelIndex&, const QModelIndex&)'), index, index) - - def redo(self): - if len(self.redoStack) ==0: - raise Info('No more redo information') - index, oldvalue, = self.redoStack.pop() - currentvalue = self.mooseObject.getField(self.fields[index.row()]) - self.undoStack.append((index, str(currentvalue))) - self.mooseObject.setField(self.fields[index.row()], type(currentvalue)(oldvalue)) - if field == 'name': - self.emit(QtCore.SIGNAL('objectNameChanged(PyQt_PyObject)'), self.mooseObject) - self.emit(QtCore.SIGNAL('dataChanged(const QModelIndex&, const QModelIndex&)'), index, index) - - def flags(self, index): - flag = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable - #flag = QtCore.Qt.NoItemFlags - if not index.isValid(): - return None - # Replacing the `outrageous` up stuff with something sensible - field = self.fields[index.row()] - newstr = field[0] - newstr = newstr.upper() - field_string = newstr + field[1:] - setter = 'set%s' %(field_string) - #setter = 'set_%s' % (self.fields[index.row()]) - #print " from Object setter",setter, "object",self.mooseObject, " ",self.mooseObject.getFieldNames('destFinfo'); - if index.column() == 1: - # if field == "Color": - # flag = QtCore.Qt.ItemIsEnabled - if field == "Notes": - ann = moose.Annotator(self.mooseObject.path+'/info') - if setter in ann.getFieldNames('destFinfo'): - flag |= QtCore.Qt.ItemIsEditable - - if isinstance(self.mooseObject, moose.PoolBase) or isinstance(self.mooseObject,moose.Function): - if field == 'volume' or field == 'expr': - pass - elif setter in self.mooseObject.getFieldNames('destFinfo'): - flag |= QtCore.Qt.ItemIsEditable - else: - if setter in self.mooseObject.getFieldNames('destFinfo'): - flag |= QtCore.Qt.ItemIsEditable - - #if field == "Notes": - # flag |= QtCore.Qt.ItemIsEditable - - # !! Replaced till here - - return flag - - def data(self, index, role): - ret = None - field = self.fields[index.row()] - if index.column() == 0 and role == QtCore.Qt.DisplayRole: - try: - ret = QtCore.QVariant(QtCore.QString(field)+' ('+defaults.FIELD_UNITS[field]+')') - except KeyError: - ret = QtCore.QVariant(QtCore.QString(field)) - elif index.column() == 1: - if role==QtCore.Qt.CheckStateRole: - if ((str(field) == "plot Conc") or (str(field) == "plot n") ): - # print index.data(QtCore.Qt. ), str(field) - return self.checkState_ - elif (role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole): - try: - if (str(field) =="Color" ): - return QtGui.QPushButton("Press Me!") - if (str(field) =="Kd" ): - #ret = self.mooseObject.getField(str(field)) - Kd = 0 - - if self.mooseObject.className == "ZombieReac" or self.mooseObject.className == "Reac": - if self.mooseObject.numSubstrates > 1 or self.mooseObject.numProducts > 1: - if self.mooseObject.Kf != 0: - Kd = self.mooseObject.Kb/self.mooseObject.Kf - - #Kd = QtCore.QVariant(QtCore.QString(str(ret))) - ret = QtCore.QVariant(QtCore.QString(str(Kd))) - if ( (str(field) != "Notes") and (str(field) != "className") and (str(field) != "Kd")): - ret = self.mooseObject.getField(str(field)) - ret = QtCore.QVariant(QtCore.QString(str(ret))) - elif(str(field) == "className"): - ret = self.mooseObject.getField(str(field)) - if 'Zombie' in ret: - ret = ret.split('Zombie')[1] - ret = QtCore.QVariant(QtCore.QString(str(ret))) - elif(str(field) == "Notes"): - astr = self.mooseObject.path+'/info' - mastr = moose.Annotator(astr) - ret = (mastr).getField(str('notes')) - ret = QtCore.QVariant(QtCore.QString(str(ret))) - except ValueError: - ret = None - return ret - - def headerData(self, col, orientation, role): - if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: - return QtCore.QVariant(self.headerdata[col]) - return QtCore.QVariant() - -class ObjectEditView(QtGui.QTableView): - """View class for object editor. - - This class creates an instance of ObjectEditModel using the moose - element passed as its first argument. - - undolen - specifies the size of the undo stack. By default set to - OBJECT_EDIT_UNDO_LENGTH constant in defaults.py. Specify something smaller if - large number of objects are likely to be edited. - - To enable undo/redo conect the corresponding actions from the gui - to view.model().undo and view.model().redo slots. - """ - def __init__(self, mobject, undolen=defaults.OBJECT_EDIT_UNDO_LENGTH, parent=None): - QtGui.QTableView.__init__(self, parent) - #self.setEditTriggers(self.DoubleClicked | self.SelectedClicked | self.EditKeyPressed) - vh = self.verticalHeader() - vh.setVisible(False) - hh = self.horizontalHeader() - hh.setStretchLastSection(True) - self.setAlternatingRowColors(True) - self.resizeColumnsToContents() - self.setModel(ObjectEditModel(mobject, undolen=undolen)) - self.colorButton = QtGui.QPushButton() - self.colorDialog = QtGui.QColorDialog() - self.textEdit = QTextEdit() - try: - notesIndex = self.model().fields.index("Notes") - self.setIndexWidget(self.model().index(notesIndex,1), self.textEdit) - info = moose.Annotator(self.model().mooseObject.path+'/info') - self.textEdit.setText(QtCore.QString(info.getField('notes'))) - self.setRowHeight(notesIndex, self.rowHeight(notesIndex) * 3) - - # self.colorDialog.colorSelected.connect( - # lambda color: - # - # self.setColor(getColor(self.model().mooseObject.path+'/info')[1]) - except: - pass - - - try: - colorIndex = self.model().fields.index("Color") - self.colorButton.clicked.connect(self.colorDialog.show) - self.colorButton.setFocusPolicy(PyQt4.QtCore.Qt.NoFocus) - self.colorDialog.colorSelected.connect( - lambda color: self.colorButton.setStyleSheet( - "QPushButton {" - + "background-color: {0}; color: {0};".format(color.name()) - + "}" - ) - ) - self.setIndexWidget(self.model().index(colorIndex,1), self.colorButton) - # self.colorDialog.colorSelected.connect( - # lambda color: - # - self.setColor(getColor(self.model().mooseObject.path+'/info')[1]) - except: - pass - print ('Created view with %s' %(mobject)) - - def setColor(self, color): - self.colorButton.setStyleSheet( - "QPushButton {" - + "background-color: {0}; color: {0};".format(color) - + "}" - ) - self.colorDialog.setCurrentColor(color) - - def dataChanged(self, tl, br): - QtGui.QTableView.dataChanged(self, tl, br) - self.viewport().update() - -class ObjectEditDockWidget(QtGui.QDockWidget): - """A dock widget whose title is set by the current moose - object. Allows switching the moose object. It stores the created - view in a dict for future use. - - TODO possible performance issue: storing the views (along with - their models) ensures the undo history for each object is - retained. But without a limit on the number of views stored, it - will be wasteful on memory. - - """ - objectNameChanged = QtCore.pyqtSignal('PyQt_PyObject') - colorChanged = QtCore.pyqtSignal(object, object) - def __init__(self, mobj='/', parent=None, flags=None): - QtGui.QDockWidget.__init__(self, parent=parent) - mobj = moose.element(mobj) - #self.view = view = ObjectEditView(mobj) - self.view = view = ObjectEditView(mobj) - self.view_dict = {mobj: view} - base = QWidget() - layout = QVBoxLayout() - base.setLayout(layout) - layout.addWidget(self.view) - layout.addWidget(QTextEdit()) - self.setWidget(base) - self.setWindowTitle('Edit: %s' % (mobj.path)) - # self.view.colorDialog.colorSelected.connect(self.colorChangedEmit) - - # def clearDict(self): - # self.view_dict.clear() - - def setObject(self, mobj): - element = moose.element(mobj) - try: - view = self.view_dict[element] - except KeyError: - view = ObjectEditView(element) - self.view_dict[element] = view - view.model().objectNameChanged.connect(self.emitObjectNameChanged) - view.colorDialog.colorSelected.connect(lambda color: self.colorChanged.emit(element, color)) - textEdit = QTextEdit() - view.setSizePolicy( QSizePolicy.Ignored - , QSizePolicy.Ignored - ) - textEdit.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) - base = QSplitter() - base.setOrientation(PyQt4.QtCore.Qt.Vertical) - layout = QVBoxLayout() - layout.addWidget(view)#, 0, 0) - lineedit = QtGui.QLineEdit("Notes:") - lineedit.setReadOnly(True) - layout.addWidget(lineedit) - - if ( isinstance(mobj, moose.PoolBase) - or isinstance(mobj,moose.ReacBase) - or isinstance(mobj,moose.EnzBase) - ) : - info = moose.Annotator(mobj.path +'/info') - textEdit.setText(QtCore.QString(info.getField('notes'))) - textEdit.textChanged.connect(lambda : info.setField('notes', str(textEdit.toPlainText()))) - layout.addWidget(textEdit)#,1,0) - - # self.setRowHeight(notesIndex, self.rowHeight(notesIndex) * 3) - base.setLayout(layout) - # base.setSizes( [ view.height() - # , base.height() - view.height() - # ] - # ) - # print("a =>", view.height()) - # print("b =>", base.height()) - - - # layout.setStretch(0,3) - # layout.setStretch(1,1) - # layout.setContentsMargins(QMargins(0,0,0,0)) - self.setWidget(base) - self.setWindowTitle('Edit: %s' % (element.path)) - view.update() - - def emitObjectNameChanged(self, mobj): - self.objectNameChanged.emit(mobj) - self.setWindowTitle('Edit:%s'%(mobj.path)) -def main(): - app = QtGui.QApplication(sys.argv) - mainwin = QtGui.QMainWindow() - c = moose.Compartment("test") - view = ObjectEditView(c, undolen=3) - mainwin.setCentralWidget(view) - action = QtGui.QAction('Undo', mainwin) - action.setShortcut('Ctrl+z') - action.triggered.connect(view.model().undo) - mainwin.menuBar().addAction(action) - action = QtGui.QAction('Redo', mainwin) - action.setShortcut('Ctrl+y') - action.triggered.connect(view.model().redo) - mainwin.menuBar().addAction(action) - mainwin.show() - sys.exit(app.exec_()) - - -if __name__ == "__main__": - main() -# ojectedit.py ends here diff --git a/plugins/constants.py b/plugins/constants.py deleted file mode 100644 index 3596f2c..0000000 --- a/plugins/constants.py +++ /dev/null @@ -1,24 +0,0 @@ -INVALID = 6 - -INTERIOR = 7 -BOUNDARY = 8 - -SAME_OBJECT = 9 -OTHER_OBJECT = 10 -NO_OBJECT = 11 - -RUBBERBAND_SELECTION = 12 -VALID = 13 - -ITEM = 0 -CONNECTOR = 1 -CONNECTION = 2 -EMPTY = 3 - -COMPARTMENT = 14 -COMPARTMENT_BOUNDARY = 4 -COMPARTMENT_INTERIOR = 5 - -GROUP = 15 -GROUP_BOUNDARY = 16 -GROUP_INTERIOR = 17 diff --git a/plugins/kkit.py b/plugins/kkit.py deleted file mode 100644 index c375e06..0000000 --- a/plugins/kkit.py +++ /dev/null @@ -1,1228 +0,0 @@ - -__author__ = "HarshaRani" -__credits__ = ["Upi Lab"] -__license__ = "GPL3" -__version__ = "1.0.0" -__maintainer__ = "HarshaRani" -__email__ = "hrani@ncbs.res.in" -__status__ = "Development" -__updated__ = "Feb 22 2019" - -#Change log: -#2019 -#Feb 22: cross compartment molecules are checked for destination -# 2018 -#Oct 26: xfer cross compartment molecules are hidden and for cross compartment reaction's -# connection are now dotted line -#Oct 10: filedialog default is sbml -# layout co-ordainates are updated with scenepos -#Sep 11: comparment size is calculated based on group sceneBoundingRect size -#Sep 07: in positionChange all the group's boundingRect is calculated -# and when group is moved the children's position are stored -#Jun 18: update the color of the group from objecteditor -#code - -import math -import sys -from PyQt4 import QtGui, QtCore, Qt -from default import * -from moose import * -from moose import SBML -from moose.genesis.writeKkit import mooseWriteKkit -from mplugin import * -from kkitUtil import * -from kkitQGraphics import * -from kkitViewcontrol import * -from kkitCalcArrow import * -from kkitOrdinateUtil import * -import posixpath -from mtoolbutton import MToolButton -from PyQt4.QtGui import QWidget -from PyQt4.QtGui import QGridLayout -from PyQt4.QtGui import QColor -import RunWidget -from os.path import expanduser -#from setsolver import * -from moose.chemUtil.add_Delete_ChemicalSolver import * -import re - -class KkitPlugin(MoosePlugin): - """Default plugin for MOOSE GUI""" - def __init__(self, *args): - #print args - MoosePlugin.__init__(self, *args) - self.view = None - #self.plotView = PlotView(self) - #self.getRunView() - #self.plotView.dataTable = self.view._centralWidget.dataTable - #self.plotView.updateCallback = self.view._centralWidget.legendUpdate - #self.view._centralWidget.legendUpdate() - #self.dataTable = DataTable(self.dataRoot) - self.fileinsertMenu = QtGui.QMenu('&File') - if not hasattr(self,'SaveModelAction'): - #self.fileinsertMenu.addSeparator() - self.saveModelAction = QtGui.QAction('Save', self) - self.saveModelAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+S", None, QtGui.QApplication.UnicodeUTF8)) - self.connect(self.saveModelAction, QtCore.SIGNAL('triggered()'), self.SaveModelDialogSlot) - self.fileinsertMenu.addAction(self.saveModelAction) - self._menus.append(self.fileinsertMenu) - self.getEditorView() - - def SaveModelDialogSlot(self): - - dirpath = "" - if not dirpath: - dirpath = expanduser("~") - filters = {'SBML(*.xml)': 'SBML','Genesis(*.g)':'Genesis'} - #filename,filter_ = QtGui.QFileDialog.getSaveFileNameAndFilter(None,'Save File',dirpath,';;'.join(filters)) - filename,filter_ = QtGui.QFileDialog.getSaveFileNameAndFilter(None,'Save File',dirpath,"SBML(*.xml);;Genesis(*.g)") - extension = "" - if str(filename).rfind('.') != -1: - filename = filename[:str(filename).rfind('.')] - if str(filter_).rfind('.') != -1: - extension = filter_[str(filter_).rfind('.'):len(filter_)-1] - - if filename: - filename = filename - if filters[str(filter_)] == 'SBML': - self.coOrdinates = {} - self.plugin = KkitEditorView(self).getCentralWidget().plugin - self.coOrdinates = KkitEditorView(self).getCentralWidget().getsceneCord() - #writeerror = moose.writeSBML(self.modelRoot,str(filename),self.coOrdinates) - writeerror = -2 - conisitencyMessages = "" - writtentofile = "/test.xml" - writeerror,consistencyMessages,writtentofile = moose.SBML.mooseWriteSBML(self.modelRoot,str(filename),self.coOrdinates) - if writeerror == -2: - #QtGui.QMessageBox.warning(None,'Could not save the Model','\n WriteSBML : This copy of MOOSE has not been compiled with SBML writing support.') - QtGui.QMessageBox.warning(None,'Could not save the Model',consistencyMessages) - elif writeerror == -1: - QtGui.QMessageBox.warning(None,'Could not save the Model','\n This model is not valid SBML Model, failed in the consistency check') - elif writeerror == 1: - QtGui.QMessageBox.information(None,'Saved the Model','\n File saved to \'{filename}\''.format(filename =filename+'.xml'),QtGui.QMessageBox.Ok) - elif writeerror == 0: - QtGui.QMessageBox.information(None,'Could not save the Model','\nThe filename could not be opened for writing') - - elif filters[str(filter_)] == 'Genesis': - mdtype = moose.Annotator(self.modelRoot+'/info') - self.coOrdinates = {} - ss = KkitEditorView(self).getCentralWidget().mooseId_GObj - for k,v in ss.items(): - if moose.exists(moose.element(k).path+'/info'): - annoInfo = Annotator(k.path+'/info') - #co-ordinates will be in decimals converting to int which should be b/w 0 to 10 - x = annoInfo.x * 10 - y = -annoInfo.y * 10 - self.coOrdinates[k] = {'x':x, 'y':y} - - error,written = mooseWriteKkit(self.modelRoot,str(filename),self.coOrdinates) - if written == False: - QtGui.QMessageBox.information(None,'Could not save the Model','\nCheck the file') - else: - if error == "": - QtGui.QMessageBox.information(None,'Saved the Model','\n File saved to \'{filename}\''.format(filename =filename+'.g'),QtGui.QMessageBox.Ok) - else: - status = QtCore.QString("File saved but %2").arg(error); - QtGui.QMessageBox.information(None,'Saved the Model but ...','{error}'.format(error=error),QtGui.QMessageBox.Ok) - - def getPreviousPlugin(self): - return None - - def getNextPlugin(self): - return None - - def getAdjacentPlugins(self): - return [] - - def getViews(self): - return self._views - - def getCurrentView(self): - return self.currentView - - def getEditorView(self): - if not hasattr(self, 'editorView'): - #self.editorView = KkitEditorView(self, self.dataTable) - self.editorView = KkitEditorView(self) - self.editorView.getCentralWidget().editObject.connect(self.mainWindow.objectEditSlot) - #self.editorView.GrViewresize(self) - #self.editorView.connect(self,QtCore.SIGNAL("resize(QResizeEvent)"),self.editorView.GrViewresize) - self.currentView = self.editorView - return self.editorView - - def getRunView(self): - if self.view is None: - self.view = AnotherKkitRunView(self.modelRoot, self) - return self.view - - - if self.view is not None: return AnotherKkitRunView(self.modelRoot, self) - if self.view is not None: return self.view - self.view = RunView(self.modelRoot, self) - graphView = self.view._centralWidget - graphView.setDataRoot(self.modelRoot) - graphView.plotAllData() - schedulingDockWidget = self.view.getSchedulingDockWidget().widget() - self._kkitWidget = self.view.plugin.getEditorView().getCentralWidget() - #self.runView = KkitRunView(self,self.dataTable) - self.runView = KkitRunView(self, self._kkitWidget) - self.currentRunView = self.ruAnotherKkitRunViewnView.getCentralWidget() - - #schedulingDockWidget.runner.update.connect(self.currentRunView.changeBgSize) - #schedulingDockWidget.runner.resetAndRun.connect(self.currentRunView.resetColor) - graphView.layout().addWidget(self.currentRunView,0,0,2,1) - return self.view - -class AnotherKkitRunView(RunView): - - def __init__(self, modelRoot, plugin,*args): - RunView.__init__(self, modelRoot, plugin, *args) - self.modelRoot = modelRoot - self.plugin = plugin - self.schedular = None - - def setSolverFromSettings(self, chemicalSettings): - self.setSolver(self.modelRoot, - chemicalSettings["simulation"]["solver"]) - - def createCentralWidget(self): - self._centralWidget = RunWidget.RunWidget(self.modelRoot) - self.kkitRunView = KkitRunView(self.plugin) - self.plotWidgetContainer = PlotWidgetContainer(self.modelRoot) - self._centralWidget.setChildWidget(self.kkitRunView.getCentralWidget(), False, 0, 0, 1, 1) - self._centralWidget.setChildWidget(self.plotWidgetContainer, False, 0, 1, 1, 2) - self._centralWidget.setPlotWidgetContainer(self.plotWidgetContainer) - self.schedular = self.getSchedulingDockWidget().widget() - self.schedular.runner.simulationProgressed.connect(self.kkitRunView.getCentralWidget().updateValue) - self.schedular.runner.simulationProgressed.connect(self.kkitRunView.getCentralWidget().changeBgSize) - self.schedular.runner.simulationReset.connect(self.kkitRunView.getCentralWidget().resetColor) - # self.schedular.runner.simulationReset.connect(self.setSolver) - self.schedular.preferences.applyChemicalSettings.connect(self.setSolverFromSettings) - compt = moose.wildcardFind(self.modelRoot+'/##[ISA=ChemCompt]') - ann = moose.Annotator(self.modelRoot+'/info') - if compt: - #self.runTime = (moose.Annotator(self.modelRoot+'/info')).runtime - #solver = (moose.Annotator(self.modelRoot+'/info')).solver - self.runTime = moose.element(ann).runtime - solver = moose.element(ann).solver - else: - self.runTime = 100 - solver = "gsl" - self.schedular.simulationRuntime.setText(str(self.runTime)) - #preferences - chemprefs = self.schedular.preferences.getChemicalPreferences() - c = moose.Clock('/clock') - self.simulationdt = c.tickDt[11] - self.plotdt = c.tickDt[18] - chemprefs["simulation"]["simulation-dt"] = self.simulationdt - chemprefs["simulation"]["plot-update-interval"] = self.plotdt - chemprefs["simulation"]["gui-update-interval"] = 2 * self.plotdt - chemprefs["simulation"]["solver"] = "Runge Kutta" - if solver == "gsl": - chemprefs["simulation"]["solver"] = "Runge Kutta" - elif solver == "gssa": - chemprefs["simulation"]["solver"] = "Gillespie" - elif solver == "ee" or solver == " ": - chemprefs["simulation"]["solver"] = "Exponential Euler" - else: - chemprefs["simulation"]["solver"] = "Runge Kutta" - self.schedular.preferences.setChemicalPreferences() - return self._centralWidget - - def setSolver(self, modelRoot,solver = None): - if solver == None: - reinit = mooseAddChemSolver(modelRoot,self.getSchedulingDockWidget().widget().solver) - if reinit: - self.getSchedulingDockWidget().widget().resetSimulation() - else: - reinit = mooseAddChemSolver(modelRoot,solver) - if reinit: - self.getSchedulingDockWidget().widget().resetSimulation() - - #self.kkitRunView.getCentralWidget().addSolver(solver) - - def getCentralWidget(self): - if self._centralWidget is None: - self.createCentralWidget() - return self._centralWidget - -class KkitRunView(MooseEditorView): - - #def __init__(self, plugin,dataTable): - def __init__(self, plugin): - MooseEditorView.__init__(self, plugin) - #self.dataTable =dataTable - self.plugin = plugin - ''' - def getToolPanes(self): - return super(KkitRunView, self).getToolPanes() - - def getLibraryPane(self): - return super(KkitRunView, self).getLibraryPane() - - def getOperationsWidget(self): - return super(KkitRunView, self).getOperationsPane() - - def getToolBars(self): - return self._toolBars - ''' - def getCentralWidget(self): - if self._centralWidget is None: - self._centralWidget = kineticRunWidget(self.plugin) - self._centralWidget.editor = self.plugin.editorView - # self._centralWidget.view.objectSelected.connect(self.plugin.mainWindow.objectEditSlot) - self._centralWidget.setModelRoot(self.plugin.modelRoot) - return self._centralWidget - -class KkitEditorView(MooseEditorView): - #def __init__(self, plugin, dataTable): - def __init__(self, plugin): - MooseEditorView.__init__(self, plugin) - ''' EditorView ''' - #self.dataTable = dataTable - #self.fileinsertMenu = QtGui.QMenu('&File') - # if not hasattr(self,'SaveModelAction'): - # #self.fileinsertMenu.addSeparator() - # self.saveModelAction = QtGui.QAction('SaveToGenesisFormat', self) - # self.saveModelAction.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+S", None, QtGui.QApplication.UnicodeUTF8)) - # self.connect(self.saveModelAction, QtCore.SIGNAL('triggered()'), self.SaveToGenesisSlot) - # self.fileinsertMenu.addAction(self.saveModelAction) - #self._menus.append(self.fileinsertMenu) - - # def SaveModelDialogSlot(self): - # type_sbml = 'SBML' - # filters = {'SBML(*.xml)': type_sbml} - # filename,filter_ = QtGui.QFileDialog.getSaveFileNameAndFilter(None,'Save File','',';;'.join(filters)) - # extension = "" - # if str(filename).rfind('.') != -1: - # filename = filename[:str(filename).rfind('.')] - # if str(filter_).rfind('.') != -1: - # extension = filter_[str(filter_).rfind('.'):len(filter_)-1] - # if filename: - # filename = filename+extension - # if filters[str(filter_)] == 'SBML': - # writeerror = moose.writeSBML(str(filename),self.plugin.modelRoot) - # if writeerror: - # QtGui.QMessageBox.warning(None,'Could not save the Model','\n Error in the consistency check') - # else: - # QtGui.QMessageBox.information(None,'Saved the Model','\n File Saved to \'{filename}\''.format(filename =filename),QtGui.QMessageBox.Ok) - ''' - def getToolPanes(self): - return super(KkitEditorView, self).getToolPanes() - - def getLibraryPane(self): - return super(KkitEditorView, self).getLibraryPane() - - def getOperationsWidget(self): - return super(KkitEditorView, self).getOperationsPane() - - def getToolBars(self): - return self._toolBars - ''' - def getCentralWidget(self): - if self._centralWidget is None: - self._centralWidget = kineticEditorWidget(self.plugin) - self._centralWidget.setModelRoot(self.plugin.modelRoot) - return self._centralWidget - -class KineticsWidget(EditorWidgetBase): - def __init__(self, plugin, *args): - EditorWidgetBase.__init__(self, *args) - self.plugin = plugin - self.border = 5 - self.comptPen = 5 - self.iconScale = 1 - self.arrowsize = 2 - self.reset() - - self.defaultSceneheight = 1#800#1000 - self.defaultScenewidth = 1#000#2400 - self.positionInfoExist = True - self.defaultComptsize = 5 - self.srcdesConnection = {} - self.meshEntry = {} - self.mooseId_GObj = {} - self.qGraCompt = {} - self.qGraGrp = {} - self.xyCord = {} - self.editor = None - - def reset(self): - self.createdItem = {} - #This are created at drawLine - self.lineItem_dict = {} - self.object2line = defaultdict(list) - self.itemignoreZooming = False - - if hasattr(self,'sceneContainer'): - self.sceneContainer.clear() - self.sceneContainer = QtGui.QGraphicsScene(self) - self.sceneContainer.setItemIndexMethod(QtGui.QGraphicsScene.NoIndex) - sceneDim = self.sceneContainer.itemsBoundingRect() - # if (sceneDim.width() == 0 and sceneDim.height() == 0): - # self.sceneContainer.setSceneRect(0,0,30,30) - # else: - #elf.sceneContainer.setSceneRect(self.sceneContainer.itemsBoundingRect()) - self.sceneContainer.setBackgroundBrush(QColor(230,220,219,120)) - - def getsceneCord(self): - self.cord = {} - self.view.setRefWidget("runView") - for item in self.sceneContainer.items(): - if isinstance(item,KineticsDisplayItem): - self.cord[item.mobj] = {'x':item.scenePos().x(),'y':item.scenePos().y()} - return self.cord - - def updateModelView(self): - self.getMooseObj() - #minmaxratiodict = {'xmin':self.xmin,'xmax':self.xmax,'ymin':self.ymin,'ymax':self.ymax,'xratio':self.xratio,'yratio':self.yratio} - if not self.m: - #At the time of model building - # when we want an empty GraphicView while creating new model, - # then remove all the view and add an empty view - if hasattr(self, 'view') and isinstance(self.view, QtGui.QWidget): - self.layout().removeWidget(self.view) - #self.sceneContainer.setSceneRect(-self.width()/2,-self.height()/2,self.width(),self.height()) - #self.view = GraphicalView(self.modelRoot,self.sceneContainer,self.border,self,self.createdItem,minmaxratiodict) - self.view = GraphicalView(self.modelRoot,self.sceneContainer,self.border,self,self.createdItem) - if isinstance(self,kineticEditorWidget): - self.view.setRefWidget("editorView") - self.view.setAcceptDrops(True) - elif isinstance(self,kineticRunWidget): - self.view.setRefWidget("runView") - self.connect(self.view, QtCore.SIGNAL("dropped"), self.objectEditSlot) - hLayout = QtGui.QGridLayout(self) - self.setLayout(hLayout) - hLayout.addWidget(self.view,0,0) - else: - # Already created Model - # maxmium and minimum coordinates of the objects specified in kkit file. - #self.mooseObjOntoscene() - #self.drawLine_arrow() - if hasattr(self, 'view') and isinstance(self.view, QtGui.QWidget): - self.layout().removeWidget(self.view) - # self.view = GraphicalView(self.modelRoot,self.sceneContainer,self.border,self,self.createdItem,minmaxratiodict) - self.view = GraphicalView(self.modelRoot,self.sceneContainer,self.border,self,self.createdItem) - if isinstance(self,kineticEditorWidget): - #self.getMooseObj() - self.mooseObjOntoscene() - self.drawLine_arrow() - self.view.setRefWidget("editorView") - self.view.setAcceptDrops(True) - self.connect(self.view, QtCore.SIGNAL("dropped"), self.objectEditSlot) - hLayout = QtGui.QGridLayout(self) - self.setLayout(hLayout) - hLayout.addWidget(self.view) - elif isinstance(self,kineticRunWidget): - self.view.setRefWidget("runView") - hLayout = QtGui.QGridLayout(self) - self.setLayout(hLayout) - hLayout.addWidget(self.view) - self.view.fitInView(self.sceneContainer.itemsBoundingRect().x()-10,self.sceneContainer.itemsBoundingRect().y()-10,self.sceneContainer.itemsBoundingRect().width()+20,self.sceneContainer.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio) - - def getMooseObj(self): - #This fun call 2 more function - # -- setupMeshObj(self.modelRoot), - # ----self.meshEntry has [meshEnt] = function: {}, Pool: {} etc - # setupItem - self.m = wildcardFind(self.modelRoot+'/##[ISA=ChemCompt]') - if self.m: - self.srcdesConnection = {} - if self.meshEntry: - self.meshEntry.clear() - else: - self.meshEntry = {} - #self.meshEntry.clear= {} - # Compartment and its members are setup - #self.meshEntry,self.xmin,self.xmax,self.ymin,self.ymax,self.noPositionInfo = setupMeshObj(self.modelRoot) - - #self.meshEntry,xcord,ycord = setupMeshObj(self.modelRoot) - #self.positionInfoExist = not(len(np.nonzero(xcord)[0]) == 0 \ - # and len(np.nonzero(ycord)[0]) == 0) - self.objPar,self.meshEntry,self.xmin,self.xmax,self.ymin,self.ymax,self.noPositionInfo = setupMeshObj(self.modelRoot) - self.autocoordinates = False - if self.srcdesConnection: - self.srcdesConnection.clear() - else: - self.srcdesConnection = {} - - setupItem(self.modelRoot,self.srcdesConnection) - #self.noPositionInfo = False - if not self.noPositionInfo: - self.autocoordinates = True - #self.xmin,self.xmax,self.ymin,self.ymax,self.autoCordinatepos = autoCoordinates(self.meshEntry,self.srcdesConnection) - autoCoordinates(self.meshEntry,self.srcdesConnection) - - self.size = QtCore.QSize(1000 ,550) - - ''' - if self.xmax-self.xmin != 0: - self.xratio = (self.size.width()-10)/(self.xmax-self.xmin) - else: self.xratio = self.size.width()-10 - - if self.ymax-self.ymin: - self.yratio = (self.size.height()-10)/(self.ymax-self.ymin) - else: self.yratio = (self.size.height()-10) - - self.xratio = int(self.xratio) - self.yratio = int(self.yratio) - if self.xratio == 0: - self.xratio = 1 - if self.yratio == 0: - self.yratio = 1 - ''' - def sizeHint(self): - return QtCore.QSize(800,400) - - def updateItemSlot(self, mooseObject): - #This is overridden by derived classes to connect appropriate - #slot for updating the display item. - #In this case if the name is updated from the keyboard both in mooseobj and gui gets updation - changedItem = '' - - for item in self.sceneContainer.items(): - if isinstance(item,PoolItem): - if mooseObject.getId() == element(item.mobj).getId(): - item.updateSlot() - #once the text is edited in editor, laydisplay gets updated in turn resize the length, positionChanged signal shd be emitted - self.positionChange(mooseObject) - self.view.removeConnector() - self.view.showConnector(item) - - def updateColorSlot(self,mooseObject, colour): - #Color slot for changing background color for Pool,Enz and group from objecteditor - anninfo = moose.Annotator(mooseObject.path+'/info') - textcolor,bgcolor = getColor(anninfo) - anninfo.color = str(colour.name()) - - if mooseObject.className == "Neutral": - item = self.qGraGrp[mooseObject] - item.setPen(QtGui.QPen(QtGui.QColor(colour),item.pen().width(),item.pen().style(),item.pen().capStyle(),item.pen().joinStyle()))# self.comptPen, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) - - elif (isinstance(mooseObject,PoolBase) or isinstance(mooseObject,EnzBase) ): - item = self.mooseId_GObj[mooseObject] - item.updateColor(colour) - - ''' - def mooseObjOntoscene(self): - # All the compartments are put first on to the scene \ - # Need to do: Check With upi if empty compartments exist - self.qGraCompt = {} - self.mooseId_GObj = {} - if self.qGraCompt: - self.qGraCompt.clear() - else: - self.qGraCompt = {} - if self.mooseId_GObj: - self.mooseId_GObj.clear() - else: - self.mooseId_GObj = {} - - for cmpt in sorted(self.meshEntry.iterkeys()): - self.createCompt(cmpt) - self.qGraCompt[cmpt] - #comptRef = self.qGraCompt[cmpt] - - #Enzymes of all the compartments are placed first, \ - # so that when cplx (which is pool object) queries for its parent, it gets its \ - # parent enz co-ordinates with respect to QGraphicsscene """ - - for cmpt,memb in self.meshEntry.items(): - for enzObj in find_index(memb,'enzyme'): - enzinfo = enzObj.path+'/info' - if enzObj.className == 'Enz': - enzItem = EnzItem(enzObj,self.qGraCompt[cmpt]) - else: - enzItem = MMEnzItem(enzObj,self.qGraCompt[cmpt]) - self.mooseId_GObj[element(enzObj.getId())] = enzItem - self.setupDisplay(enzinfo,enzItem,"enzyme") - - #self.setupSlot(enzObj,enzItem) - for cmpt,memb in self.meshEntry.items(): - for poolObj in find_index(memb,'pool'): - poolinfo = poolObj.path+'/info' - #depending on Editor Widget or Run widget pool will be created a PoolItem or PoolItemCircle - poolItem = self.makePoolItem(poolObj,self.qGraCompt[cmpt]) - self.mooseId_GObj[element(poolObj.getId())] = poolItem - self.setupDisplay(poolinfo,poolItem,"pool") - - for reaObj in find_index(memb,'reaction'): - reainfo = reaObj.path+'/info' - reaItem = ReacItem(reaObj,self.qGraCompt[cmpt]) - self.setupDisplay(reainfo,reaItem,"reaction") - self.mooseId_GObj[element(reaObj.getId())] = reaItem - - for tabObj in find_index(memb,'table'): - tabinfo = tabObj.path+'/info' - tabItem = TableItem(tabObj,self.qGraCompt[cmpt]) - self.setupDisplay(tabinfo,tabItem,"tab") - self.mooseId_GObj[element(tabObj.getId())] = tabItem - - for funcObj in find_index(memb,'function'): - funcinfo = moose.element(funcObj).path+'/info' - if funcObj.parent.className == "ZombieBufPool" or funcObj.parent.className == "BufPool": - funcinfo = moose.element(funcObj).path+'/info' - Af = Annotator(funcinfo) - funcParent =self.mooseId_GObj[element(funcObj.parent)] - elif funcObj.parent.className == "CubeMesh" or funcObj.parent.className == "CylMesh": - funcParent = self.qGraCompt[cmpt] - funcItem = FuncItem(funcObj,funcParent) - self.mooseId_GObj[element(funcObj.getId())] = funcItem - self.setupDisplay(funcinfo,funcItem,"Function") - - for cplxObj in find_index(memb,'cplx'): - cplxinfo = (cplxObj.parent).path+'/info' - p = element(cplxObj).parent - cplxItem = CplxItem(cplxObj,self.mooseId_GObj[element(cplxObj).parent]) - self.mooseId_GObj[element(cplxObj.getId())] = cplxItem - self.setupDisplay(cplxinfo,cplxItem,"cplx") - - # compartment's rectangle size is calculated depending on children - self.comptChildrenBoundingRect() - ''' - def mooseObjOntoscene(self): - # All the compartments are put first on to the scene \ - # Need to do: Check With upi if empty compartments exist - self.qGraCompt = {} - self.qGraGrp = {} - self.mooseId_GObj = {} - if self.qGraCompt: - self.qGraCompt.clear() - else: - self.qGraCompt = {} - - if self.qGraGrp: - self.qGraGrp.clear() - else: - self.qGraGrp = {} - - if self.qGraGrp: - self.qGraGrp.clear() - else: - self.qGraGrp = {} - - if self.mooseId_GObj: - self.mooseId_GObj.clear() - else: - self.mooseId_GObj = {} - for k,v in self.objPar.items(): - if isinstance(moose.element(k),moose.ChemCompt): - self.createCompt(k) - self.qGraCompt[k] - - elif isinstance(moose.element(k),Neutral): - if len(self.meshEntry[k]): - if isinstance(moose.element(v), moose.ChemCompt): - group_parent = self.qGraCompt[v] - elif isinstance(moose.element(v), moose.Neutral): - group_parent = self.qGraGrp[v] - self.createGroup(k,group_parent) - - for cmpt_grp,memb in self.meshEntry.items(): - if len(memb): - if isinstance(moose.element(cmpt_grp),moose.ChemCompt): - qtGrpparent = self.qGraCompt[cmpt_grp] - elif isinstance(moose.element(cmpt_grp), moose.Neutral): - qtGrpparent = self.qGraGrp[cmpt_grp] - for mclass in ["enzyme","pool","reaction","cplx","function","stimTab"]: - self.mObjontoscene(memb,mclass,qtGrpparent) - - self.groupChildrenBoundingRect() - # compartment's rectangle size is calculated depending on children - self.comptChildrenBoundingRect() - - def mObjontoscene(self,memb,mclass,qtGrpparent): - try: - value = memb[mclass] - except KeyError: - pass - else: - for mObj in memb[mclass]: - minfo = mObj.path+'/info' - if mObj.className in['Enz',"ZombieEnz"]: - mItem = EnzItem(mObj,qtGrpparent) - - elif mObj.className in['MMenz',"ZombieMMenz"]: - mItem = MMEnzItem(mObj,qtGrpparent) - - elif isinstance (moose.element(mObj),moose.PoolBase) and mclass != "cplx": - #depending on Editor Widget or Run widget pool will be created a PoolItem or PoolItemCircle - mItem = self.makePoolItem(mObj,qtGrpparent) - - elif isinstance (moose.element(mObj),moose.ReacBase): - mItem = ReacItem(mObj,qtGrpparent) - - elif mclass == "cplx": - minfo = (mObj.parent).path+'/info' - mItem = CplxItem(mObj,self.mooseId_GObj[element(mObj).parent]) - self.mooseId_GObj[element(mObj.getId())] = mItem - - elif mclass == "function": - if isinstance(moose.element(mObj.parent),moose.PoolBase): - minfo = moose.element(mObj).path+'/info' - Af = Annotator(minfo) - qtGrpparent = self.mooseId_GObj[element(mObj.parent)] - mItem = FuncItem(mObj,qtGrpparent) - - elif mclass == "stimTab": - minfo = mObj.path+'/info' - mItem = TableItem(mObj,qtGrpparent) - self.mooseId_GObj[element(mObj.getId())] = mItem - self.setupDisplay(minfo,mItem,mclass) - - def createGroup(self,key,parent): - self.new_GRP = GRPItem(parent,0,0,0,0,key) - self.qGraGrp[key] = self.new_GRP - self.new_GRP.setRect(20,20,20,20) - - def groupChildrenBoundingRect(self): - for k, v in self.qGraGrp.items(): - grpcolor = moose.Annotator(moose.element(k.path+'/info')).color - #Todo: One may need to calculate explicitly the boundary for Group also if there is a cross-group connection, then - # childrenBoundrect() will take the QPolygonItem position - rectcompt = v.childrenBoundingRect() - v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) - v.setPen(QtGui.QPen(Qt.QColor(grpcolor), self.comptPen, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) - - def comptChildrenBoundingRect(self): - comptlist = [] - for k, v in self.qGraCompt.items(): - # compartment's rectangle size is calculated depending on children - rectcompt = calculateChildBoundingRect(v) - v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) - v.setPen(QtGui.QPen(Qt.QColor(66,66,66,100), self.comptPen, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) - - def createCompt(self,key): - self.new_Compt = ComptItem(self,0,0,0,0,key) - self.qGraCompt[key] = self.new_Compt - self.new_Compt.setRect(10,10,10,10) - self.sceneContainer.addItem(self.new_Compt) - - def setupDisplay(self,info,graphicalObj,objClass): - Annoinfo = Annotator(info) - # For Reaction and Complex object I have skipped the process to get the facecolor and background color as \ - # we are not using these colors for displaying the object so just passing dummy color white - if( objClass == "reaction" or objClass == "cplx" or objClass == "Function" or objClass == "StimulusTable"): - textcolor,bgcolor = QColor("white"),QColor("white") - elif(objClass == "enzyme"): - textcolor,bgcolor = getColor(info) - if bgcolor.name() == "#ffffff" or bgcolor == "white": - bgcolor = getRandColor() - Annoinfo.color = str(bgcolor.name()) - else: - textcolor,bgcolor = getColor(info) - if bgcolor.name() == "#ffffff" or bgcolor == "white": - bgcolor = getRandColor() - Annoinfo.color = str(bgcolor.name()) - if isinstance(self,kineticEditorWidget): - funct = ["Function","ZombieFunction"] - comptt = ["CubeMesh","CylMesh"] - - if objClass in funct: - poolt = ["ZombieBufPool","BufPool"] - if graphicalObj.mobj.parent.className in poolt: - xpos = 0 - ypos = 30 - if graphicalObj.mobj.parent.className in comptt: - xpos,ypos = self.positioninfo(info) - else: - xpos,ypos = self.positioninfo(info) - - elif isinstance(self,kineticRunWidget): - self.editormooseId_GObj = self.editor.getCentralWidget().mooseId_GObj - editorItem = self.editormooseId_GObj[moose.element(info).parent] - xpos = editorItem.scenePos().x() - ypos = editorItem.scenePos().y() - graphicalObj.setDisplayProperties(xpos,ypos,textcolor,bgcolor) - - - def positioninfo(self,iteminfo): - '''By this time, model loaded from kkit,cspace,SBML would have info field created and co-ordinates are added - either by autocoordinates (for cspace,SBML(unless it is not saved from moose)) or from kkit - ''' - - x = float(element(iteminfo).getField('x')) - y = float(element(iteminfo).getField('y')) - #print " positioninfo", iteminfo,x,y - # if moose.Annotator(self.plugin.modelRoot+'/info').modeltype == 'kkit': - # x = self.defaultScenewidth * float(element(iteminfo).getField('x')) - # y = self.defaultSceneheight * float(element(iteminfo).getField('y')) - # print " positioninfo ",iteminfo, element(iteminfo).getField('x'), element(iteminfo).getField('y'), x, y - - # #x = x /self.defaultScenewidth - # #y = y /self.defaultSceneheight - # else: - # x = float(element(iteminfo).getField('x')) - # y = float(element(iteminfo).getField('y')) - # self.defaultScenewidth = 1 - # self.defaultSceneheight = 1 - return(x,y) - - def drawLine_arrow(self, itemignoreZooming=False): - for inn,out in self.srcdesConnection.items(): - #print "inn ",inn, " out ",out - # self.srcdesConnection is dictionary which contains key,value \ - # key is Enzyme or Reaction and value [[list of substrate],[list of product]] (tuple) - # key is Function and value is [list of pool] (list) - - #src = self.mooseId_GObj[inn] - linetype = "regular" - if isinstance(out,tuple): - src = self.mooseId_GObj[inn] - if len(out[0])== 0: - print (inn.className + ' : ' +inn.name+ " doesn't output message") - else: - for items in (items for items in out[0] ): - if re.search("xfer",element(items[0]).name): - xrefPool = items[0].name[:items[0].name.index("_xfer_")] - xrefCompt = items[0].name[items[0].name.index("_xfer_") + len("_xfer_"):] - orgCompt = moose.wildcardFind(self.modelRoot+'/##[FIELD(name)='+xrefCompt+']')[0] - orgPool = moose.wildcardFind(orgCompt.path+'/##[FIELD(name)='+xrefPool+']')[0] - itemslist = list(items) - itemslist[0] = orgPool - items = tuple(itemslist) - linetype = "crosscompt" - des = self.mooseId_GObj[element(items[0])] - self.lineCord(src,des,items,itemignoreZooming,linetype) - if len(out[1]) == 0: - print (inn.className + ' : ' +inn.name+ " doesn't output message") - else: - for items in (items for items in out[1] ): - if re.search("xfer",element(items[0]).name): - xrefPool = items[0].name[:items[0].name.index("_xfer_")] - xrefCompt = items[0].name[items[0].name.index("_xfer_") + len("_xfer_"):] - orgCompt = moose.wildcardFind(self.modelRoot+'/##[FIELD(name)='+xrefCompt+']')[0] - orgPool = moose.wildcardFind(orgCompt.path+'/##[FIELD(name)='+xrefPool+']')[0] - itemslist = list(items) - itemslist[0] = orgPool - items = tuple(itemslist) - linetype = "crosscompt" - des = self.mooseId_GObj[element(items[0])] - self.lineCord(src,des,items,itemignoreZooming,linetype) - elif isinstance(out,list): - if len(out) == 0: - if inn.className == "StimulusTable": - print (inn.name +" doesn't have output") - elif inn.className == "ZombieFunction" or inn.className == "Function": - print (inn.name + " doesn't have sumtotal ") - else: - src = self.mooseId_GObj[inn] - for items in (items for items in out ): - if re.search("xfer",element(items[0]).name): - xrefPool = items[0].name[:items[0].name.index("_xfer_")] - xrefCompt = items[0].name[items[0].name.index("_xfer_") + len("_xfer_"):] - orgCompt = moose.wildcardFind(self.modelRoot+'/##[FIELD(name)='+xrefCompt+']')[0] - orgPool = moose.wildcardFind(orgCompt.path+'/##[FIELD(name)='+xrefPool+']')[0] - itemslist = list(items) - itemslist[0] = orgPool - items = tuple(itemslist) - linetype = "crosscompt" - des = self.mooseId_GObj[element(items[0])] - self.lineCord(src,des,items,itemignoreZooming,linetype) - - def lineCord(self,src,des,type_no,itemignoreZooming,linetype): - srcdes_list = [] - endtype = type_no[1] - line = 0 - if (src == "") and (des == ""): - print ("Source or destination is missing or incorrect") - return - srcdes_list = [src,des,endtype,line] - arrow = calcArrow(srcdes_list,itemignoreZooming,self.iconScale) - self.drawLine(srcdes_list,arrow,linetype) - - while(type_no[2] > 1 and line <= (type_no[2]-1)): - srcdes_list =[src,des,endtype,line] - arrow = calcArrow(srcdes_list,itemignoreZooming,self.iconScale) - self.drawLine(srcdes_list,arrow,linetype) - line = line +1 - - if type_no[2] > 5: - print ("Higher order reaction will not be displayed") - - def drawLine(self,srcdes_list,arrow,linetype="solid"): - src = srcdes_list[0] - des = srcdes_list[1] - endtype = srcdes_list[2] - line = srcdes_list[3] - source = element(next((k for k,v in self.mooseId_GObj.items() if v == src), None)) - for l,v,et,o in self.object2line[src]: - if v == des and o ==line: - l.setPolygon(arrow) - arrowPen = l.pen() - arrowPenWidth = self.arrowsize*self.iconScale - arrowPen.setColor(l.pen().color()) - arrowPen.setWidth(arrowPenWidth) - l.setPen(arrowPen) - return - qgLineitem = self.sceneContainer.addPolygon(arrow) - qgLineitem.setParentItem(src.parentItem()) - pen = QtGui.QPen(QtCore.Qt.green, 0, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin) - if linetype == "crosscompt": - pen.setStyle(Qt.Qt.CustomDashLine) - pen.setDashPattern([1, 5, 1, 5]) - - pen.setWidth(self.arrowsize) - - # Green is default color moose.ReacBase and derivatives - already set above - if isinstance(source, EnzBase): - if ( (endtype == 's') or (endtype == 'p')): - pen.setColor(QtCore.Qt.red) - elif(endtype != 'cplx'): - p1 = (next((k for k,v in self.mooseId_GObj.items() if v == src), None)) - pinfo = p1.parent.path+'/info' - color,bgcolor = getColor(pinfo) - #color = QColor(color[0],color[1],color[2]) - pen.setColor(bgcolor) - - elif isinstance(source, moose.PoolBase) or isinstance(source,moose.Function): - pen.setColor(QtCore.Qt.blue) - elif isinstance(source,moose.StimulusTable): - pen.setColor(QtCore.Qt.yellow) - self.lineItem_dict[qgLineitem] = srcdes_list - self.object2line[ src ].append( ( qgLineitem, des,endtype,line) ) - self.object2line[ des ].append( ( qgLineitem, src,endtype,line ) ) - qgLineitem.setPen(pen) - - def positionChange(self,mooseObject): - #If the item position changes, the corresponding arrow's are calculated - print mooseObject - for k, v in self.qGraCompt.items(): - for rectChilditem in v.childItems(): - self.updateArrow(rectChilditem) - if isinstance(rectChilditem,GRPItem): - for grpChilditem in rectChilditem.childItems(): - self.updateArrow(grpChilditem) - if isinstance(grpChilditem,KineticsDisplayItem): - if moose.exists(grpChilditem.mobj.path+'/info'): - #print grpChilditem.mobj.name, grpChilditem.scenePos() - moose.element(grpChilditem.mobj.path+'/info').x = grpChilditem.scenePos().x() - moose.element(grpChilditem.mobj.path+'/info').y = grpChilditem.scenePos().y() - #self.updateGrpSize(rectChilditem) - if isinstance(rectChilditem,KineticsDisplayItem): - if moose.exists(rectChilditem.mobj.path+'/info'): - #print rectChilditem.mobj.name, rectChilditem.scenePos() - moose.element(rectChilditem.mobj.path+'/info').x = rectChilditem.scenePos().x() - moose.element(rectChilditem.mobj.path+'/info').y = rectChilditem.scenePos().y() - - rectcompt = calculateChildBoundingRect(v) - comptBoundingRect = v.boundingRect() - if not comptBoundingRect.contains(rectcompt): - self.updateCompartmentSize(v) - else: - rectcompt = calculateChildBoundingRect(v) - v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) - - def positionChange_old(self,mooseObject): - #If the item position changes, the corresponding arrow's are calculated - if isinstance(element(mooseObject),ChemCompt): - for k, v in self.qGraCompt.items(): - mesh = moose.element(mooseObject).path - if k.path == mesh: - for rectChilditem in v.childItems(): - if isinstance(rectChilditem, KineticsDisplayItem): - if moose.exists(rectChilditem.mobj.path): - iInfo = rectChilditem.mobj.path+'/info' - anno = moose.Annotator(iInfo) - #storing scenePos back to annotator file for further use - x = rectChilditem.scenePos().x() - y = rectChilditem.scenePos().y() - #anno.x = x - #anno.y = y - if isinstance(moose.element(rectChilditem.mobj.path),PoolBase): - t = moose.element(rectChilditem.mobj.path) - moose.element(t).children - for items in moose.element(t).children: - if isinstance(moose.element(items),Function): - test = moose.element(items.path+'/x') - for i in moose.element(test).neighbors['input']: - j = self.mooseId_GObj[moose.element(i)] - self.updateArrow(j) - self.updateArrow(rectChilditem) - elif element(mooseObject).className == 'Neutral': - for k,v in self.qGraGrp.items(): - for grpChilditem in v.childItems(): - if isinstance(grpChilditem, KineticsDisplayItem): - if moose.exists(grpChilditem.mobj.path): - iInfo = grpChilditem.mobj.path+'/info' - anno = moose.Annotator(iInfo) - #storing scenePos back to annotator file for further use - x = grpChilditem.scenePos().x() - y = grpChilditem.scenePos().y() - #anno.x = x - #anno.y = y - - if isinstance(moose.element(grpChilditem.mobj.path),PoolBase): - t = moose.element(grpChilditem.mobj.path) - moose.element(t).children - for items in moose.element(t).children: - if isinstance(moose.element(items),Function): - test = moose.element(items.path+'/x') - for i in moose.element(test).neighbors['input']: - j = self.mooseId_GObj[moose.element(i)] - self.updateArrow(j) - self.updateArrow(grpChilditem) - # grpcompt = self.qGraCompt[self.objPar[k]] - # rectcompt = calculateChildBoundingRect(grpcompt) - rectgrp = calculateChildBoundingRect(v) - v.setRect(rectgrp.x()-10,rectgrp.y()-10,(rectgrp.width()+20),(rectgrp.height()+20)) - for k, v in self.qGraCompt.items(): - #rectcompt = v.childrenBoundingRect() - rectcompt = calculateChildBoundingRect(v) - comptBoundingRect = v.boundingRect() - if not comptBoundingRect.contains(rectcompt): - self.updateCompartmentSize(v) - - else: - rectcompt = calculateChildBoundingRect(v) - v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) - else: - mobj = self.mooseId_GObj[element(mooseObject)] - self.updateArrow(mobj) - # elePath = moose.element(mooseObject).path - # pos = elePath.find('/',1) - # l = elePath[0:pos] - # linfo = moose.Annotator(l+'/info') - # if moose.exists(l): - # #anno = moose.Annotator(linfo) - # # if moose.Annotator(self.plugin.modelRoot+'/info').modeltype == 'kkit': - # # x = mobj.scenePos().x()/self.defaultScenewidth - # # y = mobj.scenePos().y()/self.defaultSceneheight - # # else: - # # x = mobj.scenePos().x() - # # y = mobj.scenePos().y() - # x = mobj.scenePos().x() - # y = mobj.scenePos().y() - #print " x and y at 863 ",mobj.scenePos() - # for gk,gv in self.qGraGrp.items(): - # rectgrp = calculateChildBoundingRect(gv) - # grpBoundingRect = gv.boundingRect() - # if not grpBoundingRect.contains(rectgrp): - # self.updateCompartmentSize(v) - # else: - # gv.setRect(rectgrp.x()-10,rectgrp.y()-10,(rectgrp.width()+20),(rectgrp.height()+20)) - for k, v in self.qGraCompt.items(): - #rectcompt = v.childrenBoundingRect() - rectcompt = calculateChildBoundingRect(v) - comptBoundingRect = v.boundingRect() - if not comptBoundingRect.contains(rectcompt): - self.updateCompartmentSize(v) - - else: - rectcompt = calculateChildBoundingRect(v) - v.setRect(rectcompt.x()-10,rectcompt.y()-10,(rectcompt.width()+20),(rectcompt.height()+20)) - # print " position change " - # for item in self.sceneContainer.items(): - # if isinstance(item,KineticsDisplayItem): - # print item.mobj.name, moose.element(item.mobj.path+'/info').x,moose.element(item.mobj.path+'/info').y - - def updateGrpSize(self,grp): - compartmentBoundary = grp.rect() - - childrenBoundary = calculateChildBoundingRect(grp) - x = childrenBoundary.x() - y = childrenBoundary.y() - height = childrenBoundary.height() - width = childrenBoundary.width() - grp.setRect( x-10 - , y-10 - , width + 20 - , height + 20 - ) - def updateCompartmentSize(self, compartment): - compartmentBoundary = compartment.rect() - childrenBoundary = calculateChildBoundingRect(compartment) - x = min(compartmentBoundary.x(), childrenBoundary.x()) - y = min(compartmentBoundary.y(), childrenBoundary.y()) - width = max(compartmentBoundary.width(), childrenBoundary.width()) - height = max(compartmentBoundary.height(), childrenBoundary.height()) - compartment.setRect( x-10 - , y-10 - , width + 20 - , height + 20 - ) - - def updateArrow(self,qGTextitem): - #if there is no arrow to update then return - if qGTextitem not in self.object2line: - return - listItem = self.object2line[qGTextitem] - for ql, va,endtype,order in self.object2line[qGTextitem]: - srcdes = [] - srcdes = self.lineItem_dict[ql] - # Checking if src (srcdes[0]) or des (srcdes[1]) is ZombieEnz, - # if yes then need to check if cplx is connected to any mooseObject, - # so that when Enzyme is moved, cplx connected arrow to other mooseObject(poolItem) should also be updated - if( type(srcdes[0]) == EnzItem or type(srcdes[0] == MMEnzItem)): - self.cplxUpdatearrow(srcdes[0]) - elif( type(srcdes[1]) == EnzItem or type(srcdes[1] == MMEnzItem)): - self.cplxUpdatearrow(srcdes[1]) - # For calcArrow(src,des,endtype,itemignoreZooming) is to be provided - arrow = calcArrow(srcdes,self.itemignoreZooming,self.iconScale) - ql.setPolygon(arrow) - - def cplxUpdatearrow(self,srcdes): - # srcdes which is 'EnzItem' from this,get ChildItems are retrived (b'cos cplx is child of zombieEnz) - #And cplxItem is passed for updatearrow - for item in srcdes.childItems(): - if isinstance(item,CplxItem): - self.updateArrow(item) - - def positionChange1(self,mooseObject): - #If the item position changes, the corresponding arrow's are calculated - if ( (isinstance(element(mooseObject),CubeMesh)) or (isinstance(element(mooseObject),CylMesh))): - v = self.qGraCompt[mooseObject] - for rectChilditem in v.childItems(): - self.updateArrow(rectChilditem) - else: - mobj = self.mooseId_GObj[mooseObject.getId()] - self.updateArrow(mobj) - mooseObjcompt = self.findparent(mooseObject) - v = self.qGraCompt[mooseObjcompt] - #childBoundingRect = v.childrenBoundingRect() - childBoundingRect = calculateChildBoundingRect(v) - comptBoundingRect = v.boundingRect() - rectcompt = comptBoundingRect.united(childBoundingRect) - comptPen = v.pen() - comptWidth = 5 - comptPen.setWidth(comptWidth) - v.setPen(comptPen) - if not comptBoundingRect.contains(childBoundingRect): - v.setRect(rectcompt.x()-comptWidth,rectcompt.y()-comptWidth,rectcompt.width()+(comptWidth*2),rectcompt.height()+(comptWidth*2)) - -class kineticEditorWidget(KineticsWidget): - def __init__(self, plugin,*args): - - KineticsWidget.__init__(self, plugin, *args) - self.plugin = plugin - self.insertMenu = QtGui.QMenu('&Insert') - self._menus.append(self.insertMenu) - self.insertMapper = QtCore.QSignalMapper(self) - classlist = ['CubeMesh','CylMesh','Pool','BufPool','Function','Reac','Enz','MMenz','StimulusTable'] - self.toolTipinfo = { "CubeMesh":"", - "CylMesh" : "", - "Pool":"A Pool is a collection of molecules of a given species in a given cellular compartment.\n It can undergo reactions that convert it into other pool(s). \nParameters: initConc (Initial concentration), diffConst (diffusion constant). Variable: conc (Concentration)", - "BufPool":"A BufPool is a buffered pool. \nIt is a collection of molecules of a given species in a given cellular compartment, that are always present at the same concentration.\n This is set by the initConc parameter. \nIt can undergo reactions in the same way as a pool.", - "Function":"A Func computes an arbitrary mathematical expression of one or more input concentrations of Pools. The output can be used to control the concentration of another Pool, or as an input to another Func", - "StimulusTable":"A StimulusTable stores an array of values that are read out during a simulation, and typically control the concentration of one of the pools in the model. \nParameters: size of table, values of entries, start and stop times, and an optional loopTime that defines the period over which the StimulusTable should loop around to repeat its values", - "Reac":"A Reac is a chemical reaction that converts substrates into products, and back. \nThe rates of these conversions are specified by the rate constants Kf and Kb respectively.", - "MMenz":"An MMenz is the Michaelis-Menten version of an enzyme activity of a given Pool.\n The MMenz must be created on a pool and can only catalyze a single reaction with a specified substrate(s). \nIf a given enzyme species can have multiple substrates, then multiple MMenz activites must be created on the parent Pool. \nThe rate of an MMenz is V [S].[E].kcat/(Km + [S]). There is no enzyme-substrate complex. Parameters: Km and kcat.", - "Enz":"An Enz is an enzyme activity of a given Pool. The Enz must be created on a pool and can only catalyze a single reaction with a specified substrate(s). \nIf a given enzyme species can have multiple substrates, then multiple Enz activities must be created on the parent Pool. \nThe reaction for an Enz is E + S <===> E.S ---> E + P. \nThis means that a new Pool, the enzyme-substrate complex E.S, is always formed when you create an Enz. \nParameters: Km and kcat, or alternatively, K1, K2 and K3. Km = (K2+K3)/K1" - - } - insertMapper, actions = self.getInsertActions(classlist) - for action in actions: - self.insertMenu.addAction(action) - doc = self.toolTipinfo[str(action.text())] - if doc == "": - classname = str(action.text()) - doc = moose.element('/classes/%s' % (classname)).docs - doc = doc.split('Description:')[-1].split('Name:')[0].strip() - action.setToolTip(doc) - - def GrViewresize(self,event): - #when Gui resize and event is sent which inturn call resizeEvent of qgraphicsview - pass - #self.view.resizeEvent1(event) - - def makePoolItem(self, poolObj, qGraCompt): - return PoolItem(poolObj, qGraCompt) - - def getToolBars(self): - #Add specific tool items with respect to kkit - if not hasattr(self, '_insertToolBar'): - self._insertToolBar = QtGui.QToolBar('Insert') - self._toolBars.append(self._insertToolBar) - for action in self.insertMenu.actions(): - button = MToolButton() - button.setDefaultAction(action) - #set the unicode instead of image by setting - #button.setText(unicode(u'\u20de')) - Iconpath = os.path.join(config.MOOSE_GUI_DIR, 'icons/classIcon/') - button.setIcon(QtGui.QIcon(Iconpath+action.text()+".png")) - #button.setIcon(QtGui.QIcon("icons/classIcon/"+action.text()+".png")) - #button.setIconSize(QtCore.QSize(200,200)) - self._insertToolBar.addWidget(button) - return self._toolBars - -class kineticRunWidget(KineticsWidget): - def __init__(self, plugin, *args): - KineticsWidget.__init__(self, plugin,*args) - - def showEvent(self, event): - self.refresh() - # pass - def refresh(self): - self.sceneContainer.clear() - self.Comptexist = wildcardFind(self.modelRoot+'/##[ISA=ChemCompt]') - if self.Comptexist: - # pass - self.getMooseObj() - self.mooseObjOntoscene() - self.drawLine_arrow(itemignoreZooming=False) - - def makePoolItem(self, poolObj, qGraCompt): - return PoolItemCircle(poolObj, qGraCompt) - - def getToolBars(self): - return self._toolBars - - def updateValue(self): - for item in self.sceneContainer.items(): - if isinstance(item,ReacItem) or isinstance(item,MMEnzItem) or isinstance(item,EnzItem) or isinstance(item,PoolItemCircle) or isinstance(item,CplxItem): - item.updateValue(item.mobj) - - def changeBgSize(self): - for item in self.sceneContainer.items(): - if isinstance(item,PoolItemCircle): - initialConc = moose.element(item.mobj).concInit - presentConc = moose.element(item.mobj).conc - if initialConc != 0: - ratio = presentConc/initialConc - else: - # multipying by 1000 b'cos moose concentration is in milli in moose - ratio = presentConc - #print "ratio",item.mobj,ratio - if ratio > '10': - ratio = 9 - if ratio < '0.0': - ratio =0.1 - #print "size ",ratio - item.updateRect(math.sqrt(abs(ratio))) - - def resetColor(self): - for item in self.sceneContainer.items(): - if isinstance(item,PoolItemCircle): - item.returnEllispeSize() -if __name__ == "__main__": - app = QtGui.QApplication(sys.argv) - size = QtCore.QSize(1024 ,768) - #modelPath = 'Kholodenko' - modelPath = 'acc27' - #modelPath = 'acc8' - #modelPath = '3ARECB' - #modelPath = '3AreacB' - #modelPath = '5AreacB' - itemignoreZooming = False - try: - filepath = '../../Demos/Genesis_files/'+modelPath+'.g' - filepath = '/home/harsha/genesis_files/gfile/'+modelPath+'.g' - print( "%s" %(filepath)) - f = open(filepath, "r") - loadModel(filepath,'/'+modelPath) - - #moose.le('/'+modelPath+'/kinetics') - dt = KineticsWidget() - dt.modelRoot ='/'+modelPath - ''' Loading moose signalling model in python ''' - #execfile('/home/harsha/BuildQ/Demos/Genesis_files/scriptKineticModel.py') - #dt.modelRoot = '/model' - - dt.updateModelView() - dt.show() - - except IOError, what: - (errno, strerror) = what - print ("Error number",errno,"(%s)" %(strerror)) - sys.exit(0) - sys.exit(app.exec_()) diff --git a/plugins/kkitOrdinateUtil.py b/plugins/kkitOrdinateUtil.py deleted file mode 100644 index 4d27c9a..0000000 --- a/plugins/kkitOrdinateUtil.py +++ /dev/null @@ -1,488 +0,0 @@ -__author__ = "HarshaRani" -__credits__ = ["Upi Lab"] -__license__ = "GPL3" -__version__ = "1.0.0" -__maintainer__ = "HarshaRani" -__email__ = "hrani@ncbs.res.in" -__status__ = "Development" -__updated__ = "Oct 26 2018" - -''' -2018 -Oct 26: xfer molecules are not put into screen -Sep 28: to zoom the kkit co-ordinates a factor of w=1000 and h=800 is multipled here -2017 -Oct 18: moved some function to kkitUtil -getxyCord, etc function are added -''' -import collections -from moose import * -import numpy as np -from moose import wildcardFind,element,PoolBase,CplxEnzBase,Annotator,exists -from networkx.drawing.nx_agraph import graphviz_layout -import numpy as np -import networkx as nx -from kkitUtil import getRandColor,colorCheck,findCompartment, findGroup, findGroup_compt, mooseIsInstance -from PyQt4.QtGui import QColor -import re -import moose._moose as moose - -def getxyCord(xcord,ycord,list1): - for item in list1: - # if isinstance(item,Function): - # objInfo = element(item.parent).path+'/info' - # else: - # objInfo = item.path+'/info' - if not isinstance(item,Function): - objInfo = item.path+'/info' - xcord.append(xyPosition(objInfo,'x')) - ycord.append(xyPosition(objInfo,'y')) - -def xyPosition(objInfo,xory): - try: - return(float(element(objInfo).getField(xory))) - except ValueError: - return (float(0)) -''' -def mooseIsInstance(melement, classNames): - return element(melement).__class__.__name__ in classNames - - -def findCompartment(melement): - while not mooseIsInstance(melement, ["CubeMesh", "CyclMesh"]): - melement = melement.parent - return melement - -def findGroup(melement): - while not mooseIsInstance(melement, ["Neutral"]): - melement = melement.parent - return melement - -def findGroup_compt(melement): - while not (mooseIsInstance(melement, ["Neutral","CubeMesh", "CyclMesh"])): - melement = melement.parent - return melement -''' -def populateMeshEntry(meshEntry,parent,types,obj): - #print " parent ",parent, "types ",types, " obj ",obj - try: - value = meshEntry[element(parent.path)][types] - except KeyError: - # Key is not present - meshEntry[element(parent.path)].update({types :[element(obj)]}) - else: - mlist = meshEntry[element(parent.path)][types] - mlist.append(element(obj)) -def updateMeshObj(modelRoot): - print " updateMeshObj " - meshEntry = {} - if meshEntry: - meshEntry.clear() - else: - meshEntry = {} - - objPar = collections.OrderedDict() - for compt in wildcardFind(modelRoot+'/##[ISA=ChemCompt]'): - groupColor = [] - try: - value = meshEntry[element(compt)] - except KeyError: - # Compt is not present - meshEntry[element(compt)] = {} - objPar[element(compt)] = element('/') - - for grp in wildcardFind(compt.path+'/##[TYPE=Neutral]'): - test = [x for x in wildcardFind(element(grp).path+'/#') if x.className in ["Pool","Reac","Enz"]] - grp_cmpt = findGroup_compt(grp.parent) - - try: - value = meshEntry[element(grp)] - except KeyError: - # Grp is not present - meshEntry[element(grp)] = {} - objPar[element(grp)] = element(grp_cmpt) - - for compt in wildcardFind(modelRoot+'/##[ISA=ChemCompt]'): - for m in wildcardFind(compt.path+'/##[ISA=PoolBase]'): - grp_cmpt = findGroup_compt(m) - if isinstance(element(grp_cmpt),Neutral): - if isinstance(element(m.parent),EnzBase): - populateMeshEntry(meshEntry,grp_cmpt,"cplx",m) - else: - populateMeshEntry(meshEntry,grp_cmpt,"pool",m) - else: - if isinstance(element(m.parent),EnzBase): - populateMeshEntry(meshEntry,compt,"cplx",m) - else: - populateMeshEntry(meshEntry,compt,"pool",m) - - for r in wildcardFind(compt.path+'/##[ISA=ReacBase]'): - rgrp_cmpt = findGroup_compt(r) - if isinstance(element(rgrp_cmpt),Neutral): - populateMeshEntry(meshEntry,rgrp_cmpt,"reaction",r) - else: - populateMeshEntry(meshEntry,compt,"reaction",r) - - for e in wildcardFind(compt.path+'/##[ISA=EnzBase]'): - egrp_cmpt = findGroup_compt(e) - if isinstance(element(egrp_cmpt),Neutral): - populateMeshEntry(meshEntry,egrp_cmpt,"enzyme",e) - else: - populateMeshEntry(meshEntry,compt,"enzyme",e) - - for f in wildcardFind(compt.path+'/##[ISA=Function]'): - fgrp_cmpt = findGroup_compt(f) - if isinstance(element(fgrp_cmpt),Neutral): - populateMeshEntry(meshEntry,fgrp_cmpt,"function",f) - else: - populateMeshEntry(meshEntry,compt,"function",f) - - for t in wildcardFind(compt.path+'/##[ISA=StimulusTable]'): - tgrp_cmpt = findGroup_compt(t) - if isinstance(element(tgrp_cmpt),Neutral): - populateMeshEntry(meshEntry,tgrp_cmpt,"stimTab",t) - else: - populateMeshEntry(meshEntry,compt,"stimTab",t) - return(objPar,meshEntry) - -def setupMeshObj(modelRoot): - ''' Setup compartment and its members pool,reaction,enz cplx under self.meshEntry dictionaries \ - self.meshEntry with "key" as compartment, - value is key2:list where key2 represents moose object type,list of objects of a perticular type - e.g self.meshEntry[meshEnt] = { 'reaction': reaction_list,'enzyme':enzyme_list,'pool':poollist,'cplx': cplxlist } - ''' - xmin = 0.0 - xmax = 1.0 - ymin = 0.0 - ymax = 1.0 - positionInfoExist = True - meshEntry = {} - if meshEntry: - meshEntry.clear() - else: - meshEntry = {} - xcord = [] - ycord = [] - n = 1 - objPar = collections.OrderedDict() - - for compt in wildcardFind(modelRoot+'/##[ISA=ChemCompt]'): - groupColor = [] - try: - value = meshEntry[element(compt)] - except KeyError: - # Compt is not present - meshEntry[element(compt)] = {} - objPar[element(compt)] = element('/') - - for grp in wildcardFind(compt.path+'/##[TYPE=Neutral]'): - test = [x for x in wildcardFind(element(grp).path+'/#') if x.className in ["Pool","Reac","Enz"]] - #if len(test) >1: - grpinfo = Annotator(element(grp).path+'/info') - validatecolor = colorCheck(grpinfo.color,"bg") - validatedgrpcolor = str(QColor(validatecolor).name()) - - groupColor.append(validatedgrpcolor) - grp_cmpt = findGroup_compt(grp.parent) - - try: - value = meshEntry[element(grp)] - except KeyError: - # Grp is not present - meshEntry[element(grp)] = {} - objPar[element(grp)] = element(grp_cmpt) - # if n > 1: - # validatecolor = colorCheck(grpinfo.color,"bg") - # validatedgrpcolor = str(QColor(validatecolor).name()) - # if validatedgrpcolor in groupColor: - # print " inside " - # c = getRandColor() - # print " c ",c, c.name() - # grpinfo.color = str(c.name()) - # groupColor.append(str(c.name())) - # print " groupColor ",grpinfo,grpinfo.color, groupColor - # n =n +1 - for compt in wildcardFind(modelRoot+'/##[ISA=ChemCompt]'): - for m in wildcardFind(compt.path+'/##[ISA=PoolBase]'): - if not re.search("xfer",m.name): - grp_cmpt = findGroup_compt(m) - xcord.append(xyPosition(m.path+'/info','x')) - ycord.append(xyPosition(m.path+'/info','y')) - if isinstance(element(grp_cmpt),Neutral): - if isinstance(element(m.parent),EnzBase): - populateMeshEntry(meshEntry,grp_cmpt,"cplx",m) - else: - populateMeshEntry(meshEntry,grp_cmpt,"pool",m) - else: - if isinstance(element(m.parent),EnzBase): - populateMeshEntry(meshEntry,compt,"cplx",m) - else: - populateMeshEntry(meshEntry,compt,"pool",m) - - for r in wildcardFind(compt.path+'/##[ISA=ReacBase]'): - rgrp_cmpt = findGroup_compt(r) - xcord.append(xyPosition(r.path+'/info','x')) - ycord.append(xyPosition(r.path+'/info','y')) - if isinstance(element(rgrp_cmpt),Neutral): - populateMeshEntry(meshEntry,rgrp_cmpt,"reaction",r) - else: - populateMeshEntry(meshEntry,compt,"reaction",r) - - for e in wildcardFind(compt.path+'/##[ISA=EnzBase]'): - egrp_cmpt = findGroup_compt(e) - xcord.append(xyPosition(e.path+'/info','x')) - ycord.append(xyPosition(e.path+'/info','y')) - - if isinstance(element(egrp_cmpt),Neutral): - populateMeshEntry(meshEntry,egrp_cmpt,"enzyme",e) - else: - populateMeshEntry(meshEntry,compt,"enzyme",e) - - for f in wildcardFind(compt.path+'/##[ISA=Function]'): - fgrp_cmpt = findGroup_compt(f) - if isinstance(element(fgrp_cmpt),Neutral): - populateMeshEntry(meshEntry,fgrp_cmpt,"function",f) - else: - populateMeshEntry(meshEntry,compt,"function",f) - - for t in wildcardFind(compt.path+'/##[ISA=StimulusTable]'): - tgrp_cmpt = findGroup_compt(t) - xcord.append(xyPosition(t.path+'/info','x')) - ycord.append(xyPosition(t.path+'/info','y')) - if isinstance(element(tgrp_cmpt),Neutral): - populateMeshEntry(meshEntry,tgrp_cmpt,"stimTab",t) - else: - populateMeshEntry(meshEntry,compt,"stimTab",t) - - xmin = min(xcord) - xmax = max(xcord) - ymin = min(ycord) - ymax = max(ycord) - positionInfoExist = not(len(np.nonzero(xcord)[0]) == 0 and len(np.nonzero(ycord)[0]) == 0) - return(objPar,meshEntry,xmin,xmax,ymin,ymax,positionInfoExist) -''' -def setupMeshObj(modelRoot): - # Setup compartment and its members pool,reaction,enz cplx under self.meshEntry dictionaries \ - # self.meshEntry with "key" as compartment, - # value is key2:list where key2 represents moose object type,list of objects of a perticular type - # e.g self.meshEntry[meshEnt] = { 'reaction': reaction_list,'enzyme':enzyme_list,'pool':poollist,'cplx': cplxlist } - - meshEntry = {} - if meshEntry: - meshEntry.clear() - else: - meshEntry = {} - xcord = [] - ycord = [] - meshEntryWildcard = '/##[ISA=ChemCompt]' - if modelRoot != '/': - meshEntryWildcard = modelRoot+meshEntryWildcard - for meshEnt in wildcardFind(meshEntryWildcard): - mollist = [] - realist = [] - enzlist = [] - cplxlist = [] - tablist = [] - funclist = [] - - mol_cpl = wildcardFind(meshEnt.path+'/##[ISA=PoolBase]') - funclist = wildcardFind(meshEnt.path+'/##[ISA=Function]') - enzlist = wildcardFind(meshEnt.path+'/##[ISA=EnzBase]') - realist = wildcardFind(meshEnt.path+'/##[ISA=ReacBase]') - tablist = wildcardFind(meshEnt.path+'/##[ISA=StimulusTable]') - if mol_cpl or funclist or enzlist or realist or tablist: - for m in mol_cpl: - if isinstance(element(m.parent),CplxEnzBase): - cplxlist.append(m) - elif isinstance(element(m),moose.PoolBase): - mollist.append(m) - - meshEntry[meshEnt] = {'enzyme':enzlist, - 'reaction':realist, - 'pool':mollist, - 'cplx':cplxlist, - 'table':tablist, - 'function':funclist - } - - for mert in [mollist,enzlist,realist,tablist]: - for merts in mert: - objInfo = merts.path+'/info' - if exists(objInfo): - xcord.append(element(objInfo).x) - ycord.append(element(objInfo).y) - return(meshEntry,xcord,ycord) - -def sizeHint(self): - return QtCore.QSize(800,400) -''' -def setupItem(modelPath,cntDict): - # This function collects information of what is connected to what. \ - # eg. substrate and product connectivity to reaction's and enzyme's \ - # sumtotal connectivity to its pool are collected - #print " setupItem" - sublist = [] - prdlist = [] - zombieType = ['ReacBase','EnzBase','Function','StimulusTable'] - for baseObj in zombieType: - path = '/##[ISA='+baseObj+']' - if modelPath != '/': - path = modelPath+path - if ( (baseObj == 'ReacBase') or (baseObj == 'EnzBase')): - for items in wildcardFind(path): - sublist = [] - prdlist = [] - uniqItem,countuniqItem = countitems(items,'subOut') - subNo = uniqItem - for sub in uniqItem: - sublist.append((element(sub),'s',countuniqItem[sub])) - - uniqItem,countuniqItem = countitems(items,'prd') - prdNo = uniqItem - if (len(subNo) == 0 or len(prdNo) == 0): - print ("Substrate Product is empty ",path, " ",items) - - for prd in uniqItem: - prdlist.append((element(prd),'p',countuniqItem[prd])) - - if (baseObj == 'CplxEnzBase') : - uniqItem,countuniqItem = countitems(items,'toEnz') - for enzpar in uniqItem: - sublist.append((element(enzpar),'t',countuniqItem[enzpar])) - - uniqItem,countuniqItem = countitems(items,'cplxDest') - for cplx in uniqItem: - prdlist.append((element(cplx),'cplx',countuniqItem[cplx])) - - if (baseObj == 'EnzBase'): - uniqItem,countuniqItem = countitems(items,'enzDest') - for enzpar in uniqItem: - sublist.append((element(enzpar),'t',countuniqItem[enzpar])) - cntDict[items] = sublist,prdlist - elif baseObj == 'Function': - for items in wildcardFind(path): - sublist = [] - prdlist = [] - item = items.path+'/x[0]' - uniqItem,countuniqItem = countitems(item,'input') - for funcpar in uniqItem: - sublist.append((element(funcpar),'sts',countuniqItem[funcpar])) - - uniqItem,countuniqItem = countitems(items,'valueOut') - for funcpar in uniqItem: - prdlist.append((element(funcpar),'stp',countuniqItem[funcpar])) - cntDict[items] = sublist,prdlist - - else: - for tab in wildcardFind(path): - tablist = [] - uniqItem,countuniqItem = countitems(tab,'output') - for tabconnect in uniqItem: - tablist.append((element(tabconnect),'tab',countuniqItem[tabconnect])) - cntDict[tab] = tablist - -def countitems(mitems,objtype): - items = [] - items = element(mitems).neighbors[objtype] - uniqItems = set(items) - #countuniqItemsauto = Counter(items) - countuniqItems = dict((i, items.count(i)) for i in items) - return(uniqItems,countuniqItems) - -def recalculatecoordinatesforKkit(mObjlist,xcord,ycord): - positionInfoExist = not(len(np.nonzero(xcord)[0]) == 0 \ - and len(np.nonzero(ycord)[0]) == 0) - - if positionInfoExist: - #Here all the object has been taken now recalculate and reassign back x and y co-ordinates - xmin = min(xcord) - xmax = max(xcord) - ymin = min(ycord) - ymax = max(ycord) - for merts in mObjlist: - objInfo = merts.path+'/info' - if moose.exists(objInfo): - Ix = (xyPosition(objInfo,'x')-xmin)/(xmax-xmin) - Iy = (ymin-xyPosition(objInfo,'y'))/(ymax-ymin) - element(objInfo).x = Ix*1000 - element(objInfo).y = Iy*800 - -def xyPosition(objInfo,xory): - try: - return(float(element(objInfo).getField(xory))) - except ValueError: - return (float(0)) - - -def autoCoordinates(meshEntry,srcdesConnection): - - G = nx.Graph() - for cmpt,memb in meshEntry.items(): - if memb in ["enzyme"]: - for enzObj in find_index(memb,'enzyme'): - #G.add_node(enzObj.path) - G.add_node(enzObj.path,label='',shape='ellipse',color='',style='filled',fontname='Helvetica',fontsize=12,fontcolor='blue') - for cmpt,memb in meshEntry.items(): - #if memb.has_key - if memb in ["pool","cplx","reaction"]: - for poolObj in find_index(memb,'pool'): - #G.add_node(poolObj.path) - G.add_node(poolObj.path,label = poolObj.name,shape = 'box',color = '',style = 'filled',fontname = 'Helvetica',fontsize = 9,fontcolor = 'blue') - for cplxObj in find_index(memb,'cplx'): - G.add_node(cplxObj.path) - G.add_node(cplxObj.path,label = cplxObj.name,shape = 'box',color = '',style = 'filled',fontname = 'Helvetica',fontsize = 12,fontcolor = 'blue') - #G.add_edge((cplxObj.parent).path,cplxObj.path) - for reaObj in find_index(memb,'reaction'): - #G.add_node(reaObj.path) - G.add_node(reaObj.path,label='',shape='circle',color='') - - for inn,out in srcdesConnection.items(): - if (inn.className =='ZombieReac'): arrowcolor = 'green' - elif(inn.className =='ZombieEnz'): arrowcolor = 'red' - else: arrowcolor = 'blue' - if isinstance(out,tuple): - if len(out[0])== 0: - print (inn.className + ':' +inn.name + " doesn't have input message") - else: - for items in (items for items in out[0] ): - G.add_edge(element(items[0]).path,inn.path) - if len(out[1]) == 0: - print (inn.className + ':' + inn.name + "doesn't have output mssg") - else: - for items in (items for items in out[1] ): - G.add_edge(inn.path,element(items[0]).path) - elif isinstance(out,list): - if len(out) == 0: - print ("Func pool doesn't have sumtotal") - else: - for items in (items for items in out ): - G.add_edge(element(items[0]).path,inn.path) - position = graphviz_layout(G) - xcord, ycord = [],[] - for item in position.items(): - xy = item[1] - xroundoff = round(xy[0],0) - yroundoff = round(xy[1],0) - xcord.append(xroundoff) - ycord.append(yroundoff) - - xmin = min(xcord) - xmax = max(xcord) - ymin = min(ycord) - ymax = max(ycord) - for item in position.items(): - xy = item[1] - anno = Annotator(item[0]+'/info') - Ax = (xy[0]-xmin)/(xmax-xmin) - Ay = (xy[1]-ymin)/(ymax-ymin) - #anno.x = round(Ax,1) - #anno.y = round(Ay,1) - #not roundingoff to max and min the co-ordinates for bigger model would overlay the co-ordinates - anno.x = xy[0] - anno.y = xy[1] -def find_index(value, key): - """ Value.get(key) to avoid expection which would raise if empty value in dictionary for a given key """ - if value.get(key) != None: - return value.get(key) - else: - raise ValueError('no dict with the key found') diff --git a/plugins/kkitQGraphics.py b/plugins/kkitQGraphics.py deleted file mode 100644 index 1f18019..0000000 --- a/plugins/kkitQGraphics.py +++ /dev/null @@ -1,718 +0,0 @@ - -__author__ = "HarshaRani" -__credits__ = ["Upi Lab"] -__license__ = "GPL3" -__version__ = "1.0.0" -__maintainer__ = "HarshaRani" -__email__ = "hrani@ncbs.res.in" -__status__ = "Development" -__updated__ = "Sep 19 2017" - -''' -sep 19: add GroupItem class -''' -#import sys -#sys.path.insert(0, '/home/harsha/trunk/gui') -import config -from PyQt4 import QtGui, QtCore, Qt -from moose import * -from PyQt4.QtGui import QPixmap, QImage, QGraphicsPixmapItem -from constants import * -from os import path - -class KineticsDisplayItem(QtGui.QGraphicsWidget): - """Base class for display elemenets in kinetics layout""" - name = ITEM - defaultFontName = "Helvetica" - defaultFontSize = 10 - def __init__(self, mooseObject, parent=None): - QtGui.QGraphicsObject.__init__(self,parent) - self.mobj = mooseObject - self.gobj = None - self.pressed = False - self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable,True) - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) - self.setAcceptHoverEvents(True) - self.setFocusPolicy(QtCore.Qt.StrongFocus) - if QtCore.QT_VERSION >= 0x040600: - self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges,1) - self.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, False) - - def getParentMooseObject(self): - return moose.element(self.mobj).parent - - def getParentGraphicsObject(self): - return self.parentItem() - - def setDisplayProperties(self, dinfo): - self.setGeometry(dinfo.x, dinfo.y) - - def paint(self, painter=None, option=None, widget = None): - #If item is selected - if self.hasFocus() or self.isSelected(): - painter.setPen(QtGui.QPen(QtGui.QPen(QtCore.Qt.black, 1.8,Qt.Qt.DashLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin))) - painter.drawRect(self.boundingRect()) - # def mouseDoubleClickEvent(self, event): - # self.emit(QtCore.SIGNAL("qgtextDoubleClick(PyQt_PyObject)"),element(self.mobj)) - - def itemChange(self,change,value): - #pass - #if change == QtGui.QGraphicsItem.ItemPositionChange: - #print "itemChange ---->",self.mobj - # self.emit(QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"),self.mobj) - if change == QtGui.QGraphicsItem.ItemSelectedChange and value == True: - self.emit(QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"),element(self.mobj)) - return QtGui.QGraphicsItem.itemChange(self,change,value) - -class FuncItem(KineticsDisplayItem): - name = ITEM - """Class for displaying Functions""" - #fontMetrics = None - font =QtGui.QFont(KineticsDisplayItem.defaultFontName) - font.setPointSize(KineticsDisplayItem.defaultFontSize) - fontMetrics = QtGui.QFontMetrics(font) - def __init__(self, mobj, parent): - super(FuncItem, self).__init__(mobj, parent) - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) - iconmap_file = (path.join(config.settings[config.KEY_ICON_DIR], 'classIcon/Function.png')) - self.funcImage = QImage(iconmap_file).scaled(15,33) - self.bg = QtGui.QGraphicsRectItem(self) - self.bg.setAcceptHoverEvents(True) - self.gobj = QtGui.QGraphicsPixmapItem(QtGui.QPixmap.fromImage(self.funcImage),self.bg) - #self.gobj = QtGui.QGraphicsPixmapItem(QtGui.QPixmap('../icons/classIcon/Function.png')) - self.gobj.setAcceptHoverEvents(True) - self.gobj.mobj = self.mobj - classname = self.mobj.className - funcdoc = (element(self.mobj.path)).expr - self.gobj.setToolTip(funcdoc) - #self.bg.setPen(Qt.QColor(100,100,10,10)) - - def setDisplayProperties(self,x,y,textcolor,bgcolor): - """Set the display properties of this item.""" - #With Respect to BuffPool (as parent which is in old genesis) then function are placed at 0,30 (which is below the BuffPool) - #else if droped from the GUI then placed wrt position - #self.setGeometry(0, 30,self.gobj.boundingRect().width(),self.gobj.boundingRect().height()) - #self.setGeometry(x,y) - poolt = ["ZombieBufPool","BufPool","ZombiePool","Pool"] - if self.gobj.mobj.parent.className in poolt: - self.setGeometry(0, 30,self.gobj.boundingRect().width(),self.gobj.boundingRect().height()) - else: - self.setGeometry(x,y,self.gobj.boundingRect().width(),self.gobj.boundingRect().height()) - self.bg.setBrush(QtGui.QBrush(bgcolor)) - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable,False) - def refresh(self,scale): - # fontsize = PoolItem.defaultFontsize*scale - # font =QtGui.QFont("Helvetica") - # font.setPointSize(fontsize) - # self.gobj.setFont(font) - pass - def boundingRect(self): - ''' reimplimenting boundingRect for redrawning ''' - return QtCore.QRectF(0,0,self.gobj.boundingRect().width(),self.gobj.boundingRect().height()) - - def updateSlot(self): - pass - # #This func will adjust the background color with respect to text size - # self.gobj.setText(self.mobj.name) - # self.bg.setRect(0, 0, self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '), self.gobj.boundingRect().height()) - - def updateColor(self,bgcolor): - #self.bg.setBrush(QtGui.QBrush(QtGui.QColor(bgcolor))) - pass - - def updateRect(self,ratio): - pass - # width = self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' ') - # height = self.gobj.boundingRect().height() - # adjustw = width*ratio - # adjusth = height*ratio - # self.bgColor.setRect(width/2-abs(adjustw/2),height/2-abs(adjusth/2),adjustw, adjusth) - #self.bg.setRect(0,0,self.gobj.boundingRect().width()*ratio+PoolItem.fontMetrics.width(' '), self.gobj.boundingRect().height()*ratio) - def returnColor(self): - return (self.bg.brush().color()) - - def updateValue(self,gobj): - self.gobj.setToolTip(funcdoc) - # self._gobj = gobj - # #if type(self._gobj) is moose.ZombiePool: - # if (isinstance(self._gobj,PoolBase)): - # self._conc = self.mobj.conc - # self._n = self.mobj.n - # doc = "Conc\t: "+str(self._conc)+"\nn\t: "+str(self._n) - # self.gobj.setToolTip(doc) - - -class PoolItem(KineticsDisplayItem): - name = ITEM - """Class for displaying pools. Uses a QGraphicsSimpleTextItem to - display the name.""" - #fontMetrics = None - font = QtGui.QFont(KineticsDisplayItem.defaultFontName) - font.setPointSize(KineticsDisplayItem.defaultFontSize) - fontMetrics = QtGui.QFontMetrics(font) - def __init__(self, mobj, parent): - KineticsDisplayItem.__init__(self, mobj, parent) - self.bg = QtGui.QGraphicsRectItem(self) - self.bg.setAcceptHoverEvents(True) - self.gobj = QtGui.QGraphicsSimpleTextItem(self.mobj.name, self.bg) - self.gobj.mobj = self.mobj - classname = self.mobj.className - # classname = 'PoolBase' - # doc = moose.element('/classes/%s' % (classname)).docs - # print "docs ",self.gobj.mobj, " ",doc - # doc = doc.split('Description:')[-1].split('Name:')[0].strip() - self._conc = self.mobj.conc - self._n = self.mobj.n - doc = "Conc\t: "+str(self._conc)+"\nn\t: "+str(self._n) - self.gobj.setToolTip(doc) - self.gobj.setFont(PoolItem.font) - if not PoolItem.fontMetrics: - PoolItem.fontMetrics = QtGui.QFontMetrics(self.gobj.font()) - self.bg.setRect(0, - 0, - self.gobj.boundingRect().width() - +PoolItem.fontMetrics.width(' '), - self.gobj.boundingRect().height()) - self.bg.setPen(Qt.QColor(0,0,0,0)) - self.gobj.setPos(PoolItem.fontMetrics.width(' '), 0) - def setDisplayProperties(self,x,y,textcolor,bgcolor): - """Set the display properties of this item.""" - self.setGeometry(x, y,self.gobj.boundingRect().width() - +PoolItem.fontMetrics.width(''), - self.gobj.boundingRect().height()) - self.bg.setBrush(QtGui.QBrush(bgcolor)) - - def refresh(self,scale): - fontsize = KineticsDisplayItem.defaultFontSize*scale - font = QtGui.QFont(KineticsDisplayItem.defaultFontName) - if (fontsize < 1): - fontsize = self.gobj.font().pointSize() - font.setPointSize(fontsize) - #self.gobj.setFont(PoolItem.font) - self.gobj.setFont(font) - - def boundingRect(self): - ''' reimplimenting boundingRect for redrawning ''' - return QtCore.QRectF(0,0,self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '),self.gobj.boundingRect().height()) - - def updateSlot(self): - #This func will adjust the background color with respect to text size - self.gobj.setText(self.mobj.name) - self.bg.setRect(0, 0, self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '), self.gobj.boundingRect().height()) - self.setGeometry(self.pos().x(),self.pos().y(),self.gobj.boundingRect().width() - +PoolItem.fontMetrics.width(''), - self.gobj.boundingRect().height()) - def updateColor(self,bgcolor): - self.bg.setBrush(QtGui.QBrush(QtGui.QColor(bgcolor))) - #pass - - def updateRect(self,ratio=1.0): - width = self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' ') - height = self.gobj.boundingRect().height() - adjustw = width*ratio - adjusth = height*ratio - self.bg.setRect(width/2-abs(adjustw/2),height/2-abs(adjusth/2),adjustw, adjusth) - #self.bg.setRect(0,0,self.gobj.boundingRect().width()*ratio+PoolItem.fontMetrics.width(' '), self.gobj.boundingRect().height()*ratio) - - def returnColor(self): - return (self.bg.brush().color()) - - def updateValue(self,gobj): - self._gobj = gobj - #if type(self._gobj) is moose.ZombiePool: - if (isinstance(self._gobj,PoolBase)): - self._conc = self.mobj.conc - self._n = self.mobj.n - doc = "Conc\t: "+str(self._conc)+"\nn\t: "+str(self._n) - self.gobj.setToolTip(doc) - -class PoolItemCircle(PoolItem): - name = ITEM - def __init__(self,*args,**kwargs): - PoolItem.__init__(self, *args, **kwargs) - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable,True) - self.bgColor = QtGui.QGraphicsEllipseItem(self) - self.bgColor.setFlag(QtGui.QGraphicsItem.ItemStacksBehindParent,True) - self.bgColor.setRect(((self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '))/2)-5,self.gobj.boundingRect().height()/2-5,10,10) - - def setDisplayProperties(self,x,y,textcolor,bgcolor): - self.setGeometry(x, y,self.gobj.boundingRect().width() - +PoolItem.fontMetrics.width(' '), - self.gobj.boundingRect().height()) - self.bgColor.setBrush(QtGui.QBrush(QtGui.QColor(bgcolor.red(),bgcolor.green(),bgcolor.blue(),255))) - - def updateRect(self,ratio): - width = self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' ') - height = self.gobj.boundingRect().height() - adjustw = width*ratio - adjusth = height*ratio - self.bgColor.setRect(width/2-abs(adjustw/2),height/2-abs(adjusth/2),adjustw, adjusth) - self.updateValue(self.gobj) - - def returnEllispeSize(self): - self.bgColor.setRect(((self.gobj.boundingRect().width()+PoolItem.fontMetrics.width(' '))/2)-5,self.gobj.boundingRect(). - height()/2-5,10,10) - - def refresh(self,scale): - fontsize = KineticsDisplayItem.defaultFontSize*scale - font =QtGui.QFont(KineticsDisplayItem.defaultFontName) - if (fontsize < 1): - fontsize = self.gobj.font().pointSize() - font.setPointSize(fontsize) - self.gobj.setFont(font) - - def MooseRef(self): - return self.gobj.mobj - -class TableItem(KineticsDisplayItem): - defaultWidth = 30 - defaultHeight = 30 - defaultPenWidth = 2 - name = ITEM - def __init__(self, *args, **kwargs): - KineticsDisplayItem.__init__(self, *args, **kwargs) - - points = [QtCore.QPointF(0,TableItem.defaultWidth/2), - QtCore.QPointF(TableItem.defaultHeight/2-2,0), - QtCore.QPointF(TableItem.defaultWidth/2+2,0), - QtCore.QPointF(TableItem.defaultWidth,TableItem.defaultHeight/2), - ] - - path = QtGui.QPainterPath() - path.moveTo(points[0]) - for p in points[1:]: - path.lineTo(p) - path.moveTo(p) - path.moveTo(0,0) - path.lineTo(TableItem.defaultWidth,0) - path.moveTo(-(TableItem.defaultWidth/3),TableItem.defaultHeight/4) - path.lineTo((TableItem.defaultWidth+10),TableItem.defaultHeight/4) - - self.gobj = QtGui.QGraphicsPathItem(path, self) - #self.gobj.setToolTip("Need to see what to show unlike conc/nint for pool") - tabledoc = (element(self.mobj.path)).outputValue - self.gobj.setToolTip(str(tabledoc)) - self.gobj.setPen(QtGui.QPen(QtCore.Qt.black, 2,Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) - self.gobj.mobj = self.mobj - - def refresh( self,scale): - defaultWidth = TableItem.defaultWidth*scale - defaultHeight = TableItem.defaultHeight*scale - points = [QtCore.QPointF(0,defaultWidth/2), - QtCore.QPointF(defaultHeight/2-2,0), - QtCore.QPointF(defaultWidth/2+2,0), - QtCore.QPointF(defaultWidth,defaultHeight/2) - ] - path = QtGui.QPainterPath() - path.moveTo(points[0]) - for p in points[1:]: - path.lineTo(p) - path.moveTo(p) - path.moveTo(0,0) - path.lineTo(defaultWidth,0) - path.moveTo(-(defaultWidth/3),defaultHeight/4) - path.lineTo((defaultWidth+10),defaultHeight/4) - self.gobj.setPath(path) - TablePen = self.gobj.pen() - defaultpenwidth = TableItem.defaultPenWidth - tableWidth = TableItem.defaultPenWidth*scale - TablePen.setWidth(tableWidth) - self.gobj.setPen(TablePen) - - def setDisplayProperties(self, x,y,textcolor,bgcolor): - #TODO check the table bounding reactangle b'cos selection looks ugly - """Set the display properties of this item.""" - self.setGeometry(x,y, - self.gobj.boundingRect().width(), - self.gobj.boundingRect().height()) - -class ReacItem(KineticsDisplayItem): - defaultWidth = 30 - defaultHeight = 30 - defaultPenWidth = 2 - name = ITEM - def __init__(self, *args, **kwargs): - KineticsDisplayItem.__init__(self, *args, **kwargs) - points = [QtCore.QPointF(ReacItem.defaultWidth/4, 0), - QtCore.QPointF(0, ReacItem.defaultHeight/4), - QtCore.QPointF(ReacItem.defaultWidth, ReacItem.defaultHeight/4), - QtCore.QPointF(3*ReacItem.defaultWidth/4, ReacItem.defaultHeight/2)] - path = QtGui.QPainterPath() - path.moveTo(points[0]) - for p in points[1:]: - path.lineTo(p) - path.moveTo(p) - self.gobj = QtGui.QGraphicsPathItem(path, self) - self.gobj.setPen(QtGui.QPen(QtCore.Qt.black, 2,Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) - self.gobj.mobj = self.mobj - #classname = self.mobj.className - # classname = 'ReacBase' - # doc = moose.element('/classes/%s' % (classname)).docs - # print "docs ",self.gobj.mobj, " ",doc - # doc = doc.split('Description:')[-1].split('Name:')[0].strip() - self._Kf = self.gobj.mobj.Kf - self._Kb = self.gobj.mobj.Kb - doc = "Kf\t: "+str(self._Kf)+"\nKb\t: "+str(self._Kb) - self.gobj.setToolTip(doc) - - def updateValue(self,gobj): - self._gobj = gobj - #if ( type(self._gobj) is moose.ZombieReac or type(self_gobj) is moose.Reac): - if (isinstance(self._gobj,ReacBase)): - self._Kf = self._gobj.Kf - self._Kb = self._gobj.Kb - doc = "Kf\t: "+str(self._Kf)+"\nKb\t: "+str(self._Kb) - self.gobj.setToolTip(doc) - - def refresh( self,scale): - defaultWidth = ReacItem.defaultWidth*scale - defaultHeight = ReacItem.defaultHeight*scale - points = [QtCore.QPointF(defaultWidth/4, 0), - QtCore.QPointF(0,defaultHeight/4), - QtCore.QPointF(defaultWidth, defaultHeight/4), - QtCore.QPointF(3*defaultWidth/4,defaultHeight/2)] - path = QtGui.QPainterPath() - path.moveTo(points[0]) - for p in points[1:]: - path.lineTo(p) - path.moveTo(p) - - self.gobj.setPath(path) - ReacPen = self.gobj.pen() - defaultpenwidth = ReacItem.defaultPenWidth - reacWidth = defaultpenwidth*scale - ReacPen.setWidth(reacWidth) - self.gobj.setPen(ReacPen) - - def setDisplayProperties(self, x,y,textcolor,bgcolor): - """Set the display properties of this item.""" - self.setGeometry(x,y, - self.gobj.boundingRect().width(), - self.gobj.boundingRect().height()) - -class EnzItem(KineticsDisplayItem): - defaultWidth = 20 - defaultHeight = 10 - name = ITEM - def __init__(self, *args, **kwargs): - KineticsDisplayItem.__init__(self, *args, **kwargs) - self.gobj = QtGui.QGraphicsEllipseItem(0, 0, - EnzItem.defaultWidth, - EnzItem.defaultHeight, self) - self.gobj.mobj = self.mobj - # classname = 'EnzBase' - # doc = moose.element('/classes/%s' % (classname)).docs - # doc = doc.split('Description:')[-1].split('Name:')[0].strip() - self._Km = self.gobj.mobj.Km - self._Kcat = self.gobj.mobj.kcat - doc = "Km\t: "+str(self._Km)+"\nKcat\t: "+str(self._Kcat) - self.gobj.setToolTip(doc) - - def updateValue(self,gobj): - self._gobj = gobj - if ( isinstance(self.gobj,EnzBase)): - self._Km = self._gobj.Km - self._Kcat = self._gobj.kcat - doc = "Km\t: "+str(self._Km)+"\nKcat\t: "+str(self._Kcat) - self.gobj.setToolTip(doc) - - def updateColor(self,bgcolor): - self.gobj.setBrush(QtGui.QBrush(QtGui.QColor(bgcolor))) - - def setDisplayProperties(self,x,y,textcolor,bgcolor): - """Set the display properties of this item.""" - self.setGeometry(x,y, - self.gobj.boundingRect().width(), - self.gobj.boundingRect().height()) - self.gobj.setBrush(QtGui.QBrush(bgcolor)) - - def refresh(self,scale): - defaultWidth = EnzItem.defaultWidth*scale - defaultHeight = EnzItem.defaultHeight*scale - self.gobj.setRect(0,0,defaultWidth,defaultHeight) - -class MMEnzItem(EnzItem): - name = ITEM - def __init__(self,*args, **kwargs): - EnzItem.__init__(self,*args, **kwargs) - -class CplxItem(KineticsDisplayItem): - defaultWidth = 10 - defaultHeight = 10 - name = ITEM - def __init__(self, *args, **kwargs): - KineticsDisplayItem.__init__(self, *args, **kwargs) - self.gobj = QtGui.QGraphicsRectItem(0,0, CplxItem.defaultWidth, CplxItem.defaultHeight, self) - self.gobj.mobj = self.mobj - self._conc = self.mobj.conc - self._n = self.mobj.n - doc = "Conc\t: "+str(self._conc)+"\nn\t: "+str(self._n) - self.gobj.setToolTip(doc) - - def updateValue(self,gobj): - self._gobj = gobj - if (isinstance(self._gobj,PoolBase)): - self._conc = self.mobj.conc - self._n = self.mobj.n - doc = "Conc\t: "+str(self._conc)+"\nn\t: "+str(self._n) - self.gobj.setToolTip(doc) - - def setDisplayProperties(self,x,y,textcolor,bgcolor): - """Set the display properties of this item.""" - self.setGeometry(self.gobj.boundingRect().width()/2,self.gobj.boundingRect().height(), - self.gobj.boundingRect().width(), - self.gobj.boundingRect().height()) - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable,False) - - def refresh(self,scale): - defaultWidth = CplxItem.defaultWidth*scale - defaultHeight = CplxItem.defaultHeight*scale - - self.gobj.setRect(0,0,defaultWidth,defaultHeight) -class GRPItem(QtGui.QGraphicsRectItem): - #This is used for displaying Grp Item - name = GROUP - def __init__(self,parent,x,y,w,h,item): - self.grpEmitter = QtCore.QObject() - QtGui.QGraphicsRectItem.__init__(self,x,y,w,h,parent) - self.mobj = item - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True); - self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable) - self.setAcceptHoverEvents(True) - self.setToolTip(self.mobj.name) - QT_VERSION = str(QtCore.QT_VERSION_STR).split('.') - QT_MINOR_VERSION = int(QT_VERSION[1]) - if config.QT_MINOR_VERSION >= 6: - self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges, 1) - - # def paint(self, painter=None, option=None, widget = None): - # print " self .hasFocus ",self.hasFocus(), " ## ",self.isSelected() - - # if self.isSelected(): - # drawFocus(painter) - # #painter.setPen(QtGui.QPen(QtGui.QPen(QtCore.Qt.black, 1.8,Qt.Qt.DashLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin))) - # #painter.drawRect(self.boundingRect()) - - # def drawFocusRect(self, painter): - # self.focusbrush = QtGui.QBrush() - # self.focuspen = QtGui.QPen(QtCore.Qt.DotLine) - # self.focuspen.setColor(QtCore.Qt.black) - # self.focuspen.setWidthF(1.5) - # painter.setBrush(self.focusbrush) - # painter.setPen(self.focuspen) - # painter.drawRect(self.focusrect) - - def itemChange(self,change,value): - #print " itemchange at GRPItem ",change,value - if change == QtGui.QGraphicsItem.ItemPositionChange: - self.grpEmitter.emit(QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"),self.mobj) - #if change == QtGui.QGraphicsItem. - if change == QtGui.QGraphicsItem.ItemSelectedChange and value == True: - #self.setPen(QtGui.QPen(QtGui.QPen(QtCore.Qt.black, 1.8,Qt.Qt.DashLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin))) - #self.drawRect(self.boundingRect()) - self.grpEmitter.emit(QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"),self.mobj) - - return QtGui.QGraphicsItem.itemChange(self,change,value) - -class ComptItem(QtGui.QGraphicsRectItem): - name = COMPARTMENT - def __init__(self,parent,x,y,w,h,item): - self.cmptEmitter = QtCore.QObject() - iParent = item - ''' - self._rect = QtCore.QRectF(x,y,w,h) - self._scene = parent - print "self comptItem",self._scene.sceneContainer ," and",self._scene.sceneContainer.graphicsView - self.mouseOver = False - self.resizeHandleSize = 4.0 - self.mousePressPos = None - self.mouseMovePos = None - self.mouseIsPressed = False - #self.setAcceptsHoverEvents(True) - self.updateResizeHandles() - ''' - if hasattr(iParent, "__iter__"): - self.mobj = iParent[0] - else: - self.mobj = iParent - self.layoutWidgetPt = parent - QtGui.QGraphicsRectItem.__init__(self,x,y,w,h) - - self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True); - self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable) - #self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges, 1) - QT_VERSION = str(QtCore.QT_VERSION_STR).split('.') - QT_MINOR_VERSION = int(QT_VERSION[1]) - if QT_MINOR_VERSION >= 6: - #if config.QT_MINOR_VERSION >= 6: - self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges, 1) - self.setAcceptHoverEvents(True) - self.setToolTip(iParent.name) - ''' - def hoverEnterEvent(self, event): - self.updateResizeHandles() - self.mouseOver = True - self.prepareGeometryChange() - - def hoverLeaveEvent(self, event): - self.mouseOver = False - self.prepareGeometryChange() - - def hoverMoveEvent(self, event): - - if self.topLeft.contains(event.scenePos()) or self.bottomRight.contains(event.scenePos()): - self.setCursor(QtCore.Qt.SizeFDiagCursor) - elif self.topRight.contains(event.scenePos()) or self.bottomLeft.contains(event.scenePos()): - self.setCursor(QtCore.Qt.SizeBDiagCursor) - else: - self.setCursor(QtCore.Qt.SizeAllCursor) - - QtGui.QGraphicsRectItem.hoverMoveEvent(self, event) - - def mousePressEvent(self, event): - """ - Capture mouse press events and find where the mosue was pressed on the object - """ - self.mousePressPos = event.scenePos() - self.mouseIsPressed = True - self.rectPress = copy.deepcopy(self._rect) - - # Top left corner - if self.topLeft.contains(event.scenePos()): - self.mousePressArea = 'topleft' - # top right corner - elif self.topRight.contains(event.scenePos()): - self.mousePressArea = 'topright' - # bottom left corner - elif self.bottomLeft.contains(event.scenePos()): - self.mousePressArea = 'bottomleft' - # bottom right corner - elif self.bottomRight.contains(event.scenePos()): - self.mousePressArea = 'bottomright' - # entire rectangle - else: - self.mousePressArea = None - - QtGui.QGraphicsRectItem.mousePressEvent(self, event) - - def mouseReleaseEvent(self, event): - """ - Capture nmouse press events. - """ - self.mouseIsPressed = False - - self.updateResizeHandles() - self.prepareGeometryChange() - - QtGui.QGraphicsRectItem.mouseReleaseEvent(self, event) - - def mouseMoveEvent(self, event): - """ - Handle mouse move events. - """ - self.mouseMovePos = event.scenePos() - - if self.mouseIsPressed: - # Move top left corner - if self.mousePressArea=='topleft': - self._rect.setTopLeft(self.rectPress.topLeft()-(self.mousePressPos-self.mouseMovePos)) - # Move top right corner - elif self.mousePressArea=='topright': - self._rect.setTopRight(self.rectPress.topRight()-(self.mousePressPos-self.mouseMovePos)) - # Move bottom left corner - elif self.mousePressArea=='bottomleft': - self._rect.setBottomLeft(self.rectPress.bottomLeft()-(self.mousePressPos-self.mouseMovePos)) - # Move bottom right corner - elif self.mousePressArea=='bottomright': - self._rect.setBottomRight(self.rectPress.bottomRight()-(self.mousePressPos-self.mouseMovePos)) - # Move entire rectangle, don't resize - else: - self._rect.moveCenter(self.rectPress.center()-(self.mousePressPos-self.mouseMovePos)) - - self.updateResizeHandles() - self.prepareGeometryChange() - - QtGui.QGraphicsRectItem.mousePressEvent(self, event) - - def boundingRect(self): - """ - Return bounding rectangle - """ - return self._boundingRect - - def updateResizeHandles(self): - """ - Update bounding rectangle and resize handles - """ - self.offset = self.resizeHandleSize*(self._scene.sceneContainer.graphicsView.mapToScene(1,0)-self._scene.sceneContainer.graphicsView.mapToScene(0,1)).x() - - self._boundingRect = self._rect.adjusted(-self.offset, self.offset, self.offset, -self.offset) - - # Note: this draws correctly on a view with an inverted y axes. i.e. QGraphicsView.scale(1,-1) - self.topLeft = QtCore.QRectF(self._boundingRect.topLeft().x(), self._boundingRect.topLeft().y() - 2*self.offset, - 2*self.offset, 2*self.offset) - self.topRight = QtCore.QRectF(self._boundingRect.topRight().x() - 2*self.offset, self._boundingRect.topRight().y() - 2*self.offset, - 2*self.offset, 2*self.offset) - self.bottomLeft = QtCore.QRectF(self._boundingRect.bottomLeft().x(), self._boundingRect.bottomLeft().y(), - 2*self.offset, 2*self.offset) - self.bottomRight = QtCore.QRectF(self._boundingRect.bottomRight().x() - 2*self.offset, self._boundingRect.bottomRight().y(), - 2*self.offset, 2*self.offset) - - def paint(self, painter, option, widget): - """ - Paint Widget - """ - - # show boundingRect for debug purposes - painter.setPen(QtGui.QPen(QtCore.Qt.red, 0, QtCore.Qt.DashLine)) - painter.drawRect(self._boundingRect) - - # Paint rectangle - painter.setPen(QtGui.QPen(QtCore.Qt.black, 0, QtCore.Qt.SolidLine)) - painter.drawRect(self._rect) - - # If mouse is over, draw handles - if self.mouseOver: - # if rect selected, fill in handles - if self.isSelected(): - painter.setBrush(QtGui.QBrush(QtGui.QColor(0,0,0))) - painter.drawRect(self.topLeft) - painter.drawRect(self.topRight) - painter.drawRect(self.bottomLeft) - painter.drawRect(self.bottomRight) - ''' - def pointerLayoutpt(self): - return (self.layoutWidgetPt) - - # def mouseDoubleClickEvent(self, event): - # self.cmptEmitter.emit(QtCore.SIGNAL("qgtextDoubleClick(PyQt_PyObject)"),element(self.mooseObj_)) - - def itemChange(self,change,value): - if change == QtGui.QGraphicsItem.ItemPositionChange: - self.cmptEmitter.emit(QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"),self.mobj) - if change == QtGui.QGraphicsItem.ItemSelectedChange and value == True: - self.cmptEmitter.emit(QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"),self.mobj) - return QtGui.QGraphicsItem.itemChange(self,change,value) - - -if __name__ == '__main__': - app = QtGui.QApplication(sys.argv) - a = moose.Pool('pool') - b = moose.Reac('reac') - c = moose.Enz('enzyme') - gview = QtGui.QGraphicsView() - scene = QtGui.QGraphicsScene(gview) - #item = PoolItem(a) - #dinfo = (5, 5, QtGui.QColor('red'), QtGui.QColor('blue')) - #item.setDisplayProperties(dinfo) - reacItem = ReacItem(b) - reacItem.setDisplayProperties(50, 5, QtGui.QColor('yellow'), QtGui.QColor('green')) - enzItem = EnzItem(c) - enzItem.setDisplayProperties(100, 10, QtGui.QColor('blue'), QtGui.QColor('yellow')) - #scene.addItem(item) - scene.addItem(reacItem) - scene.addItem(enzItem) - gview.setScene(scene) - #print 'Position', reacItem.pos() - gview.show() - sys.exit(app.exec_()) diff --git a/plugins/modelBuild.py b/plugins/modelBuild.py deleted file mode 100644 index 260c8af..0000000 --- a/plugins/modelBuild.py +++ /dev/null @@ -1,332 +0,0 @@ -__author__ = "HarshaRani" -__credits__ = ["Upi Lab"] -__license__ = "GPL3" -__version__ = "1.0.0" -__maintainer__ = "HarshaRani" -__email__ = "hrani@ncbs.res.in" -__status__ = "Development" -__updated__ = "Apr 11 2018" - -import moose -from kkitQGraphics import * -from kkitOrdinateUtil import * -from kkitUtil import * -import PyQt4 -from setsolver import * - -def updateCompartmentSize(qGraCompt): - #childBoundingRect = qGraCompt.childrenBoundingRect() - childBoundingRect = calculateChildBoundingRect(qGraCompt) - comptBoundingRect = qGraCompt.boundingRect() - rectcompt = comptBoundingRect.united(childBoundingRect) - comptPen = qGraCompt.pen() - comptWidth = 1 - comptPen.setWidth(comptWidth) - qGraCompt.setPen(comptPen) - if not comptBoundingRect.contains(childBoundingRect): - qGraCompt.setRect(rectcompt.x()-comptWidth,rectcompt.y()-comptWidth,rectcompt.width()+(comptWidth*2),rectcompt.height()+(comptWidth*2)) - -# def checkCreate(string,num,itemAt,qGraCompt,modelRoot,scene,pos,posf,view,qGIMob): -def checkCreate(scene,view,modelpath,mobj,string,ret_string,num,event_pos,layoutPt): - # The variable 'compt' will be empty when dropping cubeMesh,cyclMesh, but rest it shd be - # compartment - # if modelpath.find('/',1) > -1: - # modelRoot = modelpath[0:modelpath.find('/',1)] - # else: - # modelRoot = modelpath - if moose.exists(modelpath+'/info'): - mType = moose.Annotator((moose.element(modelpath+'/info'))).modeltype - itemAtView = view.sceneContainerPt.itemAt(view.mapToScene(event_pos)) - pos = view.mapToScene(event_pos) - modelpath = moose.element(modelpath) - if num: - string_num = ret_string+str(num) - else: - string_num = ret_string - if string == "CubeMesh" or string == "CylMesh": - if string == "CylMesh": - mobj = moose.CylMesh(modelpath.path+'/'+string_num) - else: - mobj = moose.CubeMesh(modelpath.path+'/'+string_num) - - mobj.volume = 1e-15 - mesh = moose.element(mobj.path+'/mesh') - qGItem = ComptItem(scene,pos.toPoint().x(),pos.toPoint().y(),100,100,mobj) - qGItem.setPen(QtGui.QPen(Qt.QColor(66,66,66,100), 1, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)) - view.sceneContainerPt.addItem(qGItem) - qGItem.cmptEmitter.connect(qGItem.cmptEmitter,QtCore.SIGNAL("qgtextPositionChange(PyQt_PyObject)"),layoutPt.positionChange1) - qGItem.cmptEmitter.connect(qGItem.cmptEmitter,QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"),layoutPt.objectEditSlot) - compartment = qGItem - layoutPt.qGraCompt[mobj]= qGItem - view.emit(QtCore.SIGNAL("dropped"),mobj) - - elif string == "Pool" or string == "BufPool": - #getting pos with respect to compartment otherwise if compartment is moved then pos would be wrong - posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() - if string == "Pool": - poolObj = moose.Pool(mobj.path+'/'+string_num) - else: - poolObj = moose.BufPool(mobj.path+'/'+string_num) - - poolinfo = moose.Annotator(poolObj.path+'/info') - #Compartment's one Pool object is picked to get the font size - - qGItem = PoolItem(poolObj,itemAtView) - layoutPt.mooseId_GObj[poolObj] = qGItem - posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() - bgcolor = getRandColor() - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y(),QtGui.QColor('green'),bgcolor) - poolinfo.color = str(bgcolor.getRgb()) - view.emit(QtCore.SIGNAL("dropped"),poolObj) - setupItem(modelpath.path,layoutPt.srcdesConnection) - layoutPt.drawLine_arrow(False) - x,y = roundoff(qGItem.scenePos(),layoutPt) - poolinfo.x = x - poolinfo.y = y - #Dropping is on compartment then update Compart size - if isinstance(mobj,moose.ChemCompt): - compt = layoutPt.qGraCompt[moose.element(mobj)] - updateCompartmentSize(compt) - - elif string == "Reac": - posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() - reacObj = moose.Reac(mobj.path+'/'+string_num) - reacinfo = moose.Annotator(reacObj.path+'/info') - qGItem = ReacItem(reacObj,itemAtView) - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y(),"white", "white") - #if mType == "new_kkit": - # reacinfo.x = posWrtComp.x() - # reacinfo.y = posWrtComp.y() - layoutPt.mooseId_GObj[reacObj] = qGItem - view.emit(QtCore.SIGNAL("dropped"),reacObj) - setupItem(modelpath.path,layoutPt.srcdesConnection) - layoutPt.drawLine_arrow(False) - #Dropping is on compartment then update Compart size - if isinstance(mobj,moose.ChemCompt): - compt = layoutPt.qGraCompt[moose.element(mobj)] - updateCompartmentSize(compt) - x,y = roundoff(qGItem.scenePos(),layoutPt) - reacinfo.x = x - reacinfo.y = y - - elif string == "StimulusTable": - posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() - tabObj = moose.StimulusTable(mobj.path+'/'+string_num) - tabinfo = moose.Annotator(tabObj.path+'/info') - qGItem = TableItem(tabObj,itemAtView) - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y(),QtGui.QColor('white'),QtGui.QColor('white')) - #if mType == "new_kkit": - #tabinfo.x = posWrtComp.x() - #tabinfo.y = posWrtComp.y() - layoutPt.mooseId_GObj[tabObj] = qGItem - view.emit(QtCore.SIGNAL("dropped"),tabObj) - setupItem(modelpath.path,layoutPt.srcdesConnection) - layoutPt.drawLine_arrow(False) - #Dropping is on compartment then update Compart size - if isinstance(mobj,moose.ChemCompt): - compt = layoutPt.qGraCompt[moose.element(mobj)] - updateCompartmentSize(compt) - x,y = roundoff(qGItem.scenePos(),layoutPt) - tabinfo.x = x - tabinfo.y = y - - elif string == "Function": - posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() - funcObj = moose.Function(mobj.path+'/'+string_num) - funcinfo = moose.Annotator(funcObj.path+'/info') - #moose.connect( funcObj, 'valueOut', mobj ,'setN' ) - poolclass = ["ZombieBufPool","BufPool"] - comptclass = ["CubeMesh","cyclMesh"] - - if mobj.className in poolclass: - funcParent = layoutPt.mooseId_GObj[element(mobj.path)] - elif mobj.className in comptclass: - funcParent = layoutPt.qGraCompt[moose.element(mobj)] - posWrtComp = funcParent.mapFromScene(pos).toPoint() - #posWrtComp = (itemAtView.mapFromScene(pos)).toPoint() - elif mobj.className in "Neutral": - funcParent = layoutPt.qGraGrp[element(mobj)] - - qGItem = FuncItem(funcObj,funcParent) - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y(),QtGui.QColor('red'),QtGui.QColor('green')) - layoutPt.mooseId_GObj[funcObj] = qGItem - #if mType == "new_kkit": - #funcinfo.x = posWrtComp.x() - #funcinfo.y = posWrtComp.y() - view.emit(QtCore.SIGNAL("dropped"),funcObj) - setupItem(modelpath.path,layoutPt.srcdesConnection) - layoutPt.drawLine_arrow(False) - #Dropping is on compartment then update Compart size - mooseCmpt = findCompartment(mobj) - if isinstance(mooseCmpt,moose.ChemCompt): - compt = layoutPt.qGraCompt[moose.element(mooseCmpt)] - updateCompartmentSize(compt) - x,y = roundoff(qGItem.scenePos(),layoutPt) - funcinfo.x = x - funcinfo.y = y - - elif string == "Enz" or string == "MMenz": - #If 2 enz has same pool parent, then pos of the 2nd enz shd be displaced by some position, need to check how to deal with it - posWrtComp = pos - enzPool = layoutPt.mooseId_GObj[mobj] - if ((mobj.parent).className == "Enz"): - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' has to have Pool as its parent and not Enzyme Complex'.format(newString =string),QtGui.QMessageBox.Ok) - return - else: - enzparent = findCompartment(mobj) - parentcompt = layoutPt.qGraCompt[enzparent] - if string == "Enz": - enzObj = moose.Enz(moose.element(mobj).path+'/'+string_num) - enzinfo = moose.Annotator(enzObj.path+'/info') - moose.connect( enzObj, 'enz', mobj, 'reac' ) - qGItem = EnzItem(enzObj,parentcompt) - layoutPt.mooseId_GObj[enzObj] = qGItem - posWrtComp = pos - bgcolor = getRandColor() - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y()-40,QtGui.QColor('green'),bgcolor) - x,y = roundoff(qGItem.scenePos(),layoutPt) - enzinfo.x = x - enzinfo.y = y - enzinfo.color = str(bgcolor.name()) - enzinfo.textColor = str(QtGui.QColor('green').name()) - #if mType == "new_kkit": - #enzinfo.x = posWrtComp.x() - #enzinfo.y = posWrtComp.y() - - #enzinfo.color = str(bgcolor.name()) - e = moose.Annotator(enzinfo) - #e.x = posWrtComp.x() - #e.y = posWrtComp.y() - Enz_cplx = enzObj.path+'/'+string_num+'_cplx'; - cplxItem = moose.Pool(Enz_cplx) - cplxinfo = moose.Annotator(cplxItem.path+'/info') - qGEnz = layoutPt.mooseId_GObj[enzObj] - qGItem = CplxItem(cplxItem,qGEnz) - layoutPt.mooseId_GObj[cplxItem] = qGItem - enzboundingRect = qGEnz.boundingRect() - moose.connect( enzObj, 'cplx', cplxItem, 'reac' ) - qGItem.setDisplayProperties(enzboundingRect.height()/2,enzboundingRect.height()-40,QtGui.QColor('white'),QtGui.QColor('white')) - #cplxinfo.x = enzboundingRect.height()/2 - #cplxinfo.y = enzboundingRect.height()-60 - view.emit(QtCore.SIGNAL("dropped"),enzObj) - - else: - enzObj = moose.MMenz(mobj.path+'/'+string_num) - enzinfo = moose.Annotator(enzObj.path+'/info') - moose.connect(mobj,"nOut",enzObj,"enzDest") - qGItem = MMEnzItem(enzObj,parentcompt) - posWrtComp = pos - bgcolor = getRandColor() - qGItem.setDisplayProperties(posWrtComp.x(),posWrtComp.y()-30,QtGui.QColor('green'),bgcolor) - #enzinfo.x = posWrtComp.x() - #enzinfo.y = posWrtComp.y() - enzinfo.color = str(bgcolor.name()) - layoutPt.mooseId_GObj[enzObj] = qGItem - view.emit(QtCore.SIGNAL("dropped"),enzObj) - x,y = roundoff(qGItem.scenePos(),layoutPt) - enzinfo.x = x - enzinfo.y = y - setupItem(modelpath.path,layoutPt.srcdesConnection) - layoutPt.drawLine_arrow(False) - - #Dropping is on compartment then update Compart size - if isinstance(enzparent,moose.ChemCompt): - updateCompartmentSize(parentcompt) - if view.iconScale != 1: - view.updateScale(view.iconScale) - -def createObj(scene,view,modelpath,string,pos,layoutPt): - event_pos = pos - num = 0 - ret_string = " " - pos = view.mapToScene(event_pos) - itemAt = view.sceneContainerPt.itemAt(pos) - chemMesh = moose.wildcardFind(modelpath+'/##[ISA=ChemCompt]') - deleteSolver(modelpath) - mobj = "" - - if itemAt != None: - itemAtView = view.sceneContainerPt.itemAt(view.mapToScene(event_pos)) - itemClass = type(itemAtView).__name__ - if ( itemClass == 'QGraphicsRectItem'): - mobj = itemAtView.parentItem().mobj - elif(itemClass == 'QGraphicsSvgItem'): - mobj = itemAtView.parent().mobj - else: - mobj = itemAtView.mobj - if string == "CubeMesh" or string == "CylMesh": - ret_string,num = findUniqId(moose.element(modelpath),"Compartment",0) - comptexist = moose.wildcardFind(modelpath+'/##[ISA=ChemCompt]') - if not len(comptexist): - if itemAt != None: - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' currently single compartment model building is allowed'.format(newString =string),QtGui.QMessageBox.Ok) - return - else: - mobj = moose.element(modelpath) - else: - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' currently single compartment model building is allowed'.format(newString =string),QtGui.QMessageBox.Ok) - return - - elif string == "Pool" or string == "BufPool" or string == "Reac" or string == "StimulusTable": - if itemAt == None: - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' has to have compartment as its parent'.format(newString =string),QtGui.QMessageBox.Ok) - return - else: - mobj = findCompartment(mobj) - ret_string,num = findUniqId(mobj,string,num) - - elif string == "Function": - #mobj = findCompartment(mobj) - ret_string,num = findUniqId(mobj,string,num) - ''' - if itemAt != None: - if ((mobj).className != "BufPool"): - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' has to have BufPool as its parent'.format(newString =string),QtGui.QMessageBox.Ok) - return - else: - ret_string,num = findUniqId(mobj,string,num) - else: - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' has to have BufPool as its parent'.format(newString =string),QtGui.QMessageBox.Ok) - return - ''' - elif string == "Enz" or string == "MMenz": - if itemAt != None: - if ((mobj).className != "Pool" and (mobj).className != "BufPool"): - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' has to have Pool as its parent'.format(newString =string),QtGui.QMessageBox.Ok) - return - else: - ret_string,num = findUniqId(mobj,string,num) - else: - QtGui.QMessageBox.information(None,'Drop Not possible','\'{newString}\' has to have Pool as its parent'.format(newString =string),QtGui.QMessageBox.Ok) - return - - if ret_string != " ": - checkCreate(scene,view,modelpath,mobj,string,ret_string,num,event_pos,layoutPt) - -def roundoff(scenePos,layoutPt): - xtest = scenePos.x()/layoutPt.defaultScenewidth - xroundoff = round(xtest,1) - - ytest = scenePos.y()/layoutPt.defaultSceneheight - yroundoff = round(ytest,1) - - return(xroundoff,yroundoff) - -def findUniqId(mobj,string,num): - if num == 0: - path = mobj.path+'/'+string; - else: - path = mobj.path+'/'+string+str(num); - if not moose.exists(path): - return(string,num) - else: - num +=1; - return(findUniqId(mobj,string,num)) - -def findCompartment(mooseObj): - if mooseObj.path == '/': - return None - elif isinstance(mooseObj,ChemCompt): - return (mooseObj) - else: - return findCompartment(moose.element(mooseObj.parent)) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ebbd809 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pymoose +pyqt5 +networkx diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..0fbfe08 --- /dev/null +++ b/setup.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2016, Dilawar Singh" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import os +import sys +from setuptools import setup + +demofiles = [] + +version_ = '0.1.0' + +demoDir = os.path.join(os.path.dirname(__file__), 'demos') + +for d, sd, fs in os.walk( demoDir ): + for f in fs: + filepath = os.path.join( d, f ).replace( demoDir, '' ) + demofiles.append( filepath ) + +setup( + name = "moosegui", + version = version_, + description = "Graphical User Interface of MOOSE simulator", + long_description = open( 'README.md' ).read(), + packages = [ "moosegui", 'moosegui.plugins', "moosegui.demos" + , 'suds', 'suds.bindings', 'suds.sax', 'suds.mx', 'suds.xsd' + , 'suds.umx', 'suds.transport' + ], + package_dir = { + 'moosegui' : 'moosegui' + , 'moosegui.demos' : '.' + , 'moosegui.plugins' : 'moosegui/plugins' + , 'suds' : 'suds' + }, + package_data = { + 'moosegui' : [ 'icons/*', 'colormaps/*' ] + demofiles + , 'moosegui.demos' : [ '*' ] + demofiles + , 'moosegui.plugins' : [ 'datastore/*', 'list.txt' ] + }, + author = open('AUTHOR').read(), + maintainer = 'Dilawar Singh', + maintainer_email = 'dilawars@ncbs.res.in', + url = "http://github.com/BhallaLab/moose-gui", + license='GPLv3', + install_requires = [ 'pymoose', 'pyqt5' ], + entry_points = { + 'console_scripts' : [ + 'moosegui = moosegui.mgui:main' + ], + }, +) diff --git a/sidebar.py b/sidebar.py deleted file mode 100644 index d14b1af..0000000 --- a/sidebar.py +++ /dev/null @@ -1,244 +0,0 @@ - -# -*- coding: utf-8 -*- -from __future__ import print_function - -"""Sidebar for plugins. The sidebar comprises of actions. -Currently mode, connect and settings are defined. -""" - -__author__ = "Aviral Goel" -__credits__ = ["Upi Lab"] -__license__ = "GPL3" -__version__ = "1.0.0" -__maintainer__ = "Aviral Goel" -__email__ = "goel.aviral@gmail.com" -__status__ = "Development" - - -import sys -import os -import SettingsDialog -from PyQt4 import QtGui, Qt -from PyQt4.QtGui import QDialog -from PyQt4.QtGui import QHBoxLayout -from PyQt4.QtGui import QPixmap -from PyQt4.QtGui import QIcon -from PyQt4.QtGui import QPushButton -from PyQt4.QtGui import QAction - - - -ICON_DIRECTORY = "icons" -HAND_ICON_FILENAME = "hand.png" -CONNECTOR_ICON_FILENAME = "straight_connector_with_filled_circles.png" -WRENCH_ICON_FILENAME = "wrench.png" -DELETE_GRAPH_ICON_FILENAME = "add_graph.png" -ADD_GRAPH_ICON_FILENAME = "delete_graph.png" -LIST_ICON_FILENAME = "list.png" - - -def create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ): - pixmap = QPixmap(icon_path) - icon = QIcon(pixmap) - action = QAction(icon, text, parent) - # action.setIcon(icon) - # action.setIconText(text) - action.triggered.connect(callback) - action.setCheckable(checkable) - action.setChecked(checked) - return action - - -def mode_action( parent - , callback = (lambda event: print("Mode Clicked!")) - , text = "Mode" - , checkable = True - , checked = True - , icon_path = os.path.join( ICON_DIRECTORY - , HAND_ICON_FILENAME - ) - ): - return create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ) - -def add_graph_action( parent - , callback = (lambda event: print("Add Graph Clicked!")) - , text = "Add Graph" - , checkable = False - , checked = False - , icon_path = os.path.join( ICON_DIRECTORY - , ADD_GRAPH_ICON_FILENAME - ) - ): - return create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ) - -def delete_graph_action( parent - , callback = (lambda event: print("Delete Graph Clicked!")) - , text = "Delete Graph" - , checkable = False - , checked = False - , icon_path = os.path.join( ICON_DIRECTORY - , DELETE_GRAPH_ICON_FILENAME - ) - ): - return create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ) - -def list_action( parent - , callback = (lambda event: print("List Clicked!")) - , text = "Show List" - , checkable = False - , checked = False - , icon_path = os.path.join( ICON_DIRECTORY - , LIST_ICON_FILENAME - ) - ): - return create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ) - -def connector_action( parent - , callback = (lambda event: print("Connector Clicked!")) - , text = "Mode" - , checkable = True - , checked = False - , icon_path = os.path.join( ICON_DIRECTORY - , CONNECTOR_ICON_FILENAME - ) - ): - return create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ) - -def settings_action( parent - , callback = (lambda event: print("Settings Clicked")) - , text = "Mode" - , checkable = False - , checked = False - , icon_path = os.path.join( ICON_DIRECTORY - , WRENCH_ICON_FILENAME - ) - ): - return create_action( parent - , callback - , text - , checkable - , checked - , icon_path - ) - - - # actions - # , left_spacer = False - # , right_spacer = False - -def sidebar(): - return QtGui.QToolBar() - # bar.setOrientation(Qt.Qt.Vertical) - # return bar - # if left_spacer: - # left_spacer = QWidget() - # left_spacer.setSizePolicy( QtGui.QSizePolicy.Expanding - # , QtGui.QSizePolicy.Expanding - # ) - # toolbar.addWidget(left_spacer) - - # for action in actions: - # toolbar.addAction(action(toolbar)) - - # if right_spacer: - # right_spacer = QWidget() - # right_spacer.setSizePolicy( QtGui.QSizePolicy.Expanding - # , QtGui.QSizePolicy.Expanding - # ) - # toolbar.addWidget(right_spacer) - - # return toolbar - - - - -# def connect_action(): - -# def settings_action(): - - - -def main(): - app = QtGui.QApplication(sys.argv) - window = QtGui.QMainWindow() - widget = SettingsDialog.SettingsWidget({ - 'LeakyIaF':['Vm'], - 'Compartment':['Vm','Im'], - 'HHChannel':['Ik','Gk'], - 'ZombiePool':['n','conc'], - 'ZombieBufPool':['n','conc'], - 'HHChannel2D':['Ik','Gk'], - 'CaConc':['Ca'] - }) - d = QDialog() - l = QHBoxLayout() - d.setLayout(l) - l.addWidget(widget) - bar = sidebar() - bar.addAction(mode_action(bar)) - bar.addAction(connector_action(bar)) - bar.addAction(settings_action(bar, d.show)) - window.addToolBar(bar) - window.show() - sys.exit(app.exec_()) - - -if __name__ == "__main__": - main() - -# # spacer widget for left -# # spacer widget for right -# # you can't add the same widget to both left and right. you need two different widgets. -# right_spacer = QtGui.QWidget() -# right_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) - -# # here goes the left one -# # toolbar.addWidget(left_spacer) -# # some dummy actions - - - -# ################################################################################ -# # Hand Tool -# ################################################################################ - - - - - diff --git a/suds/__init__.py b/suds/__init__.py index a907102..42eef79 100644 --- a/suds/__init__.py +++ b/suds/__init__.py @@ -25,7 +25,7 @@ # Project properties # -from version import __build__, __version__ +from .version import __build__, __version__ # @@ -34,19 +34,19 @@ class MethodNotFound(Exception): def __init__(self, name): - Exception.__init__(self, u"Method not found: '%s'" % name) + Exception.__init__(self, "Method not found: '%s'" % name) class PortNotFound(Exception): def __init__(self, name): - Exception.__init__(self, u"Port not found: '%s'" % name) + Exception.__init__(self, "Port not found: '%s'" % name) class ServiceNotFound(Exception): def __init__(self, name): - Exception.__init__(self, u"Service not found: '%s'" % name) + Exception.__init__(self, "Service not found: '%s'" % name) class TypeNotFound(Exception): def __init__(self, name): - Exception.__init__(self, u"Type not found: '%s'" % tostr(name)) + Exception.__init__(self, "Type not found: '%s'" % tostr(name)) class BuildError(Exception): msg = """ @@ -71,7 +71,7 @@ def __init__(self, name): class WebFault(Exception): def __init__(self, fault, document): if hasattr(fault, 'faultstring'): - Exception.__init__(self, u"Server raised fault: '%s'" % + Exception.__init__(self, "Server raised fault: '%s'" % fault.faultstring) self.fault = fault self.document = document @@ -104,7 +104,7 @@ def objid(obj): def tostr(object, encoding=None): """ get a unicode safe string representation of an object """ - if isinstance(object, basestring): + if isinstance(object, str): if encoding is None: return object else: @@ -112,7 +112,7 @@ def tostr(object, encoding=None): if isinstance(object, tuple): s = ['('] for item in object: - if isinstance(item, basestring): + if isinstance(item, str): s.append(item) else: s.append(tostr(item)) @@ -122,7 +122,7 @@ def tostr(object, encoding=None): if isinstance(object, list): s = ['['] for item in object: - if isinstance(item, basestring): + if isinstance(item, str): s.append(item) else: s.append(tostr(item)) @@ -131,13 +131,13 @@ def tostr(object, encoding=None): return ''.join(s) if isinstance(object, dict): s = ['{'] - for item in object.items(): - if isinstance(item[0], basestring): + for item in list(object.items()): + if isinstance(item[0], str): s.append(item[0]) else: s.append(tostr(item[0])) s.append(' = ') - if isinstance(item[1], basestring): + if isinstance(item[1], str): s.append(item[1]) else: s.append(tostr(item[1])) @@ -145,7 +145,7 @@ def tostr(object, encoding=None): s.append('}') return ''.join(s) try: - return unicode(object) + return str(object) except: return str(object) @@ -155,7 +155,7 @@ def tostr(object, encoding=None): # if sys.version_info < (3, 0): - from cStringIO import StringIO as BytesIO + from io import StringIO as BytesIO else: from io import BytesIO @@ -165,7 +165,7 @@ class UnicodeMixin(object): # For Python 3, __str__() and __unicode__() should be identical. __str__ = lambda x: x.__unicode__() else: - __str__ = lambda x: unicode(x).encode('utf-8') + __str__ = lambda x: str(x).encode('utf-8') # Used instead of byte literals because they are not supported on Python # versions prior to 2.6. @@ -177,8 +177,8 @@ def byte_str(s='', encoding='utf-8', input_encoding='utf-8', errors='strict'): strings encoded using the given input encoding. """ - assert isinstance(s, basestring) - if isinstance(s, unicode): + assert isinstance(s, str) + if isinstance(s, str): return s.encode(encoding, errors) if s and encoding != input_encoding: return s.decode(input_encoding, errors).encode(encoding, errors) diff --git a/suds/argparser.py b/suds/argparser.py index 67bdb02..ba8e5e1 100644 --- a/suds/argparser.py +++ b/suds/argparser.py @@ -161,7 +161,7 @@ def __check_for_extra_arguments(self, args_required, args_allowed): return if self.__kwargs: - param_name = self.__kwargs.keys()[0] + param_name = list(self.__kwargs.keys())[0] if param_name in self.__params_with_arguments: msg = "got multiple values for parameter '%s'" else: @@ -263,7 +263,7 @@ def __match_ancestry(self, ancestry): if len(stack) == 1: return stack[0], ancestry previous = stack[0] - for frame, n in zip(stack[1:], xrange(len(ancestry))): + for frame, n in zip(stack[1:], range(len(ancestry))): if frame.id() is not ancestry[n]: return previous, ancestry[n:] previous = frame diff --git a/suds/bindings/binding.py b/suds/bindings/binding.py index 45966eb..efe8c6a 100644 --- a/suds/bindings/binding.py +++ b/suds/bindings/binding.py @@ -88,7 +88,7 @@ def param_defs(self, method): @return: A collection of parameter definitions @rtype: [I{pdef},..] """ - raise Exception, 'not implemented' + raise Exception('not implemented') def get_message(self, method, args, kwargs): """ @@ -286,7 +286,7 @@ def bodycontent(self, method, args, kwargs): @return: The XML content for the @rtype: [L{Element},..] """ - raise Exception, 'not implemented' + raise Exception('not implemented') def headercontent(self, method): """ @@ -339,7 +339,7 @@ def replycontent(self, method, body): @return: The body content. @rtype: [L{Element},...] """ - raise Exception, 'not implemented' + raise Exception('not implemented') def body(self, content): """ diff --git a/suds/builder.py b/suds/builder.py index 9264749..a881609 100644 --- a/suds/builder.py +++ b/suds/builder.py @@ -34,7 +34,7 @@ def __init__(self, resolver): def build(self, name): """ build a an object for the specified typename as defined in the schema """ - if isinstance(name, basestring): + if isinstance(name, str): type = self.resolver.find(name) if type is None: raise TypeNotFound(name) diff --git a/suds/cache.py b/suds/cache.py index 91f0c0c..a31ac56 100644 --- a/suds/cache.py +++ b/suds/cache.py @@ -28,7 +28,7 @@ import os from tempfile import gettempdir as tmp try: - import cPickle as pickle + import pickle as pickle except Exception: import pickle @@ -136,7 +136,7 @@ def setduration(self, **duration): @type duration: {unit:value} """ if len(duration) == 1: - arg = duration.items()[0] + arg = list(duration.items())[0] if not arg[0] in self.units: raise Exception('must be: %s' % str(self.units)) self.duration = arg diff --git a/suds/client.py b/suds/client.py index 2a664fe..5ca689c 100644 --- a/suds/client.py +++ b/suds/client.py @@ -37,12 +37,17 @@ from suds.transport.https import HttpAuthenticated from suds.umx.basic import Basic as UmxBasic from suds.wsdl import Definitions -import sudsobject +from . import sudsobject -from cookielib import CookieJar from copy import deepcopy -import httplib -from urlparse import urlparse +try: + from http.cookiejar import CookieJar + import http.client + from urllib.parse import urlparse +except Exception as e: + from cookielib import CookieJar + import httplib + from urlparse import urlparse from logging import getLogger log = getLogger(__name__) @@ -181,7 +186,7 @@ def __unicode__(self): if ( suds.__build__ ): s.append(' build: %s' % suds.__build__) for sd in self.sd: - s.append('\n\n%s' % unicode(sd)) + s.append('\n\n%s' % str(sd)) return ''.join(s) @@ -223,7 +228,7 @@ def create(self, name): else: try: result = self.builder.build(type) - except Exception, e: + except Exception as e: log.error("create '%s' failed", name, exc_info=True) raise BuildError(name, e) timer.stop() @@ -312,20 +317,20 @@ def __find(self, name): """ service = None if not len(self.__services): - raise Exception, 'No services defined' + raise Exception('No services defined') if isinstance(name, int): try: service = self.__services[name] name = service.name - except IndexError: - raise ServiceNotFound, 'at [%d]' % name + except IndexError as e: + raise ServiceNotFound('at [%d]' % name) else: for s in self.__services: if name == s.name: service = s break if service is None: - raise ServiceNotFound, name + raise ServiceNotFound(name) return PortSelector(self.__client, service.ports, name) def __ds(self): @@ -413,13 +418,13 @@ def __find(self, name): """ port = None if not len(self.__ports): - raise Exception, 'No ports defined: %s' % self.__qn + raise Exception('No ports defined: %s' % self.__qn) if isinstance(name, int): qn = '%s[%d]' % (self.__qn, name) try: port = self.__ports[name] - except IndexError: - raise PortNotFound, qn + except IndexError as e: + raise PortNotFound(qn) else: qn = '.'.join((self.__qn, name)) for p in self.__ports: @@ -427,7 +432,7 @@ def __find(self, name): port = p break if port is None: - raise PortNotFound, qn + raise PortNotFound(qn) qn = '.'.join((self.__qn, port.name)) return MethodSelector(self.__client, port.methods, qn) @@ -488,7 +493,7 @@ def __getitem__(self, name): m = self.__methods.get(name) if m is None: qn = '.'.join((self.__qn, name)) - raise MethodNotFound, qn + raise MethodNotFound(qn) return Method(self.__client, m) @@ -519,10 +524,10 @@ def __call__(self, *args, **kwargs): client = clientclass(self.client, self.method) try: return client.invoke(args, kwargs) - except WebFault, e: + except WebFault as e: if self.faults(): raise - return (httplib.INTERNAL_SERVER_ERROR, e) + return (http.client.INTERNAL_SERVER_ERROR, e) def faults(self): """ get faults option """ @@ -613,7 +618,7 @@ def send(self, soapenv): reply = self.options.transport.send(request) timer.stop() metrics.log.debug('waited %s on server reply', timer) - except TransportError, e: + except TransportError as e: content = e.fp and e.fp.read() or '' return self.process_reply(reply=content, status=e.httpcode, description=tostr(e), original_soapenv=original_soapenv) @@ -623,12 +628,12 @@ def send(self, soapenv): def process_reply(self, reply, status=None, description=None, original_soapenv=None): if status is None: - status = httplib.OK - if status in (httplib.ACCEPTED, httplib.NO_CONTENT): + status = http.client.OK + if status in (http.client.ACCEPTED, http.client.NO_CONTENT): return failed = True try: - if status == httplib.OK: + if status == http.client.OK: log.debug('HTTP succeeded:\n%s', reply) else: log.debug('HTTP failed - %d - %s:\n%s', status, description, @@ -657,19 +662,19 @@ def process_reply(self, reply, status=None, description=None, # An INSTANCE MUST use a "500 Internal Server Error" HTTP status # code if the response message is a SOAP Fault. replyroot = None - if status in (httplib.OK, httplib.INTERNAL_SERVER_ERROR): + if status in (http.client.OK, http.client.INTERNAL_SERVER_ERROR): replyroot = _parse(reply) plugins.message.parsed(reply=replyroot) fault = self.get_fault(replyroot) if fault: - if status != httplib.INTERNAL_SERVER_ERROR: + if status != http.client.INTERNAL_SERVER_ERROR: log.warn("Web service reported a SOAP processing " "fault using an unexpected HTTP status code %d. " "Reporting as an internal server error.", status) if self.options.faults: raise WebFault(fault, replyroot) - return (httplib.INTERNAL_SERVER_ERROR, fault) - if status != httplib.OK: + return (http.client.INTERNAL_SERVER_ERROR, fault) + if status != http.client.OK: if self.options.faults: # (todo) # Use a more specific exception class here. @@ -688,7 +693,7 @@ def process_reply(self, reply, status=None, description=None, failed = False if self.options.faults: return result - return (httplib.OK, result) + return (http.client.OK, result) finally: if failed and original_soapenv: log.error(original_soapenv) @@ -717,7 +722,7 @@ def headers(self): @rtype: dict """ action = self.method.soap.action - if isinstance(action, unicode): + if isinstance(action, str): action = action.encode('utf-8') stock = {'Content-Type':'text/xml; charset=utf-8', 'SOAPAction':action} result = dict(stock, **self.options.headers) @@ -742,7 +747,7 @@ class SimClient(SoapClient): @classmethod def simulation(cls, kwargs): """ get whether loopback has been specified in the I{kwargs}. """ - return kwargs.has_key(SimClient.injkey) + return SimClient.injkey in kwargs def invoke(self, args, kwargs): """ diff --git a/suds/mx/__init__.py b/suds/mx/__init__.py index dc8154b..be26f3b 100644 --- a/suds/mx/__init__.py +++ b/suds/mx/__init__.py @@ -43,7 +43,7 @@ def __init__(self, tag=None, value=None, **kwargs): Object.__init__(self) self.tag = tag self.value = value - for k,v in kwargs.items(): + for k,v in list(kwargs.items()): setattr(self, k, v) def __getattr__(self, name): @@ -52,8 +52,7 @@ def __getattr__(self, name): v = None setattr(self, name, v) else: - raise AttributeError, \ - 'Content has no attribute %s' % name + raise AttributeError('Content has no attribute %s' % name) else: v = self.__dict__[name] return v diff --git a/suds/mx/appender.py b/suds/mx/appender.py index e60dc79..8e50a06 100644 --- a/suds/mx/appender.py +++ b/suds/mx/appender.py @@ -208,7 +208,7 @@ def append(self, parent, content): child = self.node(content) child.setText(p.get()) parent.append(child) - for item in p.items(): + for item in list(p.items()): cont = Content(tag=item[0], value=item[1]) Appender.append(self, child, cont) @@ -240,7 +240,7 @@ def append(self, parent, content): return child = self.node(content) parent.append(child) - for item in d.items(): + for item in list(d.items()): cont = Content(tag=item[0], value=item[1]) Appender.append(self, child, cont) diff --git a/suds/mx/literal.py b/suds/mx/literal.py index 44f38a3..1e46624 100644 --- a/suds/mx/literal.py +++ b/suds/mx/literal.py @@ -131,9 +131,8 @@ def end(self, parent, content): if current == content.type: self.resolver.pop() else: - raise Exception, \ - 'content (end) mismatch: top=(%s) cont=(%s)' % \ - (current, content) + raise Exception('content (end) mismatch: top=(%s) cont=(%s)' % \ + (current, content)) def node(self, content): # diff --git a/suds/mx/typer.py b/suds/mx/typer.py index aa52ad3..9a6c145 100644 --- a/suds/mx/typer.py +++ b/suds/mx/typer.py @@ -33,10 +33,10 @@ class Typer: types = { int : ('int', NS.xsdns), - long : ('long', NS.xsdns), + int : ('long', NS.xsdns), float : ('float', NS.xsdns), str : ('string', NS.xsdns), - unicode : ('string', NS.xsdns), + str : ('string', NS.xsdns), Text : ('string', NS.xsdns), bool : ('boolean', NS.xsdns), } diff --git a/suds/options.py b/suds/options.py index de49326..9fc6e15 100644 --- a/suds/options.py +++ b/suds/options.py @@ -132,9 +132,9 @@ def __init__(self, **kwargs): Definition('extraArgumentErrors', bool, True), Definition('faults', bool, True), Definition('transport', Transport, None, TpLinker()), - Definition('service', (int, basestring), None), - Definition('port', (int, basestring), None), - Definition('location', basestring, None), + Definition('service', (int, str), None), + Definition('port', (int, str), None), + Definition('location', str, None), Definition('soapheaders', (), ()), Definition('wsse', Security, None), Definition('doctor', Doctor, None), diff --git a/suds/plugin.py b/suds/plugin.py index 0616568..fc23961 100644 --- a/suds/plugin.py +++ b/suds/plugin.py @@ -22,6 +22,7 @@ from suds import * from logging import getLogger +import collections log = getLogger(__name__) @@ -205,7 +206,7 @@ def __getattr__(self, name): plugins.append(p) return PluginDomain(ctx, plugins) else: - raise Exception, 'plugin domain (%s), invalid' % name + raise Exception('plugin domain (%s), invalid' % name) class PluginDomain: @@ -250,8 +251,8 @@ def __call__(self, **kwargs): for plugin in self.domain.plugins: try: method = getattr(plugin, self.name, None) - if method and callable(method): + if method and isinstance(method, collections.Callable): method(ctx) - except Exception, pe: + except Exception as pe: log.exception(pe) return ctx diff --git a/suds/properties.py b/suds/properties.py index 7103232..23ec820 100644 --- a/suds/properties.py +++ b/suds/properties.py @@ -67,23 +67,23 @@ def validate(self, pA, pB): """ if pA in pB.links or \ pB in pA.links: - raise Exception, 'Already linked' + raise Exception('Already linked') dA = pA.domains() dB = pB.domains() for d in dA: if d in dB: - raise Exception, 'Duplicate domain "%s" found' % d + raise Exception('Duplicate domain "%s" found' % d) for d in dB: if d in dA: - raise Exception, 'Duplicate domain "%s" found' % d - kA = pA.keys() - kB = pB.keys() + raise Exception('Duplicate domain "%s" found' % d) + kA = list(pA.keys()) + kB = list(pB.keys()) for k in kA: if k in kB: - raise Exception, 'Duplicate key %s found' % k + raise Exception('Duplicate key %s found' % k) for k in kB: if k in kA: - raise Exception, 'Duplicate key %s found' % k + raise Exception('Duplicate key %s found' % k) return self def teardown(self): @@ -177,7 +177,7 @@ def validate(self, value): if len(self.classes) and \ not isinstance(value, self.classes): msg = '"%s" must be: %s' % (self.name, self.classes) - raise AttributeError,msg + raise AttributeError(msg) def __repr__(self): @@ -251,7 +251,7 @@ def update(self, other): """ if isinstance(other, Properties): other = other.defined - for n,v in other.items(): + for n,v in list(other.items()): self.set(n, v) return self @@ -372,7 +372,7 @@ def keys(self, history=None): history = [] history.append(self) keys = set() - keys.update(self.definitions.keys()) + keys.update(list(self.definitions.keys())) for x in self.links: if x in history: continue @@ -408,7 +408,7 @@ def prime(self): @return: self @rtype: L{Properties} """ - for d in self.definitions.values(): + for d in list(self.definitions.values()): self.defined[d.name] = d.default return self @@ -434,10 +434,10 @@ def __get(self, name, *df): def str(self, history): s = [] s.append('Definitions:') - for d in self.definitions.values(): + for d in list(self.definitions.values()): s.append('\t%s' % repr(d)) s.append('Content:') - for d in self.defined.items(): + for d in list(self.defined.items()): s.append('\t%s' % str(d)) if self not in history: history.append(self) diff --git a/suds/sax/__init__.py b/suds/sax/__init__.py index bef7825..d249533 100644 --- a/suds/sax/__init__.py +++ b/suds/sax/__init__.py @@ -45,7 +45,7 @@ def splitPrefix(name): @return: A tuple containing the (2) parts of I{name} @rtype: (I{prefix}, I{name}) """ - if isinstance(name, basestring) and ':' in name: + if isinstance(name, str) and ':' in name: return tuple(name.split(':', 1)) return None, name diff --git a/suds/sax/attribute.py b/suds/sax/attribute.py index c775e20..a655430 100644 --- a/suds/sax/attribute.py +++ b/suds/sax/attribute.py @@ -171,4 +171,4 @@ def __unicode__(self): v = self.value.escape() else: v = self.value - return u'%s="%s"' % (n, v) + return '%s="%s"' % (n, v) diff --git a/suds/sax/date.py b/suds/sax/date.py index ac534c4..8ad4346 100644 --- a/suds/sax/date.py +++ b/suds/sax/date.py @@ -65,7 +65,7 @@ def __init__(self, value): self.value = value.date() elif isinstance(value, datetime.date): self.value = value - elif isinstance(value, basestring): + elif isinstance(value, str): self.value = self.__parse(value) else: raise ValueError("invalid type for Date(): %s" % type(value)) @@ -115,7 +115,7 @@ def __init__(self, value): """ if isinstance(value, datetime.datetime): self.value = value - elif isinstance(value, basestring): + elif isinstance(value, str): self.value = self.__parse(value) else: raise ValueError("invalid type for DateTime(): %s" % type(value)) @@ -173,7 +173,7 @@ def __init__(self, value): """ if isinstance(value, datetime.time): self.value = value - elif isinstance(value, basestring): + elif isinstance(value, str): self.value = self.__parse(value) else: raise ValueError("invalid type for Time(): %s" % type(value)) diff --git a/suds/sax/document.py b/suds/sax/document.py index 8697e08..d666e31 100644 --- a/suds/sax/document.py +++ b/suds/sax/document.py @@ -52,7 +52,7 @@ def append(self, node): the document root element. @type node: (L{Element}|str|None) """ - if isinstance(node, basestring): + if isinstance(node, str): self.__root = Element(node) return if isinstance(node, Element): diff --git a/suds/sax/element.py b/suds/sax/element.py index 502d90d..a75811e 100644 --- a/suds/sax/element.py +++ b/suds/sax/element.py @@ -158,7 +158,7 @@ def clone(self, parent=None): root.append(a.clone(self)) for c in self.children: root.append(c.clone(self)) - for item in self.nsprefixes.items(): + for item in list(self.nsprefixes.items()): root.addPrefix(item[0], item[1]) return root @@ -567,11 +567,11 @@ def findPrefix(self, uri, default=None): @return: A mapped prefix. @rtype: basestring """ - for item in self.nsprefixes.items(): + for item in list(self.nsprefixes.items()): if item[1] == uri: prefix = item[0] return prefix - for item in self.specialprefixes.items(): + for item in list(self.specialprefixes.items()): if item[1] == uri: prefix = item[0] return prefix @@ -592,11 +592,11 @@ def findPrefixes(self, uri, match='eq'): @rtype: [basestring,...] """ result = [] - for item in self.nsprefixes.items(): + for item in list(self.nsprefixes.items()): if self.matcher[match](item[1], uri): prefix = item[0] result.append(prefix) - for item in self.specialprefixes.items(): + for item in list(self.specialprefixes.items()): if self.matcher[match](item[1], uri): prefix = item[0] result.append(prefix) @@ -617,7 +617,7 @@ def promotePrefixes(self): c.promotePrefixes() if self.parent is None: return - for p,u in self.nsprefixes.items(): + for p,u in list(self.nsprefixes.items()): if p in self.parent.nsprefixes: pu = self.parent.nsprefixes[p] if pu == u: @@ -730,7 +730,7 @@ def str(self, indent=0): result = [] result.append('%s<%s' % (tab, self.qname())) result.append(self.nsdeclarations()) - for a in [unicode(a) for a in self.attributes]: + for a in [str(a) for a in self.attributes]: result.append(' %s' % a) if self.isempty(): result.append('/>') @@ -755,7 +755,7 @@ def plain(self): result = [] result.append('<%s' % self.qname()) result.append(self.nsdeclarations()) - for a in [unicode(a) for a in self.attributes]: + for a in [str(a) for a in self.attributes]: result.append(' %s' % a) if self.isempty(): result.append('/>') @@ -785,7 +785,7 @@ def nsdeclarations(self): if self.expns is not None: d = ' xmlns="%s"' % self.expns s.append(d) - for item in self.nsprefixes.items(): + for item in list(self.nsprefixes.items()): (p,u) = item if self.parent is not None: ns = self.parent.resolvePrefix(p) @@ -884,13 +884,13 @@ def __len__(self): return len(self.children) def __getitem__(self, index): - if isinstance(index, basestring): + if isinstance(index, str): return self.get(index) if index < len(self.children): return self.children[index] def __setitem__(self, index, value): - if isinstance(index, basestring): + if isinstance(index, str): self.set(index, value) else: if index < len(self.children) and isinstance(value, Element): @@ -927,7 +927,7 @@ def __init__(self, parent): self.pos = 0 self.children = parent.children - def next(self): + def __next__(self): """ Get the next child. @return: The next child. @@ -999,7 +999,7 @@ def pset(self, n): @rtype: set """ s = set() - for ns in n.nsprefixes.items(): + for ns in list(n.nsprefixes.items()): if self.permit(ns): s.add(ns[1]) return s @@ -1078,7 +1078,7 @@ def refitMappings(self): for n in self.branch: n.nsprefixes = {} n = self.node - for u, p in self.prefixes.items(): + for u, p in list(self.prefixes.items()): n.addPrefix(p, u) def permit(self, ns): diff --git a/suds/sax/enc.py b/suds/sax/enc.py index d15988d..3787037 100644 --- a/suds/sax/enc.py +++ b/suds/sax/enc.py @@ -46,7 +46,7 @@ def needsEncoding(self, s): @return: True if needs encoding. @rtype: boolean """ - if isinstance(s, basestring): + if isinstance(s, str): for c in self.special: if c in s: return True @@ -60,7 +60,7 @@ def encode(self, s): @return: The encoded string. @rtype: str """ - if isinstance(s, basestring) and self.needsEncoding(s): + if isinstance(s, str) and self.needsEncoding(s): for x in self.encodings: s = re.sub(x[0], x[1], s) return s @@ -73,7 +73,7 @@ def decode(self, s): @return: The decoded string. @rtype: str """ - if isinstance(s, basestring) and '&' in s: + if isinstance(s, str) and '&' in s: for x in self.decodings: s = s.replace(x[0], x[1]) return s diff --git a/suds/sax/parser.py b/suds/sax/parser.py index 2f48b3b..bc4548c 100644 --- a/suds/sax/parser.py +++ b/suds/sax/parser.py @@ -47,10 +47,10 @@ def __init__(self): def startElement(self, name, attrs): top = self.top() - node = Element(unicode(name)) + node = Element(str(name)) for a in attrs.getNames(): - n = unicode(a) - v = unicode(attrs.getValue(a)) + n = str(a) + v = str(attrs.getValue(a)) attribute = Attribute(n,v) if self.mapPrefix(node, attribute): continue @@ -63,19 +63,19 @@ def mapPrefix(self, node, attribute): skip = False if attribute.name == 'xmlns': if len(attribute.value): - node.expns = unicode(attribute.value) + node.expns = str(attribute.value) skip = True elif attribute.prefix == 'xmlns': prefix = attribute.name - node.nsprefixes[prefix] = unicode(attribute.value) + node.nsprefixes[prefix] = str(attribute.value) skip = True return skip def endElement(self, name): - name = unicode(name) + name = str(name) current = self.top() if len(current.charbuffer): - current.text = Text(u''.join(current.charbuffer)) + current.text = Text(''.join(current.charbuffer)) del current.charbuffer if len(current): current.trim() @@ -85,7 +85,7 @@ def endElement(self, name): raise Exception('malformed document') def characters(self, content): - text = unicode(content) + text = str(content) node = self.top() node.charbuffer.append(text) diff --git a/suds/sax/text.py b/suds/sax/text.py index ebdbc62..3323f80 100644 --- a/suds/sax/text.py +++ b/suds/sax/text.py @@ -22,7 +22,7 @@ from suds.sax import * -class Text(unicode): +class Text( type("") ): """ An XML text object used to represent text content. @ivar lang: The (optional) language flag. @@ -30,7 +30,8 @@ class Text(unicode): @ivar escaped: The (optional) XML special character escaped flag. @type escaped: bool """ - __slots__ = ('lang', 'escaped') + + slots = ['lang', 'escaped'] @classmethod def __valid(cls, *args): @@ -75,7 +76,7 @@ def trim(self): return Text(post, lang=self.lang, escaped=self.escaped) def __add__(self, other): - joined = u''.join((self, other)) + joined = ''.join((self, other)) result = Text(joined, lang=self.lang, escaped=self.escaped) if isinstance(other, Text): result.escaped = self.escaped or other.escaped @@ -91,12 +92,12 @@ def __repr__(self): def __getstate__(self): state = {} - for k in self.__slots__: + for k in self.slots: state[k] = getattr(self, k) return state def __setstate__(self, state): - for k in self.__slots__: + for k in self.slots: setattr(self, k, state[k]) @@ -112,5 +113,5 @@ def unescape(self): return self def __add__(self, other): - joined = u''.join((self, other)) + joined = ''.join((self, other)) return Raw(joined, lang=self.lang) diff --git a/suds/servicedefinition.py b/suds/servicedefinition.py index 19ed243..6418d59 100644 --- a/suds/servicedefinition.py +++ b/suds/servicedefinition.py @@ -80,7 +80,7 @@ def addports(self): timer.start() for port in self.service.ports: p = self.findport(port) - for op in port.binding.operations.values(): + for op in list(port.binding.operations.values()): m = p[0].method(op.name) binding = m.binding.input method = (m.name, binding.param_defs(m)) @@ -138,7 +138,7 @@ def paramtypes(self): def publictypes(self): """Get all public types.""" - for t in self.wsdl.schema.types.values(): + for t in list(self.wsdl.schema.types.values()): if t in self.params: continue if t in self.types: continue item = (t, t) @@ -152,7 +152,7 @@ def nextprefix(self): WSDL document. """ used = [ns[0] for ns in self.prefixes] - used += [ns[0] for ns in self.wsdl.root.nsprefixes.items()] + used += [ns[0] for ns in list(self.wsdl.root.nsprefixes.items())] for n in range(0,1024): p = 'ns%d'%n if p not in used: @@ -235,6 +235,6 @@ def description(self): def __unicode__(self): try: return self.description() - except Exception, e: + except Exception as e: log.exception(e) return tostr(e) diff --git a/suds/serviceproxy.py b/suds/serviceproxy.py index 1b6a62f..f1da926 100644 --- a/suds/serviceproxy.py +++ b/suds/serviceproxy.py @@ -70,7 +70,7 @@ def get_enum(self, name): return self.__client__.factory.create(name) def __unicode__(self): - return unicode(self.__client__) + return str(self.__client__) def __getattr__(self, name): builtin = name.startswith('__') and name.endswith('__') diff --git a/suds/store.py b/suds/store.py index 58ebf4a..ab0b0bd 100644 --- a/suds/store.py +++ b/suds/store.py @@ -566,7 +566,7 @@ def open(self, url): protocol, location = self.__split(url) content = self.__find(location) if protocol == 'suds' and content is None: - raise Exception, 'location "%s" not in document store' % location + raise Exception('location "%s" not in document store' % location) return content def __find(self, location): diff --git a/suds/sudsobject.py b/suds/sudsobject.py index 9894009..9489c87 100644 --- a/suds/sudsobject.py +++ b/suds/sudsobject.py @@ -121,7 +121,7 @@ def object(cls, classname=None, dict={}): inst = subclass() else: inst = Object() - for a in dict.items(): + for a in list(dict.items()): setattr(inst, a[0], a[1]) return inst @@ -156,7 +156,7 @@ def __delattr__(self, name): self.__keylist__.remove(name) except Exception: cls = self.__class__.__name__ - raise AttributeError, "%s has no attribute '%s'" % (cls, name) + raise AttributeError("%s has no attribute '%s'" % (cls, name)) def __getitem__(self, name): if isinstance(name, int): @@ -189,7 +189,7 @@ def __init__(self, sobject): self.keylist = self.__keylist(sobject) self.index = 0 - def next(self): + def __next__(self): keylist = self.keylist nkeys = len(self.keylist) while self.index < nkeys: @@ -278,7 +278,7 @@ def process(self, object, h, n=0, nl=False): if len(object) == 0: return "" return self.print_collection(object, h, n + 2) - if isinstance(object, basestring): + if isinstance(object, str): return '"%s"' % (tostr(object),) return "%s" % (tostr(object),) @@ -333,7 +333,7 @@ def print_dictionary(self, d, h, n, nl=False): s.append("\n") s.append(self.indent(n)) s.append("{") - for item in d.items(): + for item in list(d.items()): s.append("\n") s.append(self.indent(n+1)) if isinstance(item[1], (list,tuple)): diff --git a/suds/transport/__init__.py b/suds/transport/__init__.py index 6ffea2d..e5f7551 100644 --- a/suds/transport/__init__.py +++ b/suds/transport/__init__.py @@ -54,7 +54,7 @@ def __init__(self, url, message=None): self.message = message def __unicode__(self): - return u"""\ + return """\ URL: %s HEADERS: %s MESSAGE: @@ -89,7 +89,7 @@ def __init__(self, code, headers, message): self.message = message def __unicode__(self): - return u"""\ + return """\ CODE: %s HEADERS: %s MESSAGE: diff --git a/suds/transport/http.py b/suds/transport/http.py index c3f2512..16ab7f4 100644 --- a/suds/transport/http.py +++ b/suds/transport/http.py @@ -22,12 +22,27 @@ from suds.transport import * import base64 -from cookielib import CookieJar -import httplib +try: + from http.cookiejar import CookieJar +except Exception as e: + from cookielib import CookieJar + +try: + import http.client +except Exception as e: + import httplib + import socket import sys -import urllib2 -from urlparse import urlparse +try: + import urllib.request, urllib.error, urllib.parse +except Exception as e: + import urllib + +try: + from urllib.parse import urlparse +except Exception as e: + from urlparse import urlparse from logging import getLogger log = getLogger(__name__) @@ -62,10 +77,10 @@ def open(self, request): try: url = self.__get_request_url(request) log.debug('opening (%s)', url) - u2request = urllib2.Request(url) + u2request = urllib.request.Request(url) self.proxy = self.options.proxy return self.u2open(u2request) - except urllib2.HTTPError, e: + except urllib.error.HTTPError as e: raise TransportError(str(e), e.code, e.fp) def send(self, request): @@ -74,7 +89,7 @@ def send(self, request): msg = request.message headers = request.headers try: - u2request = urllib2.Request(url, msg, headers) + u2request = urllib.request.Request(url, msg, headers) self.addcookies(u2request) self.proxy = self.options.proxy request.headers.update(u2request.headers) @@ -85,10 +100,10 @@ def send(self, request): headers = fp.headers.dict else: headers = fp.headers - result = Reply(httplib.OK, headers, fp.read()) + result = Reply(http.client.OK, headers, fp.read()) log.debug('received:\n%s', result) - except urllib2.HTTPError, e: - if e.code in (httplib.ACCEPTED, httplib.NO_CONTENT): + except urllib.error.HTTPError as e: + if e.code in (http.client.ACCEPTED, http.client.NO_CONTENT): result = None else: raise TransportError(e.msg, e.code, e.fp) @@ -140,7 +155,7 @@ def u2opener(self): """ if self.urlopener is None: - return urllib2.build_opener(*self.u2handlers()) + return urllib.request.build_opener(*self.u2handlers()) return self.urlopener def u2handlers(self): @@ -152,7 +167,7 @@ def u2handlers(self): """ handlers = [] - handlers.append(urllib2.ProxyHandler(self.proxy)) + handlers.append(urllib.request.ProxyHandler(self.proxy)) return handlers def u2ver(self): @@ -165,7 +180,7 @@ def u2ver(self): try: part = urllib2.__version__.split('.', 1) return float('.'.join(part)) - except Exception, e: + except Exception as e: log.exception(e) return 0 diff --git a/suds/transport/https.py b/suds/transport/https.py index 080315a..babcc76 100644 --- a/suds/transport/https.py +++ b/suds/transport/https.py @@ -21,7 +21,10 @@ from suds.transport import * from suds.transport.http import HttpTransport -import urllib2 +try: + import urllib.request, urllib.error, urllib.parse +except Exception as e: + import urllib class HttpAuthenticated(HttpTransport): @@ -55,7 +58,7 @@ def __init__(self, **kwargs): """ HttpTransport.__init__(self, **kwargs) - self.pm = urllib2.HTTPPasswordMgrWithDefaultRealm() + self.pm = urllib.request.HTTPPasswordMgrWithDefaultRealm() def open(self, request): self.addcredentials(request) @@ -77,7 +80,7 @@ def credentials(self): def u2handlers(self): handlers = HttpTransport.u2handlers(self) - handlers.append(urllib2.HTTPBasicAuthHandler(self.pm)) + handlers.append(urllib.request.HTTPBasicAuthHandler(self.pm)) return handlers diff --git a/suds/transport/options.py b/suds/transport/options.py index c4c1552..70d8b40 100644 --- a/suds/transport/options.py +++ b/suds/transport/options.py @@ -53,6 +53,6 @@ def __init__(self, **kwargs): Definition('proxy', dict, {}), Definition('timeout', (int,float), 90), Definition('headers', dict, {}), - Definition('username', basestring, None), - Definition('password', basestring, None)] + Definition('username', str, None), + Definition('password', str, None)] Skin.__init__(self, domain, definitions, kwargs) diff --git a/suds/umx/__init__.py b/suds/umx/__init__.py index f672320..e94109b 100644 --- a/suds/umx/__init__.py +++ b/suds/umx/__init__.py @@ -40,7 +40,7 @@ def __init__(self, node, **kwargs): self.node = node self.data = None self.text = None - for k,v in kwargs.items(): + for k,v in list(kwargs.items()): setattr(self, k, v) def __getattr__(self, name): @@ -49,8 +49,7 @@ def __getattr__(self, name): v = None setattr(self, name, v) else: - raise AttributeError, \ - 'Content has no attribute %s' % name + raise AttributeError('Content has no attribute %s' % name) else: v = self.__dict__[name] return v diff --git a/suds/umx/core.py b/suds/umx/core.py index 9ffa3bd..9a1d0f3 100644 --- a/suds/umx/core.py +++ b/suds/umx/core.py @@ -95,7 +95,7 @@ def postprocess(self, content): return None else: return Text('', lang=lang) - if isinstance(content.text, basestring): + if isinstance(content.text, str): return Text(content.text, lang=lang) else: return content.text diff --git a/suds/wsdl.py b/suds/wsdl.py index 8a5e558..b78d4bc 100644 --- a/suds/wsdl.py +++ b/suds/wsdl.py @@ -31,8 +31,12 @@ from suds.reader import DocumentReader import re -import soaparray -from urlparse import urljoin +from . import soaparray + +try: + from urllib.parse import urljoin +except Exception as e: + from urlparse import urljoin from logging import getLogger log = getLogger(__name__) @@ -232,7 +236,7 @@ def add_methods(self, service): for p in service.ports: binding = p.binding ptype = p.binding.type - operations = p.binding.type.operations.values() + operations = list(p.binding.type.operations.values()) for name in [op.name for op in operations]: m = Facade('Method') m.name = name @@ -249,8 +253,8 @@ def add_methods(self, service): def set_wrapped(self): """ set (wrapped|bare) flag on messages """ - for b in self.bindings.values(): - for op in b.operations.values(): + for b in list(self.bindings.values()): + for op in list(b.operations.values()): for body in (op.soap.input.body, op.soap.output.body): body.wrapped = False if not self.options.unwrap: @@ -482,7 +486,7 @@ def resolve(self, definitions): @param definitions: A definitions object. @type definitions: L{Definitions} """ - for op in self.operations.values(): + for op in list(self.operations.values()): if op.input is None: op.input = Message(Element('no-input'), definitions) else: @@ -505,7 +509,7 @@ def resolve(self, definitions): qref = qualify(f.message, self.root, definitions.tns) msg = definitions.messages.get(qref) if msg is None: - raise Exception, "msg '%s', not-found" % f.message + raise Exception("msg '%s', not-found" % f.message) f.message = msg def operation(self, name): @@ -519,7 +523,7 @@ def operation(self, name): """ try: return self.operations[name] - except Exception, e: + except Exception as e: raise MethodNotFound(name) def __gt__(self, other): @@ -654,7 +658,7 @@ def resolve(self, definitions): @type definitions: L{Definitions} """ self.resolveport(definitions) - for op in self.operations.values(): + for op in list(self.operations.values()): self.resolvesoapbody(definitions, op) self.resolveheaders(definitions, op) self.resolvefaults(definitions, op) @@ -683,8 +687,7 @@ def resolvesoapbody(self, definitions, op): """ ptop = self.type.operation(op.name) if ptop is None: - raise Exception, \ - "operation '%s' not defined in portType" % op.name + raise Exception("operation '%s' not defined in portType" % op.name) soap = op.soap parts = soap.input.body.parts if len(parts): @@ -720,15 +723,14 @@ def resolveheaders(self, definitions, op): ref = qualify(mn, self.root, definitions.tns) message = definitions.messages.get(ref) if message is None: - raise Exception, "message'%s', not-found" % mn + raise Exception("message'%s', not-found" % mn) pn = header.part for p in message.parts: if p.name == pn: header.part = p break if pn == header.part: - raise Exception, \ - "message '%s' has not part named '%s'" % (ref, pn) + raise Exception("message '%s' has not part named '%s'" % (ref, pn)) def resolvefaults(self, definitions, op): """ @@ -741,8 +743,7 @@ def resolvefaults(self, definitions, op): """ ptop = self.type.operation(op.name) if ptop is None: - raise Exception, \ - "operation '%s' not defined in portType" % op.name + raise Exception("operation '%s' not defined in portType" % op.name) soap = op.soap for fault in soap.faults: for f in ptop.faults: @@ -751,8 +752,7 @@ def resolvefaults(self, definitions, op): continue if hasattr(fault, 'parts'): continue - raise Exception, \ - "fault '%s' not defined in portType '%s'" % (fault.name, self.type.name) + raise Exception("fault '%s' not defined in portType '%s'" % (fault.name, self.type.name)) def operation(self, name): """ @@ -854,7 +854,7 @@ def setlocation(self, url, names=None): @type names: [str,..] """ for p in self.ports: - for m in p.methods.values(): + for m in list(p.methods.values()): if names is None or m.name in names: m.location = url diff --git a/suds/xsd/__init__.py b/suds/xsd/__init__.py index 5c5dd8c..cf48a2a 100644 --- a/suds/xsd/__init__.py +++ b/suds/xsd/__init__.py @@ -59,8 +59,8 @@ def isqref(object): return (\ isinstance(object, tuple) and \ len(object) == 2 and \ - isinstance(object[0], basestring) and \ - isinstance(object[1], basestring)) + isinstance(object[0], str) and \ + isinstance(object[1], str)) class Filter: diff --git a/suds/xsd/deplist.py b/suds/xsd/deplist.py index b686675..81d82bc 100644 --- a/suds/xsd/deplist.py +++ b/suds/xsd/deplist.py @@ -77,7 +77,7 @@ def sort(self): while len(self.stack): try: top = self.top() - ref = top[1].next() + ref = next(top[1]) refd = self.index.get(ref) if refd is None: log.debug('"%s" not found, skipped', Repr(ref)) @@ -137,4 +137,4 @@ def pop(self): x = ('x', ()) L = DepList() L.add(c, e, d, b, f, a, x) - print [x[0] for x in L.sort()] + print([x[0] for x in L.sort()]) diff --git a/suds/xsd/query.py b/suds/xsd/query.py index 62929c9..360dca6 100644 --- a/suds/xsd/query.py +++ b/suds/xsd/query.py @@ -54,7 +54,7 @@ def execute(self, schema): @return: The item matching the search criteria. @rtype: L{sxbase.SchemaObject} """ - raise Exception, 'not-implemented by subclass' + raise Exception('not-implemented by subclass') def filter(self, result): """ diff --git a/suds/xsd/schema.py b/suds/xsd/schema.py index 33a0948..4f9dfe5 100644 --- a/suds/xsd/schema.py +++ b/suds/xsd/schema.py @@ -104,7 +104,7 @@ def autoblend(self): @return: self @rtype: L{SchemaCollection} """ - namespaces = self.namespaces.keys() + namespaces = list(self.namespaces.keys()) for s in self.children: for ns in namespaces: tns = s.root.get('targetNamespace') @@ -261,27 +261,27 @@ def merge(self, schema): @returns: self @rtype: L{Schema} """ - for item in schema.attributes.items(): + for item in list(schema.attributes.items()): if item[0] in self.attributes: continue self.all.append(item[1]) self.attributes[item[0]] = item[1] - for item in schema.elements.items(): + for item in list(schema.elements.items()): if item[0] in self.elements: continue self.all.append(item[1]) self.elements[item[0]] = item[1] - for item in schema.types.items(): + for item in list(schema.types.items()): if item[0] in self.types: continue self.all.append(item[1]) self.types[item[0]] = item[1] - for item in schema.groups.items(): + for item in list(schema.groups.items()): if item[0] in self.groups: continue self.all.append(item[1]) self.groups[item[0]] = item[1] - for item in schema.agrps.items(): + for item in list(schema.agrps.items()): if item[0] in self.agrps: continue self.all.append(item[1]) diff --git a/suds/xsd/sxbase.py b/suds/xsd/sxbase.py index 28ab814..38ce14a 100644 --- a/suds/xsd/sxbase.py +++ b/suds/xsd/sxbase.py @@ -463,7 +463,7 @@ def description(self): return () def __unicode__(self): - return unicode(self.str()) + return str(self.str()) def __repr__(self): s = [] @@ -520,7 +520,7 @@ def __init__(self, sx): self.items = sx.rawchildren self.index = 0 - def next(self): + def __next__(self): """ Get the I{next} item in the frame's collection. @return: The next item or None @@ -571,7 +571,7 @@ def top(self): else: raise StopIteration() - def next(self): + def __next__(self): """ Get the next item. @return: A tuple: the next (child, ancestry). @@ -580,15 +580,15 @@ def next(self): """ frame = self.top() while True: - result = frame.next() + result = next(frame) if result is None: self.pop() - return self.next() + return next(self) if isinstance(result, Content): ancestry = [f.sx for f in self.stack] return result, ancestry self.push(result) - return self.next() + return next(self) def __iter__(self): return self diff --git a/suds/xsd/sxbasic.py b/suds/xsd/sxbasic.py index 1f55fd9..8a84d90 100644 --- a/suds/xsd/sxbasic.py +++ b/suds/xsd/sxbasic.py @@ -26,7 +26,10 @@ from suds.sax import Namespace from suds.transport import TransportError from suds.reader import DocumentReader -from urlparse import urljoin +try: + from urllib.parse import urljoin +except Exception as e: + from urlparse import urljoin from logging import getLogger log = getLogger(__name__) @@ -667,7 +670,7 @@ def __applytns(self, root): root.set(TNS, tns) else: if self.schema.tns[1] != tns: - raise Exception, '%s mismatch' % TNS + raise Exception('%s mismatch' % TNS) def description(self): diff --git a/suds/xsd/sxbuiltin.py b/suds/xsd/sxbuiltin.py index 3fc82aa..2cc1d33 100644 --- a/suds/xsd/sxbuiltin.py +++ b/suds/xsd/sxbuiltin.py @@ -62,7 +62,7 @@ class XBoolean(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring): + if isinstance(value, str): return XBoolean.translation[0].get(value) else: if isinstance(value, (bool, int)): @@ -78,7 +78,7 @@ class XInteger(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring) and len(value): + if isinstance(value, str) and len(value): return int(value) else: if isinstance(value, int): @@ -94,10 +94,10 @@ class XLong(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring) and len(value): - return long(value) + if isinstance(value, str) and len(value): + return int(value) else: - if isinstance(value, (int, long)): + if isinstance(value, int): return str(value) return value @@ -110,7 +110,7 @@ class XFloat(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring) and len(value): + if isinstance(value, str) and len(value): return float(value) else: if isinstance(value, float): @@ -126,7 +126,7 @@ class XDate(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring) and len(value): + if isinstance(value, str) and len(value): return Date(value).value else: if isinstance(value, dt.date): @@ -142,7 +142,7 @@ class XTime(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring) and len(value): + if isinstance(value, str) and len(value): return Time(value).value else: if isinstance(value, dt.time): @@ -158,7 +158,7 @@ class XDateTime(XBuiltin): @staticmethod def translate(value, topython=True): if topython: - if isinstance(value, basestring) and len(value): + if isinstance(value, str) and len(value): return DateTime(value).value else: if isinstance(value, dt.datetime): diff --git a/test_model.py b/test_model.py new file mode 100644 index 0000000..a82d2d9 --- /dev/null +++ b/test_model.py @@ -0,0 +1,882 @@ +"""camkii_pp1_scheme.py + +See http://www.ncbi.nlm.nih.gov/pmc/articles/PMC1069645/ + +""" + +__author__ = "Dilawar Singh" +__copyright__ = "Copyright 2015, Dilawar Singh and NCBS Bangalore" +__credits__ = ["NCBS Bangalore"] +__license__ = "GNU GPL" +__version__ = "1.0.0" +__maintainer__ = "Dilawar Singh" +__email__ = "dilawars@ncbs.res.in" +__status__ = "Development" + +import params as _p +import datetime +import moose +import moose.utils as mu +import numpy as np +import re +import sys +import time +import math +from collections import defaultdict + +import logging +logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', + datefmt='%m-%d %H:%M', + filename='__log__.txt', + filemode='a' + ) +console = logging.StreamHandler() +console.setLevel(logging.INFO) +formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') +console.setFormatter(formatter) +_logger = logging.getLogger('') +_logger.addHandler(console) + +class Args: pass +args = Args() + +print( '[INFO] Using moose from %s' % moose.__file__ ) +print( '[INFO] Using moose from %s' % moose.__version__ ) + +# global data-structures +model_path_ = '/model' +molecules_ = {} +tables_ = defaultdict( list ) +curr_subsec_ = None +compt_ = None + +N = 6.023e23 + +gainers_ , loosers_ = [], [] +dephospho_ = [] + +def pool_name( root, name ): + global molecules_ + molName = '%s.%s' % (root.name, name ) + return molName + + +def conc_to_n( conc ): + val = conc * float( args['volume'] ) * N + assert val > 0.0 + return val + + +def num_subunits( name ): + m = re.search( r'x(?P\d)y(?P\d)', name ) + try: + xs, ys = int(m.group('xs')), int(m.group( 'ys' )) + except Exception as e: + mu.warn( 'Failed to get subunit numbers in %s' % name ) + raise e + return xs + ys + + +def inv_conc_to_N( conc ): + return conc / (float(args['volume']) * N ) + +def n_to_conc( n ): + global args + return n / (N * args['volume'] ) + + +def add_pool( root, name ): + global molecules_ + pname = pool_name( root, name ) + ppath = '%s/%s' % (root.path, name) + if moose.exists( ppath ): + _logger.warn( 'Already exists %s' % ppath ) + return moose.element( ppath ) + else: + p = moose.Pool( ppath ) + p.name = pname + molecules_[pname] = p + return p + + +def init_pools( compt ): + global args + # Ring with 6 subunits. + for st in range(7): + state = 'x%dy%d' % (st, 6 - st ) + p = add_pool( compt, state ) + p.nInit = 0 + + if args['enable_subunit_exchange']: + # Ring with 7 subunits + for st in range(8): + state = 'x%dy%d' % (st, 7 - st ) + p = add_pool( compt, state ) + p.nInit = 0 + molecules_[p.name] = p + + if args['enable_subunit_exchange']: + # Add subunit x and y. + # NOTE: These guys are shared across multiple sub_sections.. + x = add_pool( compt, 'x' ) + x.nInit = 0 + molecules_[x.name] = x + + y = add_pool( compt, 'y' ) + y.nInit = 0 + molecules_[y.name] = y + else: + _logger.info( "Subunit exchange is disabled" ) + + + for p in [ 'I1', 'PP1', 'PP1_', 'I1P', 'I1P_', 'I1PPP1' ]: + if p in [ 'I1' ]: + c = moose.BufPool( '%s/%s' % (compt.path, p) ) + c.name = pool_name( compt, p ) + molecules_[c.name] = c + else: + c = moose.Pool( '%s/%s' % (compt.path, p) ) + c.name = pool_name( compt, p ) + molecules_[c.name] = c + + molecules_[c.name].nInit = 0 + + if args['enable_subunit_exchange']: + # Here we are using concInit rather than nInit to setup the number of + # molecules. This is because when Dsolve is used, setting nInit causes + # problem: they don't get divided into different voxels. + molecules_[ pool_name(compt, 'x0y7') ].concInit = args[ 'camkii_conc' ] / 2.0 + molecules_[ pool_name(compt, 'x0y6') ].concInit = args[ 'camkii_conc' ] / 2.0 + else: + molecules_[ pool_name(compt, 'x0y6') ].concInit = args['camkii_conc'] + + if args['enable_subunit_exchange']: + _logger.debug('CaMKII = %f (6sym) %f (7sym)' % ( + molecules_[ pool_name(compt,'x0y6')].nInit, + molecules_[pool_name(compt,'x0y7')].nInit ) + ) + else: + _logger.debug('CaMKII = %d (6sym)' % ( + molecules_[pool_name(compt,'x0y6')].nInit ) + ) + + molecules_[ pool_name(compt, 'PP1') ].concInit = args['pp1_conc'] + _logger.debug('Total PP1 %s' % molecules_[pool_name(compt,'PP1')].nInit ) + + # TODO: Much of it only make sense if stochastic solver is used. + molecules_[ pool_name(compt,'I1') ].concInit = _p.conc_i1_free + pp1CamKIICplx = moose.Pool( '%s/camkii_pp1_cplx' % compt.path ) + pp1CamKIICplx.name = pool_name( compt, pp1CamKIICplx.name ) + pp1CamKIICplx.concInit = 0 + molecules_[ pp1CamKIICplx.name ] = pp1CamKIICplx + + for k in sorted(molecules_): + _logger.debug( 'Molecule: %s (%f)' % (k, molecules_[k].nInit ) ) + + +def add_table( moose_elem, field, tableName = None): + global tables_ + tablePath = '%s/tab%s' % (moose_elem.path, field) + if moose.exists( tablePath ): + return None + t = moose.Table2( tablePath ) + moose.connect( t, 'requestOut', moose_elem, 'get'+field[0].upper()+field[1:]) + tables_[ moose_elem.name ].append( t ) + _logger.debug( 'Added table on %s' % moose_elem.path ) + + +def add_reaction( reacPath ): + if moose.exists( reacPath ): + mu.warn( 'Reaction %s already exists' % reacPath ) + return moose.element( reacPath ) + else: + r = moose.Reac( reacPath ) + return r + + +def looseX( pool, xs ): + # Only pool with 7 subunits can loose subunit. + assert num_subunits( pool.name ) == 7, 'Only CaMKII(7) can gain subunit' + global curr_subsec_ + loosers_.append( ('x', pool.name) ) + r = add_reaction( '%s/%s.loose_x' % (pool.path, pool.name)) + r.numKf = _p.rate_loosex + r.numKb = 0.0 + moose.connect( r, 'sub', pool, 'reac' ) + toPoolName = 'x%dy%d' % (xs-1, 7 - xs ) + toPool = molecules_[ curr_subsec_ + '.' + toPoolName ] + moose.connect( r, 'prd', toPool, 'reac' ) + moose.connect( r, 'prd', molecules_[curr_subsec_ + '.x'], 'reac' ) + assert num_subunits(pool.name) == num_subunits(toPool.name) + 1 + _logger.debug( 'Reaction: %s -> %s + x' % ( pool.name, toPool.name) ) + + +def looseY( pool, ys ): + # Only pool with 7 subunits can loose subunit. + assert num_subunits( pool.name ) == 7, 'Only CaMKII(7) can gain subunit' + global curr_subsec_ + loosers_.append( ('y', pool.name) ) + r = add_reaction( '%s/%s.loose_y' % (pool.path, pool.name) ) + r.numKf = _p.rate_loosey + r.numKb = 0.0 + moose.connect( r, 'sub', pool, 'reac' ) + toPoolName = 'x%dy%d' % (7-ys, ys - 1 ) + toPool = molecules_[ curr_subsec_ + '.' + toPoolName ] + moose.connect( r, 'prd', toPool, 'reac' ) + moose.connect( r, 'prd', molecules_[curr_subsec_ + '.y'], 'reac' ) + _logger.debug( 'Reaction: %s -> %s + y' % ( pool.name, toPool.name ) ) + assert num_subunits( pool.name) == num_subunits( toPool.name) + 1 + + +def gainX( pool, xs ): + # Only pool with 6 subunits can gain subunit. + global curr_subsec_ + gainers_.append( ('x', pool.name) ) + r = add_reaction( '%s/%s.gainx' % (pool.path, pool.name)) + r.numKf = _p.rate_gainx + r.numKb = 0.0 + moose.connect( r, 'sub', pool, 'reac' ) + moose.connect( r, 'sub', molecules_['%s.x' % curr_subsec_ ], 'reac' ) + toPoolName = 'x%dy%d' % (xs+1, 6 - xs ) + toPool = molecules_[ curr_subsec_ + '.' + toPoolName ] + moose.connect( r, 'prd', toPool, 'reac' ) + _logger.debug( 'Reaction: %s + x -> %s' % ( pool.name, toPool.name ) ) + assert num_subunits( pool.name ) == 6, 'Only CaMKII(6) can gain subunit' + assert num_subunits( pool.name) == num_subunits( toPool.name) - 1 + + +def gainY( pool, ys ): + # Only pool with 6 subunits can gain subunit. + global curr_subsec_ + gainers_.append( ('y', pool.name) ) + r = add_reaction( '%s/%s.gainy' % (pool.path, pool.name) ) + r.numKf = _p.rate_gainy + r.numKb = 0.0 + moose.connect( r, 'sub', pool, 'reac' ) + moose.connect( r, 'sub', molecules_['%s.y' % curr_subsec_], 'reac' ) + toPoolName = 'x%dy%d' % ( 6-ys, ys+1 ) + toPool = molecules_[ curr_subsec_ + '.' + toPoolName ] + moose.connect( r, 'prd', toPool, 'reac' ) + _logger.debug( 'Reaction: %s, y -> %s' % ( pool.name, toPool.name ) ) + assert num_subunits( pool.name ) == 6, 'Only CaMKII(6) can gain subunit' + assert num_subunits( pool.name) == num_subunits( toPool.name) - 1 + + +def ca_input( root ): + """Input calcium pulse + + When using stochastic solver, any event less than 100 or so seconds would + not work. + """ + global args + # Input calcium + ca = moose.Pool( '%s/ca' % root.path ) + ca.concInit = _p.ca_basal + ca.name = pool_name( root, ca.name ) + molecules_[ ca.name ] = ca + + _logger.info("Setting up input calcium : init = %s" % ca.concInit ) + + # _logger.debug("Baselevel ca conc = %s" % _p.resting_ca_conc) + concFunc = moose.Function( "%s/cafunc" % ca.path ) + concFunc.expr = args[ 'ca_expr' ] + moose.connect( concFunc, 'valueOut', ca, 'setConc' ) + _logger.info( "Ca conc expression = %s " % concFunc.expr ) + + +def i1_to_i1p( root ): + global molecules_ + global curr_subsec_ + i1p_const = moose.BufPool( '%s/i1p_const' % molecules_[curr_subsec_ + '.' + 'I1'].path) + i1p_const.name = pool_name( root, i1p_const.name ) + molecules_[i1p_const.name] = i1p_const + + f = moose.Function( '%s/i12i1p' % molecules_[pool_name(root, 'I1P')].path ) + f.x.num = 2 + f.expr = 'x1*(1+(x0/{kh2})^3)/(x0/{kh2})^3'.format(kh2=conc_to_n(_p.K_H2)) + frmName = pool_name( root, 'I1' ) + toName = pool_name( root, 'I1P_' ) + moose.connect( molecules_[pool_name(root,'ca')], 'nOut', f.x[0], 'input' ) + moose.connect( molecules_[frmName], 'nOut', f.x[1], 'input' ) + moose.connect( f, 'valueOut', molecules_[toName], 'setN' ) + _logger.debug('Reaction: %s -> %s, Expr = %s' % (frmName, toName, f.expr )) + + # A slow reaction between I1P and I1P_ which synchornize both pools. + r = add_reaction( '%s/sync' % molecules_[pool_name(root,'I1P')].path ); + frmPool = molecules_[ pool_name( root, 'I1P_' ) ] + toPool = molecules_[ pool_name( root, 'I1P' ) ] + moose.connect( r, 'sub', frmPool, 'reac' ) + moose.connect( r, 'prd', toPool, 'reac' ) + r.Kf = r.Kb = 1.0 + _logger.debug( 'Reaction: %s -> %s' % ( frmPool.name, toPool.name ) ) + + +def pp1_activation( root ): + """Here we setup the reactions PP1 + + I1P binds with PP1 and give rise to complex I1PPP1 (which is inavtivated PP1) + I1P + PP1 <- -> I1PPP1 + """ + activePP1 = molecules_[pool_name(root, 'PP1')] + i1pPool = molecules_[ pool_name( root, 'I1P' ) ] + inactive_pp1 = molecules_[ pool_name( root, 'I1PPP1' ) ] + r = add_reaction( '%s/reac_inactivate_pp1' % activePP1.path ) + + moose.connect( r, 'sub', activePP1, 'reac' ) + moose.connect( r, 'prd', inactive_pp1, 'reac') + k3, k4, s = 1e5, 0.0001, 1 + kfFun = moose.Function( '%s/kffunc' % r.path ) + kfFun.expr = '{scale}*{k3}*x0'.format( k3 = k3, scale = s ) + moose.connect( i1pPool, 'nOut', kfFun.x[0], 'input' ) + moose.connect( kfFun, 'valueOut', r, 'setNumKf' ) + r.numKb = s * k4 + + _logger.debug( 'Reaction: %s + %s -> %s' % ( activePP1.name, i1pPool.name, + inactive_pp1.name ) ) + + +def dephosphorylate( root, frmPool, toPool ): + global molecules_ + global curr_subsec_ + dephospho_.append( frmPool.name ) + + _logger.info( 'Not using Michealson Menten scheme for dephosphorylate' ) + inter = moose.Pool( '%s/pp1_%s_cplx' % (frmPool.path, frmPool.name) ) + inter.name = curr_subsec_ + '.' + inter.name + inter.nInit = 0 + r = add_reaction( '%s/%s.add_pp1' % (frmPool.path, frmPool.name) ) + moose.connect( r, 'sub', frmPool, 'reac' ) + moose.connect( r, 'sub', molecules_[curr_subsec_+ '.' + 'PP1'], 'reac' ) + moose.connect( r, 'prd', inter, 'reac' ) + r.Kf = _p.k_2 / _p.K_M + r.Kb = 0.0 + + rr = add_reaction( '%s/%s_dephospho' % (frmPool.path,frmPool.name) ) + moose.connect( rr, 'sub', inter, 'reac' ) + moose.connect( rr, 'prd', molecules_[curr_subsec_ + '.' + 'PP1'], 'reac' ) + moose.connect( rr, 'prd', toPool, 'reac' ) + rr.Kf = 1.0 + rr.Kb = 0.0 + _logger.debug( "Reac (dephospho): %s -> %s" % (frmPool.name, toPool.name )) + + +def phosphorylation_first_step( root, nc ): + # CaMKII to x1y0 is slow. + subPool = molecules_[ pool_name( root, 'x0y%d' % nc ) ] + prdPool = molecules_[ pool_name( root, 'x1y%d' % (nc-1) ) ] + r0 = add_reaction( '%s/reac_0to1_%d' % (subPool.path, nc) ) + r0.numKb = 0 + moose.connect( r0, 'sub', subPool, 'reac' ) + moose.connect( r0, 'prd', prdPool, 'reac' ) + # The rate expression of this reaction depends on Ca++ + f = moose.Function( '%s/func_kf' % r0.path ) + f.expr = '{nc}*{k1}*(x0/{kh1})^6/(1 + (x0/{kh1})^3)^2'.format( + k1 = _p.k_1, kh1= conc_to_n(_p.K_H1), nc = nc + ) + f.x.num = 1 + moose.connect( molecules_[pool_name(root,'ca')], 'nOut', f.x[0], 'input' ) + moose.connect( f, 'valueOut', r0, 'setNumKf' ) + _logger.debug( 'Reaction: %s -> %s' % (subPool.name, prdPool.name ) ) + + +def phosphorylation_first_step_subunit( compt ): + """ + NOTE: Phosphorylation of detached subunit is much faster than the subunits in + holoenzyme. Why? + + Phosphorylation of detached subunit is not possible. To phosphorylate, the + subunit must have a neighbour i.e. two subunit must come together first. + + """ + return + + # Previously I was phosphrylating the subunits. + global molecules_ + global curr_subsec_ + subPool = molecules_[ pool_name( compt, 'y') ] + prdPool = molecules_[ pool_name( compt, 'x') ] + r0 = add_reaction( '%s/reac_y2x' % compt.path ) + r0.numKb = 0 + moose.connect( r0, 'sub', subPool, 'reac' ) + moose.connect( r0, 'prd', prdPool, 'reac' ) + # The rate expression of this reaction depends on Ca++ + f = moose.Function( '%s/func_kf' % r0.path ) + f.expr = '{k1}*(x0/{kh1})^3/(1 + (x0/{kh1})^3)'.format( + k1 = _p.k_1 , kh1= conc_to_n(_p.K_H1) + ) + f.x.num = 1 + moose.connect( molecules_[ pool_name(compt, 'ca') ], 'nOut', f.x[0], 'input' ) + moose.connect( f, 'valueOut', r0, 'setNumKf' ) + _logger.info( 'Phosphorylation of subunit y in voxel %s' % compt.name ) + _logger.debug( 'Reaction: %s -> %s' % (subPool.name, prdPool.name ) ) + + +def camkii_activation_deactivation( root ): + """All reaction involved in activating CaMKII""" + + phosphorylation_first_step( root, 6 ) + + if args['enable_subunit_exchange']: + phosphorylation_first_step( root, 7 ) + + # Phosphorylation of CaMKII occurs in various stages: + # x0y0 -> x1y0 -> x2y0 -> x3y0 -> x4y0 -> x5y0 -> CaMKII* + for pp in range(1, 6): + frm, to = 'x%dy%d' % (pp, 6-pp), 'x%dy%d' % (pp + 1, 6-pp-1) + frmName, toName = [pool_name(root, x) for x in [frm, to]] + r = add_reaction( '%s/phospho_%s_%s' % (root.path, frmName, toName)) + # And its rate is controlled by another function + f = moose.Function( '%s/funcKf' % r.path ) + f.expr = '{k1}*(x0/{kh1})^3/(1 + (x0/{kh1})^3)'.format( + k1 = _p.k_1, kh1= conc_to_n(_p.K_H1) + ) + f.x.num = 1 + moose.connect( molecules_[pool_name(root,'ca')], 'nOut', f.x[0], 'input' ) + moose.connect( f, 'valueOut', r, 'setNumKf' ) + r.numKb = 0 + moose.connect( r, 'sub', molecules_[frmName], 'reac') + moose.connect( r, 'prd', molecules_[toName], 'reac') + _logger.debug("Reaction: %s -> %s, numKf=%s" % (frmName, toName, f.expr )) + + # The symmetry of 7 kicks in only when args['enable_subunit_exchange'] is enabled. + if args['enable_subunit_exchange']: + for pp in range(1, 7): + frm, to = 'x%dy%d' % (pp, 7-pp), 'x%dy%d' % (pp + 1, 7-pp-1) + frmName, toName = [ pool_name(root, x) for x in [frm, to] ] + r = add_reaction( '%s/phospho_%s_%s' % (root.path, frm, to)) + # And its rate is controlled by another function + f = moose.Function( '%s/funcKf' % r.path ) + f.expr = '{k1}*(x0/{kh1})^3/(1 + (x0/{kh1})^3)'.format( + k1 = _p.k_1, kh1= conc_to_n(_p.K_H1) + ) + f.x.num = 1 + moose.connect( molecules_[pool_name(root,'ca')], 'nOut', f.x[0], 'input' ) + moose.connect( f, 'valueOut', r, 'setNumKf' ) + r.numKb = 0 + moose.connect( r, 'sub', molecules_[frmName], 'reac') + moose.connect( r, 'prd', molecules_[toName], 'reac') + _logger.debug("Reaction: %s -> %s (numKf = %s)" % (frmName, toName, f.expr )) + + gainX( molecules_[ pool_name(root, 'x0y6') ], 0 ) + gainY( molecules_[ pool_name(root, 'x6y0') ], 0 ) + + for nP in range(1, 7): + if args['enable_subunit_exchange']: + gainX( molecules_[ pool_name(root, 'x%dy%d' % (nP, 6-nP) )], nP ) + gainY( molecules_[ pool_name(root, 'x%dy%d' % (6-nP, nP) )], nP ) + + frmPool = molecules_[ pool_name(root, 'x%dy%d' % (nP, 6-nP)) ] + toPool = molecules_[ pool_name( root, 'x%dy%d' % (nP-1, 6-nP+1)) ] + dephosphorylate( root, frmPool, toPool ) + + if args['enable_subunit_exchange']: + for nP in range(1, 8): + looseX( molecules_[ pool_name(root,'x%dy%d' % (nP, 7-nP)) ], nP ) + looseY( molecules_[ pool_name(root,'x%dy%d' % (7-nP, nP)) ], nP ) + + frmPool = molecules_[ pool_name(root, 'x%dy%d' % (nP, 7-nP)) ] + toPool = molecules_[ pool_name(root, 'x%dy%d' % (nP-1, 7-nP+1)) ] + dephosphorylate( root, frmPool, toPool ) + + if False: + # A reaction between PP1 and PP1_ which synchornize both pools. + r = add_reaction( '%s/sync' % molecules_[pool_name(root,'PP1_')].path ); + a = molecules_[ pool_name( root, 'PP1_' ) ] + b = molecules_[ pool_name( root, 'PP1' ) ] + moose.connect( r, 'sub', a, 'reac' ) + moose.connect( r, 'prd', b, 'reac' ) + r.Kf = 0.1 + r.Kb = 0 + _logger.debug( "Reac %s -> %s" % (a.name, b.name )) + +def remove_extra( pool, limit ): + null = moose.BufPool( '%s/null' % pool.path ) + null.nInit = 0.0 + nullReac = moose.Reac( '%s/null_reac' % pool.path ) + nullReac.numKb = 0.0 + moose.connect( nullReac, 'sub', pool, 'reac' ) + moose.connect( nullReac, 'prd', null, 'reac' ) + nullF = moose.Function( '%s/func_null' % pool.path ) + nullF.expr = '(x0 > %f)?1e-2:0' % limit + _logger.debug( 'Removing extra from pool %s' % pool.path ) + _logger.debug( '\tExpression on nullR %s' % nullF.expr ) + moose.connect( pool, 'nOut', nullF.x[0], 'input' ) + moose.connect( nullF, 'valueOut', nullReac, 'setNumKf' ) + + +def add_turnover( root ): + # Added turnover of CaMKII + global curr_subsec_ + global args + + r = add_reaction( '%s/%s.turnover6' % (root.path, curr_subsec_) ) + moose.connect( r, 'sub', molecules_[pool_name(root,'x6y0')], 'reac' ) + moose.connect( r, 'prd', molecules_[pool_name(root,'x0y6')], 'reac' ) + r.Kf = args[ 'turnover_rate' ] + _logger.info( "Turnover rate for CaMKII(6) %g" % r.Kf ) + r.Kb = 0.0 + + if args['enable_subunit_exchange']: + rr = add_reaction( '%s/%s.turnover7' % (root.path, curr_subsec_) ) + moose.connect( rr, 'sub', molecules_[pool_name(root,'x7y0')], 'reac' ) + moose.connect( rr, 'prd', molecules_[pool_name(root,'x0y7')], 'reac' ) + rr.Kf = args[ 'turnover_rate' ] + _logger.info( "Turnover rate for CaMKII(7) %g" % rr.Kf ) + rr.Kb = 0.0 + + +def print_compt( compt ): + reacs = moose.wildcardFind( '%s/##[TYPE=ZombieReac]' % compt.path ) + reacs += moose.wildcardFind( '%s/##[TYPE=Reac]' % compt.path ) + _logger.debug( 'Total %s reactions ' % len(reacs )) + dot = [ "digraph system { " ] + molecules = [] + rtext = '' + for r in reacs: + subs = [] + for ss in r.neighbors['sub']: + for s in ss: + subs.append( '"%s"' % s.path ) + molecules.append( '"%s" [label="%s",shape=circle,diffConst="%g"]; ' % ( + s.path, "", s.diffConst ) ) + rtext += '\t' + ' , '.join( subs ) + molecules.append( '"%s" [label="", shape=rect];' % r.name ) + rtext += ' -> "%s" -> ' % r.name + tgt = [ ] + # print( '->' ) + for tt in r.neighbors['prd']: + for t in tt: + # print(t.path[-20:]) + tgt.append( '"%s"' % t.path ) + molecules.append( '"%s" [label="%s",shape=circle,diffConst="%g"]; ' % ( + t.path, t.name, t.diffConst ) ) + rtext += ' , '.join( tgt ) + rtext += '\n' + # print( '\n') + try: + _logger.debug( 'Volume of compartment : %g, ' % compt.volume ) + except Exception as e: + _logger.warn( ' Compartment does not have volume' ) + + _logger.info( 'Total reactions %d' % len( set( reacs ) ) ) + _logger.info( 'Total species %d' % len( set(molecules) ) ) + dot.append( '\t\n'.join( molecules ) ) + dot.append( rtext ) + dot.append( "}" ) + with open( '%s.dot' % sys.argv[0], 'w' ) as f: + f.write( "\n".join( dot ) ) + + +def setup_solvers( compt, stochastic ): + global args + stoich = moose.Stoich( "%s/stoich" % compt.path) + if stochastic: + _logger.info("Setting up Stochastic solver in %s" % compt.path ) + s = moose.Gsolve('%s/gsolve' % compt.path) + s.useClockedUpdate = True + else: + s = moose.Ksolve('%s/ksolve' % compt.path) + _logger.info( 'Using method %s' % s.method ) + + stoich.compartment = moose.element(compt.path) + stoich.ksolve = s + stoich.path = '%s/##' % compt.path + + +def is_close( val, ref, rtol): + if abs(val - ref)/float(ref) <= rtol: + return True + return False + + +def assert_close( val, ref, rtol): + if is_close( val, ref, rtol ): + return True + _logger.warn('FAILED' + , "Expected %s, got %s, relative tolerance: %s" % (ref, val, rtol) + ) + return False + + +def make_model( root, **kwargs): + global args + _logger.info( 'Making model under %s' % root ) + init_pools( root ) + ca_input( root ) + i1_to_i1p( root ) + pp1_activation( root ) + camkii_activation_deactivation( root ) + if args['enable_subunit_exchange']: + _logger.info( 'Subunit exchange is enabled' ) + if True: + dephosphorylate( root, molecules_[ pool_name( root, 'x') ], molecules_[ pool_name( root, 'y' ) ] ) + else: + _logger.warn( 'x is not dephosphorylated to y in this version' ) + # And y phosphorylate into x + phosphorylation_first_step_subunit( root ) + else: + _logger.info( 'No subunit exchage in voxel %s' % root.name ) + add_turnover( root ) + + + +def verify( ): + global compt_ + # pools = moose.wildcardFind( '%s/##[TYPE=Pool]' % model_path_ ) + pools = moose.wildcardFind( '%s/##[TYPE=ZombiePool]' % model_path_ ) + assert len(pools) > 0 + allMolecules = np.sum( [ x.nInit for x in pools ] ) + _logger.debug( 'All molecules in systems %d' % allMolecules ) + +def setupTables( plotlist = [ ] ): + """Create tables. + Once can add table when pools are created. But when Dsolve is used, table + must be created after setting the solvers. If number of voxels are n (>1 ), + each pool is divided into n but Tables are not replicated. + Is it a bug BhallaLab/moose-core#159 + + If plotlist is empty, create table on all Pools/BuffPools + """ + + global tables_ + global model_path_ + + allPools = moose.wildcardFind( '%s/##[TYPE=ZombiePool]' % model_path_ ) + allPools += moose.wildcardFind( '%s/##[TYPE=ZombieBufPool]' % model_path_ ) + if not plotlist: + plotlist = allPools + + for i, p in enumerate( plotlist ): + add_table( p, 'n' ) + + # Now renamed the tables for better plotting. + tables = [ ] + for k in tables_: + for i, tab in enumerate( tables_[ k ] ): + tab.columnName = '%s[%d].N' % ( k, i ) + tables.append( tab ) + return tables + +def setup_diffusion_of_pool( voxel1, voxel2, species, diff_const = 1e-12 ): + """Setup diffusion between voxels """ + global molecules_ + global compt_ + pool1 = molecules_[ '%s.%s' % (voxel1.name, species ) ] + pool2 = molecules_[ '%s.%s' % (voxel2.name, species ) ] + r = moose.Reac( '%s/diff_%s' % (voxel1.path, species ) ) + moose.connect( r, 'sub', pool1, 'reac' ) + moose.connect( r, 'prd', pool2, 'reac' ) + _logger.info( + 'Diffusion reaction between %s <-> %s' % (pool1.name, pool2.name) + ) + # The rate constant is given by D / l / l. For diffusion coefficients of 1 + # uM^2/sec in a + d = diff_const / (( compt_.x1 - compt_.x0 ) ** 2) + _logger.debug( 'Diffusion coefficient (%s) %f -> rate %f' % (species, diff_const, d) ) + r.numKf = d + r.numKb = d + +def setup_diffusion( voxels, species ): + """Setup diffusion across voxels """ + global args + + if len( voxels ) < 2: + _logger.info( 'Not enough voxels to setup diffusion' ) + return + + if False: + # A <-> B <-> C where <-> is diffusion between two compartments. + for i, v2 in enumerate( voxels[1:] ): + v1 = voxels[i] + setup_diffusion_of_pool( v1, v2 + , species, args[ 'diff_dict'].get( species, 0.0 ) + ) + else: + # A <-> B <-> C <-> A where <-> is diffusion between two compartments. + for i, v1 in enumerate( voxels ): + v2 = voxels[ (i+1) % len(voxels) ] + setup_diffusion_of_pool( v1, v2, species, args[ 'diff_dict'].get( species, 0.0 ) ) + + +def main( compt_name, **kwargs ): + global args + global model_path_ + global curr_subsec_ + global compt_ + moose.Neutral( model_path_ ) + args = kwargs + + voxels = [ ] + l = args[ 'voxel_length' ] + nVoxels = args[ 'num_voxels' ] + radius = 30e-9 + args[ 'volume' ] = math.pi * radius * radius * l + args[ 'camkii_conc' ] = n_to_conc( args[ 'camkii' ] / nVoxels ) + args[ 'pp1_conc' ] = n_to_conc( args[ 'pp1' ] / nVoxels ) + args[ 'psd_volume' ] = 0.0 + + if isinstance( args['diff_dict'], str ): + args[ 'diff_dict' ] = eval( args[ 'diff_dict' ] ) + _logger.info( 'Diffusion dict %s' % args[ 'diff_dict' ] ) + + compt_ = moose.CylMesh( '%s/%s' % (model_path_, compt_name ) ) + compt_.x1 = l + compt_.r0 = compt_.r1 = radius + + _logger.info( 'Volume of compt %g' % compt_.volume ) + for i in range( args[ 'num_voxels' ] ): + curr_subsec_ = 'sw%d' % i + voxel = moose.Neutral( '%s/%s' % ( compt_.path, curr_subsec_ ) ) + _logger.info( "Creating voxles %d" % i ) + _logger.debug( '==== Created subsystem inside %s' % voxel.name ) + make_model( voxel, **kwargs ) + voxels.append( voxel ) + + for x in args[ 'diff_dict' ].keys( ): + _logger.info( "Setting up diffusion for %s" % x ) + try: + setup_diffusion( voxels, x ) + except Exception as e: + _logger.warn( 'Could not enable diffusion for %s' % x ) + _logger.warn( '\tError was %s' % e ) + + + setup_solvers( compt_, stochastic = True ) + print_compt( compt_ ) + + # Now add solvers and other goodies in compartment. + moose.setClock(18, args['record_dt'] ) # Table2 + tables = setupTables( ) + + st = moose.Streamer( '/model/streamer' ) + st.outfile = args['outfile'] + _logger.info( 'Added streamer with outfile %s' % st.outfile ) + st.addTables( tables ) + t1 = time.time() + stamp = datetime.datetime.now().isoformat() + # moose.setClock( 10, 0.003 ) + # moose.setClock( 15, 0.03 ) + # moose.setClock( 16, 0.03 ) + moose.reinit() + print( '== Gainers' ) + print( sorted( gainers_ ) ) + print( '== Loosers' ) + print( sorted( loosers_ ) ) + print( '== Dephosphorylated' ) + print( sorted( dephospho_ ) ) + + # sanity tests + verify( ) + runtime = 24 * 3600 * float( args[ 'simtime' ] ) + _logger.info('Running for %d seconds' % runtime ) + t = time.time( ) + moose.start( runtime, 1 ) + print( '[INFO] Time taken %f' % (time.time() - t ) ) + + # append parameters to streamer file. + with open( st.outfile, 'a' ) as f: + f.write( "# %s" % str( args ) ) + print( '[INFO] Appended simulation parameters to file' ) + + _logger.info( 'Total time taken %s' % (time.time() - t1 ) ) + + + +if __name__ == '__main__': + import argparse + # Argument parser. + description = 'CaMKII/PP1 switch. Most parameters are in params.py file.' + parser = argparse.ArgumentParser(description=description) + + parser.add_argument('--simtime', '-st' + , required = False + , default = _p.run_time + , type = float + , help = 'Run time for simulation (days)' + ) + + parser.add_argument('--outfile', '-o' + , required = False + , default = '%s.dat' % sys.argv[0] + , help = 'Outfile to save the data in (csv) file.' + ) + + parser.add_argument('--camkii', '-ck' + , required = False + , default = _p.N_CaMK + , type = float + , help = 'No of CaMKII molecules in each voxel.' + ) + + parser.add_argument('--pp1', '-pp' + , required = False + , type = float + , default = _p.N_PP1 + , help = 'No of PP1 molecules in each voxel.' + ) + + parser.add_argument('--turnover-rate', '-tr' + , required = False + , type = float + , default = _p.turnover_rate + , help = 'Turnover rate of CaMKKII (in per second)' + ) + + parser.add_argument('--record-dt', '-dt' + , required = False + , default = 60 + , type = float + , help = 'Record dt for plot' + ) + + parser.add_argument('--enable-subunit-exchange', '-SE' + , required = False + , default = False + , action = 'store_true' + , help = 'Enable subunit exchange.' + ) + + parser.add_argument('--num-switch', '-ns' + , required = False + , default = _p.num_switch + , type = int + , help = 'No of switches in system' + ) + + parser.add_argument('--num-voxels', '-nv' + , required = False + , default = _p.num_voxels + , type = int + , help = 'No of voxels in one switch.' + ) + + parser.add_argument('--diff-dict', '-dd' + , required = False + , default = '%s' % _p.diff_consts + , type = str + , help = 'Diffusion coefficients as python dictionary' + ) + + parser.add_argument('--voxel-length', '-nl' + , required = False + , default = _p.voxel_length + , type = float + , help = 'Length of individial voxel' + ) + + parser.add_argument('--ca-expr', '-ca' + , required = False + , default = _p.ca_expr + , help = 'Calcium expression (muParser/moose expression)' + ) + + parser.add_argument('--michaelis-menten', '-mm' + , required = False + , default = False + , action = 'store_true' + , help = 'Use Michealson-Menten scheme for dephosphorylated.' + ) + + parser.parse_args( namespace = args ) + main( 'camkii_pp1_0', **vars(args) )