├── .github └── workflows │ └── test_and_deploy.yml ├── .gitignore ├── .pre-commit-config.yaml ├── CITATION.cff ├── LICENSE ├── MANIFEST.in ├── README.md ├── examples ├── download │ ├── allen_morphology_api.py │ ├── mouselight_api.py │ ├── mpin_api.py │ └── neuromorpho_api.py ├── example_files │ ├── example1.swc │ ├── example2.swc │ └── example3.swc └── visualise │ └── visualise_swc.py ├── morphapi ├── __init__.py ├── api │ ├── __init__.py │ ├── allenmorphology.py │ ├── mouselight.py │ ├── mpin_celldb.py │ └── neuromorphorg.py ├── morphology │ ├── __init__.py │ ├── cache.py │ └── morphology.py ├── paths_manager.py └── utils │ ├── __init__.py │ ├── data_io.py │ └── webqueries.py ├── pyproject.toml └── tests ├── __init__.py ├── data ├── example1.swc ├── example2.swc └── example3.swc ├── test_download.py └── test_neuron.py /.github/workflows/test_and_deploy.yml: -------------------------------------------------------------------------------- 1 | name: tests 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | tags: 8 | - '*' 9 | pull_request: 10 | schedule: 11 | # Runs at 6:10am UTC on Monday 12 | - cron: '10 6 * * 1' 13 | 14 | jobs: 15 | linting: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: neuroinformatics-unit/actions/lint@v2 19 | 20 | manifest: 21 | name: Check Manifest 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: neuroinformatics-unit/actions/check_manifest@v2 25 | 26 | test: 27 | needs: [linting, manifest] 28 | name: ${{ matrix.os }} py${{ matrix.python-version }} 29 | runs-on: ${{ matrix.os }} 30 | strategy: 31 | matrix: 32 | # Run all supported Python versions on linux 33 | os: [ubuntu-latest] 34 | python-version: ["3.11", "3.12", "3.13"] 35 | # Include one windows and one macOS run 36 | include: 37 | - os: macos-latest 38 | python-version: "3.13" 39 | - os: windows-latest 40 | python-version: "3.13" 41 | 42 | steps: 43 | # Run tests 44 | - name: install HDF5 libs on ARM Mac 45 | if: matrix.os == 'macos-latest' 46 | run: brew install hdf5 47 | - uses: neuroinformatics-unit/actions/test@v2 48 | with: 49 | python-version: ${{ matrix.python-version }} 50 | secret-codecov-token: ${{ secrets.CODECOV_TOKEN }} 51 | 52 | 53 | - name: Notify slack on scheduled failure 54 | if: failure() && github.event_name == 'schedule' 55 | uses: ravsamhq/notify-slack-action@v2 56 | with: 57 | status: ${{ job.status }} # required 58 | notify_when: 'failure' 59 | env: 60 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_NOTIFYBOT_WEBHOOK_URL }} # required 61 | 62 | 63 | build_sdist_wheels: 64 | name: Build source distribution 65 | needs: [test] 66 | if: github.event_name == 'push' && github.ref_type == 'tag' 67 | runs-on: ubuntu-latest 68 | steps: 69 | - uses: neuroinformatics-unit/actions/build_sdist_wheels@v2 70 | 71 | 72 | upload_all: 73 | name: Publish build distributions 74 | needs: [build_sdist_wheels] 75 | if: github.event_name == 'push' && github.ref_type == 'tag' 76 | runs-on: ubuntu-latest 77 | steps: 78 | - uses: actions/download-artifact@v4 79 | with: 80 | name: artifact 81 | path: dist 82 | - uses: pypa/gh-action-pypi-publish@release/v1 83 | with: 84 | user: __token__ 85 | password: ${{ secrets.TWINE_API_KEY }} 86 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask instance folder 57 | instance/ 58 | 59 | # Sphinx documentation 60 | docs/_build/ 61 | 62 | # MkDocs documentation 63 | /site/ 64 | 65 | # PyBuilder 66 | target/ 67 | 68 | # Pycharm and VSCode 69 | .idea/ 70 | venv/ 71 | .vscode/ 72 | 73 | # IPython Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # OS 80 | .DS_Store 81 | 82 | # written by setuptools_scm 83 | **/_version.py 84 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Configuring https://pre-commit.ci/ 4 | ci: 5 | autoupdate_schedule: monthly 6 | 7 | repos: 8 | - repo: https://github.com/pre-commit/pre-commit-hooks 9 | rev: v5.0.0 10 | hooks: 11 | - id: check-docstring-first 12 | - id: check-executables-have-shebangs 13 | - id: check-merge-conflict 14 | - id: check-toml 15 | - id: end-of-file-fixer 16 | - id: mixed-line-ending 17 | args: [--fix=lf] 18 | - id: requirements-txt-fixer 19 | - id: trailing-whitespace 20 | - repo: https://github.com/astral-sh/ruff-pre-commit 21 | rev: v0.11.12 22 | hooks: 23 | - id: ruff 24 | - repo: https://github.com/psf/black 25 | rev: 25.1.0 26 | hooks: 27 | - id: black 28 | - repo: https://github.com/pre-commit/mirrors-mypy 29 | rev: v1.16.0 30 | hooks: 31 | - id: mypy 32 | additional_dependencies: 33 | - types-setuptools 34 | - types-requests 35 | - types-PyYAML 36 | - types-retry 37 | - repo: https://github.com/mgedmin/check-manifest 38 | rev: "0.50" 39 | hooks: 40 | - id: check-manifest 41 | args: [--no-build-isolation] 42 | additional_dependencies: [setuptools-scm, wheel] 43 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | # This CITATION.cff file was generated with cffinit. 2 | # Visit https://bit.ly/cffinit to generate yours today! 3 | 4 | cff-version: 1.2.0 5 | title: morphapi 6 | message: >- 7 | If you use this software, please cite it using the 8 | metadata from this file. 9 | type: software 10 | authors: 11 | - given-names: Federico 12 | family-names: Claudi 13 | - given-names: BrainGlobe 14 | family-names: Developers 15 | email: hello@brainglobe.info 16 | repository-code: 'https://github.com/brainglobe/morphapi' 17 | url: 'https://brainglobe.info' 18 | abstract: >- 19 | A lightweight python package to download neuronal 20 | morphologies. 21 | license: MIT 22 | date-released: '2023-11-16' 23 | year: 2023 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 University College London 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include CITATION.cff 2 | include LICENSE 3 | include README.md 4 | exclude .pre-commit-config.yaml 5 | 6 | recursive-exclude * __pycache__ 7 | recursive-exclude * *.py[co] 8 | recursive-exclude docs * 9 | recursive-exclude tests * 10 | recursive-exclude examples * 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # morphapi 2 | 3 | ## Overview 4 | Morphapi is a lightweight python package for downloading neurons 5 | morphological reconstructions from publicly available datasets. 6 | 7 | Please see the [documentation](https://brainglobe.info/documentation/morphapi/index.html). 8 | 9 | ## Seeking help or contributing 10 | We are always happy to help users of our tools, and welcome any contributions. If you would like to get in contact with us for any reason, please see the [contact page of our website](https://brainglobe.info/contact.html). 11 | -------------------------------------------------------------------------------- /examples/download/allen_morphology_api.py: -------------------------------------------------------------------------------- 1 | from vedo import Plotter 2 | 3 | from morphapi.api.allenmorphology import AllenMorphology 4 | 5 | am = AllenMorphology() 6 | 7 | print(am.neurons.head()) 8 | 9 | # Select some mouse neurons in the primary visual cortex 10 | neurons = am.neurons.loc[ 11 | (am.neurons.species == "Mus musculus") 12 | & (am.neurons.structure_area_abbrev == "VISp") 13 | ] 14 | 15 | # Download some neurons 16 | neurons = am.download_neurons(neurons[:5].id.values) 17 | 18 | # ----------------------- Visualisation --------------------- # 19 | print("creating meshes") 20 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 21 | 22 | print("visualizing") 23 | vp = Plotter(axes=1) 24 | 25 | vp.show(neurons) 26 | -------------------------------------------------------------------------------- /examples/download/mouselight_api.py: -------------------------------------------------------------------------------- 1 | """ 2 | mlapi.download_neurons returns a list of instances of the class Neuron 3 | from morphapi.morphology.morphology. 4 | """ 5 | 6 | from vedo import Plotter 7 | 8 | from morphapi.api.mouselight import MouseLightAPI 9 | 10 | # ---------------------------- Downloading neurons ------------------------- # 11 | mlapi = MouseLightAPI() 12 | 13 | # Fetch metadata for neurons with soma in the secondary motor cortex 14 | neurons_metadata = mlapi.fetch_neurons_metadata( 15 | filterby="soma", filter_regions=["MOs"] 16 | ) 17 | 18 | # Then we can download the files and save them as a .json file 19 | neurons = mlapi.download_neurons(neurons_metadata[0]) 20 | 21 | 22 | # ------------------------------- Visualisation ---------------------------- # 23 | print("creating meshes") 24 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 25 | 26 | print("visualizing") 27 | vp = Plotter(shape=(1, len(neurons)), axes=1) 28 | 29 | vp.show(neurons) 30 | -------------------------------------------------------------------------------- /examples/download/mpin_api.py: -------------------------------------------------------------------------------- 1 | # ----------------------------- Download dataset -------------------------- # 2 | """ 3 | If it's the first time using this API, you'll have to download the dataset 4 | with all of the neurons' data. 5 | """ 6 | from vedo import Plotter 7 | 8 | from morphapi.api.mpin_celldb import MpinMorphologyAPI 9 | 10 | api = MpinMorphologyAPI() 11 | 12 | 13 | api.download_dataset() 14 | 15 | 16 | # You can then inspect metadata about all neurons: 17 | print(api.neurons_df.head()) 18 | 19 | # and load a few neurons 20 | neurons = api.load_neurons(list(api.neurons_df.index[:10])) 21 | 22 | # ------------------------------- Visualisation --------------------------- # 23 | print("creating meshes") 24 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 25 | 26 | print("visualizing") 27 | vp = Plotter(shape=(1, len(neurons)), axes=1) 28 | 29 | vp.show(neurons) 30 | -------------------------------------------------------------------------------- /examples/download/neuromorpho_api.py: -------------------------------------------------------------------------------- 1 | from vedo import Plotter 2 | 3 | from morphapi.api.neuromorphorg import NeuroMorpOrgAPI 4 | 5 | api = NeuroMorpOrgAPI() 6 | 7 | # ---------------------------- Downloading metadata ------------------------- # 8 | # Get metadata for pyramidal neurons from the mouse cortex. 9 | metadata, _ = api.get_neurons_metadata( 10 | size=10, # Can get the metadata for up to 500 neurons at a time 11 | species="mouse", 12 | cell_type="pyramidal", 13 | brain_region="neocortex", 14 | ) 15 | 16 | # To get a list of available query fields: print(api.fields) 17 | # To get a list of valid values for a field: 18 | # print(api.get_fields_values(field)) 19 | 20 | print("Neurons metadata:") 21 | print(metadata[0]) 22 | 23 | # ---------------------------- Download morphology ------------------------- # 24 | neurons = api.download_neurons(metadata[5]) 25 | 26 | 27 | # ------------------------------- Visualisation ---------------------------- # 28 | print("creating meshes") 29 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 30 | 31 | print("visualizing") 32 | vp = Plotter(shape=(1, len(neurons)), axes=1) 33 | 34 | vp.show(neurons) 35 | -------------------------------------------------------------------------------- /examples/visualise/visualise_swc.py: -------------------------------------------------------------------------------- 1 | """ 2 | This example shows how to use vedo to visualise a 3d reconstruction of a 3 | neuron. 4 | 5 | However, the recommended way to visualise neurons is with brainrender: 6 | https://github.com/brainglobe/brainrender 7 | """ 8 | 9 | from vedo import Plotter 10 | 11 | from morphapi.morphology.morphology import Neuron 12 | 13 | fp = "examples/example_files/example1.swc" 14 | 15 | # Create vedo actors from the .swc file 16 | neuron = Neuron(data_file=fp) 17 | components, neuron = neuron.create_mesh( 18 | neurite_radius=3, # 19 | soma_color="salmon", # Specify colors [see vedo.colors for more details] 20 | apical_dendrites_color="darkseagreen", 21 | basal_dendrites_color="orangered", 22 | axon_color="blackboard", 23 | whole_neuron_color="blackboard", 24 | ) 25 | 26 | # components stores an actor for each neuronal component (dendrites, soma...) 27 | # neuron is a single actor for the entire neuron 28 | 29 | 30 | # Show neuron as individual components or entire neuron 31 | vp = Plotter(shape=(1, 2), axes=1) 32 | vp.show(*list(components.values()), at=0, interactive=False) 33 | vp.show(neuron, at=1, interactive=True) 34 | -------------------------------------------------------------------------------- /morphapi/__init__.py: -------------------------------------------------------------------------------- 1 | from importlib.metadata import PackageNotFoundError, version 2 | 3 | try: 4 | __version__ = version("morphapi") 5 | except PackageNotFoundError: 6 | # package is not installed 7 | pass 8 | -------------------------------------------------------------------------------- /morphapi/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainglobe/morphapi/2f21781d57ee764fa6d82f477ffaceb90b2c7141/morphapi/api/__init__.py -------------------------------------------------------------------------------- /morphapi/api/allenmorphology.py: -------------------------------------------------------------------------------- 1 | import json 2 | import logging 3 | import os 4 | from pathlib import Path 5 | 6 | import numpy as np 7 | import pandas as pd 8 | import requests 9 | 10 | from morphapi.morphology.morphology import Neuron 11 | from morphapi.paths_manager import Paths 12 | from morphapi.utils.data_io import connected_to_internet 13 | 14 | logger = logging.getLogger(__name__) 15 | 16 | columns_of_interest = { 17 | "cell_reporter_status": "reporter_status", 18 | "cell_soma_location": "cell_soma_location", 19 | "donor__species": "species", 20 | "specimen__id": "id", 21 | "specimen__name": "name", 22 | "structure__layer": "structure_layer_name", 23 | "structure__id": "structure_area_id", 24 | "structure_parent__acronym": "structure_area_abbrev", 25 | "line_name": "transgenic_line", 26 | "tag__dendrite_type": "dendrite_type", 27 | "tag__apical": "apical", 28 | "nr__reconstruction_type": "reconstruction_type", 29 | "donor__disease_state": "disease_state", 30 | "donor__id": "donor_id", 31 | "specimen__hemisphere": "structure_hemisphere", 32 | "csl__normalized_depth": "normalized_depth", 33 | } 34 | 35 | 36 | class AllenMorphology(Paths): 37 | """Handles the download of neuronal morphology data from the 38 | Allen database.""" 39 | 40 | def __init__(self, *args, **kwargs): 41 | """ 42 | Initialise API interaction and fetch metadata of neurons in the 43 | Allen Database. 44 | """ 45 | if not connected_to_internet(): 46 | raise ConnectionError( 47 | "You will need to be connected to the internet to use the " 48 | "AllenMorphology class to download neurons" 49 | ) 50 | 51 | Paths.__init__(self, *args, **kwargs) 52 | 53 | # Get a list of cell metadata for neurons with reconstructions, 54 | # download if necessary 55 | self.neurons = self.get_cells(require_reconstruction=True) 56 | self.n_neurons = len(self.neurons) 57 | 58 | if not self.n_neurons: 59 | raise ValueError( 60 | "Something went wrong and couldn't get neurons metadata " 61 | "from Allen" 62 | ) 63 | 64 | self.downloaded_neurons = self.get_downloaded_neurons() 65 | 66 | def get_cells(self, require_reconstruction: bool = True) -> pd.DataFrame: 67 | """ 68 | Download the metadata for all neurons in the Allen database and save 69 | it to a cells.json file. 70 | """ 71 | cells_path = Path(self.allen_morphology_cache) / "cells.json" # type: ignore[attr-defined] 72 | 73 | if not cells_path.exists(): 74 | cells = self.fetch_all_cell_metadata(cells_path) 75 | else: 76 | cells = self.check_cell_metadata(cells_path) 77 | 78 | cells["cell_soma_location"] = cells[ 79 | ["csl__x", "csl__y", "csl__z"] 80 | ].apply(list, axis=1) 81 | cells = cells[columns_of_interest.keys()].rename( 82 | columns=columns_of_interest 83 | ) 84 | 85 | if require_reconstruction: 86 | cells.dropna(subset=["reconstruction_type"], inplace=True) 87 | cells.reset_index(inplace=True, drop=True) 88 | 89 | return cells 90 | 91 | def fetch_all_cell_metadata(self, cells_path) -> pd.DataFrame: 92 | """ 93 | Fetches the metadata for all neurons in the Allen database and saves 94 | it to a json file. 95 | 96 | :param cells_path: Path to save the metadata to 97 | """ 98 | query = "https://api.brain-map.org/api/v2/data/query.json?criteria=model::ApiCellTypesSpecimenDetail,rma::options[num_rows$eqall]" 99 | 100 | try: 101 | r = requests.get(query) 102 | with open(cells_path, "w") as f: 103 | json.dump(r.json()["msg"], f, indent=4) 104 | except requests.exceptions.RequestException as e: 105 | logger.error( 106 | "Could not fetch the neuron metadata for the following " 107 | "reason: %s", 108 | str(e), 109 | ) 110 | raise e 111 | 112 | return pd.read_json(cells_path) 113 | 114 | def check_cell_metadata(self, cells_path) -> pd.DataFrame: 115 | """ 116 | Check if the metadata file is up-to-date and return the metadata 117 | as a pandas DataFrame. 118 | 119 | :param cells_path: Path to the metadata file 120 | """ 121 | # Query for all cell types but return no rows (check for total number) 122 | query = "https://api.brain-map.org/api/v2/data/query.json?criteria=model::ApiCellTypesSpecimenDetail,rma::options[num_rows$eq0]" 123 | 124 | cells = pd.read_json(cells_path) 125 | try: 126 | r = requests.get(query) 127 | except requests.exceptions.RequestException as e: 128 | logger.error( 129 | "Could not check for metadata validity for the following " 130 | "reason: %s", 131 | str(e), 132 | ) 133 | return cells 134 | 135 | n_cells = r.json()["total_rows"] 136 | 137 | if n_cells != len(cells): 138 | logger.info("Updating neuron metadata") 139 | cells = self.fetch_all_cell_metadata(cells_path) 140 | 141 | return cells 142 | 143 | def get_downloaded_neurons(self): 144 | """ 145 | Gets the path to files of downloaded neurons 146 | """ 147 | return [ 148 | os.path.join(self.allen_morphology_cache, f) # type: ignore[attr-defined] 149 | for f in os.listdir(self.allen_morphology_cache) # type: ignore[attr-defined] 150 | if ".swc" in f 151 | ] 152 | 153 | def build_filepath(self, neuron_id): 154 | """ 155 | Build a filepath from neuron's metadata. 156 | """ 157 | return os.path.join( 158 | self.allen_morphology_cache, "{}.swc".format(neuron_id) # type: ignore[attr-defined] 159 | ) 160 | 161 | def download_neurons(self, ids, load_neurons=True, **kwargs): 162 | """ 163 | Download neurons and return neuron reconstructions (instances 164 | of Neuron class) 165 | 166 | :param ids: list of integers with neurons IDs 167 | """ 168 | if isinstance(ids, np.ndarray): 169 | ids = ids.tolist() 170 | if not isinstance(ids, (list)): 171 | ids = [ids] 172 | 173 | neurons = [] 174 | for neuron_id in ids: 175 | neuron_file = self.build_filepath(neuron_id) 176 | load_current_neuron = load_neurons 177 | logger.debug( 178 | "Downloading neuron '%s' to %s", neuron_id, neuron_file 179 | ) 180 | 181 | # Download file 182 | try: 183 | self.get_reconstruction(neuron_id, file_name=neuron_file) 184 | except Exception as exc: 185 | logger.error( 186 | "Could not fetch the neuron %s " 187 | "for the following reason: %s", 188 | neuron_id, 189 | str(exc), 190 | ) 191 | load_current_neuron = False 192 | 193 | # Reconstruct neuron 194 | neurons.append( 195 | Neuron( 196 | neuron_file, 197 | neuron_name=str(neuron_id), 198 | load_file=load_current_neuron, 199 | **kwargs, 200 | ) 201 | ) 202 | 203 | return neurons 204 | 205 | def get_reconstruction(self, neuron_id: int, file_name: str): 206 | """ 207 | Download a neuron's reconstruction from the Allen database. 208 | 209 | :param neuron_id: int, neuron ID 210 | :param file_name: str, path to save the neuron's reconstruction to 211 | """ 212 | query_for_file_path = f"https://api.brain-map.org/api/v2/data/query.json?criteria=model::NeuronReconstruction,rma::criteria,[specimen_id$eq{neuron_id}],rma::include,well_known_files" 213 | 214 | r = requests.get(query_for_file_path) 215 | file_paths = r.json()["msg"][0]["well_known_files"] 216 | file_path = None 217 | for file in file_paths: 218 | # There are 3 types of files for each reconstructed neuron: 219 | # .png, .swc and marker_m.swc files. We want the plain .swc file 220 | if ".png" not in file["path"] and "marker" not in file["path"]: 221 | file_path = file["download_link"] 222 | break 223 | 224 | # Check to make sure a path to a reconstruction swc file was found 225 | if not file_path: 226 | raise ValueError( 227 | f"Could not find a reconstruction file for neuron {neuron_id}" 228 | ) 229 | 230 | query_file = f"https://api.brain-map.org{file_path}" 231 | r = requests.get(query_file) 232 | with open(file_name, "wb") as f: 233 | f.write(r.content) 234 | -------------------------------------------------------------------------------- /morphapi/api/mouselight.py: -------------------------------------------------------------------------------- 1 | """ 2 | Collections of functions to query https://ml-neuronbrowser.janelia.org/ 3 | and get data about either the status of the API, the brain regions or the 4 | neurons available. 5 | Queries are sent by sending POST requests to 6 | https://ml-neuronbrowser.janelia.org/graphql with a string query. 7 | """ 8 | 9 | import logging 10 | from collections import namedtuple 11 | 12 | import pandas as pd 13 | from brainglobe_atlasapi import BrainGlobeAtlas 14 | from retry import retry 15 | 16 | from morphapi.api.neuromorphorg import NeuroMorpOrgAPI 17 | from morphapi.morphology.morphology import Neuron 18 | from morphapi.paths_manager import Paths 19 | from morphapi.utils.data_io import flatten_list, is_any_item_in_list 20 | from morphapi.utils.webqueries import mouselight_base_url, post_mouselight 21 | 22 | logger = logging.getLogger(__name__) 23 | 24 | 25 | # -------------------------------------------------------------------------- # 26 | # QUERY UTILS # 27 | # -------------------------------------------------------------------------- # 28 | 29 | 30 | def mouselight_api_info(): 31 | """ 32 | Get the number of cells available in the database 33 | """ 34 | # Get info from the ML API 35 | url = mouselight_base_url + "graphql" 36 | 37 | query = """ 38 | query { 39 | queryData { 40 | totalCount 41 | } 42 | } 43 | """ 44 | res = post_mouselight(url, query=query) 45 | logger.info( 46 | "%s neurons on MouseLight database. ", res["queryData"]["totalCount"] 47 | ) 48 | 49 | 50 | def mouselight_get_brainregions(): 51 | """ 52 | Get metadata about the brain regions as they are known by 53 | Janelia's Mouse Light. 54 | IDs and Names sometimes differ from Allen's CCF. 55 | """ 56 | 57 | # Download metadata about brain regions from the ML API 58 | url = mouselight_base_url + "graphql" 59 | # query = "systemSettings {apiVersion apiRelease neuronCount\}}" 60 | query = """ 61 | query { 62 | brainAreas{ 63 | 64 | acronym 65 | name 66 | id 67 | atlasId 68 | graphOrder 69 | parentStructureId 70 | structureIdPath 71 | } 72 | } 73 | """ 74 | res = post_mouselight(url, query=query)["brainAreas"] 75 | 76 | # Clean up and turn into a dataframe 77 | keys = {k: [] for k in res[0].keys()} 78 | for r in res: 79 | for k in r.keys(): 80 | keys[k].append(r[k]) 81 | 82 | structures_data = pd.DataFrame.from_dict(keys) 83 | return structures_data 84 | 85 | 86 | def mouselight_structures_identifiers(): 87 | """ 88 | When the data are downloaded as SWC, each node has a structure 89 | identifier ID to tell if it's soma, axon or dendrite. 90 | This function returns the ID number --> structure table. 91 | """ 92 | 93 | # Download the identifiers used in ML neurons tracers 94 | url = mouselight_base_url + "graphql" 95 | # query = "systemSettings {apiVersion apiRelease neuronCount\}}" 96 | query = """ 97 | query { 98 | structureIdentifiers{ 99 | id 100 | name 101 | value 102 | } 103 | } 104 | """ 105 | res = post_mouselight(url, query=query)["structureIdentifiers"] 106 | 107 | keys = {k: [] for k in res[0].keys()} 108 | for r in res: 109 | for k in r.keys(): 110 | keys[k].append(r[k]) 111 | 112 | structures_identifiers = pd.DataFrame.from_dict(keys) 113 | return structures_identifiers 114 | 115 | 116 | def make_query(filterby=None, filter_regions=None, invert=False): 117 | """ 118 | Constructs the strings used to submit graphql queries to the mouse 119 | light api 120 | 121 | :param filterby: str, soma, axon on dendrite. Search by neurite 122 | structure (Default value = None) 123 | :param filter_regions: list, tuple. list of strings. Acronyms of brain 124 | regions to use for query (Default value = None) 125 | :param invert: If true the inverse of the query is return (i.e., the 126 | neurons NOT in a brain region) (Default value = False) 127 | 128 | """ 129 | searchneurons = """ 130 | queryTime 131 | totalCount 132 | 133 | neurons{ 134 | tag 135 | id 136 | idNumber 137 | idString 138 | 139 | brainArea{ 140 | id 141 | acronym 142 | name 143 | safeName 144 | atlasId 145 | aliasList 146 | structureIdPath 147 | } 148 | 149 | tracings{ 150 | soma{ 151 | x 152 | y 153 | z 154 | radius 155 | brainAreaIdCcfV30 156 | sampleNumber 157 | parentNumber 158 | 159 | } 160 | 161 | id 162 | tracingStructure{ 163 | name 164 | value 165 | id 166 | } 167 | } 168 | } 169 | """ 170 | 171 | if filterby is None or filterby == "soma": 172 | query = """ 173 | query {{ 174 | searchNeurons {{ 175 | {} 176 | }} 177 | }} 178 | """.format( 179 | searchneurons 180 | ) 181 | else: 182 | raise NotImplementedError("This feature is not available yet") 183 | # Get predicate type 184 | if filterby.lower() in ["axon", "axons", "end point", "branch point"]: 185 | predicateType = 1 186 | 187 | elif filterby.lower() in [ 188 | "dendrite", 189 | "apical dendrite", 190 | "(basal) dendrite", 191 | ]: 192 | raise NotImplementedError 193 | filterby = "(basal) dendrite" 194 | predicateType = 2 195 | else: 196 | raise ValueError("invalid search by argument") 197 | 198 | # Get neuron structure id 199 | structures_identifiers = mouselight_structures_identifiers() 200 | structureid = str( 201 | structures_identifiers.loc[ 202 | structures_identifiers.name == filterby 203 | ]["id"].values[0] 204 | ) 205 | 206 | # Get brain regions ids 207 | brainregions = mouselight_get_brainregions() 208 | brainareaids = [ 209 | str(brainregions.loc[brainregions.acronym == a]["id"].values[0]) 210 | for a in filter_regions 211 | ] 212 | 213 | # Get inversion 214 | if invert: 215 | invert = "true" 216 | else: 217 | invert = "false" 218 | 219 | query = """ 220 | query {{ 221 | searchNeurons ( 222 | context: {{ 223 | scope: 6 224 | predicates: [{{ 225 | predicateType: {predicate} 226 | tracingIdsOrDOIs: [] 227 | tracingIdsOrDOIsExactMatch: false 228 | tracingStructureIds: [] 229 | amount: 0 230 | nodeStructureIds: ['{structure}'] 231 | brainAreaIds: {brainarea} 232 | invert: {invert} 233 | composition: 1 234 | }}] 235 | }} 236 | ) {{ 237 | {base} 238 | }} 239 | }} 240 | """.format( 241 | predicate=predicateType, 242 | structure=str(structureid), 243 | brainarea=brainareaids, 244 | invert=invert, 245 | base=searchneurons, 246 | ) 247 | 248 | query = query.replace("\\t", "").replace("'", '"') 249 | return query 250 | 251 | 252 | @retry(tries=3, delay=1) 253 | def fetch_atlas(atlas_name="allen_mouse_25um"): 254 | """Fetch a given atlas. 255 | 256 | See here for available atlases: 257 | https://docs.brainglobe.info/brainglobe-atlasapi/introduction#atlases-available 258 | """ 259 | return BrainGlobeAtlas(atlas_name) 260 | 261 | 262 | # -------------------------------------------------------------------------- # 263 | # MAIN CLASS # 264 | # -------------------------------------------------------------------------- # 265 | 266 | 267 | class MouseLightAPI(Paths): 268 | def __init__(self, base_dir=None, **kwargs): 269 | """ 270 | Handles the download of neurons morphology data from the 271 | Mouse Light project 272 | 273 | :param base_dir: path to directory to use for saving data 274 | (default value None) 275 | :param kwargs: can be used to pass path to individual 276 | data folders. See morphapi/utils /paths_manager.py 277 | """ 278 | Paths.__init__(self, base_dir=base_dir, **kwargs) 279 | 280 | def fetch_neurons_metadata( 281 | self, filterby=None, filter_regions=None, **kwargs 282 | ): 283 | """ 284 | Download neurons metadata and data from the API. The 285 | downloaded metadata can be filtered to keep only 286 | the neurons whose soma is in a list of user-selected brain regions. 287 | 288 | :param filterby: Accepted values: "soma". If it's "soma", 289 | neurons are kept only when their soma is in the 290 | list of brain regions defined by filter_regions (Default 291 | value = None) 292 | :param filter_regions: List of brain regions acronyms. 293 | If filtering neurons, these specify the filter 294 | criteria. (Default value = None) 295 | :param **kwargs: 296 | 297 | """ 298 | # Download all metadata 299 | logger.debug("Querying MouseLight API...") 300 | url = mouselight_base_url + "graphql" 301 | query = make_query( 302 | filterby=filterby, filter_regions=filter_regions, **kwargs 303 | ) 304 | 305 | res = post_mouselight(url, query=query)["searchNeurons"] 306 | logger.info( 307 | "Fetched metadata for %s neurons in %ss", 308 | res["totalCount"], 309 | round(res["queryTime"] / 1000, 2), 310 | ) 311 | 312 | # Process neurons to clean up the results and make them 313 | # easier to handle 314 | neurons = res["neurons"] 315 | node = namedtuple("node", "x y z r area_acronym sample_n parent_n") 316 | tracing_structure = namedtuple( 317 | "tracing_structure", "id name value named_id" 318 | ) 319 | 320 | cleaned_neurons = [] # <- output is stored here 321 | for neuron in neurons: 322 | if neuron["brainArea"] is not None: 323 | brainArea_acronym = neuron["brainArea"]["acronym"] 324 | brainArea_id = neuron["brainArea"]["id"] 325 | brainArea_name = neuron["brainArea"]["name"] 326 | brainArea_safename = neuron["brainArea"]["safeName"] 327 | brainArea_atlasId = neuron["brainArea"]["atlasId"] 328 | brainArea_structureIdPath = neuron["brainArea"][ 329 | "structureIdPath" 330 | ] 331 | else: 332 | brainArea_acronym = None 333 | brainArea_id = None 334 | brainArea_name = None 335 | brainArea_safename = None 336 | brainArea_atlasId = None 337 | brainArea_structureIdPath = None 338 | 339 | if len(neuron["tracings"]) > 1: 340 | dendrite = tracing_structure( 341 | neuron["tracings"][1]["id"], 342 | neuron["tracings"][1]["tracingStructure"]["name"], 343 | neuron["tracings"][1]["tracingStructure"]["value"], 344 | neuron["tracings"][1]["tracingStructure"]["id"], 345 | ) 346 | else: 347 | dendrite = None 348 | 349 | clean_neuron = dict( 350 | brainArea_acronym=brainArea_acronym, 351 | brainArea_id=brainArea_id, 352 | brainArea_name=brainArea_name, 353 | brainArea_safename=brainArea_safename, 354 | brainArea_atlasId=brainArea_atlasId, 355 | brainArea_structureIdPath=brainArea_structureIdPath, 356 | id=neuron["id"], 357 | idNumber=neuron["idNumber"], 358 | idString=neuron["idString"], 359 | tag=neuron["tag"], 360 | soma=node( 361 | neuron["tracings"][0]["soma"]["x"], 362 | neuron["tracings"][0]["soma"]["y"], 363 | neuron["tracings"][0]["soma"]["z"], 364 | neuron["tracings"][0]["soma"]["radius"], 365 | brainArea_name, 366 | neuron["tracings"][0]["soma"]["sampleNumber"], 367 | neuron["tracings"][0]["soma"]["parentNumber"], 368 | ), 369 | axon=tracing_structure( 370 | neuron["tracings"][0]["id"], 371 | neuron["tracings"][0]["tracingStructure"]["name"], 372 | neuron["tracings"][0]["tracingStructure"]["value"], 373 | neuron["tracings"][0]["tracingStructure"]["id"], 374 | ), 375 | dendrite=dendrite, 376 | ) 377 | cleaned_neurons.append(clean_neuron) 378 | 379 | if filter_regions is not None: 380 | cleaned_neurons = self.filter_neurons_metadata( 381 | cleaned_neurons, 382 | filterby=filterby, 383 | filter_regions=filter_regions, 384 | ) 385 | 386 | return cleaned_neurons 387 | 388 | @staticmethod 389 | def fetch_default_atlas(): 390 | """Fetch the allen mouse 25nm atlas.""" 391 | return fetch_atlas("allen_mouse_25um") 392 | 393 | def filter_neurons_metadata( 394 | self, 395 | neurons_metadata, 396 | filterby="soma", 397 | filter_regions=None, 398 | atlas=None, 399 | ): 400 | """ 401 | Filter metadata to keep only the neurons whose soma is 402 | in a given list of brain regions. 403 | 404 | :param filterby: Accepted values: "soma". If it's "soma", 405 | neurons are kept only when their 406 | soma is in the list of brain regions defined by 407 | filter_regions (Defaultvalue = None) 408 | :param filter_regions: List of brain regions acronyms. 409 | If filtering neurons, these specify 410 | the filter criteria. (Default value = None) 411 | :param atlas: A `brainglobe_atlasapi.BrainGlobeAtlas` object. 412 | If not provided, load the default atlas. 413 | """ 414 | 415 | # Filter neurons to keep only those matching the search criteria 416 | if filterby is None: 417 | logger.info( 418 | "Returning all neurons because 'filterby' is set to None", 419 | ) 420 | return neurons_metadata 421 | 422 | if filter_regions is None: 423 | raise ValueError( 424 | "If filtering neuron by region, you need " 425 | "to pass a list of filter regions to use" 426 | ) 427 | 428 | # get brain globe atlas 429 | if atlas is None: 430 | atlas = self.fetch_default_atlas() 431 | 432 | # Filter by soma 433 | if filterby == "soma": 434 | filtered_neurons_metadata = [] 435 | for neuron in neurons_metadata: 436 | if neuron["brainArea_acronym"] is None: 437 | continue 438 | 439 | # get ancestors of neuron's regions 440 | try: 441 | neuron_region_ancestors = atlas.get_structure_ancestors( 442 | neuron["brainArea_acronym"] 443 | ) 444 | neuron_region_ancestors.append(neuron["brainArea_acronym"]) 445 | except KeyError: 446 | # ignore if region is not found 447 | continue 448 | 449 | # If any of the ancestors or itself are in the allowed 450 | # regions, keep neuron. 451 | if is_any_item_in_list( 452 | filter_regions, neuron_region_ancestors 453 | ): 454 | filtered_neurons_metadata.append(neuron) 455 | 456 | neurons = filtered_neurons_metadata 457 | else: 458 | neurons = neurons_metadata 459 | 460 | logger.info( 461 | "Selected %s neurons out of %s", 462 | len(neurons), 463 | len(neurons_metadata), 464 | ) 465 | 466 | return neurons 467 | 468 | def download_neurons(self, neurons_metadata, load_neurons=True, **kwargs): 469 | """ 470 | Given a list of neurons metadata from self.fetch_neurons_metadata 471 | this funcition downloads the morphological data. 472 | The data are actually downloaded from neuromorpho.org 473 | 474 | :param neurons_metadata: list with metadata for neurons to download 475 | :returns: list of Neuron instances 476 | 477 | """ 478 | if not isinstance(neurons_metadata, (list, tuple)): 479 | neurons_metadata = [neurons_metadata] 480 | 481 | nmapi = NeuroMorpOrgAPI() 482 | nmapi._version = "Source-Version" 483 | nmapi.neuromorphorg_cache = self.mouselight_cache 484 | 485 | neurons = [] 486 | 487 | for neuron in neurons_metadata: 488 | try: 489 | nrn = nmapi.get_neuron_by_name(neuron["idString"]) 490 | except ValueError as exc: 491 | logger.error( 492 | "Could not fetch the neuron %s for the " 493 | "following reason: %s", 494 | neuron["idString"], 495 | str(exc), 496 | ) 497 | neurons.append( 498 | Neuron( 499 | nmapi.build_filepath(neuron["idString"]), 500 | neuron_name="mouselight_" + str(neuron["idString"]), 501 | invert_dims=True, 502 | load_file=False, 503 | ) 504 | ) 505 | continue 506 | 507 | downloaded = nmapi.download_neurons( 508 | nrn, 509 | _name="mouselight_", 510 | invert_dims=True, 511 | load_neurons=load_neurons, 512 | ) 513 | 514 | neurons.append(downloaded) 515 | 516 | return flatten_list(neurons) 517 | -------------------------------------------------------------------------------- /morphapi/api/mpin_celldb.py: -------------------------------------------------------------------------------- 1 | import shutil 2 | import zipfile 3 | from pathlib import Path 4 | 5 | import pandas as pd 6 | from brainglobe_atlasapi import BrainGlobeAtlas 7 | from brainglobe_atlasapi.utils import retrieve_over_http 8 | from brainglobe_space import SpaceConvention 9 | from rich.progress import track 10 | 11 | from morphapi.morphology.morphology import Neuron 12 | from morphapi.paths_manager import Paths 13 | from morphapi.utils.data_io import connected_to_internet 14 | 15 | 16 | def soma_coords_from_file(file_path): 17 | """Compile dictionary with traced cells origins.""" 18 | # Read first line after comment for soma ID: 19 | line_start = "#" 20 | with open(file_path, "r") as file: 21 | while line_start == "#": 22 | line = file.readline() 23 | line_start = line[0] 24 | 25 | return [float(p) for p in line.split(" ")[2:-2]] 26 | 27 | 28 | def fix_mpin_swgfile(file_path, fixed_file_path=None): 29 | """Fix neurons downloaded from the MPIN website by correcting node 30 | id and changing the orientation to be standard BrainGlobe. 31 | """ 32 | if fixed_file_path is None: 33 | fixed_file_path = file_path 34 | 35 | # Fixed descriptors of the dataset space: 36 | ORIGIN = "rai" 37 | SHAPE = [597, 974, 359] 38 | TARGET_SPACE = "asl" 39 | NEW_SOMA_SIZE = 7 40 | 41 | bgspace = SpaceConvention(origin=ORIGIN, shape=SHAPE) 42 | 43 | df = pd.read_csv(file_path, sep=" ", header=None, comment="#") 44 | 45 | # In this dataset, soma node is always the first, and 46 | # other nodes have unspecified identity which we'll set to axon. 47 | # Hopefully it will be fixed in next iterations of the database. 48 | df.iloc[0, 1] = 1 49 | df.iloc[1:, 1] = 2 50 | 51 | # Map points to BrainGlobe orientation: 52 | df.iloc[:, 2:-2] = bgspace.map_points_to( 53 | TARGET_SPACE, df.iloc[:, 2:-2].values 54 | ) 55 | df.iloc[0, -2] = NEW_SOMA_SIZE 56 | df.to_csv(fixed_file_path, sep=" ", header=None, index=False) 57 | 58 | 59 | class MpinMorphologyAPI(Paths): 60 | """Handles the download of neuronal morphology 61 | data from the MPIN database.""" 62 | 63 | def __init__(self, *args, **kwargs): 64 | Paths.__init__(self, *args, **kwargs) 65 | 66 | self.data_path = Path(self.mpin_morphology) / "fixed" 67 | 68 | if not self.data_path.exists(): 69 | self.download_dataset() 70 | 71 | self._neurons_df = None 72 | 73 | @property 74 | def neurons_df(self): 75 | """Table with all neurons positions and soma regions.""" 76 | if self._neurons_df is None: 77 | # Generate table with soma position to query by region: 78 | atlas = BrainGlobeAtlas("mpin_zfish_1um", print_authors=False) 79 | 80 | neurons_dict = dict() 81 | for f in self.data_path.glob("*.swc"): 82 | coords = soma_coords_from_file(f) # compute coordinates 83 | 84 | # Calculate anatomical structure the neuron belongs to: 85 | try: 86 | region = atlas.structure_from_coords(coords) 87 | except IndexError: 88 | region = 0 89 | 90 | neurons_dict[f.stem] = dict( 91 | filename=f.name, 92 | pos_ap=coords[0], 93 | pos_si=coords[1], 94 | pos_lr=coords[2], 95 | region=region, 96 | ) 97 | 98 | self._neurons_df = pd.DataFrame(neurons_dict).T 99 | 100 | return self._neurons_df 101 | 102 | def get_neurons_by_structure(self, *region): 103 | atlas = BrainGlobeAtlas("mpin_zfish_1um", print_authors=False) 104 | IDs = atlas._get_from_structure(region, "id") 105 | return list( 106 | self.neurons_df.loc[self.neurons_df.region.isin(IDs)].index 107 | ) 108 | 109 | def load_neurons(self, neuron_id, **kwargs): 110 | """ 111 | Load individual neurons given their IDs 112 | """ 113 | if not isinstance(neuron_id, list): 114 | neuron_id = [neuron_id] 115 | 116 | to_return = [] 117 | for nid in neuron_id: 118 | filepath = str( 119 | Path(self.mpin_morphology) 120 | / "fixed" 121 | / self.neurons_df.loc[nid].filename 122 | ) 123 | to_return.append( 124 | Neuron( 125 | filepath, 126 | neuron_name="mpin_" + str(nid), 127 | **kwargs, 128 | ) 129 | ) 130 | 131 | return to_return 132 | 133 | def download_dataset(self): 134 | """Dowload dataset from Kunst et al 2019.""" 135 | if not connected_to_internet(): 136 | raise ValueError( 137 | "An internet connection is required to download the dataset" 138 | ) 139 | SOURCE_DATA_DIR = "MPIN-Atlas__Kunst_et_al__neurons_all" 140 | 141 | REMOTE_URL = ( 142 | "https://fishatlas.neuro.mpg.de/neurons/download/" 143 | "download_all_neurons_aligned" 144 | ) 145 | 146 | # # Download folder with all data: 147 | download_zip_path = Path(self.mpin_morphology) / "data.zip" 148 | retrieve_over_http(REMOTE_URL, download_zip_path) 149 | 150 | # Uncompress and delete compressed: 151 | with zipfile.ZipFile(download_zip_path, "r") as zip_ref: 152 | zip_ref.extractall(download_zip_path.parent) 153 | download_zip_path.unlink() 154 | 155 | # Fix extracted files: 156 | extracted_data_path = ( 157 | Path(self.mpin_morphology) / SOURCE_DATA_DIR / "Original" 158 | ) 159 | self.data_path.mkdir(exist_ok=True) 160 | 161 | for f in track( 162 | list(extracted_data_path.glob("*.swc")), 163 | description="Fixing swc files", 164 | ): 165 | fix_mpin_swgfile(f, self.data_path / f.name) 166 | 167 | shutil.rmtree(extracted_data_path.parent) 168 | -------------------------------------------------------------------------------- /morphapi/api/neuromorphorg.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | 4 | import requests 5 | 6 | from morphapi.morphology.morphology import Neuron 7 | from morphapi.paths_manager import Paths 8 | from morphapi.utils.webqueries import connected_to_internet, request 9 | 10 | logger = logging.getLogger(__name__) 11 | 12 | 13 | class NeuroMorpOrgAPI(Paths): 14 | # Use the URL as advised in the API docs: 15 | # https://neuromorpho.org/apiReference.html#introduction 16 | _base_url = "http://cng.gmu.edu:8080/api/neuron" 17 | 18 | _version = "CNG version" # which swc version, standardized or original 19 | 20 | def __init__(self, *args, **kwargs): 21 | if not connected_to_internet(): 22 | raise ConnectionError( 23 | "You will need to be connected to the internet to " 24 | "use the NeuroMorpOrgAPI class to download neurons" 25 | ) 26 | 27 | Paths.__init__(self, *args, **kwargs) 28 | 29 | # Check that neuromorpho.org is not down 30 | try: 31 | health_url = "/".join(self._base_url.split("/")[:-1]) + "/health" 32 | request(health_url, verify=False) 33 | except (requests.exceptions.RequestException, ValueError): 34 | try: 35 | self._base_url = "http://neuromorpho.org/api/neuron" 36 | health_url = ( 37 | "/".join(self._base_url.split("/")[:-1]) + "/health" 38 | ) 39 | request(health_url, verify=False) 40 | except ( 41 | requests.exceptions.RequestException, 42 | ValueError, 43 | ) as e: 44 | raise ConnectionError( 45 | f"It seems that neuromorpho API is down: {e}" 46 | ) 47 | 48 | self._fields = None 49 | 50 | @property 51 | def fields(self): 52 | """ 53 | Fields contains the types of fields that can be used to 54 | restrict queries 55 | """ 56 | if self._fields is None: 57 | self._fields = request( 58 | self._base_url + "/fields", verify=False 59 | ).json()["Neuron Fields"] 60 | return self._fields 61 | 62 | def get_fields_values(self, field): 63 | """ 64 | Returns the list of allowed values for a given query field 65 | """ 66 | current_page = 0 67 | max_page = 1 68 | values = [] 69 | while current_page < max_page: 70 | req = request( 71 | self._base_url 72 | + f"/fields/{field}?&size=1000&page={current_page}", 73 | verify=False, 74 | ).json() 75 | values.extend(req["fields"]) 76 | max_page = req.get("page", {}).get("totalPages", max_page) 77 | current_page += 1 78 | return values 79 | 80 | def get_neurons_metadata(self, size=100, page=0, **criteria): 81 | """ 82 | Uses the neuromorpho API to download metadata about neurons. 83 | Criteria can be used to restrict the search to neurons of interest/ 84 | https://neuromorpho.org/apiReference.html 85 | 86 | Neuromorpho.org paginates it's requests so not all neurons metadata 87 | can be returned at once 88 | 89 | :param size: int in range [0, 500]. Number of neurons whose 90 | metadata can be returned at the same time 91 | :param page: int > 0. Page number. The number of pages depends 92 | on size and on how many neurons match the criteria 93 | :param criteria: use keywords to restrict the query to neurons 94 | that match given criteria. 95 | keywords should be pass as "field=value". 96 | Then only neuron's whose 'field' 97 | attribute has value 'value' will be returned. 98 | """ 99 | 100 | if size < 0 or size > 500: 101 | raise ValueError( 102 | f"Invalid size argument: {size}. Size should be an " 103 | f"integer between 0 and 500" 104 | ) 105 | if page < 0: 106 | raise ValueError( 107 | f"Invalid page argument: {page}. Page should be an " 108 | f"integer >= 0" 109 | ) 110 | 111 | url = self._base_url + "/select?q=" 112 | 113 | for num, (crit, val) in enumerate(criteria.items()): 114 | if isinstance(val, list): 115 | raise NotImplementedError("Need to join the list") 116 | 117 | if num > 0: 118 | url += "&fq=" 119 | url += f"{crit}:{val}" 120 | 121 | url += f"&size={int(size)}&page={int(page)}" 122 | 123 | try: 124 | req = request(url, verify=False) 125 | neurons = req.json() 126 | valid_url = req.ok and "error" not in neurons 127 | except ValueError: 128 | valid_url = False 129 | 130 | if not valid_url: 131 | # Check each criteria 132 | for crit, val in criteria.items(): 133 | if crit not in self.fields: 134 | raise ValueError( 135 | f"Query criteria {crit} not in " 136 | f"available fields: {self.fields}" 137 | ) 138 | field_values = self.get_fields_values(crit) 139 | if val not in field_values: 140 | raise ValueError( 141 | f"Query criteria value {val} for " 142 | f"field {crit} not valid." 143 | + f"Valid values include: {field_values}" 144 | ) 145 | 146 | # If all criteria look valid, then raise a generic error 147 | raise ValueError(f"Invalid query with url: {url}") 148 | 149 | page = neurons["page"] 150 | neurons = neurons["_embedded"]["neuronResources"] 151 | 152 | logger.info( 153 | f"Found metadata for {page['totalElements']} neurons " 154 | f"[{page['totalPages']} pages in total]. " 155 | f"Returning metadata about {len(neurons)} neurons " 156 | f"from page {page['number']}" 157 | ) 158 | 159 | return neurons, page 160 | 161 | def get_neuron_by_id(self, nid): 162 | """ 163 | Get a neuron's metadata given it's id number 164 | """ 165 | return request(self._base_url + f"/id/{nid}", verify=False).json() 166 | 167 | def get_neuron_by_name(self, nname): 168 | """ 169 | Get a neuron's metadata given it's name 170 | """ 171 | return request(self._base_url + f"/name/{nname}", verify=False).json() 172 | 173 | def build_filepath(self, neuron_id): 174 | """ 175 | Build a filepath from a neuron ID. 176 | """ 177 | return os.path.join(self.neuromorphorg_cache, f"{neuron_id}.swc") 178 | 179 | def download_neurons( 180 | self, 181 | neurons, 182 | _name=None, 183 | load_neurons=True, 184 | use_neuron_names=False, 185 | **kwargs, 186 | ): 187 | """ 188 | Downloads neuronal morphological data and saves it to .swc files. 189 | It then returns a list of Neuron instances with 190 | morphological data for each neuron. 191 | 192 | :param neurons: list of neurons metadata (as 193 | returned by one of the functions used to fetch metadata) 194 | :param _name: used internally to save cached neurons 195 | with a different prefix when the 196 | class is used to download neurons for other APIs 197 | :param load_neurons: if set to True, the neurons are loaded into a 198 | `morphapi.morphology.morphology.Neuron` object and returned 199 | :param use_neuron_names: if set to True, the filenames 200 | use the names of the neurons instead 201 | of their IDs 202 | """ 203 | if not isinstance(neurons, (list, tuple)): 204 | neurons = [neurons] 205 | 206 | to_return = [] 207 | for neuron in neurons: 208 | if not isinstance(neuron, dict): 209 | raise ValueError() 210 | 211 | try: 212 | neuron["status"] == 500 # download went wrong 213 | continue 214 | except KeyError: 215 | pass 216 | 217 | if use_neuron_names: 218 | filepath = self.build_filepath( 219 | neuron.get("neuron_name", neuron["neuron_id"]) 220 | ) 221 | else: 222 | filepath = self.build_filepath(neuron["neuron_id"]) 223 | load_current_neuron = load_neurons 224 | 225 | if not os.path.isfile(filepath): 226 | # Download and write to file 227 | if self._version == "CNG version": 228 | url = ( 229 | f"https://neuromorpho.org/dableFiles/{neuron['archive'].lower()}/" 230 | f"CNG version/{neuron['neuron_name']}.CNG.swc" 231 | ) 232 | else: 233 | url = ( 234 | f"https://neuromorpho.org/dableFiles/{neuron['archive'].lower()}/" 235 | f"{self._version}/{neuron['neuron_name']}.swc" 236 | ) 237 | 238 | try: 239 | req = request(url, verify=False) 240 | with open(filepath, "w") as f: 241 | f.write(req.content.decode("utf-8")) 242 | except ValueError as exc: 243 | logger.error( 244 | "Could not fetch the neuron %s for the " 245 | "following reason: %s", 246 | neuron["neuron_name"], 247 | str(exc), 248 | ) 249 | load_current_neuron = False 250 | 251 | if _name is None: 252 | _name = "neuromorpho_" 253 | 254 | to_return.append( 255 | Neuron( 256 | filepath, 257 | neuron_name=_name + str(neuron["neuron_id"]), 258 | load_file=load_current_neuron, 259 | **kwargs, 260 | ) 261 | ) 262 | 263 | return to_return 264 | -------------------------------------------------------------------------------- /morphapi/morphology/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainglobe/morphapi/2f21781d57ee764fa6d82f477ffaceb90b2c7141/morphapi/morphology/__init__.py -------------------------------------------------------------------------------- /morphapi/morphology/cache.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from vedo import Mesh, load, merge, write 4 | 5 | from morphapi.paths_manager import Paths 6 | from morphapi.utils.data_io import load_yaml, save_yaml 7 | 8 | 9 | class NeuronCache(Paths): 10 | cache_filenames_parts = [ 11 | "_soma", 12 | "_axon", 13 | "_apical_dendrites", 14 | "_basal_dendrites", 15 | "whole_neuron", 16 | ] 17 | 18 | def __init__(self, **kwargs): 19 | """ 20 | Initialise API interaction and fetch metadata of neurons 21 | in the Allen Database. 22 | """ 23 | super().__init__(**kwargs) # path to data caches 24 | 25 | def get_cache_filenames(self, neuron_name): 26 | fld = os.path.join(self.meshes_cache, str(neuron_name)) 27 | if not os.path.isdir(fld): 28 | os.mkdir(fld) 29 | return [ 30 | os.path.join(fld, str(neuron_name) + part + ".obj") 31 | for part in self.cache_filenames_parts 32 | ] 33 | 34 | def get_cache_params_filename(self, neuron_name): 35 | fld = os.path.join(self.meshes_cache, str(neuron_name)) 36 | if not os.path.isdir(fld): 37 | os.mkdir(fld) 38 | 39 | return os.path.join(fld, str(neuron_name) + "_params.yml") 40 | 41 | def _check_neuron_mesh_cached(self, neuron_name): 42 | # If any of the files doesn't exist, the neuron wasn't cached 43 | for fn in self.get_cache_filenames(neuron_name): 44 | if not os.path.isfile(fn): 45 | return False 46 | return True 47 | 48 | def load_cached_neuron(self, neuron_name, _params): 49 | if not self._check_neuron_mesh_cached(neuron_name): 50 | return None 51 | 52 | # Check if params are the same as when cached 53 | cached_params = load_yaml(self.get_cache_params_filename(neuron_name)) 54 | if len(cached_params) != len(_params): 55 | changed = cached_params.values() 56 | else: 57 | changed = {v for k, v in _params.items() if v != cached_params[k]} 58 | if changed: 59 | return None 60 | 61 | # Load neurites 62 | neurites = [ 63 | "soma", 64 | "axon", 65 | "apical_dendrites", 66 | "basal_dendrites", 67 | "whole_neuron", 68 | ] 69 | loaded = { 70 | nn: load(fp) 71 | for nn, fp in zip(neurites, self.get_cache_filenames(neuron_name)) 72 | } 73 | 74 | for nn, act in loaded.items(): 75 | if len(act.vertices) == 0: 76 | loaded[nn] = None 77 | 78 | return loaded 79 | 80 | def write_neuron_to_cache(self, neuron_name, neuron, _params): 81 | # Write params to file 82 | save_yaml(self.get_cache_params_filename(neuron_name), _params) 83 | 84 | # Write neurons to file 85 | file_names = self.get_cache_filenames(neuron_name) 86 | 87 | if isinstance(neuron, Mesh): 88 | write(neuron, [f for f in file_names if f.endswith("soma.obj")][0]) 89 | else: 90 | if not isinstance(neuron, dict): 91 | raise ValueError( 92 | f"Invalid neuron argument passed while caching: {neuron}" 93 | ) 94 | for key, actor in neuron.items(): 95 | if key == "whole_neuron": 96 | fname = [f for f in file_names if f.endswith(f"{key}.obj")] 97 | write(actor, fname[0]) 98 | else: 99 | # Get a single actor for each neuron component. 100 | # If there's no data for the component 101 | # create an empty actor 102 | if not isinstance(actor, Mesh): 103 | if isinstance(actor, (list, tuple)): 104 | if len(actor) == 1: 105 | actor = actor[0] 106 | elif not actor or actor is None: 107 | actor = Mesh() 108 | else: 109 | try: 110 | actor = merge(actor) 111 | except: # noqa: E722 112 | raise ValueError( 113 | f"{key} actor should be a mesh or a " 114 | f"list of 1 mesh not {actor}" 115 | ) 116 | 117 | if actor is None: 118 | actor = Mesh() 119 | 120 | # Save to file 121 | fname = [f for f in file_names if f.endswith(f"{key}.obj")] 122 | if fname: 123 | write(actor, fname[0]) 124 | else: 125 | raise ValueError( 126 | f"No filename found for {key}. " 127 | f"Filenames {file_names}" 128 | ) 129 | -------------------------------------------------------------------------------- /morphapi/morphology/morphology.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from collections import namedtuple 3 | from pathlib import Path 4 | 5 | import neurom as nm 6 | from morphio import Morphology as MorphioMorphology 7 | from morphio import Option 8 | from neurom.core.dataformat import COLS 9 | from vedo import merge 10 | from vedo.colors import color_map 11 | from vedo.shapes import Sphere, Tube 12 | 13 | try: 14 | # For NeuroM >= 3 15 | from neurom.core.morphology import iter_sections 16 | except ImportError: 17 | # For NeuroM < 2 18 | try: 19 | from neurom.core import iter_sections 20 | except ImportError: 21 | # For NeuroM >= 2, < 3 22 | from neurom import iter_sections 23 | 24 | from morphapi.morphology.cache import NeuronCache 25 | 26 | logger = logging.getLogger(__name__) 27 | 28 | component = namedtuple("component", "x y z coords radius component") 29 | 30 | 31 | class Neuron(NeuronCache): 32 | _neurite_types = { 33 | "basal_dendrites": nm.core.types.NeuriteType.basal_dendrite, 34 | "apical_dendrites": nm.core.types.NeuriteType.apical_dendrite, 35 | "axon": nm.core.types.NeuriteType.axon, 36 | } 37 | 38 | _ntypes = nm.core.types.NEURITES 39 | 40 | def __init__( 41 | self, 42 | data_file, 43 | neuron_name=None, 44 | invert_dims=False, 45 | load_file=True, 46 | **kwargs, 47 | ): 48 | super().__init__(**kwargs) # path to data caches 49 | 50 | self.invert_dims = invert_dims 51 | self.neuron_name = neuron_name 52 | 53 | self.data_file = Path(data_file) 54 | self.data_file_type = self.data_file.suffix[1:] 55 | 56 | if self.data_file_type not in ["swc", "json"]: 57 | raise ValueError("Invalid data file type, should be swc or jon") 58 | 59 | if self.neuron_name is None: 60 | self.neuron_name = self.data_file.name 61 | 62 | if load_file: 63 | self.load_from_file() 64 | else: 65 | self.points = None 66 | 67 | def load_from_file(self): 68 | if not self.data_file.exists(): 69 | raise ValueError("The specified path does not exist!") 70 | 71 | if self.data_file_type is None: 72 | return 73 | elif self.data_file_type == "json": 74 | raise NotImplementedError 75 | else: 76 | self.load_from_swc() 77 | 78 | def load_from_swc(self): 79 | if self.neuron_name is None: 80 | self.neuron_name = self.data_file.name 81 | 82 | morphio_input = MorphioMorphology( 83 | str(self.data_file), 84 | options=Option.allow_unifurcated_section_change, 85 | ) 86 | nrn = nm.load_morphology(morphio_input) 87 | self.morphology = nrn 88 | 89 | try: 90 | # Get position and radius of soma 91 | soma_pos = nrn.soma.points[0, :3] 92 | soma_radius = nrn.soma.points[0, -1] 93 | 94 | # Get the rest of the data and store it 95 | self.points = dict( 96 | soma=component( 97 | soma_pos[0], 98 | soma_pos[1], 99 | soma_pos[2], 100 | soma_pos, 101 | soma_radius, 102 | nrn.soma, 103 | ), 104 | ) 105 | except IndexError: 106 | logger.warning( 107 | f"Neuron {self.neuron_name} has no soma, " 108 | "only neurites will be loaded" 109 | ) 110 | self.points = dict(soma=None) 111 | 112 | for ntype, nclass in self._neurite_types.items(): 113 | self.points[ntype] = [ 114 | component( 115 | n.points[:, 0], 116 | n.points[:, 1], 117 | n.points[:, 2], 118 | n.points[:, :3], 119 | n.points[:, -1], 120 | n, 121 | ) 122 | for n in nrn.neurites 123 | if n.type == nclass 124 | ] 125 | 126 | def _parse_mesh_kwargs(self, **kwargs): 127 | # To give the entire neuron the same color 128 | neuron_color = kwargs.pop("neuron_color", None) 129 | 130 | # To give the entire neuron a color based on a cmap 131 | neuron_number = kwargs.pop("neuron_number", None) 132 | cmap_lims = kwargs.pop("cmap_lims", (-1, 1)) 133 | cmap = kwargs.pop("cmap", None) 134 | 135 | # To color each component individually 136 | soma_color = kwargs.pop("soma_color", "salmon") 137 | apical_dendrites_color = kwargs.pop("apical_dendrites_color", "salmon") 138 | basal_dendrites_color = kwargs.pop( 139 | "basal_dendrites_color", apical_dendrites_color 140 | ) 141 | axon_color = kwargs.pop("axon_color", "salmon") 142 | whole_neuron_color = kwargs.pop("whole_neuron_color", None) 143 | 144 | # Get each components color from args 145 | if neuron_color is not None: # uniform color 146 | soma_color = apical_dendrites_color = basal_dendrites_color = ( 147 | axon_color 148 | ) = neuron_color 149 | elif cmap is not None: # color according to cmap 150 | if neuron_number is None: 151 | neuron_number = 0 152 | 153 | soma_color = color_map( 154 | neuron_number, name=cmap, vmin=cmap_lims[0], vmax=cmap_lims[1] 155 | ) 156 | apical_dendrites_color = basal_dendrites_color = axon_color = ( 157 | soma_color 158 | ) 159 | 160 | else: # Use color specified for each component 161 | pass 162 | 163 | if whole_neuron_color is None: 164 | whole_neuron_color = soma_color 165 | return ( 166 | soma_color, 167 | apical_dendrites_color, 168 | basal_dendrites_color, 169 | axon_color, 170 | whole_neuron_color, 171 | kwargs, 172 | ) 173 | 174 | def create_mesh( 175 | self, neurite_radius=2, soma_radius=4, use_cache=True, **kwargs 176 | ): 177 | if self.points is None: 178 | logger.warning( 179 | "No data loaded, you can use the 'load_from_file' " 180 | "method to try to load the file." 181 | ) 182 | return 183 | 184 | # Parse kwargs 185 | ( 186 | soma_color, 187 | apical_dendrites_color, 188 | basal_dendrites_color, 189 | axon_color, 190 | whole_neuron_color, 191 | kwargs, 192 | ) = self._parse_mesh_kwargs(**kwargs) 193 | 194 | if ( 195 | not isinstance(neurite_radius, (int, float)) 196 | or not neurite_radius > 0 197 | ): 198 | raise ValueError( 199 | "Invalid value for parameter neurite_radius, " 200 | "should be a float > 0" 201 | ) 202 | if not isinstance(soma_radius, (int, float)) or not soma_radius > 0: 203 | raise ValueError( 204 | "Invalid value for parameter soma_radius, " 205 | "should be a float > 0" 206 | ) 207 | # prepare params dict for caching 208 | _params = dict(neurite_radius=neurite_radius, soma_radius=soma_radius) 209 | 210 | # Check if cached files already exist 211 | if use_cache: 212 | neurites = self.load_cached_neuron(self.neuron_name, _params) 213 | else: 214 | neurites = None 215 | 216 | # Render 217 | if neurites is not None: 218 | whole_neuron = neurites.pop("whole_neuron") 219 | neurites["soma"].c(soma_color) 220 | else: 221 | # Create soma actor 222 | neurites = {} 223 | if self.points["soma"] is not None: 224 | coords = self.points["soma"].coords 225 | if self.invert_dims: 226 | coords = coords[[2, 1, 0]] 227 | 228 | soma = Sphere( 229 | pos=coords, 230 | r=self.points["soma"].radius * soma_radius, 231 | c=soma_color, 232 | ).compute_normals() 233 | neurites["soma"] = soma.clone().c(soma_color) 234 | 235 | # Create neurites actors 236 | for ntype in self._neurite_types: 237 | actors = [] 238 | for neurite in self.points[ntype]: 239 | for section in iter_sections(neurite.component): 240 | for child in section.children: 241 | if not child.children: 242 | coords = child.points[:, COLS.XYZ] 243 | if self.invert_dims: 244 | coords = coords[:, [2, 1, 0]] 245 | actors.append(Tube(coords, r=neurite_radius)) 246 | else: 247 | for grandchild in child.children: 248 | coords = grandchild.points[:, COLS.XYZ] 249 | if self.invert_dims: 250 | coords = coords[:, [2, 1, 0]] 251 | actors.append( 252 | Tube(coords, r=neurite_radius) 253 | ) 254 | 255 | if actors: 256 | neurites[ntype] = merge( 257 | actors 258 | ).compute_normals() # .smoothMLS2D(f=0.1) 259 | else: 260 | neurites[ntype] = None 261 | 262 | # Merge actors to get the entire neuron 263 | actors = [ 264 | act.clone() for act in neurites.values() if act is not None 265 | ] 266 | whole_neuron = merge(actors).clean().compute_normals() 267 | 268 | # Write to cache 269 | to_write = neurites.copy() 270 | to_write["whole_neuron"] = whole_neuron 271 | self.write_neuron_to_cache(self.neuron_name, to_write, _params) 272 | 273 | # Color actors 274 | colors = [basal_dendrites_color, apical_dendrites_color, axon_color] 275 | for n, key in enumerate( 276 | ["basal_dendrites", "apical_dendrites", "axon"] 277 | ): 278 | if neurites[key] is not None: 279 | neurites[key] = neurites[key].c(colors[n]) 280 | whole_neuron.c(whole_neuron_color) 281 | 282 | return neurites, whole_neuron 283 | -------------------------------------------------------------------------------- /morphapi/paths_manager.py: -------------------------------------------------------------------------------- 1 | """ 2 | Class to create and store paths to a number of folders uesed to save/load data 3 | """ 4 | 5 | from pathlib import Path 6 | 7 | # Default paths for Data Folders (store stuff like object meshes, 8 | # neurons morphology data etc) 9 | default_paths = dict( 10 | # APIs caches 11 | allen_morphology_cache="allen_morphology_cache", 12 | mouselight_cache="mouselight_cache", 13 | neuromorphorg_cache="neuromorphorg_cache", 14 | meshes_cache="meshes_cache", 15 | # Other 16 | mouse_connectivity_cache="mouse_connectivity_cache", 17 | mpin_morphology="mpin_morphology", 18 | ) 19 | 20 | 21 | class Paths: 22 | def __init__(self, base_dir=None, **kwargs): 23 | """ 24 | Parses a YAML file to get data folders paths. Stores paths to a 25 | number of folders used throughtout morphapi. 26 | 27 | :param base_dir: str with path to directory to use to save data. 28 | If none the user's base directiry is used. 29 | :param kwargs: use the name of a folder as key and a path as 30 | argument to specify the path of individual subfolders 31 | """ 32 | # Get and make base directory 33 | 34 | if base_dir is None: 35 | self.base_dir = Path.home() / ".brainglobe" / "morphapi" 36 | else: 37 | self.base_dir = Path(base_dir) 38 | 39 | self.base_dir.mkdir(exist_ok=True, parents=True) 40 | 41 | for fld_name, folder in default_paths.items(): 42 | # Check if user provided a path for this folder, 43 | # otherwise use default 44 | 45 | path = self.base_dir / kwargs.pop(fld_name, folder) 46 | 47 | # Create folder if it doesn't exist: 48 | path.mkdir(parents=True, exist_ok=True) 49 | self.__setattr__(fld_name, str(path)) 50 | -------------------------------------------------------------------------------- /morphapi/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainglobe/morphapi/2f21781d57ee764fa6d82f477ffaceb90b2c7141/morphapi/utils/__init__.py -------------------------------------------------------------------------------- /morphapi/utils/data_io.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import requests 4 | import yaml 5 | 6 | 7 | def listdir(fld): 8 | """ 9 | List the files into a folder with the coplete file path instead of 10 | the relative file path like os.listdir. 11 | 12 | :param fld: string, folder path 13 | 14 | """ 15 | if not os.path.isdir(fld): 16 | raise FileNotFoundError("Could not find directory: {}".format(fld)) 17 | 18 | return [os.path.join(fld, f) for f in os.listdir(fld)] 19 | 20 | 21 | def get_file_name(filepath): 22 | # Returns just the name, no complete path or extension 23 | return os.path.splitext(os.path.basename(filepath))[0] 24 | 25 | 26 | # ------------------------------ Load/Save data ---------------------------- # 27 | 28 | 29 | def save_yaml(filepath, content, append=False, topcomment=None): 30 | """ 31 | Saves content to a yaml file 32 | 33 | :param filepath: path to a file (must include .yaml) 34 | :param content: dictionary of stuff to save 35 | 36 | """ 37 | if not filepath.endswith(".yaml") and not filepath.endswith(".yml"): 38 | raise ValueError( 39 | f"filepath is invalid {filepath}. Should end with yaml or yml" 40 | ) 41 | 42 | if not append: 43 | method = "w" 44 | else: 45 | method = "w+" 46 | 47 | with open(filepath, method) as yaml_file: 48 | if topcomment is not None: 49 | yaml_file.write(topcomment) 50 | yaml.dump(content, yaml_file, default_flow_style=False, indent=4) 51 | 52 | 53 | def load_yaml(filepath): 54 | """ 55 | Load a YAML file 56 | 57 | :param filepath: path to yaml file 58 | 59 | """ 60 | if filepath is None or not os.path.isfile(filepath): 61 | raise ValueError("unrecognized file path: {}".format(filepath)) 62 | if "yml" not in filepath and "yaml" not in filepath: 63 | raise ValueError("unrecognized file path: {}".format(filepath)) 64 | return yaml.load(open(filepath), Loader=yaml.FullLoader) 65 | 66 | 67 | # ------------------------- Internet queries ------------------------- # 68 | def connected_to_internet(url="https://www.google.com/", timeout=5): 69 | """ 70 | Check that there is an internet connection 71 | 72 | :param url: url to use for testing 73 | (Default value = 'https://www.google.com/') 74 | :param timeout: timeout to wait for [in seconds] (Default value = 5) 75 | """ 76 | 77 | try: 78 | _ = requests.get(url, timeout=timeout) 79 | return True 80 | except requests.ConnectionError: 81 | print("No internet connection available.") 82 | return False 83 | 84 | 85 | # ------------------------------------------------------------------------ # 86 | # Data manipulation # 87 | # ------------------------------------------------------------------------ # 88 | def flatten_list(lst): 89 | """ 90 | Flattens a list of lists 91 | 92 | :param lst: list 93 | 94 | """ 95 | flatten = [] 96 | for item in lst: 97 | if isinstance(item, list): 98 | flatten.extend(item) 99 | else: 100 | flatten.append(item) 101 | return flatten 102 | 103 | 104 | def is_any_item_in_list(L1, L2): 105 | """ 106 | Checks if an item in a list is in another list 107 | 108 | :param L1: 109 | :param L2: 110 | 111 | """ 112 | # checks if any item of L1 is also in L2 and returns false otherwise 113 | inboth = [i for i in L1 if i in L2] 114 | if inboth: 115 | return True 116 | else: 117 | return False 118 | -------------------------------------------------------------------------------- /morphapi/utils/webqueries.py: -------------------------------------------------------------------------------- 1 | import ssl 2 | import time 3 | 4 | import requests 5 | from requests.adapters import HTTPAdapter 6 | from urllib3.util.ssl_ import create_urllib3_context 7 | 8 | from morphapi.utils.data_io import connected_to_internet 9 | 10 | mouselight_base_url = "https://ml-neuronbrowser.janelia.org/" 11 | CIPHERS = ":HIGH:!DH:!aNULL" 12 | 13 | 14 | class NoDhAdapter(HTTPAdapter): 15 | """A TransportAdapter that disables DH cipher in Requests.""" 16 | 17 | def init_poolmanager(self, *args, **kwargs): 18 | context = create_urllib3_context( 19 | ciphers=CIPHERS, cert_reqs=ssl.CERT_OPTIONAL 20 | ) 21 | kwargs["ssl_context"] = context 22 | return super(NoDhAdapter, self).init_poolmanager(*args, **kwargs) 23 | 24 | 25 | def request(url, verify=True): 26 | """ 27 | Sends a request to a url 28 | 29 | :param url: 30 | 31 | """ 32 | if not connected_to_internet(): 33 | raise ConnectionError( 34 | "You need to have an internet connection to send requests." 35 | ) 36 | 37 | session = requests.Session() 38 | session.mount("https://", NoDhAdapter()) 39 | response = session.get(url, verify=verify) 40 | 41 | if response.ok: 42 | return response 43 | else: 44 | exception_string = "URL request failed: {}".format(response.reason) 45 | raise ValueError(exception_string + f" ; url: {url}") 46 | 47 | 48 | def query_mouselight(query): 49 | """ 50 | Sends a GET request, not currently used for anything. 51 | 52 | :param query: 53 | 54 | """ 55 | if not connected_to_internet(): 56 | raise ConnectionError( 57 | "You need an internet connection for API queries, sorry." 58 | ) 59 | 60 | full_query = mouselight_base_url + query 61 | 62 | # send the query, package the return argument as a json tree 63 | response = requests.get(full_query) 64 | if response.ok: 65 | json_tree = response.json() 66 | if json_tree["success"]: 67 | return json_tree 68 | else: 69 | exception_string = "did not complete api query successfully" 70 | else: 71 | exception_string = "API failure. Allen says: {}".format( 72 | response.reason 73 | ) 74 | 75 | # raise an exception if the API request failed 76 | raise ValueError(exception_string) 77 | 78 | 79 | def post_mouselight(url, query=None, clean=False, attempts=3): 80 | """ 81 | sends a POST request to a user URL. Query can be either a string 82 | (in which case clean should be False) or a dictionary. 83 | 84 | :param url: 85 | :param query: string or dictionary with query (Default value = None) 86 | :param clean: if not clean, the query is assumed to be in 87 | JSON format (Default value = False) 88 | :param attempts: number of attempts (Default value = 3) 89 | 90 | """ 91 | if not connected_to_internet(): 92 | raise ConnectionError( 93 | "You need an internet connection for API queries, sorry." 94 | ) 95 | 96 | request = None 97 | if query is not None: 98 | for i in range(attempts): 99 | try: 100 | if not clean: 101 | time.sleep(0.01) # avoid getting an error from server 102 | request = requests.post(url, json={"query": query}) 103 | else: 104 | time.sleep(0.01) # avoid getting an error from server 105 | request = requests.post(url, json=query) 106 | except Exception as e: 107 | exception = e 108 | request = None 109 | print( 110 | "MouseLight API query failed. Attempt {} of {}".format( 111 | i + 1, attempts 112 | ) 113 | ) 114 | if request is not None: 115 | break 116 | 117 | if request is None: 118 | raise ConnectionError( 119 | "\n\nMouseLight API query failed with error message:\n{}.\ 120 | \nPerhaps the server is down, visit '{}' " 121 | "to find out.".format(exception, mouselight_base_url) 122 | ) 123 | else: 124 | raise NotImplementedError 125 | 126 | if request.status_code == 200: 127 | jreq = request.json() 128 | if "data" in list(jreq.keys()): 129 | return jreq["data"] 130 | else: 131 | return jreq 132 | else: 133 | raise Exception( 134 | "Query failed to run by returning code " 135 | "of {}. {} -- \n\n{}".format( 136 | request.status_code, query, request.text 137 | ) 138 | ) 139 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "morphapi" 3 | authors = [{ name = "Federico Claudi", email = "hello@brainglobe.info" }] 4 | description = "A lightweight python package to download neuronal morphologies" 5 | readme = "README.md" 6 | requires-python = ">=3.11" 7 | dynamic = ["version"] 8 | 9 | dependencies = [ 10 | "brainglobe-atlasapi >=2.0.1", 11 | "brainglobe-space >=1.0.0", 12 | "imagecodecs", 13 | "neurom>=3", 14 | "numpy", 15 | "morphio>=3.4.0", 16 | "pandas", 17 | "pyyaml>=5.3", 18 | "requests", 19 | "retry", 20 | "rich", 21 | "vedo>=2023.5.0", 22 | "vtk", 23 | ] 24 | 25 | license = { text = "MIT" } 26 | 27 | classifiers = [ 28 | "Development Status :: 2 - Pre-Alpha", 29 | "Programming Language :: Python", 30 | "Programming Language :: Python :: 3", 31 | "Programming Language :: Python :: 3.11", 32 | "Programming Language :: Python :: 3.12", 33 | "Programming Language :: Python :: 3.13", 34 | "Operating System :: OS Independent", 35 | "License :: OSI Approved :: MIT License", 36 | ] 37 | 38 | [project.urls] 39 | "Homepage" = "https://github.com/brainglobe/morphapi" 40 | "Bug Tracker" = "https://github.com/brainglobe/morphapi/issues" 41 | "Documentation" = "https://github.com/brainglobe/morphapi" 42 | "Source Code" = "https://github.com/brainglobe/morphapi" 43 | "User Support" = "https://github.com/brainglobe/morphapi/issues" 44 | 45 | [project.optional-dependencies] 46 | dev = [ 47 | "pytest", 48 | "pytest-cov", 49 | "coverage", 50 | "tox", 51 | "black", 52 | "mypy", 53 | "pre-commit", 54 | "ruff", 55 | "setuptools_scm", 56 | "pytest-sugar", 57 | ] 58 | 59 | nb = ["jupyter", "k3d"] 60 | 61 | [build-system] 62 | requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=6.2"] 63 | build-backend = "setuptools.build_meta" 64 | 65 | [tool.setuptools] 66 | include-package-data = true 67 | 68 | [tool.setuptools.packages.find] 69 | include = ["morphapi*"] 70 | exclude = ["tests*", "examples*"] 71 | 72 | [tool.pytest.ini_options] 73 | addopts = "--cov=morphapi" 74 | 75 | [tool.black] 76 | target-version = ['py311','py312', 'py313'] 77 | skip-string-normalization = false 78 | line-length = 79 79 | 80 | [tool.setuptools_scm] 81 | 82 | [tool.check-manifest] 83 | ignore = [ 84 | ".yaml", 85 | "tox.ini", 86 | "tests/", 87 | "tests/test_unit/", 88 | "tests/test_integration/", 89 | ] 90 | 91 | [tool.ruff] 92 | line-length = 79 93 | exclude = ["__init__.py", "build", ".eggs"] 94 | fix = true 95 | 96 | [tool.ruff.lint] 97 | select = ["I", "E", "F"] 98 | 99 | [tool.tox] 100 | legacy_tox_ini = """ 101 | [tox] 102 | envlist = py{311,312,313} 103 | isolated_build = True 104 | 105 | [gh-actions] 106 | python = 107 | 3.11: py311 108 | 3.12: py312 109 | 3.13: py313 110 | 111 | [testenv] 112 | extras = 113 | dev 114 | commands = 115 | pytest -v --color=yes --cov=morphapi --cov-report=xml 116 | """ 117 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainglobe/morphapi/2f21781d57ee764fa6d82f477ffaceb90b2c7141/tests/__init__.py -------------------------------------------------------------------------------- /tests/data/example1.swc: -------------------------------------------------------------------------------- 1 | # Generated 2019/08/21. 2 | # Please consult Terms-of-Use at https://mouselight.janelia.org when referencing this reconstruction. 3 | # DOI: 10.25378/janelia.7780856 4 | # Neuron Id: AA0905 5 | # Sample Date: Mon, 02 Jul 2018 18:52:28 GMT 6 | # Sample Strain: C57BL/6N 7 | # Label Virus: AAV2/1 Syn-iCre + AAV2/1 CAG-Flex GFP 8 | # Label Fluorophore: anti-GFP 9 | 1 1 6957.015539 2478.262394 3250.181397 1.000000 -1 10 | 2 2 6958.226485 2477.661115 3249.171194 1.000000 1 11 | 3 2 6964.961135 2493.535170 3247.468690 1.000000 2 12 | 4 2 6974.086151 2499.271468 3250.101633 1.000000 3 13 | 5 2 6982.804649 2499.504955 3255.117120 1.000000 4 14 | 6 2 6984.913972 2508.304681 3268.372992 1.000000 5 15 | 7 2 6984.710937 2532.126953 3277.951173 1.000000 6 16 | 8 2 6985.922130 2544.704996 3283.308574 1.000000 7 17 | 9 2 6987.640778 2547.787016 3287.437478 1.000000 8 18 | 10 2 6993.390387 2558.470814 3296.164035 1.000000 9 19 | 11 2 7002.632891 2561.174844 3303.806695 1.000000 10 20 | 12 2 7006.843845 2565.914085 3306.339810 1.000000 11 21 | 13 2 7008.906377 2570.548969 3310.886621 1.000000 12 22 | 14 2 7015.492012 2577.905411 3317.179741 1.000000 13 23 | 15 2 7015.695426 2584.180754 3323.773495 1.000000 14 24 | 16 2 7018.734470 2592.702045 3334.513613 1.000000 15 25 | 17 2 6988.265535 2556.517689 3280.292929 1.000000 9 26 | 18 2 6988.070102 2572.221668 3282.117135 1.000000 17 27 | 19 2 6983.562751 2582.003024 3273.833883 1.000000 18 28 | 20 2 6982.624757 2596.537205 3286.275462 1.000000 19 29 | 21 2 6981.820392 2625.223572 3317.544978 1.000000 20 30 | 22 2 6984.000071 2664.769419 3340.908227 1.000000 21 31 | 23 2 6982.203195 2689.045027 3378.078130 1.000000 22 32 | 24 2 6977.984226 2720.479582 3406.812600 1.000000 23 33 | 25 2 6971.234280 2758.922005 3440.275484 1.000000 24 34 | 26 2 6964.914191 2793.602394 3467.582106 1.000000 25 35 | 27 2 6960.148198 2835.414095 3498.998022 1.000000 26 36 | 28 2 6953.570260 2859.563417 3524.689361 1.000000 27 37 | 29 2 6957.257896 2888.696313 3554.326192 1.000000 28 38 | 30 2 6948.171765 2923.287026 3587.169990 1.000000 29 39 | 31 2 6949.663953 2940.488397 3597.925807 1.000000 30 40 | 32 2 6962.093858 2960.805655 3602.996023 1.000000 31 41 | 33 2 6948.593978 2996.867221 3628.033135 1.000000 32 42 | 34 2 6923.765588 3034.274301 3652.679631 1.000000 33 43 | 35 2 6918.078311 3045.257754 3662.013694 1.000000 34 44 | 36 2 6908.203135 3044.958017 3659.414045 1.000000 35 45 | 37 2 6889.320017 3036.621029 3646.828203 1.000000 36 46 | 38 2 6873.242015 3024.965963 3645.886772 1.000000 37 47 | 39 2 6835.960920 3026.574117 3672.170004 1.000000 38 48 | 40 2 6811.812699 3044.508890 3707.992119 1.000000 39 49 | 41 2 6778.453112 3071.208129 3744.957049 1.000000 40 50 | 42 2 6747.554430 3096.560473 3778.283168 1.000000 41 51 | 43 2 6719.359228 3124.552626 3798.734319 1.000000 42 52 | 44 2 6686.656394 3169.173907 3825.046758 1.000000 43 53 | 45 2 6654.843897 3208.692516 3871.818260 1.000000 44 54 | 46 2 6617.234107 3248.252963 3893.943449 1.000000 45 55 | 47 2 6564.406251 3290.168811 3931.964753 1.000000 46 56 | 48 2 6526.109618 3317.649391 3968.402226 1.000000 47 57 | 49 2 6497.117390 3355.771433 4000.187576 1.000000 48 58 | 50 2 6472.718784 3379.382789 4017.404405 1.000000 49 59 | 51 2 6446.210946 3402.119113 4034.847672 1.000000 50 60 | 52 2 6407.335877 3425.009695 4061.652295 1.000000 51 61 | 53 2 6380.226675 3433.677602 4078.556559 1.000000 52 62 | 54 2 6358.148651 3447.528179 4106.982410 1.000000 53 63 | 55 2 6336.078324 3457.265507 4120.490286 1.000000 54 64 | 56 2 6312.054831 3462.744113 4135.212938 1.000000 55 65 | 57 2 6286.203080 3466.576269 4146.775301 1.000000 56 66 | 58 2 6254.859564 3466.275288 4155.673886 1.000000 57 67 | 59 2 6221.109267 3477.719744 4166.478522 1.000000 58 68 | 60 2 6198.609354 3487.839765 4172.863399 1.000000 59 69 | 61 2 6181.039020 3505.217798 4182.287039 1.000000 60 70 | 62 2 6153.109610 3528.784240 4205.002019 1.000000 61 71 | 63 2 6129.867117 3539.330074 4228.505876 1.000000 62 72 | 64 2 6107.703202 3551.737257 4243.162174 1.000000 63 73 | 65 2 6071.218810 3560.973599 4247.806559 1.000000 64 74 | 66 2 6035.515852 3567.797848 4263.472564 1.000000 65 75 | 67 2 5981.914067 3567.055553 4284.955004 1.000000 66 76 | 68 2 5933.859159 3569.897542 4309.894473 1.000000 67 77 | 69 2 5907.086051 3573.095783 4324.861307 1.000000 68 78 | 70 2 5858.687780 3587.533130 4345.439361 1.000000 69 79 | 71 2 5807.202839 3588.875112 4361.787192 1.000000 70 80 | 72 2 5759.328381 3581.209108 4369.458915 1.000000 71 81 | 73 2 5667.593532 3578.013752 4394.146476 1.000000 72 82 | 74 2 5582.859234 3572.083055 4412.546836 1.000000 73 83 | 75 2 5506.023291 3582.521442 4442.802733 1.000000 74 84 | 76 2 5447.148321 3592.376017 4457.097580 1.000000 75 85 | 77 2 5420.484481 3587.188333 4462.224646 1.000000 76 86 | 78 2 5382.914102 3579.007910 4463.513729 1.000000 77 87 | 79 2 5330.882799 3563.000091 4465.726440 1.000000 78 88 | 80 2 5288.390584 3544.233402 4461.736206 1.000000 79 89 | 81 2 5255.632698 3537.816528 4458.197195 1.000000 80 90 | 82 2 5234.875112 3530.042124 4453.978454 1.000000 81 91 | 83 2 5208.015638 3517.830202 4449.925746 1.000000 82 92 | 84 2 5162.640650 3503.602593 4447.730538 1.000000 83 93 | 85 2 5111.601461 3495.791913 4445.597575 1.000000 84 94 | 86 2 5063.109325 3478.082875 4440.540991 1.000000 85 95 | 87 2 5012.242121 3448.994133 4436.441443 1.000000 86 96 | 88 2 4963.656264 3411.106564 4438.267533 1.000000 87 97 | 89 2 4924.163973 3381.560558 4434.763781 1.000000 88 98 | 90 2 4879.507672 3349.025244 4442.033263 1.000000 89 99 | 91 2 4859.273304 3331.610370 4451.271519 1.000000 90 100 | 92 2 4827.984371 3298.915923 4441.064381 1.000000 91 101 | 93 2 4807.796831 3273.823318 4431.537096 1.000000 92 102 | 94 2 4780.781299 3249.754810 4410.300835 1.000000 93 103 | 95 2 4753.867280 3228.091925 4383.238197 1.000000 94 104 | 96 2 4717.648451 3211.707115 4345.130782 1.000000 95 105 | 97 2 4687.570352 3191.393619 4311.896595 1.000000 96 106 | 98 2 4656.312440 3181.021558 4274.648404 1.000000 97 107 | 99 2 4624.140682 3170.027444 4265.798736 1.000000 98 108 | 100 2 4605.937532 3161.237183 4250.728510 1.000000 99 109 | 101 2 4576.523383 3169.887775 4229.492298 1.000000 100 110 | 102 2 4560.101602 3177.733350 4216.732323 1.000000 101 111 | 103 2 4542.179680 3197.949154 4206.074138 1.000000 102 112 | 104 2 4526.976447 3217.087920 4181.373056 1.000000 103 113 | 105 2 4482.226418 3216.443428 4148.711036 1.000000 104 114 | 106 2 4434.039103 3217.599558 4130.954981 1.000000 105 115 | 107 2 4393.687434 3209.596633 4120.337931 1.000000 106 116 | 108 2 4344.703237 3211.703180 4104.515678 1.000000 107 117 | 109 2 4286.289088 3211.091781 4090.951153 1.000000 108 118 | 110 2 4224.437625 3223.896619 4070.435521 1.000000 109 119 | 111 2 4171.804699 3221.900429 4066.699241 1.000000 110 120 | 112 2 4159.695234 3224.742159 4070.494135 1.000000 111 121 | 113 2 4109.726558 3237.865311 4082.046818 1.000000 112 122 | 114 2 4090.617042 3250.213805 4104.951272 1.000000 113 123 | 115 2 4041.242298 3259.394405 4119.220797 1.000000 114 124 | 116 2 4003.265579 3274.380856 4112.615136 1.000000 115 125 | 117 2 3988.789120 3288.193431 4109.171869 1.000000 116 126 | 118 2 3937.546831 3296.425754 4119.283107 1.000000 117 127 | 119 2 3900.609286 3305.329043 4127.203228 1.000000 118 128 | 120 2 3864.734439 3324.169922 4159.228421 1.000000 119 129 | 121 2 3838.953134 3350.852447 4191.851644 1.000000 120 130 | 122 2 3816.781118 3388.314389 4229.566313 1.000000 121 131 | 123 2 3799.085800 3420.297733 4251.699198 1.000000 122 132 | 124 2 3793.828254 3460.019619 4304.732329 1.000000 123 133 | 125 2 3777.093608 3492.654175 4346.771520 1.000000 124 134 | 126 2 3771.609309 3518.944395 4381.904394 1.000000 125 135 | 127 2 3737.804655 3575.696165 4436.478483 1.000000 126 136 | 128 2 3717.359483 3611.804735 4486.126896 1.000000 127 137 | 129 2 3711.804763 3648.957075 4543.289161 1.000000 128 138 | 130 2 3709.132883 3671.607329 4587.763607 1.000000 129 139 | 131 2 3699.078091 3716.283187 4663.586039 1.000000 130 140 | 132 2 3694.734386 3721.617179 4672.255777 1.000000 131 141 | 133 2 3665.351604 3726.917099 4679.162028 1.000000 132 142 | 134 2 3656.960886 3728.291043 4679.968652 1.000000 133 143 | 135 2 3651.773437 3729.213867 4697.386719 1.000000 134 144 | 136 2 3633.593742 3745.620234 4694.894426 1.000000 135 145 | 137 2 3595.562574 3763.276334 4707.972709 1.000000 136 146 | 138 2 3572.874932 3779.511742 4714.433640 1.000000 137 147 | 139 2 3556.749914 3793.412985 4713.812574 1.000000 138 148 | 140 2 3530.562529 3807.877027 4711.171840 1.000000 139 149 | 141 2 3513.843612 3814.903236 4713.466776 1.000000 140 150 | 142 2 3496.734416 3821.110456 4719.081995 1.000000 141 151 | 143 2 3480.140500 3837.962895 4722.279418 1.000000 142 152 | 144 2 3468.882680 3849.606519 4731.060562 1.000000 143 153 | 145 2 3452.288927 3858.035998 4739.093642 1.000000 144 154 | 146 2 3422.984275 3872.765665 4746.136683 1.000000 145 155 | 147 2 3400.320313 3893.153320 4756.332032 1.000000 146 156 | 148 2 3377.179716 3915.849612 4758.855561 1.000000 147 157 | 149 2 3319.390732 3942.879782 4776.541002 1.000000 148 158 | 150 2 3256.937416 3957.791123 4786.617079 1.000000 149 159 | 151 2 3188.250027 3973.871076 4800.990351 1.000000 150 160 | 152 2 3156.406260 3996.733524 4793.994200 1.000000 151 161 | 153 2 3134.546834 4002.201157 4793.384752 1.000000 152 162 | 154 2 3097.671921 4008.682514 4788.044845 1.000000 153 163 | 155 2 3074.460937 4007.513760 4789.287125 1.000000 154 164 | 156 2 3038.085941 4018.430527 4789.265725 1.000000 155 165 | 157 2 3004.781239 4025.418850 4792.552667 1.000000 156 166 | 158 2 2960.312625 4026.480443 4804.003938 1.000000 157 167 | 159 2 2924.773430 4035.588740 4813.638788 1.000000 158 168 | 160 2 2879.289024 4042.667974 4811.101607 1.000000 159 169 | 161 2 2837.507938 4050.526305 4809.904371 1.000000 160 170 | 162 2 2787.351684 4064.516587 4801.816521 1.000000 161 171 | 163 2 2722.234370 4077.601477 4797.611429 1.000000 162 172 | 164 2 2710.265665 4075.083913 4784.576195 1.000000 163 173 | 165 2 2689.453057 4070.807634 4758.048820 1.000000 164 174 | 166 2 2675.554746 4048.675708 4718.488247 1.000000 165 175 | 167 2 2656.531332 4047.658057 4707.425836 1.000000 166 176 | 168 2 2657.984453 4057.449218 4686.628946 1.000000 167 177 | 169 2 2654.851653 4085.672774 4665.751837 1.000000 168 178 | 170 2 2689.296933 4061.276454 4751.261660 1.000000 165 179 | 171 2 2681.429601 4047.034255 4729.459099 1.000000 170 180 | 172 2 2672.538949 4035.473608 4704.404196 1.000000 171 181 | 173 2 2685.976535 4095.564444 4787.503837 1.000000 163 182 | 174 2 2672.804684 4113.734263 4779.064495 1.000000 173 183 | 175 2 2642.663923 4127.805650 4772.287171 1.000000 174 184 | 176 2 2615.101641 4143.973637 4780.888585 1.000000 175 185 | 177 2 2588.140591 4180.883775 4760.867149 1.000000 176 186 | 178 2 2546.867257 4240.174761 4747.128788 1.000000 177 187 | 179 2 2533.562473 4258.940438 4743.818325 1.000000 178 188 | 180 2 2551.296919 4296.531266 4726.748118 1.000000 179 189 | 181 2 2550.140566 4390.195321 4716.953245 1.000000 180 190 | 182 2 2550.335906 4425.420925 4714.447158 1.000000 181 191 | 183 2 2570.539117 4484.751122 4700.572248 1.000000 182 192 | 184 2 2597.976429 4527.517657 4673.492108 1.000000 183 193 | 185 2 2620.664003 4539.390654 4683.513577 1.000000 184 194 | 186 2 2646.390759 4547.182634 4693.015648 1.000000 185 195 | 187 2 2678.578122 4571.117311 4682.390667 1.000000 186 196 | 188 2 2714.500061 4607.598585 4665.136639 1.000000 187 197 | 189 2 2808.679808 4647.550790 4706.349553 1.000000 188 198 | 190 2 2941.562392 4704.889595 4740.208957 1.000000 189 199 | 191 2 2955.835983 4718.201145 4746.697292 1.000000 190 200 | 192 2 2976.453044 4711.089775 4743.728471 1.000000 191 201 | 193 2 2994.343873 4693.290911 4759.089829 1.000000 192 202 | 194 2 3020.023565 4681.232503 4769.441405 1.000000 193 203 | 195 2 3023.984275 4670.882827 4773.195398 1.000000 194 204 | 196 2 3035.695425 4652.630807 4788.666018 1.000000 195 205 | 197 2 3040.132920 4629.572406 4807.748131 1.000000 196 206 | 198 2 3033.953189 4603.659251 4844.609432 1.000000 197 207 | 199 2 3038.335926 4600.301646 4832.062564 1.000000 198 208 | 200 2 3052.679656 4584.407144 4835.017550 1.000000 199 209 | 201 2 3031.710944 4580.721691 4861.412071 1.000000 200 210 | 202 2 3025.078165 4653.649526 4773.804628 1.000000 195 211 | 203 2 3040.382941 4629.773407 4778.529298 1.000000 202 212 | 204 2 3057.570446 4604.417986 4797.769447 1.000000 203 213 | 205 2 3090.288961 4600.144503 4806.712841 1.000000 204 214 | 206 2 3107.023458 4575.543879 4817.703052 1.000000 205 215 | 207 2 3107.437490 4558.277232 4827.519608 1.000000 206 216 | 208 2 3111.984233 4538.708878 4871.439488 1.000000 207 217 | 209 2 3106.015756 4509.352601 4898.355469 1.000000 208 218 | 210 2 2958.671890 4729.554613 4725.247951 1.000000 191 219 | 211 2 2974.671787 4743.026320 4706.173864 1.000000 210 220 | 212 2 2999.859518 4768.960040 4693.464958 1.000000 211 221 | 213 2 3004.062381 4767.887661 4687.216799 1.000000 212 222 | 214 2 2999.289184 4759.820168 4676.021547 1.000000 213 223 | 215 2 2998.281321 4760.687644 4665.140623 1.000000 214 224 | 216 2 3000.117081 4777.736259 4652.785266 1.000000 215 225 | 217 2 2684.835992 4546.299665 4715.314381 1.000000 187 226 | 218 2 2691.203077 4537.869068 4729.093715 1.000000 217 227 | 219 2 2714.593603 4518.009795 4772.097736 1.000000 218 228 | 220 2 2735.109381 4485.233295 4847.693327 1.000000 219 229 | 221 2 2736.351504 4479.623140 4873.966907 1.000000 220 230 | 222 2 2754.656283 4492.252906 4918.955114 1.000000 221 231 | 223 2 2796.851598 4518.974622 4948.658148 1.000000 222 232 | 224 2 2811.750127 4525.798846 4961.994019 1.000000 223 233 | 225 2 2843.437433 4520.179765 4958.540979 1.000000 224 234 | 226 2 2876.539047 4491.265519 4988.603483 1.000000 225 235 | 227 2 2891.289173 4472.146424 5005.816470 1.000000 226 236 | 228 2 2887.000112 4464.002032 5013.121019 1.000000 227 237 | 229 2 3129.710805 3990.628830 4771.578053 1.000000 152 238 | 230 2 3106.710929 4001.120243 4774.402375 1.000000 229 239 | 231 2 3092.070272 4024.525531 4772.439485 1.000000 230 240 | 232 2 3042.867315 4024.207085 4768.480535 1.000000 231 241 | 233 2 3031.500131 4026.085964 4787.416075 1.000000 232 242 | 234 2 3654.789036 3726.184677 4706.726669 1.000000 135 243 | 235 2 3646.976656 3730.829978 4717.269538 1.000000 234 244 | 236 2 3599.164094 3770.373052 4714.429704 1.000000 235 245 | 237 2 3571.062538 3782.362274 4729.427656 1.000000 236 246 | 238 2 3536.265603 3802.564546 4741.681761 1.000000 237 247 | 239 2 3499.828020 3819.669859 4745.679809 1.000000 238 248 | 240 2 3458.257828 3840.435474 4791.162178 1.000000 239 249 | 241 2 3434.257928 3848.350533 4807.304730 1.000000 240 250 | 242 2 3378.710890 3868.472570 4834.435562 1.000000 241 251 | 243 2 3336.828232 3890.499007 4866.089872 1.000000 242 252 | 244 2 3295.117055 3917.427813 4900.701071 1.000000 243 253 | 245 2 3253.484458 3927.490194 4923.542870 1.000000 244 254 | 246 2 3204.929660 3947.012752 4955.406309 1.000000 245 255 | 247 2 3154.312444 3958.662131 4973.406359 1.000000 246 256 | 248 2 3115.421792 3965.526382 4997.875034 1.000000 247 257 | 249 2 3070.132822 3981.869000 5016.783156 1.000000 248 258 | 250 2 3008.781202 3989.098535 5036.648504 1.000000 249 259 | 251 2 2989.999943 3998.152490 5038.168086 1.000000 250 260 | 252 2 2961.476526 3984.137684 5036.496027 1.000000 251 261 | 253 2 2937.523445 3995.423696 5034.078175 1.000000 252 262 | 254 2 2888.179567 4002.831072 5028.091726 1.000000 253 263 | 255 2 2855.687445 3998.117239 5036.925748 1.000000 254 264 | 256 2 2805.023517 3979.162010 5052.146479 1.000000 255 265 | 257 2 2750.890704 3980.787075 5066.082097 1.000000 256 266 | 258 2 2694.906223 3989.096576 5072.084053 1.000000 257 267 | 259 2 2631.609367 4005.966925 5058.595744 1.000000 258 268 | 260 2 2566.179734 4029.542972 5051.328086 1.000000 259 269 | 261 2 2498.914010 4046.729419 5043.136665 1.000000 260 270 | 262 2 2480.156252 4049.849547 5040.906190 1.000000 261 271 | 263 2 2456.718788 4052.321328 5034.242146 1.000000 262 272 | 264 2 2435.570329 4059.118185 5026.162007 1.000000 263 273 | 265 2 2419.312500 4072.009766 5028.910157 1.000000 264 274 | 266 2 2396.703085 4101.800894 5043.980558 1.000000 265 275 | 267 2 2390.664026 4123.537099 5049.931559 1.000000 266 276 | 268 2 2397.109386 4131.718733 5071.300752 1.000000 267 277 | 269 2 2399.320312 4142.504892 5110.748052 1.000000 268 278 | 270 2 2402.726542 4162.921877 5151.742074 1.000000 269 279 | 271 2 2408.148446 4187.913986 5201.421769 1.000000 270 280 | 272 2 2406.671854 4197.021408 5224.722737 1.000000 271 281 | 273 2 2402.546892 4178.390755 5264.168058 1.000000 272 282 | 274 2 2410.351575 4172.333070 5285.384727 1.000000 273 283 | 275 2 2411.453109 4135.338037 5331.195337 1.000000 274 284 | 276 2 2393.335980 4102.304802 5353.816356 1.000000 275 285 | 277 2 2373.929648 4059.139515 5384.054486 1.000000 276 286 | 278 2 2369.413993 4023.475563 5419.033043 1.000000 277 287 | 279 2 2356.796857 4009.412985 5443.521454 1.000000 278 288 | 280 2 2467.312452 4052.243231 5001.109431 1.000000 263 289 | 281 2 2458.398371 4043.699284 4973.706979 1.000000 280 290 | 282 2 2468.984435 4036.944195 4939.745998 1.000000 281 291 | 283 2 2465.085886 4037.941416 4904.808705 1.000000 282 292 | 284 2 2493.273492 4030.833878 4875.130804 1.000000 283 293 | 285 2 2511.484364 4018.629847 4844.144615 1.000000 284 294 | 286 2 2482.500033 4026.208922 5049.601556 1.000000 262 295 | 287 2 2473.226574 3967.131696 5080.099635 1.000000 286 296 | 288 2 2473.054703 3928.412166 5110.216814 1.000000 287 297 | 289 2 2464.570356 3872.118999 5143.330064 1.000000 288 298 | 290 2 2458.984377 3816.277288 5182.197310 1.000000 289 299 | 291 2 2452.851538 3770.991115 5221.867253 1.000000 290 300 | 292 2 2465.710887 3754.462816 5231.826057 1.000000 291 301 | 293 2 2480.226560 3755.546894 5244.043046 1.000000 292 302 | 294 2 2490.953052 3715.303837 5274.089797 1.000000 293 303 | 295 2 2498.007810 3654.737160 5342.494042 1.000000 294 304 | 296 2 2500.242114 3603.861209 5416.195174 1.000000 295 305 | 297 2 2483.085899 3542.357311 5472.661943 1.000000 296 306 | 298 2 2483.578071 3499.660285 5512.748001 1.000000 297 307 | 299 2 2487.062446 3490.441367 5536.084166 1.000000 298 308 | 300 2 2480.523371 3484.330956 5553.566246 1.000000 299 309 | 301 2 2462.406229 3474.014572 5572.076225 1.000000 300 310 | 302 2 2454.679675 3471.464822 5595.345804 1.000000 301 311 | 303 2 2449.562561 3436.576147 5632.220823 1.000000 302 312 | 304 2 2434.859384 3442.246186 5664.806777 1.000000 303 313 | 305 2 2434.843719 3453.103482 5681.199031 1.000000 304 314 | 306 2 2433.843812 3447.848614 5701.843575 1.000000 305 315 | 307 2 2418.273435 3451.904396 5744.257621 1.000000 306 316 | 308 2 2418.640643 3443.930562 5748.130718 1.000000 307 317 | 309 2 2431.843733 3431.760605 5735.621074 1.000000 308 318 | 310 2 2438.312511 3418.442344 5723.511960 1.000000 309 319 | 311 2 2432.765560 3403.768553 5727.868980 1.000000 310 320 | 312 2 2465.773461 3648.827136 5355.902445 1.000000 295 321 | 313 2 2442.078060 3754.704960 5235.687596 1.000000 291 322 | 314 2 3106.523376 3961.037141 5021.828202 1.000000 248 323 | 315 2 3120.476444 3951.917136 5054.408304 1.000000 314 324 | 316 2 3135.304824 3939.863140 5084.761617 1.000000 315 325 | 317 2 3150.343700 3924.051676 5115.775395 1.000000 316 326 | 318 2 3158.492293 3934.870139 5125.031315 1.000000 317 327 | 319 2 3148.164078 3948.310478 5146.011634 1.000000 318 328 | 320 2 3138.257694 3960.623909 5167.373159 1.000000 319 329 | 321 2 3156.367070 3980.476471 5193.669828 1.000000 320 330 | 322 2 3171.460911 3982.853584 5197.488284 1.000000 321 331 | 323 2 3176.414003 3994.041996 5202.251891 1.000000 322 332 | 324 2 3197.203094 4025.809479 5238.355471 1.000000 323 333 | 325 2 3200.570203 4035.278182 5252.445367 1.000000 324 334 | 326 2 3201.187496 4020.186392 5260.195312 1.000000 325 335 | 327 2 3210.726476 4003.693478 5268.009845 1.000000 326 336 | 328 2 3242.914033 3986.057490 5280.929620 1.000000 327 337 | 329 2 3266.562389 3962.907174 5293.531423 1.000000 328 338 | 330 2 3282.890694 3924.959994 5299.609259 1.000000 329 339 | 331 2 3287.617223 3913.548758 5304.802742 1.000000 330 340 | 332 2 3296.664172 3915.283288 5302.183405 1.000000 331 341 | 333 2 3313.867298 3903.042045 5339.335926 1.000000 332 342 | 334 2 3311.249938 3904.055680 5361.498114 1.000000 333 343 | 335 2 3306.757720 3888.004000 5384.368961 1.000000 334 344 | 336 2 3307.671744 3886.879882 5442.285287 1.000000 335 345 | 337 2 3324.288956 3858.245967 5476.222606 1.000000 336 346 | 338 2 3313.242087 3917.751819 5304.570158 1.000000 332 347 | 339 2 3210.578172 3906.005828 4911.923706 1.000000 245 348 | 340 2 3181.663944 3907.012699 4895.250066 1.000000 339 349 | 341 2 3125.609228 3899.531284 4866.968847 1.000000 340 350 | 342 2 3090.828249 3883.149374 4859.836006 1.000000 341 351 | 343 2 3070.968744 3884.768453 4843.599494 1.000000 342 352 | 344 2 3040.250122 3852.141498 4850.406192 1.000000 343 353 | 345 2 2996.968784 3832.191484 4848.931722 1.000000 344 354 | 346 2 2945.929576 3879.496193 4845.505779 1.000000 345 355 | 347 2 2943.210903 3903.993141 4848.961053 1.000000 346 356 | 348 2 2904.906265 3973.108471 4851.628922 1.000000 347 357 | 349 2 2883.210796 4016.859346 4855.261625 1.000000 348 358 | 350 2 2878.601461 4033.038053 4860.269563 1.000000 349 359 | 351 2 2857.210879 4048.809539 4867.472745 1.000000 350 360 | 352 2 2821.359281 4093.665079 4863.765579 1.000000 351 361 | 353 2 2808.835977 4111.850568 4878.718769 1.000000 352 362 | 354 2 2775.336052 4134.899543 4884.587965 1.000000 353 363 | 355 2 2745.359350 4141.480556 4887.617103 1.000000 354 364 | 356 2 2718.523309 4145.580020 4886.335982 1.000000 355 365 | 357 2 2675.499912 4152.436528 4893.478472 1.000000 356 366 | 358 2 2634.257762 4162.727569 4890.744087 1.000000 357 367 | 359 2 2571.015563 4177.111209 4892.361278 1.000000 358 368 | 360 2 2555.968679 4182.462907 4891.931687 1.000000 359 369 | 361 2 2515.695354 4198.183631 4890.789156 1.000000 360 370 | 362 2 2468.937528 4222.489348 4889.134807 1.000000 361 371 | 363 2 2447.078106 4236.071247 4896.373107 1.000000 362 372 | 364 2 2422.015698 4243.384830 4906.072278 1.000000 363 373 | 365 2 2414.453102 4236.461787 4926.466689 1.000000 364 374 | 366 2 2424.171945 4226.284308 4941.734439 1.000000 365 375 | 367 2 2421.890680 4210.323327 4956.025512 1.000000 366 376 | 368 2 2399.117176 4204.194201 4975.164029 1.000000 367 377 | 369 2 2380.882774 4195.408210 4976.519592 1.000000 368 378 | 370 2 2378.711001 4182.550707 4984.707049 1.000000 369 379 | 371 2 2389.601632 4161.990205 4995.908083 1.000000 370 380 | 372 2 2404.453085 4138.141625 5004.273337 1.000000 371 381 | 373 2 2411.804716 4069.022555 5048.980396 1.000000 372 382 | 374 2 2414.617181 4044.915180 5073.064420 1.000000 373 383 | 375 2 2405.695378 4235.018476 4943.724621 1.000000 365 384 | 376 2 2394.320316 4248.071339 4954.380872 1.000000 375 385 | 377 2 2548.281226 4175.504834 4879.634887 1.000000 360 386 | 378 2 2507.265647 4175.087996 4875.332109 1.000000 377 387 | 379 2 2457.726574 4174.719767 4880.212769 1.000000 378 388 | 380 2 2453.226489 4176.670767 4908.511677 1.000000 379 389 | 381 2 2450.218797 4149.048850 4942.998073 1.000000 380 390 | 382 2 2446.007842 4132.343831 4984.236269 1.000000 381 391 | 383 2 2437.515576 4117.235301 5006.052638 1.000000 382 392 | 384 2 2418.554742 4095.641483 5043.179617 1.000000 383 393 | 385 2 2414.070282 4080.477445 5061.117072 1.000000 384 394 | 386 2 2402.343682 4056.828106 5082.472775 1.000000 385 395 | 387 2 2378.679664 4031.415136 5091.603431 1.000000 386 396 | 388 2 2380.359416 4025.999083 5104.671970 1.000000 387 397 | 389 2 2386.898423 4006.273352 5128.730407 1.000000 388 398 | 390 2 2388.836011 3988.720660 5124.185651 1.000000 389 399 | 391 2 2389.453069 3991.112262 5110.789167 1.000000 390 400 | 392 2 2387.859414 3976.256951 5101.681533 1.000000 391 401 | 393 2 2407.804719 3963.329073 5096.699134 1.000000 392 402 | 394 2 2417.601558 3958.953046 5085.503958 1.000000 393 403 | 395 2 2421.843814 3937.923754 5081.619021 1.000000 394 404 | 396 2 2432.117230 3928.150280 5077.070208 1.000000 395 405 | 397 2 2451.515666 3886.725653 5073.683604 1.000000 396 406 | 398 2 2460.414037 3860.501812 5086.546896 1.000000 397 407 | 399 2 2439.414004 4129.492280 4978.505902 1.000000 381 408 | 400 2 2434.085933 4119.573336 5008.408263 1.000000 399 409 | 401 2 2411.429614 4113.938542 5037.250049 1.000000 400 410 | 402 2 2394.007750 4059.139788 5090.783091 1.000000 401 411 | 403 2 2393.554691 4032.457881 5107.326266 1.000000 402 412 | 404 2 2394.007763 4016.426835 5130.242147 1.000000 403 413 | 405 2 2386.023503 3991.267663 5174.162019 1.000000 404 414 | 406 2 2375.039133 3965.466762 5188.830197 1.000000 405 415 | 407 2 2378.554692 3928.849744 5222.918051 1.000000 406 416 | 408 2 2366.374982 3895.821385 5246.714959 1.000000 407 417 | 409 2 2372.632863 3867.882771 5256.541012 1.000000 408 418 | 410 2 2391.328123 3829.292941 5289.267626 1.000000 409 419 | 411 2 2411.882879 3778.168958 5311.623024 1.000000 410 420 | 412 2 2417.257775 3772.831151 5319.378927 1.000000 411 421 | 413 2 2765.960987 4099.028446 4865.390594 1.000000 352 422 | 414 2 2725.773431 4106.366209 4860.855505 1.000000 413 423 | 415 2 2697.086060 4110.134705 4857.914156 1.000000 414 424 | 416 2 2672.843768 4091.855407 4856.244187 1.000000 415 425 | 417 2 2638.624944 4084.377855 4845.173717 1.000000 416 426 | 418 2 2593.554779 4084.206193 4840.494226 1.000000 417 427 | 419 2 2546.867239 4113.743055 4845.431609 1.000000 418 428 | 420 2 2572.804749 4066.678758 4858.173736 1.000000 418 429 | 421 2 2555.398399 4081.321247 4866.833868 1.000000 420 430 | 422 2 2546.304722 4080.435595 4876.955004 1.000000 421 431 | 423 2 2525.171893 4102.619145 4903.068398 1.000000 422 432 | 424 2 2498.632761 4130.844800 4918.292884 1.000000 423 433 | 425 2 2468.343698 4141.529320 4934.720766 1.000000 424 434 | 426 2 2468.226608 4124.541987 4955.732503 1.000000 425 435 | 427 2 2462.382851 4133.615330 4966.728465 1.000000 426 436 | 428 2 2473.914043 4144.188361 4970.779399 1.000000 427 437 | 429 2 2482.539121 4163.099721 4969.953238 1.000000 428 438 | 430 2 2498.156185 4181.306714 4976.683505 1.000000 429 439 | 431 2 2521.757762 4183.969865 4972.662107 1.000000 430 440 | 432 2 2533.523427 4196.262804 4965.265715 1.000000 431 441 | 433 2 2564.515656 4212.224702 4957.224553 1.000000 432 442 | 434 2 2584.562470 4218.570194 4947.990284 1.000000 433 443 | 435 2 2607.320391 4227.976668 4915.675737 1.000000 434 444 | 436 2 2615.398492 4224.191484 4904.669902 1.000000 435 445 | 437 2 2616.953268 4226.882853 4893.177615 1.000000 436 446 | 438 2 2630.718764 4226.366140 4879.328237 1.000000 437 447 | 439 2 2608.617122 4213.732357 4839.427657 1.000000 438 448 | 440 2 2555.000035 4050.581023 4889.728528 1.000000 420 449 | 441 2 2551.484350 4016.702030 4937.265710 1.000000 440 450 | 442 2 2547.468699 3983.506878 4981.896606 1.000000 441 451 | 443 2 2562.296941 3953.530306 5025.105530 1.000000 442 452 | 444 2 2571.554660 3898.362342 5098.060650 1.000000 443 453 | 445 2 2577.601601 3881.632795 5124.548802 1.000000 444 454 | 446 2 2593.203198 3890.736186 5143.841808 1.000000 445 455 | 447 2 2595.007886 3892.731440 5159.281299 1.000000 446 456 | 448 2 2950.546759 3803.420780 4857.271548 1.000000 345 457 | 449 2 2931.117177 3791.563397 4851.910211 1.000000 448 458 | 450 2 2891.492077 3749.704182 4851.878996 1.000000 449 459 | 451 2 2865.781194 3723.772565 4857.041132 1.000000 450 460 | 452 2 2845.406248 3728.216808 4845.949296 1.000000 451 461 | 453 2 2813.086032 3698.425908 4846.519544 1.000000 452 462 | 454 2 2776.031173 3651.576126 4844.738169 1.000000 453 463 | 455 2 2740.257850 3603.567275 4834.039162 1.000000 454 464 | 456 2 2721.453124 3572.074219 4821.886719 1.000000 455 465 | 457 2 2737.929601 3566.449156 4806.765575 1.000000 456 466 | 458 2 2763.038973 3572.779267 4784.908205 1.000000 457 467 | 459 2 2787.445328 3594.202220 4772.017613 1.000000 458 468 | 460 2 2808.289052 3624.577182 4717.406354 1.000000 459 469 | 461 2 2836.867207 3637.509894 4689.673843 1.000000 460 470 | 462 2 2869.086024 3640.399524 4661.423929 1.000000 461 471 | 463 2 2884.023364 3659.342664 4594.847546 1.000000 462 472 | 464 2 2893.015718 3672.519556 4570.226487 1.000000 463 473 | 465 2 2917.586028 3663.919085 4552.617173 1.000000 464 474 | 466 2 2941.320259 3662.708962 4516.806743 1.000000 465 475 | 467 2 2966.164131 3667.430556 4487.408312 1.000000 466 476 | 468 2 2991.945262 3694.569387 4443.705028 1.000000 467 477 | 469 2 2993.562451 3706.426665 4422.334033 1.000000 468 478 | 470 2 3000.703053 3698.877946 4406.097596 1.000000 469 479 | 471 2 3003.523420 3714.779177 4392.181651 1.000000 470 480 | 472 2 3018.187353 3728.298852 4380.318295 1.000000 471 481 | 473 2 3022.156291 3748.867156 4361.294922 1.000000 472 482 | 474 2 3044.789209 3763.786986 4329.099725 1.000000 473 483 | 475 2 3054.359384 3757.704246 4320.742081 1.000000 474 484 | 476 2 3079.617222 3784.361469 4289.384808 1.000000 475 485 | 477 2 3100.164193 3782.928676 4274.201105 1.000000 476 486 | 478 2 3114.726602 3791.747077 4260.808555 1.000000 477 487 | 479 2 2832.171822 3711.350455 4834.247940 1.000000 452 488 | 480 2 2819.015652 3702.662008 4820.324110 1.000000 479 489 | 481 2 2823.820173 3704.000141 4804.462854 1.000000 480 490 | 482 2 2825.601545 3691.594594 4770.558494 1.000000 481 491 | 483 2 2826.195267 3684.871183 4753.773379 1.000000 482 492 | 484 2 2813.695459 3685.515585 4725.876923 1.000000 483 493 | 485 2 2812.992175 3665.180538 4703.742108 1.000000 484 494 | 486 2 2801.679622 3638.027350 4701.910065 1.000000 485 495 | 487 2 2792.757712 3623.945170 4704.001963 1.000000 486 496 | 488 2 2780.007828 3613.388687 4720.841848 1.000000 487 497 | 489 2 2740.781208 3636.038989 4746.136596 1.000000 488 498 | 490 2 2726.968669 3637.881002 4763.925807 1.000000 489 499 | 491 2 2706.695451 3651.588889 4794.292958 1.000000 490 500 | 492 2 2682.742180 3625.102540 4831.757764 1.000000 491 501 | 493 2 2674.312575 3629.627900 4852.371018 1.000000 492 502 | 494 2 2668.320357 3605.371215 4888.277307 1.000000 493 503 | 495 2 2655.031235 3594.467778 4908.103400 1.000000 494 504 | 496 2 2655.023504 3577.380922 4911.435651 1.000000 495 505 | 497 2 3649.679603 3746.470666 4681.714938 1.000000 134 506 | 498 2 3629.992066 3788.348581 4656.220742 1.000000 497 507 | 499 2 3612.187522 3813.202295 4642.005844 1.000000 498 508 | 500 2 3593.828188 3853.686633 4627.779270 1.000000 499 509 | 501 2 3572.367214 3914.737197 4611.287203 1.000000 500 510 | 502 2 3540.234386 3961.103394 4596.759738 1.000000 501 511 | 503 2 3533.054828 4022.635817 4578.056590 1.000000 502 512 | 504 2 3518.140613 4110.567288 4553.996066 1.000000 503 513 | 505 2 3508.999879 4186.411215 4520.970744 1.000000 504 514 | 506 2 3506.882704 4225.864242 4507.095667 1.000000 505 515 | 507 2 3503.976474 4256.316387 4497.275328 1.000000 506 516 | 508 2 3508.703232 4273.552623 4489.144608 1.000000 507 517 | 509 2 3536.531111 4306.051767 4486.261730 1.000000 508 518 | 510 2 3557.554617 4352.392575 4476.617286 1.000000 509 519 | 511 2 3587.429748 4372.433472 4463.179643 1.000000 510 520 | 512 2 3628.468702 4410.696374 4440.290989 1.000000 511 521 | 513 2 3678.242266 4461.078150 4444.150397 1.000000 512 522 | 514 2 3715.203016 4494.099736 4401.169891 1.000000 513 523 | 515 2 3786.937399 4543.997077 4384.037039 1.000000 514 524 | 516 2 3833.250025 4573.777431 4360.041037 1.000000 515 525 | 517 2 3860.117046 4588.647442 4342.607430 1.000000 516 526 | 518 2 3896.445253 4612.788204 4323.193245 1.000000 517 527 | 519 2 3879.093776 4633.608374 4286.976527 1.000000 518 528 | 520 2 3863.000062 4670.580205 4244.878984 1.000000 519 529 | 521 2 3849.687614 4715.752848 4209.355503 1.000000 520 530 | 522 2 3826.554645 4774.628983 4172.353460 1.000000 521 531 | 523 2 3808.929802 4804.805529 4190.728427 1.000000 522 532 | 524 2 3807.195165 4839.816283 4191.900277 1.000000 523 533 | 525 2 3784.929670 4877.652283 4198.472663 1.000000 524 534 | 526 2 3773.601565 4901.414950 4192.195358 1.000000 525 535 | 527 2 3749.117203 4935.266616 4188.482479 1.000000 526 536 | 528 2 3750.218830 4983.986228 4184.863228 1.000000 527 537 | 529 2 3750.476702 5013.876820 4193.277227 1.000000 528 538 | 530 2 3746.929725 5032.103620 4212.902423 1.000000 529 539 | 531 2 3756.046995 5047.812508 4247.831973 1.000000 530 540 | 532 2 3751.742325 5038.399519 4275.636713 1.000000 531 541 | 533 2 3754.195191 5033.458000 4307.228590 1.000000 532 542 | 534 2 3759.656189 5019.636676 4333.086047 1.000000 533 543 | 535 2 3762.500098 4985.065357 4345.789042 1.000000 534 544 | 536 2 3775.546745 4956.292968 4344.125043 1.000000 535 545 | 537 2 3802.249917 4958.057588 4331.246093 1.000000 536 546 | 538 2 3824.234295 4944.277388 4326.917928 1.000000 537 547 | 539 2 3857.546733 4920.567455 4346.185565 1.000000 538 548 | 540 2 3701.921890 3730.994028 4677.812461 1.000000 132 549 | 541 2 3706.961043 3757.190466 4709.790896 1.000000 540 550 | 542 2 3730.890609 3776.636716 4758.670016 1.000000 541 551 | 543 2 3757.562415 3824.668957 4826.757781 1.000000 542 552 | 544 2 3778.867077 3881.063385 4890.709060 1.000000 543 553 | 545 2 3788.757686 3906.102581 4920.578110 1.000000 544 554 | 546 2 3792.218743 3932.923891 4950.431646 1.000000 545 555 | 547 2 3813.226572 3986.777456 5011.357417 1.000000 546 556 | 548 2 3848.601590 4037.907166 5074.912214 1.000000 547 557 | 549 2 3857.804563 4083.834009 5096.927827 1.000000 548 558 | 550 2 3870.304735 4141.584840 5146.550733 1.000000 549 559 | 551 2 3880.351666 4160.275265 5156.423732 1.000000 550 560 | 552 2 3886.367180 4217.576127 5140.435627 1.000000 551 561 | 553 2 3910.171987 4250.657353 5144.898408 1.000000 552 562 | 554 2 3909.882850 4283.035997 5138.089904 1.000000 553 563 | 555 2 3935.523546 4324.857323 5076.515689 1.000000 554 564 | 556 2 3925.429547 4337.820246 5045.402267 1.000000 555 565 | 557 2 3936.398565 4341.619002 5031.212956 1.000000 556 566 | 558 2 3921.343635 4339.301809 4984.171978 1.000000 557 567 | 559 2 3917.921745 4345.964704 4963.833960 1.000000 558 568 | 560 2 3909.374896 4335.832910 4919.939455 1.000000 559 569 | 561 2 3902.140732 4343.115247 4887.865203 1.000000 560 570 | 562 2 3886.960993 4330.319193 4811.216687 1.000000 561 571 | 563 2 3873.976614 4321.738290 4738.810564 1.000000 562 572 | 564 2 3860.289014 4313.092898 4685.023461 1.000000 563 573 | 565 2 3842.359285 4301.703992 4619.404394 1.000000 564 574 | 566 2 3831.086021 4283.210812 4572.906332 1.000000 565 575 | 567 2 3830.007718 4248.915145 4506.502008 1.000000 566 576 | 568 2 3834.562494 4229.066465 4503.224682 1.000000 567 577 | 569 2 3859.859374 4204.331966 4507.324197 1.000000 568 578 | 570 2 3882.906242 4147.196388 4482.820354 1.000000 569 579 | 571 2 3882.226680 4135.565362 4476.289037 1.000000 570 580 | 572 2 3890.625022 4089.704116 4469.023543 1.000000 571 581 | 573 2 3899.937588 4050.818250 4467.041028 1.000000 572 582 | 574 2 3902.218851 4009.697243 4459.080018 1.000000 573 583 | 575 2 3914.265572 3971.543045 4433.492135 1.000000 574 584 | 576 2 3928.703130 3932.908156 4418.388553 1.000000 575 585 | 577 2 3936.351562 3915.179709 4403.767606 1.000000 576 586 | 578 2 3939.648355 3863.491192 4381.537010 1.000000 577 587 | 579 2 3949.515605 3839.419091 4381.654419 1.000000 578 588 | 580 2 3933.265507 3840.346719 4337.648537 1.000000 579 589 | 581 2 3929.218698 3836.531325 4301.666119 1.000000 580 590 | 582 2 3913.437364 3838.961004 4290.203153 1.000000 581 591 | 583 2 3883.562377 3854.002037 4273.425751 1.000000 582 592 | 584 2 3885.164197 3858.398493 4265.328105 1.000000 583 593 | 585 2 3892.906186 3852.270478 4237.486312 1.000000 584 594 | 586 2 3896.695244 3849.855432 4213.835895 1.000000 585 595 | 587 2 3904.171880 3842.298890 4197.748068 1.000000 586 596 | 588 2 3925.804620 3836.124924 4174.740274 1.000000 587 597 | 589 2 3945.570327 3832.994152 4127.699143 1.000000 588 598 | 590 2 3956.898425 3811.862345 4093.798739 1.000000 589 599 | 591 2 3954.992314 3810.607379 4075.478507 1.000000 590 600 | 592 2 3972.710937 3790.240235 4053.755860 1.000000 591 601 | 593 2 3974.515627 3785.939568 4039.373127 1.000000 592 602 | 594 2 3984.359353 3803.247019 4032.394609 1.000000 593 603 | 595 2 3986.648330 3799.997964 4023.710926 1.000000 594 604 | 596 2 4001.585937 3780.758789 4015.818360 1.000000 595 605 | 597 2 4013.375012 3768.118113 4023.249993 1.000000 596 606 | 598 2 4026.328145 3756.812544 4025.429645 1.000000 597 607 | 599 2 4036.085871 3727.875894 4017.322375 1.000000 598 608 | 600 2 4044.257725 3714.556624 4020.300676 1.000000 599 609 | 601 2 4039.843623 3721.301723 4043.378888 1.000000 600 610 | 602 2 4027.265489 3705.833845 4089.513782 1.000000 601 611 | 603 2 4029.046876 3704.003903 4132.531170 1.000000 602 612 | 604 2 4037.265765 3711.709995 4150.267506 1.000000 603 613 | 605 2 4034.953049 3699.215724 3995.539050 1.000000 599 614 | 606 2 4036.609466 3660.354471 3966.144651 1.000000 605 615 | 607 2 4038.500105 3641.045046 3959.205081 1.000000 606 616 | 608 2 4030.968813 3619.964832 3966.964944 1.000000 607 617 | 609 2 4043.937379 3583.361272 3961.533289 1.000000 608 618 | 610 2 4042.913992 3563.934650 3954.687595 1.000000 609 619 | 611 2 4070.273443 3547.580924 3952.134772 1.000000 610 620 | 612 2 4069.531225 3546.116085 3926.488165 1.000000 611 621 | 613 2 4041.640677 3551.106556 3900.566370 1.000000 612 622 | 614 2 3990.421999 3787.877983 4012.820215 1.000000 595 623 | 615 2 3997.281112 3782.810467 4006.738334 1.000000 614 624 | 616 2 4024.250140 3791.412173 4000.460879 1.000000 615 625 | 617 2 4046.851432 3816.460954 3993.023528 1.000000 616 626 | 618 2 4062.101572 3840.125103 3986.986390 1.000000 617 627 | 619 2 4066.476684 3879.318410 3981.912158 1.000000 618 628 | 620 2 4089.086030 3905.278339 3998.361216 1.000000 619 629 | 621 2 4096.523393 3929.135746 4004.400277 1.000000 620 630 | 622 2 4116.953138 3946.327250 3992.800848 1.000000 621 631 | 623 2 4128.750020 3974.737311 3973.859421 1.000000 622 632 | 624 2 4143.804581 3992.428669 3968.972719 1.000000 623 633 | 625 2 4147.617318 4009.930804 3975.191437 1.000000 624 634 | 626 2 4110.945354 4049.092860 4042.349715 1.000000 625 635 | 627 2 4102.804708 4061.337942 4054.072381 1.000000 626 636 | 628 2 4080.312571 4074.910992 4067.312428 1.000000 627 637 | 629 2 4094.664096 4083.852565 4087.269559 1.000000 628 638 | 630 2 4087.664202 4094.314545 4086.339916 1.000000 629 639 | 631 2 4056.640544 4107.670844 4091.711051 1.000000 630 640 | 632 2 4046.187595 4114.318428 4117.228492 1.000000 631 641 | 633 2 3994.093885 3776.607310 3998.125082 1.000000 615 642 | 634 2 3997.687601 3770.697135 3982.992163 1.000000 633 643 | 635 2 3990.570272 3786.734398 4051.341890 1.000000 592 644 | 636 2 3984.445410 3791.628979 4036.378963 1.000000 635 645 | 637 2 3978.640722 3789.209055 4024.500084 1.000000 636 646 | 638 2 3981.718764 3790.455069 4015.148353 1.000000 637 647 | 639 2 3982.585836 3784.876119 4005.390641 1.000000 638 648 | 640 2 3992.289154 3789.164917 3984.722697 1.000000 639 649 | 641 2 3872.312355 3853.679616 4257.322320 1.000000 583 650 | 642 2 3841.031248 3877.098690 4223.851669 1.000000 641 651 | 643 2 3836.054581 3881.093715 4222.570276 1.000000 642 652 | 644 2 3806.249924 3898.197244 4197.339950 1.000000 643 653 | 645 2 3787.937369 3908.537969 4197.281326 1.000000 644 654 | 646 2 3732.093887 3877.284163 4188.076160 1.000000 645 655 | 647 2 3708.007698 3891.772542 4180.359460 1.000000 646 656 | 648 2 3674.960895 3900.850492 4188.470753 1.000000 647 657 | 649 2 3668.992332 3891.016514 4213.099518 1.000000 648 658 | 650 2 3820.773430 3869.229400 4221.970732 1.000000 643 659 | 651 2 3826.250070 3858.097777 4216.267588 1.000000 650 660 | 652 2 3832.890636 3850.211800 4207.832153 1.000000 651 661 | 653 2 3820.734393 3824.998128 4195.314526 1.000000 652 662 | 654 2 3838.023464 3812.859376 4187.703217 1.000000 653 663 | 655 2 3854.218685 3793.040923 4172.035260 1.000000 654 664 | 656 2 3882.507706 3785.917838 4150.167921 1.000000 655 665 | 657 2 3892.140596 3776.540019 4139.031139 1.000000 656 666 | 658 2 3861.625114 4107.866078 4474.529409 1.000000 571 667 | 659 2 3848.757766 4071.512614 4468.246208 1.000000 658 668 | 660 2 3843.328266 4058.580217 4462.767555 1.000000 659 669 | 661 2 3821.164172 4020.330913 4463.597570 1.000000 660 670 | 662 2 3808.586046 3992.862359 4466.447156 1.000000 661 671 | 663 2 3786.851559 3964.111343 4459.158271 1.000000 662 672 | 664 2 3764.781221 3940.405169 4450.707130 1.000000 663 673 | 665 2 3753.382722 3914.846661 4436.332044 1.000000 664 674 | 666 2 3783.851521 3886.838868 4429.941300 1.000000 665 675 | 667 2 3799.757814 3864.522380 4416.652308 1.000000 666 676 | 668 2 3806.812486 3852.463006 4397.203158 1.000000 667 677 | 669 2 3796.226449 3827.929801 4388.818360 1.000000 668 678 | 670 2 3802.242180 3787.771399 4393.127075 1.000000 669 679 | 671 2 3811.554803 3739.607421 4395.976653 1.000000 670 680 | 672 2 3813.976466 3694.427869 4389.814572 1.000000 671 681 | 673 2 3812.374916 3647.498968 4395.087925 1.000000 672 682 | 674 2 3807.398468 3604.310658 4400.564546 1.000000 673 683 | 675 2 3830.117321 3555.758655 4410.437528 1.000000 674 684 | 676 2 3851.429774 3494.417084 4416.546812 1.000000 675 685 | 677 2 3861.820207 3468.941467 4413.757752 1.000000 676 686 | 678 2 3867.937642 3458.448312 4414.722704 1.000000 677 687 | 679 2 3866.398488 3419.640482 4449.166052 1.000000 678 688 | 680 2 3867.578004 3406.357429 4466.982541 1.000000 679 689 | 681 2 3880.124909 3399.333938 4473.877024 1.000000 680 690 | 682 2 3878.429624 3385.407135 4474.822367 1.000000 681 691 | 683 2 3884.663988 3373.082919 4471.468766 1.000000 682 692 | 684 2 3893.601469 3354.317374 4417.529295 1.000000 683 693 | 685 2 3911.453115 3336.181745 4395.214892 1.000000 684 694 | 686 2 3917.828048 3349.836789 4374.494223 1.000000 685 695 | 687 2 3926.867142 3350.087949 4342.208967 1.000000 686 696 | 688 2 3946.695221 3343.234438 4324.224661 1.000000 687 697 | 689 2 3971.398371 3330.940423 4298.595591 1.000000 688 698 | 690 2 3993.804547 3328.804732 4279.402325 1.000000 689 699 | 691 2 3981.336002 3366.615242 4242.927753 1.000000 690 700 | 692 2 3980.961048 3365.564569 4230.052706 1.000000 691 701 | 693 2 3997.171768 3393.172848 4196.958964 1.000000 692 702 | 694 2 4000.546805 3389.637821 4179.861341 1.000000 693 703 | 695 2 3990.601695 3393.312422 4159.347768 1.000000 694 704 | 696 2 3987.390690 3416.728460 4136.097572 1.000000 695 705 | 697 2 3993.218695 3428.413126 4120.246210 1.000000 696 706 | 698 2 4013.023417 3435.581070 4118.152262 1.000000 697 707 | 699 2 4011.773397 3443.873897 4102.263640 1.000000 698 708 | 700 2 4024.664184 3438.272384 4095.701054 1.000000 699 709 | 701 2 4034.296810 3424.804704 4110.579998 1.000000 700 710 | 702 2 3940.390677 3355.037041 4314.751871 1.000000 688 711 | 703 2 3969.265625 3376.174804 4308.003907 1.000000 702 712 | 704 2 3953.015546 3382.432750 4294.121050 1.000000 703 713 | 705 2 3935.421900 3397.484466 4282.209090 1.000000 704 714 | 706 2 3937.421820 3425.456898 4265.171802 1.000000 705 715 | 707 2 3931.398454 3454.764770 4240.548841 1.000000 706 716 | 708 2 3926.421957 3472.710071 4221.732454 1.000000 707 717 | 709 2 3933.538959 3490.581030 4180.697202 1.000000 708 718 | 710 2 3934.242161 3524.707147 4162.406254 1.000000 709 719 | 711 2 3904.835908 3565.251875 4131.265532 1.000000 710 720 | 712 2 3851.242103 3584.677779 4120.345600 1.000000 711 721 | 713 2 3902.015573 3484.245011 4203.126879 1.000000 708 722 | 714 2 3905.929787 3528.291902 4213.693342 1.000000 713 723 | 715 2 3908.593825 3540.077985 4208.328123 1.000000 714 724 | 716 2 3881.437562 3433.884748 4415.273373 1.000000 678 725 | 717 2 3865.632770 3444.575151 4388.212979 1.000000 716 726 | 718 2 3867.734501 3439.255943 4336.777361 1.000000 717 727 | 719 2 3871.679697 3430.761640 4323.134711 1.000000 718 728 | 720 2 3892.499987 3430.122196 4290.421817 1.000000 719 729 | 721 2 3915.062469 3430.707030 4255.964849 1.000000 720 730 | 722 2 3924.070421 3427.516655 4237.412100 1.000000 721 731 | 723 2 3922.226668 3445.010679 4217.183654 1.000000 722 732 | 724 2 3926.992048 3465.252969 4200.363344 1.000000 723 733 | 725 2 3928.828189 3482.312405 4168.714774 1.000000 724 734 | 726 2 3946.312495 3513.568344 4142.769502 1.000000 725 735 | 727 2 3948.297008 3539.277480 4125.718712 1.000000 726 736 | 728 2 3873.937362 3457.128914 4361.119213 1.000000 717 737 | 729 2 3894.796796 3448.435405 4357.210923 1.000000 728 738 | 730 2 3906.093619 3434.476433 4340.904314 1.000000 729 739 | 731 2 3922.703213 3426.663969 4309.724552 1.000000 730 740 | 732 2 3908.710918 3416.869980 4318.580084 1.000000 731 741 | 733 2 3900.296976 3464.117084 4350.197209 1.000000 729 742 | 734 2 3885.703208 3477.749072 4351.886720 1.000000 733 743 | 735 2 3849.367285 3490.917016 4362.050829 1.000000 734 744 | 736 2 3838.726640 3513.261750 4354.960930 1.000000 735 745 | 737 2 3825.226655 3536.574202 4347.798905 1.000000 736 746 | 738 2 3801.062603 3564.499986 4337.285182 1.000000 737 747 | 739 2 3783.632854 3582.079021 4335.847561 1.000000 738 748 | 740 2 3761.820431 3621.474463 4318.033280 1.000000 739 749 | 741 2 3736.742149 3659.117175 4297.546839 1.000000 740 750 | 742 2 3736.226422 3718.610330 4283.017570 1.000000 741 751 | 743 2 3738.820371 3764.327989 4295.138578 1.000000 742 752 | 744 2 3737.406291 3804.617046 4307.041066 1.000000 743 753 | 745 2 3722.851499 3806.359263 4328.087854 1.000000 744 754 | 746 2 3733.796928 3800.181599 4337.947219 1.000000 745 755 | 747 2 3725.585972 3811.814572 4350.095790 1.000000 746 756 | 748 2 3719.031129 3805.255933 4361.566325 1.000000 747 757 | 749 2 3743.742227 3780.032300 4370.291024 1.000000 748 758 | 750 2 3724.843772 3789.903180 4374.488325 1.000000 749 759 | 751 2 3724.234243 3778.016653 4380.285224 1.000000 750 760 | 752 2 3857.070365 3438.284204 4437.259686 1.000000 677 761 | 753 2 3835.312360 3403.247013 4455.363376 1.000000 752 762 | 754 2 3822.507708 3392.825309 4461.052722 1.000000 753 763 | 755 2 3809.867248 3353.804719 4480.718865 1.000000 754 764 | 756 2 3800.515751 3324.237181 4509.181751 1.000000 755 765 | 757 2 3810.859291 3292.090798 4523.888772 1.000000 756 766 | 758 2 3794.515658 3278.398348 4519.980460 1.000000 757 767 | 759 2 3771.742181 3258.501970 4518.572287 1.000000 758 768 | 760 2 3758.460961 3260.901361 4485.320205 1.000000 759 769 | 761 2 3749.851441 3271.026428 4458.080129 1.000000 760 770 | 762 2 3731.382824 3276.818365 4439.099707 1.000000 761 771 | 763 2 3716.796834 3310.188364 4407.458869 1.000000 762 772 | 764 2 3704.632675 3322.634649 4386.808609 1.000000 763 773 | 765 2 3709.007774 3336.241161 4372.408089 1.000000 764 774 | 766 2 3705.289008 3346.702007 4359.494085 1.000000 765 775 | 767 2 3700.265644 3354.550698 4329.347576 1.000000 766 776 | 768 2 3696.984342 3360.998954 4305.039110 1.000000 767 777 | 769 2 3681.749881 3362.410144 4300.793066 1.000000 768 778 | 770 2 3648.039146 3381.764588 4316.374993 1.000000 769 779 | 771 2 3852.992047 4070.582134 4450.316322 1.000000 660 780 | 772 2 3863.421754 4087.673940 4449.765607 1.000000 771 781 | 773 2 3899.398399 4118.718811 4439.793053 1.000000 772 782 | 774 2 3933.109294 4144.912997 4439.634686 1.000000 773 783 | 775 2 3956.085895 4157.833889 4436.646596 1.000000 774 784 | 776 2 3980.578189 4183.805737 4426.775282 1.000000 775 785 | 777 2 4013.773333 4160.440446 4421.642604 1.000000 776 786 | 778 2 3992.523323 4220.999038 4422.976570 1.000000 776 787 | 779 2 4001.765537 4245.828201 4424.545024 1.000000 778 788 | 780 2 4015.093888 4225.309460 4452.197180 1.000000 779 789 | 781 2 4040.211012 4232.737325 4462.945264 1.000000 780 790 | 782 2 4039.929710 4246.177830 4458.349670 1.000000 781 791 | 783 2 4003.718651 3258.076044 4150.119162 1.000000 116 792 | 784 2 3994.046919 3253.037197 4168.619101 1.000000 783 793 | 785 2 3976.273452 3256.238379 4178.890559 1.000000 784 794 | 786 2 3980.906339 3260.252829 4226.685452 1.000000 785 795 | 787 2 3984.336012 3264.612196 4261.000041 1.000000 786 796 | 788 2 3986.406268 3285.314358 4277.550721 1.000000 787 797 | 789 2 3967.906152 3294.944371 4298.279396 1.000000 788 798 | 790 2 3952.015665 3316.938357 4357.896389 1.000000 789 799 | 791 2 3936.953014 3341.460104 4409.378963 1.000000 790 800 | 792 2 3925.437438 3342.907206 4461.546913 1.000000 791 801 | 793 2 3895.179779 3352.358351 4484.355347 1.000000 792 802 | 794 2 3864.765610 3367.047993 4515.576231 1.000000 793 803 | 795 2 3844.101590 3383.039182 4526.689381 1.000000 794 804 | 796 2 3799.078163 3387.332080 4559.125012 1.000000 795 805 | 797 2 3755.875114 3388.763716 4601.919878 1.000000 796 806 | 798 2 3702.718820 3402.663203 4638.656252 1.000000 797 807 | 799 2 3649.703164 3409.438455 4677.728415 1.000000 798 808 | 800 2 3613.367061 3425.776513 4691.720703 1.000000 799 809 | 801 2 3579.781334 3476.484365 4711.806576 1.000000 800 810 | 802 2 3531.867118 3512.324286 4731.232527 1.000000 801 811 | 803 2 3490.015730 3546.100488 4751.671906 1.000000 802 812 | 804 2 3452.460814 3589.776374 4777.328190 1.000000 803 813 | 805 2 3414.117260 3603.700069 4799.789135 1.000000 804 814 | 806 2 3412.648345 3606.679752 4805.906203 1.000000 805 815 | 807 2 3431.421897 3622.833994 4813.498115 1.000000 806 816 | 808 2 3460.453251 3628.161269 4843.384778 1.000000 807 817 | 809 2 3472.507747 3644.378941 4879.039039 1.000000 808 818 | 810 2 3474.476586 3672.271510 4899.945360 1.000000 809 819 | 811 2 3498.226568 3709.619085 4928.152462 1.000000 810 820 | 812 2 3494.734378 3741.445358 4931.455012 1.000000 811 821 | 813 2 3479.617152 3750.563604 4913.380954 1.000000 812 822 | 814 2 3459.085935 3747.931672 4900.658219 1.000000 813 823 | 815 2 3447.086074 3738.889590 4892.984398 1.000000 814 824 | 816 2 3442.538918 3751.251990 4861.845670 1.000000 815 825 | 817 2 3432.109358 3772.894479 4821.486212 1.000000 816 826 | 818 2 3427.249993 3807.816395 4794.828167 1.000000 817 827 | 819 2 3432.585970 3838.874145 4757.312479 1.000000 818 828 | 820 2 3432.617145 3853.670047 4721.751910 1.000000 819 829 | 821 2 3437.187620 3869.432553 4704.652240 1.000000 820 830 | 822 2 3419.843750 3888.542059 4681.242113 1.000000 821 831 | 823 2 3407.445460 3914.660174 4666.230534 1.000000 822 832 | 824 2 3418.609402 3967.634625 4659.699309 1.000000 823 833 | 825 2 3430.117229 3991.479524 4678.722762 1.000000 824 834 | 826 2 3427.390669 3985.208932 4703.207124 1.000000 825 835 | 827 2 3425.726601 3993.953991 4766.658084 1.000000 826 836 | 828 2 3415.085987 3962.361307 4831.755804 1.000000 827 837 | 829 2 3401.843715 3936.270474 4867.588008 1.000000 828 838 | 830 2 3370.601642 3886.087959 4937.330116 1.000000 829 839 | 831 2 3366.500068 3873.613346 4946.580147 1.000000 830 840 | 832 2 3369.320452 3862.567464 4931.400452 1.000000 831 841 | 833 2 3383.132926 3623.597728 4825.779339 1.000000 806 842 | 834 2 3353.835860 3650.873021 4846.216712 1.000000 833 843 | 835 2 3347.093865 3647.454185 4850.363281 1.000000 834 844 | 836 2 3331.804630 3662.096621 4865.238338 1.000000 835 845 | 837 2 3296.664135 3690.935456 4883.093780 1.000000 836 846 | 838 2 3259.898337 3715.807592 4908.416003 1.000000 837 847 | 839 2 3239.281184 3749.265530 4923.722629 1.000000 838 848 | 840 2 3203.093806 3781.159229 4943.945273 1.000000 839 849 | 841 2 3167.695306 3834.063586 4962.081925 1.000000 840 850 | 842 2 3144.195405 3864.139506 4969.933687 1.000000 841 851 | 843 2 3109.906297 3915.511783 4971.882834 1.000000 842 852 | 844 2 3073.281155 3965.127785 4977.976652 1.000000 843 853 | 845 2 3045.718826 4018.574112 4976.453223 1.000000 844 854 | 846 2 3030.648317 4057.597610 4984.134742 1.000000 845 855 | 847 2 3011.476648 4079.215861 4988.892688 1.000000 846 856 | 848 2 2990.601583 4125.504043 4999.707153 1.000000 847 857 | 849 2 2971.062419 4154.193343 5002.640522 1.000000 848 858 | 850 2 2953.328089 4184.080954 5019.535260 1.000000 849 859 | 851 2 2908.453036 4229.422746 5026.720694 1.000000 850 860 | 852 2 2906.382781 4235.889762 5030.326216 1.000000 851 861 | 853 2 2904.570329 4233.829048 5049.566357 1.000000 852 862 | 854 2 2871.406206 4225.076213 5075.613318 1.000000 853 863 | 855 2 2874.468752 4196.823164 5100.261658 1.000000 854 864 | 856 2 2914.336046 4147.856563 5123.882918 1.000000 855 865 | 857 2 2927.515520 4129.078969 5133.279341 1.000000 856 866 | 858 2 2954.836079 4100.404278 5151.964733 1.000000 857 867 | 859 2 2976.046950 4063.753075 5156.533188 1.000000 858 868 | 860 2 2975.375001 4063.619142 5139.091892 1.000000 859 869 | 861 2 2970.500073 4065.773506 5132.355348 1.000000 860 870 | 862 2 2986.679824 4064.396602 5097.367183 1.000000 861 871 | 863 2 2989.562533 4044.088864 5043.396381 1.000000 862 872 | 864 2 2990.179568 4034.943462 5018.417970 1.000000 863 873 | 865 2 3002.992228 4016.250868 4987.703042 1.000000 864 874 | 866 2 3026.062631 3992.067491 4958.048949 1.000000 865 875 | 867 2 3044.874977 3973.700245 4932.910184 1.000000 866 876 | 868 2 3067.156308 3963.672737 4918.697240 1.000000 867 877 | 869 2 3090.539190 3939.498189 4912.038954 1.000000 868 878 | 870 2 3123.742271 3906.013619 4918.927633 1.000000 869 879 | 871 2 3159.664184 3893.428705 4928.207006 1.000000 870 880 | 872 2 3195.257751 3870.625122 4920.007726 1.000000 871 881 | 873 2 3215.351443 3865.360246 4899.638653 1.000000 872 882 | 874 2 3242.859457 3853.290162 4898.078172 1.000000 873 883 | 875 2 3329.781351 3820.533191 4898.376831 1.000000 874 884 | 876 2 3347.945286 3799.997033 4878.841839 1.000000 875 885 | 877 2 3380.546821 3814.127798 4844.095629 1.000000 876 886 | 878 2 3402.234460 3826.462961 4838.959030 1.000000 877 887 | 879 2 3426.570253 3865.088945 4791.611390 1.000000 878 888 | 880 2 3433.679712 3877.704223 4760.675875 1.000000 879 889 | 881 2 3479.429723 3881.406264 4719.445360 1.000000 880 890 | 882 2 3490.710894 3876.537205 4711.443390 1.000000 881 891 | 883 2 2913.148378 4121.961779 5151.701080 1.000000 857 892 | 884 2 2841.414074 4201.921881 5097.052729 1.000000 854 893 | 885 2 2826.671879 4178.100446 5143.238290 1.000000 884 894 | 886 2 2795.046915 4170.042966 5185.261827 1.000000 885 895 | 887 2 2779.835845 4167.995065 5227.900364 1.000000 886 896 | 888 2 2747.000106 4150.732336 5257.224577 1.000000 887 897 | 889 2 2713.960862 4133.315477 5305.181615 1.000000 888 898 | 890 2 2689.867242 4130.072315 5341.292947 1.000000 889 899 | 891 2 2657.757878 4106.250953 5411.949192 1.000000 890 900 | 892 2 2662.374867 4107.038048 5438.586062 1.000000 891 901 | 893 2 2662.148436 4102.834075 5463.277233 1.000000 892 902 | 894 2 2630.593799 4089.879024 5485.127171 1.000000 893 903 | 895 2 2625.242151 4083.133775 5518.890691 1.000000 894 904 | 896 2 2611.742243 4066.837753 5550.619166 1.000000 895 905 | 897 2 2616.283244 4064.149052 5552.643600 1.000000 896 906 | 898 2 2620.105495 4062.866600 5554.410222 1.000000 897 907 | 899 2 2630.976559 4060.681578 5558.554792 1.000000 898 908 | 900 2 2648.367125 4052.862317 5565.728700 1.000000 899 909 | 901 2 2667.359347 3993.510610 5583.144454 1.000000 900 910 | 902 2 2676.992230 3964.574249 5601.365420 1.000000 901 911 | 903 2 2581.882773 4041.928776 5590.949275 1.000000 896 912 | 904 2 2571.390648 4018.475463 5623.132736 1.000000 903 913 | 905 2 2562.835949 4012.731348 5634.648581 1.000000 904 914 | 906 2 2544.734350 4003.848661 5656.191621 1.000000 905 915 | 907 2 2524.718797 4007.410297 5680.005836 1.000000 906 916 | 908 2 2510.476627 3993.638694 5719.982312 1.000000 907 917 | 909 2 2488.203155 3967.570288 5768.232485 1.000000 908 918 | 910 2 2469.273500 3969.517724 5799.013859 1.000000 909 919 | 911 2 2463.078071 3997.994011 5819.013762 1.000000 910 920 | 912 2 2462.937561 4000.079998 5828.996148 1.000000 911 921 | 913 2 2454.343765 3993.020525 5859.201259 1.000000 912 922 | 914 2 2432.742150 3981.863184 5908.867331 1.000000 913 923 | 915 2 2416.976496 3960.661024 5963.324203 1.000000 914 924 | 916 2 2417.468690 3947.937370 5978.265680 1.000000 915 925 | 917 2 2417.320270 3936.711042 6026.925630 1.000000 916 926 | 918 2 2428.296909 3920.040967 6089.589611 1.000000 917 927 | 919 2 2423.093802 3925.761771 6143.857233 1.000000 918 928 | 920 2 2418.726566 3919.176778 6191.871154 1.000000 919 929 | 921 2 2425.085922 3945.883786 6234.747915 1.000000 920 930 | 922 2 2419.710989 3935.085021 6271.783058 1.000000 921 931 | 923 2 2357.171949 3903.344696 6333.615418 1.000000 922 932 | 924 2 2338.164082 3870.236348 6381.948998 1.000000 923 933 | 925 2 2316.054636 3845.466855 6437.746082 1.000000 924 934 | 926 2 2301.601630 3760.575212 6502.396261 1.000000 925 935 | 927 2 2462.562455 4017.650337 5860.281189 1.000000 912 936 | 928 2 2449.820352 4050.993175 5917.626943 1.000000 927 937 | 929 2 2445.312558 4059.716905 5954.851661 1.000000 928 938 | 930 2 2531.281241 3993.799753 5722.607286 1.000000 908 939 | 931 2 2542.648416 3987.598499 5722.478559 1.000000 930 940 | 932 2 2557.859314 3993.844754 5735.658445 1.000000 931 941 | 933 2 2562.140617 4008.368073 5752.521691 1.000000 932 942 | 934 2 2536.203122 4057.450077 5771.869245 1.000000 933 943 | 935 2 2533.734354 4094.750011 5788.970470 1.000000 934 944 | 936 2 2550.921929 4139.340861 5830.488199 1.000000 935 945 | 937 2 2569.351493 4157.239402 5860.343662 1.000000 936 946 | 938 2 2593.648465 4213.254005 5899.046747 1.000000 937 947 | 939 2 2574.210921 4259.750852 5911.632802 1.000000 938 948 | 940 2 2556.906198 4304.563511 5940.599396 1.000000 939 949 | 941 2 2547.398505 4311.469854 5959.332071 1.000000 940 950 | 942 2 2546.539069 4299.020615 5981.800597 1.000000 941 951 | 943 2 2535.234326 4282.775354 6024.158071 1.000000 942 952 | 944 2 2582.453074 3985.693407 5743.279436 1.000000 932 953 | 945 2 2606.101628 3979.306518 5757.958768 1.000000 944 954 | 946 2 2629.226494 3980.277285 5766.025541 1.000000 945 955 | 947 2 2659.273442 3958.679834 5771.787003 1.000000 946 956 | 948 2 2663.867179 3935.919940 5768.324035 1.000000 947 957 | 949 2 2651.406197 3888.257827 5756.798694 1.000000 948 958 | 950 2 2629.593768 3860.205977 5746.523433 1.000000 949 959 | 951 2 2598.124943 3827.511839 5723.558532 1.000000 950 960 | 952 2 2569.031213 3789.442404 5724.451173 1.000000 951 961 | 953 2 2532.882751 3726.414934 5728.734559 1.000000 952 962 | 954 2 2506.023374 3680.431533 5726.925552 1.000000 953 963 | 955 2 2497.390662 3646.443292 5708.999836 1.000000 954 964 | 956 2 2481.374974 3637.935410 5693.039252 1.000000 955 965 | 957 2 2575.328120 4007.027328 5647.019543 1.000000 905 966 | 958 2 2586.976600 4019.747036 5661.449072 1.000000 957 967 | 959 2 2890.601625 4262.275465 5024.810485 1.000000 852 968 | 960 2 2869.039118 4286.966677 5027.916001 1.000000 959 969 | 961 2 2848.703025 4308.170852 5034.699272 1.000000 960 970 | 962 2 2833.890559 4342.765531 5033.373028 1.000000 961 971 | 963 2 2809.757802 4381.938367 5036.732390 1.000000 962 972 | 964 2 2804.250021 4397.978467 5040.333950 1.000000 963 973 | 965 2 2774.906275 4432.800901 5034.974520 1.000000 964 974 | 966 2 2751.351425 4459.617141 5029.818337 1.000000 965 975 | 967 2 2725.827986 4518.502006 5025.453066 1.000000 966 976 | 968 2 2713.172015 4546.193439 5021.111400 1.000000 967 977 | 969 2 2684.734428 4589.964933 5013.855409 1.000000 968 978 | 970 2 2656.640579 4624.848674 5001.955022 1.000000 969 979 | 971 2 2625.554644 4668.200147 4987.761749 1.000000 970 980 | 972 2 2587.148455 4703.837919 4969.751903 1.000000 971 981 | 973 2 2555.296905 4722.070365 4957.742203 1.000000 972 982 | 974 2 2509.289070 4761.957131 4951.298914 1.000000 973 983 | 975 2 2487.195273 4791.620101 4943.111432 1.000000 974 984 | 976 2 2466.890588 4830.298882 4956.892690 1.000000 975 985 | 977 2 2436.507821 4838.269432 4975.759731 1.000000 976 986 | 978 2 2385.406186 4839.428854 5034.490157 1.000000 977 987 | 979 2 2350.976584 4865.291881 5064.871005 1.000000 978 988 | 980 2 2349.195314 4859.935617 5097.412109 1.000000 979 989 | 981 2 2333.398440 4855.629000 5107.261597 1.000000 980 990 | 982 2 2319.078187 4839.829013 5124.603567 1.000000 981 991 | 983 2 2292.242171 4830.293099 5152.464904 1.000000 982 992 | 984 2 2255.742164 4815.561441 5210.127004 1.000000 983 993 | 985 2 2212.484341 4795.974517 5268.009776 1.000000 984 994 | 986 2 2207.429700 4792.777297 5277.193277 1.000000 985 995 | 987 2 2166.195380 4782.007800 5334.275485 1.000000 986 996 | 988 2 2145.390618 4774.291114 5367.619042 1.000000 987 997 | 989 2 2157.156245 4755.024465 5377.863493 1.000000 988 998 | 990 2 2157.070361 4732.599522 5391.929694 1.000000 989 999 | 991 2 2122.960992 4766.961030 5420.579872 1.000000 988 1000 | 992 2 2121.296943 4759.874885 5450.908278 1.000000 991 1001 | 993 2 2103.804699 4749.665974 5475.273384 1.000000 992 1002 | 994 2 2081.445285 4736.929720 5508.152288 1.000000 993 1003 | 995 2 2033.578176 4709.516472 5636.431438 1.000000 994 1004 | 996 2 1999.640657 4696.296767 5723.060630 1.000000 995 1005 | 997 2 1975.757826 4694.789016 5812.411969 1.000000 996 1006 | 998 2 1952.414050 4672.570425 5869.217014 1.000000 997 1007 | 999 2 1929.757839 4658.669910 5942.880791 1.000000 998 1008 | 1000 2 1909.554748 4641.521472 6021.898225 1.000000 999 1009 | 1001 2 1890.851611 4612.812558 6088.984544 1.000000 1000 1010 | 1002 2 1878.609442 4591.555773 6152.869264 1.000000 1001 1011 | 1003 2 1866.226627 4558.815310 6197.388700 1.000000 1002 1012 | 1004 2 1856.031283 4539.716807 6254.964875 1.000000 1003 1013 | 1005 2 1847.117150 4500.491270 6295.355642 1.000000 1004 1014 | 1006 2 1839.656324 4488.957901 6349.372994 1.000000 1005 1015 | 1007 2 1820.343806 4485.119164 6403.515670 1.000000 1006 1016 | 1008 2 1799.867164 4464.794799 6451.798772 1.000000 1007 1017 | 1009 2 1786.281290 4443.051666 6491.017767 1.000000 1008 1018 | 1010 2 1772.015667 4414.739122 6538.090014 1.000000 1009 1019 | 1011 2 1754.265637 4397.769491 6579.783241 1.000000 1010 1020 | 1012 2 1742.351596 4346.691549 6655.533221 1.000000 1011 1021 | 1013 2 1722.851589 4303.826151 6729.007602 1.000000 1012 1022 | 1014 2 1692.976633 4266.837787 6799.644735 1.000000 1013 1023 | 1015 2 1683.585867 4244.829235 6825.830286 1.000000 1014 1024 | 1016 2 1658.070356 4215.416868 6854.445163 1.000000 1015 1025 | 1017 2 1628.601540 4173.885855 6890.005725 1.000000 1016 1026 | 1018 2 1620.351594 4177.481302 6897.386828 1.000000 1017 1027 | 1019 2 1565.195264 4134.493274 6888.396558 1.000000 1018 1028 | 1020 2 1546.117193 4118.611444 6887.314353 1.000000 1019 1029 | 1021 2 1527.937500 4072.155273 6933.685547 1.000000 1020 1030 | 1022 2 1523.953157 4064.372909 6953.007785 1.000000 1021 1031 | 1023 2 1494.570344 4054.134705 6991.919831 1.000000 1022 1032 | 1024 2 1446.351606 4039.850634 7051.910004 1.000000 1023 1033 | 1025 2 1399.054643 4063.326271 7064.187274 1.000000 1024 1034 | 1026 2 1398.179650 4045.954006 7047.751917 1.000000 1025 1035 | 1027 2 1390.437558 4052.033086 7046.413939 1.000000 1026 1036 | 1028 2 1365.242181 4063.099628 7046.372827 1.000000 1027 1037 | 1029 2 1345.328195 4119.278397 7070.673892 1.000000 1028 1038 | 1030 2 1331.570302 4134.149477 7103.259531 1.000000 1029 1039 | 1031 2 1307.085975 4128.770452 7121.609198 1.000000 1030 1040 | 1032 2 1302.546885 4130.696197 7136.181678 1.000000 1031 1041 | 1033 2 1303.960919 4121.846593 7146.888809 1.000000 1032 1042 | 1034 2 1301.812532 4114.242057 7130.920022 1.000000 1031 1043 | 1035 2 1399.781207 4030.351434 7041.365208 1.000000 1026 1044 | 1036 2 1668.273402 4236.643519 6796.271526 1.000000 1015 1045 | 1037 2 1673.632828 4247.259760 6762.689493 1.000000 1036 1046 | 1038 2 1670.070341 4260.288926 6712.847822 1.000000 1037 1047 | 1039 2 1681.750012 4250.360367 6695.566308 1.000000 1038 1048 | 1040 2 1677.249992 4270.766546 6656.115003 1.000000 1039 1049 | 1041 2 1664.875061 4307.091816 6601.253717 1.000000 1040 1050 | 1042 2 1663.882762 4324.417939 6575.773636 1.000000 1041 1051 | 1043 2 1668.460953 4324.117275 6546.955101 1.000000 1042 1052 | 1044 2 1641.164047 4324.256762 6558.988177 1.000000 1043 1053 | 1045 2 1610.523395 4345.423932 6557.351347 1.000000 1044 1054 | 1046 2 1572.624999 4358.979379 6572.122952 1.000000 1045 1055 | 1047 2 1517.156236 4368.842798 6575.628811 1.000000 1046 1056 | 1048 2 1473.187481 4391.370972 6585.767812 1.000000 1047 1057 | 1049 2 1440.882831 4409.765675 6592.943445 1.000000 1048 1058 | 1050 2 1433.054717 4418.095567 6586.441601 1.000000 1049 1059 | 1051 2 1412.562508 4406.508832 6616.091700 1.000000 1050 1060 | 1052 2 1387.187447 4427.847546 6612.214782 1.000000 1051 1061 | 1053 2 1387.710920 4464.950053 6594.107565 1.000000 1052 1062 | 1054 2 1436.843745 4415.719733 6574.572111 1.000000 1049 1063 | 1055 2 1450.609395 4419.980540 6545.146599 1.000000 1054 1064 | 1056 2 1444.445340 4423.626860 6538.872850 1.000000 1055 1065 | 1057 2 1424.710999 4415.167992 6562.710711 1.000000 1056 1066 | 1058 2 1410.101533 4415.993053 6574.679746 1.000000 1057 1067 | 1059 2 1409.640675 4423.678688 6580.218734 1.000000 1058 1068 | 1060 2 1412.015568 4454.393515 6565.617214 1.000000 1059 1069 | 1061 2 1422.437561 4479.807560 6548.482332 1.000000 1060 1070 | 1062 2 1438.359412 4490.473495 6521.425946 1.000000 1061 1071 | 1063 2 1419.570252 4495.719708 6499.238446 1.000000 1062 1072 | 1064 2 1433.710922 4526.397387 6475.951069 1.000000 1063 1073 | 1065 2 1432.476551 4430.847740 6516.812549 1.000000 1056 1074 | 1066 2 2199.507836 4797.451162 5288.675878 1.000000 986 1075 | 1067 2 2191.703128 4797.518424 5304.654363 1.000000 1066 1076 | 1068 2 2180.914038 4768.968812 5347.724601 1.000000 1067 1077 | 1069 2 2178.749990 4748.023524 5383.082011 1.000000 1068 1078 | 1070 2 2195.578152 4726.195214 5435.339779 1.000000 1069 1079 | 1071 2 2194.406193 4691.155226 5489.751968 1.000000 1070 1080 | 1072 2 2187.562510 4659.546852 5533.505768 1.000000 1071 1081 | 1073 2 2177.421881 4617.387610 5552.521316 1.000000 1072 1082 | 1074 2 2158.546826 4571.029417 5552.333838 1.000000 1073 1083 | 1075 2 2148.695368 4546.382916 5558.029117 1.000000 1074 1084 | 1076 2 2141.187522 4489.996001 5562.322378 1.000000 1075 1085 | 1077 2 2138.914058 4459.075148 5575.327907 1.000000 1076 1086 | 1078 2 2140.421945 4404.514788 5574.070435 1.000000 1077 1087 | 1079 2 2120.429617 4352.166143 5588.452901 1.000000 1078 1088 | 1080 2 2121.085954 4324.698253 5614.701208 1.000000 1079 1089 | 1081 2 2109.726571 4280.456978 5640.806480 1.000000 1080 1090 | 1082 2 2095.210985 4277.653267 5681.095793 1.000000 1081 1091 | 1083 2 2094.414102 4263.773320 5687.804760 1.000000 1082 1092 | 1084 2 2095.460895 4291.879018 5699.863320 1.000000 1083 1093 | 1085 2 2107.468730 4316.420929 5703.429839 1.000000 1084 1094 | 1086 2 2274.609410 4817.123104 5150.996201 1.000000 983 1095 | 1087 2 2266.757795 4798.234321 5144.537192 1.000000 1086 1096 | 1088 2 2230.874982 4746.496059 5148.763690 1.000000 1087 1097 | 1089 2 2239.304662 4765.369242 5139.519580 1.000000 1088 1098 | 1090 2 2246.625017 4767.699360 5126.898513 1.000000 1089 1099 | 1091 2 2984.234402 4083.587972 5020.683617 1.000000 847 1100 | 1092 2 2967.812358 4084.218700 5076.273432 1.000000 1091 1101 | 1093 2 2921.109371 4085.419840 5121.023456 1.000000 1092 1102 | 1094 2 2899.398527 4082.431526 5153.136636 1.000000 1093 1103 | 1095 2 2874.867049 4077.873103 5241.367292 1.000000 1094 1104 | 1096 2 2843.531322 4073.277249 5287.582114 1.000000 1095 1105 | 1097 2 2843.078173 4086.551897 5316.413843 1.000000 1096 1106 | 1098 2 2859.765701 4117.934704 5380.367381 1.000000 1097 1107 | 1099 2 2861.304784 4117.879932 5443.517370 1.000000 1098 1108 | 1100 2 2863.906112 4086.725556 5507.550909 1.000000 1099 1109 | 1101 2 2855.257688 4094.728392 5578.527438 1.000000 1100 1110 | 1102 2 2867.718864 4087.945193 5659.302791 1.000000 1101 1111 | 1103 2 2866.038987 4089.319386 5680.812579 1.000000 1102 1112 | 1104 2 2831.742104 4112.443281 5686.765460 1.000000 1103 1113 | 1105 2 2815.414079 4108.614239 5702.753718 1.000000 1104 1114 | 1106 2 2791.507891 4096.344772 5713.865149 1.000000 1105 1115 | 1107 2 2778.734305 4075.156192 5731.908028 1.000000 1106 1116 | 1108 2 2750.445245 4055.434693 5750.281429 1.000000 1107 1117 | 1109 2 2708.226574 4032.920754 5790.568510 1.000000 1108 1118 | 1110 2 2656.015586 4015.083118 5813.962714 1.000000 1109 1119 | 1111 2 2631.546891 3990.651276 5842.718804 1.000000 1110 1120 | 1112 2 2610.570329 3967.766635 5856.933788 1.000000 1111 1121 | 1113 2 2605.054698 3950.381876 5878.306436 1.000000 1112 1122 | 1114 2 2591.734308 3937.395477 5898.581817 1.000000 1113 1123 | 1115 2 2555.914025 3904.174799 5914.484354 1.000000 1114 1124 | 1116 2 2561.507813 3846.930664 5950.806641 1.000000 1115 1125 | 1117 2 2551.125005 3820.175911 5972.126951 1.000000 1116 1126 | 1118 2 2555.460907 3793.876867 5984.617288 1.000000 1117 1127 | 1119 2 2542.367257 3794.566397 6009.124942 1.000000 1118 1128 | 1120 2 2542.757797 3774.364198 6041.041088 1.000000 1119 1129 | 1121 2 2533.054686 3787.116172 6060.230553 1.000000 1120 1130 | 1122 2 2529.492180 3808.800845 6064.603451 1.000000 1121 1131 | 1123 2 2541.132768 3834.704179 6050.054687 1.000000 1122 1132 | 1124 2 2527.710864 3839.858358 6029.636667 1.000000 1123 1133 | 1125 2 2505.976583 3850.829976 6022.996102 1.000000 1124 1134 | 1126 2 2495.273500 3851.983482 6022.652299 1.000000 1125 1135 | 1127 2 2484.187471 3861.699355 6026.320527 1.000000 1126 1136 | 1128 2 2473.039027 3857.826095 6029.304729 1.000000 1127 1137 | 1129 2 2475.429660 3852.539966 6015.125106 1.000000 1126 1138 | 1130 2 2453.210992 3874.200263 5998.761876 1.000000 1129 1139 | 1131 2 2428.742150 3895.821196 5987.458763 1.000000 1130 1140 | 1132 2 2393.421850 3909.342841 5979.052959 1.000000 1131 1141 | 1133 2 2381.968784 3899.582167 5973.133060 1.000000 1132 1142 | 1134 2 2365.101635 3913.173893 5983.126796 1.000000 1133 1143 | 1135 2 2357.718737 3909.227532 5996.482427 1.000000 1134 1144 | 1136 2 2346.164048 3910.986326 6010.935569 1.000000 1135 1145 | 1137 2 2351.781267 3898.583049 6049.765659 1.000000 1136 1146 | 1138 2 2350.203197 3905.920993 6081.697092 1.000000 1137 1147 | 1139 2 2362.773501 3898.170953 6087.667895 1.000000 1138 1148 | 1140 2 2385.929730 3924.518454 6098.212822 1.000000 1139 1149 | 1141 2 2617.171829 3958.188412 5887.954846 1.000000 1113 1150 | 1142 2 2627.523412 3962.356321 5879.418150 1.000000 1141 1151 | 1143 2 2644.500018 3919.582937 5871.486520 1.000000 1142 1152 | 1144 2 2664.671925 3906.019586 5882.177804 1.000000 1143 1153 | 1145 2 2679.796813 3913.128822 5879.697411 1.000000 1144 1154 | 1146 2 2698.671886 3938.999020 5874.210725 1.000000 1145 1155 | 1147 2 2723.554808 3951.393691 5914.796797 1.000000 1146 1156 | 1148 2 2746.734415 3942.161062 5940.248039 1.000000 1147 1157 | 1149 2 2759.007932 3933.763603 5896.429867 1.000000 1148 1158 | 1150 2 2761.585933 4087.406312 5729.062269 1.000000 1107 1159 | 1151 2 2730.125012 4091.454136 5714.394476 1.000000 1150 1160 | 1152 2 2710.750072 4093.778264 5704.849549 1.000000 1151 1161 | 1153 2 2699.929761 4115.292083 5702.124817 1.000000 1152 1162 | 1154 2 2660.476603 4124.146521 5681.632626 1.000000 1153 1163 | 1155 2 3168.796814 3842.681735 4981.523379 1.000000 841 1164 | 1156 2 3179.984261 3875.925886 4996.771440 1.000000 1155 1165 | 1157 2 3203.968775 3900.208044 5035.005908 1.000000 1156 1166 | 1158 2 3199.359264 3921.376049 5035.275359 1.000000 1157 1167 | 1159 2 3197.109510 3945.704960 5032.787098 1.000000 1158 1168 | 1160 2 3211.468690 3974.899516 5025.648482 1.000000 1159 1169 | 1161 2 3200.390667 3921.514756 5058.263787 1.000000 1158 1170 | 1162 2 3199.093805 3963.965817 5054.222607 1.000000 1161 1171 | 1163 2 3176.101483 3985.565565 5074.851633 1.000000 1162 1172 | 1164 2 3178.976506 4013.458143 5097.332140 1.000000 1163 1173 | 1165 2 3178.390646 4031.924769 5124.361350 1.000000 1164 1174 | 1166 2 3168.648566 4048.025323 5136.513647 1.000000 1165 1175 | 1167 2 3164.390679 4041.150250 5159.947150 1.000000 1166 1176 | 1168 2 3142.601458 4058.217851 5190.861216 1.000000 1167 1177 | 1169 2 3130.218768 4073.104611 5204.345692 1.000000 1168 1178 | 1170 2 3124.812540 4078.647435 5219.734268 1.000000 1169 1179 | 1171 2 3132.070268 4090.983282 5245.689545 1.000000 1170 1180 | 1172 2 3095.484268 4088.468766 5296.732487 1.000000 1171 1181 | 1173 2 3072.492235 4100.454932 5307.242033 1.000000 1172 1182 | 1174 2 3059.406206 4125.424836 5323.175628 1.000000 1173 1183 | 1175 2 3077.515627 4152.272354 5351.103313 1.000000 1174 1184 | 1176 2 3110.414207 4180.903283 5391.570541 1.000000 1175 1185 | 1177 2 3168.804757 4188.951047 5424.509656 1.000000 1176 1186 | 1178 2 3180.843706 4185.116357 5455.673881 1.000000 1177 1187 | 1179 2 4136.695271 3224.263734 4064.527364 1.000000 112 1188 | 1180 2 4127.593697 3221.671985 4065.609305 1.000000 1179 1189 | 1181 2 4126.390686 3210.227604 4049.052690 1.000000 1180 1190 | 1182 2 4101.023569 3216.355450 3997.298938 1.000000 1181 1191 | 1183 2 4023.187372 3231.889504 3934.558593 1.000000 1182 1192 | 1184 2 3994.828126 3253.623079 3899.060436 1.000000 1183 1193 | 1185 2 3958.742238 3267.430787 3854.669894 1.000000 1184 1194 | 1186 2 3935.429641 3271.655408 3846.525368 1.000000 1185 1195 | 1187 2 3884.851605 3270.246091 3827.123002 1.000000 1186 1196 | 1188 2 3869.859307 3273.535987 3815.517478 1.000000 1187 1197 | 1189 2 3798.921894 3282.715806 3768.996191 1.000000 1188 1198 | 1190 2 3772.578029 3295.477668 3720.615322 1.000000 1189 1199 | 1191 2 3749.062450 3304.748035 3690.640511 1.000000 1190 1200 | 1192 2 3746.187583 3318.277447 3660.873073 1.000000 1191 1201 | 1193 2 3714.656213 3359.116087 3625.302800 1.000000 1192 1202 | 1194 2 3687.296869 3409.454004 3621.904399 1.000000 1193 1203 | 1195 2 3658.726431 3473.490223 3607.867101 1.000000 1194 1204 | 1196 2 3635.304738 3519.093833 3592.347663 1.000000 1195 1205 | 1197 2 3607.960811 3615.366157 3582.681611 1.000000 1196 1206 | 1198 2 3591.351602 3689.583036 3570.982369 1.000000 1197 1207 | 1199 2 3577.984476 3726.484289 3555.328171 1.000000 1198 1208 | 1200 2 3561.632868 3772.268553 3552.824242 1.000000 1199 1209 | 1201 2 3574.726457 3778.470768 3539.050694 1.000000 1200 1210 | 1202 2 3591.796986 3796.093719 3528.615142 1.000000 1201 1211 | 1203 2 3589.234314 3817.985339 3509.287065 1.000000 1202 1212 | 1204 2 3627.898548 3776.771421 3485.714782 1.000000 1203 1213 | 1205 2 3640.586034 3740.941275 3466.201224 1.000000 1204 1214 | 1206 2 3687.898492 3691.925844 3438.093781 1.000000 1205 1215 | 1207 2 3743.203092 3641.567456 3395.695395 1.000000 1206 1216 | 1208 2 3787.851660 3583.474715 3363.214763 1.000000 1207 1217 | 1209 2 3839.000071 3521.296931 3325.730508 1.000000 1208 1218 | 1210 2 3871.601699 3474.594722 3300.748124 1.000000 1209 1219 | 1211 2 3879.718679 3442.275536 3284.099671 1.000000 1210 1220 | 1212 2 3905.054831 3396.447175 3237.859492 1.000000 1211 1221 | 1213 2 3934.718706 3332.221615 3182.419991 1.000000 1212 1222 | 1214 2 3937.179622 3267.678789 3110.523440 1.000000 1213 1223 | 1215 2 3930.046928 3228.970764 3073.740245 1.000000 1214 1224 | 1216 2 3921.312479 3204.601534 3025.107307 1.000000 1215 1225 | 1217 2 3924.359296 3172.961015 2961.552786 1.000000 1216 1226 | 1218 2 3934.077999 3132.681517 2901.007770 1.000000 1217 1227 | 1219 2 3962.375009 3077.582162 2931.279264 1.000000 1218 1228 | 1220 2 3951.960960 3052.448230 2957.083946 1.000000 1219 1229 | 1221 2 3991.992113 3070.893519 2913.775373 1.000000 1219 1230 | 1222 2 4017.085894 3056.865160 2900.089903 1.000000 1221 1231 | 1223 2 4048.343782 3035.280339 2917.056702 1.000000 1222 1232 | 1224 2 4098.304830 3056.035083 2967.498022 1.000000 1223 1233 | 1225 2 4142.054659 3066.178684 2992.617218 1.000000 1224 1234 | 1226 2 4135.195438 3062.147355 3040.880765 1.000000 1225 1235 | 1227 2 4113.828236 3068.488145 3053.697313 1.000000 1226 1236 | 1228 2 4080.007903 3089.233368 3099.638692 1.000000 1227 1237 | 1229 2 4091.663979 3089.349747 3129.310638 1.000000 1228 1238 | 1230 2 3937.218713 3100.796987 2856.173823 1.000000 1218 1239 | 1231 2 3953.515655 3054.933493 2804.847623 1.000000 1230 1240 | 1232 2 3959.101525 3017.981333 2755.128919 1.000000 1231 1241 | 1233 2 3960.000060 2971.490164 2698.576142 1.000000 1232 1242 | 1234 2 3953.460793 2942.377817 2653.189510 1.000000 1233 1243 | 1235 2 3955.593679 2923.989227 2624.898378 1.000000 1234 1244 | 1236 2 3949.648332 2879.064554 2562.994156 1.000000 1235 1245 | 1237 2 3940.656283 2844.118019 2517.746118 1.000000 1236 1246 | 1238 2 3976.179609 2847.719682 2513.976570 1.000000 1237 1247 | 1239 2 4009.117321 2825.640633 2497.427681 1.000000 1238 1248 | 1240 2 4046.562575 2782.044997 2480.792929 1.000000 1239 1249 | 1241 2 4055.672006 2748.031157 2458.872988 1.000000 1240 1250 | 1242 2 4093.851587 2697.873126 2443.886705 1.000000 1241 1251 | 1243 2 4102.687630 2669.088919 2422.572230 1.000000 1242 1252 | 1244 2 4113.851508 2671.289932 2422.503881 1.000000 1243 1253 | 1245 2 4085.703155 2685.429573 2437.554626 1.000000 1242 1254 | 1246 2 4065.164133 2683.081936 2427.992186 1.000000 1245 1255 | 1247 2 4054.211056 2690.881732 2383.587941 1.000000 1246 1256 | 1248 2 4019.671944 2687.784091 2355.263634 1.000000 1247 1257 | 1249 2 3992.718669 2677.879953 2335.919975 1.000000 1248 1258 | 1250 2 3962.515501 2651.565492 2310.277357 1.000000 1249 1259 | 1251 2 3932.554802 2636.329226 2299.859415 1.000000 1250 1260 | 1252 2 3904.585815 2620.078059 2267.644549 1.000000 1251 1261 | 1253 2 3892.937627 2620.437619 2259.033179 1.000000 1252 1262 | 1254 2 3872.429765 2618.800651 2248.706974 1.000000 1253 1263 | 1255 2 3881.031103 2594.950256 2222.470644 1.000000 1254 1264 | 1256 2 3872.757758 2610.358285 2207.021427 1.000000 1255 1265 | 1257 2 3857.960815 2591.598661 2187.880919 1.000000 1256 1266 | 1258 2 3975.898540 2904.967716 2629.429743 1.000000 1235 1267 | 1259 2 3999.804770 2900.263617 2646.716746 1.000000 1258 1268 | 1260 2 4045.539177 2879.494253 2636.058578 1.000000 1259 1269 | 1261 2 4085.992082 2843.191271 2625.115245 1.000000 1260 1270 | 1262 2 4111.906160 2821.982518 2625.066378 1.000000 1261 1271 | 1263 2 4143.484519 2787.997205 2628.113317 1.000000 1262 1272 | 1264 2 4130.874943 2786.732538 2639.769569 1.000000 1263 1273 | 1265 2 4139.336017 2778.593879 2678.609427 1.000000 1264 1274 | 1266 2 4165.968776 2798.375071 2717.091750 1.000000 1265 1275 | 1267 2 4184.922019 2819.426804 2755.960986 1.000000 1266 1276 | 1268 2 4197.687413 2854.088919 2798.423852 1.000000 1267 1277 | 1269 2 4206.172014 2868.099579 2827.226588 1.000000 1268 1278 | 1270 2 4214.742108 2868.663945 2864.169887 1.000000 1269 1279 | 1271 2 4210.867305 2898.696424 2893.269484 1.000000 1270 1280 | 1272 2 4198.320390 2933.603494 2925.365247 1.000000 1271 1281 | 1273 2 4181.445403 2989.761744 2982.269579 1.000000 1272 1282 | 1274 2 4166.343724 3047.855600 3048.865217 1.000000 1273 1283 | 1275 2 4166.390611 3070.752877 3083.767524 1.000000 1274 1284 | 1276 2 3941.023297 2965.691377 2639.787099 1.000000 1234 1285 | 1277 2 3928.859491 2998.314492 2605.240181 1.000000 1276 1286 | 1278 2 3891.492084 2999.556535 2551.107426 1.000000 1277 1287 | 1279 2 3845.156206 2996.420817 2492.158255 1.000000 1278 1288 | 1280 2 3790.749976 3004.058704 2444.285100 1.000000 1279 1289 | 1281 2 3748.062560 3002.900321 2404.515608 1.000000 1280 1290 | 1282 2 3706.484256 2996.763751 2335.818352 1.000000 1281 1291 | 1283 2 3664.913922 2989.973497 2291.142622 1.000000 1282 1292 | 1284 2 3603.250015 3000.824341 2211.511734 1.000000 1283 1293 | 1285 2 3548.773449 2995.769558 2225.521446 1.000000 1284 1294 | 1286 2 3514.929695 2979.513735 2242.259748 1.000000 1285 1295 | 1287 2 3485.468875 3000.969587 2257.408188 1.000000 1286 1296 | 1288 2 3445.788945 3019.662166 2284.746126 1.000000 1287 1297 | 1289 2 3450.046827 3020.157347 2301.839858 1.000000 1288 1298 | 1290 2 3613.195315 3028.312630 2200.613297 1.000000 1284 1299 | 1291 2 3652.328150 3024.333138 2185.033159 1.000000 1290 1300 | 1292 2 3937.460798 3073.935507 2785.980487 1.000000 1231 1301 | 1293 2 3893.242126 3103.035241 2821.957038 1.000000 1292 1302 | 1294 2 3882.632914 3130.249923 2835.744084 1.000000 1293 1303 | 1295 2 3881.921970 3160.054616 2878.109417 1.000000 1294 1304 | 1296 2 3887.054699 3173.972708 2923.203161 1.000000 1295 1305 | 1297 2 3906.960937 3161.060424 2960.742226 1.000000 1296 1306 | 1298 2 3926.335917 3162.478657 2986.845728 1.000000 1297 1307 | 1299 2 3925.585974 3157.626876 3025.962771 1.000000 1298 1308 | 1300 2 3941.578134 3171.245003 3072.857457 1.000000 1299 1309 | 1301 2 3925.453224 3199.085075 3094.150293 1.000000 1300 1310 | 1302 2 3900.820407 3224.955044 3086.042986 1.000000 1301 1311 | 1303 2 3876.554599 3201.786155 3035.921791 1.000000 1302 1312 | 1304 2 3869.953218 3179.253803 2992.560526 1.000000 1303 1313 | 1305 2 3863.804748 3156.139638 2967.962893 1.000000 1304 1314 | 1306 2 3870.203078 3133.028462 2964.990234 1.000000 1305 1315 | 1307 2 3899.570221 3120.464847 2963.359375 1.000000 1306 1316 | 1308 2 3914.406265 3091.425661 2956.791043 1.000000 1307 1317 | 1309 2 3920.203042 3093.156214 2960.943415 1.000000 1308 1318 | 1310 2 3841.726485 3117.383778 2814.683551 1.000000 1293 1319 | 1311 2 3825.820211 3118.198320 2807.523456 1.000000 1310 1320 | 1312 2 3795.671842 3137.563391 2803.328107 1.000000 1311 1321 | 1313 2 3769.335899 3158.415991 2800.335890 1.000000 1312 1322 | 1314 2 3723.507668 3183.653241 2791.613249 1.000000 1313 1323 | 1315 2 3692.523458 3182.128805 2770.812515 1.000000 1314 1324 | 1316 2 3673.765518 3186.691459 2755.755899 1.000000 1315 1325 | 1317 2 3627.085948 3166.849711 2742.472715 1.000000 1316 1326 | 1318 2 3608.882897 3171.795959 2724.220693 1.000000 1317 1327 | 1319 2 3560.492294 3188.866304 2677.509727 1.000000 1318 1328 | 1320 2 3597.742273 3151.437500 2701.244165 1.000000 1318 1329 | 1321 2 3575.093675 3144.116093 2691.212931 1.000000 1320 1330 | 1322 2 3574.109315 3118.801803 2668.019586 1.000000 1321 1331 | 1323 2 3593.312631 3113.224640 2627.353494 1.000000 1322 1332 | 1324 2 3619.476510 3121.524519 2639.199177 1.000000 1323 1333 | 1325 2 3644.890636 3136.022486 2669.933576 1.000000 1324 1334 | 1326 2 3941.000020 3111.224681 2824.205127 1.000000 1230 1335 | 1327 2 3943.132806 3103.998116 2784.816443 1.000000 1326 1336 | 1328 2 3952.648399 3106.592779 2737.421829 1.000000 1327 1337 | 1329 2 3957.484319 3051.472625 2736.224611 1.000000 1328 1338 | 1330 2 3985.593872 2995.804718 2714.501925 1.000000 1329 1339 | 1331 2 4021.937542 2947.472671 2699.126923 1.000000 1330 1340 | 1332 2 4063.179719 2896.540140 2709.408171 1.000000 1331 1341 | 1333 2 4116.187448 2862.450084 2717.685523 1.000000 1332 1342 | 1334 2 4134.085885 2852.670834 2716.095681 1.000000 1333 1343 | 1335 2 4133.695343 2820.952218 2718.578093 1.000000 1334 1344 | 1336 2 4159.929735 2787.309532 2722.398435 1.000000 1335 1345 | 1337 2 4183.976558 2752.460919 2712.369142 1.000000 1336 1346 | 1338 2 4197.445241 2719.280356 2713.974597 1.000000 1337 1347 | 1339 2 4219.984320 2686.422005 2693.517604 1.000000 1338 1348 | 1340 2 4252.484250 2641.229594 2663.140633 1.000000 1339 1349 | 1341 2 4285.023295 2622.078256 2619.205032 1.000000 1340 1350 | 1342 2 4299.367164 2602.603581 2606.583936 1.000000 1341 1351 | 1343 2 4334.468824 2590.043100 2580.890640 1.000000 1342 1352 | 1344 2 4345.515559 2545.603381 2544.150331 1.000000 1343 1353 | 1345 2 4348.281219 2536.777217 2523.060558 1.000000 1344 1354 | 1346 2 4353.859241 2518.933673 2500.605468 1.000000 1345 1355 | 1347 2 4357.695415 2512.830026 2487.037053 1.000000 1346 1356 | 1348 2 4360.507801 2483.797892 2447.312509 1.000000 1347 1357 | 1349 2 4348.351587 2466.867170 2433.712937 1.000000 1348 1358 | 1350 2 4347.898429 2526.555761 2509.835877 1.000000 1345 1359 | 1351 2 4357.765506 2541.552768 2458.892567 1.000000 1350 1360 | 1352 2 4346.171743 2542.833040 2432.677677 1.000000 1351 1361 | 1353 2 4336.390724 2548.366338 2420.482445 1.000000 1352 1362 | 1354 2 4325.000022 2530.696174 2402.632814 1.000000 1353 1363 | 1355 2 4293.593744 2570.936574 2593.388619 1.000000 1342 1364 | 1356 2 4313.211034 2540.438577 2578.697295 1.000000 1355 1365 | 1357 2 4300.812566 2501.354626 2607.039017 1.000000 1356 1366 | 1358 2 4307.781238 2508.022346 2630.570367 1.000000 1357 1367 | 1359 2 4349.882781 2520.223546 2673.957085 1.000000 1358 1368 | 1360 2 4373.320193 2543.724515 2705.908250 1.000000 1359 1369 | 1361 2 4376.968660 2580.428598 2768.275376 1.000000 1360 1370 | 1362 2 4380.718758 2576.032357 2791.888712 1.000000 1361 1371 | 1363 2 4384.992203 2585.646341 2819.980477 1.000000 1362 1372 | 1364 2 4362.359248 2595.365318 2863.792926 1.000000 1363 1373 | 1365 2 4375.679667 2570.169853 2896.048877 1.000000 1364 1374 | 1366 2 4348.460999 2510.879940 2873.498101 1.000000 1365 1375 | 1367 2 4346.984506 2469.773578 2826.593713 1.000000 1366 1376 | 1368 2 3965.382831 3099.322401 2700.240218 1.000000 1328 1377 | 1369 2 3966.679687 3080.229493 2658.115235 1.000000 1368 1378 | 1370 2 3978.804561 3066.490150 2636.699264 1.000000 1369 1379 | 1371 2 3988.445431 3069.694217 2572.918024 1.000000 1370 1380 | 1372 2 4079.664085 3057.646532 2559.201228 1.000000 1371 1381 | 1373 2 4114.445259 3042.058694 2575.275382 1.000000 1372 1382 | 1374 2 4149.218721 3000.857315 2598.347659 1.000000 1373 1383 | 1375 2 4182.140762 2919.076153 2595.316395 1.000000 1374 1384 | 1376 2 4176.851526 2874.824288 2575.230451 1.000000 1375 1385 | 1377 2 4182.281217 2837.184655 2575.931596 1.000000 1376 1386 | 1378 2 4195.757703 2757.969804 2548.050770 1.000000 1377 1387 | 1379 2 4185.484386 2725.156176 2542.117157 1.000000 1378 1388 | 1380 2 4171.242227 2716.020447 2540.914061 1.000000 1379 1389 | 1381 2 3983.687370 3062.126990 2606.265666 1.000000 1369 1390 | 1382 2 3914.226432 3192.744144 2985.837877 1.000000 1216 1391 | 1383 2 3906.171824 3168.932548 2947.894502 1.000000 1382 1392 | 1384 2 3882.929690 3149.731570 2916.111369 1.000000 1383 1393 | 1385 2 3862.406189 3124.099710 2874.810544 1.000000 1384 1394 | 1386 2 3830.562646 3093.054777 2853.175752 1.000000 1385 1395 | 1387 2 3794.609354 3069.586770 2816.578110 1.000000 1386 1396 | 1388 2 3761.234440 3046.368188 2779.953107 1.000000 1387 1397 | 1389 2 3755.343677 3043.123135 2772.255828 1.000000 1388 1398 | 1390 2 3732.031312 3030.688512 2751.453105 1.000000 1389 1399 | 1391 2 3691.187540 3035.989335 2732.882781 1.000000 1390 1400 | 1392 2 3669.476519 3035.040181 2719.261771 1.000000 1391 1401 | 1393 2 3664.101526 3049.541135 2743.765614 1.000000 1392 1402 | 1394 2 3640.968812 3070.419805 2763.898475 1.000000 1393 1403 | 1395 2 3612.336008 3085.436503 2775.845709 1.000000 1394 1404 | 1396 2 3601.820379 3107.936607 2784.132762 1.000000 1395 1405 | 1397 2 3631.125011 3099.177601 2778.126915 1.000000 1396 1406 | 1398 2 3646.164131 3080.349572 2760.705121 1.000000 1397 1407 | 1399 2 3627.335924 3068.623883 2761.035199 1.000000 1398 1408 | 1400 2 3621.343731 3041.062394 2759.789096 1.000000 1399 1409 | 1401 2 3598.336024 2999.852574 2714.544869 1.000000 1400 1410 | 1402 2 3609.898303 2996.616328 2699.681677 1.000000 1401 1411 | 1403 2 3612.570444 2983.483388 2694.207068 1.000000 1402 1412 | 1404 2 3621.765586 3039.313616 2715.785148 1.000000 1392 1413 | 1405 2 3603.484251 3040.615349 2717.908163 1.000000 1404 1414 | 1406 2 3562.492230 3031.940283 2722.992239 1.000000 1405 1415 | 1407 2 3541.742263 3027.837962 2726.689447 1.000000 1406 1416 | 1408 2 3504.093772 3040.541036 2751.419885 1.000000 1407 1417 | 1409 2 3482.921813 3023.164003 2773.599574 1.000000 1408 1418 | 1410 2 3606.523311 3040.576307 2696.250041 1.000000 1404 1419 | 1411 2 3578.117129 3044.757759 2700.543015 1.000000 1410 1420 | 1412 2 3509.359329 3031.761613 2675.589904 1.000000 1411 1421 | 1413 2 3493.601471 3025.535201 2657.273406 1.000000 1412 1422 | 1414 2 3484.898320 3002.412058 2644.650379 1.000000 1413 1423 | 1415 2 3743.437596 3016.419781 2781.876895 1.000000 1389 1424 | 1416 2 3821.687612 3111.109306 2853.378904 1.000000 1386 1425 | 1417 2 3770.945337 3167.700239 2859.376899 1.000000 1416 1426 | 1418 2 3760.398371 3197.538030 2868.658143 1.000000 1417 1427 | 1419 2 3725.242282 3237.519567 2905.048844 1.000000 1418 1428 | 1420 2 3711.640733 3272.028258 2921.382776 1.000000 1419 1429 | 1421 2 3693.273391 3323.171820 2967.980507 1.000000 1420 1430 | 1422 2 3688.210858 3342.128042 2981.349558 1.000000 1421 1431 | 1423 2 3692.882896 3359.559638 3017.097720 1.000000 1422 1432 | 1424 2 3682.031179 3378.330167 3047.642672 1.000000 1423 1433 | 1425 2 3754.062496 3230.641477 2841.792992 1.000000 1418 1434 | 1426 2 3757.663986 3294.554580 2762.960972 1.000000 1425 1435 | 1427 2 3765.843796 3336.433514 2757.060552 1.000000 1426 1436 | 1428 2 3755.820192 3381.846728 2749.718792 1.000000 1427 1437 | 1429 2 3758.023292 3415.718827 2738.734332 1.000000 1428 1438 | 1430 2 3766.898462 3431.718686 2735.419952 1.000000 1429 1439 | 1431 2 3751.445400 3448.161212 2714.482361 1.000000 1430 1440 | 1432 2 3749.031211 3475.072339 2693.576119 1.000000 1431 1441 | 1433 2 3554.898299 3781.388757 3552.076150 1.000000 1200 1442 | 1434 2 3526.273454 3796.722551 3560.115356 1.000000 1433 1443 | 1435 2 3508.171963 3828.855610 3554.199154 1.000000 1434 1444 | 1436 2 3479.593767 3869.112210 3561.689532 1.000000 1435 1445 | 1437 2 3443.336073 3914.289962 3555.619194 1.000000 1436 1446 | 1438 2 3422.648500 3954.754791 3550.363171 1.000000 1437 1447 | 1439 2 3378.539189 3996.447254 3577.964731 1.000000 1438 1448 | 1440 2 3316.382822 4023.692496 3620.542881 1.000000 1439 1449 | 1441 2 3261.484357 4067.496071 3673.943479 1.000000 1440 1450 | 1442 2 3234.898548 4067.094744 3688.556702 1.000000 1441 1451 | 1443 2 3224.109433 4077.340953 3708.095621 1.000000 1442 1452 | 1444 2 3196.468768 4073.975557 3745.349615 1.000000 1443 1453 | 1445 2 3152.343677 4065.693233 3798.818414 1.000000 1444 1454 | 1446 2 3136.890494 4057.699153 3807.769410 1.000000 1445 1455 | 1447 2 3107.742148 4079.200124 3823.322364 1.000000 1446 1456 | 1448 2 3085.546791 4101.992235 3837.761782 1.000000 1447 1457 | 1449 2 3041.695249 4101.399541 3892.193454 1.000000 1448 1458 | 1450 2 3016.077989 4085.326248 3929.206998 1.000000 1449 1459 | 1451 2 2997.671876 4078.748980 3968.709096 1.000000 1450 1460 | 1452 2 2992.999953 4054.916008 3984.855510 1.000000 1451 1461 | 1453 2 2978.788944 4058.079194 4020.257874 1.000000 1452 1462 | 1454 2 2963.828237 4052.506779 4044.038958 1.000000 1453 1463 | 1455 2 2935.812378 4070.419933 4068.203154 1.000000 1454 1464 | 1456 2 2908.789071 4039.749053 4090.634758 1.000000 1455 1465 | 1457 2 2878.156305 3989.129783 4133.216738 1.000000 1456 1466 | 1458 2 3094.351561 4068.583911 3839.218763 1.000000 1447 1467 | 1459 2 3104.101510 4049.293008 3833.890684 1.000000 1446 1468 | 1460 2 3083.007673 4024.239306 3873.501922 1.000000 1459 1469 | 1461 2 3056.296868 4015.572226 3906.841813 1.000000 1460 1470 | 1462 2 3020.531348 4020.275296 3934.453080 1.000000 1461 1471 | 1463 2 2989.148534 4055.248043 3958.216836 1.000000 1462 1472 | 1464 2 2931.773380 4068.241198 3943.142648 1.000000 1463 1473 | 1465 2 2894.687572 4098.010740 3939.579967 1.000000 1464 1474 | 1466 2 2848.375110 4122.892720 3912.986313 1.000000 1465 1475 | 1467 2 2815.226430 4145.250093 3878.626986 1.000000 1466 1476 | 1468 2 2801.562455 4148.414921 3848.308596 1.000000 1467 1477 | 1469 2 2782.828009 4157.617330 3819.111407 1.000000 1468 1478 | 1470 2 2760.335850 4153.269517 3783.226481 1.000000 1469 1479 | 1471 2 2726.312434 4154.557640 3739.576177 1.000000 1470 1480 | 1472 2 2718.062462 4157.394673 3736.648423 1.000000 1471 1481 | 1473 2 2697.695412 4163.867265 3731.876992 1.000000 1472 1482 | 1474 2 2678.015526 4186.080934 3723.622960 1.000000 1473 1483 | 1475 2 2647.710883 4179.648311 3736.019577 1.000000 1474 1484 | 1476 2 2620.546785 4178.738143 3763.421790 1.000000 1475 1485 | 1477 2 2635.570268 4168.920839 3793.669999 1.000000 1476 1486 | 1478 2 2639.664143 4173.850674 3821.539082 1.000000 1477 1487 | 1479 2 2629.164003 4190.550907 3820.369212 1.000000 1478 1488 | 1480 2 2621.875111 4204.222783 3799.478631 1.000000 1479 1489 | 1481 2 2628.976482 4234.407329 3779.540900 1.000000 1480 1490 | 1482 2 2621.921965 4250.760815 3787.095595 1.000000 1481 1491 | 1483 2 2637.007742 4271.190466 3790.089757 1.000000 1482 1492 | 1484 2 2683.437412 4142.193485 3735.935570 1.000000 1472 1493 | 1485 2 3090.304761 4048.851460 3829.384795 1.000000 1459 1494 | 1486 2 3085.203103 4020.222719 3841.716868 1.000000 1485 1495 | 1487 2 3027.468631 3956.605448 3839.105574 1.000000 1486 1496 | 1488 2 2996.703125 3906.371226 3841.033084 1.000000 1487 1497 | 1489 2 2985.070194 3851.795853 3832.251844 1.000000 1488 1498 | 1490 2 2978.281251 3777.875055 3837.800735 1.000000 1489 1499 | 1491 2 2976.671891 3715.056593 3832.624986 1.000000 1490 1500 | 1492 2 2982.851436 3658.499010 3817.913945 1.000000 1491 1501 | 1493 2 2990.867131 3644.123917 3821.015688 1.000000 1492 1502 | 1494 2 3027.359518 3606.679549 3810.968860 1.000000 1493 1503 | 1495 2 3068.632768 3579.907263 3778.892512 1.000000 1494 1504 | 1496 2 3080.617249 3574.974746 3751.433646 1.000000 1495 1505 | 1497 2 3106.929540 3558.249048 3730.872998 1.000000 1496 1506 | 1498 2 3118.968777 3567.042924 3702.101484 1.000000 1497 1507 | 1499 2 3132.328183 3569.117188 3670.914164 1.000000 1498 1508 | 1500 2 3149.398332 3574.007673 3649.126955 1.000000 1499 1509 | 1501 2 3160.476509 3580.864378 3639.441298 1.000000 1500 1510 | 1502 2 3145.507675 3540.719772 3652.787146 1.000000 1499 1511 | 1503 2 3181.500065 3505.287205 3622.419972 1.000000 1502 1512 | 1504 2 3226.749966 3495.061541 3573.292892 1.000000 1503 1513 | 1505 2 3241.468726 3501.401365 3570.687411 1.000000 1504 1514 | 1506 2 3130.788975 3567.486398 3692.552621 1.000000 1498 1515 | 1507 2 3150.492131 3567.412211 3683.833946 1.000000 1506 1516 | 1508 2 3006.031278 3625.866074 3836.261654 1.000000 1493 1517 | 1509 2 3063.203268 3596.244277 3865.488258 1.000000 1508 1518 | 1510 2 3114.328257 3581.572246 3878.826289 1.000000 1509 1519 | 1511 2 3161.851577 3557.023509 3916.845768 1.000000 1510 1520 | 1512 2 3194.343825 3540.688404 3907.538995 1.000000 1511 1521 | 1513 2 3479.679788 3830.694400 3553.371202 1.000000 1435 1522 | 1514 2 3429.257805 3849.814330 3570.615259 1.000000 1513 1523 | 1515 2 3373.117143 3882.079038 3566.095717 1.000000 1514 1524 | 1516 2 3318.992284 3920.521552 3564.226552 1.000000 1515 1525 | 1517 2 3253.015753 3952.647465 3556.476504 1.000000 1516 1526 | 1518 2 3214.210792 3970.659130 3561.857488 1.000000 1517 1527 | 1519 2 3175.281384 3995.899420 3551.279354 1.000000 1518 1528 | 1520 2 3154.664131 4002.973734 3547.386659 1.000000 1519 1529 | 1521 2 3093.640682 4010.889644 3540.710937 1.000000 1520 1530 | 1522 2 3088.656131 3993.085074 3560.240337 1.000000 1521 1531 | 1523 2 3073.671906 4004.567353 3570.316413 1.000000 1522 1532 | 1524 2 3030.429652 4028.488175 3582.234409 1.000000 1523 1533 | 1525 2 2982.421872 4042.112302 3583.322293 1.000000 1524 1534 | 1526 2 2948.179617 4081.416075 3597.062397 1.000000 1525 1535 | 1527 2 2915.429644 4121.258726 3604.048858 1.000000 1526 1536 | 1528 2 2876.476500 4142.958863 3614.283168 1.000000 1527 1537 | 1529 2 2863.632787 4158.494100 3611.849493 1.000000 1528 1538 | 1530 2 2820.679617 4170.208892 3614.765678 1.000000 1529 1539 | 1531 2 2781.336054 4148.776349 3631.078024 1.000000 1530 1540 | 1532 2 2751.476509 4162.349624 3642.042936 1.000000 1531 1541 | 1533 2 2734.156300 4178.661124 3645.404417 1.000000 1532 1542 | 1534 2 2718.992313 4215.410187 3680.117288 1.000000 1533 1543 | 1535 2 2725.367093 4222.105348 3708.521423 1.000000 1534 1544 | 1536 2 2720.367212 4233.433495 3728.558585 1.000000 1535 1545 | 1537 2 2697.234260 4213.753777 3738.744043 1.000000 1536 1546 | 1538 2 2704.351598 4195.077217 3729.308707 1.000000 1537 1547 | 1539 2 2845.859353 4188.998010 3606.453153 1.000000 1529 1548 | 1540 2 2814.648454 4249.435584 3658.052710 1.000000 1539 1549 | 1541 2 2793.734390 4226.837747 3676.902438 1.000000 1540 1550 | 1542 2 2748.304780 4210.288105 3712.824251 1.000000 1541 1551 | 1543 2 2728.476589 4216.244029 3723.558550 1.000000 1542 1552 | 1544 2 2716.890595 4209.645547 3728.599547 1.000000 1543 1553 | 1545 2 2673.445206 4213.054735 3721.373118 1.000000 1544 1554 | 1546 2 2621.625097 4217.526293 3703.578087 1.000000 1545 1555 | 1547 2 2577.976443 4238.112190 3719.306689 1.000000 1546 1556 | 1548 2 3151.038959 4001.783260 3524.800865 1.000000 1520 1557 | 1549 2 3149.773298 4002.984516 3517.999979 1.000000 1548 1558 | 1550 2 3141.679557 3989.445273 3509.445282 1.000000 1549 1559 | 1551 2 3114.476522 3953.316530 3522.035277 1.000000 1550 1560 | 1552 2 3073.460885 3931.944325 3507.002002 1.000000 1551 1561 | 1553 2 3020.898469 3894.178751 3500.937400 1.000000 1552 1562 | 1554 2 2981.327991 3862.228512 3492.019524 1.000000 1553 1563 | 1555 2 2961.601632 3861.103512 3480.919867 1.000000 1554 1564 | 1556 2 2928.515663 3874.967664 3477.796862 1.000000 1555 1565 | 1557 2 2894.937579 3880.964839 3473.332012 1.000000 1556 1566 | 1558 2 2862.984433 3900.393424 3486.980463 1.000000 1557 1567 | 1559 2 2829.609317 3914.981447 3500.357409 1.000000 1558 1568 | 1560 2 3155.445267 4004.869237 3501.158110 1.000000 1549 1569 | 1561 2 3151.664145 4003.015551 3456.208896 1.000000 1560 1570 | 1562 2 3124.828148 3983.046728 3419.658270 1.000000 1561 1571 | 1563 2 3101.429554 3952.917065 3409.910039 1.000000 1562 1572 | 1564 2 3086.101707 3911.120948 3399.466682 1.000000 1563 1573 | 1565 2 3084.812501 3876.988302 3405.787180 1.000000 1564 1574 | 1566 2 3102.492237 3826.804741 3419.916092 1.000000 1565 1575 | 1567 2 3109.671823 3803.798840 3444.632834 1.000000 1566 1576 | 1568 2 3087.945252 3783.730395 3472.566364 1.000000 1567 1577 | 1569 2 3042.328033 3793.879902 3507.953060 1.000000 1568 1578 | 1570 2 3007.203070 3826.051621 3547.449255 1.000000 1569 1579 | 1571 2 2995.507676 3842.655196 3559.962927 1.000000 1570 1580 | 1572 2 2971.999910 3867.823118 3582.011613 1.000000 1571 1581 | 1573 2 2956.023387 3871.956971 3597.273503 1.000000 1572 1582 | 1574 2 2960.093823 3831.263609 3550.281232 1.000000 1571 1583 | 1575 2 2930.273571 3834.663998 3554.232300 1.000000 1574 1584 | 1576 2 2898.593772 3861.811468 3547.652434 1.000000 1575 1585 | 1577 2 2890.226598 3851.297911 3519.568312 1.000000 1576 1586 | 1578 2 2888.531277 3857.276251 3501.732398 1.000000 1577 1587 | 1579 2 2883.921873 3842.298845 3476.111208 1.000000 1578 1588 | 1580 2 2876.906156 3832.399299 3439.478445 1.000000 1579 1589 | 1581 2 2870.562425 3838.058546 3429.795040 1.000000 1580 1590 | 1582 2 2872.320175 3831.083951 3408.183528 1.000000 1581 1591 | 1583 2 2866.687460 3836.104479 3395.572162 1.000000 1582 1592 | 1584 2 3334.406170 3885.370216 3586.556562 1.000000 1515 1593 | 1585 2 3878.882728 3278.053711 3803.984484 1.000000 1188 1594 | 1586 2 3890.335854 3304.508647 3781.007824 1.000000 1585 1595 | 1587 2 3901.359350 3414.610341 3690.320391 1.000000 1586 1596 | 1588 2 3876.437471 3409.583088 3656.919880 1.000000 1587 1597 | 1589 2 3815.570412 3398.425800 3659.474664 1.000000 1588 1598 | 1590 2 3758.437593 3409.202091 3624.992118 1.000000 1589 1599 | 1591 2 3711.804828 3398.855586 3602.699135 1.000000 1590 1600 | 1592 2 3620.429781 3357.348766 3553.365285 1.000000 1591 1601 | 1593 2 3559.836066 3325.026339 3522.205037 1.000000 1592 1602 | 1594 2 3471.500108 3290.123139 3489.230469 1.000000 1593 1603 | 1595 2 3402.851504 3253.761856 3434.962919 1.000000 1594 1604 | 1596 2 3387.835941 3244.691446 3420.220685 1.000000 1595 1605 | 1597 2 3372.476684 3237.693498 3410.658111 1.000000 1596 1606 | 1598 2 3336.007854 3217.824230 3372.939341 1.000000 1597 1607 | 1599 2 3360.281330 3181.877939 3352.923781 1.000000 1598 1608 | 1600 2 3391.718775 3171.233275 3348.789046 1.000000 1599 1609 | 1601 2 3396.578186 3160.049825 3314.107428 1.000000 1600 1610 | 1602 2 3422.421916 3155.066543 3306.288956 1.000000 1601 1611 | 1603 2 3454.726457 3167.242185 3283.527308 1.000000 1602 1612 | 1604 2 3474.906130 3181.344865 3281.515663 1.000000 1603 1613 | 1605 2 3499.945344 3208.722522 3314.343789 1.000000 1604 1614 | 1606 2 3530.242075 3246.448244 3345.283187 1.000000 1605 1615 | 1607 2 3542.765697 3240.771603 3369.931726 1.000000 1606 1616 | 1608 2 3529.398402 3243.834063 3388.328165 1.000000 1607 1617 | 1609 2 3554.914028 3173.606378 3379.222713 1.000000 1608 1618 | 1610 2 3560.890482 3160.763639 3368.763632 1.000000 1609 1619 | 1611 2 3307.781219 3262.313403 3402.164051 1.000000 1597 1620 | 1612 2 3236.460913 3300.814314 3398.701127 1.000000 1611 1621 | 1613 2 3171.546926 3314.226419 3397.246059 1.000000 1612 1622 | 1614 2 3106.984295 3322.675702 3384.052734 1.000000 1613 1623 | 1615 2 3077.390643 3338.773364 3381.144489 1.000000 1614 1624 | 1616 2 3000.031176 3338.221682 3399.929656 1.000000 1615 1625 | 1617 2 2988.835944 3339.527471 3409.252005 1.000000 1616 1626 | 1618 2 2982.335906 3353.553596 3427.054777 1.000000 1617 1627 | 1619 2 2973.117191 3357.010611 3435.117068 1.000000 1618 1628 | 1620 2 2979.562429 3382.324350 3440.562390 1.000000 1619 1629 | 1621 2 3015.671891 3416.291053 3464.773497 1.000000 1620 1630 | 1622 2 3067.921764 3451.388745 3508.513579 1.000000 1621 1631 | 1623 2 3072.554730 3475.888573 3537.080201 1.000000 1622 1632 | 1624 2 3078.828068 3467.912078 3587.419819 1.000000 1623 1633 | 1625 2 3102.000087 3442.053637 3595.181524 1.000000 1624 1634 | 1626 2 3112.249967 3398.878780 3594.482348 1.000000 1625 1635 | 1627 2 3125.429771 3389.633915 3578.410111 1.000000 1626 1636 | 1628 2 3125.617202 3384.263643 3555.435487 1.000000 1627 1637 | 1629 2 3167.742119 3372.555598 3540.203191 1.000000 1628 1638 | 1630 2 3194.961021 3373.670937 3545.982509 1.000000 1629 1639 | 1631 2 3211.679563 3377.529355 3554.027302 1.000000 1630 1640 | 1632 2 3225.875113 3371.524395 3552.236426 1.000000 1631 1641 | 1633 2 3220.781255 3371.078236 3569.699125 1.000000 1632 1642 | 1634 2 3190.687388 3394.211084 3572.843872 1.000000 1633 1643 | 1635 2 3181.773585 3407.322172 3587.769490 1.000000 1634 1644 | 1636 2 3101.531396 3391.850638 3579.929583 1.000000 1626 1645 | 1637 2 3393.624853 3240.782134 3416.572327 1.000000 1596 1646 | 1638 2 3384.320383 3205.367041 3392.496013 1.000000 1637 1647 | 1639 2 3379.937501 3153.429691 3379.808554 1.000000 1638 1648 | 1640 2 3368.484484 3133.037249 3358.187483 1.000000 1639 1649 | 1641 2 3350.171921 3110.547904 3361.486381 1.000000 1640 1650 | 1642 2 3317.664125 3083.507868 3332.589804 1.000000 1641 1651 | 1643 2 3307.531255 3059.506939 3319.312465 1.000000 1642 1652 | 1644 2 3287.203096 3073.597667 3316.328225 1.000000 1643 1653 | 1645 2 3253.054594 3099.406263 3297.091906 1.000000 1644 1654 | 1646 2 3244.734474 3089.346728 3305.140665 1.000000 1645 1655 | 1647 2 3254.140497 3080.310488 3336.136662 1.000000 1646 1656 | 1648 2 3220.398362 3088.729463 3346.314508 1.000000 1647 1657 | 1649 2 3268.093692 3068.537032 3314.728421 1.000000 1644 1658 | 1650 2 3394.742221 3139.709994 3360.755856 1.000000 1639 1659 | 1651 2 3428.953100 3131.216840 3358.538958 1.000000 1650 1660 | 1652 2 3459.062642 3132.829185 3383.959066 1.000000 1651 1661 | 1653 2 3496.007712 3118.636718 3394.093719 1.000000 1652 1662 | 1654 2 3572.703001 3113.905270 3421.861439 1.000000 1653 1663 | 1655 2 3585.398473 3095.714911 3438.677762 1.000000 1654 1664 | 1656 2 3605.289194 3099.841885 3434.566389 1.000000 1655 1665 | 1657 2 3411.906265 3250.208047 3410.062579 1.000000 1637 1666 | 1658 2 3421.679749 3249.890699 3406.478507 1.000000 1657 1667 | 1659 2 3419.164077 3246.114148 3388.380921 1.000000 1658 1668 | 1660 2 3434.976691 3245.338984 3362.593707 1.000000 1659 1669 | 1661 2 3461.078257 3231.453193 3329.984466 1.000000 1660 1670 | 1662 2 3486.226456 3221.121027 3301.917854 1.000000 1661 1671 | 1663 2 3512.093631 3202.041077 3253.711043 1.000000 1662 1672 | 1664 2 3544.093854 3162.164139 3185.269453 1.000000 1663 1673 | 1665 2 3562.585863 3146.705007 3139.427802 1.000000 1664 1674 | 1666 2 3578.617231 3138.555794 3105.736241 1.000000 1665 1675 | 1667 2 3573.976634 3128.945190 3063.373098 1.000000 1666 1676 | 1668 2 3576.586042 3119.862423 3038.322222 1.000000 1667 1677 | 1669 2 3545.664180 3082.877976 2987.949228 1.000000 1668 1678 | 1670 2 3553.390616 3068.702055 2957.333991 1.000000 1669 1679 | 1671 2 3549.070220 3051.565522 2938.097695 1.000000 1670 1680 | 1672 2 3427.406249 3267.878925 3345.349623 1.000000 1659 1681 | 1673 2 3464.851555 3291.637633 3291.878849 1.000000 1672 1682 | 1674 2 3509.976473 3269.187548 3263.611434 1.000000 1673 1683 | 1675 2 3516.913994 3258.436623 3254.767605 1.000000 1674 1684 | 1676 2 3498.234341 3236.527303 3219.109340 1.000000 1675 1685 | 1677 2 3479.515663 3216.338972 3190.707126 1.000000 1676 1686 | 1678 2 3446.273559 3186.405362 3153.517555 1.000000 1677 1687 | 1679 2 3421.351569 3168.177588 3125.201091 1.000000 1678 1688 | 1680 2 3455.609507 3246.374164 3388.296812 1.000000 1658 1689 | 1681 2 3469.593828 3249.348596 3375.126837 1.000000 1680 1690 | 1682 2 3501.921915 3285.207003 3361.150436 1.000000 1681 1691 | 1683 2 3534.890498 3302.238197 3351.415931 1.000000 1682 1692 | 1684 2 3553.898330 3299.879843 3333.945341 1.000000 1683 1693 | 1685 2 3585.952998 3291.677630 3254.564376 1.000000 1684 1694 | 1686 2 3601.632815 3262.533079 3214.957087 1.000000 1685 1695 | 1687 2 3618.625055 3245.265657 3151.601617 1.000000 1686 1696 | 1688 2 3889.999870 3273.037092 3811.230485 1.000000 1186 1697 | 1689 2 3880.445428 3244.428772 3761.011709 1.000000 1688 1698 | 1690 2 3894.413938 3239.590959 3712.398499 1.000000 1689 1699 | 1691 2 3890.851574 3223.665019 3697.396600 1.000000 1690 1700 | 1692 2 3911.109480 3218.084090 3641.673863 1.000000 1691 1701 | 1693 2 3920.554801 3179.699305 3594.308649 1.000000 1692 1702 | 1694 2 3918.757836 3161.606411 3568.101665 1.000000 1693 1703 | 1695 2 3935.023451 3134.532137 3526.292967 1.000000 1694 1704 | 1696 2 3937.078081 3116.604519 3500.824155 1.000000 1695 1705 | 1697 2 3916.265593 3075.299844 3425.263577 1.000000 1696 1706 | 1698 2 3897.820404 3055.180772 3396.199213 1.000000 1697 1707 | 1699 2 3891.203089 3037.340741 3373.288996 1.000000 1698 1708 | 1700 2 3875.359376 3014.763723 3339.851490 1.000000 1699 1709 | 1701 2 3873.257801 2992.020513 3320.632906 1.000000 1700 1710 | 1702 2 3869.445285 2973.721534 3303.730353 1.000000 1701 1711 | 1703 2 3843.507954 2941.356440 3263.697181 1.000000 1702 1712 | 1704 2 3831.015589 2923.236348 3245.640576 1.000000 1703 1713 | 1705 2 3804.414093 2884.474527 3192.173929 1.000000 1704 1714 | 1706 2 3771.062592 2869.003925 3155.306572 1.000000 1705 1715 | 1707 2 3759.726628 2863.595736 3117.617225 1.000000 1706 1716 | 1708 2 3750.625002 2821.256866 3076.289069 1.000000 1707 1717 | 1709 2 3741.554662 2806.404175 3054.537171 1.000000 1708 1718 | 1710 2 3735.843603 2800.225559 3024.511750 1.000000 1709 1719 | 1711 2 3733.570289 2776.140683 2984.380921 1.000000 1710 1720 | 1712 2 3726.327989 2737.518523 2962.542998 1.000000 1711 1721 | 1713 2 3725.726570 2707.561587 2942.919931 1.000000 1712 1722 | 1714 2 3818.296735 2866.125063 3178.294866 1.000000 1705 1723 | 1715 2 3818.038953 2767.272477 3115.320312 1.000000 1714 1724 | 1716 2 3788.765729 2763.533177 3064.257837 1.000000 1715 1725 | 1717 2 3780.070264 2739.432595 3022.537160 1.000000 1716 1726 | 1718 2 3768.992297 2710.001096 2971.943360 1.000000 1717 1727 | 1719 2 3759.156157 2680.827215 2932.244101 1.000000 1718 1728 | 1720 2 3776.031322 2662.094759 2898.318359 1.000000 1719 1729 | 1721 2 3812.031358 2636.354481 2876.855492 1.000000 1720 1730 | 1722 2 3848.585901 2643.876039 2825.800806 1.000000 1721 1731 | 1723 2 3856.671963 2660.761589 2807.144522 1.000000 1722 1732 | 1724 2 3887.117243 2669.266583 2820.460922 1.000000 1723 1733 | 1725 2 3912.789084 2661.915944 2819.058654 1.000000 1724 1734 | 1726 2 3933.335918 2657.990277 2857.322284 1.000000 1725 1735 | 1727 2 3938.835957 2640.053812 2871.269567 1.000000 1726 1736 | 1728 2 3841.781221 2943.557654 3243.832095 1.000000 1703 1737 | 1729 2 3834.609357 2936.790051 3237.570326 1.000000 1728 1738 | 1730 2 3823.288930 2940.122108 3188.978449 1.000000 1729 1739 | 1731 2 3813.921807 2938.017481 3172.505973 1.000000 1730 1740 | 1732 2 3806.429767 2921.891699 3150.078165 1.000000 1731 1741 | 1733 2 3784.171897 2901.098498 3124.665977 1.000000 1732 1742 | 1734 2 3769.773414 2873.747979 3091.513711 1.000000 1733 1743 | 1735 2 3749.867170 2851.616074 3061.671827 1.000000 1734 1744 | 1736 2 3732.187360 2831.704185 3032.802770 1.000000 1735 1745 | 1737 2 3809.249868 2892.682694 3122.519614 1.000000 1732 1746 | 1738 2 3831.124962 2868.280189 3088.349664 1.000000 1737 1747 | 1739 2 3835.851526 2845.547986 3043.097692 1.000000 1738 1748 | 1740 2 3858.359419 2838.216893 3023.980411 1.000000 1739 1749 | 1741 2 3872.874993 2827.828040 3013.906205 1.000000 1740 1750 | 1742 2 3884.874869 2830.836948 2985.152294 1.000000 1741 1751 | 1743 2 3893.960969 2818.178784 2963.525432 1.000000 1742 1752 | 1744 2 3873.523485 2819.747147 2948.730490 1.000000 1743 1753 | 1745 2 3853.624963 2805.028405 2922.156276 1.000000 1744 1754 | 1746 2 3851.843866 2772.989223 2899.810551 1.000000 1745 1755 | 1747 2 3838.554542 2773.111249 2885.759766 1.000000 1746 1756 | 1748 2 3826.124926 2787.527360 2883.201215 1.000000 1747 1757 | 1749 2 3820.945298 2780.638705 2908.261713 1.000000 1748 1758 | 1750 2 3805.187529 2774.458877 2899.605488 1.000000 1749 1759 | 1751 2 3799.007925 2775.409260 2870.171840 1.000000 1750 1760 | 1752 2 3847.421825 2813.773519 2969.945341 1.000000 1744 1761 | 1753 2 3917.874940 3024.011793 3363.527252 1.000000 1699 1762 | 1754 2 3933.882717 3005.376010 3331.441379 1.000000 1753 1763 | 1755 2 3920.078130 2998.916934 3305.914029 1.000000 1754 1764 | 1756 2 3916.875084 2981.219647 3278.453042 1.000000 1755 1765 | 1757 2 3924.125070 2965.523491 3235.308529 1.000000 1756 1766 | 1758 2 3921.000053 2965.439307 3204.970637 1.000000 1757 1767 | 1759 2 3916.171846 2958.391712 3169.691325 1.000000 1758 1768 | 1760 2 3928.671879 2950.617175 3114.082142 1.000000 1759 1769 | 1761 2 3959.859341 2921.656164 3065.703176 1.000000 1760 1770 | 1762 2 3971.585868 2901.765768 3033.154247 1.000000 1761 1771 | 1763 2 3974.828259 2875.636635 2997.041008 1.000000 1762 1772 | 1764 2 3966.945219 2870.322317 2983.369185 1.000000 1763 1773 | 1765 2 3980.046968 2857.207952 2960.832034 1.000000 1764 1774 | 1766 2 3993.109383 2812.154231 2908.308550 1.000000 1765 1775 | 1767 2 4001.140727 2793.764776 2883.609388 1.000000 1766 1776 | 1768 2 4000.148326 2787.248147 2876.144583 1.000000 1767 1777 | 1769 2 3981.953013 2760.852528 2852.558569 1.000000 1768 1778 | 1770 2 3959.781105 2733.458892 2821.052684 1.000000 1769 1779 | 1771 2 3944.632719 2721.832958 2785.824271 1.000000 1770 1780 | 1772 2 3943.382866 2706.214967 2764.964839 1.000000 1771 1781 | 1773 2 3917.343854 2709.152427 2730.660157 1.000000 1772 1782 | 1774 2 3910.546736 2731.503060 2697.625034 1.000000 1773 1783 | 1775 2 3903.757702 2729.015497 2679.130881 1.000000 1774 1784 | 1776 2 3878.359273 2730.548692 2675.689430 1.000000 1775 1785 | 1777 2 3861.671771 2721.479535 2684.630805 1.000000 1776 1786 | 1778 2 6993.093760 2970.826092 3591.564510 1.000000 32 1787 | 1779 2 7031.796710 2995.031165 3572.767588 1.000000 1778 1788 | 1780 2 7047.999948 3046.135839 3584.230580 1.000000 1779 1789 | 1781 2 7075.789003 3100.588862 3602.140730 1.000000 1780 1790 | 1782 2 7108.922165 3164.198099 3613.421889 1.000000 1781 1791 | 1783 2 7127.499749 3214.212884 3630.388555 1.000000 1782 1792 | 1784 2 7151.086057 3287.145626 3668.271372 1.000000 1783 1793 | 1785 2 7166.531205 3326.338916 3687.900433 1.000000 1784 1794 | 1786 2 7196.624741 3379.379759 3730.087962 1.000000 1785 1795 | 1787 2 7213.781179 3405.217698 3737.197257 1.000000 1786 1796 | 1788 2 7263.671674 3426.136832 3751.339883 1.000000 1787 1797 | 1789 2 7292.476420 3449.721797 3759.103426 1.000000 1788 1798 | 1790 2 7312.898662 3474.964850 3793.318309 1.000000 1789 1799 | 1791 2 7348.538775 3510.725529 3821.158177 1.000000 1790 1800 | 1792 2 7364.312754 3524.030406 3839.208987 1.000000 1791 1801 | 1793 2 7349.421844 3535.114299 3884.521400 1.000000 1792 1802 | 1794 2 7350.476670 3539.107304 3927.246073 1.000000 1793 1803 | 1795 2 7355.703401 3554.586939 3978.212931 1.000000 1794 1804 | 1796 2 7359.585751 3574.129769 4021.759879 1.000000 1795 1805 | 1797 2 7355.070150 3598.559529 4070.554719 1.000000 1796 1806 | 1798 2 7350.320542 3632.967850 4126.214803 1.000000 1797 1807 | 1799 2 7352.015735 3662.518699 4179.253988 1.000000 1798 1808 | 1800 2 7351.280983 3686.777456 4230.593787 1.000000 1799 1809 | 1801 2 7357.609143 3708.702224 4277.580128 1.000000 1800 1810 | 1802 2 7361.351803 3729.121025 4307.841895 1.000000 1801 1811 | 1803 2 7369.999862 3762.717718 4350.986336 1.000000 1802 1812 | 1804 2 7374.968864 3788.686606 4388.869148 1.000000 1803 1813 | 1805 2 7375.624749 3810.447344 4430.212853 1.000000 1804 1814 | 1806 2 7381.312449 3828.551785 4462.371125 1.000000 1805 1815 | 1807 2 7389.281337 3875.812394 4553.634846 1.000000 1806 1816 | 1808 2 7405.898147 3899.084007 4608.365312 1.000000 1807 1817 | 1809 2 7405.468640 3940.114292 4671.361329 1.000000 1808 1818 | 1810 2 7405.781292 3973.139727 4751.185446 1.000000 1809 1819 | 1811 2 7407.109622 4016.984351 4837.002022 1.000000 1810 1820 | 1812 2 7402.015627 4033.330155 4859.291040 1.000000 1811 1821 | 1813 2 7400.297029 4060.749040 4899.175789 1.000000 1812 1822 | 1814 2 7403.242213 4072.085042 4933.523544 1.000000 1813 1823 | 1815 2 7389.343955 4119.849756 5012.027317 1.000000 1814 1824 | 1816 2 7367.664013 4165.142556 5083.275456 1.000000 1815 1825 | 1817 2 7350.788920 4205.764648 5154.544746 1.000000 1816 1826 | 1818 2 7356.851284 4227.356448 5195.120989 1.000000 1817 1827 | 1819 2 7371.320558 4225.558637 5212.744044 1.000000 1818 1828 | 1820 2 7430.148177 4235.915971 5244.992427 1.000000 1819 1829 | 1821 2 7443.234506 4240.664159 5255.054487 1.000000 1820 1830 | 1822 2 7465.085918 4228.377836 5262.163829 1.000000 1821 1831 | 1823 2 7497.398565 4227.922758 5281.212913 1.000000 1822 1832 | 1824 2 7527.859230 4232.783225 5316.082161 1.000000 1823 1833 | 1825 2 7578.039143 4239.607513 5360.398283 1.000000 1824 1834 | 1826 2 7609.828419 4250.429551 5386.806438 1.000000 1825 1835 | 1827 2 7650.546664 4251.029412 5408.330194 1.000000 1826 1836 | 1828 2 7676.898607 4257.756730 5440.711115 1.000000 1827 1837 | 1829 2 7677.664018 4270.620085 5452.767518 1.000000 1828 1838 | 1830 2 7625.195102 4317.009727 5498.052553 1.000000 1829 1839 | 1831 2 7596.687311 4336.409207 5517.775202 1.000000 1830 1840 | 1832 2 7580.390379 4324.795058 5501.843923 1.000000 1831 1841 | 1833 2 7531.367028 4306.386806 5476.937270 1.000000 1832 1842 | 1834 2 7482.593638 4308.369161 5438.935390 1.000000 1833 1843 | 1835 2 7441.499818 4297.213904 5413.740269 1.000000 1834 1844 | 1836 2 7405.992245 4275.056677 5398.160119 1.000000 1835 1845 | 1837 2 7395.609526 4230.131734 5378.462911 1.000000 1836 1846 | 1838 2 7580.976648 4346.852649 5530.625179 1.000000 1831 1847 | 1839 2 7570.125140 4370.846534 5532.597880 1.000000 1838 1848 | 1840 2 7553.093914 4380.710047 5532.478449 1.000000 1839 1849 | 1841 2 7699.648187 4243.662041 5433.408358 1.000000 1828 1850 | 1842 2 7723.741990 4206.771627 5408.712871 1.000000 1841 1851 | 1843 2 7749.077920 4171.132814 5409.970474 1.000000 1842 1852 | 1844 2 7776.046763 4144.205935 5402.359398 1.000000 1843 1853 | 1845 2 7831.023670 4106.530406 5394.818118 1.000000 1844 1854 | 1846 2 7872.038949 4078.994002 5394.443583 1.000000 1845 1855 | 1847 2 7921.132692 4048.118105 5394.463100 1.000000 1846 1856 | 1848 2 7977.851389 3997.408283 5396.292927 1.000000 1847 1857 | 1849 2 8019.226340 3948.572123 5401.476679 1.000000 1848 1858 | 1850 2 8066.297090 3907.923900 5404.058710 1.000000 1849 1859 | 1851 2 8105.265611 3880.883737 5405.464673 1.000000 1850 1860 | 1852 2 8131.242286 3852.584129 5407.818229 1.000000 1851 1861 | 1853 2 8144.031250 3857.965685 5415.824052 1.000000 1852 1862 | 1854 2 8154.328197 3890.910152 5436.630949 1.000000 1853 1863 | 1855 2 8163.836051 3921.722696 5453.542933 1.000000 1854 1864 | 1856 2 8190.711004 3952.121963 5479.466756 1.000000 1855 1865 | 1857 2 8230.851782 4001.968874 5518.378702 1.000000 1856 1866 | 1858 2 8262.484523 4049.208842 5547.784937 1.000000 1857 1867 | 1859 2 8284.172117 4047.014566 5585.968778 1.000000 1858 1868 | 1860 2 8296.406334 4027.838975 5621.535203 1.000000 1859 1869 | 1861 2 8303.937487 4026.643621 5649.486493 1.000000 1860 1870 | 1862 2 8330.234226 4009.151243 5693.908252 1.000000 1861 1871 | 1863 2 8351.086193 3983.039167 5730.533322 1.000000 1862 1872 | 1864 2 8359.867236 4001.588881 5771.293198 1.000000 1863 1873 | 1865 2 8360.359098 4013.007841 5794.810574 1.000000 1864 1874 | 1866 2 8373.398435 3980.220847 5830.769409 1.000000 1865 1875 | 1867 2 8377.804749 3971.113202 5837.808407 1.000000 1866 1876 | 1868 2 8387.406532 3976.976539 5835.693230 1.000000 1867 1877 | 1869 2 8404.765854 4029.554814 5842.504111 1.000000 1868 1878 | 1870 2 8411.148259 4038.136647 5840.392586 1.000000 1869 1879 | 1871 2 8388.655990 3969.726459 5847.513505 1.000000 1866 1880 | 1872 2 8409.867443 3950.022556 5873.195371 1.000000 1871 1881 | 1873 2 8436.164041 3946.706958 5876.134724 1.000000 1872 1882 | 1874 2 8460.156273 3957.885636 5879.001880 1.000000 1873 1883 | 1875 2 8478.116971 3956.527466 5893.978285 1.000000 1874 1884 | 1876 2 8517.952999 3981.229380 5924.355363 1.000000 1875 1885 | 1877 2 8575.249940 3999.352622 5948.549047 1.000000 1876 1886 | 1878 2 8587.226393 3998.922922 5952.640687 1.000000 1877 1887 | 1879 2 8603.437773 4007.278401 5960.613391 1.000000 1878 1888 | 1880 2 8612.179775 4007.027395 5969.427755 1.000000 1879 1889 | 1881 2 8656.984659 4012.897597 5983.449296 1.000000 1880 1890 | 1882 2 8733.945540 4029.844667 5993.222555 1.000000 1881 1891 | 1883 2 8819.242438 4048.466697 6043.318298 1.000000 1882 1892 | 1884 2 8880.062556 4075.304624 6098.603672 1.000000 1883 1893 | 1885 2 8906.547134 4072.738312 6113.294791 1.000000 1884 1894 | 1886 2 8935.000024 4070.902253 6142.105577 1.000000 1885 1895 | 1887 2 9004.507840 4066.123914 6193.638722 1.000000 1886 1896 | 1888 2 9036.797007 4050.957865 6203.386621 1.000000 1887 1897 | 1889 2 9034.718573 4000.155336 6201.834150 1.000000 1888 1898 | 1890 2 9016.273524 3969.769661 6221.482654 1.000000 1889 1899 | 1891 2 9018.898526 3955.537122 6217.816508 1.000000 1890 1900 | 1892 2 8991.882695 3904.497216 6237.750168 1.000000 1891 1901 | 1893 2 8978.289019 3892.291116 6235.839816 1.000000 1892 1902 | 1894 2 8946.633001 3889.374142 6242.853711 1.000000 1893 1903 | 1895 2 8929.007869 3841.326074 6277.412039 1.000000 1894 1904 | 1896 2 8946.976767 3786.685443 6312.939511 1.000000 1895 1905 | 1897 2 8969.429797 3759.094584 6346.160032 1.000000 1896 1906 | 1898 2 8960.335714 3766.426664 6366.664238 1.000000 1897 1907 | 1899 2 8986.164031 3778.208133 6393.271718 1.000000 1898 1908 | 1900 2 8990.586134 3780.736239 6432.890771 1.000000 1899 1909 | 1901 2 8981.195530 3803.934552 6437.517774 1.000000 1900 1910 | 1902 2 8975.257928 3826.051793 6448.576059 1.000000 1901 1911 | 1903 2 9020.202864 3950.571254 6184.515760 1.000000 1889 1912 | 1904 2 8971.796869 3934.755860 6200.422002 1.000000 1903 1913 | 1905 2 8949.921982 3933.397406 6203.705038 1.000000 1904 1914 | 1906 2 8586.078238 4001.213983 5997.929481 1.000000 1880 1915 | 1907 2 8575.539307 3997.633837 6025.433761 1.000000 1906 1916 | 1908 2 8570.031466 4004.732548 6056.363205 1.000000 1907 1917 | 1909 2 8582.656134 4003.969740 5971.224685 1.000000 1878 1918 | 1910 2 8582.867158 3990.133900 5997.693337 1.000000 1909 1919 | 1911 2 8373.710912 3942.425923 5767.531020 1.000000 1863 1920 | 1912 2 8392.906279 3905.404279 5816.095511 1.000000 1911 1921 | 1913 2 8398.382638 3892.420778 5843.402231 1.000000 1912 1922 | 1914 2 8401.140491 3884.910011 5862.201405 1.000000 1913 1923 | 1915 2 8404.679551 3907.823277 5881.570204 1.000000 1914 1924 | 1916 2 8427.211026 3912.876875 5915.872833 1.000000 1915 1925 | 1917 2 8454.476302 3926.743297 5949.384830 1.000000 1916 1926 | 1918 2 8477.171996 3950.930570 6006.312521 1.000000 1917 1927 | 1919 2 8503.382880 3981.073156 6065.503990 1.000000 1918 1928 | 1920 2 8511.546926 3995.820203 6105.200975 1.000000 1919 1929 | 1921 2 8530.773579 4031.671758 6130.248113 1.000000 1920 1930 | 1922 2 8538.070354 4073.221538 6154.706796 1.000000 1921 1931 | 1923 2 8568.171996 4083.854423 6186.546760 1.000000 1922 1932 | 1924 2 8620.249913 4083.017641 6238.072073 1.000000 1923 1933 | 1925 2 8641.671844 4095.382816 6269.131010 1.000000 1924 1934 | 1926 2 8688.054819 4101.841918 6324.388798 1.000000 1925 1935 | 1927 2 8722.406343 4082.097528 6355.877014 1.000000 1926 1936 | 1928 2 8739.984377 4070.026369 6371.376949 1.000000 1927 1937 | 1929 2 8749.968920 4055.523511 6362.429595 1.000000 1928 1938 | 1930 2 8741.976486 4039.001117 6335.935303 1.000000 1929 1939 | 1931 2 8738.882769 3994.175646 6306.478596 1.000000 1930 1940 | 1932 2 8740.734560 3979.088939 6299.970787 1.000000 1931 1941 | 1933 2 8703.874963 3974.951272 6269.544680 1.000000 1932 1942 | 1934 2 8680.445364 3955.288052 6239.431627 1.000000 1933 1943 | 1935 2 8742.039006 3942.598543 6267.732425 1.000000 1932 1944 | 1936 2 8750.648518 3918.684430 6278.400248 1.000000 1935 1945 | 1937 2 8784.835834 3867.707165 6335.726584 1.000000 1936 1946 | 1938 2 8806.288955 3840.170054 6354.718805 1.000000 1937 1947 | 1939 2 8816.445518 3836.924891 6388.414016 1.000000 1938 1948 | 1940 2 8811.616932 3840.866254 6415.128857 1.000000 1939 1949 | 1941 2 8811.695386 3895.094597 6454.644731 1.000000 1940 1950 | 1942 2 8834.429800 3898.159094 6510.499867 1.000000 1941 1951 | 1943 2 8845.078267 3914.388542 6548.781050 1.000000 1942 1952 | 1944 2 8847.859401 3935.688508 6577.091780 1.000000 1943 1953 | 1945 2 8854.796964 3948.262588 6601.279080 1.000000 1944 1954 | 1946 2 8864.625249 3990.342678 6632.205206 1.000000 1945 1955 | 1947 2 8899.367458 4021.302638 6660.193579 1.000000 1946 1956 | 1948 2 8930.351730 4015.764786 6689.316220 1.000000 1947 1957 | 1949 2 8957.523517 4013.377038 6711.869271 1.000000 1948 1958 | 1950 2 8946.304945 4041.839012 6712.454943 1.000000 1949 1959 | 1951 2 8743.718749 4072.556640 6369.826172 1.000000 1928 1960 | 1952 2 8749.820112 4082.256861 6381.843532 1.000000 1951 1961 | 1953 2 8756.976373 4108.985473 6394.872840 1.000000 1952 1962 | 1954 2 8759.093696 4122.404441 6413.212937 1.000000 1953 1963 | 1955 2 8767.648429 4147.929705 6428.884637 1.000000 1954 1964 | 1956 2 8760.562467 4215.139724 6440.599464 1.000000 1955 1965 | 1957 2 8758.499892 4261.155222 6425.974495 1.000000 1956 1966 | 1958 2 8750.632955 4330.791980 6414.437279 1.000000 1957 1967 | 1959 2 8747.460929 4365.453032 6410.845834 1.000000 1958 1968 | 1960 2 8746.422093 4405.972553 6411.263681 1.000000 1959 1969 | 1961 2 8734.984376 4450.451133 6443.636648 1.000000 1960 1970 | 1962 2 8727.195224 4492.879806 6474.433520 1.000000 1961 1971 | 1963 2 8715.468656 4526.731585 6512.226724 1.000000 1962 1972 | 1964 2 8710.343772 4598.732495 6531.322223 1.000000 1963 1973 | 1965 2 8688.875294 4669.171034 6566.390747 1.000000 1964 1974 | 1966 2 8678.687533 4723.100708 6586.927865 1.000000 1965 1975 | 1967 2 8667.820027 4732.634839 6585.718775 1.000000 1966 1976 | 1968 2 8763.617384 4126.060662 6390.689548 1.000000 1953 1977 | 1969 2 8730.086203 4168.718714 6369.638430 1.000000 1968 1978 | 1970 2 8722.093896 4213.571281 6358.746086 1.000000 1969 1979 | 1971 2 8702.523236 4268.051644 6369.011522 1.000000 1970 1980 | 1972 2 8668.992007 4316.989174 6377.458977 1.000000 1971 1981 | 1973 2 8657.195344 4351.888601 6361.699368 1.000000 1972 1982 | 1974 2 8650.351722 4396.242115 6343.279506 1.000000 1973 1983 | 1975 2 8643.945068 4461.774386 6318.962965 1.000000 1974 1984 | 1976 2 8621.953088 4502.297755 6294.888906 1.000000 1975 1985 | 1977 2 8606.156071 4529.538174 6265.123040 1.000000 1976 1986 | 1978 2 8577.265717 4558.945411 6240.099806 1.000000 1977 1987 | 1979 2 8578.242044 4614.506886 6221.734307 1.000000 1978 1988 | 1980 2 8581.476727 4641.071188 6221.377033 1.000000 1979 1989 | 1981 2 8583.070419 4626.872933 6202.972600 1.000000 1980 1990 | 1982 2 8596.836033 4607.353375 6188.205325 1.000000 1981 1991 | 1983 2 8609.609428 4573.912102 6170.449113 1.000000 1982 1992 | 1984 2 8616.773540 4561.658195 6145.736092 1.000000 1983 1993 | 1985 2 8611.531011 4540.817473 6129.079904 1.000000 1984 1994 | 1986 2 8592.218966 4543.064357 6099.540879 1.000000 1985 1995 | 1987 2 8589.367380 4529.249045 6063.478286 1.000000 1986 1996 | 1988 2 8571.132776 4531.634828 6028.701142 1.000000 1987 1997 | 1989 2 8563.015573 4545.385684 6018.308784 1.000000 1988 1998 | 1990 2 8553.242441 4543.994050 6005.543108 1.000000 1989 1999 | 1991 2 8525.187428 4548.215911 5996.433766 1.000000 1990 2000 | 1992 2 8526.492009 4537.164041 5978.339987 1.000000 1991 2001 | 1993 2 8538.960747 4527.783301 5969.902120 1.000000 1992 2002 | 1994 2 8543.633001 4545.902300 5987.527374 1.000000 1993 2003 | 1995 2 8543.679396 4527.243079 5977.568158 1.000000 1994 2004 | 1996 2 8572.906435 4502.385664 5958.625231 1.000000 1995 2005 | 1997 2 8575.906344 4473.332077 5941.210778 1.000000 1996 2006 | 1998 2 8580.038827 4442.571232 5936.993906 1.000000 1997 2007 | 1999 2 8561.929472 4412.818258 5914.251971 1.000000 1998 2008 | 2000 2 8545.757560 4362.210965 5891.341990 1.000000 1999 2009 | 2001 2 8552.539302 4353.689344 5887.857439 1.000000 2000 2010 | 2002 2 8567.874874 4642.923810 6202.431413 1.000000 1979 2011 | 2003 2 8755.624895 4085.926819 6375.941544 1.000000 1951 2012 | 2004 2 8774.148719 4093.366340 6373.003967 1.000000 2003 2013 | 2005 2 8780.624764 4110.387668 6371.173918 1.000000 2004 2014 | 2006 2 8780.898365 4124.717689 6359.162068 1.000000 2005 2015 | 2007 2 8807.039039 4121.448263 6341.119232 1.000000 2006 2016 | 2008 2 8852.687506 4125.993059 6316.963121 1.000000 2007 2017 | 2009 2 8895.163907 4143.015545 6301.798788 1.000000 2008 2018 | 2010 2 8913.984115 4156.577069 6300.005626 1.000000 2009 2019 | 2011 2 8919.648532 4172.620094 6314.748017 1.000000 2010 2020 | 2012 2 8943.062389 4184.642572 6322.794874 1.000000 2011 2021 | 2013 2 8951.062737 4187.125932 6343.849710 1.000000 2012 2022 | 2014 2 8971.984458 4168.360397 6366.993956 1.000000 2013 2023 | 2015 2 8981.062752 4137.999881 6385.330047 1.000000 2014 2024 | 2016 2 9004.492456 4115.000913 6410.343762 1.000000 2015 2025 | 2017 2 9037.070520 4087.755883 6436.827938 1.000000 2016 2026 | 2018 2 9070.671798 4079.246068 6462.130819 1.000000 2017 2027 | 2019 2 9086.375094 4038.783199 6470.861291 1.000000 2018 2028 | 2020 2 9116.039309 3989.546758 6494.398413 1.000000 2019 2029 | 2021 2 9138.523543 3975.733369 6510.669980 1.000000 2020 2030 | 2022 2 9126.461061 3956.196397 6525.402380 1.000000 2021 2031 | 2023 2 9117.304605 3929.033204 6519.943528 1.000000 2022 2032 | 2024 2 9102.945518 3902.106477 6524.224552 1.000000 2023 2033 | 2025 2 9078.203095 3873.087787 6533.822221 1.000000 2024 2034 | 2026 2 9067.265654 3883.795054 6521.704974 1.000000 2025 2035 | 2027 2 9053.515588 3859.009624 6512.740368 1.000000 2026 2036 | 2028 2 9039.125174 3833.405246 6508.406470 1.000000 2027 2037 | 2029 2 8941.625075 4202.419776 6327.613159 1.000000 2012 2038 | 2030 2 8914.351528 4217.898533 6302.833932 1.000000 2029 2039 | 2031 2 8886.788945 4215.919827 6284.927954 1.000000 2030 2040 | 2032 2 8877.945173 4256.946258 6240.845856 1.000000 2031 2041 | 2033 2 8776.570296 4133.745988 6382.800632 1.000000 2005 2042 | 2034 2 8782.320247 4151.384793 6395.638719 1.000000 2033 2043 | 2035 2 8770.140714 4173.067240 6405.185305 1.000000 2034 2044 | 2036 2 8771.289087 4186.371193 6405.919984 1.000000 2035 2045 | 2037 2 8780.468666 4204.340815 6413.027260 1.000000 2036 2046 | 2038 2 8729.999906 4084.114209 6355.451113 1.000000 1927 2047 | 2039 2 8728.054405 4107.571396 6367.191314 1.000000 2038 2048 | 2040 2 8733.406055 4124.035138 6376.400199 1.000000 2039 2049 | 2041 2 8746.742411 4132.288158 6385.839783 1.000000 2040 2050 | 2042 2 8761.609533 4153.384713 6390.759798 1.000000 2041 2051 | 2043 2 8791.546986 4216.297980 6395.849615 1.000000 2042 2052 | 2044 2 8796.601562 4243.612438 6394.134681 1.000000 2043 2053 | 2045 2 8787.500287 4279.397366 6415.771572 1.000000 2044 2054 | 2046 2 8776.164003 4317.738136 6418.290990 1.000000 2045 2055 | 2047 2 8745.367045 4352.328243 6402.255753 1.000000 2046 2056 | 2048 2 8735.250154 4368.730435 6397.843887 1.000000 2047 2057 | 2049 2 8697.594027 4402.734418 6351.681739 1.000000 2048 2058 | 2050 2 8674.226331 4449.547771 6310.156418 1.000000 2049 2059 | 2051 2 8659.140376 4491.755930 6274.783152 1.000000 2050 2060 | 2052 2 8629.773424 4516.526444 6245.910210 1.000000 2051 2061 | 2053 2 8624.632950 4529.818392 6230.531420 1.000000 2052 2062 | 2054 2 8632.874965 4541.969832 6212.203057 1.000000 2053 2063 | 2055 2 8630.109658 4567.035077 6180.771408 1.000000 2054 2064 | 2056 2 8622.288968 4594.560426 6165.796852 1.000000 2055 2065 | 2057 2 8614.812444 4612.555627 6180.074043 1.000000 2056 2066 | 2058 2 8627.164324 4608.389506 6198.097578 1.000000 2057 2067 | 2059 2 8630.320360 4626.416931 6231.786941 1.000000 2058 2068 | 2060 2 8612.015802 4654.044987 6224.498154 1.000000 2059 2069 | 2061 2 8595.265805 4685.886720 6219.881028 1.000000 2060 2070 | 2062 2 8384.875000 3867.278320 5847.167969 1.000000 1913 2071 | 2063 2 8369.922078 3855.216931 5848.330299 1.000000 2062 2072 | 2064 2 8362.961121 3826.108401 5856.640725 1.000000 2063 2073 | 2065 2 8337.249791 3800.708900 5856.675907 1.000000 2064 2074 | 2066 2 8339.617358 3758.700085 5882.341746 1.000000 2065 2075 | 2067 2 8309.046811 3695.857433 5893.740125 1.000000 2066 2076 | 2068 2 8283.492303 3642.171980 5889.552692 1.000000 2067 2077 | 2069 2 8265.866975 3624.985488 5877.593728 1.000000 2068 2078 | 2070 2 8252.875001 3603.163184 5885.742343 1.000000 2069 2079 | 2071 2 8240.320041 3559.573307 5888.092031 1.000000 2070 2080 | 2072 2 8218.359655 3524.916082 5867.191574 1.000000 2071 2081 | 2073 2 8196.038902 3501.177880 5874.603351 1.000000 2072 2082 | 2074 2 8150.187738 3478.651411 5892.966919 1.000000 2073 2083 | 2075 2 8259.773446 3551.469671 5853.064258 1.000000 2071 2084 | 2076 2 8282.140365 3558.355575 5828.872915 1.000000 2075 2085 | 2077 2 8297.023334 3568.386723 5809.337826 1.000000 2076 2086 | 2078 2 8318.226597 3560.803566 5797.713070 1.000000 2077 2087 | 2079 2 8383.695446 3521.520524 5763.082091 1.000000 2078 2088 | 2080 2 8392.585917 3506.778341 5746.738344 1.000000 2079 2089 | 2081 2 8393.781260 3505.993084 5712.529320 1.000000 2080 2090 | 2082 2 8412.218567 3511.094803 5699.273295 1.000000 2081 2091 | 2083 2 8417.304502 3518.943463 5673.797019 1.000000 2082 2092 | 2084 2 8435.484424 3526.625981 5642.486327 1.000000 2083 2093 | 2085 2 8250.843961 3628.006894 5865.097688 1.000000 2069 2094 | 2086 2 8244.906150 3625.591874 5855.558814 1.000000 2085 2095 | 2087 2 8224.851785 3635.738267 5837.039282 1.000000 2086 2096 | 2088 2 8259.359455 3625.821349 5820.351425 1.000000 2087 2097 | 2089 2 8313.882658 3649.713939 5781.320276 1.000000 2088 2098 | 2090 2 8343.351699 3662.112289 5762.710702 1.000000 2089 2099 | 2091 2 8404.070230 3663.817530 5746.714990 1.000000 2090 2100 | 2092 2 8450.890366 3676.243122 5727.378737 1.000000 2091 2101 | 2093 2 8519.406414 3698.149451 5736.890586 1.000000 2092 2102 | 2094 2 7721.742283 4207.117142 5388.984226 1.000000 1842 2103 | 2095 2 7744.734208 4191.783148 5337.115222 1.000000 2094 2104 | 2096 2 7762.476759 4189.122951 5323.687259 1.000000 2095 2105 | 2097 2 7794.640761 4193.976633 5313.660134 1.000000 2096 2106 | 2098 2 7862.195563 4182.821399 5277.189316 1.000000 2097 2107 | 2099 2 7895.601359 4192.512780 5253.824210 1.000000 2098 2108 | 2100 2 7935.257957 4208.938608 5235.961054 1.000000 2099 2109 | 2101 2 7989.414271 4250.031135 5195.882634 1.000000 2100 2110 | 2102 2 8034.710916 4294.854586 5181.882973 1.000000 2101 2111 | 2103 2 8081.929931 4314.850709 5158.670110 1.000000 2102 2112 | 2104 2 8123.023560 4329.563480 5131.913846 1.000000 2103 2113 | 2105 2 8174.593824 4346.036018 5099.664195 1.000000 2104 2114 | 2106 2 8228.663882 4369.912024 5074.978445 1.000000 2105 2115 | 2107 2 8290.968500 4367.302731 5035.449183 1.000000 2106 2116 | 2108 2 8349.726285 4364.791023 5017.332079 1.000000 2107 2117 | 2109 2 8404.773371 4372.124011 5015.534979 1.000000 2108 2118 | 2110 2 8474.921776 4368.510791 4997.742256 1.000000 2109 2119 | 2111 2 8542.757831 4320.745129 4997.193332 1.000000 2110 2120 | 2112 2 8588.749899 4283.175697 4996.648395 1.000000 2111 2121 | 2113 2 8631.711076 4259.303824 4995.138716 1.000000 2112 2122 | 2114 2 8695.242210 4240.895621 4989.216813 1.000000 2113 2123 | 2115 2 8746.546685 4220.878956 4983.978493 1.000000 2114 2124 | 2116 2 8821.148213 4202.470560 4961.650343 1.000000 2115 2125 | 2117 2 8881.242234 4202.283336 4958.896385 1.000000 2116 2126 | 2118 2 8899.523462 4246.205009 4956.189467 1.000000 2117 2127 | 2119 2 8943.671669 4283.229589 4971.203038 1.000000 2118 2128 | 2120 2 8962.007751 4314.320458 4984.283403 1.000000 2119 2129 | 2121 2 8982.804673 4347.305552 4999.484473 1.000000 2120 2130 | 2122 2 8964.718761 4340.557746 5029.816193 1.000000 2121 2131 | 2123 2 8973.414042 4350.134805 5091.974642 1.000000 2122 2132 | 2124 2 8913.703052 4284.308675 4958.072287 1.000000 2118 2133 | 2125 2 8907.140371 4283.811527 4970.482387 1.000000 2124 2134 | 2126 2 8897.773492 4316.258896 4990.167883 1.000000 2125 2135 | 2127 2 8869.094007 4368.100556 5023.158343 1.000000 2126 2136 | 2128 2 8829.968554 4353.960994 5057.322240 1.000000 2127 2137 | 2129 2 8837.960770 4354.678839 5069.788915 1.000000 2128 2138 | 2130 2 8863.882627 4368.026395 5116.492105 1.000000 2129 2139 | 2131 2 8873.953078 4390.082988 5136.849817 1.000000 2130 2140 | 2132 2 8865.890655 4392.548723 5154.365263 1.000000 2131 2141 | 2133 2 8879.945539 4361.299667 5187.935436 1.000000 2132 2142 | 2134 2 8878.750253 4327.717701 5216.871105 1.000000 2133 2143 | 2135 2 8896.367051 4316.067433 5257.519291 1.000000 2134 2144 | 2136 2 8936.437741 4287.286042 5296.000094 1.000000 2135 2145 | 2137 2 8972.398395 4244.533280 5310.697469 1.000000 2136 2146 | 2138 2 8983.296773 4220.083150 5329.327950 1.000000 2137 2147 | 2139 2 8976.531083 4233.178615 5351.888450 1.000000 2138 2148 | 2140 2 8970.242197 4192.619065 5383.320554 1.000000 2139 2149 | 2141 2 8891.210946 4223.874126 4974.056597 1.000000 2117 2150 | 2142 2 8479.734487 4394.516587 4975.853617 1.000000 2110 2151 | 2143 2 8520.031476 4420.029288 4972.466748 1.000000 2142 2152 | 2144 2 8552.257848 4424.660219 4971.250016 1.000000 2143 2153 | 2145 2 8539.671829 4457.678779 4999.435660 1.000000 2144 2154 | 2146 2 8529.116933 4545.615332 5070.927792 1.000000 2145 2155 | 2147 2 8538.359180 4598.139518 5005.148328 1.000000 2146 2156 | 2148 2 8527.398167 4578.460905 4982.955150 1.000000 2147 2157 | 2149 2 8553.320247 4572.181786 4959.913945 1.000000 2148 2158 | 2150 2 8523.304585 4547.279375 4933.652422 1.000000 2149 2159 | 2151 2 8518.883021 4511.698242 4925.888554 1.000000 2150 2160 | 2152 2 7374.218855 3568.108516 4037.119189 1.000000 1796 2161 | 2153 2 7393.203103 3555.486353 4072.986251 1.000000 2152 2162 | 2154 2 7447.656445 3525.733288 4116.910109 1.000000 2153 2163 | 2155 2 7452.335957 3483.088727 4124.004013 1.000000 2154 2164 | 2156 3 6957.863320 2484.358264 3253.827009 1.000000 1 2165 | 2157 3 6961.824154 2484.135126 3255.643440 1.000000 2156 2166 | 2158 3 6964.246046 2482.331289 3255.643440 1.000000 2157 2167 | 2159 3 6983.375249 2474.820309 3267.800751 1.000000 2158 2168 | 2160 3 7000.547010 2460.869222 3263.705071 1.000000 2159 2169 | 2161 3 7015.054668 2438.666943 3262.456987 1.000000 2160 2170 | 2162 3 7033.984589 2414.241336 3264.046957 1.000000 2161 2171 | 2163 3 7038.281150 2408.558649 3265.509778 1.000000 2162 2172 | 2164 3 6958.703288 2490.459993 3257.470668 1.000000 2156 2173 | 2165 3 6958.023583 2504.208908 3262.228530 1.000000 2164 2174 | 2166 3 6945.117372 2528.597582 3265.402300 1.000000 2165 2175 | 2167 3 6936.179449 2558.762790 3266.892634 1.000000 2166 2176 | 2168 3 6918.695223 2588.732521 3268.673865 1.000000 2167 2177 | 2169 3 6905.445349 2601.658075 3270.226461 1.000000 2168 2178 | 2170 3 6898.304920 2607.809600 3271.031275 1.000000 2169 2179 | 2171 3 6881.562308 2623.475725 3295.365314 1.000000 2170 2180 | 2172 3 6871.601652 2630.275348 3311.064427 1.000000 2171 2181 | 2173 3 6956.632962 2498.106399 3265.642557 1.000000 2164 2182 | 2174 3 6950.031357 2507.797788 3271.921763 1.000000 2173 2183 | 2175 3 6942.328164 2512.214830 3288.978415 1.000000 2174 2184 | 2176 3 6940.999786 2523.714858 3305.019411 1.000000 2175 2185 | 2177 3 6937.773191 2544.517641 3327.333872 1.000000 2176 2186 | 2178 3 6929.265462 2559.788226 3337.716871 1.000000 2177 2187 | 2179 3 6931.624788 2571.531305 3365.968629 1.000000 2178 2188 | 2180 3 6930.195361 2574.189575 3380.675809 1.000000 2179 2189 | 2181 3 6912.335650 2586.891686 3397.816483 1.000000 2180 2190 | 2182 3 6897.031251 2583.252930 3410.457032 1.000000 2181 2191 | 2183 3 6893.289141 2581.885605 3405.255886 1.000000 2182 2192 | 2184 3 6940.671881 2571.545783 3372.621199 1.000000 2179 2193 | 2185 3 6951.882736 2558.201131 3394.538972 1.000000 2184 2194 | 2186 3 6956.062379 2555.988310 3402.843692 1.000000 2185 2195 | 2187 3 6968.640768 2497.513727 3262.511837 1.000000 2164 2196 | 2188 3 6973.445504 2507.337831 3265.615139 1.000000 2187 2197 | 2189 3 6979.288819 2538.123894 3278.740137 1.000000 2188 2198 | 2190 3 6976.429404 2554.776223 3287.857405 1.000000 2189 2199 | 2191 3 6976.812330 2568.328131 3296.406170 1.000000 2190 2200 | 2192 3 6976.054690 2584.643610 3304.408176 1.000000 2191 2201 | 2193 3 6968.452925 2607.489196 3321.199125 1.000000 2192 2202 | 2194 3 6969.797155 2634.732427 3337.408164 1.000000 2193 2203 | 2195 3 6964.562723 2652.388572 3346.115268 1.000000 2194 2204 | 2196 3 6956.507643 2655.865894 3349.020063 1.000000 2195 2205 | 2197 3 6955.336126 2674.915936 3361.001963 1.000000 2196 2206 | 2198 3 6957.008089 2693.220788 3370.980526 1.000000 2197 2207 | 2199 3 6955.828381 2702.913113 3376.529289 1.000000 2198 2208 | 2200 3 6966.640375 2696.966784 3375.802804 1.000000 2199 2209 | 2201 3 6979.492469 2700.190372 3375.152396 1.000000 2200 2210 | 2202 3 6995.241961 2682.923866 3396.578067 1.000000 2201 2211 | 2203 3 6995.609398 2667.656112 3403.824223 1.000000 2202 2212 | 2204 3 7003.554968 2654.022470 3408.148442 1.000000 2203 2213 | 2205 3 7005.812560 2636.370202 3425.427809 1.000000 2204 2214 | 2206 3 7012.273428 2621.650415 3431.353536 1.000000 2205 2215 | 2207 3 6954.671726 2727.691355 3389.958877 1.000000 2199 2216 | 2208 3 6938.789231 2737.175867 3392.968853 1.000000 2207 2217 | 2209 3 6959.843794 2457.826055 3260.955165 1.000000 1 2218 | 2210 3 6963.500055 2422.446189 3271.880954 1.000000 2209 2219 | 2211 3 6960.222609 2409.011692 3269.622160 1.000000 2210 2220 | 2212 3 6961.351700 2465.916918 3242.341700 1.000000 1 2221 | 2213 3 6970.062714 2446.531148 3242.990337 1.000000 2212 2222 | 2214 3 6976.281142 2433.626955 3244.919807 1.000000 2213 2223 | 2215 3 6996.015709 2402.336879 3254.132891 1.000000 2214 2224 | 2216 3 6999.460785 2388.414007 3257.425725 1.000000 2215 2225 | 2217 3 6993.578157 2376.942415 3245.513607 1.000000 2216 2226 | 2218 3 6992.179609 2369.693343 3246.945430 1.000000 2217 2227 | 2219 3 7000.781450 2350.627945 3243.248156 1.000000 2218 2228 | 2220 3 7004.640670 2344.025507 3247.656220 1.000000 2219 2229 | 2221 3 7005.828255 2329.318354 3244.888662 1.000000 2220 2230 | 2222 3 6965.523571 2452.782101 3222.851619 1.000000 2212 2231 | 2223 3 6979.750000 2438.319336 3181.048829 1.000000 2222 2232 | 2224 3 6965.875237 2441.171746 3167.216842 1.000000 2223 2233 | 2225 3 6959.547079 2442.511835 3161.222573 1.000000 2224 2234 | 2226 3 6987.515698 2428.789179 3168.027401 1.000000 2223 2235 | 2227 3 7001.702853 2403.181744 3152.794993 1.000000 2226 2236 | 2228 3 7013.742227 2385.258697 3137.162038 1.000000 2227 2237 | 2229 3 7018.257785 2377.155171 3132.290908 1.000000 2228 2238 | 2230 3 6958.710745 2470.752895 3237.105432 1.000000 1 2239 | 2231 3 6944.586018 2462.260666 3219.048743 1.000000 2230 2240 | 2232 3 6934.648626 2457.203206 3204.042872 1.000000 2231 2241 | 2233 3 6922.601544 2452.251994 3187.966745 1.000000 2232 2242 | 2234 3 6915.968580 2444.495036 3172.947156 1.000000 2233 2243 | 2235 3 6904.234156 2439.236328 3158.029177 1.000000 2234 2244 | 2236 3 6899.952890 2426.778183 3140.501840 1.000000 2235 2245 | 2237 3 6898.679814 2413.101464 3120.988396 1.000000 2236 2246 | 2238 3 6888.734312 2401.387700 3100.621011 1.000000 2237 2247 | 2239 3 6872.578135 2394.313570 3085.919855 1.000000 2238 2248 | 2240 3 6866.773549 2376.032338 3068.822348 1.000000 2239 2249 | 2241 3 6858.507899 2365.378893 3049.548716 1.000000 2240 2250 | 2242 3 6851.109634 2363.131790 3045.675891 1.000000 2241 2251 | 2243 3 6940.695031 2449.596775 3209.033245 1.000000 2231 2252 | 2244 3 6942.429888 2431.540041 3194.689571 1.000000 2243 2253 | 2245 3 6944.336177 2406.287204 3185.800661 1.000000 2244 2254 | 2246 3 6949.538878 2385.645582 3169.716870 1.000000 2245 2255 | 2247 3 6951.859193 2373.626045 3161.677628 1.000000 2246 2256 | 2248 3 6945.820491 2356.193368 3142.312607 1.000000 2247 2257 | 2249 3 6945.039027 2345.123973 3134.392654 1.000000 2248 2258 | 2250 3 6944.257747 2333.345849 3125.103635 1.000000 2249 2259 | 2251 3 6950.086157 2325.413094 3118.470759 1.000000 2250 2260 | 2252 3 6955.140742 2463.615219 3234.722770 1.000000 2230 2261 | 2253 3 6940.359542 2445.184571 3242.464737 1.000000 2252 2262 | 2254 3 6939.718665 2435.020620 3241.419967 1.000000 2253 2263 | 2255 3 6920.101841 2430.250951 3233.656162 1.000000 2254 2264 | 2256 3 6907.968657 2418.730350 3228.734434 1.000000 2255 2265 | 2257 3 6895.718750 2414.541015 3225.501954 1.000000 2256 2266 | 2258 3 6881.718789 2399.978539 3230.443388 1.000000 2257 2267 | 2259 3 6873.859145 2386.076149 3233.769413 1.000000 2258 2268 | 2260 3 6871.164118 2381.711843 3238.417850 1.000000 2259 2269 | -------------------------------------------------------------------------------- /tests/test_download.py: -------------------------------------------------------------------------------- 1 | import re 2 | from pathlib import Path 3 | 4 | import pytest 5 | 6 | from morphapi.api.allenmorphology import AllenMorphology 7 | from morphapi.api.mouselight import MouseLightAPI 8 | from morphapi.api.neuromorphorg import NeuroMorpOrgAPI 9 | 10 | 11 | def test_neuromorpho_download(tmpdir): 12 | api = NeuroMorpOrgAPI(base_dir=tmpdir) 13 | cache_path = Path(api.neuromorphorg_cache) 14 | 15 | # Test get_fields_values 16 | assert len(api.get_fields_values("strain")) > 1000 17 | 18 | # Test get_neurons_metadata 19 | with pytest.raises( 20 | ValueError, 21 | match=re.escape( 22 | f"Query criteria UNKNOWN_FIELD not in " 23 | f"available fields: {api.fields}" 24 | ), 25 | ): 26 | api.get_neurons_metadata(UNKNOWN_FIELD=0) 27 | 28 | with pytest.raises( 29 | ValueError, 30 | match=re.escape( 31 | "Query criteria value UNKNOWN_VALUE for field strain not valid." 32 | f"Valid values include: {api.get_fields_values('strain')}" 33 | ), 34 | ): 35 | api.get_neurons_metadata(strain="UNKNOWN_VALUE") 36 | 37 | metadata, _ = api.get_neurons_metadata( 38 | size=2, # Can get the metadata for up to 500 neurons at a time 39 | species="mouse", 40 | cell_type="pyramidal", 41 | brain_region="neocortex", 42 | ) 43 | 44 | if len(metadata) != 2: 45 | raise ValueError("Incorrect metadata length") 46 | 47 | # Test download_neurons 48 | assert len(list(cache_path.iterdir())) == 0 49 | neurons = api.download_neurons(metadata) 50 | 51 | assert len(neurons) == len(metadata) 52 | assert len(list(cache_path.iterdir())) == 2 53 | 54 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 55 | 56 | # Test no load 57 | assert api.download_neurons(metadata, load_neurons=False)[0].points is None 58 | assert len(list(cache_path.iterdir())) == 2 59 | 60 | # Test using neuron names 61 | assert ( 62 | api.download_neurons( 63 | metadata, load_neurons=False, use_neuron_names=True 64 | )[0].points 65 | is None 66 | ) 67 | assert len(list(cache_path.iterdir())) == 4 68 | 69 | cache_files = list(cache_path.iterdir()) 70 | assert sorted([i.name for i in cache_files]) == [ 71 | "10075.swc", 72 | "10076.swc", 73 | "C1q-Cell7-40x.swc", 74 | "Ctrl-Cell3-40x.swc", 75 | ] 76 | 77 | # Test failure 78 | metadata[0]["neuron_id"] = "BAD ID" 79 | metadata[0]["neuron_name"] = "BAD NAME" 80 | neurons = api.download_neurons([metadata[0]]) 81 | 82 | assert neurons[0].data_file.name == "BAD ID.swc" 83 | assert neurons[0].points is None 84 | 85 | 86 | def test_mouselight_download(tmpdir): 87 | mlapi = MouseLightAPI(base_dir=tmpdir) 88 | 89 | neurons_metadata = mlapi.fetch_neurons_metadata( 90 | filterby="soma", filter_regions=["MOs"] 91 | ) 92 | neurons_metadata = sorted(neurons_metadata, key=lambda x: x["idString"]) 93 | 94 | neurons = mlapi.download_neurons(neurons_metadata[0]) 95 | 96 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 97 | 98 | # Test no load 99 | assert ( 100 | mlapi.download_neurons(neurons_metadata[0], load_neurons=False)[ 101 | 0 102 | ].points 103 | is None 104 | ) 105 | 106 | # Test failure 107 | neurons_metadata[0]["idString"] = "BAD ID" 108 | neurons = mlapi.download_neurons(neurons_metadata[0]) 109 | 110 | assert neurons[0].data_file.name == "BAD ID.swc" 111 | assert neurons[0].points is None 112 | 113 | # Test filter without atlas 114 | filtered_neurons_metadata = mlapi.filter_neurons_metadata( 115 | neurons_metadata, filterby="soma", filter_regions=["MOs6b"] 116 | ) 117 | assert all( 118 | [i["brainArea_acronym"] == "MOs6b" for i in filtered_neurons_metadata] 119 | ) 120 | 121 | # Test filter with atlas 122 | atlas = mlapi.fetch_default_atlas() 123 | 124 | filtered_neurons_metadata_atlas = mlapi.filter_neurons_metadata( 125 | neurons_metadata, 126 | filterby="soma", 127 | filter_regions=["MOs6b"], 128 | atlas=atlas, 129 | ) 130 | assert all( 131 | [ 132 | i["brainArea_acronym"] == "MOs6b" 133 | for i in filtered_neurons_metadata_atlas 134 | ] 135 | ) 136 | assert filtered_neurons_metadata == filtered_neurons_metadata_atlas 137 | 138 | 139 | def test_allen_morphology_download(tmpdir): 140 | am = AllenMorphology(base_dir=tmpdir) 141 | 142 | # Select some mouse neurons in the primary visual cortex 143 | neurons_df = am.neurons.loc[ 144 | (am.neurons.species == "Mus musculus") 145 | & (am.neurons.structure_area_abbrev == "VISp") 146 | ].loc[[2, 120, 505]] 147 | 148 | # Download some neurons 149 | neurons = am.download_neurons(neurons_df["id"].values) 150 | 151 | neurons = [neuron.create_mesh()[1] for neuron in neurons] 152 | 153 | # Test no load 154 | assert all( 155 | i.points is None 156 | for i in am.download_neurons( 157 | neurons_df["id"].values, load_neurons=False 158 | ) 159 | ) 160 | 161 | # Test failure 162 | neurons_df.loc[2, "id"] = "BAD ID" 163 | neurons = am.download_neurons(neurons_df["id"].values) 164 | 165 | assert neurons[0].data_file.name == "BAD ID.swc" 166 | assert neurons[0].points is None 167 | -------------------------------------------------------------------------------- /tests/test_neuron.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from random import choice 3 | 4 | import numpy as np 5 | import pytest 6 | from vedo import Mesh 7 | 8 | from morphapi.morphology.morphology import Neuron 9 | from morphapi.utils.data_io import listdir 10 | 11 | 12 | @pytest.fixture 13 | def neuron(): 14 | files = listdir("tests/data") 15 | return Neuron(data_file=choice(files)) 16 | 17 | 18 | args = [ 19 | (3, "salmon", "darkseagreen", "orangered", "blackboard", "blue", True), 20 | (3, "salmon", None, None, "blackboard", "blue", False), 21 | (3, "salmon", None, None, None, None, False), 22 | (5, "salmon", "darkseagreen", "orangered", "blackboard", "blue", False), 23 | ] 24 | 25 | 26 | @pytest.mark.parametrize("radius,soma,apical,basal,axon,whole,cache", args) 27 | def test_create_mesh(neuron, radius, soma, apical, basal, axon, whole, cache): 28 | components, neuron = neuron.create_mesh( 29 | neurite_radius=radius, # 30 | soma_color=soma, # Specify colors [see vedo.colors for more details] 31 | apical_dendrites_color=apical, 32 | basal_dendrites_color=basal, 33 | axon_color=axon, 34 | whole_neuron_color=whole, 35 | use_cache=cache, 36 | ) 37 | 38 | if not isinstance(neuron, Mesh): 39 | raise ValueError 40 | 41 | if not isinstance(components, dict): 42 | raise ValueError 43 | 44 | for ntp in Neuron._neurite_types: 45 | if ntp not in components.keys(): 46 | raise ValueError 47 | if components[ntp] is not None: 48 | if not isinstance(components[ntp], Mesh): 49 | raise ValueError 50 | 51 | 52 | def test_create_mesh_args(neuron): 53 | neuron.create_mesh( 54 | neurite_radius=np.random.uniform(2, 20), neuron_color="red" 55 | ) 56 | neuron.create_mesh(neuron_number=1, cmap="Reds") 57 | 58 | 59 | def test_empty_neuron(caplog): 60 | file = sorted(listdir("tests/data"))[0] 61 | neuron = Neuron(file, load_file=False) 62 | 63 | assert str(neuron.data_file) == str(Path("tests/data/example1.swc")) 64 | 65 | caplog.clear() 66 | neuron.create_mesh() 67 | 68 | assert caplog.messages == [ 69 | "No data loaded, you can use the 'load_from_file' method to " 70 | "try to load the file." 71 | ] 72 | 73 | neuron.load_from_file() 74 | 75 | caplog.clear() 76 | neuron.create_mesh() 77 | assert caplog.messages == [] 78 | --------------------------------------------------------------------------------