From 4787d4f8dc4e441d53350a2ae666665f19faeb38 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:00:22 +0300 Subject: [PATCH 001/142] docs on extending junifer (WIP) --- docs/extending/index.rst | 18 ++++++++++++++++++ docs/index.rst | 1 + 2 files changed, 19 insertions(+) create mode 100644 docs/extending/index.rst diff --git a/docs/extending/index.rst b/docs/extending/index.rst new file mode 100644 index 000000000..ce25d63bd --- /dev/null +++ b/docs/extending/index.rst @@ -0,0 +1,18 @@ +.. include:: ../links.inc + +Extending junifer +================= + +While we aim to provide as many datasets and markers as possible, we are also +interested in allowing users to extend the functionality with their own +datagrabbers, preprocessing, markers, etc. + +This does not mean that the new functinality will have to be included in +junifer before the user can use them. Instead, the user can simply +create a new python file, code the desired functionality and use it with +junifer. This is the first step towards including the new functionality in +the junifer package. + +In this section we will show how to extend junifer, by creating new +datagrabbers, preprocessing and markers, following the _junifer_ way. + diff --git a/docs/index.rst b/docs/index.rst index cef0f0606..5eb8c8a72 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -21,6 +21,7 @@ enabling others to extend it easily. installation understanding/index.rst builtin + extending/index.rst auto_examples/index.rst api/index.rst contribution -- 2.52.0 From d4000e8a7e64e993c6d99c5c41c3ac3088ea4521 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:19:11 +0300 Subject: [PATCH 002/142] update --- docs/extending/datagrabber.rst | 0 docs/extending/index.rst | 11 ++++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 docs/extending/datagrabber.rst diff --git a/docs/extending/datagrabber.rst b/docs/extending/datagrabber.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/extending/index.rst b/docs/extending/index.rst index ce25d63bd..dcd38bb7e 100644 --- a/docs/extending/index.rst +++ b/docs/extending/index.rst @@ -14,5 +14,14 @@ junifer. This is the first step towards including the new functionality in the junifer package. In this section we will show how to extend junifer, by creating new -datagrabbers, preprocessing and markers, following the _junifer_ way. +datagrabbers, preprocessing and markers, following the *junifer* way. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + datagrabber + .. datareader + .. marker + .. storage \ No newline at end of file -- 2.52.0 From c476969bcfe342c428ede6414fdcc02b28800e21 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:28:06 +0300 Subject: [PATCH 003/142] typo --- docs/extending/index.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/extending/index.rst b/docs/extending/index.rst index dcd38bb7e..e14714c6d 100644 --- a/docs/extending/index.rst +++ b/docs/extending/index.rst @@ -22,6 +22,3 @@ datagrabbers, preprocessing and markers, following the *junifer* way. :caption: Contents: datagrabber - .. datareader - .. marker - .. storage \ No newline at end of file -- 2.52.0 From f9a7c5af203e296aab55f96bee22a1b2b7931519 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:41:18 +0300 Subject: [PATCH 004/142] now? --- docs/extending/datagrabber.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/extending/datagrabber.rst b/docs/extending/datagrabber.rst index e69de29bb..acb7b4b5f 100644 --- a/docs/extending/datagrabber.rst +++ b/docs/extending/datagrabber.rst @@ -0,0 +1,4 @@ +Creating datagrabbers +===================== + +Datagrabbers are created by... \ No newline at end of file -- 2.52.0 From 7381b691d928e173c0ba7d5a077eebde1e08cfd8 Mon Sep 17 00:00:00 2001 From: Fede Date: Sun, 23 Oct 2022 14:10:54 +0300 Subject: [PATCH 005/142] fixing the doc and consistency --- docs/api/api.rst | 10 + docs/contribution.rst | 6 +- docs/extending/datagrabber.rst | 271 +++++++++++++++++- docs/extending/index.rst | 4 +- docs/links.inc | 1 + docs/understanding/data.rst | 7 +- docs/understanding/datagrabber.rst | 5 +- docs/understanding/index.rst | 2 + docs/understanding/marker.rst | 6 +- docs/understanding/storage.rst | 2 + examples/run_datagrabber_bids_datalad.py | 6 +- .../tests/test_datagrabber_utils.py | 12 +- junifer/datagrabber/tests/test_multiple.py | 12 +- .../datagrabber/tests/test_pattern_datalad.py | 24 +- .../datareader/tests/test_default_reader.py | 18 +- 15 files changed, 338 insertions(+), 48 deletions(-) diff --git a/docs/api/api.rst b/docs/api/api.rst index b1a96e243..106a4e309 100644 --- a/docs/api/api.rst +++ b/docs/api/api.rst @@ -2,6 +2,16 @@ API Functions ^^^^^^^^^^^^^^ +Main API functions +------------------ + .. automodule:: junifer.api :members: :imported-members: + +Decorators +---------- + +.. automodule:: junifer.api.decorators + :members: + :imported-members: diff --git a/docs/contribution.rst b/docs/contribution.rst index 47e646bd0..b510c6a4a 100644 --- a/docs/contribution.rst +++ b/docs/contribution.rst @@ -175,10 +175,10 @@ texts. # The BIDS datagrabber requires three parameters: the types of data we want, # the specific pattern that matches each type, and the variables that will be # replaced int he patterns. - types = ["T1w", "bold"] + types = ["T1w", "BOLD"] patterns = { "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } replacements = ["subject"] ############################################################################### @@ -204,7 +204,7 @@ texts. ############################################################################### # Another feature of the datagrabber is the ability to get a specific # element by its name. In this case, we index `sub-01` and we get the file - # paths for the two types of data we want (T1w and bold). + # paths for the two types of data we want (T1w and BOLD). with PatternDataladDataGrabber( rootdir=rootdir, types=types, diff --git a/docs/extending/datagrabber.rst b/docs/extending/datagrabber.rst index acb7b4b5f..3ee2bc871 100644 --- a/docs/extending/datagrabber.rst +++ b/docs/extending/datagrabber.rst @@ -1,4 +1,271 @@ -Creating datagrabbers +.. include:: ../links.inc + +.. _extending_datagrabbers: + +Creating DataGrabbers ===================== -Datagrabbers are created by... \ No newline at end of file +DataGrabbers are the first step of the pipeline. It's purpose is to interpret +the structure of a dataset and provide two specific functionalities: + +1) Given an *element*, provide the path to each kind of data available for this + element (e.g. the path to the T1 image, the path to the T2 image, etc.) +2) Provide the list of *elements* available in the dataset. + +In this section, we will see how to create a datagrabber for a dataset. Basic +aspects of datagrabbers are covedered in the +:ref:`Understanding DataGrabbers ` section. + +.. _extending_datagrabbers_think: + +Step 1: Think about the element +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Like with any programming-related task, the first step is to think. When +creating a DataGrabber, we need to first define what an *element* is. +The *element* should be the smallest unit of data that can be processed. That +is, for each element, there should be a set of data that can be processed, but +only one of each *data type* (see :ref:`data_types`). + +For example, if we have a dataset from an fMRI study in which: + +a) both T1w and fMRI was acquired +b) 20 subjects went through a experiment twice +c) the experiment included resting-stage fMRI and a task named *stroop* + +then the *element* should be composed of 3 items: + +* ``subject``: The subject IDs, e.g. `sub001`, `sub002`, ... `sub020` +* ``session``: The sesion number, e.g. `ses1`, `ses2` +* ``task``: The task performed, e.g. `rest`, `stroop` + +If any of this items were not part of the element, then we will have more than +one ``T1w`` and/or ``BOLD`` image for each subject, which is not allowed. + +Importantly, nothing prevents that one image is part of two different elements. +For example, it is usually the case that the ``T1w`` image is not acquired for +each task, but once in the entire session. So in this case, the ``T1w`` image +for the element (``sub001``, ``ses1``, ``rest``) will be the same as the +``T1w`` image for the element (``sub001``, ``ses1``, ``stroop``). + +We will now continue this section using as an example, a dataset in BIDS format +in which each 9 subjects (`sub-01` to `sub-09`) were scanned each in 3 +sessions (`ses-01`, `ses-02`, `ses-03`) and each session included a `T1w` and +a `BOLD` image (resting-state), except for `ses-03` which was only anatomical. + +Step 2: Think about the dataset's structure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Now that we have our element defined, we need to think about the structure of +the dataset. Mainly, because the structure of the dataset will determine how +the DataGrabber needs to be implemented. + +Junifer provides an abstract class to deal with datasets that can be thought in +terms of *patterns*. A *pattern* is a string that contains placeholders that are +replaced by the actual values of the element. In our BIDS example, the path +to the T1w image of subject `sub-01` and session `ses-01`, relative to the +dataset location, is ``sub-01/ses-01/anat/sub-01_ses-01_T1w.nii.gz``. By +replacing ``sub-01`` with ``sub-02``, we can obtain the T1w image of the first +session of the second subject. Indeed, the path to the T1w images can be +expressed as a pattern: + +``{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz`` + +where ``{subject}`` is the replacement for the subject id and ``{session}}`` +is the replacement for the session id. + +Since it is a BIDS dataaset, the same happens with the BOLD images. The path to +the BOLD images can be expressed as a pattern: + +``{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz`` + + +This will be the norm in most of the datasets. If your dataset can be expressed +in terms of patterns, then follow :ref:`extending_datagrabbers_pattern`. +Otherwise, we recommend that you take time to re-think about your dataset +structure and why it does not have clear *patterns*. Feel free to open a +discussion in the `junifer Discussions`_ page. Most probably we can help you +get your dataset in order. + +If there is no other way, then you can follow :ref:`extending_datagrabbers_base` +to create a DataGrabber from scratch. + + +.. _extending_datagrabbers_pattern: + +Option A: Extending from PatternDataGrabber +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :py:class:`~junifer.datagrabber.PatternDataGrabber` class is an +abstract class that has the functionality of understanding patterns embeded +in it. + +Before creating the datagrabber, we need to define 3 variables: + +* ``types``: A list with the available :ref:`data_types` in our dataset +* ``patterns``: A dictionary that specifies the pattern for each data type. +* ``replacements``: A list indicating which of the elements in the patterns + should be replaced by the values of the element. + +For example, in our BIDS example, the variables will be: + +.. code-block:: python + + types = ["T1w", "BOLD"] + patterns = { + "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", + "BOLD": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", + } + replacements = ["subject", "session"] + + +An additional fourth variable is the ``datadir``, which should be the path to +where the dataset is located. For example, if the dataset is located in +``/data/project/test/data``, then ``datadir`` should be +``/data/project/test/data``. Or, if we want to allow the user to specify the +location of the dataset, we can expose the variable in the constructor, as in +this example + +With this defined, we can now create our datagrabber, we will name it +``ExampleBIDSDataGrabber``: + + +.. code-block:: python + + from junifer.datagrabber.pattern import PatternDataGrabber + + class ExampleBIDSDataGrabber(PatternDataGrabber): + + def __init__(self, datadir): + types = ["T1w", "BOLD"] + patterns = { + "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", + "BOLD": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", + } + replacements = ["subject", "session"] + super().__init__( + datadir=datadir, + types=types, + patterns=patterns, + replacements=replacements) + + +Our datagrabber is ready to be used by junifer. However, it is still unknown +to the library. We need to register it in the library. To do so, we need to +use the :py:func:`~junifer.api.decorators.register_datagrabber` decorator. + + +.. code-block:: python + + from junifer.datagrabber.pattern import PatternDataGrabber + from junifer.api.decorators import register_datagrabber + + + @register_datagrabber + class ExampleBIDSDataGrabber(PatternDataGrabber): + + def __init__(self, datadir): + types = ["T1w", "BOLD"] + patterns = { + "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", + "BOLD": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", + } + replacements = ["subject", "session"] + super().__init__( + datadir=datadir, + types=types, + patterns=patterns, + replacements=replacements) + + +Now, we can use our datagrabber in junifer, by setting the ``datagrabber`` kind +in the yaml file to ``ExampleBIDSDataGrabber``. Remember that we still need to +set the ``datadir``. + +.. code-block:: yaml + + datagrabber: + kind: ExampleBIDSDataGrabber + datadir: /data/project/test/data + + +Optional: Using datalad +----------------------- + +If you are using datalad, you can use the +:py:class:`~junifer.datagrabber.PatternDataladDataGrabber` instead of the +:py:class:`~junifer.datagrabber.PatternDataGrabber`. This class will also +interpret patterns, but will also use datalad to `clone` and `get` the data. + +The main difference between the two is that the ``datadir`` is not the actual +location of the dataset, but the location where the dataset will be cloned. It +can now be ``None``, which means that the data will be downloaded to a +temporary directory. To set the location of the dataset, you can use the +``uri`` argument in the constructor. Additionally, a ``rootdir`` argument can +be used to specify the path to the root directory of the dataset after doing +``datalad clone`` + +In the example, the dataset is hosted in gin +(``https://gin.g-node.org/juaml/datalad-example-bids``). + +When we clone this dataset, we will see the following structure: + +.. code-block:: + + . + └── example_bids_ses + ├── sub-01 + │ ├── ses-01 + │ ├── ses-02 + │ └── ses-03 + ├── sub-02 + │ ├── ses-01 + │ ├── ses-02 + │ └── ses-03 + ├── sub-03 + ... + +So the patterns will start after ``example_bids_ses``. This is our ``rootdir``. + +Now we have our 2 additional variables: + +.. code-block:: python + + uri = "https://gin.g-node.org/juaml/datalad-example-bids" + rootdir = "example_bids_ses" + + +And we can create our datagrabber: + + +.. code-block:: python + + from junifer.datagrabber.pattern import PatternDataladDataGrabber + from junifer.api.decorators import register_datagrabber + + + @register_datagrabber + class ExampleBIDSDataGrabber(PatternDataladDataGrabber): + + def __init__(self): + types = ["T1w", "BOLD"] + patterns = { + "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", + "BOLD": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", + } + replacements = ["subject", "session"] + uri = "https://gin.g-node.org/juaml/datalad-example-bids" + rootdir = "example_bids_ses" + super().__init__( + datadir=None, + uri=uri, + rootdir=rootdir, + types=types, + patterns=patterns, + replacements=replacements) + + +.. _extending_datagrabbers_base: + +Option B: Extending from BaseDataGrabber +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \ No newline at end of file diff --git a/docs/extending/index.rst b/docs/extending/index.rst index e14714c6d..3706e914e 100644 --- a/docs/extending/index.rst +++ b/docs/extending/index.rst @@ -1,5 +1,7 @@ .. include:: ../links.inc +.. _extending: + Extending junifer ================= @@ -18,7 +20,7 @@ datagrabbers, preprocessing and markers, following the *junifer* way. .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Contents: datagrabber diff --git a/docs/links.inc b/docs/links.inc index 47d3ad6a4..6f8d31de1 100644 --- a/docs/links.inc +++ b/docs/links.inc @@ -25,6 +25,7 @@ .. _`Github`: https://github.com/ .. _`junifer Github`: https://github.com/juaml/junifer +.. _`junifer Discussions`: https://github.com/juaml/junifer/discussions .. _`Wikipedia`: https://wikipedia.org diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index 1010720a8..ba50af255 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -1,5 +1,7 @@ .. include:: ../links.inc +.. _understanding_data_object: + The Data Object =============== @@ -16,7 +18,7 @@ The second level of keys are the actual data. So far, there are two keys used: - ``path``: path to the file containing the data. - ``data``: the data loaded in memory. -The :ref:`datagrabber` step will only fill the ``path`` value. +The :ref:`datagrabbers` step will only fill the ``path`` value. The ``data`` value will be filled by the :ref:`datareader` step, if it is one of the possible file types that the datareader can read. @@ -38,6 +40,9 @@ Data types * - ``BOLD`` - BOLD image (4D) - Preprocessed/Denoised BOLD image (fmriprep output) + * - ``BOLD_confounds`` + - BOLD image confounds (CSV/TSV file) + - Confounds that can be applied to the BOLD image. * - ``VBM_GM`` - VBM Gray Matter segmentation (3D) - CAT output (`m0wp1` images) diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index ed27cc606..da9dc0481 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -1,11 +1,10 @@ .. include:: ../links.inc -.. _datagrabber: +.. _datagrabbers: Data Grabber ============ - Description ^^^^^^^^^^^ A datagrabber is an object that can provide datasets you want to junifer. @@ -14,7 +13,7 @@ Of course, datagrabbers are not only possible for Datalad but any origin of a da It is intended to use them as context managers. If you are interested in just using already provided datagrabbers please go to :doc:`../builtin`. If you want to implement your own Data Grabbers you need to inherit from different types of -Data Grabbers we already provide. +Data Grabbers we already provide (see :ref:`extending_datagrabbers`). Typical Data Grabbers ^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/understanding/index.rst b/docs/understanding/index.rst index e24c92883..df2627f36 100644 --- a/docs/understanding/index.rst +++ b/docs/understanding/index.rst @@ -1,5 +1,7 @@ .. include:: ../links.inc +.. _understanding: + Understanding junifer ===================== diff --git a/docs/understanding/marker.rst b/docs/understanding/marker.rst index 3bf018ba7..02446016f 100644 --- a/docs/understanding/marker.rst +++ b/docs/understanding/marker.rst @@ -1,4 +1,6 @@ .. include:: ../links.inc -Marker -====== +.. _markers: + +Markers +======= diff --git a/docs/understanding/storage.rst b/docs/understanding/storage.rst index ef296e1d4..1da80a289 100644 --- a/docs/understanding/storage.rst +++ b/docs/understanding/storage.rst @@ -1,4 +1,6 @@ .. include:: ../links.inc +.. _storage: + Storage ======= diff --git a/examples/run_datagrabber_bids_datalad.py b/examples/run_datagrabber_bids_datalad.py index eb14892a6..727fc5178 100644 --- a/examples/run_datagrabber_bids_datalad.py +++ b/examples/run_datagrabber_bids_datalad.py @@ -23,10 +23,10 @@ configure_logging(level="INFO") # The BIDS datagrabber requires three parameters: the types of data we want, # the specific pattern that matches each type, and the variables that will be # replaced int he patterns. -types = ["T1w", "bold"] +types = ["T1w", "BOLD"] patterns = { "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } replacements = ["subject"] ############################################################################### @@ -52,7 +52,7 @@ with PatternDataladDataGrabber( ############################################################################### # Another feature of the datagrabber is the ability to get a specific # element by its name. In this case, we index `sub-01` and we get the file -# paths for the two types of data we want (T1w and bold). +# paths for the two types of data we want (T1w and BOLD). with PatternDataladDataGrabber( rootdir=rootdir, types=types, diff --git a/junifer/datagrabber/tests/test_datagrabber_utils.py b/junifer/datagrabber/tests/test_datagrabber_utils.py index c26e4be97..4b203a718 100644 --- a/junifer/datagrabber/tests/test_datagrabber_utils.py +++ b/junifer/datagrabber/tests/test_datagrabber_utils.py @@ -19,7 +19,7 @@ def test_validate_types() -> None: with pytest.raises(TypeError, match="must be a list of strings"): validate_types([1]) # type: ignore - validate_types(["T1w", "bold"]) + validate_types(["T1w", "BOLD"]) def test_validate_replacements() -> None: @@ -31,7 +31,7 @@ def test_validate_replacements() -> None: patterns = { "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } with pytest.raises(TypeError, match="must be a list of strings"): @@ -42,7 +42,7 @@ def test_validate_replacements() -> None: wrong_patterns = { "T1w": "{subject}/anat/_T1w.nii.gz", - "bold": "{session}/func/_task-rest_bold.nii.gz", + "BOLD": "{session}/func/_task-rest_bold.nii.gz", } with pytest.raises(ValueError, match="At least one pattern"): @@ -53,7 +53,7 @@ def test_validate_replacements() -> None: def test_validate_patterns() -> None: """Test validation of patterns.""" - types = ["T1w", "bold"] + types = ["T1w", "BOLD"] with pytest.raises(TypeError, match="must be a dict"): validate_patterns(types, "wrong") # type: ignore @@ -74,12 +74,12 @@ def test_validate_patterns() -> None: patterns = { "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } wrongpatterns = { "T1w": "{subject}/anat/{subject}*.nii", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } with pytest.raises(ValueError, match="following a replacement"): diff --git a/junifer/datagrabber/tests/test_multiple.py b/junifer/datagrabber/tests/test_multiple.py index 5e1298d3a..c7113986c 100644 --- a/junifer/datagrabber/tests/test_multiple.py +++ b/junifer/datagrabber/tests/test_multiple.py @@ -27,7 +27,7 @@ def test_multiple() -> None: "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", } pattern2 = { - "bold": "{subject}/{session}/func/" + "BOLD": "{subject}/{session}/func/" "{subject}_{session}_task-rest_bold.nii.gz", } dg1 = PatternDataladDataGrabber( @@ -41,7 +41,7 @@ def test_multiple() -> None: dg2 = PatternDataladDataGrabber( rootdir=rootdir, uri=repo_uri, - types=["bold"], + types=["BOLD"], patterns=pattern2, replacements=replacements, ) @@ -50,7 +50,7 @@ def test_multiple() -> None: types = dg.get_types() assert "T1w" in types - assert "bold" in types + assert "BOLD" in types expected_subs = [ (f"sub-{i:02d}", f"ses-{j:02d}") @@ -64,7 +64,7 @@ def test_multiple() -> None: data = dg[("sub-01", "ses-01")] assert "T1w" in data - assert "bold" in data + assert "BOLD" in data meta = dg.get_meta() assert "class" in meta @@ -85,7 +85,7 @@ def test_multiple_no_intersection() -> None: "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", } pattern2 = { - "bold": "{subject}/{session}/func/" + "BOLD": "{subject}/{session}/func/" "{subject}_{session}_task-rest_bold.nii.gz", } dg1 = PatternDataladDataGrabber( @@ -99,7 +99,7 @@ def test_multiple_no_intersection() -> None: dg2 = PatternDataladDataGrabber( rootdir=rootdir, uri=repo_uri2, - types=["bold"], + types=["BOLD"], patterns=pattern2, replacements=replacements, ) diff --git a/junifer/datagrabber/tests/test_pattern_datalad.py b/junifer/datagrabber/tests/test_pattern_datalad.py index 7cacf7b60..3397d9582 100644 --- a/junifer/datagrabber/tests/test_pattern_datalad.py +++ b/junifer/datagrabber/tests/test_pattern_datalad.py @@ -45,11 +45,11 @@ def test_bids_PatternDataladDataGrabber(tmp_path: Path) -> None: """ # Define types - types = ["T1w", "bold"] + types = ["T1w", "BOLD"] # Define patterns patterns = { "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } # Define replacements replacements = ["subject"] @@ -75,8 +75,8 @@ def test_bids_PatternDataladDataGrabber(tmp_path: Path) -> None: assert t_sub["T1w"]["path"] == ( dg.datadir / f"{elem}/anat/{elem}_T1w.nii.gz" ) - assert "path" in t_sub["bold"] - assert t_sub["bold"]["path"] == ( + assert "path" in t_sub["BOLD"] + assert t_sub["BOLD"]["path"] == ( dg.datadir / f"{elem}/func/{elem}_task-rest_bold.nii.gz" ) @@ -104,11 +104,11 @@ def test_bids_PatternDataladDataGrabber_datadir(tmp_path: Path) -> None: """ # Define types - types = ["T1w", "bold"] + types = ["T1w", "BOLD"] # Define patterns patterns = { "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "bold": "{subject}/func/{subject}_task-rest_bold.nii.gz", + "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", } # Define replacements replacements = ["subject"] @@ -118,7 +118,7 @@ def test_bids_PatternDataladDataGrabber_datadir(tmp_path: Path) -> None: datadir = "dataset" # use string and not absolute path patterns = { "T1w": "example_bids/{subject}/anat/{subject}_T*w.nii.gz", - "bold": "example_bids/{subject}/func/{subject}_task-rest_*.nii.gz", + "BOLD": "example_bids/{subject}/func/{subject}_task-rest_*.nii.gz", } with PatternDataladDataGrabber( uri=repo_uri, @@ -134,18 +134,18 @@ def test_bids_PatternDataladDataGrabber_datadir(tmp_path: Path) -> None: assert t_sub["T1w"]["path"] == ( dg.datadir / f"{elem}/anat/{elem}_T1w.nii.gz" ) - assert "path" in t_sub["bold"] - assert t_sub["bold"]["path"] == ( + assert "path" in t_sub["BOLD"] + assert t_sub["BOLD"]["path"] == ( dg.datadir / f"{elem}/func/{elem}_task-rest_bold.nii.gz" ) def test_bids_PatternDataladDataGrabber_session(): """Test a subject and session-based BIDS datalad datagrabber.""" - types = ["T1w", "bold"] + types = ["T1w", "BOLD"] patterns = { "T1w": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "bold": "{subject}/{session}/func/" + "BOLD": "{subject}/{session}/func/" "{subject}_{session}_task-rest_bold.nii.gz", } replacements = ["subject", "session"] @@ -162,7 +162,7 @@ def test_bids_PatternDataladDataGrabber_session(): rootdir = "example_bids_ses" # repo_commit = _testing_dataset['example_bids_ses']['id'] - # With T1W and bold, only 2 sessions are available + # With T1W and BOLD, only 2 sessions are available with PatternDataladDataGrabber( rootdir=rootdir, uri=repo_uri, diff --git a/junifer/datareader/tests/test_default_reader.py b/junifer/datareader/tests/test_default_reader.py index a645844ce..4ebf61b34 100644 --- a/junifer/datareader/tests/test_default_reader.py +++ b/junifer/datareader/tests/test_default_reader.py @@ -42,7 +42,7 @@ def test_meta() -> None: nib_data_path = Path(nib_testing.data_path) t_path = nib_data_path / "example4d.nii.gz" - input = {"bold": {"path": t_path}} + input = {"BOLD": {"path": t_path}} output = reader.fit_transform(input) assert "meta" in output assert "datareader" in output["meta"] @@ -67,23 +67,23 @@ def test_read_nifti(fname: str) -> None: t_path = nib_data_path / fname - input = {"bold": {"path": t_path}} + input = {"BOLD": {"path": t_path}} output = reader.fit_transform(input) assert isinstance(output, dict) - assert "bold" in output - assert isinstance(output["bold"], dict) - assert "path" in output["bold"] - assert "data" in output["bold"] + assert "BOLD" in output + assert isinstance(output["BOLD"], dict) + assert "path" in output["BOLD"] + assert "data" in output["BOLD"] - read_img = output["bold"]["data"] + read_img = output["BOLD"]["data"] t_read_img = nib.load(t_path) assert_array_equal(read_img.get_fdata(), t_read_img.get_fdata()) - input = {"bold": {"path": t_path.as_posix()}} + input = {"BOLD": {"path": t_path.as_posix()}} output2 = reader.fit_transform(input) - assert output["bold"]["path"] == output2["bold"]["path"] + assert output["BOLD"]["path"] == output2["BOLD"]["path"] def test_read_unknown() -> None: -- 2.52.0 From 081d57a16b8775ad1e41b3438dcc9db1a5c21fa8 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:02:18 +0300 Subject: [PATCH 006/142] update action title --- .github/workflows/docs-preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index 607f88c94..c973a7359 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -1,4 +1,4 @@ -name: Build docs and preview PR +name: Build and preview docs on: push: -- 2.52.0 From 3c12717658ec5a7ab3ad30d7e6a6f608db93e95b Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:07:00 +0300 Subject: [PATCH 007/142] Avoid running tests if only docs changed --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f16b24d64..462a7267b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,12 @@ name: Run Tests -on: [push, pull_request] +on: + push: + paths-ignore: + - 'docs/**' + pull_request: + paths-ignore: + - 'docs/**' jobs: run-tests: -- 2.52.0 From a57979a3525c0eec08726eb29f89f94fa64e131c Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 22 Oct 2022 14:17:41 +0300 Subject: [PATCH 008/142] fix the source dir for the preview --- .github/workflows/docs-preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index c973a7359..2ea66c5f8 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -51,4 +51,4 @@ jobs: if: github.event_name == 'pull_request' uses: rossjrw/pr-preview-action@v1 with: - source-dir: docs/_build \ No newline at end of file + source-dir: docs/_build/main \ No newline at end of file -- 2.52.0 From 607c0b49f50b0ff0e83629921c4cbc9157bc88b8 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Sun, 23 Oct 2022 09:54:19 +0200 Subject: [PATCH 009/142] feature: add selftest command for junifer --- junifer/api/cli.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/junifer/api/cli.py b/junifer/api/cli.py index a5888ccbd..6c1575976 100644 --- a/junifer/api/cli.py +++ b/junifer/api/cli.py @@ -5,6 +5,9 @@ # License: AGPL import pathlib +import subprocess +import sys +from pathlib import Path from typing import Dict, List, Union import click @@ -216,3 +219,16 @@ def wtf(long_: bool) -> None: "environment": _get_environment_information(long_=long_), } click.echo(yaml.dump(report, sort_keys=False)) + + +@cli.command() +def selftest() -> None: + """Selftest command for CLI.""" + subprocess.run( + ["pytest", "-vvv"], + stdin=subprocess.DEVNULL, + stdout=sys.stdout, + stderr=subprocess.STDOUT, + cwd=Path(__file__).parent.parent.parent.absolute(), + check=True, + ) -- 2.52.0 From ce2414ece25a99c5c91acefe3c697c6387612736 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 11:54:19 +0200 Subject: [PATCH 010/142] update: make junifer selftest take argument for specific sub-package tests --- junifer/api/cli.py | 71 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/junifer/api/cli.py b/junifer/api/cli.py index 6c1575976..fb8656dd0 100644 --- a/junifer/api/cli.py +++ b/junifer/api/cli.py @@ -222,13 +222,64 @@ def wtf(long_: bool) -> None: @cli.command() -def selftest() -> None: - """Selftest command for CLI.""" - subprocess.run( - ["pytest", "-vvv"], - stdin=subprocess.DEVNULL, - stdout=sys.stdout, - stderr=subprocess.STDOUT, - cwd=Path(__file__).parent.parent.parent.absolute(), - check=True, - ) +@click.argument("subpkg", type=str) +def selftest(subpkg: str) -> None: + """Selftest command for CLI. + + Parameters + ---------- + subpkg : {"all", "api", "configs", "data", "datagrabber", "datareader", + "markers", "pipeline", "preprocess", "storage", "testing", "utils", + "stats"} + The sub-package to run tests for. + + Raises + ------ + click.BadArgumentUsage + If `subpkg` is invalid. + + """ + sub_packages = [ + "all", + "api", + "configs", + "data", + "datagrabber", + "datareader", + "markers", + "pipeline", + "preprocess", + "storage", + "testing", + "tests", + "utils", + ] + if subpkg not in sub_packages: + raise click.BadArgumentUsage( + f"Invalid value for argument `subpkg`: {subpkg}. " + f"Should be one of {sub_packages}" + ) + + if subpkg == "all": + completed_process = subprocess.run( + ["pytest", "-vvv"], + stdin=subprocess.DEVNULL, + stdout=sys.stdout, + stderr=subprocess.STDOUT, + cwd=Path(__file__).parent.parent.parent.absolute(), + check=False, + ) + else: + completed_process = subprocess.run( + ["pytest", f"junifer/{subpkg}", "-vvv"], + stdin=subprocess.DEVNULL, + stdout=sys.stdout, + stderr=subprocess.STDOUT, + cwd=Path(__file__).parent.parent.parent.absolute(), + check=False, + ) + + if completed_process.returncode == 0: + click.secho("Successful.", fg="green") + else: + click.secho("Failure.", fg="red") -- 2.52.0 From 1d249a57826b478b79ca34beb5a0cf2bc91567ad Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 11:54:56 +0200 Subject: [PATCH 011/142] update: add tests for junifer selftest --- junifer/api/tests/test_cli.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/junifer/api/tests/test_cli.py b/junifer/api/tests/test_cli.py index e2259c581..8e90dc765 100644 --- a/junifer/api/tests/test_cli.py +++ b/junifer/api/tests/test_cli.py @@ -11,7 +11,7 @@ import pytest import yaml from click.testing import CliRunner -from junifer.api.cli import collect, run, wtf +from junifer.api.cli import collect, run, selftest, wtf # Create click test runner @@ -84,3 +84,19 @@ def test_wtf_long() -> None: wtf_result = runner.invoke(wtf, "--long") # Check assert wtf_result.exit_code == 0 + + +def test_selftest_invalid_arg() -> None: + """Test selftest failure for invalid argument value.""" + # Invoke selftest command + selftest_result = runner.invoke(selftest, "abyss") + # Check + assert selftest_result.exit_code == 2 + + +def test_selftest() -> None: + """Test selftest.""" + # Invoke selftest command + selftest_result = runner.invoke(selftest, "tests") + # Check; will result in 1 due to I/O descriptor manipulation + assert selftest_result.exit_code == 1 -- 2.52.0 From 5af3d290bc92e3a6a9264b4d06135620c96dbaab Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 09:30:12 +0300 Subject: [PATCH 012/142] Run tests only when needed --- .github/workflows/ci-docs.yml | 14 ++++++++++++++ .github/workflows/ci.yml | 8 ++++---- 2 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/ci-docs.yml diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml new file mode 100644 index 000000000..4f3ebe172 --- /dev/null +++ b/.github/workflows/ci-docs.yml @@ -0,0 +1,14 @@ +name: Run Tests + +on: + push: + paths-ignore: + - 'junifer/**' + pull_request: + paths-ignore: + - 'junifer/**' +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: 'echo "No build required"' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 462a7267b..f6de392e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,11 +2,11 @@ name: Run Tests on: push: - paths-ignore: - - 'docs/**' + paths: + - 'junifer/**' pull_request: - paths-ignore: - - 'docs/**' + paths: + - 'junifer/**' jobs: run-tests: -- 2.52.0 From e12fc9097e1523f768d52f846f4dc36265a3da9b Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 09:34:00 +0300 Subject: [PATCH 013/142] Need to pass in all 3 python versions --- .github/workflows/ci-docs.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 4f3ebe172..8e4b8f743 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -8,7 +8,11 @@ on: paths-ignore: - 'junifer/**' jobs: - build: + run-tests: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ['3.8', '3.9', '3.10'] steps: - run: 'echo "No build required"' -- 2.52.0 From 9a151c1aa0c72225fe1d1782cca21990569e9e1e Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 10:00:19 +0300 Subject: [PATCH 014/142] Success if no upload --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 307c497ca..c521faebf 100644 --- a/codecov.yml +++ b/codecov.yml @@ -13,7 +13,7 @@ coverage: patch: default: if_ci_failed: failure - if_no_uploads: error + if_no_uploads: success if_not_found: success target: 95.0 project: -- 2.52.0 From 7ddb4c0ace32b998f74b681db46a79f8f53451e9 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 13:53:20 +0200 Subject: [PATCH 015/142] update: add junifer logo in README and docs index --- README.md | 2 ++ docs/images/junifer_logo.png | Bin 0 -> 62081 bytes docs/index.rst | 4 ++++ 3 files changed, 6 insertions(+) create mode 100644 docs/images/junifer_logo.png diff --git a/README.md b/README.md index 5ba79f77c..9f89a61c9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![Junifer logo](docs/images/junifer_logo.png) + # junifer - JUelich NeuroImaging FEature extractoR ![PyPI](https://img.shields.io/pypi/v/junifer?style=flat-square) diff --git a/docs/images/junifer_logo.png b/docs/images/junifer_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3810ebf98d6f1b99c97728650a0fbb9665ea7544 GIT binary patch literal 62081 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%0AHOTPdcO1e z;o3#@o_nvF#XT#>RUA}iY>cqN1S>?D>4N>Hvo7I%m_i}8O*6@(m8FJ?b5+=1>0!n0 z-i93!`Nlp`qJE1?-0jjck^Tu%xOK-LFCN#x4-Rj6dQovSLdz$TzjwH+gle$Z?TVCV zFmXxvl3eWhh~FDOS3|lk+I`+PA4Rzt&#*yk8*0&!esS_l1_zGebyiDVr(dhWzIb4Zggr!17=o1<&8U_D`ORS$-g_ z=&K#`)RYV64M`KwlciggIZ`in-KQd*yDL1P?P+=f;=G~u4a?spyaqhZag_+<0n#d) zv^^Alt?Zp849gOx9qN91b%9p2&y$~O7czL}g7G7EHu2~~}G z1%yF9<6lBAUEh0{j7$Fst6DyO5R}zm5=JL_w@uhosv^Z?Qrb1SveejRH-%b7LY3!i zrYV(dt;igDoUzXPlf2!(c!+Dx(GQp0)V8g*bnrCVygu>AxO;t@X~KmMJ7@fQG@rjA zhlQDyggm&YjvmpOxR%N}r2qGsQbn+;BA2ZZT7>T}67U!MKmGn;$x4IM zx7l@jJt?JZo-_oM{{Zao?|tDPA-DmH>dC{lp8`ikhXW1IJFkYcWS?pe;K)8THc(pb z>C{T0yPY1A&-aWMKZ@~mf57;qk_G?Eh+XJjE9f@ptlgQ*csv-E`f~9-z!iW*Lp}ir z9WdP#{iQt5KnpVM)*79;Rd3?IqIqFM3CZ*saSe5|n5MR?X1*UBpEo_c0&Ez`;tbl| zulWaS-YWrlq~Hss+1=sL`66mlX6pd1zC6h=bf<$U+w9~s;#5~$)`S8NzeG=tj`JSH zXS=Gc5*+Pfb=URas0Hfo=LSrgJ}&4*i;(URB-T#L5n$I96WO&;Cq3w~Up`{JjpLln zgRf@L#d@L(2A;H4tnPgC7s;1lYmIU1@LGCi-NQXuL~nR|F+EK7cCZCgk08WX(>=c| z+!{{{*)tN3&{MTdEJEIY!L=)^EfTHj9E`4Uy-A-%E0{VKvHSr1F_mSW1yJ3KSW}r- zwpv&0zIb6hKKEwcBYngv9Cvud!SFGeIP85ITGWNKDN4?_1yVcj@bbAvQ=H4~Dnd`n zr03}C%(GF709JH4UhOwe4cuIS?^f6?h7q+$mYRq3GyV#=6Rs>>_Qk+U&Lk(d zacV6r$1*%Q92?UPUf_D_OSai%-I)d^Lf9AbFav*aAt+^345q&kz*26wt`@BZJIk-9 zByg9x^`caR6KX)Ned!$0W&ZeX)5q}-#;3{0R)3_1{*XJdbhJUG^50A0#oj|hJ= z2Udpx$kyWWD>-*_>C7rGBW7@UMyd0 z8@eI;foe1xquXoEvNq&V`dUGab=kRI6JTvvW265*qt259|qw literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 5eb8c8a72..5d77b0a21 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,9 @@ .. include:: links.inc +.. image:: images/junifer_logo.png + :width: 300px + :alt: junifer logo + Welcome to junifer's documentation! =================================== -- 2.52.0 From 4a0a874d31beaf8591259bbdbf8304ebc86d38e4 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 15:13:41 +0200 Subject: [PATCH 016/142] docs: correct typo in builtin.rst --- docs/builtin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/builtin.rst b/docs/builtin.rst index d1e04d007..e49cc6393 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -14,7 +14,7 @@ Data Grabbers - Open with registration - Restricted - Type/config: this should mention weather the class is built-in in the + Type/config: this should mention whether the class is built-in in the core of junifer or needs to be imported from a specific configuration in the `junifer.configs` module. -- 2.52.0 From 92c62d5a4f6b6b5e0749e79e5ca7f13c97be8d08 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 15:14:31 +0200 Subject: [PATCH 017/142] docs: fix class paths and config for available datagrabbers --- docs/builtin.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/builtin.rst b/docs/builtin.rst index e49cc6393..10649f5ce 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -47,7 +47,7 @@ Available - Built-in - In Progress - :gh:`4` - * - :class:`junifer.configs.juseless.JuselessDataladUKBVBM` + * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladUKBVBM` - UKB VBM dataset preprocessed with CAT. Available for Juseless only. - Restricted - ``junifer.configs.juseless`` @@ -56,7 +56,7 @@ Available * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladCamCANVBM` - CamCAN VBM dataset preprocessed with CAT. Available for Juseless only. - Restricted - - ``junifer.configs.juseless.datagrabbers`` + - ``junifer.configs.juseless`` - Done - 0.0.1 * - :class:`junifer.datagrabber.DataladAOMICID1000` @@ -77,7 +77,7 @@ Available - Built-in - Done - 0.0.1 - * - :class:`junifer.configs.juseless.JuselessDataladAOMICVBM` + * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladAOMICVBM` - AOMIC VBM dataset. Available for Juseless only. - Restricted - ``junifer.configs.juseless`` @@ -86,7 +86,7 @@ Available * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladIXIVBM` - `IXI VBM dataset `_. Available for Juseless only. - Restricted - - ``junifer.configs.juseless.datagrabbers`` + - ``junifer.configs.juseless`` - Done - 0.0.1 -- 2.52.0 From 4d0beef5f22ae31acfa36a5aea5ecbae1687a400 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 15:16:49 +0200 Subject: [PATCH 018/142] docs: add FunctionalConnectivitySpheres to available markers --- docs/builtin.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/builtin.rst b/docs/builtin.rst index 10649f5ce..19ef11d07 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -154,6 +154,10 @@ Available - Spherical aggregation using mean - Done - 0.0.1 + * - :class:`junifer.markers.FunctionalConnectivitySpheres` + - Perform spherical aggregation and compute functional connectivity + - Done + - 0.0.1 * - :class:`junifer.markers.RSSETSMarker` - Compute root sum of squares of edgewise timeseries - Done -- 2.52.0 From 78dd22b7989ce8eb781f7e68d4172499bffb2e32 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 17:37:40 +0200 Subject: [PATCH 019/142] docs: improve data.rst --- docs/understanding/data.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index ba50af255..8b47142db 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -9,7 +9,7 @@ Description ^^^^^^^^^^^ This is the *object* that traverses the steps of the pipeline. It is indeed a -dictionary of dictionaries. The first level of keys are the :ref:`data_types` +dictionary of dictionaries. The first level of keys are the :ref:`data types ` and a special key named ``meta`` that contains all the information on the data object including source and previous transformation steps. @@ -18,8 +18,8 @@ The second level of keys are the actual data. So far, there are two keys used: - ``path``: path to the file containing the data. - ``data``: the data loaded in memory. -The :ref:`datagrabbers` step will only fill the ``path`` value. -The ``data`` value will be filled by the :ref:`datareader` step, if it is one of the possible file types +The :ref:`DataGrabber ` step will only fill the ``path`` value. +The ``data`` value will be filled by the :ref:`DataReader ` step, if it is one of the possible file types that the datareader can read. .. _data_types: -- 2.52.0 From 19d4a9aba48a081f73cc5e55e759534c7c0200b6 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 17:38:23 +0200 Subject: [PATCH 020/142] docs: add preprocess.rst --- docs/understanding/index.rst | 1 + docs/understanding/preprocess.rst | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 docs/understanding/preprocess.rst diff --git a/docs/understanding/index.rst b/docs/understanding/index.rst index df2627f36..0cc074d01 100644 --- a/docs/understanding/index.rst +++ b/docs/understanding/index.rst @@ -26,5 +26,6 @@ julearn_). data datagrabber datareader + preprocess marker storage diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst new file mode 100644 index 000000000..39c1ba0fd --- /dev/null +++ b/docs/understanding/preprocess.rst @@ -0,0 +1,4 @@ +.. include:: ../links.inc + +Preprocess +========== -- 2.52.0 From 4dc57f262a766c517ef394a5ad65596e33d15128 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 17:39:17 +0200 Subject: [PATCH 021/142] docs: update title of datagrabber.rst and datareader.rst --- docs/understanding/datagrabber.rst | 4 ++-- docs/understanding/datareader.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index da9dc0481..8f5ba3a35 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -2,8 +2,8 @@ .. _datagrabbers: -Data Grabber -============ +DataGrabber +=========== Description ^^^^^^^^^^^ diff --git a/docs/understanding/datareader.rst b/docs/understanding/datareader.rst index 8a3521efd..0aec04547 100644 --- a/docs/understanding/datareader.rst +++ b/docs/understanding/datareader.rst @@ -2,5 +2,5 @@ .. _datareader: -Data Reader -=========== +DataReader +========== -- 2.52.0 From a6e05b2e6e7e0f2b6273447aa8da7395433a0dee Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 08:50:46 +0200 Subject: [PATCH 022/142] docs: improve installation.rst --- docs/installation.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 90209b8e5..f52e13d1c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -9,14 +9,14 @@ Requirements junifer is compatible with `Python`_ >= 3.8 and requires the following packages: -* click>=8.1.3,<8.2 -* numpy>=1.22,<1.23 -* datalad>=0.15.4,<0.18 -* pandas>=1.4.0,<1.5 -* nibabel>=3.2.0,<4.1 -* nilearn>=0.9.0,<1.0 -* sqlalchemy>=1.4.27,<= 1.5.0 -* pyyaml>=5.1.2,<7.0 +* ``click>=8.1.3,<8.2`` +* ``numpy>=1.22,<1.23`` +* ``datalad>=0.15.4,<0.18`` +* ``pandas>=1.4.0,<1.5`` +* ``nibabel>=3.2.0,<4.1`` +* ``nilearn>=0.9.0,<1.0`` +* ``sqlalchemy>=1.4.27,<= 1.5.0`` +* ``pyyaml>=5.1.2,<7.0`` Depending on the installation method, these packages might be installed automatically. -- 2.52.0 From a03aa67ccac30689bfd244d93f79689786a64caf Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 09:06:17 +0200 Subject: [PATCH 023/142] docs: correct article in understanding/index.rst --- docs/understanding/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/understanding/index.rst b/docs/understanding/index.rst index 0cc074d01..808bf141a 100644 --- a/docs/understanding/index.rst +++ b/docs/understanding/index.rst @@ -6,7 +6,7 @@ Understanding junifer ===================== Before you start, you should understand how junifer works. Junifer is a -tool conceived to extract features from neuroimaging data in a easy-to-use +tool conceived to extract features from neuroimaging data in an easy-to-use manner, with minimal coding and minimal user expertise in the internal aspects. Unlike other tools like FSL, SPM, AFNI, etc., junifer is not a toolbox to -- 2.52.0 From a5c11a8ebe71e32d6a3ada2793e94b0b2f84c46e Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 09:09:09 +0200 Subject: [PATCH 024/142] docs: improve understanding/data.rst --- docs/understanding/data.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index 8b47142db..f59b6dc4e 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -22,13 +22,15 @@ The :ref:`DataGrabber ` step will only fill the ``path`` value. The ``data`` value will be filled by the :ref:`DataReader ` step, if it is one of the possible file types that the datareader can read. +A point to note is that you never directly interact with the *data object* but it's important to know where and how the object is being manipulated to reason about your pipeine. + .. _data_types: Data types ^^^^^^^^^^ -.. list-table:: Built-in data types - :widths: 30 80 40 +.. list-table:: + :widths: auto :header-rows: 1 * - Name -- 2.52.0 From 9e7044bea87ff1808f8473f523a70b6e27004168 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 10:49:53 +0200 Subject: [PATCH 025/142] docs: improve datagrabber.rst --- docs/understanding/data.rst | 2 +- docs/understanding/datagrabber.rst | 73 ++++++++++++++++-------------- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index f59b6dc4e..a97483a1f 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -1,6 +1,6 @@ .. include:: ../links.inc -.. _understanding_data_object: +.. _data_object: The Data Object =============== diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index 8f5ba3a35..dd743b6df 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -7,44 +7,47 @@ DataGrabber Description ^^^^^^^^^^^ -A datagrabber is an object that can provide datasets you want to junifer. -For example, a DataladDataGrabber can provide data from a Datalad dataset to junifer. -Of course, datagrabbers are not only possible for Datalad but any origin of a dataset. -It is intended to use them as context managers. -If you are interested in just using already provided datagrabbers please go to :doc:`../builtin`. -If you want to implement your own Data Grabbers you need to inherit from different types of -Data Grabbers we already provide (see :ref:`extending_datagrabbers`). -Typical Data Grabbers -^^^^^^^^^^^^^^^^^^^^^ -In this section we will showcase different types of datagrabber classes you might want to use -to implement your own datagrabbers for your own data. +The ``DataGrabber`` is an object that can provide an interface to datasets you want to work with in junifer. +Every concrete implementation of a datagrabber is aware of a particular dataset's structure and thus allows +you to fetch specific elements of interest from the dataset. It adds the ``path`` key to each :ref:`data type ` +in the :ref:`Data object `. -.. list-table:: Data Grabbers Type - :widths: 25 35 +Datagrabbers are intended to be used as context managers. When used within a context, a datagrabber takes care +of any pre and post steps for interacting with the dataset, for example, downloading and cleaning up. As the interface +is consistent, you always use the same procedure to interact with the datagrabber. + +For example, a concrete implementation of :class:`junifer.datagrabber.DataladDataGrabber` can provide junifer +with data from a Datalad dataset. Of course, datagrabbers are not only meant to work with Datalad datasets but +any dataset. + +If you are interested in using already provided datagrabbers please go to :doc:`../builtin`. And, if you want +to implement your own datagrabber, you need to provide concrete implementations of base classes already +provided. + +Base classes +^^^^^^^^^^^^ +In this section, we showcase different abstract base classes you might want to use to implement your own datagrabber. + +.. list-table:: + :widths: auto :header-rows: 1 * - Name - Description - * - :py:class:`~junifer.datagrabber.base.BaseDataGrabber` - - | An abstract class providing you an interface to implement for you own datagrabber. - | This is not intedent to be used in general. - | Instead you should use the DataladDataGrabber or PatternDataGrabber if possible. - | You have to at least implement the ``get_elements`` method, but most of the time - | you should also overwrite other existing methods like ``__enter__`` and ``__exit__``. - * - :py:class:`~junifer.datagrabber.pattern.PatternDataGrabber` - - | Implements some functionality to help you to define the pattern of the dataset you want to get. - | E.g. you know that T1 images are found in a directory following this pattern - | inside of the dataset "{subject}/anat/{subject}_T1w.nii.gz". - | Now you can provide this to the PatternDataGrabber - | and it will be able to get the image to junifer. - * - :py:class:`~junifer.datagrabber.datalad_base.DataladDataGrabber` - - | Implements some functionality specific to basic usage of Datalad datasets. - | This mostly takes care of the ``__enter__`` and ``__exit__`` methods to clone your Datalad dataset - | and remove it on ``__exit__``. - | This means that even if your code fails inside of the context of the - | datagrabber the DataladDataGrabber cleans up the created Datalad directories. - * - :py:class:`~junifer.datagrabber.pattern_datalad.PatternDataladDataGrabber` - - | Combination of PatternDataGrabber and DataladDataGrabber. - | Probably the class you are looking for when using Datalad. - + * - :class:`junifer.datagrabber.BaseDataGrabber` + - | The abstract base class providing you an interface to implement your own datagrabber. + | You should try to avoid using this directly and instead use + | :class:`junifer.datagrabber.PatternDataGrabber` or :class:`junifer.datagrabber.DataladDataGrabber`. + | To build your own custom *low-level* datagrabber, you need to at least implement the ``get_elements`` method, + | but most of the time you should also override other existing methods like ``__enter__`` and ``__exit__``. + * - :class:`junifer.datagrabber.PatternDataGrabber` + - | It implements functionality to help you define the pattern of the dataset you want to get. For example, + | you know that T1 images are found in a directory following this pattern ``{subject}/anat/{subject}_T1w.nii.gz`` + | inside of the dataset. Now you can provide this to the **PatternDataGrabber** and it will be able to get the file. + * - :class:`junifer.datagrabber.DataladDataGrabber` + - | It implements functionality to deal with Datalad datasets. Specifically, the ``__enter__`` and ``__exit__`` methods + | take care of cloning and removing the Datalad dataset. + * - :class:`junifer.datagrabber.PatternDataladDataGrabber` + - | It is a combination of :class:`junifer.datagrabber.PatternPatternDataGrabber` and + | :class:`junifer.datagrabber.DataladDataGrabber`. This is probably the class you are looking for when using Datalad. -- 2.52.0 From 0cfb2868dc3ffc5052d14e208a3a28a4af1fb367 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 11:57:49 +0200 Subject: [PATCH 026/142] docs: add content in datareader.rst --- docs/understanding/datareader.rst | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/understanding/datareader.rst b/docs/understanding/datareader.rst index 0aec04547..774f402db 100644 --- a/docs/understanding/datareader.rst +++ b/docs/understanding/datareader.rst @@ -4,3 +4,43 @@ DataReader ========== + +Description +^^^^^^^^^^^ + +The ``DataReader`` is an object that is responsible for actually reading data files in junifer. +It reads the value of the key ``path`` for each :ref:`data type ` in the :ref:`Data object ` +and loads them to memory. After reading the data into memory, it adds the key ``data`` to the same level as ``path`` +and the value is the actual data in the memory. + +Datareaders are meant to be used inside the datagrabber context but you can operate on them outside the context as long +as the actual data is in the memory and the Python runtime has not garbage-collected it. + +For data formats not supported by junifer yet, you can either make your own ``DataReader`` or open an issue on +`junifer Github`_ and we can help you out. + +Currently supported file-formats +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We already provide a concrete implementation :class:`junifer.datareader.DefaultDataReader` which knows how to +read the following file formats: + +.. list-table:: + :widths: auto + :header-rows: 1 + + * - File extension + - File type + - Description + * - ``.nii`` + - NIfTI (uncompressed) + - Uncompressed NIfTI + * - ``.nii.gz`` + - NIfTI (compressed) + - Compressed NIfTI + * - ``.csv`` + - CSV + - Comma-separated values file + * - ``.tsv`` + - TSV + - Tab-separated values file -- 2.52.0 From a142e2947f6ddd1b0c89118d80db4b65181718ae Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 13:00:23 +0200 Subject: [PATCH 027/142] docs: add missing comma in datagrabber.rst --- docs/understanding/datagrabber.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index dd743b6df..800c3f896 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -21,7 +21,7 @@ For example, a concrete implementation of :class:`junifer.datagrabber.DataladDat with data from a Datalad dataset. Of course, datagrabbers are not only meant to work with Datalad datasets but any dataset. -If you are interested in using already provided datagrabbers please go to :doc:`../builtin`. And, if you want +If you are interested in using already provided datagrabbers, please go to :doc:`../builtin`. And, if you want to implement your own datagrabber, you need to provide concrete implementations of base classes already provided. -- 2.52.0 From 9d281c35dffe8123ed4ec69d357fb957f3ce6e44 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 13:00:41 +0200 Subject: [PATCH 028/142] docs: add content in marker.rst --- docs/understanding/marker.rst | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/understanding/marker.rst b/docs/understanding/marker.rst index 02446016f..915f8ed99 100644 --- a/docs/understanding/marker.rst +++ b/docs/understanding/marker.rst @@ -1,6 +1,23 @@ .. include:: ../links.inc -.. _markers: +.. _marker: -Markers -======= +Marker +====== + +Description +^^^^^^^^^^^ + +The ``Marker`` is an object that is responsible for feature extraction. It primarily operates on data loaded +in memory by :ref:`datareader ` and stored in the ``data`` key of each :ref:`data type ` +in the :ref:`Data object `. In some cases, it can also operate on pre-processed data as obtained +from the :ref:`Preprocess ` step of the pipeline. It is important to note that this pre-process is +not similar to pre-processing done by tools like FSL, SPM, AFNI, etc. . For example, one can perform confound +removal on loaded data and then perform feature extraction. + +Markers are meant to be used inside the datagrabber context but you can operate on them outside the context as long +as the actual data is in the memory and the Python runtime has not garbage-collected it. + +If you are interested in using already provided markers, please go to :doc:`../builtin`. And, if you want to implement +your own marker, you need to provide concrete implementation of :class:`junifer.markers.BaseMarker`. Specifically, you +need to override ``get_output_kind``, ``store`` and ``compute`` methods. -- 2.52.0 From b23c4411daf30ee23cf0d1fbbf01fa2c5bb3638f Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 13:00:56 +0200 Subject: [PATCH 029/142] docs: add preprocess link --- docs/understanding/preprocess.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index 39c1ba0fd..2e0ff2efa 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -1,4 +1,6 @@ .. include:: ../links.inc +.. _preprocess: + Preprocess ========== -- 2.52.0 From 8007b737d8d750588d497802648d36cb59b4de7a Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 14:19:04 +0200 Subject: [PATCH 030/142] docs: add content in storage.rst --- docs/understanding/storage.rst | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/understanding/storage.rst b/docs/understanding/storage.rst index 1da80a289..c409809b0 100644 --- a/docs/understanding/storage.rst +++ b/docs/understanding/storage.rst @@ -4,3 +4,38 @@ Storage ======= + +Description +^^^^^^^^^^^ + +The ``Storage`` is an object that is responsible for storing extracted features as computed from :ref:`Marker ` +step of the pipeline. If the pipeline is provided with a ``storage-like`` object, the extracted features are stored via +that object else they are kept in memory. + +Storage is meant to be used inside the datagrabber context but you can operate on them outside the context as long +as the processed data is in the memory and the Python runtime has not garbage-collected it. + +The :ref:`Markers ` are responsible for defining what *storage kind* (``matrix``, ``table``, ``timeseries``) +they support for which :ref:`data type ` by overriding its ``store`` method. The storage object in turn +declares and provides implementation for specific *storage kind*. For example, :class:`junifer.storage.SQLiteFeatureStorage` +supports saving ``matrix``, ``table`` and ``timeseries`` via ``store_matrix``, ``store_table`` and ``store_timeseries`` +methods respectively. + +For storage interfaces not supported by junifer yet, you can either make your own ``Storage`` by providing a concrete +implementation of :class:`junifer.storage.BaseFeatureStorage` or open an issue on `junifer Github`_ and we can help you out. + +Currently supported storage interfaces +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: + :widths: auto + :header-rows: 1 + + * - Storage class + - File extension + - File type + - Storage kinds + * - :class:`junifer.storage.SQLiteFeatureStorage` + - ``.db`` + - SQLite + - ``matrix``, ``table``, ``timeseries`` -- 2.52.0 From 0f3a95648b205f06ef13ff216a44176146de006a Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 14:27:37 +0200 Subject: [PATCH 031/142] docs: add content in preprocess.rst --- docs/understanding/preprocess.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index 2e0ff2efa..eea630214 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -4,3 +4,12 @@ Preprocess ========== + +Description +^^^^^^^^^^^ + +The ``Preprocess`` step of the pipeline is meant for pre-processing before or after :ref:`Marker ` step +depending on the use-case. For example, you might want to perform confound removal on ``BOLD`` data before +feature extraction. + +This step is still under development and is an optional one for the pipeline to work. -- 2.52.0 From 1749e198586760e41250beee3d473305ada51f47 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 14:34:20 +0200 Subject: [PATCH 032/142] docs: cleanup conf.py --- docs/conf.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index a6ba15330..fd12b8dcd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -64,9 +64,19 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # a list of builtin themes. # html_theme = "sphinx_rtd_theme" - -html_sidebars = {"**": ["globaltoc.html", "sourcelink.html", "searchbox.html"]} - +html_theme_options = { + "display_version": True, + "style_external_links": True, + "logo_only": True, +} +html_sidebars = { + "**": [ + "globaltoc.html", + "sourcelink.html", + "searchbox.html", + ] +} +html_logo = "./images/junifer_logo.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, -- 2.52.0 From 47221240fbed1b7d8ab9787457d796bc6f7f5f30 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 15:49:08 +0200 Subject: [PATCH 033/142] update: complete type annotations for DefaultDataReader --- junifer/datareader/default.py | 37 +++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/junifer/datareader/default.py b/junifer/datareader/default.py index ac6b72b3e..8aaec4e9a 100644 --- a/junifer/datareader/default.py +++ b/junifer/datareader/default.py @@ -5,7 +5,7 @@ # License: AGPL from pathlib import Path -from typing import Dict, List +from typing import Dict, List, Optional import nibabel as nib import pandas as pd @@ -32,48 +32,59 @@ _readers["TSV"] = {"func": pd.read_csv, "params": {"sep": "\t"}} class DefaultDataReader(PipelineStepMixin): """Mixin class for default data reader.""" - # TODO: complete type annotations def validate_input(self, input: List[str]) -> None: """Validate input. Parameters ---------- - input + input : list of str + The input to the pipeline step. The list must contain the + available Junifer Data dictionary keys. """ # Nothing to validate, any input is fine pass - # TODO: complete type annotations - def get_output_kind(self, input): + def get_output_kind(self, input: List[str]) -> List[str]: """Get output kind. Parameters ---------- - input + input : list of str + The input to the reader. The list must contain the + available Junifer Data dictionary keys. + + Returns + ------- + list of str + The updated list of output kinds, as reading possibilities. """ # It will output the same kind of data as the input return input - # TODO: complete type annotations - def fit_transform(self, input, params=None) -> Dict: + def fit_transform( + self, + input: Dict[str, Dict], + params: Optional[Dict] = None, + ) -> Dict: """Fit and transform. Parameters ---------- - input - params + input : dict + The Junifer Data object. + params : dict, optional + Extra parameters for data types (default None). Returns ------- dict + The processed output as dictionary. The "data" key is added to + each data type dictionary except "meta". """ # For each kind of data, try to read it - - # out is the same, but with the 'data' key set in - # each kind dictionary, except for meta out = input.copy() if params is None: params = {} -- 2.52.0 From d03e4caa8ff992fb095a2bab76cc39b37cc5333d Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 13:53:04 +0300 Subject: [PATCH 034/142] Another attempt at codecov checks --- .github/workflows/ci-docs.yml | 12 ++++++++++++ .github/workflows/ci.yml | 2 ++ codecov.yml | 7 ++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 8e4b8f743..690d48312 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -16,3 +16,15 @@ jobs: python-version: ['3.8', '3.9', '3.10'] steps: - run: 'echo "No build required"' + - name: Create mock coverage.xml file + run: | + echo '' > coverage.xml + echo ' ' >> coverage.xml + if: matrix.python-version == 3.9 + - name: Upload mock coverage to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true + flags: mock + if: success() && matrix.python-version == 3.9 \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6de392e4..bafa35419 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,4 +42,6 @@ jobs: uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true + flags: junifer if: success() && matrix.python-version == 3.9 diff --git a/codecov.yml b/codecov.yml index c521faebf..b21e58149 100644 --- a/codecov.yml +++ b/codecov.yml @@ -16,10 +16,15 @@ coverage: if_no_uploads: success if_not_found: success target: 95.0 + flags: + - junifer + - mock project: default: false library: if_ci_failed: failure if_no_uploads: error if_not_found: success - target: 90.0 \ No newline at end of file + target: 90.0 + flags: + - junifer -- 2.52.0 From 969422d82dd5cac79eff15fd9c167cabb35a45db Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 14:02:25 +0300 Subject: [PATCH 035/142] Missing one parameter --- codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codecov.yml b/codecov.yml index b21e58149..90c9d8c60 100644 --- a/codecov.yml +++ b/codecov.yml @@ -12,6 +12,7 @@ coverage: status: patch: default: + flag_coverage_not_uploaded_behavior: pass if_ci_failed: failure if_no_uploads: success if_not_found: success -- 2.52.0 From e73006ea0e9d57139b8d6913e8189ce00579294e Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 14:10:15 +0300 Subject: [PATCH 036/142] Update mock coverage.xml --- .github/workflows/ci-docs.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 690d48312..397e45402 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -19,7 +19,15 @@ jobs: - name: Create mock coverage.xml file run: | echo '' > coverage.xml - echo ' ' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '/home/runner/work/junifer/junifer' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml if: matrix.python-version == 3.9 - name: Upload mock coverage to Codecov uses: codecov/codecov-action@v3 -- 2.52.0 From 019d7adf2faeed03f1388f7b4c62a196ef751b45 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 14:24:05 +0300 Subject: [PATCH 037/142] tabs --- .github/workflows/ci-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 397e45402..4b04aea4a 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -21,8 +21,8 @@ jobs: echo '' > coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml - echo '/home/runner/work/junifer/junifer' >> coverage.xml - echo '' >> coverage.xml + echo '/home/runner/work/junifer/junifer' >> coverage.xml + echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml -- 2.52.0 From c1133c3ac3c64f1c04d9e23be76ab988775efd52 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 14:30:04 +0300 Subject: [PATCH 038/142] Better mock file --- .github/workflows/ci-docs.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 4b04aea4a..4a4cadc03 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -25,6 +25,25 @@ jobs: echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo 'line number="11" hits="1"/>' >> coverage.xml + echo 'line number="12" hits="1"/>' >> coverage.xml + echo 'line number="13" hits="1"/>' >> coverage.xml + echo 'line number="14" hits="1"/>' >> coverage.xml + echo 'line number="15" hits="1"/>' >> coverage.xml + echo 'line number="16" hits="1"/>' >> coverage.xml + echo 'line number="17" hits="1"/>' >> coverage.xml + echo 'line number="18" hits="1"/>' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml + echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml -- 2.52.0 From 62d62146c9c479e5186c87a058594c2f10217262 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 14:31:46 +0300 Subject: [PATCH 039/142] Maybe create a file --- .github/workflows/ci-docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 4a4cadc03..f154033ab 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -18,6 +18,8 @@ jobs: - run: 'echo "No build required"' - name: Create mock coverage.xml file run: | + mkdir junifer + touch junifer/__init__.py echo '' > coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml -- 2.52.0 From 949f16a2d1e9ddcc9c815e1c1a01de31832193a7 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 15:24:54 +0300 Subject: [PATCH 040/142] Checking another coverage config --- .github/workflows/ci-docs.yml | 23 +++++------------- codecov.yml | 46 ++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index f154033ab..b573c46f9 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -18,31 +18,20 @@ jobs: - run: 'echo "No build required"' - name: Create mock coverage.xml file run: | - mkdir junifer - touch junifer/__init__.py + mkdir docs + touch docs/conf.py echo '' > coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml - echo '/home/runner/work/junifer/junifer' >> coverage.xml + echo '/home/runner/work/docs/docs' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml - echo '' >> coverage.xml + echo '' >> coverage.xml echo '' >> coverage.xml - echo '' >> coverage.xml + echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml - echo '' >> coverage.xml - echo '' >> coverage.xml - echo '' >> coverage.xml - echo 'line number="11" hits="1"/>' >> coverage.xml - echo 'line number="12" hits="1"/>' >> coverage.xml - echo 'line number="13" hits="1"/>' >> coverage.xml - echo 'line number="14" hits="1"/>' >> coverage.xml - echo 'line number="15" hits="1"/>' >> coverage.xml - echo 'line number="16" hits="1"/>' >> coverage.xml - echo 'line number="17" hits="1"/>' >> coverage.xml - echo 'line number="18" hits="1"/>' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml @@ -55,5 +44,5 @@ jobs: with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true - flags: mock + flags: docs if: success() && matrix.python-version == 3.9 \ No newline at end of file diff --git a/codecov.yml b/codecov.yml index 90c9d8c60..17e51fd9a 100644 --- a/codecov.yml +++ b/codecov.yml @@ -10,22 +10,30 @@ comment: # this is a top-level key coverage: status: - patch: - default: - flag_coverage_not_uploaded_behavior: pass - if_ci_failed: failure - if_no_uploads: success - if_not_found: success - target: 95.0 - flags: - - junifer - - mock - project: - default: false - library: - if_ci_failed: failure - if_no_uploads: error - if_not_found: success - target: 90.0 - flags: - - junifer + project: off + patch: off + +flag_management: + default_rules: + carryforward: true + individual_flags: + - name: junifer + paths: + - junifer/ + statuses: + - type: project + target: 90% + threshold: 1% + - type: patch + target: 95% + threshold: 1% + - name: docs + paths: + - docs/ + statuses: + - type: project + target: 100% + threshold: 1% + - type: patch + target: 95% + threshold: 1% \ No newline at end of file -- 2.52.0 From 2eec2a36f9a9ddabed61c8431d06440726ca942e Mon Sep 17 00:00:00 2001 From: Fede Date: Tue, 25 Oct 2022 10:09:11 +0300 Subject: [PATCH 041/142] fix latest.inc syntax --- docs/changes/latest.inc | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 43fa05c80..65bb46db0 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -19,15 +19,15 @@ Current (0.0.0.dev) Enhancements ~~~~~~~~~~~~ +- Created a the repository based on the mockup by `Fede Raimondo`_. + - Implemented SPM Auditory testing datagrabber X (:gh:`52` by `Fede Raimondo`_). -- Created a the repository based on the mockup by by `Fede Raimondo`_. - - Added comments to datalad grabber and changed to use datalad-clone instead of - datalad-install (:gh: `55` by `Benjamin Poldrack`_). + datalad-install (:gh:`55` by `Benjamin Poldrack`_). -- Added an example how to use junifer and julearn (:gh: `40` by `Leonard Sasse_`, - `Nicolas Nieto_`, and `Sami Hamdan_`) in one pipeline to extract features +- Added an example how to use junifer and julearn (:gh:`40` by `Leonard Sasse`_, + `Nicolas Nieto`_, and `Sami Hamdan`_) in one pipeline to extract features and do machine learning. - Implement matrix storage in SQliteFeatureStorage (:gh:`42` by `Fede Raimondo`_). @@ -35,8 +35,8 @@ Enhancements - Marker for functional connectivity using an atlas (:gh:`41` by `Amir Omidvarnia`_ and `Kaustubh R. Patil`_). -- Added documentation for the datagrabbers (by `Leonard Sasse_`, - `Nicolas Nieto_`, and `Sami Hamdan_`). +- Added documentation for the datagrabbers (by `Leonard Sasse`_, + `Nicolas Nieto`_, and `Sami Hamdan`_). - Implement coordinate register, list and load (:gh:`11` by `Fede Raimondo`_). @@ -46,23 +46,25 @@ Enhancements - Added support to access other input in the data object in the `compute` method (by `Fede Raimondo`_). -- Implemented the edge time series RSS marker (:gh: `51` by `Leonard Sasse`_, +- Implemented the edge time series RSS marker (:gh:`51` by `Leonard Sasse`_, `Nicolas Nieto`_, `Sami Hamdan`_). - Implement SphereAggregation marker (by `Fede Raimondo`_). - Implement PIOP1 and PIOP2 AOMIC datasets and refactor AOMICID1000 slightly - (:gh: `94` by `Leonard Sasse`_) + (:gh:`94` by `Leonard Sasse`_) -- Implement a JuselessDataladCamCANVBM datagrabber class (:gh: `99` by `Leonard Sasse`_) +- Implement a JuselessDataladCamCANVBM datagrabber class (:gh:`99` by `Leonard Sasse`_) -- Implement IXI CAT output datagrabber for juseless (:gh: `48` by `Leonard Sasse`_). +- Implement IXI CAT output datagrabber for juseless (:gh:`48` by `Leonard Sasse`_). -- Upgrade storage interface for storage-like objects (:gh: `84` by `Synchon Mandal`_). +- Upgrade storage interface for storage-like objects (:gh:`84` by `Synchon Mandal`_). -- Add missing type annotations (:gh: `74` by `Synchon Mandal`_). +- Add missing type annotations (:gh:`74` by `Synchon Mandal`_). -- Add ``junifer wtf`` to report environment details (:gh: `33` by `Synchon Mandal`_). +- Add ``junifer wtf`` to report environment details (:gh:`33` by `Synchon Mandal`_). + +- Add ``junifer selftest`` to report environment details (:gh:`9` by `Synchon Mandal`_). Bugs ~~~~ -- 2.52.0 From 4f379ce930a3d14acdcab548488a39b153c36b71 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 15:27:44 +0300 Subject: [PATCH 042/142] Fix this again --- docs/changes/latest.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 65bb46db0..d93244cbb 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -19,6 +19,7 @@ Current (0.0.0.dev) Enhancements ~~~~~~~~~~~~ + - Created a the repository based on the mockup by `Fede Raimondo`_. - Implemented SPM Auditory testing datagrabber X (:gh:`52` by `Fede Raimondo`_). -- 2.52.0 From 6e55faa87dd88bf9b0b71a5b84b95551785583a9 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 15:41:11 +0300 Subject: [PATCH 043/142] trigger codecov --- junifer/datagrabber/base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/junifer/datagrabber/base.py b/junifer/datagrabber/base.py index 7e49d9313..a9f5a2a1a 100644 --- a/junifer/datagrabber/base.py +++ b/junifer/datagrabber/base.py @@ -59,7 +59,6 @@ class BaseDataGrabber(ABC): for elem in self.get_elements(): yield elem - # TODO: element does nothing, check def __getitem__(self, element: Union[str, Tuple]) -> Dict[str, Dict]: """Enable indexing support. -- 2.52.0 From 82c427e94781115b7de896ff6e8a0d2655ddd711 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 16:50:59 +0300 Subject: [PATCH 044/142] Refactor markers --- docs/changes/latest.inc | 2 ++ examples/run_compute_parcel_mean.py | 2 +- junifer/markers/__init__.py | 2 +- junifer/markers/base.py | 34 +++++++++++++++---- junifer/markers/ets_rss.py | 17 ++++++++-- .../markers/functional_connectivity_atlas.py | 16 +++++++-- .../functional_connectivity_spheres.py | 13 ++++++- .../{parcel.py => parcel_aggregation.py} | 15 ++++++-- junifer/markers/sphere_aggregation.py | 13 +++++-- .../test_functional_connectivity_atlas.py | 2 +- junifer/markers/tests/test_markers_base.py | 12 +++++-- junifer/markers/tests/test_parcel.py | 2 +- scratch/test_niftimasker.py | 2 +- 13 files changed, 106 insertions(+), 26 deletions(-) rename junifer/markers/{parcel.py => parcel_aggregation.py} (94%) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index d93244cbb..0319a32d3 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -67,6 +67,8 @@ Enhancements - Add ``junifer selftest`` to report environment details (:gh:`9` by `Synchon Mandal`_). +- Refactor markers ``on`` attribute and ``get_valid_inputs`` to verify that the marker can be computed on the input data types (by `Fede Raimondo`_) + Bugs ~~~~ diff --git a/examples/run_compute_parcel_mean.py b/examples/run_compute_parcel_mean.py index 1f76a88f2..32da018f1 100644 --- a/examples/run_compute_parcel_mean.py +++ b/examples/run_compute_parcel_mean.py @@ -12,7 +12,7 @@ License: BSD 3 clause import nilearn -from junifer.markers.parcel import ParcelAggregation +from junifer.markers.parcel_aggregation import ParcelAggregation from junifer.utils import configure_logging diff --git a/junifer/markers/__init__.py b/junifer/markers/__init__.py index 6fcc780b9..39004824b 100644 --- a/junifer/markers/__init__.py +++ b/junifer/markers/__init__.py @@ -9,5 +9,5 @@ from .collection import MarkerCollection from .ets_rss import RSSETSMarker from .functional_connectivity_atlas import FunctionalConnectivityAtlas from .functional_connectivity_spheres import FunctionalConnectivitySpheres -from .parcel import ParcelAggregation +from .parcel_aggregation import ParcelAggregation from .sphere_aggregation import SphereAggregation diff --git a/junifer/markers/base.py b/junifer/markers/base.py index 12227ce79..d8f71d2b6 100644 --- a/junifer/markers/base.py +++ b/junifer/markers/base.py @@ -30,14 +30,36 @@ class BaseMarker(ABC, PipelineStepMixin): """ def __init__( - self, on: Union[List[str], str], name: Optional[str] = None + self, + on: Optional[Union[List[str], str]] = None, + name: Optional[str] = None, ) -> None: """Initialize the class.""" + if on is None: + on = self.get_valid_inputs() if not isinstance(on, list): on = [on] - self._valid_inputs = on self.name = self.__class__.__name__ if name is None else name + if any(x not in self.get_valid_inputs() for x in on): + wrong_on = [x for x in on if x not in self.get_valid_inputs()] + raise ValueError(f"{self.name} cannot be computed on {wrong_on}") + self._on = on + + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + raise_error( + msg="Concrete classes need to implement get_valid_inputs().", + klass=NotImplementedError, + ) + def get_meta(self, kind: str) -> Dict: """Get metadata. @@ -74,11 +96,11 @@ class BaseMarker(ABC, PipelineStepMixin): If the input does not have the required data. """ - if not any(x in input for x in self._valid_inputs): + if not any(x in input for x in self._on): raise_error( "Input does not have the required data." f"\t Input: {input}" - f"\t Required (any of): {self._valid_inputs}" + f"\t Required (any of): {self._on}" ) @abstractmethod @@ -157,7 +179,7 @@ class BaseMarker(ABC, PipelineStepMixin): def fit_transform( self, input: Dict[str, Dict], - storage: "BaseFeatureStorage" = None, + storage: Optional["BaseFeatureStorage"] = None, ) -> Dict: """Fit and transform. @@ -177,7 +199,7 @@ class BaseMarker(ABC, PipelineStepMixin): """ out = {} meta = input.get("meta", {}) - for kind in self._valid_inputs: + for kind in self._on: if kind in input.keys(): logger.info(f"Computing {kind}") t_input = input[kind] diff --git a/junifer/markers/ets_rss.py b/junifer/markers/ets_rss.py index 668773201..d0fd50c15 100644 --- a/junifer/markers/ets_rss.py +++ b/junifer/markers/ets_rss.py @@ -13,7 +13,7 @@ import numpy as np from ..api.decorators import register_marker from ..utils import logger from .base import BaseMarker -from .parcel import ParcelAggregation +from .parcel_aggregation import ParcelAggregation from .utils import _ets @@ -43,12 +43,23 @@ class RSSETSMarker(BaseMarker): self, atlas: str, aggregation_method: str = "mean", - name: str = None, + name: Optional[str] = None, ) -> None: """Initialize the class.""" self.atlas = atlas self.aggregation_method = aggregation_method - super().__init__(on=["BOLD"], name=name) + super().__init__(name=name) + + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + return ["BOLD"] def get_output_kind(self, input: List[str]) -> List[str]: """Get output kind. diff --git a/junifer/markers/functional_connectivity_atlas.py b/junifer/markers/functional_connectivity_atlas.py index 4a84f215c..ef0e2deb6 100644 --- a/junifer/markers/functional_connectivity_atlas.py +++ b/junifer/markers/functional_connectivity_atlas.py @@ -12,7 +12,7 @@ from sklearn.covariance import EmpiricalCovariance from ..api.decorators import register_marker from ..utils import logger from .base import BaseMarker -from .parcel import ParcelAggregation +from .parcel_aggregation import ParcelAggregation if TYPE_CHECKING: @@ -65,13 +65,23 @@ class FunctionalConnectivityAtlas(BaseMarker): self.cor_method_params = ( {} if cor_method_params is None else cor_method_params ) - on = ["BOLD"] # default to nilearn behavior self.cor_method_params["empirical"] = self.cor_method_params.get( "empirical", False ) - super().__init__(on=on, name=name) + super().__init__(name=name) + + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + return ["BOLD"] def get_output_kind(self, input: List[str]) -> List[str]: """Get output kind. diff --git a/junifer/markers/functional_connectivity_spheres.py b/junifer/markers/functional_connectivity_spheres.py index e65a6f10b..44c9f1dae 100644 --- a/junifer/markers/functional_connectivity_spheres.py +++ b/junifer/markers/functional_connectivity_spheres.py @@ -79,7 +79,18 @@ class FunctionalConnectivitySpheres(BaseMarker): "empirical", False ) - super().__init__(on=["BOLD"], name=name) + super().__init__(name=name) + + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + return ["BOLD"] def get_output_kind(self, input: List[str]) -> List[str]: """Get output kind. diff --git a/junifer/markers/parcel.py b/junifer/markers/parcel_aggregation.py similarity index 94% rename from junifer/markers/parcel.py rename to junifer/markers/parcel_aggregation.py index b4c64a150..c75816fe0 100644 --- a/junifer/markers/parcel.py +++ b/junifer/markers/parcel_aggregation.py @@ -38,7 +38,7 @@ class ParcelAggregation(BaseMarker): :func:`junifer.stats.get_aggfunc_by_name`. on : {"T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"} or list of the options, optional - The kind of data to apply the marker to. If None, will work on all + The data types to apply the marker to. If None, will work on all available data (default None). name : str, optional The name of the marker. If None, will use the class name (default @@ -58,10 +58,19 @@ class ParcelAggregation(BaseMarker): self.atlas = atlas self.method = method self.method_params = {} if method_params is None else method_params - if on is None: - on = ["T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"] super().__init__(on=on, name=name) + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + return ["T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"] + def get_output_kind(self, input: List[str]) -> List[str]: """Get output kind. diff --git a/junifer/markers/sphere_aggregation.py b/junifer/markers/sphere_aggregation.py index e25478c52..fde777a9b 100644 --- a/junifer/markers/sphere_aggregation.py +++ b/junifer/markers/sphere_aggregation.py @@ -69,10 +69,19 @@ class SphereAggregation(BaseMarker): self.method = method self.method_params = {} if method_params is None else method_params - if on is None: - on = ["T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"] super().__init__(on=on, name=name) + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + return ["T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"] + def get_output_kind(self, input: List[str]) -> List[str]: """Get output kind. diff --git a/junifer/markers/tests/test_functional_connectivity_atlas.py b/junifer/markers/tests/test_functional_connectivity_atlas.py index 4b14b17c1..33e38127f 100644 --- a/junifer/markers/tests/test_functional_connectivity_atlas.py +++ b/junifer/markers/tests/test_functional_connectivity_atlas.py @@ -14,7 +14,7 @@ from numpy.testing import assert_array_almost_equal, assert_array_equal from junifer.markers.functional_connectivity_atlas import ( FunctionalConnectivityAtlas, ) -from junifer.markers.parcel import ParcelAggregation +from junifer.markers.parcel_aggregation import ParcelAggregation from junifer.storage import SQLiteFeatureStorage diff --git a/junifer/markers/tests/test_markers_base.py b/junifer/markers/tests/test_markers_base.py index 12d0b583e..22057696f 100644 --- a/junifer/markers/tests/test_markers_base.py +++ b/junifer/markers/tests/test_markers_base.py @@ -12,13 +12,16 @@ from junifer.markers.base import BaseMarker def test_base_marker_abstractness() -> None: """Test BaseMarker is abstract base class.""" with pytest.raises(TypeError, match=r"abstract"): - BaseMarker(on=["BOLD"]) + BaseMarker(on=["BOLD"]) # type: ignore -def test_base_datagrabber_subclassing() -> None: +def test_base_marker_subclassing() -> None: """Test proper subclassing of BaseMarker.""" # Create concrete class class MyBaseMarker(BaseMarker): + def get_valid_inputs(self): + return ["BOLD", "T1w"] + def get_output_kind(self, input): return ["timeseries"] @@ -32,6 +35,9 @@ def test_base_datagrabber_subclassing() -> None: def store(self, kind, out, storage): return super().store(kind=kind, out=out, storage=storage) + with pytest.raises(ValueError, match=r"cannot be computed on \['T2w'\]"): + MyBaseMarker(on=["BOLD", "T2w"]) + # Create input for marker input_ = { "meta": {"datagrabber": "dg", "element": "elem", "datareader": "dr"}, @@ -54,7 +60,7 @@ def test_base_datagrabber_subclassing() -> None: # Check no implementation check with pytest.raises(NotImplementedError): - marker.store(kind="kind", out="out", storage="storage") + marker.store(kind="kind", out="out", storage="storage") # type: ignore # Check attributes assert marker.name == "MyBaseMarker" diff --git a/junifer/markers/tests/test_parcel.py b/junifer/markers/tests/test_parcel.py index 4098bd59c..74518b279 100644 --- a/junifer/markers/tests/test_parcel.py +++ b/junifer/markers/tests/test_parcel.py @@ -12,7 +12,7 @@ from nilearn.maskers import NiftiLabelsMasker, NiftiMasker from numpy.testing import assert_array_almost_equal, assert_array_equal from scipy.stats import trim_mean -from junifer.markers.parcel import ParcelAggregation +from junifer.markers.parcel_aggregation import ParcelAggregation def test_ParcelAggregation_input_output() -> None: diff --git a/scratch/test_niftimasker.py b/scratch/test_niftimasker.py index db7fcd0a2..2cd9c86ed 100644 --- a/scratch/test_niftimasker.py +++ b/scratch/test_niftimasker.py @@ -43,7 +43,7 @@ for t_v in sorted(np.unique(atlas_values)): manual.append(t_values) -from junifer.markers.parcel import ParcelAggregation +from junifer.markers.parcel_aggregation import ParcelAggregation marker = ParcelAggregation(atlas='Schaefer100x7', method='mean') input = dict(VBM_GM=dict(data=img)) -- 2.52.0 From 64b459715b2704f0e3c7edbbe8e2f33acfdf47ff Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 26 Oct 2022 17:51:05 +0300 Subject: [PATCH 045/142] Increase coverage --- junifer/markers/tests/test_markers_base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/junifer/markers/tests/test_markers_base.py b/junifer/markers/tests/test_markers_base.py index 22057696f..220d3dbfe 100644 --- a/junifer/markers/tests/test_markers_base.py +++ b/junifer/markers/tests/test_markers_base.py @@ -47,6 +47,10 @@ def test_base_marker_subclassing() -> None: }, } marker = MyBaseMarker(on=["BOLD"]) + + with pytest.raises(ValueError, match="not have the required data"): + marker.validate_input(["T1w"]) + output = marker.fit_transform(input=input_) # process # Check output assert "BOLD" in output -- 2.52.0 From 464de2264e4c428979a9c5d62811c4917222659a Mon Sep 17 00:00:00 2001 From: Felix Hoffstaedter Date: Tue, 13 Sep 2022 13:24:58 +0200 Subject: [PATCH 046/142] add grabber for local VBM AOMIC 1000 dataset --- junifer/configs/juseless/juseless.py | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 junifer/configs/juseless/juseless.py diff --git a/junifer/configs/juseless/juseless.py b/junifer/configs/juseless/juseless.py new file mode 100644 index 000000000..cc26f55e1 --- /dev/null +++ b/junifer/configs/juseless/juseless.py @@ -0,0 +1,75 @@ +"""Provide class for juseless datalad datagrabber.""" + +# Authors: Federico Raimondo +# Leonard Sasse +# Synchon Mandal +# License: AGPL + +from pathlib import Path +from typing import Union + +from ..api.decorators import register_datagrabber +from ..datagrabber import PatternDataladDataGrabber + + +@register_datagrabber +class JuselessDataladUKBVBM(PatternDataladDataGrabber): + """Juseless UKB VBM DataGrabber class. + + Implements a DataGrabber to access the UKB VBM data in Juseless. + + Parameters + ----------- + datadir : str or pathlib.Path, optional + The directory where the datalad dataset will be cloned. If None, + the datalad dataset will be cloned into a temporary directory + (default None). + + """ + + def __init__(self, datadir: Union[str, Path, None] = None) -> None: + """Initialize the class.""" + uri = "ria+http://ukb.ds.inm7.de#~cat_m0wp1" + rootdir = "m0wp1" + types = ["VBM_GM"] + replacements = ["subject", "session"] + patterns = {"VBM_GM": "m0wp1sub-{subject}_ses-{session}_T1w.nii.gz"} + super().__init__( + types=types, + datadir=datadir, + uri=uri, + rootdir=rootdir, + replacements=replacements, + patterns=patterns, + ) + +@register_datagrabber +class JuselessDataladAOMICVBM(PatternDataladDataGrabber): + """Juseless AOMIC VBM DataGrabber class. + + Implements a DataGrabber to access the AOMIC VBM data in Juseless. + + Parameters + ----------- + datadir : str or pathlib.Path, optional + The directory where the datalad dataset will be cloned. If None, + the datalad dataset will be cloned into a temporary directory + (default None). + + """ + + def __init__(self, datadir: Union[str, Path, None] = None) -> None: + """Initialize the class.""" + uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097_ReproVBM" + rootdir = "" + types = ["VBM_GM"] + replacements = ["subject"] + patterns = {"VBM_GM": "{subject}/mri/m0wp1sub-{subject}_T1w.nii.gz"} + super().__init__( + types=types, + datadir=datadir, + uri=uri, + rootdir=rootdir, + replacements=replacements, + patterns=patterns, + ) -- 2.52.0 From d0c3be45450c59e43672a5041cdce40ef29d0990 Mon Sep 17 00:00:00 2001 From: Felix Hoffstaedter Date: Thu, 15 Sep 2022 21:17:23 +0200 Subject: [PATCH 047/142] fix missing space and uri too long is problematic: copied symlink with short name --- junifer/configs/juseless/juseless.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/junifer/configs/juseless/juseless.py b/junifer/configs/juseless/juseless.py index cc26f55e1..90843ea94 100644 --- a/junifer/configs/juseless/juseless.py +++ b/junifer/configs/juseless/juseless.py @@ -43,6 +43,7 @@ class JuselessDataladUKBVBM(PatternDataladDataGrabber): patterns=patterns, ) + @register_datagrabber class JuselessDataladAOMICVBM(PatternDataladDataGrabber): """Juseless AOMIC VBM DataGrabber class. @@ -60,11 +61,11 @@ class JuselessDataladAOMICVBM(PatternDataladDataGrabber): def __init__(self, datadir: Union[str, Path, None] = None) -> None: """Initialize the class.""" - uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097_ReproVBM" - rootdir = "" + uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097" + rootdir = "{subject}/mri" types = ["VBM_GM"] replacements = ["subject"] - patterns = {"VBM_GM": "{subject}/mri/m0wp1sub-{subject}_T1w.nii.gz"} + patterns = {"VBM_GM": "m0wp1sub-{subject}_T1w.nii.gz"} super().__init__( types=types, datadir=datadir, -- 2.52.0 From 764fadd2fdc411907b30eac2f8c356a814ac37cc Mon Sep 17 00:00:00 2001 From: Felix Hoffstaedter Date: Tue, 13 Sep 2022 13:24:58 +0200 Subject: [PATCH 048/142] add grabber for local VBM AOMIC 1000 dataset --- junifer/configs/juseless/juseless.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/junifer/configs/juseless/juseless.py b/junifer/configs/juseless/juseless.py index 90843ea94..937ca0aac 100644 --- a/junifer/configs/juseless/juseless.py +++ b/junifer/configs/juseless/juseless.py @@ -61,11 +61,11 @@ class JuselessDataladAOMICVBM(PatternDataladDataGrabber): def __init__(self, datadir: Union[str, Path, None] = None) -> None: """Initialize the class.""" - uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097" - rootdir = "{subject}/mri" + uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097_ReproVBM" + rootdir = "" types = ["VBM_GM"] replacements = ["subject"] - patterns = {"VBM_GM": "m0wp1sub-{subject}_T1w.nii.gz"} + patterns = {"VBM_GM": "{subject}/mri/m0wp1sub-{subject}_T1w.nii.gz"} super().__init__( types=types, datadir=datadir, -- 2.52.0 From 0a167245f878771e740377f95f6a7f79a48f6f8f Mon Sep 17 00:00:00 2001 From: Felix Hoffstaedter Date: Thu, 15 Sep 2022 21:17:23 +0200 Subject: [PATCH 049/142] fix missing space and uri too long is problematic: copied symlink with short name --- junifer/configs/juseless/juseless.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/junifer/configs/juseless/juseless.py b/junifer/configs/juseless/juseless.py index 937ca0aac..90843ea94 100644 --- a/junifer/configs/juseless/juseless.py +++ b/junifer/configs/juseless/juseless.py @@ -61,11 +61,11 @@ class JuselessDataladAOMICVBM(PatternDataladDataGrabber): def __init__(self, datadir: Union[str, Path, None] = None) -> None: """Initialize the class.""" - uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097_ReproVBM" - rootdir = "" + uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097" + rootdir = "{subject}/mri" types = ["VBM_GM"] replacements = ["subject"] - patterns = {"VBM_GM": "{subject}/mri/m0wp1sub-{subject}_T1w.nii.gz"} + patterns = {"VBM_GM": "m0wp1sub-{subject}_T1w.nii.gz"} super().__init__( types=types, datadir=datadir, -- 2.52.0 From fac94378839ea28b8f1ed68ad2320725eca905d6 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 18 Oct 2022 13:05:31 +0200 Subject: [PATCH 050/142] refactor: move JuselessDataladAOMICID1000VBM to separate module --- .../configs/juseless/datagrabbers/__init__.py | 3 + .../juseless/datagrabbers/aomic_id1000_vbm.py | 41 ++++++++++ junifer/configs/juseless/juseless.py | 76 ------------------- 3 files changed, 44 insertions(+), 76 deletions(-) create mode 100644 junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py delete mode 100644 junifer/configs/juseless/juseless.py diff --git a/junifer/configs/juseless/datagrabbers/__init__.py b/junifer/configs/juseless/datagrabbers/__init__.py index 421ec09fa..5c9ceb50a 100644 --- a/junifer/configs/juseless/datagrabbers/__init__.py +++ b/junifer/configs/juseless/datagrabbers/__init__.py @@ -1,8 +1,11 @@ """Provide imports for datagrabbers sub-package.""" # Authors: Federico Raimondo +# Leonard Sasse +# Synchon Mandal # License: AGPL from .ukb_vbm import JuselessDataladUKBVBM from .camcan_vbm import JuselessDataladCamCANVBM from .ixi_vbm import JuselessDataladIXIVBM +from .aomic_id1000_vbm import JuselessDataladAOMICID1000VBM diff --git a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py new file mode 100644 index 000000000..4d1532180 --- /dev/null +++ b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py @@ -0,0 +1,41 @@ +"""Provide class for AOMIC1000 VBM juseless datalad datagrabber.""" + +# Authors: Felix Hoffstaedter +# Synchon Mandal +# License: AGPL + +from pathlib import Path +from typing import Union + +from ..api.decorators import register_datagrabber +from ..datagrabber import PatternDataladDataGrabber + + +@register_datagrabber +class JuselessDataladAOMICID1000VBM(PatternDataladDataGrabber): + """Juseless AOMICID1000 VBM DataGrabber class. + + Implements a DataGrabber to access the AOMICID1000 VBM data in Juseless. + + Parameters + ----------- + datadir : str or pathlib.Path, optional + The directory where the datalad dataset will be cloned. If None, + the datalad dataset will be cloned into a temporary directory + (default None). + + """ + + def __init__(self, datadir: Union[str, Path, None] = None) -> None: + """Initialize the class.""" + uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097" + types = ["VBM_GM"] + replacements = ["subject"] + patterns = {"VBM_GM": "{subject}/mri/m0wp1sub-{subject}_T1w.nii.gz"} + super().__init__( + types=types, + datadir=datadir, + uri=uri, + replacements=replacements, + patterns=patterns, + ) diff --git a/junifer/configs/juseless/juseless.py b/junifer/configs/juseless/juseless.py deleted file mode 100644 index 90843ea94..000000000 --- a/junifer/configs/juseless/juseless.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Provide class for juseless datalad datagrabber.""" - -# Authors: Federico Raimondo -# Leonard Sasse -# Synchon Mandal -# License: AGPL - -from pathlib import Path -from typing import Union - -from ..api.decorators import register_datagrabber -from ..datagrabber import PatternDataladDataGrabber - - -@register_datagrabber -class JuselessDataladUKBVBM(PatternDataladDataGrabber): - """Juseless UKB VBM DataGrabber class. - - Implements a DataGrabber to access the UKB VBM data in Juseless. - - Parameters - ----------- - datadir : str or pathlib.Path, optional - The directory where the datalad dataset will be cloned. If None, - the datalad dataset will be cloned into a temporary directory - (default None). - - """ - - def __init__(self, datadir: Union[str, Path, None] = None) -> None: - """Initialize the class.""" - uri = "ria+http://ukb.ds.inm7.de#~cat_m0wp1" - rootdir = "m0wp1" - types = ["VBM_GM"] - replacements = ["subject", "session"] - patterns = {"VBM_GM": "m0wp1sub-{subject}_ses-{session}_T1w.nii.gz"} - super().__init__( - types=types, - datadir=datadir, - uri=uri, - rootdir=rootdir, - replacements=replacements, - patterns=patterns, - ) - - -@register_datagrabber -class JuselessDataladAOMICVBM(PatternDataladDataGrabber): - """Juseless AOMIC VBM DataGrabber class. - - Implements a DataGrabber to access the AOMIC VBM data in Juseless. - - Parameters - ----------- - datadir : str or pathlib.Path, optional - The directory where the datalad dataset will be cloned. If None, - the datalad dataset will be cloned into a temporary directory - (default None). - - """ - - def __init__(self, datadir: Union[str, Path, None] = None) -> None: - """Initialize the class.""" - uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097" - rootdir = "{subject}/mri" - types = ["VBM_GM"] - replacements = ["subject"] - patterns = {"VBM_GM": "m0wp1sub-{subject}_T1w.nii.gz"} - super().__init__( - types=types, - datadir=datadir, - uri=uri, - rootdir=rootdir, - replacements=replacements, - patterns=patterns, - ) -- 2.52.0 From 0857d780c0eba13f930f942cfc5bfe11411d77ec Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 18 Oct 2022 13:06:16 +0200 Subject: [PATCH 051/142] update: add juseless test for JuselessDataladAOMICID1000VBM --- .../tests/test_aomic_id1000_vbm.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py diff --git a/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py b/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py new file mode 100644 index 000000000..1da9ccdd6 --- /dev/null +++ b/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py @@ -0,0 +1,32 @@ +"""Provide tests for AOMICID1000 VBM juseless datagrabber.""" + +# Authors: Felix Hoffstaedter +# Synchon Mandal +# License: AGPL + +import socket + +import pytest + +from junifer.configs.juseless.datagrabbers import JuselessDataladAOMICID1000VBM +from junifer.utils.logging import configure_logging + + +# Check if the test is running on juseless +if socket.gethostname() != "juseless": + pytest.skip("These tests are only for juseless", allow_module_level=True) + +configure_logging(level="DEBUG") + + +def test_juselessdataladaomicid1000vbm_datagrabber() -> None: + """Test datalad AOMICID1000VBM datagrabber.""" + with JuselessDataladAOMICID1000VBM() as dg: + all_elements = dg.get_elements() + test_element = all_elements[0] + out = dg[test_element] + assert "VBM_GM" in out + assert ( + out["VBM_GM"]["path"].name == f"m0wp1sub-{test_element}_T1w.nii.gz" + ) + assert out["VBM_GM"]["path"].exists() -- 2.52.0 From 58360e01a1a27184677e5b7357eba6d49dcc9171 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 18 Oct 2022 13:18:30 +0200 Subject: [PATCH 052/142] fix: correct imports for aomic_id1000_vbm.py --- junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py index 4d1532180..1db4d8b17 100644 --- a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +++ b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py @@ -7,8 +7,8 @@ from pathlib import Path from typing import Union -from ..api.decorators import register_datagrabber -from ..datagrabber import PatternDataladDataGrabber +from ....api.decorators import register_datagrabber +from ....datagrabber import PatternDataladDataGrabber @register_datagrabber -- 2.52.0 From e6355457fecc6c57ba9a550d30fa9848b616dd68 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 12:28:56 +0200 Subject: [PATCH 053/142] update: update URI and pattern for JuselessDataladAOMICID1000VBM --- junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py index 1db4d8b17..3fba4e07e 100644 --- a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +++ b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py @@ -28,10 +28,12 @@ class JuselessDataladAOMICID1000VBM(PatternDataladDataGrabber): def __init__(self, datadir: Union[str, Path, None] = None) -> None: """Initialize the class.""" - uri = "ria+file:///data/project/infrasound/dataladstore#~ds003097" + uri = "https://gin.g-node.org/felixh/ds003097_ReproVBM" types = ["VBM_GM"] replacements = ["subject"] - patterns = {"VBM_GM": "{subject}/mri/m0wp1sub-{subject}_T1w.nii.gz"} + patterns = { + "VBM_GM": "sub-{subject}/mri/mwp1sub-{subject}_run-2_T1w.nii.gz", + } super().__init__( types=types, datadir=datadir, -- 2.52.0 From d0a4b1c61dbb0d830afd9648b403abc4c4d2675e Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 12:29:30 +0200 Subject: [PATCH 054/142] fix: correct pattern for JuselessDataladAOMICID1000VBM test --- .../juseless/datagrabbers/tests/test_aomic_id1000_vbm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py b/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py index 1da9ccdd6..fad38837f 100644 --- a/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py +++ b/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py @@ -27,6 +27,7 @@ def test_juselessdataladaomicid1000vbm_datagrabber() -> None: out = dg[test_element] assert "VBM_GM" in out assert ( - out["VBM_GM"]["path"].name == f"m0wp1sub-{test_element}_T1w.nii.gz" + out["VBM_GM"]["path"].name + == f"mwp1sub-{test_element}_run-2_T1w.nii.gz" ) assert out["VBM_GM"]["path"].exists() -- 2.52.0 From 97c6eb3936f3e939f9d76db5fca44ca7e49e1c4a Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 28 Oct 2022 09:35:03 +0200 Subject: [PATCH 055/142] chore: add Felix to contributors.inc --- docs/changes/contributors.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changes/contributors.inc b/docs/changes/contributors.inc index 46ee5aaaa..4e81f0aa2 100644 --- a/docs/changes/contributors.inc +++ b/docs/changes/contributors.inc @@ -8,3 +8,4 @@ .. _Xuan Li: https://github.com/xuanli-ac .. _Sami Hamdan: https://github.com/samihamdan .. _Nicolas Nieto: https://github.com/N-Nieto +.. _Felix Hoffstaedter: https://github.com/FeHoff -- 2.52.0 From abcf2f5af0061acc9628f97d7e51e41775508954 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 28 Oct 2022 09:35:16 +0200 Subject: [PATCH 056/142] chore: update latest.inc --- docs/changes/latest.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 0319a32d3..900393c2f 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -69,6 +69,8 @@ Enhancements - Refactor markers ``on`` attribute and ``get_valid_inputs`` to verify that the marker can be computed on the input data types (by `Fede Raimondo`_) +- Implement JuselessDataladAOMICID1000VBM datagrabber for accessing AOMIC ID 1000 VBM from juseless (:gh:`57` by `Felix Hoffstaedter`_ and `Synchon Mandal`_) + Bugs ~~~~ -- 2.52.0 From e81d7615d721e87a1dabe256bb2caf10475a48cb Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 30 Sep 2022 10:31:10 +0200 Subject: [PATCH 057/142] update: add script for HCP1200 test data generation in Gin --- tools/create_hcp1200_example_dataset.py | 74 +++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 tools/create_hcp1200_example_dataset.py diff --git a/tools/create_hcp1200_example_dataset.py b/tools/create_hcp1200_example_dataset.py new file mode 100644 index 000000000..4aa4044ea --- /dev/null +++ b/tools/create_hcp1200_example_dataset.py @@ -0,0 +1,74 @@ +"""Script to generate example dataset for HCP1200.""" + +# Authors: Synchon Mandal +# License: AGPL + +from itertools import product +from tempfile import TemporaryDirectory +from pathlib import Path + +import datalad.api as dl + + +# Set destination URL +DST = "git@gin.g-node.org:/juaml/datalad-example-hcp1200.git" + + +if __name__ == "__main__": + + with TemporaryDirectory() as tmpdir: + # Convert str to Path + tmpdir_path = Path(tmpdir) + # Set base directory + basedir = tmpdir_path / "example_hcp1200" + # Create new datalad dataset + dataset = dl.create(path=str(basedir.absolute())) + # Generate subject directories + for sub in range(1, 10): + subdir = basedir / f"sub-{sub:02d}" + # Create subject directory + subdir.mkdir() + + for (task, phase_encoding) in product( + [ + "REST1", + "REST2", + "SOCIAL", + "WM", + "RELATIONAL", + "EMOTION", + "LANGUAGE", + "GAMBLING", + "MOTOR", + ], + ["LR", "RL"], + ): + # Proper formatting of task name + if "REST" in task: + new_task = f"rfMRI_{task}" + else: + new_task = f"tfMRI_{task}" + # Set subject data directory + sub_datadir = ( + subdir + / "MNINonLinear" + / "Results" + / f"{new_task}_{phase_encoding}" + ) + # Create subject data directory + sub_datadir.mkdir(parents=True) + # Set subject data file + sub_datafile = ( + sub_datadir + / f"{new_task}_{phase_encoding}_hp2000_clean.nii.gz" + ) + # Create subject data file + with open(sub_datafile, "w") as f: + f.write("placeholder") + + # Save datalad dataset + dataset.save(recursive=True) + # Add datalad sibling + dataset.siblings(action="add", name="gin", url=DST) + # Push dataset to sibling + dataset.push(to="gin", force="all") -- 2.52.0 From aca638cbb4521a0ccc9f04ca7663db2113a18250 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 30 Sep 2022 10:31:54 +0200 Subject: [PATCH 058/142] update: add test for DataladHCP1200() datagrabber --- junifer/datagrabber/tests/test_hcp.py | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 junifer/datagrabber/tests/test_hcp.py diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py new file mode 100644 index 000000000..81673c6eb --- /dev/null +++ b/junifer/datagrabber/tests/test_hcp.py @@ -0,0 +1,41 @@ +"""Provide tests for HCP1200.""" + +# Authors: Synchon Mandal +# License: AGPL + +from junifer.datagrabber.hcp import DataladHCP1200 +from junifer.utils import configure_logging + + +URI = "https://gin.g-node.org/juaml/datalad-example-hcp1200" + + +def test_dataladhcp1200_datagrabber() -> None: + """Test datalad HCP1200 datagrabber.""" + configure_logging(level="DEBUG") + dg = DataladHCP1200() + # Set URI to Gin + dg.uri = URI + # Set correct root directory + dg._rootdir = "." + with dg: + # Get all elements + all_elements = dg.get_elements() + # Get test element + test_element = all_elements[0] + # Get test element data + out = dg[test_element] + # Asserts data type + assert "BOLD" in out + # Assert data file name + assert out["BOLD"]["path"].name == "rfMRI_REST1_LR_hp2000_clean.nii.gz" + # Assert data file path exists + assert out["BOLD"]["path"].exists() + # Assert data file path is a file + assert out["BOLD"]["path"].is_file() + # Assert metadata + assert "meta" in out + meta = out["meta"] + assert "element" in meta + assert "subject" in meta["element"] + assert test_element[0] == meta["element"]["subject"] -- 2.52.0 From 6a614d01b155780b3f4b645290f44dc72bee00c4 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 30 Sep 2022 10:37:55 +0200 Subject: [PATCH 059/142] chore: update latest.inc --- docs/changes/latest.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 900393c2f..496cbfc5a 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -71,6 +71,8 @@ Enhancements - Implement JuselessDataladAOMICID1000VBM datagrabber for accessing AOMIC ID 1000 VBM from juseless (:gh:`57` by `Felix Hoffstaedter`_ and `Synchon Mandal`_) +- Add test for DataladHCP1200 datagrabber (:gh: `93` by `Synchon Mandal`_). + Bugs ~~~~ -- 2.52.0 From 33abb48b1a7eb334a999bf8a3545963d8327d930 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 10 Oct 2022 10:32:48 +0200 Subject: [PATCH 060/142] update: parametrize test for DataladHCP1200 datagrabber --- junifer/datagrabber/tests/test_hcp.py | 54 +++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 81673c6eb..d32238766 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -3,6 +3,10 @@ # Authors: Synchon Mandal # License: AGPL +from typing import Optional + +import pytest + from junifer.datagrabber.hcp import DataladHCP1200 from junifer.utils import configure_logging @@ -10,10 +14,52 @@ from junifer.utils import configure_logging URI = "https://gin.g-node.org/juaml/datalad-example-hcp1200" -def test_dataladhcp1200_datagrabber() -> None: - """Test datalad HCP1200 datagrabber.""" +@pytest.mark.parametrize( + "tasks, phase_encodings, expected_path_name", + [ + (None, None, "rfMRI_REST1_LR_hp2000_clean.nii.gz"), + ("REST1", "LR", "rfMRI_REST1_LR_hp2000_clean.nii.gz"), + ("REST1", "RL", "rfMRI_REST1_RL_hp2000_clean.nii.gz"), + ("REST2", "LR", "rfMRI_REST2_LR_hp2000_clean.nii.gz"), + ("REST2", "RL", "rfMRI_REST2_RL_hp2000_clean.nii.gz"), + ("SOCIAL", "LR", "tfMRI_SOCIAL_LR_hp2000_clean.nii.gz"), + ("SOCIAL", "RL", "tfMRI_SOCIAL_RL_hp2000_clean.nii.gz"), + ("WM", "LR", "tfMRI_WM_LR_hp2000_clean.nii.gz"), + ("WM", "RL", "tfMRI_WM_RL_hp2000_clean.nii.gz"), + ("RELATIONAL", "LR", "tfMRI_RELATIONAL_LR_hp2000_clean.nii.gz"), + ("RELATIONAL", "RL", "tfMRI_RELATIONAL_RL_hp2000_clean.nii.gz"), + ("EMOTION", "LR", "tfMRI_EMOTION_LR_hp2000_clean.nii.gz"), + ("EMOTION", "RL", "tfMRI_EMOTION_RL_hp2000_clean.nii.gz"), + ("LANGUAGE", "LR", "tfMRI_LANGUAGE_LR_hp2000_clean.nii.gz"), + ("LANGUAGE", "RL", "tfMRI_LANGUAGE_RL_hp2000_clean.nii.gz"), + ("GAMBLING", "LR", "tfMRI_GAMBLING_LR_hp2000_clean.nii.gz"), + ("GAMBLING", "RL", "tfMRI_GAMBLING_RL_hp2000_clean.nii.gz"), + ("MOTOR", "LR", "tfMRI_MOTOR_LR_hp2000_clean.nii.gz"), + ("MOTOR", "RL", "tfMRI_MOTOR_RL_hp2000_clean.nii.gz"), + ], +) +def test_dataladhcp1200_datagrabber( + tasks: Optional[str], + phase_encodings: Optional[str], + expected_path_name: str, +) -> None: + """Test datalad HCP1200 datagrabber. + + Parameters + ---------- + tasks : str + The parametrized tasks. + phase_encodings : str + The parametrized phase encodings. + expected_path_name : str + The parametrized expected path name. + + """ configure_logging(level="DEBUG") - dg = DataladHCP1200() + dg = DataladHCP1200( + tasks=tasks, + phase_encodings=phase_encodings, + ) # Set URI to Gin dg.uri = URI # Set correct root directory @@ -28,7 +74,7 @@ def test_dataladhcp1200_datagrabber() -> None: # Asserts data type assert "BOLD" in out # Assert data file name - assert out["BOLD"]["path"].name == "rfMRI_REST1_LR_hp2000_clean.nii.gz" + assert out["BOLD"]["path"].name == expected_path_name # Assert data file path exists assert out["BOLD"]["path"].exists() # Assert data file path is a file -- 2.52.0 From c4a0bdc50dd8a0bd1e08a41beb0e537ee8e90e28 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 11:08:03 +0200 Subject: [PATCH 061/142] update: add support for checking file existence in PatternDataGrabber --- junifer/datagrabber/pattern.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/junifer/datagrabber/pattern.py b/junifer/datagrabber/pattern.py index bf5fd1cef..34b9f43d1 100644 --- a/junifer/datagrabber/pattern.py +++ b/junifer/datagrabber/pattern.py @@ -32,6 +32,8 @@ class PatternDataGrabber(BaseDataGrabber): `{subject}` in the pattern will be replaced by the indexed element. replacements: list of str Replacements in the patterns for each item in the "element" tuple. + check_file_existence : bool, optional + Whether to check if file exists while accessing (default False). datadir : str or pathlib.Path The directory where the data is / will be stored. **kwargs @@ -48,6 +50,7 @@ class PatternDataGrabber(BaseDataGrabber): types: List[str], patterns: Dict[str, str], replacements: List[str], + check_file_existence: bool = False, **kwargs, ) -> None: """Initialize the class.""" @@ -65,6 +68,7 @@ class PatternDataGrabber(BaseDataGrabber): logger.debug(f"\treplacements = {replacements}") self.patterns = patterns self.replacements = replacements + self.check_file_existence = check_file_existence def _replace_patterns_regex( self, pattern: str @@ -170,11 +174,12 @@ class PatternDataGrabber(BaseDataGrabber): t_out = t_matches[0] else: t_out = self.datadir / t_replace - if not t_out.exists() and not t_out.is_symlink(): - raise_error( - f"Cannot access {t_type} for {element}: " - f"File {t_out} does not exist" - ) + if self.check_file_existence: + if not t_out.exists() and not t_out.is_symlink(): + raise_error( + f"Cannot access {t_type} for {element}: " + f"File {t_out} does not exist" + ) out[t_type] = {"path": t_out} # Meta here is element and types out["meta"]["element"] = dict(zip(self.replacements, element)) -- 2.52.0 From 885fa3562cca742db55c9f0d4c55dcf7a8d244bb Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 11:08:35 +0200 Subject: [PATCH 062/142] chore: docstring fix in PatternDataGrabber --- junifer/datagrabber/pattern.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junifer/datagrabber/pattern.py b/junifer/datagrabber/pattern.py index 34b9f43d1..7375e81c4 100644 --- a/junifer/datagrabber/pattern.py +++ b/junifer/datagrabber/pattern.py @@ -30,7 +30,7 @@ class PatternDataGrabber(BaseDataGrabber): Patterns for each type of data as a dictionary. The keys are the types and the values are the patterns. Each occurrence of the string `{subject}` in the pattern will be replaced by the indexed element. - replacements: list of str + replacements : list of str Replacements in the patterns for each item in the "element" tuple. check_file_existence : bool, optional Whether to check if file exists while accessing (default False). -- 2.52.0 From a5ec5f32d1f42aa7c86363a0848fc3ae5645935d Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 17:58:48 +0200 Subject: [PATCH 063/142] update: add check_file_existence argument in DataladHCP1200 --- junifer/datagrabber/hcp.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/junifer/datagrabber/hcp.py b/junifer/datagrabber/hcp.py index 9db59031b..700ebb95b 100644 --- a/junifer/datagrabber/hcp.py +++ b/junifer/datagrabber/hcp.py @@ -174,6 +174,8 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): phase_encodings : {"LR", "RL"} or list of the options, optional HCP phase encoding directions. If None, both will be used (default None). + check_file_existence : bool, optional + Whether to check if file exists while accessing (default False). **kwargs Keyword arguments passed to superclass. @@ -184,6 +186,7 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): datadir: Union[str, Path, None] = None, tasks: Union[str, List[str], None] = None, phase_encodings: Union[str, List[str], None] = None, + check_file_existence: bool = False, **kwargs, ) -> None: """Initialize the class.""" @@ -196,6 +199,7 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): datadir=datadir, tasks=tasks, phase_encodings=phase_encodings, + check_file_existence=check_file_existence, uri=uri, rootdir=rootdir, ) -- 2.52.0 From d5f3879be712516c0a073fa0cdf91f181585f2b0 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 18:24:24 +0200 Subject: [PATCH 064/142] chore: update latest.inc --- docs/changes/latest.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 496cbfc5a..21aba6c49 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -81,3 +81,7 @@ Bugs API changes ~~~~~~~~~~~ + +- Add new argument ``check_file_existence`` for PatternDataGrabber which allows skipping actual file existence check. + This is needed for datagrabbers which extend from PatternDataGrabber and DataladDataGrabber and have one or more + Datalad subdatasets inside the dataset, for example, DataladHCP1200. \ No newline at end of file -- 2.52.0 From 0e93cc5b5846c6a45dbf20253ca169a4d53176ba Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 18:52:47 +0200 Subject: [PATCH 065/142] fix: add check_file_existence argument for test_PatternDataGrabber_errors --- junifer/datagrabber/tests/test_pattern.py | 1 + 1 file changed, 1 insertion(+) diff --git a/junifer/datagrabber/tests/test_pattern.py b/junifer/datagrabber/tests/test_pattern.py index 472934d2c..61e6c416b 100644 --- a/junifer/datagrabber/tests/test_pattern.py +++ b/junifer/datagrabber/tests/test_pattern.py @@ -103,6 +103,7 @@ def test_PatternDataGrabber_errors(tmp_path: Path) -> None: "anat": "anat/{subject}_{session}_ses.nii", }, replacements=["subject", "session"], + check_file_existence=True, ) with pytest.raises(ValueError, match="element length must be"): -- 2.52.0 From ef138bdef51287645892fa18f01c217eced4ca31 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 18:54:37 +0200 Subject: [PATCH 066/142] update: add correct iterator test for DataladHCP1200 tests --- junifer/datagrabber/tests/test_hcp.py | 61 +++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index d32238766..b02f68981 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -39,9 +39,9 @@ URI = "https://gin.g-node.org/juaml/datalad-example-hcp1200" ], ) def test_dataladhcp1200_datagrabber( - tasks: Optional[str], - phase_encodings: Optional[str], - expected_path_name: str, + tasks: Optional[str], + phase_encodings: Optional[str], + expected_path_name: str, ) -> None: """Test datalad HCP1200 datagrabber. @@ -85,3 +85,58 @@ def test_dataladhcp1200_datagrabber( assert "element" in meta assert "subject" in meta["element"] assert test_element[0] == meta["element"]["subject"] + + +@pytest.mark.parametrize( + "tasks, phase_encodings", + [ + ("REST1", "LR"), + ("REST1", "RL"), + ("REST2", "LR"), + ("REST2", "RL"), + ("SOCIAL", "LR"), + ("SOCIAL", "RL"), + ("WM", "LR"), + ("WM", "RL"), + ("RELATIONAL", "LR"), + ("RELATIONAL", "RL"), + ("EMOTION", "LR"), + ("EMOTION", "RL"), + ("LANGUAGE", "LR"), + ("LANGUAGE", "RL"), + ("GAMBLING", "LR"), + ("GAMBLING", "RL"), + ("MOTOR", "LR"), + ("MOTOR", "RL"), + ], +) +def test_dataladhcp1200_datagrabber_iterator( + tasks: Optional[str], + phase_encodings: Optional[str], +) -> None: + """Test datalad HCP1200 datagrabber iterator. + + Parameters + ---------- + tasks : str + The parametrized tasks. + phase_encodings : str + The parametrized phase encodings. + + """ + configure_logging(level="DEBUG") + dg = DataladHCP1200( + tasks=tasks, + phase_encodings=phase_encodings, + ) + # Set URI to Gin + dg.uri = URI + # Set correct root directory + dg._rootdir = "." + with dg: + # Get all elements + all_elements = dg.get_elements() + # Check only specified task and phase encoding are found + for element in all_elements: + assert element[1] == tasks + assert element[2] == phase_encodings -- 2.52.0 From f3ec4eedbd2cd3b28683089cb3beadb190ee8635 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 21:13:00 +0200 Subject: [PATCH 067/142] chore: rename test for DataladHCP1200 single access --- junifer/datagrabber/tests/test_hcp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index b02f68981..adf8d1740 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -110,11 +110,11 @@ def test_dataladhcp1200_datagrabber( ("MOTOR", "RL"), ], ) -def test_dataladhcp1200_datagrabber_iterator( +def test_dataladhcp1200_datagrabber_single_access( tasks: Optional[str], phase_encodings: Optional[str], ) -> None: - """Test datalad HCP1200 datagrabber iterator. + """Test datalad HCP1200 datagrabber single access. Parameters ---------- -- 2.52.0 From f593fbcb46a56ccebbab10210aa263a4d8b98fbc Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 21:13:28 +0200 Subject: [PATCH 068/142] update: add test for DataladHCP1200 multiple access --- junifer/datagrabber/tests/test_hcp.py | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index adf8d1740..257b32602 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -140,3 +140,42 @@ def test_dataladhcp1200_datagrabber_single_access( for element in all_elements: assert element[1] == tasks assert element[2] == phase_encodings + + +@pytest.mark.parametrize( + "tasks, phase_encodings", + [ + (["REST1", "REST2"], ["LR", "RL"]), + (["REST1", "REST2"], None), + ], +) +def test_dataladhcp1200_datagrabber_multi_access( + tasks: Optional[str], + phase_encodings: Optional[str], +) -> None: + """Test datalad HCP1200 datagrabber multiple access. + + Parameters + ---------- + tasks : str + The parametrized tasks. + phase_encodings : str + The parametrized phase encodings. + + """ + configure_logging(level="DEBUG") + dg = DataladHCP1200( + tasks=["REST1", "REST2"], + phase_encodings=["LR", "RL"], + ) + # Set URI to Gin + dg.uri = URI + # Set correct root directory + dg._rootdir = "." + with dg: + # Get all elements + all_elements = dg.get_elements() + # Check only specified task and phase encoding are found + for element in all_elements: + assert element[1] in ["REST1", "REST2"] + assert element[2] in ["LR", "RL"] -- 2.52.0 From c48a93790866b0036bc67577fb4ac8705653b24f Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 21:14:15 +0200 Subject: [PATCH 069/142] update: add test for DataladHCP1200 multi access with single task --- junifer/datagrabber/tests/test_hcp.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 257b32602..6e538aa67 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -179,3 +179,23 @@ def test_dataladhcp1200_datagrabber_multi_access( for element in all_elements: assert element[1] in ["REST1", "REST2"] assert element[2] in ["LR", "RL"] + + +def test_dataladhcp1200_datagrabber_multi_access_task_simple() -> None: + """Test datalad HCP1200 datagrabber simple multiple access for task.""" + configure_logging(level="DEBUG") + dg = DataladHCP1200( + tasks="REST1", + phase_encodings=["LR", "RL"], + ) + # Set URI to Gin + dg.uri = URI + # Set correct root directory + dg._rootdir = "." + with dg: + # Get all elements + all_elements = dg.get_elements() + # Check only specified task and phase encoding are found + for element in all_elements: + assert element[1] == "REST1" + assert element[2] in ["LR", "RL"] -- 2.52.0 From a5d106596bbb1610806d3343bd80c7dc7c02cf9a Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 21:14:44 +0200 Subject: [PATCH 070/142] update: add test for DataladHCP1200 multiple access with single phase encoding --- junifer/datagrabber/tests/test_hcp.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 6e538aa67..e83e23a5b 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -199,3 +199,23 @@ def test_dataladhcp1200_datagrabber_multi_access_task_simple() -> None: for element in all_elements: assert element[1] == "REST1" assert element[2] in ["LR", "RL"] + + +def test_dataladhcp1200_datagrabber_multi_access_phase_simple() -> None: + """Test datalad HCP1200 datagrabber simple multiple access for phase.""" + configure_logging(level="DEBUG") + dg = DataladHCP1200( + tasks=["REST1", "REST2"], + phase_encodings="LR", + ) + # Set URI to Gin + dg.uri = URI + # Set correct root directory + dg._rootdir = "." + with dg: + # Get all elements + all_elements = dg.get_elements() + # Check only specified task and phase encoding are found + for element in all_elements: + assert element[1] in ["REST1", "REST2"] + assert element[2] == "LR" -- 2.52.0 From 3eb427ca9119ff0279a5b5795020fcae27220705 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 21:15:10 +0200 Subject: [PATCH 071/142] update: add test for DataladHCP1200 incorrect access of tasks --- junifer/datagrabber/tests/test_hcp.py | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index e83e23a5b..bf54fe430 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -219,3 +219,34 @@ def test_dataladhcp1200_datagrabber_multi_access_phase_simple() -> None: for element in all_elements: assert element[1] in ["REST1", "REST2"] assert element[2] == "LR" + + +@pytest.mark.parametrize( + "tasks, phase_encodings", + [ + ("FOO", ["LR", "RL"]), + ("FOO", "RL"), + (["FOO", "BAR"], ["LR", "RL"]), + (["FOO", "BAR"], "LR"), + ], +) +def test_dataladhcp1200_datagrabber_incorrect_access_task( + tasks: Optional[str], + phase_encodings: Optional[str], +) -> None: + """Test datalad HCP1200 datagrabber incorrect access for task. + + Parameters + ---------- + tasks : str + The parametrized tasks. + phase_encodings : str + The parametrized phase encodings. + + """ + configure_logging(level="DEBUG") + with pytest.raises(ValueError, match="not a valid HCP-YA fMRI task input"): + _ = DataladHCP1200( + tasks=tasks, + phase_encodings=phase_encodings, + ) -- 2.52.0 From aaaf954dd12fd3cb2aac13b2bee65d385e91e5b1 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 27 Oct 2022 21:15:32 +0200 Subject: [PATCH 072/142] update: add test for DataladHCP1200 incorrect access for phase encodings --- junifer/datagrabber/tests/test_hcp.py | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index bf54fe430..9b6275314 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -250,3 +250,34 @@ def test_dataladhcp1200_datagrabber_incorrect_access_task( tasks=tasks, phase_encodings=phase_encodings, ) + + +@pytest.mark.parametrize( + "tasks, phase_encodings", + [ + ("REST1", ["FOO", "BAR"]), + ("REST1", "FOO"), + (["REST1", "REST2"], ["FOO", "BAR"]), + (["REST1", "REST2"], "BAR"), + ], +) +def test_dataladhcp1200_datagrabber_incorrect_access_phase( + tasks: Optional[str], + phase_encodings: Optional[str], +) -> None: + """Test datalad HCP1200 datagrabber incorrect access for phase. + + Parameters + ---------- + tasks : str + The parametrized tasks. + phase_encodings : str + The parametrized phase encodings. + + """ + configure_logging(level="DEBUG") + with pytest.raises(ValueError, match="not a valid HCP-YA phase encoding"): + _ = DataladHCP1200( + tasks=tasks, + phase_encodings=phase_encodings, + ) -- 2.52.0 From 4255bc5adc03bf39e8cc2e79312821b958b1977a Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 28 Oct 2022 09:04:54 +0200 Subject: [PATCH 073/142] update: remove check_file_existence argument from DataladHCP1200 --- junifer/datagrabber/hcp.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/junifer/datagrabber/hcp.py b/junifer/datagrabber/hcp.py index 700ebb95b..9db59031b 100644 --- a/junifer/datagrabber/hcp.py +++ b/junifer/datagrabber/hcp.py @@ -174,8 +174,6 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): phase_encodings : {"LR", "RL"} or list of the options, optional HCP phase encoding directions. If None, both will be used (default None). - check_file_existence : bool, optional - Whether to check if file exists while accessing (default False). **kwargs Keyword arguments passed to superclass. @@ -186,7 +184,6 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): datadir: Union[str, Path, None] = None, tasks: Union[str, List[str], None] = None, phase_encodings: Union[str, List[str], None] = None, - check_file_existence: bool = False, **kwargs, ) -> None: """Initialize the class.""" @@ -199,7 +196,6 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): datadir=datadir, tasks=tasks, phase_encodings=phase_encodings, - check_file_existence=check_file_existence, uri=uri, rootdir=rootdir, ) -- 2.52.0 From c0a92b5f547cc412971c7d5c9ea64ea501af5748 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 28 Oct 2022 12:08:45 +0200 Subject: [PATCH 074/142] update: replace check_file_existence argument with skip_file_check property for PatternDataGrabber --- junifer/datagrabber/pattern.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/junifer/datagrabber/pattern.py b/junifer/datagrabber/pattern.py index 7375e81c4..11e727cd6 100644 --- a/junifer/datagrabber/pattern.py +++ b/junifer/datagrabber/pattern.py @@ -32,8 +32,6 @@ class PatternDataGrabber(BaseDataGrabber): `{subject}` in the pattern will be replaced by the indexed element. replacements : list of str Replacements in the patterns for each item in the "element" tuple. - check_file_existence : bool, optional - Whether to check if file exists while accessing (default False). datadir : str or pathlib.Path The directory where the data is / will be stored. **kwargs @@ -50,7 +48,6 @@ class PatternDataGrabber(BaseDataGrabber): types: List[str], patterns: Dict[str, str], replacements: List[str], - check_file_existence: bool = False, **kwargs, ) -> None: """Initialize the class.""" @@ -68,7 +65,11 @@ class PatternDataGrabber(BaseDataGrabber): logger.debug(f"\treplacements = {replacements}") self.patterns = patterns self.replacements = replacements - self.check_file_existence = check_file_existence + + @property + def skip_file_check(self) -> bool: + """Skip file check existence.""" + return False def _replace_patterns_regex( self, pattern: str @@ -174,7 +175,7 @@ class PatternDataGrabber(BaseDataGrabber): t_out = t_matches[0] else: t_out = self.datadir / t_replace - if self.check_file_existence: + if not self.skip_file_check: if not t_out.exists() and not t_out.is_symlink(): raise_error( f"Cannot access {t_type} for {element}: " -- 2.52.0 From 64ad95f34605d297976dd7483fd78721fbb41269 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 28 Oct 2022 12:09:15 +0200 Subject: [PATCH 075/142] fix: correct test for PatternDataGrabber --- junifer/datagrabber/tests/test_pattern.py | 1 - 1 file changed, 1 deletion(-) diff --git a/junifer/datagrabber/tests/test_pattern.py b/junifer/datagrabber/tests/test_pattern.py index 61e6c416b..472934d2c 100644 --- a/junifer/datagrabber/tests/test_pattern.py +++ b/junifer/datagrabber/tests/test_pattern.py @@ -103,7 +103,6 @@ def test_PatternDataGrabber_errors(tmp_path: Path) -> None: "anat": "anat/{subject}_{session}_ses.nii", }, replacements=["subject", "session"], - check_file_existence=True, ) with pytest.raises(ValueError, match="element length must be"): -- 2.52.0 From 11da30cb045061fc3114bc8baff2217344728fbc Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 28 Oct 2022 12:09:38 +0200 Subject: [PATCH 076/142] update: implement skip_file_check property for DataladHCP1200 --- junifer/datagrabber/hcp.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/junifer/datagrabber/hcp.py b/junifer/datagrabber/hcp.py index 9db59031b..90e975a2a 100644 --- a/junifer/datagrabber/hcp.py +++ b/junifer/datagrabber/hcp.py @@ -199,3 +199,8 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): uri=uri, rootdir=rootdir, ) + + @property + def skip_file_check(self) -> bool: + """Skip file check existence.""" + return True -- 2.52.0 From e8fb156f696b29eb064f75f3a11e3f88eb2ffd5c Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:52:51 +0100 Subject: [PATCH 077/142] update: support Python 3.11 in tox.ini --- tox.ini | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tox.ini b/tox.ini index a7c187bb9..0cb26f786 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,13 @@ [tox] -envlist = isort, black, flake8, test, coverage, codespell, py3{8,9,10} +envlist = isort, black, flake8, test, coverage, codespell, py3{8,9,10,11} isolated_build = true [gh-actions] python = 3.8: py38 - 3.9: coverage - 3.10: py310 + 3.9: py39 + 3.10: coverage + 3.11: py311 [testenv] skip_install = false -- 2.52.0 From 4301d3897b2ccefcab7df63a5dc9e87d34e06f9b Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:53:24 +0100 Subject: [PATCH 078/142] update: support Python 3.11 for ci-docs.yml --- .github/workflows/ci-docs.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index b573c46f9..3bbea84b2 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -1,6 +1,6 @@ name: Run Tests -on: +on: push: paths-ignore: - 'junifer/**' @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.8', '3.9', '3.10', '3.11'] steps: - run: 'echo "No build required"' - name: Create mock coverage.xml file @@ -38,11 +38,11 @@ jobs: echo '' >> coverage.xml echo '' >> coverage.xml echo '' >> coverage.xml - if: matrix.python-version == 3.9 + if: matrix.python-version == 3.10 - name: Upload mock coverage to Codecov uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true flags: docs - if: success() && matrix.python-version == 3.9 \ No newline at end of file + if: success() && matrix.python-version == 3.10 \ No newline at end of file -- 2.52.0 From 57d24f78de25f15de66dc6df6749a347f0a016e0 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:53:45 +0100 Subject: [PATCH 079/142] update: support Python 3.11 for ci.yml --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bafa35419..22c99514d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,6 @@ name: Run Tests -on: +on: push: paths: - 'junifer/**' @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.8', '3.9', '3.10', '3.11'] steps: - name: Set up system @@ -44,4 +44,4 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true flags: junifer - if: success() && matrix.python-version == 3.9 + if: success() && matrix.python-version == 3.10 -- 2.52.0 From 87783caa58f064b1caab929ec6629829ae0049a8 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:54:26 +0100 Subject: [PATCH 080/142] update: use Python 3.10 for docs-preview.yml --- .github/workflows/docs-preview.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index 2ea66c5f8..b51c8063f 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -24,10 +24,10 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v2 - - name: Set up Python 3.9 uses: actions/setup-python@v2 + - name: Set up Python 3.10 with: - python-version: 3.9 + python-version: 3.10 - name: Check for sudo shell: bash run: | -- 2.52.0 From 3e9752f668df16e04a08920f76e67883932a4981 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:55:00 +0100 Subject: [PATCH 081/142] chore: use actions/checkout@v3 for docs-preview.yml --- .github/workflows/docs-preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index b51c8063f..ecb40ed94 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -23,8 +23,8 @@ jobs: steps: - name: Checkout source - uses: actions/checkout@v2 uses: actions/setup-python@v2 + uses: actions/checkout@v3 - name: Set up Python 3.10 with: python-version: 3.10 -- 2.52.0 From 1122c3f8d24e85a9ee47a985b562c44dcb598646 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:55:20 +0100 Subject: [PATCH 082/142] chore: use actions/setup-python@v4 for docs-preview.yml --- .github/workflows/docs-preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index ecb40ed94..c2796165b 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -23,9 +23,9 @@ jobs: steps: - name: Checkout source - uses: actions/setup-python@v2 uses: actions/checkout@v3 - name: Set up Python 3.10 + uses: actions/setup-python@v4 with: python-version: 3.10 - name: Check for sudo -- 2.52.0 From e04fc7a6f32487f5488a5a7aee11e33260cb701d Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:56:07 +0100 Subject: [PATCH 083/142] update: use Python 3.10 for docs.yml --- .github/workflows/docs.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 344982d0e..0f11b17e2 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,10 +3,10 @@ name: Build and publish docs on: push: # Sequence of patterns matched against refs/heads - branches: + branches: - main # Sequence of patterns matched against refs/tags - tags: + tags: - v* jobs: @@ -21,10 +21,10 @@ jobs: with: # require all of history to see all tagged versions' docs fetch-depth: 0 - - name: Set up Python 3.9 uses: actions/setup-python@v2 + - name: Set up Python 3.10 with: - python-version: 3.9 + python-version: 3.10 - name: Check for sudo shell: bash run: | -- 2.52.0 From de9357264205664f375a39dc0628f3f5998e8424 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:56:47 +0100 Subject: [PATCH 084/142] chore: use actions/checkout@v3 for docs.yml --- .github/workflows/docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0f11b17e2..ab270bbd1 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout source - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: # require all of history to see all tagged versions' docs fetch-depth: 0 @@ -44,7 +44,7 @@ jobs: - name: Checkout gh-pages # As we already did a deploy of gh-pages above, it is guaranteed to be there # so check it out so we can selectively build docs below - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: gh-pages path: docs/_build -- 2.52.0 From 01ae2364b7b71f885ca4d2fc19cda642db7426f6 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:56:59 +0100 Subject: [PATCH 085/142] chore: use actions/setup-python@v4 for docs.yml --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ab270bbd1..eb42d4c1f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -21,8 +21,8 @@ jobs: with: # require all of history to see all tagged versions' docs fetch-depth: 0 - uses: actions/setup-python@v2 - name: Set up Python 3.10 + uses: actions/setup-python@v4 with: python-version: 3.10 - name: Check for sudo -- 2.52.0 From 613a00f6362cf0ec2f10ed903b7a3d592d99568c Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:57:09 +0100 Subject: [PATCH 086/142] update: use Python 3.11 for lint.yml --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index edf01ba2e..e129f0af8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - python-version: ['3.10'] + python-version: ['3.11'] steps: - uses: actions/checkout@v3 -- 2.52.0 From 35d846c189d30482f742e1f1a4d275362006b684 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:57:34 +0100 Subject: [PATCH 087/142] update: use Python 3.10 for pypi.yml --- .github/workflows/pypi.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 0ffc75efa..9765bf70b 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -13,12 +13,12 @@ jobs: - uses: actions/checkout@master with: fetch-depth: 0 - - name: Set up Python 3.8 uses: actions/setup-python@v1 + - name: Set up Python 3.10 with: - python-version: 3.8 + python-version: 3.10 - name: Install build - run: + run: pip install build - name: Build a binary wheel and a source tarball run: -- 2.52.0 From ed53828e20dc2b6125e4e7a08a6004e5cd981e8d Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 10:57:57 +0100 Subject: [PATCH 088/142] chore: use actions/setup-python@v4 for pypi.yml --- .github/workflows/pypi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 9765bf70b..8b0b97555 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -13,8 +13,8 @@ jobs: - uses: actions/checkout@master with: fetch-depth: 0 - uses: actions/setup-python@v1 - name: Set up Python 3.10 + uses: actions/setup-python@v4 with: python-version: 3.10 - name: Install build -- 2.52.0 From 7a2e3604422af557b5514500dc24369c2fa1d7b6 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 11:02:03 +0100 Subject: [PATCH 089/142] fix: add missing quotes in docs.yml and docs-preview.yml --- .github/workflows/docs-preview.yml | 2 +- .github/workflows/docs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index c2796165b..9025eb8af 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -27,7 +27,7 @@ jobs: - name: Set up Python 3.10 uses: actions/setup-python@v4 with: - python-version: 3.10 + python-version: '3.10' - name: Check for sudo shell: bash run: | diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index eb42d4c1f..e7ed4c66a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -24,7 +24,7 @@ jobs: - name: Set up Python 3.10 uses: actions/setup-python@v4 with: - python-version: 3.10 + python-version: '3.10' - name: Check for sudo shell: bash run: | -- 2.52.0 From 4b6560e451c09fdbe19bb15bd0d72e8fa651cd51 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 2 Nov 2022 12:59:15 +0200 Subject: [PATCH 090/142] BUMP pandas and numpy versions --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e425e4e5a..7d1905270 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,9 +39,9 @@ classifiers = [ ] dependencies = [ "click>=8.1.3,<8.2", - "numpy>=1.22,<1.23", + "numpy>=1.22,<1.24", "datalad>=0.15.4,<0.18", - "pandas>=1.4.0,<1.5", + "pandas>=1.4.0,<1.6", "nibabel>=3.2.0,<4.1", "nilearn>=0.9.0,<1.0", "sqlalchemy>=1.4.27,<= 1.5.0", -- 2.52.0 From 858bcf8343fbd466a054bdbbb6d4af36576ebd2d Mon Sep 17 00:00:00 2001 From: LeSasse Date: Wed, 2 Nov 2022 09:59:16 +0100 Subject: [PATCH 091/142] fixing get_elements for aomic piop2 by imposing user-specified constraints; adding some tests --- junifer/datagrabber/aomic/piop2.py | 17 +++++++++++++++++ junifer/datagrabber/aomic/tests/test_piop2.py | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/junifer/datagrabber/aomic/piop2.py b/junifer/datagrabber/aomic/piop2.py index a11ea2e61..0802e7429 100644 --- a/junifer/datagrabber/aomic/piop2.py +++ b/junifer/datagrabber/aomic/piop2.py @@ -119,3 +119,20 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): patterns=patterns, replacements=replacements, ) + + def get_elements(self): + """Implement fetching list of elements in the dataset. + + Returns + ------- + elements : list + The list of elements that can be grabbed in the dataset after + imposing constraints based on specified tasks. + """ + all_elements = super().get_elements() + constrained_elements = [] + for el in all_elements: + if el[1] in self.tasks: + constrained_elements.append(el) + + return constrained_elements diff --git a/junifer/datagrabber/aomic/tests/test_piop2.py b/junifer/datagrabber/aomic/tests/test_piop2.py index ed448709f..a1b8850d0 100644 --- a/junifer/datagrabber/aomic/tests/test_piop2.py +++ b/junifer/datagrabber/aomic/tests/test_piop2.py @@ -28,6 +28,11 @@ def test_aomic_piop2_datagrabber() -> None: with dg: all_elements = dg.get_elements() + + if task_param == "restingstate": + for el in all_elements: + assert el[1] == "restingstate" + test_element = all_elements[0] sub, task = test_element -- 2.52.0 From 4eb98e10fddac7730c243cc2b363cce3016c8b52 Mon Sep 17 00:00:00 2001 From: LeSasse Date: Wed, 2 Nov 2022 10:03:05 +0100 Subject: [PATCH 092/142] adding entry to latest --- docs/changes/latest.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 21aba6c49..b51cb5645 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -79,6 +79,8 @@ Bugs - Fix a bug in which a PatternDatagrabber would now work with relative `datadir` paths. (:gh:`96` by `Leonard Sasse`_, fixed in :gh:`98` by `Fede Raimondo`_). +- Fix a bug in which AOMIC PIOP2 datagrabber did not use user input to constrain elements based on tasks (:gh: `105` by `Leonard Sasse`_) + API changes ~~~~~~~~~~~ -- 2.52.0 From eb87039e5a1edc220fb57c55e92f62d05ab89dc3 Mon Sep 17 00:00:00 2001 From: LeSasse Date: Wed, 2 Nov 2022 10:15:58 +0100 Subject: [PATCH 093/142] change to list comprehension --- junifer/datagrabber/aomic/piop2.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/junifer/datagrabber/aomic/piop2.py b/junifer/datagrabber/aomic/piop2.py index 0802e7429..6aeb056c5 100644 --- a/junifer/datagrabber/aomic/piop2.py +++ b/junifer/datagrabber/aomic/piop2.py @@ -130,9 +130,4 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): imposing constraints based on specified tasks. """ all_elements = super().get_elements() - constrained_elements = [] - for el in all_elements: - if el[1] in self.tasks: - constrained_elements.append(el) - - return constrained_elements + return [x for x in all_elements if x[1] in self.tasks] -- 2.52.0 From 970db8308e4caf66e54ccbd65dee714a057f5193 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 2 Nov 2022 13:53:53 +0100 Subject: [PATCH 094/142] docs: update numpy and pandas version constraints in installation.rst --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index f52e13d1c..c2f9f0e38 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -10,9 +10,9 @@ Requirements junifer is compatible with `Python`_ >= 3.8 and requires the following packages: * ``click>=8.1.3,<8.2`` -* ``numpy>=1.22,<1.23`` +* ``numpy>=1.22,<1.24`` * ``datalad>=0.15.4,<0.18`` -* ``pandas>=1.4.0,<1.5`` +* ``pandas>=1.4.0,<1.6`` * ``nibabel>=3.2.0,<4.1`` * ``nilearn>=0.9.0,<1.0`` * ``sqlalchemy>=1.4.27,<= 1.5.0`` -- 2.52.0 From a8918abcdfdc2598255d2fe2240fb8e0cf1c8930 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 11:08:45 +0100 Subject: [PATCH 095/142] chore: rename test_parcel.py to test_parcel_aggregation.py --- .../markers/tests/{test_parcel.py => test_parcel_aggregation.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename junifer/markers/tests/{test_parcel.py => test_parcel_aggregation.py} (100%) diff --git a/junifer/markers/tests/test_parcel.py b/junifer/markers/tests/test_parcel_aggregation.py similarity index 100% rename from junifer/markers/tests/test_parcel.py rename to junifer/markers/tests/test_parcel_aggregation.py -- 2.52.0 From 4c63c15b7a3b814e0f2d54655bb0ad19cf949148 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 2 Nov 2022 22:02:50 +0200 Subject: [PATCH 096/142] fix sphinx refs --- docs/api/configs.rst | 9 +++ docs/api/data.rst | 6 ++ docs/api/index.rst | 16 ++++- docs/api/pipeline.rst | 7 +++ docs/api/stats.rst | 7 +++ docs/conf.py | 58 ++++++++++++++++++- docs/understanding/datagrabber.rst | 2 +- junifer/data/atlases.py | 32 +--------- junifer/data/coordinates.py | 3 - junifer/datagrabber/base.py | 2 +- junifer/datagrabber/multiple.py | 2 +- .../markers/functional_connectivity_atlas.py | 6 +- .../functional_connectivity_spheres.py | 7 ++- junifer/markers/sphere_aggregation.py | 2 +- junifer/stats.py | 6 +- junifer/storage/sqlite.py | 6 +- 16 files changed, 120 insertions(+), 51 deletions(-) create mode 100644 docs/api/configs.rst create mode 100644 docs/api/data.rst create mode 100644 docs/api/pipeline.rst create mode 100644 docs/api/stats.rst diff --git a/docs/api/configs.rst b/docs/api/configs.rst new file mode 100644 index 000000000..2a5fe7455 --- /dev/null +++ b/docs/api/configs.rst @@ -0,0 +1,9 @@ +Configs +^^^^^^^ + +Juseless +-------- + +.. automodule:: junifer.configs.juseless + :members: + :imported-members: diff --git a/docs/api/data.rst b/docs/api/data.rst new file mode 100644 index 000000000..eb65e86dc --- /dev/null +++ b/docs/api/data.rst @@ -0,0 +1,6 @@ +Data +^^^^ + +.. automodule:: junifer.data + :members: + :imported-members: diff --git a/docs/api/index.rst b/docs/api/index.rst index 4a16b9f78..9bcdf98ad 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -14,7 +14,6 @@ Pipeline Elements markers storage - Utilities ^^^^^^^^^ @@ -22,6 +21,19 @@ Utilities :maxdepth: 2 :caption: Contents: + data + stats + pipeline api utils - testing \ No newline at end of file + testing + + +Configs +^^^^^^^ + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + configs diff --git a/docs/api/pipeline.rst b/docs/api/pipeline.rst new file mode 100644 index 000000000..95aaa477b --- /dev/null +++ b/docs/api/pipeline.rst @@ -0,0 +1,7 @@ + +Pipeline +^^^^^^^^ + +.. automodule:: junifer.pipeline + :members: + :imported-members: diff --git a/docs/api/stats.rst b/docs/api/stats.rst new file mode 100644 index 000000000..3fed0b1ed --- /dev/null +++ b/docs/api/stats.rst @@ -0,0 +1,7 @@ + +Stats +^^^^^ + +.. automodule:: junifer.stats + :members: + :imported-members: diff --git a/docs/conf.py b/docs/conf.py index fd12b8dcd..ec3a03f12 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,6 +23,20 @@ from pathlib import Path curdir = Path(__file__).parent sys.path.append((curdir / "sphinxext").as_posix()) + +paths_to_add = [ + "junifer/configs/juseless", +] + +for t_path in paths_to_add: + t_path = (curdir.parent / t_path).resolve().as_posix() + sys.path.insert(0, t_path) + + +# sys.path.insert( +# 1, (curdir.parent / "junifer" / "configs" / "juseless").resolve() +# ) + # -- Project information ----------------------------------------------------- project = "junifer" @@ -38,6 +52,7 @@ author = "Fede Raimondo" # ones. extensions = [ "sphinx.ext.autodoc", # include documentation from docstrings + "sphinx_autodoc_typehints", # include type hints from docstrings "sphinx.ext.autosummary", # generate autodoc summaries "sphinx.ext.doctest", # test snippets in the documentation "sphinx.ext.intersphinx", # link to other projects’ documentation @@ -57,6 +72,42 @@ templates_path = ["_templates"] # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] +nitpicky = True + +nitpick_ignore_regex = [ + ("py:class", "numpy._typing.*"), + ("py:obj", "trimboth"), # python 3.11 error + ("py:obj", "tmean"), # python 3.11 error + ("py:obj", "subclass"), # python 3.11 error + ("py:class", "typing.Any"), # python 3.11 error + # ('py:class', 'numpy.typing.ArrayLike') +] + +# numpydoc_validation_checks = { +# "all", +# "GL01", +# "GL02", +# "GL03", +# "ES01", +# "SA01", +# "EX01", +# } +numpydoc_xref_param_type = True +numpydoc_xref_aliases = { + "Path": "pathlib.Path", + "Nifti1Image": "nibabel.nifti1.Nifti1Image", + "Nifti2Image": "nibabel.nifti2.Nifti2Image", + "Engine": "sqlalchemy.engine.Engine", +} +numpydoc_xref_ignore = { + "of", + "shape", + "optional", + "or", + "the", + "options", + "function" +} # -- Options for HTML output ------------------------------------------------- @@ -85,10 +136,15 @@ html_static_path = [] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - "python": ("https://docs.python.org/", None), + "python": ("https://docs.python.org/3/", None), "sklearn": ("https://scikit-learn.org/stable", None), "nilearn": ("https://nilearn.github.io/stable/", None), "julearn": ("https://juaml.github.io/julearn/main", None), + "nibabel": ("https://nipy.org/nibabel/", None), + "numpy": ("https://numpy.org/doc/stable/", None), + "numpy": ("https://numpy.org/doc/stable/", None), + "pandas": ("https://pandas.pydata.org/pandas-docs/dev", None), + "sqlalchemy": ("https://docs.sqlalchemy.org/en/20/", None), } sphinx_gallery_conf = { diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index 800c3f896..3411e40f1 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -49,5 +49,5 @@ In this section, we showcase different abstract base classes you might want to u - | It implements functionality to deal with Datalad datasets. Specifically, the ``__enter__`` and ``__exit__`` methods | take care of cloning and removing the Datalad dataset. * - :class:`junifer.datagrabber.PatternDataladDataGrabber` - - | It is a combination of :class:`junifer.datagrabber.PatternPatternDataGrabber` and + - | It is a combination of :class:`junifer.datagrabber.PatternDataladDataGrabber` and | :class:`junifer.datagrabber.DataladDataGrabber`. This is probably the class you are looking for when using Datalad. diff --git a/junifer/data/atlases.py b/junifer/data/atlases.py index 9b9bfc3b3..1968ced5a 100644 --- a/junifer/data/atlases.py +++ b/junifer/data/atlases.py @@ -101,7 +101,6 @@ def register_atlas( ValueError If the atlas name is already registered and overwrite is set to False or if the atlas name is a built-in atlas. - """ # Check for attempt of overwriting built-in atlases if name in _available_atlases: @@ -134,7 +133,6 @@ def list_atlases() -> List[str]: ------- list of str A list with all available atlases. - """ return sorted(_available_atlases.keys()) @@ -174,28 +172,6 @@ def load_atlas( path_only : bool, optional If True, the atlas image will not be loaded (default False). - Extra Parameters - ---------------- - Use to specify atlas specific keyword arguments. - - - Schaefer : - n_rois : {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000} - Granularity of atlas to be used. - yeo_network : {7, 17}, optional - Number of yeo networks to use (default 7). - - Tian : - scale : {1, 2, 3, 4} - Scale of atlas (defines granularity). - space : {"MNI6thgeneration", "MNInonlinear2009cAsym"}, optional - Space of atlas (default "MNI6thgeneration"). (For more information - see https://github.com/yetianmed/subcortex) - magneticfield : {"3T", "7T"}, optional - Magnetic field (default "3T"). - - SUIT : - space : {"MNI", "SUIT"}, optional - Space of atlas (default "MNI"). (For more information - see http://www.diedrichsenlab.org/imaging/suit.htm). - Returns ------- niimg-like object or None @@ -204,7 +180,6 @@ def load_atlas( Atlas labels. pathlib.Path File path to the atlas image. - """ # Invalid atlas name if name not in _available_atlases: @@ -261,7 +236,7 @@ def _retrieve_atlas( higher than the desired one. By default, will load the highest one (default None). - Extra Parameters + Other Parameters ---------------- **kwargs Use to specify atlas specific keyword arguments. @@ -295,7 +270,6 @@ def _retrieve_atlas( ------ ValueError If the atlas name is invalid. - """ if atlas_dir is None: atlas_dir = Path().home() / "junifer" / "data" / "atlas" @@ -343,7 +317,6 @@ def _closest_resolution( ------- float The closest valid resolution. - """ # Convert list of int to numpy.ndarray if not isinstance(valid_resolution, np.ndarray): @@ -396,7 +369,6 @@ def _retrieve_schaefer( ValueError If invalid value is provided for `n_rois` or `yeo_networks` or if there is a problem fetching the atlas. - """ logger.info("Atlas parameters:") logger.info(f"\tn_rois: {n_rois}") @@ -503,7 +475,6 @@ def _retrieve_tian( ValueError If invalid value is provided for `scale` or `magneticfield` or `space` or if there is a problem fetching the atlas. - """ # show atlas parameters to user logger.info("Atlas parameters:") @@ -655,7 +626,6 @@ def _retrieve_suit( ValueError If invalid value is provided for `space` or if there is a problem fetching the atlas. - """ logger.info("Atlas parameters:") logger.info(f"\tspace: {space}") diff --git a/junifer/data/coordinates.py b/junifer/data/coordinates.py index 29bd969c4..8d6ef224e 100644 --- a/junifer/data/coordinates.py +++ b/junifer/data/coordinates.py @@ -68,7 +68,6 @@ def register_coordinates( overwrite : bool, optional If True, overwrite an existing list of coordinates with the same name. Does not apply to built-in coordinates (default False). - """ if name in _available_coordinates: if isinstance(_available_coordinates[name], Path): @@ -114,7 +113,6 @@ def list_coordinates() -> List[str]: ------- list of str A list with all available coordinates names. - """ return sorted(_available_coordinates.keys()) @@ -133,7 +131,6 @@ def load_coordinates(name: str) -> Tuple[ArrayLike, List[str]]: The coordinates. list of str The names of the VOIs. - """ if name not in _available_coordinates: raise_error(f"Coordinates {name} not found.") diff --git a/junifer/datagrabber/base.py b/junifer/datagrabber/base.py index a9f5a2a1a..5c42b9727 100644 --- a/junifer/datagrabber/base.py +++ b/junifer/datagrabber/base.py @@ -30,7 +30,6 @@ class BaseDataGrabber(ABC): ---------- datadir : pathlib.Path The directory where the data is / will be stored. - """ def __init__(self, types: List[str], datadir: Union[str, Path]) -> None: @@ -124,6 +123,7 @@ class BaseDataGrabber(ABC): Returns ------- str + The element keys. """ return "element" diff --git a/junifer/datagrabber/multiple.py b/junifer/datagrabber/multiple.py index 606fc82bc..885ea5388 100644 --- a/junifer/datagrabber/multiple.py +++ b/junifer/datagrabber/multiple.py @@ -19,7 +19,7 @@ class MultipleDataGrabber(BaseDataGrabber): Parameters ---------- - datagrabbers : list of datagrabbers + datagrabbers : list of BaseDataGrabber The datagrabbers to use to fetch data using. **kwargs Keyword arguments passed to superclass. diff --git a/junifer/markers/functional_connectivity_atlas.py b/junifer/markers/functional_connectivity_atlas.py index ef0e2deb6..c35d571ba 100644 --- a/junifer/markers/functional_connectivity_atlas.py +++ b/junifer/markers/functional_connectivity_atlas.py @@ -36,10 +36,12 @@ class FunctionalConnectivityAtlas(BaseMarker): :func:`junifer.stats.get_aggfunc_by_name` (default None). cor_method : str, optional The method to perform correlation using. Check valid options in - :func:`nilearn.connectome.ConnectivityMeasure` (default "covariance"). + :external:class:`nilearn.connectome.ConnectivityMeasure` + (default "covariance"). cor_method_params : dict, optional Parameters to pass to the correlation function. Check valid options in - :func:`nilearn.connectome.ConnectivityMeasure` (default None). + :external:class:`nilearn.connectome.ConnectivityMeasure` + (default None). name : str, optional The name of the marker. If None, will use the class name (default None). diff --git a/junifer/markers/functional_connectivity_spheres.py b/junifer/markers/functional_connectivity_spheres.py index 44c9f1dae..16ae49037 100644 --- a/junifer/markers/functional_connectivity_spheres.py +++ b/junifer/markers/functional_connectivity_spheres.py @@ -27,7 +27,7 @@ class FunctionalConnectivitySpheres(BaseMarker): ---------- coords : str The name of the coordinates list to use. See - :mod:`junifer.data.coordinates` for options. + :func:`junifer.data.list_coordinates` for options. radius : float, optional The radius of the sphere in mm. If None, the signal will be extracted from a single voxel. See :class:`nilearn.maskers.NiftiSpheresMasker` @@ -40,10 +40,11 @@ class FunctionalConnectivitySpheres(BaseMarker): The parameters to pass to the aggregation method (default None). cor_method : str, optional The method to perform correlation using. Check valid options in - :func:`nilearn.connectome.ConnectivityMeasure` (default "covariance"). + :external+nilearn:class:`nilearn.connectome.ConnectivityMeasure` + (default "covariance"). cor_method_params : dict, optional Parameters to pass to the correlation function. Check valid options in - :func:`nilearn.connectome.ConnectivityMeasure` (default None). + :external+nilearn:class:`nilearn.connectome.ConnectivityMeasure` (default None). name : str, optional The name of the marker. By default, it will use KIND_FunctionalConnectivitySpheres where KIND is the kind of data it diff --git a/junifer/markers/sphere_aggregation.py b/junifer/markers/sphere_aggregation.py index fde777a9b..ee477280f 100644 --- a/junifer/markers/sphere_aggregation.py +++ b/junifer/markers/sphere_aggregation.py @@ -26,7 +26,7 @@ class SphereAggregation(BaseMarker): ---------- coords: str The name of the coordinates list to use. See - :mod:`junifer.data.coordinates` for options. + :func:`junifer.data.list_coordinates` for options. radius: float, optional The radius of the sphere in mm. If None, the signal will be extracted from a single voxel. See :class:`nilearn.maskers.NiftiSpheresMasker` diff --git a/junifer/stats.py b/junifer/stats.py index 30f910ac2..f108d977f 100644 --- a/junifer/stats.py +++ b/junifer/stats.py @@ -4,7 +4,6 @@ # Synchon Mandal # License: AGPL -from functools import partial from typing import Any, Callable, Dict, Optional import numpy as np @@ -37,8 +36,8 @@ def get_aggfunc_by_name( ------- function Respective function with `func_params` parameter set. - """ + from functools import partial # local import to avoid sphinx error # check validity of names _valid_func_names = {"winsorized_mean", "mean", "std", "trim_mean"} if func_params is None: @@ -65,6 +64,8 @@ def get_aggfunc_by_name( ) logger.info(f"Limits for winsorized mean are set to {limits}.") # partially interpret func_params + + func = partial(winsorized_mean, **func_params) elif name == "mean": func = np.mean @@ -100,7 +101,6 @@ def winsorized_mean( numpy.ndarray Winsorized mean of the inputted data with the winsorize settings applied as specified in win_params. - """ win_dat = winsorize(data, axis=axis, **win_params) win_mean = win_dat.mean(axis=axis) diff --git a/junifer/storage/sqlite.py b/junifer/storage/sqlite.py index 80a3fb1cd..daac3e810 100644 --- a/junifer/storage/sqlite.py +++ b/junifer/storage/sqlite.py @@ -88,7 +88,9 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage): # Set upsert self._upsert = upsert - def get_engine(self, meta: Optional[Dict] = None) -> "Engine": + def get_engine( + self, meta: Optional[Dict] = None + ) -> "Engine": """Get engine. Parameters @@ -98,7 +100,7 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage): Returns ------- - sqlalchemy.Engine + sqlalchemy.engine.Engine The sqlalchemy engine. """ -- 2.52.0 From f407d8ca149b123e71f2f1b8ea984800aa8eb75c Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 00:23:33 +0200 Subject: [PATCH 097/142] fix for many things in the documentation, but mostly references --- docs/_static/css/custom.css | 6 ++++ docs/api/configs.rst | 7 +++-- docs/api/data.rst | 12 ++++++-- docs/api/stats.rst | 1 - docs/builtin.rst | 12 ++++---- docs/conf.py | 28 +++++++++++++------ .../juseless/datagrabbers/aomic_id1000_vbm.py | 3 +- .../juseless/datagrabbers/camcan_vbm.py | 3 +- .../configs/juseless/datagrabbers/ixi_vbm.py | 3 +- .../configs/juseless/datagrabbers/ukb_vbm.py | 3 +- junifer/data/atlases.py | 2 +- junifer/datagrabber/aomic/id1000.py | 1 - junifer/datagrabber/aomic/piop1.py | 3 +- junifer/datagrabber/aomic/piop2.py | 3 +- junifer/datagrabber/base.py | 1 - junifer/datagrabber/datalad_base.py | 11 ++++---- junifer/datagrabber/hcp.py | 8 ++---- junifer/datagrabber/multiple.py | 4 +-- junifer/datagrabber/pattern.py | 19 ++++--------- junifer/datagrabber/pattern_datalad.py | 8 +++--- junifer/markers/base.py | 4 +-- junifer/markers/collection.py | 3 +- junifer/markers/ets_rss.py | 5 ++-- .../markers/functional_connectivity_atlas.py | 8 ++---- .../functional_connectivity_spheres.py | 9 +++--- junifer/markers/parcel_aggregation.py | 6 ++-- junifer/markers/sphere_aggregation.py | 18 ++++++------ junifer/stats.py | 4 +-- junifer/storage/base.py | 3 +- junifer/storage/pandas_base.py | 3 +- junifer/storage/sqlite.py | 5 ++-- junifer/testing/datagrabbers.py | 2 -- tox.ini | 1 + 33 files changed, 96 insertions(+), 113 deletions(-) create mode 100644 docs/_static/css/custom.css diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css new file mode 100644 index 000000000..f3f55faed --- /dev/null +++ b/docs/_static/css/custom.css @@ -0,0 +1,6 @@ +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: nowrap; +} +.wy-table-responsive table td a.reference.internal { + overflow-wrap: normal; +} diff --git a/docs/api/configs.rst b/docs/api/configs.rst index 2a5fe7455..372ab36c8 100644 --- a/docs/api/configs.rst +++ b/docs/api/configs.rst @@ -4,6 +4,7 @@ Configs Juseless -------- -.. automodule:: junifer.configs.juseless - :members: - :imported-members: +.. automodule:: junifer.configs.juseless.datagrabbers + :members: + :imported-members: + :special-members: None diff --git a/docs/api/data.rst b/docs/api/data.rst index eb65e86dc..e9b417e73 100644 --- a/docs/api/data.rst +++ b/docs/api/data.rst @@ -1,6 +1,14 @@ Data ^^^^ -.. automodule:: junifer.data +Atlases +------- + +.. automodule:: junifer.data.atlases + :members: + +Coordinates +----------- + +.. automodule:: junifer.data.coordinates :members: - :imported-members: diff --git a/docs/api/stats.rst b/docs/api/stats.rst index 3fed0b1ed..c55efb8a6 100644 --- a/docs/api/stats.rst +++ b/docs/api/stats.rst @@ -4,4 +4,3 @@ Stats .. automodule:: junifer.stats :members: - :imported-members: diff --git a/docs/builtin.rst b/docs/builtin.rst index 19ef11d07..e6ff0b880 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -45,8 +45,8 @@ Available - `HCP OpenAccess dataset `_ - Open with registration - Built-in - - In Progress - - :gh:`4` + - Done + - 0.0.1 * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladUKBVBM` - UKB VBM dataset preprocessed with CAT. Available for Juseless only. - Restricted @@ -77,12 +77,12 @@ Available - Built-in - Done - 0.0.1 - * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladAOMICVBM` - - AOMIC VBM dataset. Available for Juseless only. + * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladAOMICID1000VBM` + - AOMIC ID1000 VBM dataset. Available for Juseless only. - Restricted - ``junifer.configs.juseless`` - - In Progress - - :gh:`57` + - Done + - 0.0.1 * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladIXIVBM` - `IXI VBM dataset `_. Available for Juseless only. - Restricted diff --git a/docs/conf.py b/docs/conf.py index ec3a03f12..2f23a215c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,13 +24,13 @@ curdir = Path(__file__).parent sys.path.append((curdir / "sphinxext").as_posix()) -paths_to_add = [ - "junifer/configs/juseless", -] +# paths_to_add = [ +# "junifer/configs/juseless", +# ] -for t_path in paths_to_add: - t_path = (curdir.parent / t_path).resolve().as_posix() - sys.path.insert(0, t_path) +# for t_path in paths_to_add: +# t_path = (curdir.parent / t_path).resolve().as_posix() +# sys.path.insert(0, t_path) # sys.path.insert( @@ -52,7 +52,6 @@ author = "Fede Raimondo" # ones. extensions = [ "sphinx.ext.autodoc", # include documentation from docstrings - "sphinx_autodoc_typehints", # include type hints from docstrings "sphinx.ext.autosummary", # generate autodoc summaries "sphinx.ext.doctest", # test snippets in the documentation "sphinx.ext.intersphinx", # link to other projects’ documentation @@ -106,9 +105,14 @@ numpydoc_xref_ignore = { "or", "the", "options", - "function" + "function", + "object" } +autoclass_content = "class" +autodoc_typehints = "description" +autodoc_typehints_description_target = "documented" + # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for @@ -132,7 +136,13 @@ html_logo = "./images/junifer_logo.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] +html_static_path = ['_static'] + +# These paths are either relative to html_static_path +# or fully qualified paths (eg. https://...) +html_css_files = [ + 'css/custom.css', +] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { diff --git a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py index 3fba4e07e..0de6fe1f3 100644 --- a/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +++ b/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py @@ -18,7 +18,7 @@ class JuselessDataladAOMICID1000VBM(PatternDataladDataGrabber): Implements a DataGrabber to access the AOMICID1000 VBM data in Juseless. Parameters - ----------- + ---------- datadir : str or pathlib.Path, optional The directory where the datalad dataset will be cloned. If None, the datalad dataset will be cloned into a temporary directory @@ -27,7 +27,6 @@ class JuselessDataladAOMICID1000VBM(PatternDataladDataGrabber): """ def __init__(self, datadir: Union[str, Path, None] = None) -> None: - """Initialize the class.""" uri = "https://gin.g-node.org/felixh/ds003097_ReproVBM" types = ["VBM_GM"] replacements = ["subject"] diff --git a/junifer/configs/juseless/datagrabbers/camcan_vbm.py b/junifer/configs/juseless/datagrabbers/camcan_vbm.py index 15be14d32..602f90b64 100644 --- a/junifer/configs/juseless/datagrabbers/camcan_vbm.py +++ b/junifer/configs/juseless/datagrabbers/camcan_vbm.py @@ -19,7 +19,7 @@ class JuselessDataladCamCANVBM(PatternDataladDataGrabber): Implements a DataGrabber to access the CamCAN VBM data in Juseless. Parameters - ----------- + ---------- datadir : str or pathlib.Path, optional The directory where the datalad dataset will be cloned. If None, the datalad dataset will be cloned into a temporary directory @@ -28,7 +28,6 @@ class JuselessDataladCamCANVBM(PatternDataladDataGrabber): """ def __init__(self, datadir: Union[str, Path, None] = None) -> None: - """Initialize the class.""" uri = ( "ria+http://cat_12.5.ds.inm7.de" "#a139b26a-8406-11ea-8f94-a0369f287950" diff --git a/junifer/configs/juseless/datagrabbers/ixi_vbm.py b/junifer/configs/juseless/datagrabbers/ixi_vbm.py index 8941795ae..88774898f 100644 --- a/junifer/configs/juseless/datagrabbers/ixi_vbm.py +++ b/junifer/configs/juseless/datagrabbers/ixi_vbm.py @@ -20,7 +20,7 @@ class JuselessDataladIXIVBM(PatternDataladDataGrabber): Implements a DataGrabber to access the IXI VBM data in Juseless. Parameters - ----------- + ---------- datadir : str or pathlib.Path, optional The directory where the datalad dataset will be cloned. If None, the datalad dataset will be cloned into a temporary directory @@ -36,7 +36,6 @@ class JuselessDataladIXIVBM(PatternDataladDataGrabber): datadir: Union[str, Path, None] = None, sites: Union[str, List[str], None] = None, ) -> None: - """Initialize the class.""" uri = ( "ria+http://cat_12.5.ds.inm7.de" "#b7107c52-8408-11ea-89c6-a0369f287950" diff --git a/junifer/configs/juseless/datagrabbers/ukb_vbm.py b/junifer/configs/juseless/datagrabbers/ukb_vbm.py index f54f9fea2..24a1fbd61 100644 --- a/junifer/configs/juseless/datagrabbers/ukb_vbm.py +++ b/junifer/configs/juseless/datagrabbers/ukb_vbm.py @@ -19,7 +19,7 @@ class JuselessDataladUKBVBM(PatternDataladDataGrabber): Implements a DataGrabber to access the UKB VBM data in Juseless. Parameters - ----------- + ---------- datadir : str or pathlib.Path, optional The directory where the datalad dataset will be cloned. If None, the datalad dataset will be cloned into a temporary directory @@ -28,7 +28,6 @@ class JuselessDataladUKBVBM(PatternDataladDataGrabber): """ def __init__(self, datadir: Union[str, Path, None] = None) -> None: - """Initialize the class.""" uri = "ria+http://ukb.ds.inm7.de#~cat_m0wp1" rootdir = "m0wp1" types = ["VBM_GM"] diff --git a/junifer/data/atlases.py b/junifer/data/atlases.py index 1968ced5a..e84920287 100644 --- a/junifer/data/atlases.py +++ b/junifer/data/atlases.py @@ -174,7 +174,7 @@ def load_atlas( Returns ------- - niimg-like object or None + Nifti1Image or None Loaded atlas image. list of str Atlas labels. diff --git a/junifer/datagrabber/aomic/id1000.py b/junifer/datagrabber/aomic/id1000.py index 64da05fe5..250a78594 100644 --- a/junifer/datagrabber/aomic/id1000.py +++ b/junifer/datagrabber/aomic/id1000.py @@ -34,7 +34,6 @@ class DataladAOMICID1000(PatternDataladDataGrabber): datadir: Union[str, Path, None] = None, **kwargs, ) -> None: - """Initialize the class.""" # The types of data types = [ "BOLD", diff --git a/junifer/datagrabber/aomic/piop1.py b/junifer/datagrabber/aomic/piop1.py index 7bd9683c1..1453f8878 100644 --- a/junifer/datagrabber/aomic/piop1.py +++ b/junifer/datagrabber/aomic/piop1.py @@ -41,7 +41,6 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber): tasks: Union[str, List[str], None] = None, **kwargs, ) -> None: - """Initialize the class.""" # The types of data types = [ "BOLD", @@ -162,7 +161,7 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber): Returns ------- - elements : list of str + list of str The list of subjects in the dataset. """ diff --git a/junifer/datagrabber/aomic/piop2.py b/junifer/datagrabber/aomic/piop2.py index 6aeb056c5..c773932fd 100644 --- a/junifer/datagrabber/aomic/piop2.py +++ b/junifer/datagrabber/aomic/piop2.py @@ -40,7 +40,6 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): tasks: Union[str, List[str], None] = None, **kwargs, ) -> None: - """Initialize the class.""" # The types of data types = [ "BOLD", @@ -125,7 +124,7 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): Returns ------- - elements : list + list The list of elements that can be grabbed in the dataset after imposing constraints based on specified tasks. """ diff --git a/junifer/datagrabber/base.py b/junifer/datagrabber/base.py index 5c42b9727..ef5cc3ec7 100644 --- a/junifer/datagrabber/base.py +++ b/junifer/datagrabber/base.py @@ -33,7 +33,6 @@ class BaseDataGrabber(ABC): """ def __init__(self, types: List[str], datadir: Union[str, Path]) -> None: - """Initialize the class.""" # Validate types validate_types(types) # Convert str to Path diff --git a/junifer/datagrabber/datalad_base.py b/junifer/datagrabber/datalad_base.py index 918d5dc17..2377736ba 100644 --- a/junifer/datagrabber/datalad_base.py +++ b/junifer/datagrabber/datalad_base.py @@ -46,17 +46,17 @@ class DataladDataGrabber(BaseDataGrabber): Removes the datalad dataset from the `datadir`. This method is called automatically when the datagrabber is used within a context. + See Also + -------- + BaseDataGrabber + For the abstract base class of any datagrabber. + Notes ----- By itself, this class is still abstract as the `__getitem__` method relies on the parent class `BaseDataGrabber.__getitem__` which is not yet implemented. This class is intended to be used as a superclass of a class with multiple inheritance. - - See Also - -------- - BaseDataGrabber - """ def __init__( @@ -66,7 +66,6 @@ class DataladDataGrabber(BaseDataGrabber): uri: Optional[str] = None, **kwargs, ): - """Initialize the class.""" if datadir is None: logger.warning("`datadir` is None, creating a temporary directory") # Create temporary directory diff --git a/junifer/datagrabber/hcp.py b/junifer/datagrabber/hcp.py index 90e975a2a..a65307055 100644 --- a/junifer/datagrabber/hcp.py +++ b/junifer/datagrabber/hcp.py @@ -40,7 +40,6 @@ class HCP1200(PatternDataGrabber): phase_encodings: Union[str, List[str], None] = None, **kwargs, ) -> None: - """Initialize the class.""" # All tasks all_tasks = [ "REST1", @@ -139,12 +138,12 @@ class HCP1200(PatternDataGrabber): return out def get_elements(self) -> List: - """Implement fetching list of subjects in the dataset. + """Implement fetching list of elements in the dataset. Returns ------- - elements : list of str - The list of subjects in the dataset. + list + The list of elements in the dataset. """ subjects = [x.name for x in self.datadir.iterdir() if x.is_dir()] @@ -186,7 +185,6 @@ class DataladHCP1200(DataladDataGrabber, HCP1200): phase_encodings: Union[str, List[str], None] = None, **kwargs, ) -> None: - """Initialize the class.""" uri = ( "https://github.com/datalad-datasets/" "human-connectome-project-openaccess.git" diff --git a/junifer/datagrabber/multiple.py b/junifer/datagrabber/multiple.py index 885ea5388..bb1799364 100644 --- a/junifer/datagrabber/multiple.py +++ b/junifer/datagrabber/multiple.py @@ -23,11 +23,9 @@ class MultipleDataGrabber(BaseDataGrabber): The datagrabbers to use to fetch data using. **kwargs Keyword arguments passed to superclass. - """ def __init__(self, datagrabbers: List[BaseDataGrabber], **kwargs) -> None: - """Initialize the class.""" # TODO: Check datagrabbers consistency # - same element keys # - no overlapping types @@ -73,7 +71,7 @@ class MultipleDataGrabber(BaseDataGrabber): Returns ------- - elements : list + list The list of elements that can be grabbed in the dataset. It corresponds to the elements that are present in all the related datagrabbers. diff --git a/junifer/datagrabber/pattern.py b/junifer/datagrabber/pattern.py index 11e727cd6..e67bcb573 100644 --- a/junifer/datagrabber/pattern.py +++ b/junifer/datagrabber/pattern.py @@ -7,6 +7,7 @@ import re from typing import Dict, List, Tuple, Union +from pathlib import Path import numpy as np @@ -34,13 +35,6 @@ class PatternDataGrabber(BaseDataGrabber): Replacements in the patterns for each item in the "element" tuple. datadir : str or pathlib.Path The directory where the data is / will be stored. - **kwargs - Keyword arguments passed to superclass. - - See Also - -------- - BaseDataGrabber - """ def __init__( @@ -48,9 +42,8 @@ class PatternDataGrabber(BaseDataGrabber): types: List[str], patterns: Dict[str, str], replacements: List[str], - **kwargs, + datadir: Union[str, Path], ) -> None: - """Initialize the class.""" # Validate patterns validate_patterns(types=types, patterns=patterns) @@ -59,7 +52,7 @@ class PatternDataGrabber(BaseDataGrabber): # Validate replacements validate_replacements(replacements=replacements, patterns=patterns) - super().__init__(types=types, **kwargs) + super().__init__(types=types, datadir=datadir) logger.debug("Initializing PatternDataGrabber") logger.debug(f"\tpatterns = {patterns}") logger.debug(f"\treplacements = {replacements}") @@ -195,10 +188,8 @@ class PatternDataGrabber(BaseDataGrabber): Returns ------- - elements : list - The list of elements that can be grabbed in the dataset. Each - element is a subject in the BIDS database. - + list + The list of elements that can be grabbed in the dataset. """ elements = None diff --git a/junifer/datagrabber/pattern_datalad.py b/junifer/datagrabber/pattern_datalad.py index 07e5e296d..dc4d4b570 100644 --- a/junifer/datagrabber/pattern_datalad.py +++ b/junifer/datagrabber/pattern_datalad.py @@ -34,9 +34,10 @@ class PatternDataladDataGrabber(DataladDataGrabber, PatternDataGrabber): See Also -------- - DataladDataGrabber - PatternDataGrabber - + DataladDataGrabber: + Base class for data fetching via Datalad. + PatternDataGrabber: + Base class for pattern-based data fetching. """ def __init__( @@ -45,7 +46,6 @@ class PatternDataladDataGrabber(DataladDataGrabber, PatternDataGrabber): patterns: Dict[str, str], **kwargs, ) -> None: - """Initialize the class.""" # Validate patterns validate_patterns(types=types, patterns=patterns) diff --git a/junifer/markers/base.py b/junifer/markers/base.py index d8f71d2b6..accdc0861 100644 --- a/junifer/markers/base.py +++ b/junifer/markers/base.py @@ -34,7 +34,6 @@ class BaseMarker(ABC, PipelineStepMixin): on: Optional[Union[List[str], str]] = None, name: Optional[str] = None, ) -> None: - """Initialize the class.""" if on is None: on = self.get_valid_inputs() if not isinstance(on, list): @@ -52,8 +51,7 @@ class BaseMarker(ABC, PipelineStepMixin): Returns ------- list of str - The list of data types that can be used as input for this marker - + The list of data types that can be used as input for this marker. """ raise_error( msg="Concrete classes need to implement get_valid_inputs().", diff --git a/junifer/markers/collection.py b/junifer/markers/collection.py index 4fe2a0f33..6688a02cb 100644 --- a/junifer/markers/collection.py +++ b/junifer/markers/collection.py @@ -41,7 +41,6 @@ class MarkerCollection: preprocessing: Optional[PipelineStepMixin] = None, storage: Optional[BaseFeatureStorage] = None, ): - """Initialize the class.""" # Check that the markers have different names marker_names = [m.name for m in markers] if len(set(marker_names)) != len(marker_names): @@ -62,7 +61,7 @@ class MarkerCollection: Parameters ---------- - input + input : dict The input data to fit the pipeline on. Should be the output of indexing the DataGrabber with one element. diff --git a/junifer/markers/ets_rss.py b/junifer/markers/ets_rss.py index d0fd50c15..8b1bdac38 100644 --- a/junifer/markers/ets_rss.py +++ b/junifer/markers/ets_rss.py @@ -29,7 +29,7 @@ class RSSETSMarker(BaseMarker): ---------- atlas : str The name of the atlas. Check valid options by calling - :func:`junifer.data.list_atlases`. + :func:`junifer.data.atlases.list_atlases`. aggregation_method : str, optional The method to perform aggregation using. Check valid options in :func:`junifer.stats.get_aggfunc_by_name` (default "mean"). @@ -45,7 +45,6 @@ class RSSETSMarker(BaseMarker): aggregation_method: str = "mean", name: Optional[str] = None, ) -> None: - """Initialize the class.""" self.atlas = atlas self.aggregation_method = aggregation_method super().__init__(name=name) @@ -56,7 +55,7 @@ class RSSETSMarker(BaseMarker): Returns ------- list of str - The list of data types that can be used as input for this marker + The list of data types that can be used as input for this marker. """ return ["BOLD"] diff --git a/junifer/markers/functional_connectivity_atlas.py b/junifer/markers/functional_connectivity_atlas.py index c35d571ba..ed4f908a3 100644 --- a/junifer/markers/functional_connectivity_atlas.py +++ b/junifer/markers/functional_connectivity_atlas.py @@ -27,7 +27,7 @@ class FunctionalConnectivityAtlas(BaseMarker): ---------- atlas : str The name of the atlas. Check valid options by calling - :func:`junifer.data.list_atlases`. + :func:`junifer.data.atlases.list_atlases`. agg_method : str, optional The method to perform aggregation using. Check valid options in :func:`junifer.stats.get_aggfunc_by_name` (default "mean"). @@ -45,7 +45,6 @@ class FunctionalConnectivityAtlas(BaseMarker): name : str, optional The name of the marker. If None, will use the class name (default None). - """ def __init__( @@ -57,7 +56,6 @@ class FunctionalConnectivityAtlas(BaseMarker): cor_method_params: Optional[Dict] = None, name: Optional[str] = None, ) -> None: - """Initialize the class.""" self.atlas = atlas self.agg_method = agg_method self.agg_method_params = ( @@ -80,8 +78,7 @@ class FunctionalConnectivityAtlas(BaseMarker): Returns ------- list of str - The list of data types that can be used as input for this marker - + The list of data types that can be used as input for this marker. """ return ["BOLD"] @@ -98,7 +95,6 @@ class FunctionalConnectivityAtlas(BaseMarker): ------- list of str The updated list of output kinds, as storage possibilities. - """ outputs = ["matrix"] return outputs diff --git a/junifer/markers/functional_connectivity_spheres.py b/junifer/markers/functional_connectivity_spheres.py index 16ae49037..fd08e2ecb 100644 --- a/junifer/markers/functional_connectivity_spheres.py +++ b/junifer/markers/functional_connectivity_spheres.py @@ -27,7 +27,7 @@ class FunctionalConnectivitySpheres(BaseMarker): ---------- coords : str The name of the coordinates list to use. See - :func:`junifer.data.list_coordinates` for options. + :func:`junifer.data.coordinates.list_coordinates` for options. radius : float, optional The radius of the sphere in mm. If None, the signal will be extracted from a single voxel. See :class:`nilearn.maskers.NiftiSpheresMasker` @@ -44,7 +44,8 @@ class FunctionalConnectivitySpheres(BaseMarker): (default "covariance"). cor_method_params : dict, optional Parameters to pass to the correlation function. Check valid options in - :external+nilearn:class:`nilearn.connectome.ConnectivityMeasure` (default None). + :external+nilearn:class:`nilearn.connectome.ConnectivityMeasure` + (default None). name : str, optional The name of the marker. By default, it will use KIND_FunctionalConnectivitySpheres where KIND is the kind of data it @@ -62,7 +63,6 @@ class FunctionalConnectivitySpheres(BaseMarker): cor_method_params: Optional[Dict] = None, name: Optional[str] = None, ) -> None: - """Initialize the class.""" self.coords = coords self.radius = radius if radius is None or radius <= 0: @@ -88,8 +88,7 @@ class FunctionalConnectivitySpheres(BaseMarker): Returns ------- list of str - The list of data types that can be used as input for this marker - + The list of data types that can be used as input for this marker. """ return ["BOLD"] diff --git a/junifer/markers/parcel_aggregation.py b/junifer/markers/parcel_aggregation.py index c75816fe0..465394039 100644 --- a/junifer/markers/parcel_aggregation.py +++ b/junifer/markers/parcel_aggregation.py @@ -29,7 +29,7 @@ class ParcelAggregation(BaseMarker): ---------- atlas : str The name of the atlas. Check valid options by calling - :func:`junifer.data.list_atlases`. + :func:`junifer.data.atlases.list_atlases`. method : str The method to perform aggregation using. Check valid options in :func:`junifer.stats.get_aggfunc_by_name`. @@ -43,7 +43,6 @@ class ParcelAggregation(BaseMarker): name : str, optional The name of the marker. If None, will use the class name (default None). - """ def __init__( @@ -54,7 +53,6 @@ class ParcelAggregation(BaseMarker): on: Union[List[str], str, None] = None, name: Optional[str] = None, ) -> None: - """Initialize the class.""" self.atlas = atlas self.method = method self.method_params = {} if method_params is None else method_params @@ -66,7 +64,7 @@ class ParcelAggregation(BaseMarker): Returns ------- list of str - The list of data types that can be used as input for this marker + The list of data types that can be used as input for this marker. """ return ["T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"] diff --git a/junifer/markers/sphere_aggregation.py b/junifer/markers/sphere_aggregation.py index ee477280f..9909caa84 100644 --- a/junifer/markers/sphere_aggregation.py +++ b/junifer/markers/sphere_aggregation.py @@ -24,28 +24,27 @@ class SphereAggregation(BaseMarker): Parameters ---------- - coords: str + + coords : str The name of the coordinates list to use. See - :func:`junifer.data.list_coordinates` for options. - radius: float, optional + :func:`junifer.data.coordinates.list_coordinates` for options. + radius : float, optional The radius of the sphere in mm. If None, the signal will be extracted from a single voxel. See :class:`nilearn.maskers.NiftiSpheresMasker` for more information (default None). - method: str, optional + method : str, optional The aggregation method to use. See :func:`junifer.stats.get_aggfunc_by_name` for more information (default "mean"). - method_params: dict, optional + method_params : dict, optional The parameters to pass to the aggregation method (default None). - on: list of str, optional + on : list of str, optional The kind of data to apply the marker to. By default, will work on all available data (default None). name : str, optional The name of the marker. By default, it will use KIND_SphereAggregation where KIND is the kind of data it was applied to (default None). - """ - def __init__( self, coords: str, @@ -55,7 +54,6 @@ class SphereAggregation(BaseMarker): on: Optional[List[str]] = None, name: Optional[str] = None, ) -> None: - """Initialize the class.""" self.coords = coords self.radius = radius @@ -77,7 +75,7 @@ class SphereAggregation(BaseMarker): Returns ------- list of str - The list of data types that can be used as input for this marker + The list of data types that can be used as input for this marker. """ return ["T1w", "BOLD", "VBM_GM", "VBM_WM", "fALFF", "GCOR", "LCOR"] diff --git a/junifer/stats.py b/junifer/stats.py index f108d977f..aba64ff4f 100644 --- a/junifer/stats.py +++ b/junifer/stats.py @@ -64,8 +64,6 @@ def get_aggfunc_by_name( ) logger.info(f"Limits for winsorized mean are set to {limits}.") # partially interpret func_params - - func = partial(winsorized_mean, **func_params) elif name == "mean": func = np.mean @@ -94,7 +92,7 @@ def winsorized_mean( The axis to calculate winsorized mean on (default None). **win_params : dict Dictionary containing the keyword arguments for the winsorize function. - E.g. {'limits': [0.1, 0.1]} + E.g. ``{'limits': [0.1, 0.1]}``. Returns ------- diff --git a/junifer/storage/base.py b/junifer/storage/base.py index 16513ba7c..29a19b51c 100644 --- a/junifer/storage/base.py +++ b/junifer/storage/base.py @@ -37,7 +37,6 @@ class BaseFeatureStorage(ABC): storage_types: Union[List[str], str], single_output: bool = False, ) -> None: - """Initialize the class.""" self.uri = uri if not isinstance(storage_types, list): storage_types = [storage_types] @@ -49,7 +48,7 @@ class BaseFeatureStorage(ABC): Returns ------- - meta : dict + dict The metadata as a dictionary. """ diff --git a/junifer/storage/pandas_base.py b/junifer/storage/pandas_base.py index eaa2a0a32..da9b5f2b1 100644 --- a/junifer/storage/pandas_base.py +++ b/junifer/storage/pandas_base.py @@ -30,14 +30,13 @@ class PandasBaseFeatureStorage(BaseFeatureStorage): See Also -------- - BaseFeatureStorage + BaseFeatureStorage : The base class for feature storage. """ def __init__( self, uri: Union[str, Path], single_output: bool = False, **kwargs ) -> None: - """Initialize the class.""" super().__init__(uri=uri, single_output=single_output, **kwargs) def _meta_row(self, meta: Dict, meta_md5: str) -> pd.DataFrame: diff --git a/junifer/storage/sqlite.py b/junifer/storage/sqlite.py index daac3e810..3acb1fa34 100644 --- a/junifer/storage/sqlite.py +++ b/junifer/storage/sqlite.py @@ -47,7 +47,7 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage): See Also -------- - PandasBaseFeatureStorage + PandasBaseFeatureStorage : The base class for Pandas-based feature storage. """ @@ -58,7 +58,6 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage): upsert: str = "update", **kwargs: str, ) -> None: - """Initialize the class.""" # Check upsert argument value if upsert not in ["update", "ignore"]: raise_error( @@ -568,7 +567,7 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage): Parameters ---------- - data: dict + data : dict The timeseries data to store. meta : dict The metadata as a dictionary. diff --git a/junifer/testing/datagrabbers.py b/junifer/testing/datagrabbers.py index f591fc4b4..af247c6c7 100644 --- a/junifer/testing/datagrabbers.py +++ b/junifer/testing/datagrabbers.py @@ -17,7 +17,6 @@ class OasisVBMTestingDatagrabber(BaseDataGrabber): """DataGrabber for Oasis VBM testing data.""" def __init__(self) -> None: - """Initialize the class.""" # Create temporary directory datadir = tempfile.mkdtemp() # Define types @@ -75,7 +74,6 @@ class SPMAuditoryTestingDatagrabber(BaseDataGrabber): """ def __init__(self) -> None: - """Initialize the class.""" # Create temporary directory datadir = tempfile.mkdtemp() # Define types diff --git a/tox.ini b/tox.ini index 0cb26f786..f4a6f3e17 100644 --- a/tox.ini +++ b/tox.ini @@ -95,6 +95,7 @@ max-line-length = 79 extend-ignore = B024 # abstract class with no abstract methods D202 + D107 # missing docstring in __init__, incompatible with numpydoc E201 # whitespace after ‘(’ E202 # whitespace before ‘)’ E203 # whitespace before ‘,’, ‘;’, or ‘:’ -- 2.52.0 From e41b0dbf0c0be77b5a06e6c99e042863e3376cf9 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 00:27:58 +0200 Subject: [PATCH 098/142] Flake --- junifer/markers/sphere_aggregation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junifer/markers/sphere_aggregation.py b/junifer/markers/sphere_aggregation.py index 9909caa84..c54ca0368 100644 --- a/junifer/markers/sphere_aggregation.py +++ b/junifer/markers/sphere_aggregation.py @@ -24,7 +24,6 @@ class SphereAggregation(BaseMarker): Parameters ---------- - coords : str The name of the coordinates list to use. See :func:`junifer.data.coordinates.list_coordinates` for options. @@ -45,6 +44,7 @@ class SphereAggregation(BaseMarker): The name of the marker. By default, it will use KIND_SphereAggregation where KIND is the kind of data it was applied to (default None). """ + def __init__( self, coords: str, -- 2.52.0 From a18a1cc243582e43df2c58531e3f2b712692935b Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 00:29:37 +0200 Subject: [PATCH 099/142] Fix CI --- .github/workflows/pypi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 8b0b97555..902c7ccd8 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Python 3.10 uses: actions/setup-python@v4 with: - python-version: 3.10 + python-version: '3.10' - name: Install build run: pip install build -- 2.52.0 From 90b607024be1025634fe1d6f484176e8e285e1b1 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 00:38:18 +0200 Subject: [PATCH 100/142] Fix stats docs --- docs/api/index.rst | 6 +++--- docs/conf.py | 1 + junifer/stats.py | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/docs/api/index.rst b/docs/api/index.rst index 9bcdf98ad..cb1209325 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -5,7 +5,7 @@ Pipeline Elements ^^^^^^^^^^^^^^^^^ .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Contents: datagrabbers @@ -18,7 +18,7 @@ Utilities ^^^^^^^^^ .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Contents: data @@ -33,7 +33,7 @@ Configs ^^^^^^^ .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Contents: configs diff --git a/docs/conf.py b/docs/conf.py index 2f23a215c..b0c4f7c91 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -155,6 +155,7 @@ intersphinx_mapping = { "numpy": ("https://numpy.org/doc/stable/", None), "pandas": ("https://pandas.pydata.org/pandas-docs/dev", None), "sqlalchemy": ("https://docs.sqlalchemy.org/en/20/", None), + "scipy": ("https://docs.scipy.org/doc/scipy/", None), } sphinx_gallery_conf = { diff --git a/junifer/stats.py b/junifer/stats.py index aba64ff4f..964e6a7a5 100644 --- a/junifer/stats.py +++ b/junifer/stats.py @@ -23,13 +23,16 @@ def get_aggfunc_by_name( name : str Name to identify the function. Currently supported names and corresponding functions are: - - 'winsorized_mean' -> scipy.stats.mstats.winsorize - - 'mean' -> numpy.mean - - 'std' -> numpy.std - - 'trim_mean' -> scipy.stats.trim_mean + + * ``winsorized_mean`` -> + :external+scipy:func:`scipy.stats.mstats.winsorize` + * ``mean`` -> :external+numpy:func:`numpy.mean` + * ``std`` -> :external+numpy:func:`numpy.std` + * ``trim_mean`` -> :external+scipy:func:`scipy.stats.trim_mean` + func_params : dict, optional Parameters to pass to the function. - E.g. for 'winsorized_mean': func_params = {'limits': [0.1, 0.1]} + E.g. for `winsorized_mean`: ``func_params = {'limits': [0.1, 0.1]}`` (default None). Returns @@ -99,6 +102,11 @@ def winsorized_mean( numpy.ndarray Winsorized mean of the inputted data with the winsorize settings applied as specified in win_params. + + See Also + -------- + scipy.stats.mstats.winsorize : + The winsorize function used in this function. """ win_dat = winsorize(data, axis=axis, **win_params) win_mean = win_dat.mean(axis=axis) -- 2.52.0 From f23a717247980080a835b79fd9e1aadfc08c8713 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 00:50:02 +0200 Subject: [PATCH 101/142] more fixes --- docs/api/data.rst | 7 ++----- docs/api/index.rst | 4 ++-- docs/api/pipeline.rst | 7 +++++++ docs/conf.py | 3 ++- junifer/api/__init__.py | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/api/data.rst b/docs/api/data.rst index e9b417e73..d6b0d857b 100644 --- a/docs/api/data.rst +++ b/docs/api/data.rst @@ -1,14 +1,11 @@ -Data -^^^^ - Atlases -------- +^^^^^^^ .. automodule:: junifer.data.atlases :members: Coordinates ------------ +^^^^^^^^^^^ .. automodule:: junifer.data.coordinates :members: diff --git a/docs/api/index.rst b/docs/api/index.rst index cb1209325..2325c485f 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -5,7 +5,7 @@ Pipeline Elements ^^^^^^^^^^^^^^^^^ .. toctree:: - :maxdepth: 3 + :maxdepth: 2 :caption: Contents: datagrabbers @@ -18,7 +18,7 @@ Utilities ^^^^^^^^^ .. toctree:: - :maxdepth: 3 + :maxdepth: 2 :caption: Contents: data diff --git a/docs/api/pipeline.rst b/docs/api/pipeline.rst index 95aaa477b..7142b0e6e 100644 --- a/docs/api/pipeline.rst +++ b/docs/api/pipeline.rst @@ -5,3 +5,10 @@ Pipeline .. automodule:: junifer.pipeline :members: :imported-members: + +Registry +^^^^^^^^ + +.. automodule:: junifer.pipeline.registry + :members: + :imported-members: diff --git a/docs/conf.py b/docs/conf.py index b0c4f7c91..ff53dc79a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -106,7 +106,8 @@ numpydoc_xref_ignore = { "the", "options", "function", - "object" + "object", + "class" } autoclass_content = "class" diff --git a/junifer/api/__init__.py b/junifer/api/__init__.py index bb976649a..e36a4f6e8 100644 --- a/junifer/api/__init__.py +++ b/junifer/api/__init__.py @@ -5,5 +5,5 @@ # License: AGPL from .cli import cli -from .functions import run, collect +from .functions import run, collect, queue from . import decorators -- 2.52.0 From 609489f7850321a344cdde1870483a9357228ac9 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 00:55:40 +0200 Subject: [PATCH 102/142] Update doc dependencies --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7d1905270..a5b1b7b6d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,11 +61,11 @@ junifer = "junifer.api.cli:cli" dev = ["tox"] docs = [ "seaborn>=0.11.2,<0.12", - "Sphinx>=5.0.2,<5.1", - "sphinx-gallery>=0.10.1,<0.11", - "sphinx-rtd-theme>=1.0.0,<1.1", + "Sphinx>=5.3.0,<5.4", + "sphinx-gallery>=0.11.0,<0.12", + "sphinx-rtd-theme>=1.1.0,<1.2", "sphinx-multiversion>=0.2.4,<0.3", - "numpydoc>=1.4.0,<1.5", + "numpydoc>=1.5.0,<1.6", "julearn==0.2.5" ] -- 2.52.0 From 0c5f96eebe436b2bdf6cc8516c0a4a3ecc06e36d Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 08:43:54 +0200 Subject: [PATCH 103/142] Remove :external: --- junifer/markers/functional_connectivity_atlas.py | 5 ++--- junifer/markers/functional_connectivity_spheres.py | 6 ++---- junifer/stats.py | 9 ++++----- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/junifer/markers/functional_connectivity_atlas.py b/junifer/markers/functional_connectivity_atlas.py index ed4f908a3..ffbe8ee40 100644 --- a/junifer/markers/functional_connectivity_atlas.py +++ b/junifer/markers/functional_connectivity_atlas.py @@ -36,12 +36,11 @@ class FunctionalConnectivityAtlas(BaseMarker): :func:`junifer.stats.get_aggfunc_by_name` (default None). cor_method : str, optional The method to perform correlation using. Check valid options in - :external:class:`nilearn.connectome.ConnectivityMeasure` + :class:`nilearn.connectome.ConnectivityMeasure` (default "covariance"). cor_method_params : dict, optional Parameters to pass to the correlation function. Check valid options in - :external:class:`nilearn.connectome.ConnectivityMeasure` - (default None). + :class:`nilearn.connectome.ConnectivityMeasure` (default None). name : str, optional The name of the marker. If None, will use the class name (default None). diff --git a/junifer/markers/functional_connectivity_spheres.py b/junifer/markers/functional_connectivity_spheres.py index fd08e2ecb..d29f4ff9f 100644 --- a/junifer/markers/functional_connectivity_spheres.py +++ b/junifer/markers/functional_connectivity_spheres.py @@ -40,12 +40,10 @@ class FunctionalConnectivitySpheres(BaseMarker): The parameters to pass to the aggregation method (default None). cor_method : str, optional The method to perform correlation using. Check valid options in - :external+nilearn:class:`nilearn.connectome.ConnectivityMeasure` - (default "covariance"). + :class:`nilearn.connectome.ConnectivityMeasure` (default "covariance"). cor_method_params : dict, optional Parameters to pass to the correlation function. Check valid options in - :external+nilearn:class:`nilearn.connectome.ConnectivityMeasure` - (default None). + :class:`nilearn.connectome.ConnectivityMeasure` (default None). name : str, optional The name of the marker. By default, it will use KIND_FunctionalConnectivitySpheres where KIND is the kind of data it diff --git a/junifer/stats.py b/junifer/stats.py index 964e6a7a5..caef7ad96 100644 --- a/junifer/stats.py +++ b/junifer/stats.py @@ -24,11 +24,10 @@ def get_aggfunc_by_name( Name to identify the function. Currently supported names and corresponding functions are: - * ``winsorized_mean`` -> - :external+scipy:func:`scipy.stats.mstats.winsorize` - * ``mean`` -> :external+numpy:func:`numpy.mean` - * ``std`` -> :external+numpy:func:`numpy.std` - * ``trim_mean`` -> :external+scipy:func:`scipy.stats.trim_mean` + * ``winsorized_mean`` -> :func:`scipy.stats.mstats.winsorize` + * ``mean`` -> :func:`numpy.mean` + * ``std`` -> :func:`numpy.std` + * ``trim_mean`` -> :func:`scipy.stats.trim_mean` func_params : dict, optional Parameters to pass to the function. -- 2.52.0 From 61577d30c21b0394a5d85db1e70a89928dccce01 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 10:56:12 +0200 Subject: [PATCH 104/142] Fix comments + furo template --- docs/Makefile | 2 +- docs/_static/css/custom.css | 13 ++++++++- docs/_static/js/custom.js | 14 ++++++++++ docs/_templates/versions copy.html | 25 +++++++++++++++++ docs/_templates/versions.html | 44 ++++++++++++++---------------- docs/conf.py | 22 ++++++++++----- junifer/stats.py | 2 +- pyproject.toml | 2 +- 8 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 docs/_static/js/custom.js create mode 100644 docs/_templates/versions copy.html diff --git a/docs/Makefile b/docs/Makefile index 48bb6ad18..4e5d3141d 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,7 @@ # You can set these variables from the command line, and also # from the environment for the first two. -SPHINXOPTS ?="-W" +SPHINXOPTS ?="" SPHINXBUILD ?= sphinx-multiversion SOURCEDIR = . BUILDDIR ?= _build diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index f3f55faed..149083b3d 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -2,5 +2,16 @@ white-space: nowrap; } .wy-table-responsive table td a.reference.internal { - overflow-wrap: normal; + overflow-wrap: normal; } + +/* Style the button that is used to open and close the collapsible content */ +.version-select { + cursor: pointer; +} + +/* Style the collapsible content. Note: hidden by default */ +#versions { + display: none; + overflow: hidden; +} \ No newline at end of file diff --git a/docs/_static/js/custom.js b/docs/_static/js/custom.js new file mode 100644 index 000000000..c661f2221 --- /dev/null +++ b/docs/_static/js/custom.js @@ -0,0 +1,14 @@ +var coll = document.getElementsByClassName("version-select"); +var i; + +for (i = 0; i < coll.length; i++) { + coll[i].addEventListener("click", function() { + this.classList.toggle("active"); + var content = this.nextElementSibling; + if (content.style.display === "block") { + content.style.display = "none"; + } else { + content.style.display = "block"; + } + }); +} \ No newline at end of file diff --git a/docs/_templates/versions copy.html b/docs/_templates/versions copy.html new file mode 100644 index 000000000..d8299d1ca --- /dev/null +++ b/docs/_templates/versions copy.html @@ -0,0 +1,25 @@ +{% if versions %} + +{% endif %} diff --git a/docs/_templates/versions.html b/docs/_templates/versions.html index 476c8d195..08b7d02bf 100644 --- a/docs/_templates/versions.html +++ b/docs/_templates/versions.html @@ -1,27 +1,25 @@ -{%- if current_version %} -
- - Other Versions - v: {{ current_version.name }} - - -
- {%- if versions.tags %} -
-
Tags
- {%- for item in versions.tags %} -
{{ item.name }}
- {%- endfor %} -
- {%- endif %} - {%- if versions.branches %} -
-
Branches
+{% if versions %} +
- {%- endif %} + + {% endif %} + {% if versions.tags %} + {{ _('Tags') }} + + {% endif %}
-{%- endif %} \ No newline at end of file +{% endif %} diff --git a/docs/conf.py b/docs/conf.py index ff53dc79a..a4b807212 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -119,17 +119,21 @@ autodoc_typehints_description_target = "documented" # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "sphinx_rtd_theme" +html_theme = "furo" html_theme_options = { - "display_version": True, - "style_external_links": True, - "logo_only": True, + # "display_version": True, + # "style_external_links": True, + # "logo_only": True, } html_sidebars = { "**": [ - "globaltoc.html", - "sourcelink.html", - "searchbox.html", + "sidebar/scroll-start.html", + "sidebar/brand.html", + "sidebar/search.html", + "sidebar/navigation.html", + "versions.html" + "sidebar/ethical-ads.html", + "sidebar/scroll-end.html", ] } html_logo = "./images/junifer_logo.png" @@ -145,6 +149,10 @@ html_css_files = [ 'css/custom.css', ] +html_js_files = [ + 'js/custom.js', +] + # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), diff --git a/junifer/stats.py b/junifer/stats.py index caef7ad96..4e2fa18ac 100644 --- a/junifer/stats.py +++ b/junifer/stats.py @@ -31,7 +31,7 @@ def get_aggfunc_by_name( func_params : dict, optional Parameters to pass to the function. - E.g. for `winsorized_mean`: ``func_params = {'limits': [0.1, 0.1]}`` + E.g. for ``winsorized_mean``: ``func_params = {'limits': [0.1, 0.1]}`` (default None). Returns diff --git a/pyproject.toml b/pyproject.toml index a5b1b7b6d..24ab26d5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ docs = [ "seaborn>=0.11.2,<0.12", "Sphinx>=5.3.0,<5.4", "sphinx-gallery>=0.11.0,<0.12", - "sphinx-rtd-theme>=1.1.0,<1.2", + "furo>=2022.9.29,<2023.0.0", "sphinx-multiversion>=0.2.4,<0.3", "numpydoc>=1.5.0,<1.6", "julearn==0.2.5" -- 2.52.0 From 8b23a2120adf4d98b3af497a234b5ba3ed13b99b Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 10:57:15 +0200 Subject: [PATCH 105/142] Revert back this change --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 4e5d3141d..120e641c3 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,7 @@ # You can set these variables from the command line, and also # from the environment for the first two. -SPHINXOPTS ?="" +SPHINXOPTS ?="-D" SPHINXBUILD ?= sphinx-multiversion SOURCEDIR = . BUILDDIR ?= _build -- 2.52.0 From a87cbbf837927ff013c183d7196d503e6b0fc7ba Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 10:57:49 +0200 Subject: [PATCH 106/142] typo --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index a4b807212..0c24b4887 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -131,7 +131,7 @@ html_sidebars = { "sidebar/brand.html", "sidebar/search.html", "sidebar/navigation.html", - "versions.html" + "versions.html", "sidebar/ethical-ads.html", "sidebar/scroll-end.html", ] -- 2.52.0 From 671a4f6d12ca9de27e029461ea25d9f7eb75200e Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 10:58:07 +0200 Subject: [PATCH 107/142] another typo --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 120e641c3..48bb6ad18 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,7 @@ # You can set these variables from the command line, and also # from the environment for the first two. -SPHINXOPTS ?="-D" +SPHINXOPTS ?="-W" SPHINXBUILD ?= sphinx-multiversion SOURCEDIR = . BUILDDIR ?= _build -- 2.52.0 From ee2ee43d7e3c0d784553ecc98b99f99567d38685 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 11:43:40 +0200 Subject: [PATCH 108/142] Remove rtd theme extension --- docs/conf.py | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 0c24b4887..a07a086a1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,20 +23,6 @@ from pathlib import Path curdir = Path(__file__).parent sys.path.append((curdir / "sphinxext").as_posix()) - -# paths_to_add = [ -# "junifer/configs/juseless", -# ] - -# for t_path in paths_to_add: -# t_path = (curdir.parent / t_path).resolve().as_posix() -# sys.path.insert(0, t_path) - - -# sys.path.insert( -# 1, (curdir.parent / "junifer" / "configs" / "juseless").resolve() -# ) - # -- Project information ----------------------------------------------------- project = "junifer" @@ -57,7 +43,6 @@ extensions = [ "sphinx.ext.intersphinx", # link to other projects’ documentation "sphinx.ext.mathjax", # math support for HTML outputs in Sphinx "sphinx_gallery.gen_gallery", # HTML gallery of examples - "sphinx_rtd_theme", # RTD theme "sphinx_multiversion", # self-hosted versioned documentation "numpydoc", # support for NumPy style docstrings "gh_substitutions", # custom GitHub substitutions @@ -120,11 +105,7 @@ autodoc_typehints_description_target = "documented" # a list of builtin themes. # html_theme = "furo" -html_theme_options = { - # "display_version": True, - # "style_external_links": True, - # "logo_only": True, -} + html_sidebars = { "**": [ "sidebar/scroll-start.html", -- 2.52.0 From c56a39ffd6e30e26da0233f77aa8a19b4df226e1 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 12:02:33 +0200 Subject: [PATCH 109/142] cleanup + fix tables + fix search index --- docs/Makefile | 2 +- docs/_static/css/custom.css | 6 +++--- docs/_templates/versions copy.html | 25 ------------------------- 3 files changed, 4 insertions(+), 29 deletions(-) delete mode 100644 docs/_templates/versions copy.html diff --git a/docs/Makefile b/docs/Makefile index 48bb6ad18..a58f174d8 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,7 @@ # You can set these variables from the command line, and also # from the environment for the first two. -SPHINXOPTS ?="-W" +SPHINXOPTS ?="-W" "-E" SPHINXBUILD ?= sphinx-multiversion SOURCEDIR = . BUILDDIR ?= _build diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 149083b3d..518a7e367 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -1,7 +1,7 @@ -.wy-table-responsive table td, .wy-table-responsive table th { - white-space: nowrap; +.table-wrapper.colwidths-auto table td, .table-wrapper.colwidths-auto table th { + white-space: nowrap; } -.wy-table-responsive table td a.reference.internal { +.table-wrapper.colwidths-auto table td a.reference.internal { overflow-wrap: normal; } diff --git a/docs/_templates/versions copy.html b/docs/_templates/versions copy.html deleted file mode 100644 index d8299d1ca..000000000 --- a/docs/_templates/versions copy.html +++ /dev/null @@ -1,25 +0,0 @@ -{% if versions %} - -{% endif %} -- 2.52.0 From 7822cbbef4648ad71e8de4d78e3c0ff0bcdf071b Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 12:25:18 +0200 Subject: [PATCH 110/142] Changes requested --- docs/conf.py | 3 ++- junifer/datagrabber/multiple.py | 2 +- junifer/markers/functional_connectivity_atlas.py | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index a07a086a1..8df7856aa 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -92,7 +92,8 @@ numpydoc_xref_ignore = { "options", "function", "object", - "class" + "class", + "objects" } autoclass_content = "class" diff --git a/junifer/datagrabber/multiple.py b/junifer/datagrabber/multiple.py index bb1799364..ac4370102 100644 --- a/junifer/datagrabber/multiple.py +++ b/junifer/datagrabber/multiple.py @@ -19,7 +19,7 @@ class MultipleDataGrabber(BaseDataGrabber): Parameters ---------- - datagrabbers : list of BaseDataGrabber + datagrabbers : list of datagrabber-like objects The datagrabbers to use to fetch data using. **kwargs Keyword arguments passed to superclass. diff --git a/junifer/markers/functional_connectivity_atlas.py b/junifer/markers/functional_connectivity_atlas.py index ffbe8ee40..4f542cbb4 100644 --- a/junifer/markers/functional_connectivity_atlas.py +++ b/junifer/markers/functional_connectivity_atlas.py @@ -14,7 +14,6 @@ from ..utils import logger from .base import BaseMarker from .parcel_aggregation import ParcelAggregation - if TYPE_CHECKING: from junifer.storage import BaseFeatureStorage @@ -121,10 +120,11 @@ class FunctionalConnectivityAtlas(BaseMarker): dict The computed result as dictionary. The following data will be included in the dictionary: - - data: functional connectivity matrix as a numpy.ndarray. - - row_names: row names as a list - - col_names: column names as a list - - matrix_kind: the kind of matrix (tril, triu or full) + + * data: functional connectivity matrix as a numpy.ndarray. + * row_names: row names as a list + * col_names: column names as a list + * matrix_kind: the kind of matrix (tril, triu or full) """ pa = ParcelAggregation( -- 2.52.0 From 553be9bea288965a75a8e68efa3cf65eea724ee8 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 12:42:07 +0200 Subject: [PATCH 111/142] Fix latest.inc --- docs/changes/latest.inc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index b51cb5645..112e44300 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -71,7 +71,9 @@ Enhancements - Implement JuselessDataladAOMICID1000VBM datagrabber for accessing AOMIC ID 1000 VBM from juseless (:gh:`57` by `Felix Hoffstaedter`_ and `Synchon Mandal`_) -- Add test for DataladHCP1200 datagrabber (:gh: `93` by `Synchon Mandal`_). +- Add test for DataladHCP1200 datagrabber (:gh:`93` by `Synchon Mandal`_). + +- Change documentation template to furo. Fix references and standardize documentation (:gh:`114` by `Fede Raimondo`_). Bugs ~~~~ @@ -79,7 +81,7 @@ Bugs - Fix a bug in which a PatternDatagrabber would now work with relative `datadir` paths. (:gh:`96` by `Leonard Sasse`_, fixed in :gh:`98` by `Fede Raimondo`_). -- Fix a bug in which AOMIC PIOP2 datagrabber did not use user input to constrain elements based on tasks (:gh: `105` by `Leonard Sasse`_) +- Fix a bug in which AOMIC PIOP2 datagrabber did not use user input to constrain elements based on tasks (:gh:`105` by `Leonard Sasse`_) API changes ~~~~~~~~~~~ -- 2.52.0 From 654b80a0e2478662aed8d48b18d7b5d9263bc546 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:54:37 +0100 Subject: [PATCH 112/142] chore: standardize sphinx section header ordering in docs/api --- docs/api/api.rst | 3 +-- docs/api/configs.rst | 4 ++-- docs/api/data.rst | 4 ++-- docs/api/datagrabbers.rst | 4 ++-- docs/api/datareaders.rst | 5 ++--- docs/api/index.rst | 7 +++---- docs/api/markers.rst | 3 +-- docs/api/pipeline.rst | 5 ++--- docs/api/preprocessing.rst | 3 +-- docs/api/stats.rst | 3 +-- docs/api/storage.rst | 3 +-- docs/api/testing.rst | 3 +-- docs/api/utils.rst | 3 +-- 13 files changed, 20 insertions(+), 30 deletions(-) diff --git a/docs/api/api.rst b/docs/api/api.rst index 106a4e309..449232516 100644 --- a/docs/api/api.rst +++ b/docs/api/api.rst @@ -1,6 +1,5 @@ - API Functions -^^^^^^^^^^^^^^ +============= Main API functions ------------------ diff --git a/docs/api/configs.rst b/docs/api/configs.rst index 372ab36c8..e237fa772 100644 --- a/docs/api/configs.rst +++ b/docs/api/configs.rst @@ -1,10 +1,10 @@ Configs -^^^^^^^ +======= Juseless -------- .. automodule:: junifer.configs.juseless.datagrabbers - :members: + :members: :imported-members: :special-members: None diff --git a/docs/api/data.rst b/docs/api/data.rst index d6b0d857b..2975fe12c 100644 --- a/docs/api/data.rst +++ b/docs/api/data.rst @@ -1,11 +1,11 @@ Atlases -^^^^^^^ +======= .. automodule:: junifer.data.atlases :members: Coordinates -^^^^^^^^^^^ +=========== .. automodule:: junifer.data.coordinates :members: diff --git a/docs/api/datagrabbers.rst b/docs/api/datagrabbers.rst index 974bd303b..8556ab5f0 100644 --- a/docs/api/datagrabbers.rst +++ b/docs/api/datagrabbers.rst @@ -1,5 +1,5 @@ -Data Grabbers -^^^^^^^^^^^^^ +DataGrabbers +============ .. automodule:: junifer.datagrabber :members: diff --git a/docs/api/datareaders.rst b/docs/api/datareaders.rst index 3dee2aa11..28e3d7e62 100644 --- a/docs/api/datareaders.rst +++ b/docs/api/datareaders.rst @@ -1,6 +1,5 @@ - -Data Readers -^^^^^^^^^^^^ +DataReaders +=========== .. automodule:: junifer.datareader :members: diff --git a/docs/api/index.rst b/docs/api/index.rst index 2325c485f..4abc5afa7 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -2,7 +2,7 @@ API Reference ============= Pipeline Elements -^^^^^^^^^^^^^^^^^ +----------------- .. toctree:: :maxdepth: 2 @@ -15,7 +15,7 @@ Pipeline Elements storage Utilities -^^^^^^^^^ +--------- .. toctree:: :maxdepth: 2 @@ -28,9 +28,8 @@ Utilities utils testing - Configs -^^^^^^^ +------- .. toctree:: :maxdepth: 3 diff --git a/docs/api/markers.rst b/docs/api/markers.rst index 7c6a34b8d..b9e995b4c 100644 --- a/docs/api/markers.rst +++ b/docs/api/markers.rst @@ -1,6 +1,5 @@ - Markers -^^^^^^^ +======= .. automodule:: junifer.markers :members: diff --git a/docs/api/pipeline.rst b/docs/api/pipeline.rst index 7142b0e6e..1a9b691f4 100644 --- a/docs/api/pipeline.rst +++ b/docs/api/pipeline.rst @@ -1,13 +1,12 @@ - Pipeline -^^^^^^^^ +======== .. automodule:: junifer.pipeline :members: :imported-members: Registry -^^^^^^^^ +======== .. automodule:: junifer.pipeline.registry :members: diff --git a/docs/api/preprocessing.rst b/docs/api/preprocessing.rst index 571bc7b6e..036fddb53 100644 --- a/docs/api/preprocessing.rst +++ b/docs/api/preprocessing.rst @@ -1,6 +1,5 @@ - Pre-processing -^^^^^^^^^^^^^^ +============== .. automodule:: junifer.preprocess :members: diff --git a/docs/api/stats.rst b/docs/api/stats.rst index c55efb8a6..e2243f729 100644 --- a/docs/api/stats.rst +++ b/docs/api/stats.rst @@ -1,6 +1,5 @@ - Stats -^^^^^ +===== .. automodule:: junifer.stats :members: diff --git a/docs/api/storage.rst b/docs/api/storage.rst index 4e785ce60..3b442b4ea 100644 --- a/docs/api/storage.rst +++ b/docs/api/storage.rst @@ -1,6 +1,5 @@ - Storage -^^^^^^^ +======= .. automodule:: junifer.storage :members: diff --git a/docs/api/testing.rst b/docs/api/testing.rst index 0220bd917..0e25f04b3 100644 --- a/docs/api/testing.rst +++ b/docs/api/testing.rst @@ -1,6 +1,5 @@ - Testing -^^^^^^^ +======= .. automodule:: junifer.testing.datagrabbers :members: diff --git a/docs/api/utils.rst b/docs/api/utils.rst index 999a180d3..ad7755127 100644 --- a/docs/api/utils.rst +++ b/docs/api/utils.rst @@ -1,6 +1,5 @@ - Utils -^^^^^ +===== .. automodule:: junifer.utils :members: -- 2.52.0 From 7a2922f4ddf41333f9e149a96f1690026e73594c Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:55:26 +0100 Subject: [PATCH 113/142] chore: standardize sphinx section header ordering for docs/understanding --- docs/understanding/data.rst | 4 ++-- docs/understanding/datagrabber.rst | 5 +++-- docs/understanding/datareader.rst | 4 ++-- docs/understanding/marker.rst | 2 +- docs/understanding/preprocess.rst | 2 +- docs/understanding/storage.rst | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index a97483a1f..a109d9955 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -6,7 +6,7 @@ The Data Object =============== Description -^^^^^^^^^^^ +----------- This is the *object* that traverses the steps of the pipeline. It is indeed a dictionary of dictionaries. The first level of keys are the :ref:`data types ` @@ -27,7 +27,7 @@ A point to note is that you never directly interact with the *data object* but i .. _data_types: Data types -^^^^^^^^^^ +---------- .. list-table:: :widths: auto diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index 3411e40f1..93d7a059c 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -6,7 +6,7 @@ DataGrabber =========== Description -^^^^^^^^^^^ +----------- The ``DataGrabber`` is an object that can provide an interface to datasets you want to work with in junifer. Every concrete implementation of a datagrabber is aware of a particular dataset's structure and thus allows @@ -26,7 +26,8 @@ to implement your own datagrabber, you need to provide concrete implementations provided. Base classes -^^^^^^^^^^^^ +------------ + In this section, we showcase different abstract base classes you might want to use to implement your own datagrabber. .. list-table:: diff --git a/docs/understanding/datareader.rst b/docs/understanding/datareader.rst index 774f402db..4fffd0d7b 100644 --- a/docs/understanding/datareader.rst +++ b/docs/understanding/datareader.rst @@ -6,7 +6,7 @@ DataReader ========== Description -^^^^^^^^^^^ +----------- The ``DataReader`` is an object that is responsible for actually reading data files in junifer. It reads the value of the key ``path`` for each :ref:`data type ` in the :ref:`Data object ` @@ -20,7 +20,7 @@ For data formats not supported by junifer yet, you can either make your own ``Da `junifer Github`_ and we can help you out. Currently supported file-formats -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------------------- We already provide a concrete implementation :class:`junifer.datareader.DefaultDataReader` which knows how to read the following file formats: diff --git a/docs/understanding/marker.rst b/docs/understanding/marker.rst index 915f8ed99..749275f20 100644 --- a/docs/understanding/marker.rst +++ b/docs/understanding/marker.rst @@ -6,7 +6,7 @@ Marker ====== Description -^^^^^^^^^^^ +----------- The ``Marker`` is an object that is responsible for feature extraction. It primarily operates on data loaded in memory by :ref:`datareader ` and stored in the ``data`` key of each :ref:`data type ` diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index eea630214..420de2bb7 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -6,7 +6,7 @@ Preprocess ========== Description -^^^^^^^^^^^ +----------- The ``Preprocess`` step of the pipeline is meant for pre-processing before or after :ref:`Marker ` step depending on the use-case. For example, you might want to perform confound removal on ``BOLD`` data before diff --git a/docs/understanding/storage.rst b/docs/understanding/storage.rst index c409809b0..25ceed0b3 100644 --- a/docs/understanding/storage.rst +++ b/docs/understanding/storage.rst @@ -6,7 +6,7 @@ Storage ======= Description -^^^^^^^^^^^ +----------- The ``Storage`` is an object that is responsible for storing extracted features as computed from :ref:`Marker ` step of the pipeline. If the pipeline is provided with a ``storage-like`` object, the extracted features are stored via @@ -25,7 +25,7 @@ For storage interfaces not supported by junifer yet, you can either make your ow implementation of :class:`junifer.storage.BaseFeatureStorage` or open an issue on `junifer Github`_ and we can help you out. Currently supported storage interfaces -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------------------------- .. list-table:: :widths: auto -- 2.52.0 From a0d542b1388afbb7569e1e87512249416e26e53e Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:56:11 +0100 Subject: [PATCH 114/142] chore: standardize sphinx section header ordering for docs/builtin --- docs/builtin.rst | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/docs/builtin.rst b/docs/builtin.rst index e6ff0b880..35ab80796 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -4,8 +4,8 @@ Pipeline steps and atlases ========================== -Data Grabbers -^^^^^^^^^^^^^ +DataGrabbers +------------ .. Provide a list of the DataGrabbers that are implemented or planned. @@ -29,7 +29,7 @@ Data Grabbers following syntax: :gh:`` Available ---------- +~~~~~~~~~ .. list-table:: :widths: auto @@ -92,7 +92,7 @@ Available Planned -------- +~~~~~~~ .. list-table:: :widths: auto @@ -116,23 +116,23 @@ Planned Markers -^^^^^^^ +------- .. Provide a list of the Markers that are implemented or planned. - State: this should indicate the state of the dataset. Valid options are + State: this should indicate the state of the marker. Valid options are - Planned - In Progress - Done Version added: If the status is "Done", the Junifer version in which the - dataset was added. Else, a link to the Github issue or pull request - implementing the dataset. Links to github can be added by using the + marker was added. Else, a link to the Github issue or pull request + implementing the marker. Links to github can be added by using the following syntax: :gh:`` Available ---------- +~~~~~~~~~ .. list-table:: :widths: auto @@ -165,7 +165,7 @@ Available Planned -------- +~~~~~~~ .. list-table:: :widths: auto @@ -195,10 +195,15 @@ Planned Atlases -^^^^^^^ +------- + +.. + Provide a list of the Atlases that are implemented or planned. + + Version added: The Junifer version in which the atlas was added. Available ---------- +~~~~~~~~~ ======== ================= ================================================================================= ============= ==================================================== Name Options Keys Version added Publication @@ -225,7 +230,7 @@ TIAN ``scale``, | ``TianxS1x3TxMNI6thgeneration``, ``TianxS1x3TxMNI Planned -------- +~~~~~~~ ================= ============================================================================== Name Publication -- 2.52.0 From 01ec5cb274a23c3f253b323916ffad9443c7686f Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:56:29 +0100 Subject: [PATCH 115/142] chore: remove extra line in docs/contribution --- docs/contribution.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/contribution.rst b/docs/contribution.rst index b510c6a4a..8a5d369c1 100644 --- a/docs/contribution.rst +++ b/docs/contribution.rst @@ -5,7 +5,6 @@ Contributing to junifer ======================= - Setting up the local development environment -------------------------------------------- -- 2.52.0 From 22ccde1f82d847cda2b1fb5f328814a6f43c5a16 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:57:44 +0100 Subject: [PATCH 116/142] chore: standardize sphinx section header ordering for docs/faq --- docs/faq.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/faq.rst b/docs/faq.rst index aed46d33b..a9bc63b14 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -4,12 +4,12 @@ FAQs ==== How do I contribute to junifer? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------- Please follow the :ref:`contribution guidelines `. How do I set up VSCode for contribution? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +---------------------------------------- The :ref:`contribution guidelines ` apply in general when using VSCode as your IDE as well. -- 2.52.0 From dadc4c910e4c3c05ad191ef949ef56b60a336f90 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:57:55 +0100 Subject: [PATCH 117/142] chore: standardize sphinx section header ordering for docs/maintaining --- docs/maintaining.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/maintaining.rst b/docs/maintaining.rst index 91b463067..5ea1bd14c 100644 --- a/docs/maintaining.rst +++ b/docs/maintaining.rst @@ -4,7 +4,8 @@ Maintaining =========== Versioning -^^^^^^^^^^ +---------- + Version numbers are as follows: *MAJOR.MINOR.MICRO*. Additionally, development version append *devN* where N is the distance (in commits) to the last release. @@ -20,9 +21,10 @@ version "X.Y.Z". Additionally, for every push to main, it will be published as pre-release to TestPypi. Releasing a new version -^^^^^^^^^^^^^^^^^^^^^^^ +----------------------- + Once the milestone is reached (all issues closed), it is time to do a new -release. +release. 1. Open a PR to update documentation: - `docs/changes/latest.inc` should now be renamed to the version to be @@ -54,4 +56,4 @@ release. .. code-block:: bash - git push origin vX.Y.Z \ No newline at end of file + git push origin vX.Y.Z -- 2.52.0 From 9f2836f4dae4f856e1c0f2f7ef41a6c2aefcf9b0 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 17:58:02 +0100 Subject: [PATCH 118/142] chore: standardize sphinx section header ordering for docs/installation --- docs/installation.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index c2f9f0e38..53622ccb7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -5,7 +5,7 @@ Installing junifer Requirements -^^^^^^^^^^^^ +------------ junifer is compatible with `Python`_ >= 3.8 and requires the following packages: @@ -21,7 +21,8 @@ junifer is compatible with `Python`_ >= 3.8 and requires the following packages: Depending on the installation method, these packages might be installed automatically. Installation -^^^^^^^^^^^^ +------------ + Depending on your use-case, junifer can be installed differently: * Install the :ref:`install_latest_release`. This is the most suitable approach @@ -36,7 +37,7 @@ Either way, we strongly recommend using `virtual environments `_, like so: @@ -48,6 +49,6 @@ Use ``pip`` to install julearn from `PyPI `_, like so: .. _install_development_git: Local Git repository --------------------- +~~~~~~~~~~~~~~~~~~~~ Follow the `detailed contribution guidelines `_. -- 2.52.0 From 825365f3192879d5f235d5e0786584ae9bc6d2e3 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 3 Nov 2022 20:41:06 +0100 Subject: [PATCH 119/142] fix: current unix timestamp in milliseconds for ci-docs.yml --- .github/workflows/ci-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 3bbea84b2..997dca0f8 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -21,7 +21,7 @@ jobs: mkdir docs touch docs/conf.py echo '' > coverage.xml - echo '' >> coverage.xml + echo '' >> coverage.xml echo '' >> coverage.xml echo '/home/runner/work/docs/docs' >> coverage.xml echo '' >> coverage.xml -- 2.52.0 From ea6976eee5c73ea50f46bf5dd0292181312db095 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 27 Oct 2022 00:01:58 +0300 Subject: [PATCH 120/142] Confound removal WIP --- junifer/preprocess/__init__.py | 2 +- junifer/preprocess/confounds.py | 351 +++++++---- junifer/preprocess/tests/test_confounds.py | 588 +++++++++--------- junifer/testing/datagrabbers.py | 94 ++- .../tests/test_oasisvmbtesting_datagrabber.py | 29 + .../test_partlycloudytesting_datagrabber.py | 40 ++ 6 files changed, 705 insertions(+), 399 deletions(-) create mode 100644 junifer/testing/tests/test_oasisvmbtesting_datagrabber.py create mode 100644 junifer/testing/tests/test_partlycloudytesting_datagrabber.py diff --git a/junifer/preprocess/__init__.py b/junifer/preprocess/__init__.py index b7016a59d..532763ce5 100644 --- a/junifer/preprocess/__init__.py +++ b/junifer/preprocess/__init__.py @@ -4,4 +4,4 @@ # Leonard Sasse # License: AGPL -from .confounds import BaseConfoundRemover +from .confounds import FMRIPrepConfoundRemover diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index f61f29644..fe121c386 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -5,7 +5,7 @@ # Synchon Mandal # License: AGPL -from typing import TYPE_CHECKING, Dict, List, Optional, Union +from typing import TYPE_CHECKING, Dict, List, Optional, Union, Tuple, Any import numpy as np import pandas as pd @@ -21,8 +21,8 @@ if TYPE_CHECKING: from nibabel import MGHImage, Nifti1Image, Nifti2Image -class BaseConfoundRemover(PipelineStepMixin): - """Base class for confound removal. +class FMRIPrepConfoundRemover(PipelineStepMixin): + """Class for confound removal. Read confound files and select columns according to a pre-defined strategy. @@ -46,8 +46,8 @@ class BaseConfoundRemover(PipelineStepMixin): (default None). spike : float, optional If None, no spike regressor is added. If spike is a float, it will - add a spike regressor for every point at which FD exceeds the - specified float (default None). + add a spike regressor for every point at which framewise displacement + exceeds the specified float (default None). detrend : bool, Optional If True, detrending will be applied on timeseries (before confound removal) (default True). @@ -147,7 +147,7 @@ class BaseConfoundRemover(PipelineStepMixin): If the input does not have the required data. """ - _required_inputs = ["BOLD", "confounds"] + _required_inputs = ["BOLD", "BOLD_confounds"] if any(x not in input for x in _required_inputs): raise_error( msg="Input does not have the required data. \n" @@ -175,51 +175,178 @@ class BaseConfoundRemover(PipelineStepMixin): # Does not add any new keys return input - # TODO: complete type annotations - def _pick_confounds(self, input): + def _pick_confounds(self, input: Dict[str, Any]) -> pd.DataFrame: """Select relevant confounds from the specified file.""" - to_select = [] - confounds_df = input["data"] - confounds_spec = input["names"]["spec"] - # for every confound there is a derivative - # and for every confound + derivative there should be squares - derivatives_to_compute = input["names"].get("derivatives", {}) - squares_to_compute = input["names"].get("squares", {}) - spike_name = input["names"]["spike"] - # Get all the column names according to the strategy - for comp, param in self.strategy.items(): - to_select.extend(confounds_spec[comp][param]) + confounds_format = input["format"] + if confounds_format == "adhoc": + self._map_adhoc_to_fmriprep(input) + elif confounds_format != "fmriprep": + raise ValueError(f"Invalid confounds format {confounds_format}") + + processed_spec = self._process_fmriprep_spec(input) + + ( + to_select, + squares_to_compute, + derivatives_to_compute, + spike_name, + ) = processed_spec + # Copy the confounds + out_df = input["data"].copy() # Add derivatives if needed - to_compute = [x in derivatives_to_compute.keys() for x in to_select] - out_df = confounds_df.copy() - if any(to_compute): - for t_dst, t_src in derivatives_to_compute.items(): - out_df[t_dst] = np.append( # type: ignore - np.diff(out_df[t_src]), 0 - ) # type: ignore + for t_dst, t_src in derivatives_to_compute.items(): + out_df[t_dst] = np.append(np.diff(out_df[t_src]), 0) # Add squares (of base confounds and derivatives) if needed - to_compute = [x in squares_to_compute.keys() for x in to_select] - if any(to_compute): - for t_dst, t_src in squares_to_compute.items(): - out_df[t_dst] = out_df[t_src] ** 2 - out_df = out_df[to_select] + for t_dst, t_src in squares_to_compute.items(): + out_df[t_dst] = out_df[t_src] ** 2 # add binary spike regressor if needed at given threshold if self.spike is not None: - fd = confounds_df[spike_name].copy() + fd = out_df[spike_name].copy() fd.loc[fd > self.spike] = 1 fd.loc[fd != 1] = 0 out_df["spike"] = fd + to_select.append("spike") + # Now pick all the relevant confounds + out_df = out_df[to_select] return out_df + def _process_fmriprep_spec( + self, input: Dict[str, Any] + ) -> Tuple[List, Dict, Dict, str]: + """Process the fmpriprep format spec from the specified file. + + Based on the strategy, find the relevant column names in the dataframe, + as well as the required squared and derivatives to compute. + + Parameters + ---------- + input : dict + Dictionary containing the following keys: + - path: path to the confounds file + - data: the confounds file loaded in memory (dataframe) + - format: format of the confounds file (must be "fmriprep") + + Returns + ------- + to_select : list of str + List of confounds to select from the confounds file, based on the + strategy + squares_to_compute : dict[str, str] + Dictionary containing the missing power2 confounds to compute + (keys) and the corresponding confounds to square (values) + derivatives_to_compute : dict[str, str] + Dictionary containing the missing derivatives confounds to compute + (keys) and the corresponding confounds to compute the derivative + from (values) + spike_name : str + Name of the confound to use for spike detection + + """ + confounds_df = input["data"] + available_vars = confounds_df.columns + + # This function should build this 3 variables + to_select = [] # the list of confounds to select + squares_to_compute = {} # the dictionary of missing squares + derivatives_to_compute = {} # the dictionary of missing derivatives + + basics = { + "motion": [ + "trans_x", + "trans_y", + "trans_z", + "rot_x", + "rot_y", + "rot_z", + ], + "wm_csf": ["csf", "white_matter"], + "global_signal": ["global_signal"], + } + + for t_kind, t_strategy in self.strategy.items(): + t_basics = basics[t_kind] + + if any(x not in available_vars for x in t_basics): + missing = [x for x in t_basics if x not in available_vars] + raise ValueError( + "Invalid confounds file. Missing basic confounds: " + f"{missing}. " + "Check if this file is really an fmriprep confounds file. " + "You can also modify the confound removal strategy." + ) + + to_select.extend(t_basics) + + if t_strategy in ["power2", "full"]: + for x in t_basics: + x_2 = f"{x}_power2" + to_select.append(x_2) + if x_2 not in available_vars: + squares_to_compute[x_2] = x + + if t_strategy in ["derivatives", "full"]: + for x in t_basics: + x_derivative = f"{x}_derivative1" + to_select.append(x_derivative) + if x_derivative not in available_vars: + derivatives_to_compute[x_derivative] = x + if t_strategy == "full": + x_derivative_2 = f"{x_derivative}_power2" + to_select.append(x_derivative_2) + if x_derivative_2 not in available_vars: + squares_to_compute[x_derivative_2] = x_derivative + spike_name = "framewise_displacement" + + out = to_select, squares_to_compute, derivatives_to_compute, spike_name + return out + + def _map_adhoc_to_fmriprep(self, input: Dict[str, Any]): + """Map the adhoc format to the fmpriprep format spec. + + Based on the spec, map the column names to match the fmriprep format. + + This method modifies the dataframe in place. + + Parameters + ---------- + input : dict + Dictionary containing the following keys: + - path: path to the confounds file + - data: the confounds file loaded in memory (dataframe) + - format: format of the confounds file (must be "adhoc") + """ + + confounds_df = input["data"] + + # This is an + confounds_mapping = input["mappings"] + + # Check that all the required columns are present + missing = [ + x + for x in confounds_mapping.keys() + if x not in confounds_df.columns + ] + + if len(missing) is not None: + raise ValueError( + "Invalid confounds file. Missing columns: " + f"{missing}. " + "Check if this file matches the adhoc specification for " + "this dataset." + ) + + # Rename the columns + confounds_df.rename(columns=confounds_mapping, inplace=True) + def _remove_confounds( self, bold_img: "Nifti1Image", confounds_df: pd.DataFrame ) -> Union["Nifti1Image", "Nifti2Image", "MGHImage", List]: - """Remove confounds from the BOLD data.""" """Remove confounds from the BOLD image. Parameters @@ -267,19 +394,18 @@ class BaseConfoundRemover(PipelineStepMixin): return clean_bold - # TODO: complete type annotations - def _validate_data(self, input): + def _validate_data(self, input: Dict[str, Any]): """Validate input data.""" # Bold must be 4D niimg check_niimg_4d(input["BOLD"]["data"]) # Confounds must be a dataframe - if not isinstance(input["confounds"]["data"], pd.DataFrame): + if not isinstance(input["BOLD_confounds"]["data"], pd.DataFrame): raise_error( - "confounds data must be a pandas dataframe", ValueError + "Confounds data must be a pandas dataframe", ValueError ) - confound_df = input["confounds"]["data"] + confound_df = input["BOLD_confounds"]["data"] bold_img = input["BOLD"]["data"] if bold_img.get_fdata().shape[3] != len(confound_df): raise_error( @@ -308,95 +434,96 @@ class BaseConfoundRemover(PipelineStepMixin): # 'full', [(list of columns)]} # } - # Check the columns in the dataframe - conf_spec = input["confounds"]["names"]["spec"] - if any(x not in conf_spec.keys() for x in self._valid_components): - raise_error( - "All of the component types must be in the confounds data " - "object `spec`. Please check your datagrabber.", - ValueError, - ) + # # Check the columns in the dataframe + # conf_spec = input["confounds"]["names"]["spec"] + # if any(x not in conf_spec.keys() for x in self._valid_components): + # raise_error( + # "All of the component types must be in the confounds data " + # "object `spec`. Please check your datagrabber.", + # ValueError, + # ) - if any( - x not in v.keys() - for x in self._valid_confounds - for v in conf_spec.values() - ): - raise_error( - "All of the confound types must be in the confounds data " - "object `spec`. Please check your datagrabber.", - ValueError, - ) + # if any( + # x not in v.keys() + # for x in self._valid_confounds + # for v in conf_spec.values() + # ): + # raise_error( + # "All of the confound types must be in the confounds data " + # "object `spec`. Please check your datagrabber.", + # ValueError, + # ) - spike_name = input["confounds"]["names"]["spike"] + # spike_name = input["confounds"]["names"]["spike"] - derivatives_to_compute = input["confounds"]["names"].get( - "derivatives", {} - ) - if not (isinstance(derivatives_to_compute, dict)): - raise_error( - 'input["confounds"]["names"]["derivatives"] ' - "must be a dictionary. Please check your datagrabber", - ValueError, - ) + # derivatives_to_compute = input["confounds"]["names"].get( + # "derivatives", {} + # ) + # if not (isinstance(derivatives_to_compute, dict)): + # raise_error( + # 'input["confounds"]["names"]["derivatives"] ' + # "must be a dictionary. Please check your datagrabber", + # ValueError, + # ) - if any( - not (isinstance(k, str) or isinstance(v, str)) - for k, v in derivatives_to_compute.items() - ): - raise_error( - 'input["confounds"]["names"]["derivatives"] ' - "must be a dictionary with string keys and values. " - "Please check your datagrabber", - ValueError, - ) + # if any( + # not (isinstance(k, str) or isinstance(v, str)) + # for k, v in derivatives_to_compute.items() + # ): + # raise_error( + # 'input["confounds"]["names"]["derivatives"] ' + # "must be a dictionary with string keys and values. " + # "Please check your datagrabber", + # ValueError, + # ) - missing_derivatives = [ - x - for x in derivatives_to_compute.values() - if x not in confound_df.columns - ] - if len(missing_derivatives) > 0: - raise_error( - "Some of the derivatives to calculate are not in the confounds" - f" dataframe: {missing_derivatives}." - "Please check your data " - f'({input["confounds"]["path"].as_posix()}) ' - "and the datagrabber.", - ValueError, - ) + # missing_derivatives = [ + # x + # for x in derivatives_to_compute.values() + # if x not in confound_df.columns + # ] + # if len(missing_derivatives) > 0: + # raise_error( + # "Some of the derivatives to calculate are not in the " + # "confounds" + # f" dataframe: {missing_derivatives}." + # "Please check your data " + # f'({input["confounds"]["path"].as_posix()}) ' + # "and the datagrabber.", + # ValueError, + # ) - t_conf_spec = { - k: input["confounds"]["names"]["spec"][k][v] - for k, v in self.strategy.items() - } + # t_conf_spec = { + # k: input["confounds"]["names"]["spec"][k][v] + # for k, v in self.strategy.items() + # } - column_names = set([x for y in t_conf_spec.values() for x in y]) - column_names.add(spike_name) + # column_names = set([x for y in t_conf_spec.values() for x in y]) + # column_names.add(spike_name) - missing_columns = [ - x - for x in column_names - if x not in confound_df.columns - and x not in derivatives_to_compute.keys() - ] + # missing_columns = [ + # x + # for x in column_names + # if x not in confound_df.columns + # and x not in derivatives_to_compute.keys() + # ] - if len(missing_columns) > 0: - raise_error( - "Some of the columns in the confound spec are not in the " - f"confounds dataframe: {missing_columns}. " - "Please check your data " - f'({input["confounds"]["path"].as_posix()}) ' - "and the datagrabber.", - ValueError, - ) + # if len(missing_columns) > 0: + # raise_error( + # "Some of the columns in the confound spec are not in the " + # f"confounds dataframe: {missing_columns}. " + # "Please check your data " + # f'({input["confounds"]["path"].as_posix()}) ' + # "and the datagrabber.", + # ValueError, + # ) # TODO: complete type annotations def fit_transform(self, input): """Fit and transform.""" self._validate_data(input) bold_img = input["BOLD"]["data"] - confounds_df = self._pick_confounds(input["confounds"]) + confounds_df = self._pick_confounds(input["BOLD_confounds"]) input["BOLD"]["data"] = self._remove_confounds(bold_img, confounds_df) # TODO: Update meta diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index 8050e1d2d..2dfe9a8f4 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -5,343 +5,361 @@ # Synchon Mandal # License: AGPL -import random -import string -from pathlib import Path -from typing import Tuple -import numpy as np -import pandas as pd -from nibabel import Nifti1Image -from nilearn._utils.niimg_conversions import check_niimg_4d - -from junifer.preprocess.confounds import BaseConfoundRemover +from numpy.testing import assert_array_equal, assert_raises +from junifer.preprocess.confounds import FMRIPrepConfoundRemover +from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber +from junifer.datareader import DefaultDataReader # Set RNG seed for reproducibility -np.random.seed(1234567) +# np.random.seed(1234567) -def generate_conf_name( - size: int = 6, chars: str = string.ascii_uppercase + string.digits -) -> str: - """Generate configuration name.""" - return "".join(random.choice(chars) for _ in range(size)) +# def generate_conf_name( +# size: int = 6, chars: str = string.ascii_uppercase + string.digits +# ) -> str: +# """Generate configuration name.""" +# return "".join(random.choice(chars) for _ in range(size)) -def _simu_img() -> Tuple[Nifti1Image, Nifti1Image]: - # Random 4D volume with 100 time points - vol = 100 + 10 * np.random.randn(5, 5, 2, 100) - img = Nifti1Image(vol, np.eye(4)) - # Create an nifti image with the data, and corresponding mask - mask = Nifti1Image(np.ones([5, 5, 2]), np.eye(4)) - return img, mask +# def _simu_img() -> Tuple[Nifti1Image, Nifti1Image]: +# # Random 4D volume with 100 time points +# vol = 100 + 10 * np.random.randn(5, 5, 2, 100) +# img = Nifti1Image(vol, np.eye(4)) +# # Create an nifti image with the data, and corresponding mask +# mask = Nifti1Image(np.ones([5, 5, 2]), np.eye(4)) +# return img, mask -# TODO: split the tests -def test_baseconfoundremover() -> None: - """Test BaseConfoundRemover.""" - # Generate a simulated BOLD img - siimg, simsk = _simu_img() +def test_FMRIPrepConfoundRemover_allpresent() -> None: + """Test FMRIPrepConfoundRemover with all confounds present.""" - # generate random confound dataframe with Felix's column naming + # need reader for the data + reader = DefaultDataReader() + # All strategies full, no spike + confound_remover = FMRIPrepConfoundRemover() - motion_basic = [f"RP.{i}" for i in range(1, 7)] - motion_power2 = [f"RP^2.{i}" for i in range(1, 7)] - motion_derivatives = [f"DRP.{i}" for i in range(1, 7)] - motion_full = [f"DRP^2.{i}" for i in range(1, 7)] + with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + orig_bold = input["BOLD"]["data"].get_fdata().copy() + output = confound_remover.fit_transform(input) + trans_bold = output["BOLD"]["data"].get_fdata() + # Transformation is in place + assert_array_equal(trans_bold, input["BOLD"]["data"].get_fdata()) - wm_csf_basic = ["WM", "CSF"] - wm_csf_power2 = ["WM^2", "CSF^2"] - wm_csf_derivatives = ["DWM", "DCSF"] - wm_csf_full = ["DWM^2", "DCSF^2"] + # Data should have the same shape + assert orig_bold.shape == trans_bold.shape + assert_raises( + AssertionError, assert_array_equal, orig_bold, trans_bold + ) - gs_basic = ["GS"] - gs_power2 = ["GS^2"] - gs_derivatives = ["DGS"] - gs_full = ["DGS^2"] - confound_column_names = [] +# # TODO: split the tests +# def test_baseconfoundremover() -> None: +# """Test BaseConfoundRemover.""" +# # Generate a simulated BOLD img +# siimg, simsk = _simu_img() - confound_column_names.append("FD") # spike +# # generate random confound dataframe with Felix's column naming - confound_column_names.extend(motion_basic) - confound_column_names.extend(motion_power2) - confound_column_names.extend(motion_derivatives) - confound_column_names.extend(motion_full) +# motion_basic = [f"RP.{i}" for i in range(1, 7)] +# motion_power2 = [f"RP^2.{i}" for i in range(1, 7)] +# motion_derivatives = [f"DRP.{i}" for i in range(1, 7)] +# motion_full = [f"DRP^2.{i}" for i in range(1, 7)] - confound_column_names.extend(wm_csf_basic) - confound_column_names.extend(wm_csf_power2) - confound_column_names.extend(wm_csf_derivatives) - confound_column_names.extend(wm_csf_full) +# wm_csf_basic = ["WM", "CSF"] +# wm_csf_power2 = ["WM^2", "CSF^2"] +# wm_csf_derivatives = ["DWM", "DCSF"] +# wm_csf_full = ["DWM^2", "DCSF^2"] - confound_column_names.extend(gs_basic) - confound_column_names.extend(gs_power2) - confound_column_names.extend(gs_derivatives) - confound_column_names.extend(gs_full) +# gs_basic = ["GS"] +# gs_power2 = ["GS^2"] +# gs_derivatives = ["DGS"] +# gs_full = ["DGS^2"] - # add some random irrelevant confounds - for _ in range(10): - confound_column_names.append(generate_conf_name()) +# confound_column_names = [] - np.random.shuffle(confound_column_names) - n_cols = len(confound_column_names) - confounds_df = pd.DataFrame( - np.random.randint(0, 100, size=(100, n_cols)), - columns=confound_column_names, - ) +# confound_column_names.append("FD") # spike - # Generate spec from Felix's column naming - spec = { - "motion": { - "basic": motion_basic, - "power2": motion_basic + motion_power2, - "derivatives": motion_basic + motion_derivatives, - "full": motion_basic - + motion_derivatives - + motion_power2 - + motion_full, - }, - "wm_csf": { - "basic": wm_csf_basic, - "power2": wm_csf_basic + wm_csf_power2, - "derivatives": wm_csf_basic + wm_csf_derivatives, - "full": wm_csf_basic - + wm_csf_derivatives - + wm_csf_power2 - + wm_csf_full, - }, - "global_signal": { - "basic": gs_basic, - "power2": gs_basic + gs_power2, - "derivatives": gs_basic + gs_derivatives, - "full": gs_basic + gs_derivatives + gs_power2 + gs_full, - }, - } +# confound_column_names.extend(motion_basic) +# confound_column_names.extend(motion_power2) +# confound_column_names.extend(motion_derivatives) +# confound_column_names.extend(motion_full) - # generate a junifer pipeline data object dictionary - input_data_obj = {} - input_data_obj["meta"] = {} - input_data_obj["BOLD"] = {} - input_data_obj["BOLD"]["data"] = siimg - input_data_obj["confounds"] = {} - input_data_obj["confounds"]["path"] = Path("/test.df") - input_data_obj["confounds"]["data"] = confounds_df - input_data_obj["confounds"]["names"] = {} - input_data_obj["confounds"]["names"]["spec"] = spec - input_data_obj["confounds"]["names"]["spike"] = "FD" +# confound_column_names.extend(wm_csf_basic) +# confound_column_names.extend(wm_csf_power2) +# confound_column_names.extend(wm_csf_derivatives) +# confound_column_names.extend(wm_csf_full) - # generate confound removal strategies with varying numbers of parameters +# confound_column_names.extend(gs_basic) +# confound_column_names.extend(gs_power2) +# confound_column_names.extend(gs_derivatives) +# confound_column_names.extend(gs_full) - # Test #1: 36 params, no derivatives to compute, no spike - # 36 params - strat1 = {"motion": "full", "wm_csf": "full", "global_signal": "full"} +# # add some random irrelevant confounds +# for _ in range(10): +# confound_column_names.append(generate_conf_name()) - cr = BaseConfoundRemover( - strategy=strat1, spike=None, mask_img=simsk, t_r=0.75 - ) - cr.validate_input(list(input_data_obj.keys())) - out_type = cr.get_output_kind(list(input_data_obj.keys())) +# np.random.shuffle(confound_column_names) +# n_cols = len(confound_column_names) +# confounds_df = pd.DataFrame( +# np.random.randint(0, 100, size=(100, n_cols)), +# columns=confound_column_names, +# ) - assert "BOLD" in out_type +# # Generate spec from Felix's column naming +# spec = { +# "motion": { +# "basic": motion_basic, +# "power2": motion_basic + motion_power2, +# "derivatives": motion_basic + motion_derivatives, +# "full": motion_basic +# + motion_derivatives +# + motion_power2 +# + motion_full, +# }, +# "wm_csf": { +# "basic": wm_csf_basic, +# "power2": wm_csf_basic + wm_csf_power2, +# "derivatives": wm_csf_basic + wm_csf_derivatives, +# "full": wm_csf_basic +# + wm_csf_derivatives +# + wm_csf_power2 +# + wm_csf_full, +# }, +# "global_signal": { +# "basic": gs_basic, +# "power2": gs_basic + gs_power2, +# "derivatives": gs_basic + gs_derivatives, +# "full": gs_basic + gs_derivatives + gs_power2 + gs_full, +# }, +# } - # Check if the input data is valid - cr._validate_data(input_data_obj) +# # generate a junifer pipeline data object dictionary +# input_data_obj = {} +# input_data_obj["meta"] = {} +# input_data_obj["BOLD"] = {} +# input_data_obj["BOLD"]["data"] = siimg +# input_data_obj["confounds"] = {} +# input_data_obj["confounds"]["path"] = Path("/test.df") +# input_data_obj["confounds"]["data"] = confounds_df +# input_data_obj["confounds"]["names"] = {} +# input_data_obj["confounds"]["names"]["spec"] = spec +# input_data_obj["confounds"]["names"]["spike"] = "FD" - # Check that the confounds are picked correctly: - t_df = cr._pick_confounds(input_data_obj["confounds"]) - assert len(t_df.columns) == 36 - assert all(x in t_df.columns for x in motion_basic) - assert all(x in t_df.columns for x in motion_power2) - assert all(x in t_df.columns for x in motion_derivatives) - assert all(x in t_df.columns for x in motion_full) - assert all(x in t_df.columns for x in wm_csf_basic) - assert all(x in t_df.columns for x in wm_csf_power2) - assert all(x in t_df.columns for x in wm_csf_derivatives) - assert all(x in t_df.columns for x in wm_csf_full) - assert all(x in t_df.columns for x in gs_basic) - assert all(x in t_df.columns for x in gs_power2) - assert all(x in t_df.columns for x in gs_derivatives) - assert all(x in t_df.columns for x in gs_full) - assert "FD" not in t_df.columns - assert "spike" not in t_df.columns +# # generate confound removal strategies with varying numbers of parameters - # Test #2: 24 params, no derivatives to compute, no spike - # 24 params - strat2 = { - "motion": "full", - } +# # Test #1: 36 params, no derivatives to compute, no spike +# # 36 params +# strat1 = {"motion": "full", "wm_csf": "full", "global_signal": "full"} - cr = BaseConfoundRemover( - strategy=strat2, spike=None, mask_img=simsk, t_r=0.75 - ) - cr.validate_input(list(input_data_obj.keys())) - out_type = cr.get_output_kind(list(input_data_obj.keys())) +# cr = BaseConfoundRemover( +# strategy=strat1, spike=None, mask_img=simsk, t_r=0.75 +# ) +# cr.validate_input(list(input_data_obj.keys())) +# out_type = cr.get_output_kind(list(input_data_obj.keys())) - assert "BOLD" in out_type +# assert "BOLD" in out_type - # Check if the input data is valid - cr._validate_data(input_data_obj) +# # Check if the input data is valid +# cr._validate_data(input_data_obj) - # Check that the confounds are picked correctly: - t_df = cr._pick_confounds(input_data_obj["confounds"]) - assert len(t_df.columns) == 24 - assert all(x in t_df.columns for x in motion_basic) - assert all(x in t_df.columns for x in motion_power2) - assert all(x in t_df.columns for x in motion_derivatives) - assert all(x in t_df.columns for x in motion_full) - assert all(x not in t_df.columns for x in wm_csf_basic) - assert all(x not in t_df.columns for x in wm_csf_power2) - assert all(x not in t_df.columns for x in wm_csf_derivatives) - assert all(x not in t_df.columns for x in wm_csf_full) - assert all(x not in t_df.columns for x in gs_basic) - assert all(x not in t_df.columns for x in gs_power2) - assert all(x not in t_df.columns for x in gs_derivatives) - assert all(x not in t_df.columns for x in gs_full) - assert "FD" not in t_df.columns - assert "spike" not in t_df.columns +# # Check that the confounds are picked correctly: +# t_df = cr._pick_confounds(input_data_obj["confounds"]) +# assert len(t_df.columns) == 36 +# assert all(x in t_df.columns for x in motion_basic) +# assert all(x in t_df.columns for x in motion_power2) +# assert all(x in t_df.columns for x in motion_derivatives) +# assert all(x in t_df.columns for x in motion_full) +# assert all(x in t_df.columns for x in wm_csf_basic) +# assert all(x in t_df.columns for x in wm_csf_power2) +# assert all(x in t_df.columns for x in wm_csf_derivatives) +# assert all(x in t_df.columns for x in wm_csf_full) +# assert all(x in t_df.columns for x in gs_basic) +# assert all(x in t_df.columns for x in gs_power2) +# assert all(x in t_df.columns for x in gs_derivatives) +# assert all(x in t_df.columns for x in gs_full) +# assert "FD" not in t_df.columns +# assert "spike" not in t_df.columns - # Test #3: 9 params, no derivatives to compute, no spike - strat3 = {"motion": "basic", "wm_csf": "basic", "global_signal": "basic"} +# # Test #2: 24 params, no derivatives to compute, no spike +# # 24 params +# strat2 = { +# "motion": "full", +# } - cr = BaseConfoundRemover( - strategy=strat3, spike=None, mask_img=simsk, t_r=0.75 - ) - cr.validate_input(list(input_data_obj.keys())) - out_type = cr.get_output_kind(list(input_data_obj.keys())) +# cr = BaseConfoundRemover( +# strategy=strat2, spike=None, mask_img=simsk, t_r=0.75 +# ) +# cr.validate_input(list(input_data_obj.keys())) +# out_type = cr.get_output_kind(list(input_data_obj.keys())) - assert "BOLD" in out_type +# assert "BOLD" in out_type - # Check if the input data is valid - cr._validate_data(input_data_obj) +# # Check if the input data is valid +# cr._validate_data(input_data_obj) - # Check that the confounds are picked correctly: - t_df = cr._pick_confounds(input_data_obj["confounds"]) - assert len(t_df.columns) == 9 - assert all(x in t_df.columns for x in motion_basic) - assert all(x not in t_df.columns for x in motion_power2) - assert all(x not in t_df.columns for x in motion_derivatives) - assert all(x not in t_df.columns for x in motion_full) - assert all(x in t_df.columns for x in wm_csf_basic) - assert all(x not in t_df.columns for x in wm_csf_power2) - assert all(x not in t_df.columns for x in wm_csf_derivatives) - assert all(x not in t_df.columns for x in wm_csf_full) - assert all(x in t_df.columns for x in gs_basic) - assert all(x not in t_df.columns for x in gs_power2) - assert all(x not in t_df.columns for x in gs_derivatives) - assert all(x not in t_df.columns for x in gs_full) - assert "FD" not in t_df.columns - assert "spike" not in t_df.columns +# # Check that the confounds are picked correctly: +# t_df = cr._pick_confounds(input_data_obj["confounds"]) +# assert len(t_df.columns) == 24 +# assert all(x in t_df.columns for x in motion_basic) +# assert all(x in t_df.columns for x in motion_power2) +# assert all(x in t_df.columns for x in motion_derivatives) +# assert all(x in t_df.columns for x in motion_full) +# assert all(x not in t_df.columns for x in wm_csf_basic) +# assert all(x not in t_df.columns for x in wm_csf_power2) +# assert all(x not in t_df.columns for x in wm_csf_derivatives) +# assert all(x not in t_df.columns for x in wm_csf_full) +# assert all(x not in t_df.columns for x in gs_basic) +# assert all(x not in t_df.columns for x in gs_power2) +# assert all(x not in t_df.columns for x in gs_derivatives) +# assert all(x not in t_df.columns for x in gs_full) +# assert "FD" not in t_df.columns +# assert "spike" not in t_df.columns - # Test #4: 6 params, no derivatives to compute, no spike - strat4 = { - "motion": "basic", - } - cr = BaseConfoundRemover( - strategy=strat4, spike=None, mask_img=simsk, t_r=0.75 - ) - cr.validate_input(list(input_data_obj.keys())) - out_type = cr.get_output_kind(list(input_data_obj.keys())) +# # Test #3: 9 params, no derivatives to compute, no spike +# strat3 = {"motion": "basic", "wm_csf": "basic", "global_signal": "basic"} - assert "BOLD" in out_type +# cr = BaseConfoundRemover( +# strategy=strat3, spike=None, mask_img=simsk, t_r=0.75 +# ) +# cr.validate_input(list(input_data_obj.keys())) +# out_type = cr.get_output_kind(list(input_data_obj.keys())) - # Check if the input data is valid - cr._validate_data(input_data_obj) +# assert "BOLD" in out_type - # Check that the confounds are picked correctly: - t_df = cr._pick_confounds(input_data_obj["confounds"]) - assert len(t_df.columns) == 6 - assert all(x in t_df.columns for x in motion_basic) - assert all(x not in t_df.columns for x in motion_power2) - assert all(x not in t_df.columns for x in motion_derivatives) - assert all(x not in t_df.columns for x in motion_full) - assert all(x not in t_df.columns for x in wm_csf_basic) - assert all(x not in t_df.columns for x in wm_csf_power2) - assert all(x not in t_df.columns for x in wm_csf_derivatives) - assert all(x not in t_df.columns for x in wm_csf_full) - assert all(x not in t_df.columns for x in gs_basic) - assert all(x not in t_df.columns for x in gs_power2) - assert all(x not in t_df.columns for x in gs_derivatives) - assert all(x not in t_df.columns for x in gs_full) - assert "FD" not in t_df.columns - assert "spike" not in t_df.columns +# # Check if the input data is valid +# cr._validate_data(input_data_obj) - # Test #5: 2 params, no derivatives to compute, no spike - strat5 = { - "wm_csf": "basic", - } - cr = BaseConfoundRemover( - strategy=strat5, spike=None, mask_img=simsk, t_r=0.75 - ) - cr.validate_input(list(input_data_obj.keys())) - out_type = cr.get_output_kind(list(input_data_obj.keys())) +# # Check that the confounds are picked correctly: +# t_df = cr._pick_confounds(input_data_obj["confounds"]) +# assert len(t_df.columns) == 9 +# assert all(x in t_df.columns for x in motion_basic) +# assert all(x not in t_df.columns for x in motion_power2) +# assert all(x not in t_df.columns for x in motion_derivatives) +# assert all(x not in t_df.columns for x in motion_full) +# assert all(x in t_df.columns for x in wm_csf_basic) +# assert all(x not in t_df.columns for x in wm_csf_power2) +# assert all(x not in t_df.columns for x in wm_csf_derivatives) +# assert all(x not in t_df.columns for x in wm_csf_full) +# assert all(x in t_df.columns for x in gs_basic) +# assert all(x not in t_df.columns for x in gs_power2) +# assert all(x not in t_df.columns for x in gs_derivatives) +# assert all(x not in t_df.columns for x in gs_full) +# assert "FD" not in t_df.columns +# assert "spike" not in t_df.columns - assert "BOLD" in out_type +# # Test #4: 6 params, no derivatives to compute, no spike +# strat4 = { +# "motion": "basic", +# } +# cr = BaseConfoundRemover( +# strategy=strat4, spike=None, mask_img=simsk, t_r=0.75 +# ) +# cr.validate_input(list(input_data_obj.keys())) +# out_type = cr.get_output_kind(list(input_data_obj.keys())) - # Check if the input data is valid - cr._validate_data(input_data_obj) +# assert "BOLD" in out_type - # Check that the confounds are picked correctly: - t_df = cr._pick_confounds(input_data_obj["confounds"]) - assert len(t_df.columns) == 2 - assert all(x not in t_df.columns for x in motion_basic) - assert all(x not in t_df.columns for x in motion_power2) - assert all(x not in t_df.columns for x in motion_derivatives) - assert all(x not in t_df.columns for x in motion_full) - assert all(x in t_df.columns for x in wm_csf_basic) - assert all(x not in t_df.columns for x in wm_csf_power2) - assert all(x not in t_df.columns for x in wm_csf_derivatives) - assert all(x not in t_df.columns for x in wm_csf_full) - assert all(x not in t_df.columns for x in gs_basic) - assert all(x not in t_df.columns for x in gs_power2) - assert all(x not in t_df.columns for x in gs_derivatives) - assert all(x not in t_df.columns for x in gs_full) - assert "FD" not in t_df.columns - assert "spike" not in t_df.columns +# # Check if the input data is valid +# cr._validate_data(input_data_obj) - out = cr.fit_transform(input_data_obj) - check_niimg_4d(out["BOLD"]["data"]) - # TODO: check meta +# # Check that the confounds are picked correctly: +# t_df = cr._pick_confounds(input_data_obj["confounds"]) +# assert len(t_df.columns) == 6 +# assert all(x in t_df.columns for x in motion_basic) +# assert all(x not in t_df.columns for x in motion_power2) +# assert all(x not in t_df.columns for x in motion_derivatives) +# assert all(x not in t_df.columns for x in motion_full) +# assert all(x not in t_df.columns for x in wm_csf_basic) +# assert all(x not in t_df.columns for x in wm_csf_power2) +# assert all(x not in t_df.columns for x in wm_csf_derivatives) +# assert all(x not in t_df.columns for x in wm_csf_full) +# assert all(x not in t_df.columns for x in gs_basic) +# assert all(x not in t_df.columns for x in gs_power2) +# assert all(x not in t_df.columns for x in gs_derivatives) +# assert all(x not in t_df.columns for x in gs_full) +# assert "FD" not in t_df.columns +# assert "spike" not in t_df.columns - # Test #6: 12 params, derivatives to compute, spike - to_select = [ - x for x in confounds_df.columns if x not in motion_derivatives - ] - no_d_df = confounds_df[to_select] - input_data_obj["confounds"]["data"] = no_d_df +# # Test #5: 2 params, no derivatives to compute, no spike +# strat5 = { +# "wm_csf": "basic", +# } +# cr = BaseConfoundRemover( +# strategy=strat5, spike=None, mask_img=simsk, t_r=0.75 +# ) +# cr.validate_input(list(input_data_obj.keys())) +# out_type = cr.get_output_kind(list(input_data_obj.keys())) - derivatives = {f"D{x}": x for x in motion_basic} +# assert "BOLD" in out_type - input_data_obj["confounds"]["names"]["derivatives"] = derivatives +# # Check if the input data is valid +# cr._validate_data(input_data_obj) - strat6 = { - "motion": "derivatives", - } - cr = BaseConfoundRemover( - strategy=strat6, spike=0.75, mask_img=simsk, t_r=0.75 - ) - cr.validate_input(list(input_data_obj.keys())) - out_type = cr.get_output_kind(list(input_data_obj.keys())) +# # Check that the confounds are picked correctly: +# t_df = cr._pick_confounds(input_data_obj["confounds"]) +# assert len(t_df.columns) == 2 +# assert all(x not in t_df.columns for x in motion_basic) +# assert all(x not in t_df.columns for x in motion_power2) +# assert all(x not in t_df.columns for x in motion_derivatives) +# assert all(x not in t_df.columns for x in motion_full) +# assert all(x in t_df.columns for x in wm_csf_basic) +# assert all(x not in t_df.columns for x in wm_csf_power2) +# assert all(x not in t_df.columns for x in wm_csf_derivatives) +# assert all(x not in t_df.columns for x in wm_csf_full) +# assert all(x not in t_df.columns for x in gs_basic) +# assert all(x not in t_df.columns for x in gs_power2) +# assert all(x not in t_df.columns for x in gs_derivatives) +# assert all(x not in t_df.columns for x in gs_full) +# assert "FD" not in t_df.columns +# assert "spike" not in t_df.columns - assert "BOLD" in out_type +# out = cr.fit_transform(input_data_obj) +# check_niimg_4d(out["BOLD"]["data"]) +# # TODO: check meta - # Check if the input data is valid - cr._validate_data(input_data_obj) +# # Test #6: 12 params, derivatives to compute, spike +# to_select = [ +# x for x in confounds_df.columns if x not in motion_derivatives +# ] +# no_d_df = confounds_df[to_select] +# input_data_obj["confounds"]["data"] = no_d_df - # Check that the confounds are picked correctly: - t_df = cr._pick_confounds(input_data_obj["confounds"]) - assert len(t_df.columns) == 13 - assert all(x in t_df.columns for x in motion_basic) - assert all(x not in t_df.columns for x in motion_power2) - assert all(x in t_df.columns for x in motion_derivatives) - assert all(x not in t_df.columns for x in motion_full) - assert all(x not in t_df.columns for x in wm_csf_basic) - assert all(x not in t_df.columns for x in wm_csf_power2) - assert all(x not in t_df.columns for x in wm_csf_derivatives) - assert all(x not in t_df.columns for x in wm_csf_full) - assert all(x not in t_df.columns for x in gs_basic) - assert all(x not in t_df.columns for x in gs_power2) - assert all(x not in t_df.columns for x in gs_derivatives) - assert all(x not in t_df.columns for x in gs_full) - assert "FD" not in t_df.columns - assert "spike" in t_df.columns +# derivatives = {f"D{x}": x for x in motion_basic} + +# input_data_obj["confounds"]["names"]["derivatives"] = derivatives + +# strat6 = { +# "motion": "derivatives", +# } +# cr = BaseConfoundRemover( +# strategy=strat6, spike=0.75, mask_img=simsk, t_r=0.75 +# ) +# cr.validate_input(list(input_data_obj.keys())) +# out_type = cr.get_output_kind(list(input_data_obj.keys())) + +# assert "BOLD" in out_type + +# # Check if the input data is valid +# cr._validate_data(input_data_obj) + +# # Check that the confounds are picked correctly: +# t_df = cr._pick_confounds(input_data_obj["confounds"]) +# assert len(t_df.columns) == 13 +# assert all(x in t_df.columns for x in motion_basic) +# assert all(x not in t_df.columns for x in motion_power2) +# assert all(x in t_df.columns for x in motion_derivatives) +# assert all(x not in t_df.columns for x in motion_full) +# assert all(x not in t_df.columns for x in wm_csf_basic) +# assert all(x not in t_df.columns for x in wm_csf_power2) +# assert all(x not in t_df.columns for x in wm_csf_derivatives) +# assert all(x not in t_df.columns for x in wm_csf_full) +# assert all(x not in t_df.columns for x in gs_basic) +# assert all(x not in t_df.columns for x in gs_power2) +# assert all(x not in t_df.columns for x in gs_derivatives) +# assert all(x not in t_df.columns for x in gs_full) +# assert "FD" not in t_df.columns +# assert "spike" in t_df.columns diff --git a/junifer/testing/datagrabbers.py b/junifer/testing/datagrabbers.py index af247c6c7..0bff71f10 100644 --- a/junifer/testing/datagrabbers.py +++ b/junifer/testing/datagrabbers.py @@ -5,6 +5,7 @@ # License: AGPL import tempfile +from pathlib import Path from typing import Dict, List import nibabel as nib @@ -39,7 +40,7 @@ class OasisVBMTestingDatagrabber(BaseDataGrabber): """ out = super().__getitem__(element) i_sub = int(element.split("-")[1]) - 1 - out["VBM_GM"] = {"path": self._dataset.gray_matter_maps[i_sub]} + out["VBM_GM"] = {"path": Path(self._dataset.gray_matter_maps[i_sub])} # Set the element accordingly out["meta"]["element"] = {"subject": element} return out @@ -120,3 +121,94 @@ class SPMAuditoryTestingDatagrabber(BaseDataGrabber): # Set the element accordingly out["meta"]["element"] = {"subject": element} return out + + +class PartlyCloudyTestingDataGrabber(BaseDataGrabber): + """DataGrabber for Partly Cloudy dataset. + + Wrapper for nilearn.datasets.fetch_partly_cloudy + + + Parameters + ---------- + reduce_confounds : bool, optional + If True, the returned confounds only include 6 motion parameters, + mean framewise displacement, signal from white matter, csf, and + 6 anatomical compcor parameters. This selection only serves the + purpose of having realistic examples. Depending on your research + question, other confounds might be more appropriate. + If False, returns all :term:`fMRIPrep` confounds. + Default=True. + + age_group : str, optional + Default='both'. Which age group to fetch + - 'adults' = fetch adults only (n=33, ages 18-39) + - 'child' = fetch children only (n=122, ages 3-12) + - 'both' = fetch full sample (n=155) + """ + + def __init__(self, reduce_confounds=True, age_group="both") -> None: + """Initialize the class.""" + datadir = tempfile.mkdtemp() + # Define types + types = ["BOLD", "BOLD_confounds"] + self.reduce_confounds = reduce_confounds + self.age_group = age_group + super().__init__(types=types, datadir=datadir) + + def __enter__(self) -> "PartlyCloudyTestingDataGrabber": + """Implement context entry. + + Returns + ------- + PartlyCloudyTestingDataGrabber + + """ + self._dataset = datasets.fetch_development_fmri( + n_subjects=10, + reduce_confounds=self.reduce_confounds, + age_group=self.age_group, + ) + return self + + def get_elements(self) -> List[str]: + """Get elements. + + Returns + ------- + list of str + List of elements that can be grabbed. + + """ + return [f"sub-{x:02d}" for x in list(range(1, 11))] + + def __getitem__(self, element: str) -> Dict: + """Implement indexing support. + + Parameters + ---------- + element : str + The element to retrieve. + + Returns + ------- + dict + The data along with the metadata. + + """ + out = super().__getitem__(element) + i_sub = int(element.split("-")[1]) - 1 + out["BOLD"] = {"path": Path(self._dataset["func"][i_sub])} + conf_format = "adhoc" if self.reduce_confounds else "fmriprep" + + out["BOLD_confounds"] = { + "path": Path(self._dataset["confounds"][i_sub]), + "format": conf_format, + } + # if self.reduce_confounds: + # spec = { + + # } + # Set the element accordingly + out["meta"]["element"] = {"subject": element} + return out diff --git a/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py b/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py new file mode 100644 index 000000000..9129b93c0 --- /dev/null +++ b/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py @@ -0,0 +1,29 @@ +"""Provide tests for SPM Auditory datagrabber.""" + +# Authors: Federico Raimondo +# License: AGPL + +from junifer.testing.datagrabbers import OasisVBMTestingDatagrabber + + +def test_OasisVBMTestingDatagrabber() -> None: + """Test Oasis VBM datagrabber.""" + expected_elements = [ + "sub-01", + "sub-02", + "sub-03", + "sub-04", + "sub-05", + "sub-06", + "sub-07", + "sub-08", + "sub-09", + "sub-10", + ] + with OasisVBMTestingDatagrabber() as dg: + all_elements = dg.get_elements() + assert set(all_elements) == set(expected_elements) + out = dg["sub-01"] + assert "VBM_GM" in out + assert out["VBM_GM"]["path"].exists() + assert out["VBM_GM"]["path"].is_file() diff --git a/junifer/testing/tests/test_partlycloudytesting_datagrabber.py b/junifer/testing/tests/test_partlycloudytesting_datagrabber.py new file mode 100644 index 000000000..aceb93dad --- /dev/null +++ b/junifer/testing/tests/test_partlycloudytesting_datagrabber.py @@ -0,0 +1,40 @@ +"""Provide tests for PartlyCloudy datagrabber.""" + +# Authors: Federico Raimondo +# License: AGPL + +from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber + + +def test_PartlyCloudyTestingDataGrabber() -> None: + """Test PartlyCloudy datagrabber.""" + expected_elements = [ + "sub-01", + "sub-02", + "sub-03", + "sub-04", + "sub-05", + "sub-06", + "sub-07", + "sub-08", + "sub-09", + "sub-10", + ] + with PartlyCloudyTestingDataGrabber() as dg: + all_elements = dg.get_elements() + assert set(all_elements) == set(expected_elements) + out = dg["sub-01"] + assert "BOLD" in out + assert out["BOLD"]["path"].exists() + assert out["BOLD"]["path"].is_file() + + assert "BOLD_confounds" in out + assert out["BOLD_confounds"]["path"].exists() + assert out["BOLD_confounds"]["path"].is_file() + assert "format" in out["BOLD_confounds"] + assert "adhoc" == out["BOLD_confounds"]["format"] + + with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: + out = dg["sub-01"] + assert "format" in out["BOLD_confounds"] + assert "fmriprep" == out["BOLD_confounds"]["format"] -- 2.52.0 From da95bdaab6dc4fea7c12ee40be09acbe36281d2c Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 27 Oct 2022 12:12:22 +0300 Subject: [PATCH 121/142] Still WIP, but with more tests --- junifer/preprocess/confounds.py | 245 ++++++++++++++------- junifer/preprocess/tests/test_confounds.py | 186 ++++++++++++++++ 2 files changed, 352 insertions(+), 79 deletions(-) diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index fe121c386..b753590c7 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -21,6 +21,65 @@ if TYPE_CHECKING: from nibabel import MGHImage, Nifti1Image, Nifti2Image +FMRIPREP_BASICS = { + "motion": [ + "trans_x", + "trans_y", + "trans_z", + "rot_x", + "rot_y", + "rot_z", + ], + "wm_csf": ["csf", "white_matter"], + "global_signal": ["global_signal"], +} + +FMRIPREP_POWER2 = { + "motion": [ + "trans_x_power2", + "trans_y_power2", + "trans_z_power2", + "rot_x_power2", + "rot_y_power2", + "rot_z_power2", + ], + "wm_csf": ["csf_power2", "white_matter_power2"], + "global_signal": ["global_signal_power2"], +} + +FMRIPREP_DERIVATIVES = { + "motion": [ + "trans_x_derivative1", + "trans_y_derivative1", + "trans_z_derivative1", + "rot_x_derivative1", + "rot_y_derivative1", + "rot_z_derivative1", + ], + "wm_csf": ["csf_derivative1", "white_matter_derivative1"], + "global_signal": ["global_signal_derivative1"], +} + +FMRIPREP_DERIVATIVES_POWER2 = { + "motion": [ + "trans_x_derivative1_power2", + "trans_y_derivative1_power2", + "trans_z_derivative1_power2", + "rot_x_derivative1_power2", + "rot_y_derivative1_power2", + "rot_z_derivative1_power2", + ], + "wm_csf": ["csf_derivative1_power2", "white_matter_derivative1_power2"], + "global_signal": ["global_signal_derivative1_power2"], +} + +FMRIPREP_VALID_NAMES = [ + elem for x in [FMRIPREP_BASICS, FMRIPREP_POWER2, FMRIPREP_DERIVATIVES, + FMRIPREP_DERIVATIVES_POWER2] + for t_list in x.values() + for elem in t_list] + + class FMRIPrepConfoundRemover(PipelineStepMixin): """Class for confound removal. @@ -124,7 +183,7 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): if any(x not in self._valid_confounds for x in strategy.values()): raise_error( - msg=f"Invalid component names {list(strategy.values())}. " + msg=f"Invalid confound types {list(strategy.values())}. " f"Valid confound types are {self._valid_confounds}.\n" f"If any of them is a valid parameter in " "nilearn.interfaces.fmriprep.load_confounds we may " @@ -175,45 +234,33 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): # Does not add any new keys return input - def _pick_confounds(self, input: Dict[str, Any]) -> pd.DataFrame: - """Select relevant confounds from the specified file.""" + def _map_adhoc_to_fmriprep(self, input: Dict[str, Any]): + """Map the adhoc format to the fmpriprep format spec. - confounds_format = input["format"] - if confounds_format == "adhoc": - self._map_adhoc_to_fmriprep(input) - elif confounds_format != "fmriprep": - raise ValueError(f"Invalid confounds format {confounds_format}") + Based on the spec, map the column names to match the fmriprep format. - processed_spec = self._process_fmriprep_spec(input) + It asumes that the data is valid, meaning that all the mapping + keys are in the confounds dataframe columns and all the mapped + values are valid fmriprep column names. - ( - to_select, - squares_to_compute, - derivatives_to_compute, - spike_name, - ) = processed_spec - # Copy the confounds - out_df = input["data"].copy() + This method modifies the dataframe in place. - # Add derivatives if needed - for t_dst, t_src in derivatives_to_compute.items(): - out_df[t_dst] = np.append(np.diff(out_df[t_src]), 0) + Parameters + ---------- + input : dict + Dictionary containing the following keys: + - data: the confounds file loaded in memory (dataframe) + - format: format of the confounds file (must be "adhoc") + - mappings: dictionary containing the mappings from the adhoc + format to the fmriprep format as a dictionary with key "fmriprep" - # Add squares (of base confounds and derivatives) if needed - for t_dst, t_src in squares_to_compute.items(): - out_df[t_dst] = out_df[t_src] ** 2 + """ - # add binary spike regressor if needed at given threshold - if self.spike is not None: - fd = out_df[spike_name].copy() - fd.loc[fd > self.spike] = 1 - fd.loc[fd != 1] = 0 - out_df["spike"] = fd - to_select.append("spike") + confounds_df = input["data"] + confounds_mapping = input["mappings"]["fmriprep"] - # Now pick all the relevant confounds - out_df = out_df[to_select] - return out_df + # Rename the columns + confounds_df.rename(columns=confounds_mapping, inplace=True) def _process_fmriprep_spec( self, input: Dict[str, Any] @@ -255,21 +302,8 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): squares_to_compute = {} # the dictionary of missing squares derivatives_to_compute = {} # the dictionary of missing derivatives - basics = { - "motion": [ - "trans_x", - "trans_y", - "trans_z", - "rot_x", - "rot_y", - "rot_z", - ], - "wm_csf": ["csf", "white_matter"], - "global_signal": ["global_signal"], - } - for t_kind, t_strategy in self.strategy.items(): - t_basics = basics[t_kind] + t_basics = FMRIPREP_BASICS[t_kind] if any(x not in available_vars for x in t_basics): missing = [x for x in t_basics if x not in available_vars] @@ -301,48 +335,54 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): if x_derivative_2 not in available_vars: squares_to_compute[x_derivative_2] = x_derivative spike_name = "framewise_displacement" - + if self.spike is not None: + if spike_name not in available_vars: + raise ValueError( + "Invalid confounds file. Missing framewise_displacement " + "(spike) confound. " + "Check if this file is really an fmriprep confounds file. " + "You can also deactivate spike (set spike = None)." + ) out = to_select, squares_to_compute, derivatives_to_compute, spike_name return out - def _map_adhoc_to_fmriprep(self, input: Dict[str, Any]): - """Map the adhoc format to the fmpriprep format spec. + def _pick_confounds(self, input: Dict[str, Any]) -> pd.DataFrame: + """Select relevant confounds from the specified file.""" - Based on the spec, map the column names to match the fmriprep format. + confounds_format = input["format"] + if confounds_format == "adhoc": + self._map_adhoc_to_fmriprep(input) - This method modifies the dataframe in place. + processed_spec = self._process_fmriprep_spec(input) - Parameters - ---------- - input : dict - Dictionary containing the following keys: - - path: path to the confounds file - - data: the confounds file loaded in memory (dataframe) - - format: format of the confounds file (must be "adhoc") - """ + ( + to_select, + squares_to_compute, + derivatives_to_compute, + spike_name, + ) = processed_spec + # Copy the confounds + out_df = input["data"].copy() - confounds_df = input["data"] + # Add derivatives if needed + for t_dst, t_src in derivatives_to_compute.items(): + out_df[t_dst] = np.append(np.diff(out_df[t_src]), 0) - # This is an - confounds_mapping = input["mappings"] + # Add squares (of base confounds and derivatives) if needed + for t_dst, t_src in squares_to_compute.items(): + out_df[t_dst] = out_df[t_src] ** 2 - # Check that all the required columns are present - missing = [ - x - for x in confounds_mapping.keys() - if x not in confounds_df.columns - ] + # add binary spike regressor if needed at given threshold + if self.spike is not None: + fd = out_df[spike_name].copy() + fd.loc[fd > self.spike] = 1 + fd.loc[fd != 1] = 0 + out_df["spike"] = fd + to_select.append("spike") - if len(missing) is not None: - raise ValueError( - "Invalid confounds file. Missing columns: " - f"{missing}. " - "Check if this file matches the adhoc specification for " - "this dataset." - ) - - # Rename the columns - confounds_df.rename(columns=confounds_mapping, inplace=True) + # Now pick all the relevant confounds + out_df = out_df[to_select] + return out_df def _remove_confounds( self, bold_img: "Nifti1Image", confounds_df: pd.DataFrame @@ -414,6 +454,53 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): f"\tConfounds: {len(confound_df)}" ) + if "format" not in input["BOLD_confounds"]: + raise_error( + "Confounds format must be specified in " + "input[\"BOLD_confounds\"]" + ) + + t_format = input["BOLD_confounds"]["format"] + + if t_format == "adhoc": + if "mappings" not in input["BOLD_confounds"]: + raise_error( + "When using adhoc format, you must specify " + "the variables names mappings in " + "input[\"BOLD_confounds\"][\"mappings\"]" + ) + if "fmriprep" not in input["BOLD_confounds"]["mappings"]: + raise_error( + "When using adhoc format, you must specify " + "the variables names mappings to fmriprep format in " + "input[\"BOLD_confounds\"][\"mappings\"][\"fmriprep\"]" + ) + fmriprep_mappings = input["BOLD_confounds"]["mappings"]["fmriprep"] + wrong_names = [ + x for x in fmriprep_mappings.values() + if x not in FMRIPREP_VALID_NAMES] + if len(wrong_names) > 0: + raise_error( + "The following mapping values are not valid fmriprep " + f"names: {wrong_names}" + ) + # Check that all the required columns are present + missing = [ + x + for x in fmriprep_mappings.keys() + if x not in confound_df.columns + ] + + if len(missing) is not None: + raise ValueError( + "Invalid confounds file. Missing columns: " + f"{missing}. " + "Check if this file matches the adhoc specification for " + "this dataset." + ) + elif t_format != "fmriprep": + raise ValueError(f"Invalid confounds format {t_format}") + # Check the column names of the dataframe and the spec # spec must be a dictionary: # { diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index 2dfe9a8f4..a6b9ec254 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -7,6 +7,9 @@ from numpy.testing import assert_array_equal, assert_raises +import pytest +import pandas as pd +import numpy as np from junifer.preprocess.confounds import FMRIPrepConfoundRemover from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber @@ -32,6 +35,189 @@ from junifer.datareader import DefaultDataReader # return img, mask +def test_FMRIPrepConfoundRemover_init() -> None: + """Test FMRIPrepConfoundRemover init.""" + + with pytest.raises(ValueError, match="keys must be strings"): + FMRIPrepConfoundRemover(strategy={1: "full"}) # type: ignore + + with pytest.raises(ValueError, match="values must be strings"): + FMRIPrepConfoundRemover(strategy={"motion": 1}) # type: ignore + + with pytest.raises(ValueError, match="component names"): + FMRIPrepConfoundRemover(strategy={"wrong": "full"}) + + with pytest.raises(ValueError, match="confound types"): + FMRIPrepConfoundRemover(strategy={"motion": "wrong"}) + + +def test_FMRIPrepConfoundRemover_validate_input() -> None: + """Test FMRIPrepConfoundRemover validate_input.""" + confound_remover = FMRIPrepConfoundRemover() + + # Input is valid when both BOLD and BOLD_confounds are present + + input = ["T1w"] + with pytest.raises(ValueError, match="not have the required data"): + confound_remover.validate_input(input) + + input = ["BOLD"] + with pytest.raises(ValueError, match="not have the required data"): + confound_remover.validate_input(input) + + input = ["BOLD", "T1w"] + with pytest.raises(ValueError, match="not have the required data"): + confound_remover.validate_input(input) + + input = ["BOLD", "T1w", "BOLD_confounds"] + confound_remover.validate_input(input) + + +def test_FMRIPrepConfoundRemover_get_output_kind() -> None: + """Test FMRIPrepConfoundRemover validate_input.""" + confound_remover = FMRIPrepConfoundRemover() + inputs = [ + ["BOLD", "T1w", "BOLD_confounds"], + ["BOLD", "VBM_GM", "BOLD_confounds"], + ["BOLD", "BOLD_confounds"], + ] + # Confound remover works in place + for input in inputs: + assert confound_remover.get_output_kind(input) == input + + +def test_FMRIPrepConfoundRemover__map_adhoc_to_fmriprep() -> None: + """Test FMRIPrepConfoundRemover adhoc to fmriprep spec mapping.""" + confound_remover = FMRIPrepConfoundRemover() + # Use non fmriprep variable names + adhoc_names = [f"var{i}" for i in range(6)] + adhoc_df = pd.DataFrame(np.random.randn(10, 6), columns=adhoc_names) + + # map them to valid variable names + fmriprep_names = [ + "trans_x", + "trans_y", + "trans_z", + "rot_x", + "rot_y", + "rot_z", + ] + + # Build mappings dictionary + mappings = {x: y for x, y in zip(adhoc_names, fmriprep_names)} + input = { + "mappings": {"fmriprep": mappings}, + "data" : adhoc_df, + } + + confound_remover._map_adhoc_to_fmriprep(input) + # This should work in-place + assert adhoc_df.columns.tolist() == fmriprep_names + + +def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: + """Test FMRIPrepConfoundRemover fmriprep spec processing.""" + + # Test one strategy, full, no spike + confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) + + var_names = [ + "csf", "white_matter", "csf_power2", "white_matter_power2", + "csf_derivative1", "white_matter_derivative1", + "csf_derivative1_power2", "white_matter_derivative1_power2"] + + confounds_df = pd.DataFrame( + np.random.randn(7, len(var_names)), columns=var_names) + + out = confound_remover._process_fmriprep_spec({"data": confounds_df}) + to_select, sq_to_compute, der_to_compute, spike_name = out + assert set(to_select) == set(var_names) + assert len(sq_to_compute) == 0 + assert len(der_to_compute) == 0 + assert spike_name == "framewise_displacement" + + # Same strategy, but derivatives are not present + var_names = [ + "csf", "white_matter", "csf_power2", "white_matter_power2"] + missing_der_names = ["csf_derivative1", "white_matter_derivative1"] + missing_sq_names = [ + "csf_derivative1_power2", "white_matter_derivative1_power2"] + + all_names = var_names + missing_der_names + missing_sq_names + + confounds_df = pd.DataFrame( + np.random.randn(7, len(var_names)), columns=var_names) + out = confound_remover._process_fmriprep_spec({"data": confounds_df}) + to_select, sq_to_compute, der_to_compute, spike_name = out + assert set(to_select) == set(all_names) + assert set(sq_to_compute) == set(missing_sq_names) + assert set(der_to_compute) == set(missing_der_names) + assert spike_name == "framewise_displacement" + + # Same strategy, with spike, only basics are present + confound_remover = FMRIPrepConfoundRemover( + strategy={"wm_csf": "full"}, spike=0.2) + + var_names = ["csf", "white_matter"] + missing_der_names = ["csf_derivative1", "white_matter_derivative1"] + missing_sq_names = [ + "csf_power2", "white_matter_power2", + "csf_derivative1_power2", "white_matter_derivative1_power2"] + + all_names = var_names + missing_der_names + missing_sq_names + + confounds_df = pd.DataFrame( + np.random.randn(7, len(var_names) + 1), + columns=var_names + ["framewise_displacement"]) + out = confound_remover._process_fmriprep_spec({"data": confounds_df}) + to_select, sq_to_compute, der_to_compute, spike_name = out + assert set(to_select) == set(all_names) + assert set(sq_to_compute) == set(missing_sq_names) + assert set(der_to_compute) == set(missing_der_names) + assert spike_name == "framewise_displacement" + + # Two component strategy, mixed confounds, no spike + confound_remover = FMRIPrepConfoundRemover( + strategy={"wm_csf": "power2", "global_signal": "full"}) + + var_names = ["csf", "white_matter", "global_signal"] + missing_der_names = ["global_signal_derivative1"] + missing_sq_names = [ + "csf_power2", "white_matter_power2", "global_signal_power2", + "global_signal_derivative1_power2"] + + all_names = var_names + missing_der_names + missing_sq_names + + confounds_df = pd.DataFrame( + np.random.randn(7, len(var_names)), columns=var_names) + out = confound_remover._process_fmriprep_spec({"data": confounds_df}) + to_select, sq_to_compute, der_to_compute, spike_name = out + assert set(to_select) == set(all_names) + assert set(sq_to_compute) == set(missing_sq_names) + assert set(der_to_compute) == set(missing_der_names) + assert spike_name == "framewise_displacement" + + # Test for wrong columns/strategy pairs + + confound_remover = FMRIPrepConfoundRemover( + strategy={"wm_csf": "full"}, spike=0.2) + var_names = ["csf"] + confounds_df = pd.DataFrame( + np.random.randn(7, len(var_names)), columns=var_names) + + msg = r"Missing basic confounds: \['white_matter'\]" + with pytest.raises(ValueError, match=msg): + confound_remover._process_fmriprep_spec({"data": confounds_df}) + + var_names = ["csf", "white_matter"] + confounds_df = pd.DataFrame( + np.random.randn(7, len(var_names)), columns=var_names) + + msg = r"Missing framewise_displacement" + with pytest.raises(ValueError, match=msg): + confound_remover._process_fmriprep_spec({"data": confounds_df}) + + def test_FMRIPrepConfoundRemover_allpresent() -> None: """Test FMRIPrepConfoundRemover with all confounds present.""" -- 2.52.0 From a15f8fc9cedd2fba97f45bcdfe95b8a3e94a1197 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 27 Oct 2022 12:14:57 +0300 Subject: [PATCH 122/142] codespell --- junifer/preprocess/confounds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index b753590c7..6ed35ae39 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -239,7 +239,7 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): Based on the spec, map the column names to match the fmriprep format. - It asumes that the data is valid, meaning that all the mapping + It assumes that the data is valid, meaning that all the mapping keys are in the confounds dataframe columns and all the mapped values are valid fmriprep column names. -- 2.52.0 From 4a833e27def48f3fda8eec1b359c43a9e28bf2c7 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 29 Oct 2022 20:39:47 +0300 Subject: [PATCH 123/142] Code ready, needs DOC --- junifer/preprocess/base.py | 182 ++++++ junifer/preprocess/confounds.py | 412 +++++--------- junifer/preprocess/tests/test_confounds.py | 623 ++++++++++----------- junifer/testing/datagrabbers.py | 5 +- 4 files changed, 616 insertions(+), 606 deletions(-) create mode 100644 junifer/preprocess/base.py diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py new file mode 100644 index 000000000..6e710dbe6 --- /dev/null +++ b/junifer/preprocess/base.py @@ -0,0 +1,182 @@ +"""Provide base class for preprocessor.""" + +# Authors: Federico Raimondo +# Synchon Mandal +# License: AGPL + +from abc import ABC, abstractmethod +from typing import Dict, List, Optional, Union, Tuple, Any + + +from ..pipeline import PipelineStepMixin +from ..utils import logger, raise_error + + +class BasePreprocessor(ABC, PipelineStepMixin): + """Abstract base class for all preprocessors. + + Parameters + ---------- + on : str or list of str + The kind of data to apply the preprocessor to. If None, + will work on all available data (default: None). + + """ + + def __init__( + self, + on: Optional[Union[List[str], str]] = None, + ) -> None: + """Initialize the class.""" + if on is None: + on = self.get_valid_inputs() + if not isinstance(on, list): + on = [on] + + if any(x not in self.get_valid_inputs() for x in on): + name = self.__class__.__name__ + wrong_on = [x for x in on if x not in self.get_valid_inputs()] + raise ValueError(f"{name} cannot be computed on {wrong_on}") + self._on = on + + def validate_input(self, input: List[str]) -> None: + """Validate input. + + Parameters + ---------- + input : list of str + The input to the pipeline step. The list must contain the + available Junifer Data dictionary keys. + + Raises + ------ + ValueError + If the input does not have the required data. + + """ + if not any(x in input for x in self._on): + raise_error( + "Input does not have the required data." + f"\t Input: {input}" + f"\t Required (any of): {self._on}" + ) + + @abstractmethod + def get_output_kind(self, input: List[str]) -> List[str]: + """Get output kind. + + Parameters + ---------- + input : list of str + The input to the marker. The list must contain the + available Junifer Data dictionary keys. + + Returns + ------- + list of str + The updated list of output kinds, as storage possibilities. + + """ + raise_error( + msg="Concrete classes need to implement get_output_kind().", + klass=NotImplementedError, + ) + + def get_valid_inputs(self) -> List[str]: + """Get valid data types for input. + + Returns + ------- + list of str + The list of data types that can be used as input for this marker + + """ + raise_error( + msg="Concrete classes need to implement get_valid_inputs().", + klass=NotImplementedError, + ) + + def get_meta(self, kind: str) -> Dict: + """Get metadata. + + Parameters + ---------- + kind : str + The kind of pipeline step. + + Returns + ------- + dict + The metadata as a dictionary with the only key 'marker'. + + """ + s_meta = super().get_meta() + # same marker can be "fit"ted into different kinds, so the name + # is created from the kind and the name of the marker + s_meta["kind"] = kind + return {"preprocess": s_meta} + + def fit_transform( + self, + input: Dict[str, Dict], + ) -> Dict: + """Fit and transform. + + Parameters + ---------- + input : dict + The Junifer Data object. + + Returns + ------- + dict + The processed output as a dictionary. + + """ + out = input + for kind in self._on: + if kind in input.keys(): + logger.info(f"Computing {kind}") + t_input = input[kind] + extra_input = input.copy() + extra_input.pop(kind) + t_meta = t_input.get("meta", {}) # input kind meta + t_meta.update(self.get_meta(kind)) + key, t_out = self.preprocess( + input=t_input, extra_input=extra_input) + t_out.update(meta=t_meta) + out[key] = t_out + return out + + @abstractmethod + def preprocess( + self, + input: Dict[str, Any], + extra_input: Optional[Dict[str, Any]] = None, + ) -> Tuple[str, Dict[str, Any]]: + """Preprocess. + + Parameters + ---------- + input : Dict[str, Dict] + A single input from the pipeline data object in which to compute + the marker. + extra_input : Dict, optional + The other fields in the pipeline data object. Useful for accessing + other data kind that needs to be used in the computation. For + example, the functional connectivity markers can make use of the + confounds if available (default None). + + Returns + ------- + key : str + The key to store the output in the Junifer Data object. + object : dict + The computed result as dictionary. This will be stored in the + Junifer Data object under the key 'key'. + + """ + raise_error( + msg="Concrete classes need to implement preprocess().", + klass=NotImplementedError, + ) diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index 6ed35ae39..8b9eb5fff 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -13,7 +13,7 @@ from nilearn._utils.niimg_conversions import check_niimg_4d from nilearn.image import clean_img from nilearn.masking import compute_brain_mask -from ..pipeline import PipelineStepMixin +from .base import BasePreprocessor from ..utils import logger, raise_error @@ -74,13 +74,19 @@ FMRIPREP_DERIVATIVES_POWER2 = { } FMRIPREP_VALID_NAMES = [ - elem for x in [FMRIPREP_BASICS, FMRIPREP_POWER2, FMRIPREP_DERIVATIVES, - FMRIPREP_DERIVATIVES_POWER2] + elem + for x in [ + FMRIPREP_BASICS, + FMRIPREP_POWER2, + FMRIPREP_DERIVATIVES, + FMRIPREP_DERIVATIVES_POWER2, + ] for t_list in x.values() - for elem in t_list] + for elem in t_list +] -class FMRIPrepConfoundRemover(PipelineStepMixin): +class FMRIPrepConfoundRemover(BasePreprocessor): """Class for confound removal. Read confound files and select columns according to @@ -129,12 +135,9 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): """ - # lower priority # TODO: implement more strategies from - # nilearn.interfaces.fmriprep.load_confounds for Felix's confound files, + # nilearn.interfaces.fmriprep.load_confounds, # in particular scrubbing - # TODO: Implement read_confounds for fmriprep data - def __init__( self, strategy: Optional[Dict[str, str]] = None, @@ -147,6 +150,7 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): mask_img: Optional["Nifti1Image"] = None, ) -> None: """Initialise the class.""" + super().__init__() if strategy is None: strategy = { "motion": "full", @@ -234,6 +238,17 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): # Does not add any new keys return input + def get_valid_inputs(self) -> List[str]: + """Get the valid inputs for the pipeline step. + + Returns + ------- + list of str + The valid inputs for the pipeline step. + + """ + return ["BOLD"] + def _map_adhoc_to_fmriprep(self, input: Dict[str, Any]): """Map the adhoc format to the fmpriprep format spec. @@ -384,6 +399,88 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): out_df = out_df[to_select] return out_df + def _validate_data( + self, + input: Dict[str, Any], + extra_input: Optional[Dict[str, Any]] = None, + ) -> None: + """Validate input data.""" + + # Bold must be 4D niimg + check_niimg_4d(input["data"]) + + if extra_input is None: + raise_error("No extra input provided", ValueError) + if "BOLD_confounds" not in extra_input: + raise_error("No BOLD_confounds provided", ValueError) + if "data" not in extra_input["BOLD_confounds"]: + raise_error("No BOLD_confounds data provided", ValueError) + # Confounds must be a dataframe + if not isinstance(extra_input["BOLD_confounds"]["data"], pd.DataFrame): + raise_error( + "Confounds data must be a pandas dataframe", ValueError + ) + + confound_df = extra_input["BOLD_confounds"]["data"] + bold_img = input["data"] + if bold_img.get_fdata().shape[3] != len(confound_df): + raise_error( + "Image time series and confounds have different length!\n" + f"\tImage time series: { bold_img.get_fdata().shape[3]}\n" + f"\tConfounds: {len(confound_df)}" + ) + + if "format" not in extra_input["BOLD_confounds"]: + raise_error( + "Confounds format must be specified in " + 'input["BOLD_confounds"]' + ) + + t_format = extra_input["BOLD_confounds"]["format"] + + if t_format == "adhoc": + if "mappings" not in extra_input["BOLD_confounds"]: + raise_error( + "When using adhoc format, you must specify " + "the variables names mappings in " + 'input["BOLD_confounds"]["mappings"]' + ) + if "fmriprep" not in extra_input["BOLD_confounds"]["mappings"]: + raise_error( + "When using adhoc format, you must specify " + "the variables names mappings to fmriprep format in " + 'input["BOLD_confounds"]["mappings"]["fmriprep"]' + ) + fmriprep_mappings = extra_input["BOLD_confounds"]["mappings"][ + "fmriprep" + ] + wrong_names = [ + x + for x in fmriprep_mappings.values() + if x not in FMRIPREP_VALID_NAMES + ] + if len(wrong_names) > 0: + raise_error( + "The following mapping values are not valid fmriprep " + f"names: {wrong_names}" + ) + # Check that all the required columns are present + missing = [ + x + for x in fmriprep_mappings.keys() + if x not in confound_df.columns + ] + + if len(missing) is not None: + raise ValueError( + "Invalid confounds file. Missing columns: " + f"{missing}. " + "Check if this file matches the adhoc specification for " + "this dataset." + ) + elif t_format != "fmriprep": + raise ValueError(f"Invalid confounds format {t_format}") + def _remove_confounds( self, bold_img: "Nifti1Image", confounds_df: pd.DataFrame ) -> Union["Nifti1Image", "Nifti2Image", "MGHImage", List]: @@ -421,6 +518,11 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): logger.info("Computing brain mask from image") mask_img = compute_brain_mask(bold_img) + logger.info("Cleaning image") + logger.debug(f"\tdetrend: {self.detrend}") + logger.debug(f"\tstandardize: {self.standardize}") + logger.debug(f"\tlow_pass: {self.low_pass}") + logger.debug(f"\thigh_pass: {self.high_pass}") clean_bold = clean_img( imgs=bold_img, detrend=self.detrend, @@ -434,268 +536,36 @@ class FMRIPrepConfoundRemover(PipelineStepMixin): return clean_bold - def _validate_data(self, input: Dict[str, Any]): - """Validate input data.""" - # Bold must be 4D niimg - check_niimg_4d(input["BOLD"]["data"]) + def preprocess( + self, + input: Dict[str, Any], + extra_input: Optional[Dict[str, Any]] = None, + ) -> Tuple[str, Dict[str, Any]]: + """Preprocess. - # Confounds must be a dataframe - if not isinstance(input["BOLD_confounds"]["data"], pd.DataFrame): - raise_error( - "Confounds data must be a pandas dataframe", ValueError - ) + Parameters + ---------- + input : Dict[str, Dict] + A single input from the pipeline data object in which to compute + the marker. + extra_input : Dict, optional + The other fields in the pipeline data object. Useful for accessing + other data kind that needs to be used in the computation. For + example, the functional connectivity markers can make use of the + confounds if available (default None). - confound_df = input["BOLD_confounds"]["data"] - bold_img = input["BOLD"]["data"] - if bold_img.get_fdata().shape[3] != len(confound_df): - raise_error( - "Image time series and confounds have different length!\n" - f"\tImage time series: { bold_img.get_fdata().shape[3]}\n" - f"\tConfounds: {len(confound_df)}" - ) + Returns + ------- + key : str + The key to store the output in the Junifer Data object. + object : dict + The computed result as dictionary. This will be stored in the + Junifer Data object under the key 'key'. - if "format" not in input["BOLD_confounds"]: - raise_error( - "Confounds format must be specified in " - "input[\"BOLD_confounds\"]" - ) - - t_format = input["BOLD_confounds"]["format"] - - if t_format == "adhoc": - if "mappings" not in input["BOLD_confounds"]: - raise_error( - "When using adhoc format, you must specify " - "the variables names mappings in " - "input[\"BOLD_confounds\"][\"mappings\"]" - ) - if "fmriprep" not in input["BOLD_confounds"]["mappings"]: - raise_error( - "When using adhoc format, you must specify " - "the variables names mappings to fmriprep format in " - "input[\"BOLD_confounds\"][\"mappings\"][\"fmriprep\"]" - ) - fmriprep_mappings = input["BOLD_confounds"]["mappings"]["fmriprep"] - wrong_names = [ - x for x in fmriprep_mappings.values() - if x not in FMRIPREP_VALID_NAMES] - if len(wrong_names) > 0: - raise_error( - "The following mapping values are not valid fmriprep " - f"names: {wrong_names}" - ) - # Check that all the required columns are present - missing = [ - x - for x in fmriprep_mappings.keys() - if x not in confound_df.columns - ] - - if len(missing) is not None: - raise ValueError( - "Invalid confounds file. Missing columns: " - f"{missing}. " - "Check if this file matches the adhoc specification for " - "this dataset." - ) - elif t_format != "fmriprep": - raise ValueError(f"Invalid confounds format {t_format}") - - # Check the column names of the dataframe and the spec - # spec must be a dictionary: - # { - # 'motion': { - # 'basic': [(list of columns)] - # 'power2', [(list of columns)] - # 'derivatives', [(list of columns)] - # 'full', [(list of columns)]}, - # 'wm_csf': { - # 'basic': [(list of columns)] - # 'power2', [(list of columns)] - # 'derivatives', [(list of columns)] - # 'full', [(list of columns)]} - # 'global_signal': { - # 'basic': [(list of columns)] - # 'power2', [(list of columns)] - # 'derivatives', [(list of columns)] - # 'full', [(list of columns)]} - # } - - # # Check the columns in the dataframe - # conf_spec = input["confounds"]["names"]["spec"] - # if any(x not in conf_spec.keys() for x in self._valid_components): - # raise_error( - # "All of the component types must be in the confounds data " - # "object `spec`. Please check your datagrabber.", - # ValueError, - # ) - - # if any( - # x not in v.keys() - # for x in self._valid_confounds - # for v in conf_spec.values() - # ): - # raise_error( - # "All of the confound types must be in the confounds data " - # "object `spec`. Please check your datagrabber.", - # ValueError, - # ) - - # spike_name = input["confounds"]["names"]["spike"] - - # derivatives_to_compute = input["confounds"]["names"].get( - # "derivatives", {} - # ) - # if not (isinstance(derivatives_to_compute, dict)): - # raise_error( - # 'input["confounds"]["names"]["derivatives"] ' - # "must be a dictionary. Please check your datagrabber", - # ValueError, - # ) - - # if any( - # not (isinstance(k, str) or isinstance(v, str)) - # for k, v in derivatives_to_compute.items() - # ): - # raise_error( - # 'input["confounds"]["names"]["derivatives"] ' - # "must be a dictionary with string keys and values. " - # "Please check your datagrabber", - # ValueError, - # ) - - # missing_derivatives = [ - # x - # for x in derivatives_to_compute.values() - # if x not in confound_df.columns - # ] - # if len(missing_derivatives) > 0: - # raise_error( - # "Some of the derivatives to calculate are not in the " - # "confounds" - # f" dataframe: {missing_derivatives}." - # "Please check your data " - # f'({input["confounds"]["path"].as_posix()}) ' - # "and the datagrabber.", - # ValueError, - # ) - - # t_conf_spec = { - # k: input["confounds"]["names"]["spec"][k][v] - # for k, v in self.strategy.items() - # } - - # column_names = set([x for y in t_conf_spec.values() for x in y]) - # column_names.add(spike_name) - - # missing_columns = [ - # x - # for x in column_names - # if x not in confound_df.columns - # and x not in derivatives_to_compute.keys() - # ] - - # if len(missing_columns) > 0: - # raise_error( - # "Some of the columns in the confound spec are not in the " - # f"confounds dataframe: {missing_columns}. " - # "Please check your data " - # f'({input["confounds"]["path"].as_posix()}) ' - # "and the datagrabber.", - # ValueError, - # ) - - # TODO: complete type annotations - def fit_transform(self, input): - """Fit and transform.""" - self._validate_data(input) - bold_img = input["BOLD"]["data"] - confounds_df = self._pick_confounds(input["BOLD_confounds"]) - input["BOLD"]["data"] = self._remove_confounds(bold_img, confounds_df) - - # TODO: Update meta - return input - - -# class FelixConfoundRemover(BaseConfoundRemover): -# """ A class to read confounds from confound files generated by Felix's -# pipeline using CAT and some other custom scripts. It is meant to emulate -# the new nilearn.interfaces.fmriprep.load_confounds as closely as -# possible. - -# """ - -# def read_confounds(self, confound_dataframe): - -# confounds_to_select = [] -# # for some confounds we need to manually calculate derivatives using -# # numpy and add them to the output -# derivatives_to_compute = [] - -# for comp, param in self.strategy.items(): -# if comp == 'motion': -# confounds = [] -# # there should be six rigid body parameters -# for i in range(1, 7): -# # select basic -# confounds_to_select.append(f'RP.{i}') - -# # select squares -# if param in ['power2', 'full']: -# confounds_to_select.append(f'RP^2.{i}') - -# # select derivatives -# if param in ['derivatives', 'full']: -# confounds_to_select.append(f'DRP.{i}') - -# # if 'full' we should not forget the derivative -# # of the squares -# if param in ['full']: -# confounds_to_select.append(f'DRP^2.{i}') - -# elif comp == 'wm_csf': -# confounds = ['WM', 'CSF'] -# elif comp == 'global_signal': -# confounds = ['GS'] - -# for conf in confounds: - -# confounds_to_select.append(conf) - -# # select squares -# if param in ['power2', 'full']: -# confounds_to_select.append(f'{conf}^2') - -# # we have to calculate derivatives (not included in felix' -# # confound files) -# if param in ['derivatives', 'full']: -# derivatives_to_compute.append(conf) - -# if param in ['full']: -# derivatives_to_compute.append(f'{conf}^2') - -# confounds_to_remove = confound_dataframe[confounds_to_select] - -# # calc additional derivatives -# for conf in derivatives_to_compute: -# confounds_to_remove[f'D{conf}'] = np.append( -# np.diff(confound_dataframe[conf]), 0 -# ) - -# # add binary spike regressor if needed at given threshold -# if self.spike is not None: -# fd = confound_dataframe["FD"].copy() -# fd.loc[fd > self.spike] = 1 -# fd.loc[fd != 1] = 0 -# confounds_to_remove['spike'] = fd - -# return confounds_to_remove - - -# class FmriprepConfoundRemover(BaseConfoundRemover): -# """ A ConfoundRemover class for fmriprep output utilising -# nilearn's nilearn.interfaces.fmriprep.load_confounds -# """ - -# def read_confounds(self): -# raise NotImplementedError('read_confounds not implemented') + """ + self._validate_data(input, extra_input) + assert extra_input is not None + bold_img = input["data"] + confounds_df = self._pick_confounds(extra_input["BOLD_confounds"]) + input["data"] = self._remove_confounds(bold_img, confounds_df) + return "BOLD", input diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index a6b9ec254..e28826879 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -5,14 +5,21 @@ # Synchon Mandal # License: AGPL - +import typing from numpy.testing import assert_array_equal, assert_raises import pytest import pandas as pd +from pandas.testing import assert_frame_equal import numpy as np +import nibabel as nib +from nilearn._utils.exceptions import DimensionError + from junifer.preprocess.confounds import FMRIPrepConfoundRemover -from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber +from junifer.testing.datagrabbers import ( + OasisVBMTestingDatagrabber, + PartlyCloudyTestingDataGrabber, +) from junifer.datareader import DefaultDataReader # Set RNG seed for reproducibility @@ -107,7 +114,7 @@ def test_FMRIPrepConfoundRemover__map_adhoc_to_fmriprep() -> None: mappings = {x: y for x, y in zip(adhoc_names, fmriprep_names)} input = { "mappings": {"fmriprep": mappings}, - "data" : adhoc_df, + "data": adhoc_df, } confound_remover._map_adhoc_to_fmriprep(input) @@ -122,12 +129,19 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) var_names = [ - "csf", "white_matter", "csf_power2", "white_matter_power2", - "csf_derivative1", "white_matter_derivative1", - "csf_derivative1_power2", "white_matter_derivative1_power2"] + "csf", + "white_matter", + "csf_power2", + "white_matter_power2", + "csf_derivative1", + "white_matter_derivative1", + "csf_derivative1_power2", + "white_matter_derivative1_power2", + ] confounds_df = pd.DataFrame( - np.random.randn(7, len(var_names)), columns=var_names) + np.random.randn(7, len(var_names)), columns=var_names + ) out = confound_remover._process_fmriprep_spec({"data": confounds_df}) to_select, sq_to_compute, der_to_compute, spike_name = out @@ -137,16 +151,18 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: assert spike_name == "framewise_displacement" # Same strategy, but derivatives are not present - var_names = [ - "csf", "white_matter", "csf_power2", "white_matter_power2"] + var_names = ["csf", "white_matter", "csf_power2", "white_matter_power2"] missing_der_names = ["csf_derivative1", "white_matter_derivative1"] missing_sq_names = [ - "csf_derivative1_power2", "white_matter_derivative1_power2"] + "csf_derivative1_power2", + "white_matter_derivative1_power2", + ] all_names = var_names + missing_der_names + missing_sq_names confounds_df = pd.DataFrame( - np.random.randn(7, len(var_names)), columns=var_names) + np.random.randn(7, len(var_names)), columns=var_names + ) out = confound_remover._process_fmriprep_spec({"data": confounds_df}) to_select, sq_to_compute, der_to_compute, spike_name = out assert set(to_select) == set(all_names) @@ -156,19 +172,24 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: # Same strategy, with spike, only basics are present confound_remover = FMRIPrepConfoundRemover( - strategy={"wm_csf": "full"}, spike=0.2) + strategy={"wm_csf": "full"}, spike=0.2 + ) var_names = ["csf", "white_matter"] missing_der_names = ["csf_derivative1", "white_matter_derivative1"] missing_sq_names = [ - "csf_power2", "white_matter_power2", - "csf_derivative1_power2", "white_matter_derivative1_power2"] + "csf_power2", + "white_matter_power2", + "csf_derivative1_power2", + "white_matter_derivative1_power2", + ] all_names = var_names + missing_der_names + missing_sq_names confounds_df = pd.DataFrame( np.random.randn(7, len(var_names) + 1), - columns=var_names + ["framewise_displacement"]) + columns=var_names + ["framewise_displacement"], + ) out = confound_remover._process_fmriprep_spec({"data": confounds_df}) to_select, sq_to_compute, der_to_compute, spike_name = out assert set(to_select) == set(all_names) @@ -178,18 +199,23 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: # Two component strategy, mixed confounds, no spike confound_remover = FMRIPrepConfoundRemover( - strategy={"wm_csf": "power2", "global_signal": "full"}) + strategy={"wm_csf": "power2", "global_signal": "full"} + ) var_names = ["csf", "white_matter", "global_signal"] missing_der_names = ["global_signal_derivative1"] missing_sq_names = [ - "csf_power2", "white_matter_power2", "global_signal_power2", - "global_signal_derivative1_power2"] + "csf_power2", + "white_matter_power2", + "global_signal_power2", + "global_signal_derivative1_power2", + ] all_names = var_names + missing_der_names + missing_sq_names confounds_df = pd.DataFrame( - np.random.randn(7, len(var_names)), columns=var_names) + np.random.randn(7, len(var_names)), columns=var_names + ) out = confound_remover._process_fmriprep_spec({"data": confounds_df}) to_select, sq_to_compute, der_to_compute, spike_name = out assert set(to_select) == set(all_names) @@ -200,10 +226,12 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: # Test for wrong columns/strategy pairs confound_remover = FMRIPrepConfoundRemover( - strategy={"wm_csf": "full"}, spike=0.2) + strategy={"wm_csf": "full"}, spike=0.2 + ) var_names = ["csf"] confounds_df = pd.DataFrame( - np.random.randn(7, len(var_names)), columns=var_names) + np.random.randn(7, len(var_names)), columns=var_names + ) msg = r"Missing basic confounds: \['white_matter'\]" with pytest.raises(ValueError, match=msg): @@ -211,14 +239,239 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: var_names = ["csf", "white_matter"] confounds_df = pd.DataFrame( - np.random.randn(7, len(var_names)), columns=var_names) + np.random.randn(7, len(var_names)), columns=var_names + ) msg = r"Missing framewise_displacement" with pytest.raises(ValueError, match=msg): confound_remover._process_fmriprep_spec({"data": confounds_df}) -def test_FMRIPrepConfoundRemover_allpresent() -> None: +def test_FMRIPrepConfoundRemover__pick_confounds_adhoc() -> None: + """Test FMRIPrepConfoundRemover pick confounds on adhoc confounds.""" + confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) + # Use non fmriprep variable names + adhoc_names = [f"var{i}" for i in range(2)] + adhoc_df = pd.DataFrame(np.random.randn(10, 2), columns=adhoc_names) + + # map them to valid variable names + fmriprep_names = ["csf", "white_matter"] + fmriprep_all_vars = [ + "csf", + "white_matter", + "csf_power2", + "white_matter_power2", + "csf_derivative1", + "white_matter_derivative1", + "csf_derivative1_power2", + "white_matter_derivative1_power2", + ] + + # Build mappings dictionary + mappings = {x: y for x, y in zip(adhoc_names, fmriprep_names)} + input = { + "mappings": {"fmriprep": mappings}, + "data": adhoc_df, + "format": "adhoc", + } + + out = confound_remover._pick_confounds(input) + assert set(out.columns) == set(fmriprep_all_vars) + + +def test_FMRIPRepConfoundRemover__pick_confounds_fmriprep() -> None: + """Test FMRIPrepConfoundRemover pick confounds on fmriprep confounds.""" + confound_remover = FMRIPrepConfoundRemover( + strategy={"wm_csf": "full"}, spike=0.2 + ) + fmriprep_all_vars = [ + "csf", + "white_matter", + "csf_power2", + "white_matter_power2", + "csf_derivative1", + "white_matter_derivative1", + "csf_derivative1_power2", + "white_matter_derivative1_power2", + ] + + reader = DefaultDataReader() + out1, out2 = None, None + with PartlyCloudyTestingDataGrabber() as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + out1 = confound_remover._pick_confounds(input["BOLD_confounds"]) + assert set(out1.columns) == set(fmriprep_all_vars + ["spike"]) + + with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + out2 = confound_remover._pick_confounds(input["BOLD_confounds"]) + assert set(out2.columns) == set(fmriprep_all_vars + ["spike"]) + + assert_frame_equal(out1, out2) + # TODO: Test if fmriprep returns the same derivatives/power2 as we compute + + +def test_FMRIPrepConfoundRemover__validate_data() -> None: + """Test FMRIPrepConfoundRemover validate data.""" + confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) + reader = DefaultDataReader() + with OasisVBMTestingDatagrabber() as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + new_input = input["VBM_GM"] + with pytest.raises( + DimensionError, match="incompatible dimensionality" + ): + confound_remover._validate_data(new_input, None) + + with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + new_input = input["BOLD"] + + with pytest.raises(ValueError, match="No extra input"): + confound_remover._validate_data(new_input, None) + with pytest.raises(ValueError, match="No BOLD_confounds provided"): + confound_remover._validate_data(new_input, {}) + with pytest.raises( + ValueError, match="No BOLD_confounds data provided" + ): + confound_remover._validate_data(new_input, {"BOLD_confounds": {}}) + + extra_input = { + "BOLD_confounds": {"data": "wrong"}, + } + msg = "must be a pandas dataframe" + with pytest.raises(ValueError, match=msg): + confound_remover._validate_data(new_input, extra_input) + + extra_input = {"BOLD_confounds": {"data": pd.DataFrame()}} + with pytest.raises(ValueError, match="Image time series and"): + confound_remover._validate_data(new_input, extra_input) + + extra_input = { + "BOLD_confounds": {"data": input["BOLD_confounds"]["data"]} + } + with pytest.raises(ValueError, match="format must be specified"): + confound_remover._validate_data(new_input, extra_input) + + extra_input = { + "BOLD_confounds": { + "data": input["BOLD_confounds"]["data"], + "format": "wrong", + } + } + with pytest.raises(ValueError, match="Invalid confounds format wrong"): + confound_remover._validate_data(new_input, extra_input) + + extra_input = { + "BOLD_confounds": { + "data": input["BOLD_confounds"]["data"], + "format": "adhoc", + } + } + with pytest.raises(ValueError, match="variables names mappings"): + confound_remover._validate_data(new_input, extra_input) + + extra_input = { + "BOLD_confounds": { + "data": input["BOLD_confounds"]["data"], + "format": "adhoc", + "mappings": {}, + } + } + with pytest.raises(ValueError, match="mappings to fmriprep"): + confound_remover._validate_data(new_input, extra_input) + + extra_input = { + "BOLD_confounds": { + "data": input["BOLD_confounds"]["data"], + "format": "adhoc", + "mappings": { + "fmriprep": { + "rot_x": "wrong", + "rot_y": "rot_z", + "rot_z": "rot_y", + } + }, + } + } + with pytest.raises(ValueError, match=r"names: \['wrong'\]"): + confound_remover._validate_data(new_input, extra_input) + + extra_input = { + "BOLD_confounds": { + "data": input["BOLD_confounds"]["data"], + "format": "adhoc", + "mappings": { + "fmriprep": { + "wrong": "rot_x", + "rot_y": "rot_z", + "rot_z": "rot_y", + } + }, + } + } + with pytest.raises(ValueError, match=r"Missing columns: \['wrong'\]"): + confound_remover._validate_data(new_input, extra_input) + + +def test_FMRIPrepConfoundRemover__remove_confounds() -> None: + """Test FMRIPrepConfoundRemover remove confounds.""" + confound_remover = FMRIPrepConfoundRemover( + strategy={"wm_csf": "full"}, spike=0.2 + ) + reader = DefaultDataReader() + with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + confounds = confound_remover._pick_confounds(input["BOLD_confounds"]) + raw_bold = input["BOLD"]["data"] + clean_bold = confound_remover._remove_confounds( + bold_img=raw_bold, confounds_df=confounds + ) + clean_bold = typing.cast(nib.Nifti1Image, clean_bold) + # TODO: Find a better way to test functionality here + assert ( + clean_bold.header.get_zooms() # type: ignore + == raw_bold.header.get_zooms() + ) + assert clean_bold.get_fdata().shape == raw_bold.get_fdata().shape + # TODO: Test confound remover with mask, needs #79 to be implemented + + +def test_FMRIPrepConfoundRemover_preprocess() -> None: + """Test FMRIPrepConfoundRemover with all confounds present.""" + + # need reader for the data + reader = DefaultDataReader() + # All strategies full, no spike + confound_remover = FMRIPrepConfoundRemover() + + with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: + input = dg["sub-01"] + input = reader.fit_transform(input) + orig_bold = input["BOLD"]["data"].get_fdata().copy() + pre_input = input["BOLD"] + pre_extra_input = {"BOLD_confounds": input["BOLD_confounds"]} + key, output = confound_remover.preprocess(pre_input, pre_extra_input) + trans_bold = output["data"].get_fdata() + # Transformation is in place + assert_array_equal(trans_bold, input["BOLD"]["data"].get_fdata()) + + # Data should have the same shape + assert orig_bold.shape == trans_bold.shape + + # but be different + assert_raises( + AssertionError, assert_array_equal, orig_bold, trans_bold + ) + assert key == "BOLD" + + +def test_FMRIPrepConfoundRemover_fit_transform() -> None: """Test FMRIPrepConfoundRemover with all confounds present.""" # need reader for the data @@ -237,315 +490,23 @@ def test_FMRIPrepConfoundRemover_allpresent() -> None: # Data should have the same shape assert orig_bold.shape == trans_bold.shape + + # but be different assert_raises( AssertionError, assert_array_equal, orig_bold, trans_bold ) - -# # TODO: split the tests -# def test_baseconfoundremover() -> None: -# """Test BaseConfoundRemover.""" -# # Generate a simulated BOLD img -# siimg, simsk = _simu_img() - -# # generate random confound dataframe with Felix's column naming - -# motion_basic = [f"RP.{i}" for i in range(1, 7)] -# motion_power2 = [f"RP^2.{i}" for i in range(1, 7)] -# motion_derivatives = [f"DRP.{i}" for i in range(1, 7)] -# motion_full = [f"DRP^2.{i}" for i in range(1, 7)] - -# wm_csf_basic = ["WM", "CSF"] -# wm_csf_power2 = ["WM^2", "CSF^2"] -# wm_csf_derivatives = ["DWM", "DCSF"] -# wm_csf_full = ["DWM^2", "DCSF^2"] - -# gs_basic = ["GS"] -# gs_power2 = ["GS^2"] -# gs_derivatives = ["DGS"] -# gs_full = ["DGS^2"] - -# confound_column_names = [] - -# confound_column_names.append("FD") # spike - -# confound_column_names.extend(motion_basic) -# confound_column_names.extend(motion_power2) -# confound_column_names.extend(motion_derivatives) -# confound_column_names.extend(motion_full) - -# confound_column_names.extend(wm_csf_basic) -# confound_column_names.extend(wm_csf_power2) -# confound_column_names.extend(wm_csf_derivatives) -# confound_column_names.extend(wm_csf_full) - -# confound_column_names.extend(gs_basic) -# confound_column_names.extend(gs_power2) -# confound_column_names.extend(gs_derivatives) -# confound_column_names.extend(gs_full) - -# # add some random irrelevant confounds -# for _ in range(10): -# confound_column_names.append(generate_conf_name()) - -# np.random.shuffle(confound_column_names) -# n_cols = len(confound_column_names) -# confounds_df = pd.DataFrame( -# np.random.randint(0, 100, size=(100, n_cols)), -# columns=confound_column_names, -# ) - -# # Generate spec from Felix's column naming -# spec = { -# "motion": { -# "basic": motion_basic, -# "power2": motion_basic + motion_power2, -# "derivatives": motion_basic + motion_derivatives, -# "full": motion_basic -# + motion_derivatives -# + motion_power2 -# + motion_full, -# }, -# "wm_csf": { -# "basic": wm_csf_basic, -# "power2": wm_csf_basic + wm_csf_power2, -# "derivatives": wm_csf_basic + wm_csf_derivatives, -# "full": wm_csf_basic -# + wm_csf_derivatives -# + wm_csf_power2 -# + wm_csf_full, -# }, -# "global_signal": { -# "basic": gs_basic, -# "power2": gs_basic + gs_power2, -# "derivatives": gs_basic + gs_derivatives, -# "full": gs_basic + gs_derivatives + gs_power2 + gs_full, -# }, -# } - -# # generate a junifer pipeline data object dictionary -# input_data_obj = {} -# input_data_obj["meta"] = {} -# input_data_obj["BOLD"] = {} -# input_data_obj["BOLD"]["data"] = siimg -# input_data_obj["confounds"] = {} -# input_data_obj["confounds"]["path"] = Path("/test.df") -# input_data_obj["confounds"]["data"] = confounds_df -# input_data_obj["confounds"]["names"] = {} -# input_data_obj["confounds"]["names"]["spec"] = spec -# input_data_obj["confounds"]["names"]["spike"] = "FD" - -# # generate confound removal strategies with varying numbers of parameters - -# # Test #1: 36 params, no derivatives to compute, no spike -# # 36 params -# strat1 = {"motion": "full", "wm_csf": "full", "global_signal": "full"} - -# cr = BaseConfoundRemover( -# strategy=strat1, spike=None, mask_img=simsk, t_r=0.75 -# ) -# cr.validate_input(list(input_data_obj.keys())) -# out_type = cr.get_output_kind(list(input_data_obj.keys())) - -# assert "BOLD" in out_type - -# # Check if the input data is valid -# cr._validate_data(input_data_obj) - -# # Check that the confounds are picked correctly: -# t_df = cr._pick_confounds(input_data_obj["confounds"]) -# assert len(t_df.columns) == 36 -# assert all(x in t_df.columns for x in motion_basic) -# assert all(x in t_df.columns for x in motion_power2) -# assert all(x in t_df.columns for x in motion_derivatives) -# assert all(x in t_df.columns for x in motion_full) -# assert all(x in t_df.columns for x in wm_csf_basic) -# assert all(x in t_df.columns for x in wm_csf_power2) -# assert all(x in t_df.columns for x in wm_csf_derivatives) -# assert all(x in t_df.columns for x in wm_csf_full) -# assert all(x in t_df.columns for x in gs_basic) -# assert all(x in t_df.columns for x in gs_power2) -# assert all(x in t_df.columns for x in gs_derivatives) -# assert all(x in t_df.columns for x in gs_full) -# assert "FD" not in t_df.columns -# assert "spike" not in t_df.columns - -# # Test #2: 24 params, no derivatives to compute, no spike -# # 24 params -# strat2 = { -# "motion": "full", -# } - -# cr = BaseConfoundRemover( -# strategy=strat2, spike=None, mask_img=simsk, t_r=0.75 -# ) -# cr.validate_input(list(input_data_obj.keys())) -# out_type = cr.get_output_kind(list(input_data_obj.keys())) - -# assert "BOLD" in out_type - -# # Check if the input data is valid -# cr._validate_data(input_data_obj) - -# # Check that the confounds are picked correctly: -# t_df = cr._pick_confounds(input_data_obj["confounds"]) -# assert len(t_df.columns) == 24 -# assert all(x in t_df.columns for x in motion_basic) -# assert all(x in t_df.columns for x in motion_power2) -# assert all(x in t_df.columns for x in motion_derivatives) -# assert all(x in t_df.columns for x in motion_full) -# assert all(x not in t_df.columns for x in wm_csf_basic) -# assert all(x not in t_df.columns for x in wm_csf_power2) -# assert all(x not in t_df.columns for x in wm_csf_derivatives) -# assert all(x not in t_df.columns for x in wm_csf_full) -# assert all(x not in t_df.columns for x in gs_basic) -# assert all(x not in t_df.columns for x in gs_power2) -# assert all(x not in t_df.columns for x in gs_derivatives) -# assert all(x not in t_df.columns for x in gs_full) -# assert "FD" not in t_df.columns -# assert "spike" not in t_df.columns - -# # Test #3: 9 params, no derivatives to compute, no spike -# strat3 = {"motion": "basic", "wm_csf": "basic", "global_signal": "basic"} - -# cr = BaseConfoundRemover( -# strategy=strat3, spike=None, mask_img=simsk, t_r=0.75 -# ) -# cr.validate_input(list(input_data_obj.keys())) -# out_type = cr.get_output_kind(list(input_data_obj.keys())) - -# assert "BOLD" in out_type - -# # Check if the input data is valid -# cr._validate_data(input_data_obj) - -# # Check that the confounds are picked correctly: -# t_df = cr._pick_confounds(input_data_obj["confounds"]) -# assert len(t_df.columns) == 9 -# assert all(x in t_df.columns for x in motion_basic) -# assert all(x not in t_df.columns for x in motion_power2) -# assert all(x not in t_df.columns for x in motion_derivatives) -# assert all(x not in t_df.columns for x in motion_full) -# assert all(x in t_df.columns for x in wm_csf_basic) -# assert all(x not in t_df.columns for x in wm_csf_power2) -# assert all(x not in t_df.columns for x in wm_csf_derivatives) -# assert all(x not in t_df.columns for x in wm_csf_full) -# assert all(x in t_df.columns for x in gs_basic) -# assert all(x not in t_df.columns for x in gs_power2) -# assert all(x not in t_df.columns for x in gs_derivatives) -# assert all(x not in t_df.columns for x in gs_full) -# assert "FD" not in t_df.columns -# assert "spike" not in t_df.columns - -# # Test #4: 6 params, no derivatives to compute, no spike -# strat4 = { -# "motion": "basic", -# } -# cr = BaseConfoundRemover( -# strategy=strat4, spike=None, mask_img=simsk, t_r=0.75 -# ) -# cr.validate_input(list(input_data_obj.keys())) -# out_type = cr.get_output_kind(list(input_data_obj.keys())) - -# assert "BOLD" in out_type - -# # Check if the input data is valid -# cr._validate_data(input_data_obj) - -# # Check that the confounds are picked correctly: -# t_df = cr._pick_confounds(input_data_obj["confounds"]) -# assert len(t_df.columns) == 6 -# assert all(x in t_df.columns for x in motion_basic) -# assert all(x not in t_df.columns for x in motion_power2) -# assert all(x not in t_df.columns for x in motion_derivatives) -# assert all(x not in t_df.columns for x in motion_full) -# assert all(x not in t_df.columns for x in wm_csf_basic) -# assert all(x not in t_df.columns for x in wm_csf_power2) -# assert all(x not in t_df.columns for x in wm_csf_derivatives) -# assert all(x not in t_df.columns for x in wm_csf_full) -# assert all(x not in t_df.columns for x in gs_basic) -# assert all(x not in t_df.columns for x in gs_power2) -# assert all(x not in t_df.columns for x in gs_derivatives) -# assert all(x not in t_df.columns for x in gs_full) -# assert "FD" not in t_df.columns -# assert "spike" not in t_df.columns - -# # Test #5: 2 params, no derivatives to compute, no spike -# strat5 = { -# "wm_csf": "basic", -# } -# cr = BaseConfoundRemover( -# strategy=strat5, spike=None, mask_img=simsk, t_r=0.75 -# ) -# cr.validate_input(list(input_data_obj.keys())) -# out_type = cr.get_output_kind(list(input_data_obj.keys())) - -# assert "BOLD" in out_type - -# # Check if the input data is valid -# cr._validate_data(input_data_obj) - -# # Check that the confounds are picked correctly: -# t_df = cr._pick_confounds(input_data_obj["confounds"]) -# assert len(t_df.columns) == 2 -# assert all(x not in t_df.columns for x in motion_basic) -# assert all(x not in t_df.columns for x in motion_power2) -# assert all(x not in t_df.columns for x in motion_derivatives) -# assert all(x not in t_df.columns for x in motion_full) -# assert all(x in t_df.columns for x in wm_csf_basic) -# assert all(x not in t_df.columns for x in wm_csf_power2) -# assert all(x not in t_df.columns for x in wm_csf_derivatives) -# assert all(x not in t_df.columns for x in wm_csf_full) -# assert all(x not in t_df.columns for x in gs_basic) -# assert all(x not in t_df.columns for x in gs_power2) -# assert all(x not in t_df.columns for x in gs_derivatives) -# assert all(x not in t_df.columns for x in gs_full) -# assert "FD" not in t_df.columns -# assert "spike" not in t_df.columns - -# out = cr.fit_transform(input_data_obj) -# check_niimg_4d(out["BOLD"]["data"]) -# # TODO: check meta - -# # Test #6: 12 params, derivatives to compute, spike -# to_select = [ -# x for x in confounds_df.columns if x not in motion_derivatives -# ] -# no_d_df = confounds_df[to_select] -# input_data_obj["confounds"]["data"] = no_d_df - -# derivatives = {f"D{x}": x for x in motion_basic} - -# input_data_obj["confounds"]["names"]["derivatives"] = derivatives - -# strat6 = { -# "motion": "derivatives", -# } -# cr = BaseConfoundRemover( -# strategy=strat6, spike=0.75, mask_img=simsk, t_r=0.75 -# ) -# cr.validate_input(list(input_data_obj.keys())) -# out_type = cr.get_output_kind(list(input_data_obj.keys())) - -# assert "BOLD" in out_type - -# # Check if the input data is valid -# cr._validate_data(input_data_obj) - -# # Check that the confounds are picked correctly: -# t_df = cr._pick_confounds(input_data_obj["confounds"]) -# assert len(t_df.columns) == 13 -# assert all(x in t_df.columns for x in motion_basic) -# assert all(x not in t_df.columns for x in motion_power2) -# assert all(x in t_df.columns for x in motion_derivatives) -# assert all(x not in t_df.columns for x in motion_full) -# assert all(x not in t_df.columns for x in wm_csf_basic) -# assert all(x not in t_df.columns for x in wm_csf_power2) -# assert all(x not in t_df.columns for x in wm_csf_derivatives) -# assert all(x not in t_df.columns for x in wm_csf_full) -# assert all(x not in t_df.columns for x in gs_basic) -# assert all(x not in t_df.columns for x in gs_power2) -# assert all(x not in t_df.columns for x in gs_derivatives) -# assert all(x not in t_df.columns for x in gs_full) -# assert "FD" not in t_df.columns -# assert "spike" in t_df.columns + assert output["meta"] == input["meta"] # general meta does not change + assert "meta" in output["BOLD"] + assert "preprocess" in output["BOLD"]["meta"] + t_meta = output["BOLD"]["meta"]["preprocess"] + assert t_meta["class"] == "FMRIPrepConfoundRemover" + # It should have all the default parameters + assert t_meta["strategy"] == confound_remover.strategy + assert t_meta["spike"] is None + assert t_meta["detrend"] is True + assert t_meta["standardize"] is True + assert t_meta["low_pass"] is None + assert t_meta["high_pass"] is None + assert t_meta["t_r"] is None + assert t_meta["mask_img"] is None diff --git a/junifer/testing/datagrabbers.py b/junifer/testing/datagrabbers.py index 0bff71f10..ceff77137 100644 --- a/junifer/testing/datagrabbers.py +++ b/junifer/testing/datagrabbers.py @@ -199,16 +199,13 @@ class PartlyCloudyTestingDataGrabber(BaseDataGrabber): out = super().__getitem__(element) i_sub = int(element.split("-")[1]) - 1 out["BOLD"] = {"path": Path(self._dataset["func"][i_sub])} - conf_format = "adhoc" if self.reduce_confounds else "fmriprep" + conf_format = "fmriprep" out["BOLD_confounds"] = { "path": Path(self._dataset["confounds"][i_sub]), "format": conf_format, } - # if self.reduce_confounds: - # spec = { - # } # Set the element accordingly out["meta"]["element"] = {"subject": element} return out -- 2.52.0 From 00172fee4ff2db8d9a6fedaa9c1bdbd5fda97533 Mon Sep 17 00:00:00 2001 From: Fede Date: Sat, 29 Oct 2022 22:38:43 +0300 Subject: [PATCH 124/142] damn test --- junifer/testing/tests/test_partlycloudytesting_datagrabber.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junifer/testing/tests/test_partlycloudytesting_datagrabber.py b/junifer/testing/tests/test_partlycloudytesting_datagrabber.py index aceb93dad..e45f1e373 100644 --- a/junifer/testing/tests/test_partlycloudytesting_datagrabber.py +++ b/junifer/testing/tests/test_partlycloudytesting_datagrabber.py @@ -32,7 +32,7 @@ def test_PartlyCloudyTestingDataGrabber() -> None: assert out["BOLD_confounds"]["path"].exists() assert out["BOLD_confounds"]["path"].is_file() assert "format" in out["BOLD_confounds"] - assert "adhoc" == out["BOLD_confounds"]["format"] + assert "fmriprep" == out["BOLD_confounds"]["format"] with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: out = dg["sub-01"] -- 2.52.0 From 42f25c2c3fc7d0199dc5786f32da235806b105f7 Mon Sep 17 00:00:00 2001 From: Fede Date: Sun, 30 Oct 2022 11:51:20 +0200 Subject: [PATCH 125/142] One more test --- .../preprocess/tests/test_preprocess_base.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 junifer/preprocess/tests/test_preprocess_base.py diff --git a/junifer/preprocess/tests/test_preprocess_base.py b/junifer/preprocess/tests/test_preprocess_base.py new file mode 100644 index 000000000..aaf5e5882 --- /dev/null +++ b/junifer/preprocess/tests/test_preprocess_base.py @@ -0,0 +1,52 @@ +"""Provide tests for base marker.""" + +# Authors: Federico Raimondo +# Synchon Mandal +# License: AGPL + +import pytest + +from junifer.preprocess.base import BasePreprocessor + + +def test_base_preprocessor_abstractness() -> None: + """Test BasePreprocessor is abstract base class.""" + with pytest.raises(TypeError, match=r"abstract"): + BasePreprocessor(on=["BOLD"]) # type: ignore + + +def test_base_preprocessor_subclassing() -> None: + """Test proper subclassing of BasePreprocessor.""" + # Create concrete class + class MyBasePreprocessor(BasePreprocessor): + def get_valid_inputs(self): + return ["BOLD", "T1w"] + + def get_output_kind(self, input): + return ["timeseries"] + + def preprocess(self, input, extra_input): + return "BOLD", input + + with pytest.raises(ValueError, match=r"cannot be computed on \['T2w'\]"): + MyBasePreprocessor(on=["BOLD", "T2w"]) + + # Create input for marker + input_ = { + "meta": {"datagrabber": "dg", "element": "elem", "datareader": "dr"}, + "BOLD": { + "path": ".", + "data": "data", + }, + } + prep = MyBasePreprocessor(on=["BOLD"]) + + with pytest.raises(ValueError, match="not have the required data"): + prep.validate_input(["T1w"]) + + output = prep.fit_transform(input=input_) # process + # Check output + assert "BOLD" in output + assert "data" in output["BOLD"] + assert "path" in output["BOLD"] + assert "meta" in output["BOLD"] -- 2.52.0 From 796778123e8203e60894daa392f9ef774aecb9c7 Mon Sep 17 00:00:00 2001 From: Fede Date: Sun, 30 Oct 2022 14:01:54 +0200 Subject: [PATCH 126/142] One more --- junifer/preprocess/tests/test_preprocess_base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/junifer/preprocess/tests/test_preprocess_base.py b/junifer/preprocess/tests/test_preprocess_base.py index aaf5e5882..11a3e1b46 100644 --- a/junifer/preprocess/tests/test_preprocess_base.py +++ b/junifer/preprocess/tests/test_preprocess_base.py @@ -31,6 +31,9 @@ def test_base_preprocessor_subclassing() -> None: with pytest.raises(ValueError, match=r"cannot be computed on \['T2w'\]"): MyBasePreprocessor(on=["BOLD", "T2w"]) + with pytest.raises(ValueError, match=r"cannot be computed on \['T2w'\]"): + MyBasePreprocessor(on="T2w") + # Create input for marker input_ = { "meta": {"datagrabber": "dg", "element": "elem", "datareader": "dr"}, -- 2.52.0 From c7a3cc3ed4ec0ab00c964570a16fcc872aa1086d Mon Sep 17 00:00:00 2001 From: Fede Date: Sun, 30 Oct 2022 14:08:34 +0200 Subject: [PATCH 127/142] test modify only what is expected --- junifer/preprocess/tests/test_preprocess_base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/junifer/preprocess/tests/test_preprocess_base.py b/junifer/preprocess/tests/test_preprocess_base.py index 11a3e1b46..cb4687772 100644 --- a/junifer/preprocess/tests/test_preprocess_base.py +++ b/junifer/preprocess/tests/test_preprocess_base.py @@ -26,6 +26,7 @@ def test_base_preprocessor_subclassing() -> None: return ["timeseries"] def preprocess(self, input, extra_input): + input["data"] = f"mofidied_{input['data']}" return "BOLD", input with pytest.raises(ValueError, match=r"cannot be computed on \['T2w'\]"): @@ -41,6 +42,10 @@ def test_base_preprocessor_subclassing() -> None: "path": ".", "data": "data", }, + "T1w": { + "path": ".", + "data": "data", + }, } prep = MyBasePreprocessor(on=["BOLD"]) @@ -51,5 +56,10 @@ def test_base_preprocessor_subclassing() -> None: # Check output assert "BOLD" in output assert "data" in output["BOLD"] + assert output["BOLD"]["data"] == "mofidied_data" assert "path" in output["BOLD"] assert "meta" in output["BOLD"] + + assert "T1w" in output + assert "data" in output["T1w"] + assert output["T1w"]["data"] == "data" -- 2.52.0 From db026a3f62e5e50bc2f0c36a6db4a26142f800ef Mon Sep 17 00:00:00 2001 From: Fede Date: Mon, 31 Oct 2022 08:23:40 +0200 Subject: [PATCH 128/142] Test for derivative only --- junifer/preprocess/tests/test_confounds.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index e28826879..9c2cedddb 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -199,7 +199,7 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: # Two component strategy, mixed confounds, no spike confound_remover = FMRIPrepConfoundRemover( - strategy={"wm_csf": "power2", "global_signal": "full"} + strategy={"wm_csf": "power2", "global_signal": "derivatives"} ) var_names = ["csf", "white_matter", "global_signal"] @@ -207,8 +207,6 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: missing_sq_names = [ "csf_power2", "white_matter_power2", - "global_signal_power2", - "global_signal_derivative1_power2", ] all_names = var_names + missing_der_names + missing_sq_names -- 2.52.0 From e8b8abc1f826840fe0b5e09d5614e0231d6a5a2e Mon Sep 17 00:00:00 2001 From: Fede Date: Mon, 31 Oct 2022 08:37:58 +0200 Subject: [PATCH 129/142] Fix bug --- junifer/preprocess/confounds.py | 2 +- junifer/preprocess/tests/test_confounds.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index 8b9eb5fff..0a38fd96c 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -471,7 +471,7 @@ class FMRIPrepConfoundRemover(BasePreprocessor): if x not in confound_df.columns ] - if len(missing) is not None: + if len(missing) > 0: raise ValueError( "Invalid confounds file. Missing columns: " f"{missing}. " diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index 9c2cedddb..8bdaa1835 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -415,6 +415,21 @@ def test_FMRIPrepConfoundRemover__validate_data() -> None: with pytest.raises(ValueError, match=r"Missing columns: \['wrong'\]"): confound_remover._validate_data(new_input, extra_input) + extra_input = { + "BOLD_confounds": { + "data": input["BOLD_confounds"]["data"], + "format": "adhoc", + "mappings": { + "fmriprep": { + "rot_x": "rot_x", + "rot_y": "rot_z", + "rot_z": "rot_y", + } + }, + } + } + confound_remover._validate_data(new_input, extra_input) + def test_FMRIPrepConfoundRemover__remove_confounds() -> None: """Test FMRIPrepConfoundRemover remove confounds.""" -- 2.52.0 From 3fc9287d0c3213f4ace69e9354ad9abb679ca62f Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 2 Nov 2022 14:10:00 +0200 Subject: [PATCH 130/142] Addressing review + decorator --- junifer/api/decorators.py | 24 +++++ junifer/preprocess/__init__.py | 3 +- junifer/preprocess/base.py | 18 ++-- junifer/preprocess/confounds.py | 63 +++++++---- junifer/preprocess/tests/test_confounds.py | 101 +++++++----------- .../preprocess/tests/test_preprocess_base.py | 2 +- junifer/testing/datagrabbers.py | 11 +- .../tests/test_oasisvmbtesting_datagrabber.py | 4 +- 8 files changed, 127 insertions(+), 99 deletions(-) diff --git a/junifer/api/decorators.py b/junifer/api/decorators.py index a5252486a..3b9d832f9 100644 --- a/junifer/api/decorators.py +++ b/junifer/api/decorators.py @@ -32,6 +32,30 @@ def register_datagrabber(klass: type) -> type: return klass +def register_preprocessor(klass: type) -> type: + """Preprocessor registration decorator. + + Registers the preprocessor so it can be used by name. + + Parameters + ---------- + klass: class + The class of the preprocessor to register. + + Returns + ------- + klass: class + The unmodified input class. + + """ + register( + step="preprocessing", + name=klass.__name__, + klass=klass, + ) + return klass + + def register_marker(klass: type) -> type: """Marker registration decorator. diff --git a/junifer/preprocess/__init__.py b/junifer/preprocess/__init__.py index 532763ce5..20959dfd4 100644 --- a/junifer/preprocess/__init__.py +++ b/junifer/preprocess/__init__.py @@ -4,4 +4,5 @@ # Leonard Sasse # License: AGPL -from .confounds import FMRIPrepConfoundRemover +from .confounds import fMRIPrepConfoundRemover +from .base import BasePreprocessor \ No newline at end of file diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py index 6e710dbe6..13b00b5ba 100644 --- a/junifer/preprocess/base.py +++ b/junifer/preprocess/base.py @@ -13,13 +13,13 @@ from ..utils import logger, raise_error class BasePreprocessor(ABC, PipelineStepMixin): - """Abstract base class for all preprocessors. + """Provide abstract base class for all preprocessors. Parameters ---------- - on : str or list of str + on : str or list of str, optional The kind of data to apply the preprocessor to. If None, - will work on all available data (default: None). + will work on all available data (default None). """ @@ -88,7 +88,8 @@ class BasePreprocessor(ABC, PipelineStepMixin): Returns ------- list of str - The list of data types that can be used as input for this marker + The list of data types that can be used as input for this + preprocessor """ raise_error( @@ -107,13 +108,10 @@ class BasePreprocessor(ABC, PipelineStepMixin): Returns ------- dict - The metadata as a dictionary with the only key 'marker'. + The metadata as a dictionary with the only key 'preprocess'. """ s_meta = super().get_meta() - # same marker can be "fit"ted into different kinds, so the name - # is created from the kind and the name of the marker - s_meta["kind"] = kind return {"preprocess": s_meta} def fit_transform( @@ -158,10 +156,10 @@ class BasePreprocessor(ABC, PipelineStepMixin): Parameters ---------- - input : Dict[str, Dict] + input : dict[str, dict] A single input from the pipeline data object in which to compute the marker. - extra_input : Dict, optional + extra_input : dict, optional The other fields in the pipeline data object. Useful for accessing other data kind that needs to be used in the computation. For example, the functional connectivity markers can make use of the diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index 0a38fd96c..72a441b91 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -1,4 +1,4 @@ -"""Provide base class for confound removal.""" +"""Provide class for confound removal using FMRIPrep format.""" # Authors: Federico Raimondo # Leonard Sasse @@ -14,6 +14,7 @@ from nilearn.image import clean_img from nilearn.masking import compute_brain_mask from .base import BasePreprocessor +from ..api.decorators import register_preprocessor from ..utils import logger, raise_error @@ -86,8 +87,9 @@ FMRIPREP_VALID_NAMES = [ ] -class FMRIPrepConfoundRemover(BasePreprocessor): - """Class for confound removal. +@register_preprocessor +class fMRIPrepConfoundRemover(BasePreprocessor): + """Class for confound removal using fMRIPrep confounds format. Read confound files and select columns according to a pre-defined strategy. @@ -113,7 +115,7 @@ class FMRIPrepConfoundRemover(BasePreprocessor): If None, no spike regressor is added. If spike is a float, it will add a spike regressor for every point at which framewise displacement exceeds the specified float (default None). - detrend : bool, Optional + detrend : bool, optional If True, detrending will be applied on timeseries (before confound removal) (default True). standardize : bool, optional @@ -150,7 +152,6 @@ class FMRIPrepConfoundRemover(BasePreprocessor): mask_img: Optional["Nifti1Image"] = None, ) -> None: """Initialise the class.""" - super().__init__() if strategy is None: strategy = { "motion": "full", @@ -194,6 +195,7 @@ class FMRIPrepConfoundRemover(BasePreprocessor): "include it in the future", klass=ValueError, ) + super().__init__() def validate_input(self, input: List[str]) -> None: """Validate the input to the pipeline step. @@ -202,7 +204,7 @@ class FMRIPrepConfoundRemover(BasePreprocessor): ---------- input : list of str The input to the pipeline step. The list must contain the - available Junifer Data dictionary keys. + available Junifer Data object keys. Raises ------ @@ -226,12 +228,12 @@ class FMRIPrepConfoundRemover(BasePreprocessor): ---------- input : list of str The input to the pipeline step. The list must contain the - available Junifer Data dictionary keys. + available Junifer Data object keys. Returns ------- list of str - The updated list of available Junifer Data dictionary keys after + The updated list of available Junifer Data object keys after the pipeline step. """ @@ -249,7 +251,7 @@ class FMRIPrepConfoundRemover(BasePreprocessor): """ return ["BOLD"] - def _map_adhoc_to_fmriprep(self, input: Dict[str, Any]): + def _map_adhoc_to_fmriprep(self, input: Dict[str, Any]) -> None: """Map the adhoc format to the fmpriprep format spec. Based on the spec, map the column names to match the fmriprep format. @@ -279,7 +281,7 @@ class FMRIPrepConfoundRemover(BasePreprocessor): def _process_fmriprep_spec( self, input: Dict[str, Any] - ) -> Tuple[List, Dict, Dict, str]: + ) -> Tuple[List[str], Dict[str, str], Dict[str, str], str]: """Process the fmpriprep format spec from the specified file. Based on the strategy, find the relevant column names in the dataframe, @@ -298,10 +300,10 @@ class FMRIPrepConfoundRemover(BasePreprocessor): to_select : list of str List of confounds to select from the confounds file, based on the strategy - squares_to_compute : dict[str, str] + squares_to_compute : dict Dictionary containing the missing power2 confounds to compute (keys) and the corresponding confounds to square (values) - derivatives_to_compute : dict[str, str] + derivatives_to_compute : dict Dictionary containing the missing derivatives confounds to compute (keys) and the corresponding confounds to compute the derivative from (values) @@ -362,7 +364,20 @@ class FMRIPrepConfoundRemover(BasePreprocessor): return out def _pick_confounds(self, input: Dict[str, Any]) -> pd.DataFrame: - """Select relevant confounds from the specified file.""" + """Select relevant confounds from the specified file. + + Parameters + ---------- + input : dict + Dictionary containing the "BOLD_confounds" value from the + Junifer Data object. + + Returns + ------- + confounds_df : pandas.DataFrame + Dataframe containing the relevant confounds. + + """ confounds_format = input["format"] if confounds_format == "adhoc": @@ -404,7 +419,18 @@ class FMRIPrepConfoundRemover(BasePreprocessor): input: Dict[str, Any], extra_input: Optional[Dict[str, Any]] = None, ) -> None: - """Validate input data.""" + """Validate input data. + + Parameters + ---------- + input : dict + Dictionary containing the "BOLD" value from the + Junifer Data object. + extra_input : dict, optional + Dictionary containing the rest of the Junifer Data object. Must + include the "BOLD_confounds" key. + + """ # Bold must be 4D niimg check_niimg_4d(input["data"]) @@ -546,13 +572,10 @@ class FMRIPrepConfoundRemover(BasePreprocessor): Parameters ---------- input : Dict[str, Dict] - A single input from the pipeline data object in which to compute - the marker. + A single input from the Junifer Data object in which to preprocess. extra_input : Dict, optional - The other fields in the pipeline data object. Useful for accessing - other data kind that needs to be used in the computation. For - example, the functional connectivity markers can make use of the - confounds if available (default None). + The other fields in the Junifer Data object. Must include the + "BOLD_confounds" key. Returns ------- diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index 8bdaa1835..2d7d21950 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -1,4 +1,4 @@ -"""Provide tests for confound removal.""" +"""Provide tests for fMRIPrepConfoundRemover.""" # Authors: Federico Raimondo # Leonard Sasse @@ -15,52 +15,33 @@ import numpy as np import nibabel as nib from nilearn._utils.exceptions import DimensionError -from junifer.preprocess.confounds import FMRIPrepConfoundRemover +from junifer.preprocess.confounds import fMRIPrepConfoundRemover from junifer.testing.datagrabbers import ( OasisVBMTestingDatagrabber, PartlyCloudyTestingDataGrabber, ) from junifer.datareader import DefaultDataReader -# Set RNG seed for reproducibility -# np.random.seed(1234567) - -# def generate_conf_name( -# size: int = 6, chars: str = string.ascii_uppercase + string.digits -# ) -> str: -# """Generate configuration name.""" -# return "".join(random.choice(chars) for _ in range(size)) - - -# def _simu_img() -> Tuple[Nifti1Image, Nifti1Image]: -# # Random 4D volume with 100 time points -# vol = 100 + 10 * np.random.randn(5, 5, 2, 100) -# img = Nifti1Image(vol, np.eye(4)) -# # Create an nifti image with the data, and corresponding mask -# mask = Nifti1Image(np.ones([5, 5, 2]), np.eye(4)) -# return img, mask - - -def test_FMRIPrepConfoundRemover_init() -> None: - """Test FMRIPrepConfoundRemover init.""" +def test_fMRIPrepConfoundRemover_init() -> None: + """Test fMRIPrepConfoundRemover init.""" with pytest.raises(ValueError, match="keys must be strings"): - FMRIPrepConfoundRemover(strategy={1: "full"}) # type: ignore + fMRIPrepConfoundRemover(strategy={1: "full"}) # type: ignore with pytest.raises(ValueError, match="values must be strings"): - FMRIPrepConfoundRemover(strategy={"motion": 1}) # type: ignore + fMRIPrepConfoundRemover(strategy={"motion": 1}) # type: ignore with pytest.raises(ValueError, match="component names"): - FMRIPrepConfoundRemover(strategy={"wrong": "full"}) + fMRIPrepConfoundRemover(strategy={"wrong": "full"}) with pytest.raises(ValueError, match="confound types"): - FMRIPrepConfoundRemover(strategy={"motion": "wrong"}) + fMRIPrepConfoundRemover(strategy={"motion": "wrong"}) -def test_FMRIPrepConfoundRemover_validate_input() -> None: - """Test FMRIPrepConfoundRemover validate_input.""" - confound_remover = FMRIPrepConfoundRemover() +def test_fMRIPrepConfoundRemover_validate_input() -> None: + """Test fMRIPrepConfoundRemover validate_input.""" + confound_remover = fMRIPrepConfoundRemover() # Input is valid when both BOLD and BOLD_confounds are present @@ -80,9 +61,9 @@ def test_FMRIPrepConfoundRemover_validate_input() -> None: confound_remover.validate_input(input) -def test_FMRIPrepConfoundRemover_get_output_kind() -> None: - """Test FMRIPrepConfoundRemover validate_input.""" - confound_remover = FMRIPrepConfoundRemover() +def test_fMRIPrepConfoundRemover_get_output_kind() -> None: + """Test fMRIPrepConfoundRemover validate_input.""" + confound_remover = fMRIPrepConfoundRemover() inputs = [ ["BOLD", "T1w", "BOLD_confounds"], ["BOLD", "VBM_GM", "BOLD_confounds"], @@ -93,9 +74,9 @@ def test_FMRIPrepConfoundRemover_get_output_kind() -> None: assert confound_remover.get_output_kind(input) == input -def test_FMRIPrepConfoundRemover__map_adhoc_to_fmriprep() -> None: - """Test FMRIPrepConfoundRemover adhoc to fmriprep spec mapping.""" - confound_remover = FMRIPrepConfoundRemover() +def test_fMRIPrepConfoundRemover__map_adhoc_to_fmriprep() -> None: + """Test fMRIPrepConfoundRemover adhoc to fmriprep spec mapping.""" + confound_remover = fMRIPrepConfoundRemover() # Use non fmriprep variable names adhoc_names = [f"var{i}" for i in range(6)] adhoc_df = pd.DataFrame(np.random.randn(10, 6), columns=adhoc_names) @@ -122,11 +103,11 @@ def test_FMRIPrepConfoundRemover__map_adhoc_to_fmriprep() -> None: assert adhoc_df.columns.tolist() == fmriprep_names -def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: - """Test FMRIPrepConfoundRemover fmriprep spec processing.""" +def test_fMRIPrepConfoundRemover__process_fmriprep_spec() -> None: + """Test fMRIPrepConfoundRemover fmriprep spec processing.""" # Test one strategy, full, no spike - confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) + confound_remover = fMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) var_names = [ "csf", @@ -171,7 +152,7 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: assert spike_name == "framewise_displacement" # Same strategy, with spike, only basics are present - confound_remover = FMRIPrepConfoundRemover( + confound_remover = fMRIPrepConfoundRemover( strategy={"wm_csf": "full"}, spike=0.2 ) @@ -198,7 +179,7 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: assert spike_name == "framewise_displacement" # Two component strategy, mixed confounds, no spike - confound_remover = FMRIPrepConfoundRemover( + confound_remover = fMRIPrepConfoundRemover( strategy={"wm_csf": "power2", "global_signal": "derivatives"} ) @@ -223,7 +204,7 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: # Test for wrong columns/strategy pairs - confound_remover = FMRIPrepConfoundRemover( + confound_remover = fMRIPrepConfoundRemover( strategy={"wm_csf": "full"}, spike=0.2 ) var_names = ["csf"] @@ -245,9 +226,9 @@ def test_FMRIPrepConfoundRemover__process_fmriprep_spec() -> None: confound_remover._process_fmriprep_spec({"data": confounds_df}) -def test_FMRIPrepConfoundRemover__pick_confounds_adhoc() -> None: - """Test FMRIPrepConfoundRemover pick confounds on adhoc confounds.""" - confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) +def test_fMRIPrepConfoundRemover__pick_confounds_adhoc() -> None: + """Test fMRIPrepConfoundRemover pick confounds on adhoc confounds.""" + confound_remover = fMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) # Use non fmriprep variable names adhoc_names = [f"var{i}" for i in range(2)] adhoc_df = pd.DataFrame(np.random.randn(10, 2), columns=adhoc_names) @@ -278,8 +259,8 @@ def test_FMRIPrepConfoundRemover__pick_confounds_adhoc() -> None: def test_FMRIPRepConfoundRemover__pick_confounds_fmriprep() -> None: - """Test FMRIPrepConfoundRemover pick confounds on fmriprep confounds.""" - confound_remover = FMRIPrepConfoundRemover( + """Test fMRIPrepConfoundRemover pick confounds on fmriprep confounds.""" + confound_remover = fMRIPrepConfoundRemover( strategy={"wm_csf": "full"}, spike=0.2 ) fmriprep_all_vars = [ @@ -311,9 +292,9 @@ def test_FMRIPRepConfoundRemover__pick_confounds_fmriprep() -> None: # TODO: Test if fmriprep returns the same derivatives/power2 as we compute -def test_FMRIPrepConfoundRemover__validate_data() -> None: - """Test FMRIPrepConfoundRemover validate data.""" - confound_remover = FMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) +def test_fMRIPrepConfoundRemover__validate_data() -> None: + """Test fMRIPrepConfoundRemover validate data.""" + confound_remover = fMRIPrepConfoundRemover(strategy={"wm_csf": "full"}) reader = DefaultDataReader() with OasisVBMTestingDatagrabber() as dg: input = dg["sub-01"] @@ -431,9 +412,9 @@ def test_FMRIPrepConfoundRemover__validate_data() -> None: confound_remover._validate_data(new_input, extra_input) -def test_FMRIPrepConfoundRemover__remove_confounds() -> None: - """Test FMRIPrepConfoundRemover remove confounds.""" - confound_remover = FMRIPrepConfoundRemover( +def test_fMRIPrepConfoundRemover__remove_confounds() -> None: + """Test fMRIPrepConfoundRemover remove confounds.""" + confound_remover = fMRIPrepConfoundRemover( strategy={"wm_csf": "full"}, spike=0.2 ) reader = DefaultDataReader() @@ -455,13 +436,13 @@ def test_FMRIPrepConfoundRemover__remove_confounds() -> None: # TODO: Test confound remover with mask, needs #79 to be implemented -def test_FMRIPrepConfoundRemover_preprocess() -> None: - """Test FMRIPrepConfoundRemover with all confounds present.""" +def test_fMRIPrepConfoundRemover_preprocess() -> None: + """Test fMRIPrepConfoundRemover with all confounds present.""" # need reader for the data reader = DefaultDataReader() # All strategies full, no spike - confound_remover = FMRIPrepConfoundRemover() + confound_remover = fMRIPrepConfoundRemover() with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: input = dg["sub-01"] @@ -484,13 +465,13 @@ def test_FMRIPrepConfoundRemover_preprocess() -> None: assert key == "BOLD" -def test_FMRIPrepConfoundRemover_fit_transform() -> None: - """Test FMRIPrepConfoundRemover with all confounds present.""" +def test_fMRIPrepConfoundRemover_fit_transform() -> None: + """Test fMRIPrepConfoundRemover with all confounds present.""" # need reader for the data reader = DefaultDataReader() # All strategies full, no spike - confound_remover = FMRIPrepConfoundRemover() + confound_remover = fMRIPrepConfoundRemover() with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: input = dg["sub-01"] @@ -513,7 +494,7 @@ def test_FMRIPrepConfoundRemover_fit_transform() -> None: assert "meta" in output["BOLD"] assert "preprocess" in output["BOLD"]["meta"] t_meta = output["BOLD"]["meta"]["preprocess"] - assert t_meta["class"] == "FMRIPrepConfoundRemover" + assert t_meta["class"] == "fMRIPrepConfoundRemover" # It should have all the default parameters assert t_meta["strategy"] == confound_remover.strategy assert t_meta["spike"] is None diff --git a/junifer/preprocess/tests/test_preprocess_base.py b/junifer/preprocess/tests/test_preprocess_base.py index cb4687772..90d3c89ef 100644 --- a/junifer/preprocess/tests/test_preprocess_base.py +++ b/junifer/preprocess/tests/test_preprocess_base.py @@ -1,4 +1,4 @@ -"""Provide tests for base marker.""" +"""Provide tests for BasePreprocessor.""" # Authors: Federico Raimondo # Synchon Mandal diff --git a/junifer/testing/datagrabbers.py b/junifer/testing/datagrabbers.py index ceff77137..7bd4c7d2a 100644 --- a/junifer/testing/datagrabbers.py +++ b/junifer/testing/datagrabbers.py @@ -137,17 +137,18 @@ class PartlyCloudyTestingDataGrabber(BaseDataGrabber): 6 anatomical compcor parameters. This selection only serves the purpose of having realistic examples. Depending on your research question, other confounds might be more appropriate. - If False, returns all :term:`fMRIPrep` confounds. - Default=True. + If False, returns all :term:`fMRIPrep` confounds (default True). - age_group : str, optional - Default='both'. Which age group to fetch + age_group : {"adults", "child", "both"}, optional + Which age group to fetch (default "both"). - 'adults' = fetch adults only (n=33, ages 18-39) - 'child' = fetch children only (n=122, ages 3-12) - 'both' = fetch full sample (n=155) """ - def __init__(self, reduce_confounds=True, age_group="both") -> None: + def __init__( + self, reduce_confounds: bool = True, age_group: str = "both" + ) -> None: """Initialize the class.""" datadir = tempfile.mkdtemp() # Define types diff --git a/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py b/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py index 9129b93c0..283be2716 100644 --- a/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +++ b/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py @@ -1,4 +1,4 @@ -"""Provide tests for SPM Auditory datagrabber.""" +"""Provide tests for Oasis VBM Testing datagrabber.""" # Authors: Federico Raimondo # License: AGPL @@ -7,7 +7,7 @@ from junifer.testing.datagrabbers import OasisVBMTestingDatagrabber def test_OasisVBMTestingDatagrabber() -> None: - """Test Oasis VBM datagrabber.""" + """Test Oasis VBM Testing datagrabber.""" expected_elements = [ "sub-01", "sub-02", -- 2.52.0 From c32935374a7f3b63aa65f15fcc72ed8724d80516 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 2 Nov 2022 14:13:15 +0200 Subject: [PATCH 131/142] done with review --- junifer/preprocess/base.py | 2 +- junifer/preprocess/confounds.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py index 13b00b5ba..35c547fd3 100644 --- a/junifer/preprocess/base.py +++ b/junifer/preprocess/base.py @@ -1,4 +1,4 @@ -"""Provide base class for preprocessor.""" +"""Provide abstract base class for preprocessor.""" # Authors: Federico Raimondo # Synchon Mandal diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index 72a441b91..37e864c91 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -571,9 +571,9 @@ class fMRIPrepConfoundRemover(BasePreprocessor): Parameters ---------- - input : Dict[str, Dict] + input : dict A single input from the Junifer Data object in which to preprocess. - extra_input : Dict, optional + extra_input : dict, optional The other fields in the Junifer Data object. Must include the "BOLD_confounds" key. -- 2.52.0 From 67556a003173ca96a983406c5178012ab33b8876 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 2 Nov 2022 14:17:59 +0200 Subject: [PATCH 132/142] more comments --- junifer/preprocess/base.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py index 35c547fd3..c6fc3a277 100644 --- a/junifer/preprocess/base.py +++ b/junifer/preprocess/base.py @@ -68,7 +68,7 @@ class BasePreprocessor(ABC, PipelineStepMixin): Parameters ---------- input : list of str - The input to the marker. The list must contain the + The input to the preprocessor. The list must contain the available Junifer Data dictionary keys. Returns @@ -89,7 +89,7 @@ class BasePreprocessor(ABC, PipelineStepMixin): ------- list of str The list of data types that can be used as input for this - preprocessor + preprocessor. """ raise_error( @@ -157,12 +157,11 @@ class BasePreprocessor(ABC, PipelineStepMixin): Parameters ---------- input : dict[str, dict] - A single input from the pipeline data object in which to compute - the marker. + A single input from the Junifer Data object to preprocess. extra_input : dict, optional - The other fields in the pipeline data object. Useful for accessing + The other fields in the Junifer Data object. Useful for accessing other data kind that needs to be used in the computation. For - example, the functional connectivity markers can make use of the + example, the confound removers can make use of the confounds if available (default None). Returns -- 2.52.0 From f5725e9a53f3ccab5cf4b2c13abad85fac98c15f Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 2 Nov 2022 22:02:17 +0200 Subject: [PATCH 133/142] more docs --- docs/understanding/preprocess.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index 420de2bb7..429bea9e0 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -13,3 +13,12 @@ depending on the use-case. For example, you might want to perform confound remov feature extraction. This step is still under development and is an optional one for the pipeline to work. + +.. _preprocess_confounds: + +Confound Removal +^^^^^^^^^^^^^^^^ + +The *Confound Removal* step is meant to remove *confounds* from the ``BOLD`` data. The confounds are +extracted from the ``BOLD_confounds`` data (must be provided by the :ref:`DataGrabber `). +The confounds are then regressed out from the ``BOLD`` data using :func:`nilearn.image.clean_img`. \ No newline at end of file -- 2.52.0 From a977ab690fe15c791c971584aa267c2a5760d249 Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 13:38:54 +0200 Subject: [PATCH 134/142] Fix linting --- junifer/preprocess/base.py | 5 ---- junifer/preprocess/confounds.py | 45 ++++++++++++++++++--------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py index c6fc3a277..84d3e9d67 100644 --- a/junifer/preprocess/base.py +++ b/junifer/preprocess/base.py @@ -20,14 +20,12 @@ class BasePreprocessor(ABC, PipelineStepMixin): on : str or list of str, optional The kind of data to apply the preprocessor to. If None, will work on all available data (default None). - """ def __init__( self, on: Optional[Union[List[str], str]] = None, ) -> None: - """Initialize the class.""" if on is None: on = self.get_valid_inputs() if not isinstance(on, list): @@ -52,7 +50,6 @@ class BasePreprocessor(ABC, PipelineStepMixin): ------ ValueError If the input does not have the required data. - """ if not any(x in input for x in self._on): raise_error( @@ -90,7 +87,6 @@ class BasePreprocessor(ABC, PipelineStepMixin): list of str The list of data types that can be used as input for this preprocessor. - """ raise_error( msg="Concrete classes need to implement get_valid_inputs().", @@ -109,7 +105,6 @@ class BasePreprocessor(ABC, PipelineStepMixin): ------- dict The metadata as a dictionary with the only key 'preprocess'. - """ s_meta = super().get_meta() return {"preprocess": s_meta} diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index 37e864c91..f236cbd06 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -99,25 +99,30 @@ class fMRIPrepConfoundRemover(BasePreprocessor): Parameters ---------- strategy : dict, optional + The strategy to use for each component. If None, will use the *full* + strategy for all components (default None). The keys of the dictionary should correspond to names of noise components to include: - - 'motion' - - 'wm_csf' - - 'global_signal' + + * 'motion' + * 'wm_csf' + * 'global_signal' + The values of dictionary should correspond to types of confounds extracted from each signal: - - 'basic': only the confounding time series - - 'power2': signal + quadratic term - - 'derivatives': signal + derivatives - - 'full': signal + deriv. + quadratic terms + power2 deriv. - (default None). + + * 'basic': only the confounding time series + * 'power2': signal + quadratic term + * 'derivatives': signal + derivatives + * 'full': signal + deriv. + quadratic terms + power2 deriv. + spike : float, optional If None, no spike regressor is added. If spike is a float, it will add a spike regressor for every point at which framewise displacement exceeds the specified float (default None). detrend : bool, optional - If True, detrending will be applied on timeseries - (before confound removal) (default True). + If True, detrending will be applied on timeseries, before confound + removal (default True). standardize : bool, optional If True, returned signals are set to unit variance (default True). low_pass : float, optional @@ -133,13 +138,10 @@ class fMRIPrepConfoundRemover(BasePreprocessor): If provided, signal is only cleaned from voxels inside the mask. If mask is provided, it should have same shape and affine as imgs. If not provided, a mask is computed using - `nilearn.masking.compute_brain_mask` (default None). + :func:`nilearn.masking.compute_brain_mask` (default None). """ - # TODO: implement more strategies from - # nilearn.interfaces.fmriprep.load_confounds, - # in particular scrubbing def __init__( self, strategy: Optional[Dict[str, str]] = None, @@ -291,9 +293,10 @@ class fMRIPrepConfoundRemover(BasePreprocessor): ---------- input : dict Dictionary containing the following keys: - - path: path to the confounds file - - data: the confounds file loaded in memory (dataframe) - - format: format of the confounds file (must be "fmriprep") + + * path: path to the confounds file + * data: the confounds file loaded in memory (dataframe) + * format: format of the confounds file (must be "fmriprep") Returns ------- @@ -371,12 +374,12 @@ class fMRIPrepConfoundRemover(BasePreprocessor): input : dict Dictionary containing the "BOLD_confounds" value from the Junifer Data object. - + Returns ------- confounds_df : pandas.DataFrame Dataframe containing the relevant confounds. - + """ confounds_format = input["format"] @@ -420,7 +423,7 @@ class fMRIPrepConfoundRemover(BasePreprocessor): extra_input: Optional[Dict[str, Any]] = None, ) -> None: """Validate input data. - + Parameters ---------- input : dict @@ -429,7 +432,7 @@ class fMRIPrepConfoundRemover(BasePreprocessor): extra_input : dict, optional Dictionary containing the rest of the Junifer Data object. Must include the "BOLD_confounds" key. - + """ # Bold must be 4D niimg -- 2.52.0 From e1e9099b6296f8057edfe986189bbf80299fba5d Mon Sep 17 00:00:00 2001 From: Fede Date: Thu, 3 Nov 2022 16:23:14 +0200 Subject: [PATCH 135/142] Update doc --- docs/changes/latest.inc | 2 + docs/links.inc | 2 + docs/understanding/preprocess.rst | 96 ++++++++++++++++++++++++++++++- 3 files changed, 98 insertions(+), 2 deletions(-) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 112e44300..ea0b0d175 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -75,6 +75,8 @@ Enhancements - Change documentation template to furo. Fix references and standardize documentation (:gh:`114` by `Fede Raimondo`_). +- Add :class:`junifer.preprocess.fMRIPrepConfoundRemover` (:gh:`111` by `Fede Raimondo`_ and `Leonard Sasse`_). + Bugs ~~~~ diff --git a/docs/links.inc b/docs/links.inc index 6f8d31de1..27f6489c8 100644 --- a/docs/links.inc +++ b/docs/links.inc @@ -19,6 +19,8 @@ .. _`Python`: https://python.org .. _`seaborn`: https://seaborn.pydata.org .. _`matplotlib`: https://matplotlib.org +.. _`fMRIPrep`: https://fmriprep.org +.. _`nilearn`: https://nilearn.github.io .. _`venv`: https://docs.python.org/3/tutorial/venv.html .. _`conda env`: https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index 429bea9e0..e23cdb529 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -17,8 +17,100 @@ This step is still under development and is an optional one for the pipeline to .. _preprocess_confounds: Confound Removal -^^^^^^^^^^^^^^^^ +---------------- The *Confound Removal* step is meant to remove *confounds* from the ``BOLD`` data. The confounds are extracted from the ``BOLD_confounds`` data (must be provided by the :ref:`DataGrabber `). -The confounds are then regressed out from the ``BOLD`` data using :func:`nilearn.image.clean_img`. \ No newline at end of file +The confounds are then regressed out from the ``BOLD`` data using :func:`nilearn.image.clean_img`. + +Currently, junifer supports only one confound removal class: +:class:`junifer.preprocess.fMRIPrepConfoundRemover`. This class is meant to remove confounds as described +before, using the output of `fMRIPrep`_ as reference. + +Strategy +~~~~~~~~ + +This confound remover uses the `nilearn`_ API from :func:`nilearn.interfaces.fmriprep.load_confounds`. That is, +define a *strategy* to extract the confounds from the ``BOLD_confounds`` data. The *strategy* is defined +by choosing the *noise components* to be used and the *confounds* to be extracted from each noise components. +The *noise components* currently supported are: + +* ``motion`` +* ``wm_csf`` +* ``global_signal`` + +The confounds options for each *noise component* are: + +* ``basic``: the basic confounds for each *noise component*. For example, for ``motion``, the basic confounds + are the 6 motion parameters (3 translations and 3 rotations) and their derivatives. For ``wm_csf``, the basic + confounds are the mean signal of the white matter and CSF regions. For ``global_signal``, the basic confound + is the mean signal of the whole brain. +* ``power2``: the basic confounds plus the square of each basic confound. +* ``derivatives``: the basic confounds plus the derivative of each basic confound. +* ``full``: the basic confounds, the derivative of each basic confound, the square of each basic confound and the + square of each derivative of each basic confound. + +The *strategy* is defined as a dictionary, with the *noise components* as keys and the *confounds* as values. + +Example in python format: + +.. code-block:: + + strategy = { + "motion": "basic", + "wm_csf": "full", + "global_signal": "derivatives" + } + +or in YAML format: + +.. code-block:: + + strategy: + motion: basic + wm_csf: full + global_signal: derivatives + +The default value is to use all the *noise components* with the ``full`` *confounds*:abbr: + +.. code-block:: + + strategy = { + "motion": "full", + "wm_csf": "full", + "global_signal": "full" + } + +Other parameters +~~~~~~~~~~~~~~~~ + +Additionaly, the :class:`junifer.preprocess.fMRIPrepConfoundRemover` supports the following parameters: + +.. list-table:: + :widths: 10, 30, 5 + :header-rows: 1 + + * - Parameter + - Description + - Default + * - ``spike`` + - Add a spike regressor in the timepoints when the framewise displacement exceeds this threshold. + - deactivated + * - ``detrend`` + - Apply detrending on timeseries, before confound removal. + - activated + * - ``standardize`` + - Scale signals to unit variance. + - activated + * - ``low_pass`` + - Low cutoff frequencies, in Hertz. + - deactivated + * - ``high_pass`` + - High cutoff frequencies, in Hertz. + - deactivated + * - ``t_r`` + - Repetition time, in second (sampling period). + - from nifti header + * - ``mask`` + - If provided, signal is only cleaned from voxels inside the mask. If not, a mask is computed using :func:`nilearn.masking.compute_brain_mask`. + - compute \ No newline at end of file -- 2.52.0 From 62fb4998d4ccd21cbd99b312d27b204a78ad7d61 Mon Sep 17 00:00:00 2001 From: Fede Date: Fri, 4 Nov 2022 09:00:14 +0200 Subject: [PATCH 136/142] Test nilearn vs fmriprep --- docs/understanding/preprocess.rst | 4 +- junifer/preprocess/confounds.py | 9 +- junifer/preprocess/tests/test_confounds.py | 36 +++- junifer/testing/__init__.py | 1 + ...tion_acq-seq_desc-confounds_regressors.tsv | 201 ++++++++++++++++++ junifer/testing/datagrabbers.py | 9 +- junifer/testing/utils.py | 13 ++ 7 files changed, 265 insertions(+), 8 deletions(-) create mode 100644 junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv create mode 100644 junifer/testing/utils.py diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index e23cdb529..e3241ee9c 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -42,7 +42,7 @@ The *noise components* currently supported are: The confounds options for each *noise component* are: * ``basic``: the basic confounds for each *noise component*. For example, for ``motion``, the basic confounds - are the 6 motion parameters (3 translations and 3 rotations) and their derivatives. For ``wm_csf``, the basic + are the 6 motion parameters (3 translations and 3 rotations). For ``wm_csf``, the basic confounds are the mean signal of the white matter and CSF regions. For ``global_signal``, the basic confound is the mean signal of the whole brain. * ``power2``: the basic confounds plus the square of each basic confound. @@ -71,7 +71,7 @@ or in YAML format: wm_csf: full global_signal: derivatives -The default value is to use all the *noise components* with the ``full`` *confounds*:abbr: +The default value is to use all the *noise components* with the ``full`` *confounds*: .. code-block:: diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds.py index f236cbd06..575de40e7 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds.py @@ -399,7 +399,7 @@ class fMRIPrepConfoundRemover(BasePreprocessor): # Add derivatives if needed for t_dst, t_src in derivatives_to_compute.items(): - out_df[t_dst] = np.append(np.diff(out_df[t_src]), 0) + out_df[t_dst] = np.insert(np.diff(out_df[t_src]), 0, np.nan) # Add squares (of base confounds and derivatives) if needed for t_dst, t_src in squares_to_compute.items(): @@ -415,6 +415,13 @@ class fMRIPrepConfoundRemover(BasePreprocessor): # Now pick all the relevant confounds out_df = out_df[to_select] + + # Derivatives have NaN on the first row + # Replace them by estimates at second time point, + # otherwise nilearn will crash. + mask_nan = np.isnan(out_df.values[0, :]) + out_df.iloc[0, mask_nan] = out_df.iloc[1, mask_nan] + return out_df def _validate_data( diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index 2d7d21950..9ca8cee7e 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -13,6 +13,7 @@ from pandas.testing import assert_frame_equal import numpy as np import nibabel as nib +from nilearn.interfaces import fmriprep from nilearn._utils.exceptions import DimensionError from junifer.preprocess.confounds import fMRIPrepConfoundRemover @@ -20,6 +21,7 @@ from junifer.testing.datagrabbers import ( OasisVBMTestingDatagrabber, PartlyCloudyTestingDataGrabber, ) +from junifer.testing import get_testing_data from junifer.datareader import DefaultDataReader @@ -289,7 +291,39 @@ def test_FMRIPRepConfoundRemover__pick_confounds_fmriprep() -> None: assert set(out2.columns) == set(fmriprep_all_vars + ["spike"]) assert_frame_equal(out1, out2) - # TODO: Test if fmriprep returns the same derivatives/power2 as we compute + + +def test_FMRIPRepConfoundRemover__pick_confounds_fmriprep_compute() -> None: + """Test if fmriprep returns the same derivatives/power2 as we compute.""" + + confound_remover = fMRIPrepConfoundRemover( + strategy={"wm_csf": "full"} + ) + fmriprep_all_vars = [ + "csf", + "white_matter", + "csf_power2", + "white_matter_power2", + "csf_derivative1", + "white_matter_derivative1", + "csf_derivative1_power2", + "white_matter_derivative1_power2", + ] + + t_fname = get_testing_data( + "sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv" + ) + t_full_confounds = pd.read_csv(t_fname, sep="\t")[fmriprep_all_vars] + t_basic_confounds = t_full_confounds[["csf", "white_matter"]] + + input_basic = {"data": t_basic_confounds, "format": "fmriprep"} + out_junifer = confound_remover._pick_confounds(input_basic) + + input_full = {"data": t_full_confounds, "format": "fmriprep"} + out_fmriprep = confound_remover._pick_confounds(input_full) + + assert np.all(out_fmriprep.values != np.nan) + assert_frame_equal(out_junifer, out_fmriprep) def test_fMRIPrepConfoundRemover__validate_data() -> None: diff --git a/junifer/testing/__init__.py b/junifer/testing/__init__.py index a1e573655..6a4cdba70 100644 --- a/junifer/testing/__init__.py +++ b/junifer/testing/__init__.py @@ -5,3 +5,4 @@ # License: AGPL from . import datagrabbers +from .utils import get_testing_data diff --git a/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv b/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv new file mode 100644 index 000000000..3353734fe --- /dev/null +++ b/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv @@ -0,0 +1,201 @@ +csf csf_derivative1 csf_power2 csf_derivative1_power2 white_matter white_matter_derivative1 white_matter_derivative1_power2 white_matter_power2 global_signal global_signal_derivative1 global_signal_power2 global_signal_derivative1_power2 std_dvars dvars framewise_displacement t_comp_cor_00 t_comp_cor_01 a_comp_cor_00 a_comp_cor_01 a_comp_cor_02 a_comp_cor_03 a_comp_cor_04 a_comp_cor_05 a_comp_cor_06 a_comp_cor_07 a_comp_cor_08 a_comp_cor_09 a_comp_cor_10 a_comp_cor_11 a_comp_cor_12 a_comp_cor_13 a_comp_cor_14 a_comp_cor_15 a_comp_cor_16 a_comp_cor_17 a_comp_cor_18 a_comp_cor_19 a_comp_cor_20 a_comp_cor_21 a_comp_cor_22 a_comp_cor_23 a_comp_cor_24 a_comp_cor_25 a_comp_cor_26 a_comp_cor_27 a_comp_cor_28 a_comp_cor_29 a_comp_cor_30 a_comp_cor_31 a_comp_cor_32 a_comp_cor_33 a_comp_cor_34 a_comp_cor_35 a_comp_cor_36 a_comp_cor_37 a_comp_cor_38 a_comp_cor_39 a_comp_cor_40 a_comp_cor_41 a_comp_cor_42 a_comp_cor_43 a_comp_cor_44 a_comp_cor_45 a_comp_cor_46 a_comp_cor_47 a_comp_cor_48 a_comp_cor_49 a_comp_cor_50 a_comp_cor_51 a_comp_cor_52 a_comp_cor_53 a_comp_cor_54 a_comp_cor_55 a_comp_cor_56 a_comp_cor_57 a_comp_cor_58 a_comp_cor_59 a_comp_cor_60 a_comp_cor_61 a_comp_cor_62 a_comp_cor_63 a_comp_cor_64 a_comp_cor_65 a_comp_cor_66 a_comp_cor_67 a_comp_cor_68 a_comp_cor_69 cosine00 cosine01 cosine02 cosine03 cosine04 trans_x trans_x_derivative1 trans_x_power2 trans_x_derivative1_power2 trans_y trans_y_derivative1 trans_y_derivative1_power2 trans_y_power2 trans_z trans_z_derivative1 trans_z_power2 trans_z_derivative1_power2 rot_x rot_x_derivative1 rot_x_power2 rot_x_derivative1_power2 rot_y rot_y_derivative1 rot_y_power2 rot_y_derivative1_power2 rot_z rot_z_derivative1 rot_z_derivative1_power2 rot_z_power2 motion_outlier00 motion_outlier01 motion_outlier02 motion_outlier03 motion_outlier04 motion_outlier05 motion_outlier06 motion_outlier07 motion_outlier08 motion_outlier09 motion_outlier10 motion_outlier11 motion_outlier12 motion_outlier13 motion_outlier14 motion_outlier15 motion_outlier16 motion_outlier17 motion_outlier18 motion_outlier19 motion_outlier20 motion_outlier21 motion_outlier22 motion_outlier23 motion_outlier24 motion_outlier25 motion_outlier26 motion_outlier27 motion_outlier28 motion_outlier29 motion_outlier30 motion_outlier31 motion_outlier32 motion_outlier33 motion_outlier34 motion_outlier35 motion_outlier36 motion_outlier37 motion_outlier38 motion_outlier39 motion_outlier40 motion_outlier41 motion_outlier42 motion_outlier43 +34568.90234375 n/a 1195009009.2517242 n/a 21270.00390625 n/a n/a 452413066.1718903 22449.455078125 n/a 503978033.3047524 n/a n/a n/a n/a -0.0308417382 -0.0626451877 -0.012480906200000001 0.0223657967 -0.0185019626 0.1212245258 0.011429716599999999 -0.0779061734 0.0168397261 -0.0008390030000000001 0.0144229992 -0.0518874551 0.05892975230000001 0.012300094499999999 -0.0358269604 0.043670412699999994 -0.043019809400000004 0.0314570756 -0.0115467884 0.1636387417 -0.0298580498 0.06664816650000001 -0.025693774500000002 0.1361111115 -0.0338884704 -0.0725748866 -0.053902499699999995 0.1250739886 -0.2405060747 0.0312920639 -0.0550984632 0.12032782800000001 -0.034918376200000004 0.1331866983 -0.035463936200000004 -0.0585015681 -0.0030397771 0.11743934130000001 -0.0131940626 0.0083247184 0.02219625 -0.13213612 -0.0087438108 0.0692402347 -0.0165992243 0.0304922852 -0.029534536 0.0793010706 0.0255567345 -0.06682706669999999 0.0718395535 -0.0014920727 0.0830732347 -0.0069885985 0.0585367329 -0.047885994400000007 0.11817078800000001 -0.0247676579 0.0205949521 0.0892991341 -0.0797688379 0.035869534 -0.12752910650000002 0.21849422780000002 -0.0080385354 0.0486834626 -0.0501935921 0.0070775079 -0.1284999417 0.1085240986 -0.0268999329 0.0252837713 0.0999969158 0.09998766320000001 0.099972243 0.099950656 0.09992290359999999 -0.0640324 n/a 0.0041001482497600005 n/a 0.17035999999999998 n/a n/a 0.0290225296 -0.00629969 n/a 3.96860940961e-05 n/a 0.00426258 n/a 1.81695882564e-05 n/a -0.00349599 n/a 1.22219460801e-05 n/a -0.00282329 n/a n/a 7.9709664241e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34381.484375 -187.41796875 1182086467.8283694 35125.495010375984 21263.9765625 -6.02734375 36.32887268066406 452156699.2505493 22378.541015625 -70.9140625 500799097.98801035 5028.804260253906 0.7704379999999998 20.981815 0.130580873 -0.0262705802 -0.0559477017 -0.0097023044 0.012659748899999998 -0.0026885426 0.1000988353 -0.014104500700000001 -0.0797557624 -0.026938059700000003 0.0191918471 0.048545964500000004 -0.0540031584 0.0009415761 0.0254576963 -0.024057454 0.0200137915 0.0608395029 0.064198202 0.0738522478 0.0777928513 -0.0019495979 -0.012586161499999998 0.0323261538 0.21461959809999998 0.10404930119999999 0.0003670462 -0.1433060197 0.0456459691 -0.19783679399999998 -0.016759368 0.0376008858 -0.0908609355 0.0052569642 -0.0608417385 -0.0237620971 -0.0338910849 0.0251416224 0.1034739206 -0.0079581791 -0.0059003027 -0.0007952895 -0.0922483659 -0.0048972688 0.0908040999 0.0003907122 0.0374814698 -0.0397793237 0.0383649107 -0.0055768972 -0.1092769643 0.0696009811 0.0692076796 -0.0445878388 -0.0117443002 0.028692492400000002 0.0116374172 -0.09816523369999999 -0.035928988700000004 0.09132970539999999 0.0926496694 -0.1390685931 0.000627587 0.046400834 0.2172563905 -0.10277955710000004 0.06419981799999999 0.0135044076 0.119740561 -0.004053819 -0.0149436272 -0.1678159698 0.08974380529999999 0.099972243 0.0998889875 0.0997502796 0.0995561965 0.09930684570000001 -0.0694992 -0.005466799999999994 0.00483013880064 2.988590223999993e-05 0.197888 0.027528000000000025 0.0007577907840000014 0.039159660544 -0.000333617 0.0059660730000000006 1.1130030268899999e-07 3.559402704132901e-05 0.00326167 -0.0010009100000000005 1.06384911889e-05 1.0018208281000003e-06 -0.00350885 -1.2859999999999956e-05 1.23120283225e-05 1.6537959999999884e-10 -0.00364192 -0.0008186299999999999 6.701550768999998e-07 1.32635812864e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34240.375 -141.109375 1172403280.140625 19911.855712890625 21246.705078125 -17.271484375 298.3041725158692 451422476.67682266 22369.271484375 -9.26953125 500384306.74167246 85.92420959472656 0.7182189999999999 19.559708 0.08325938299999999 -0.027815644900000002 -0.0306928692 -0.0059264461 0.0102921148 -0.0324484455 0.111745194 -0.028762851800000006 -0.0587975084 -0.0579699431 -0.011821958700000001 0.0551752017 -0.0532353558 -0.0129018961 0.0430860178 -0.0800053981 -0.0925656035 0.006235630799999999 0.1501387505 0.038255156 0.09069042599999999 -0.0073760837 -0.052479641699999996 -0.0576818712 0.0418311237 -0.058942102999999996 0.027200718999999998 -0.078528517 0.0656953213 -0.014704387900000001 -0.1126621641 0.1445027277 0.10422014789999999 -0.0295076117 -0.0769240714 -0.023397970499999997 -0.014569576 0.0349676316 0.0762762831 -0.005046198 0.0016254048999999999 0.0226164443 -0.10808639519999999 -0.0294446327 0.058625853600000014 0.0548600967 0.0494072259 -0.0407515933 -0.0059657205000000005 -0.082553636 -0.1554238148 0.0814072767 0.0638267768 -0.0157070813 -0.044884259 -0.0492330245 -0.0584448593 -0.011437878799999999 -0.08371365809999999 0.007082354599999998 0.024824702400000002 0.0166795261 -0.0128449635 0.0233841364 0.1570179443 0.0014976997 -0.1861697704 0.0062420049 0.056252569599999996 0.17473342670000006 0.10021332470000001 -0.0409790173 0.0204926859 0.09992290359999999 0.0996917334 0.09930684570000001 0.09876883410000001 0.09807852800000001 -0.0592872 0.010212 0.00351497208384 0.00010428494399999996 0.211207 0.013319 0.00017739576099999995 0.044608396849 -0.012556500000000005 -0.012222883000000006 0.00015766569225000014 0.00014939886883168912 0.00367633 0.0004146599999999999 1.35154022689e-05 1.719429155999999e-07 -0.00369475 -0.00018590000000000013 1.36511775625e-05 3.455881000000005e-08 -0.00329237 0.0003495499999999997 1.2218520249999981e-07 1.0839700216900004e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34399.77734375 159.40234375 1183344681.2995758 25409.107192993164 21251.91015625 5.205078125 27.09283828735352 451643685.2893219 22378.365234375 9.09375 500791230.5630837 82.6962890625 0.707802 19.276011 0.07394559999999999 -0.011728440500000001 -0.0263805854 0.0048467343 0.0157502933 -0.0479084049 0.09874420939999999 -0.029545309900000007 -0.050514240099999996 -0.0006691538000000001 -0.010046224599999999 0.0079747413 0.0044390908 0.0215364027 -0.0297331011 -0.0888916731 -0.13062120160000001 -0.0489974802 -0.0038819994 -0.004696510399999999 -0.0169501722 0.0302074383 -0.053102547699999995 -0.0577574078 0.1017271124 0.021057283 -0.0849263485 -0.0239357639 0.0765277625 -0.0371239659 -0.0424020876 0.06130536 0.0439239192 -0.0102515696 -0.1028229531 -0.009957695 -0.0280129142 0.0004975454 0.0389263424 0.0055439279000000004 0.0041072258 0.051050036900000005 -0.09499404800000001 -0.0399138423 0.0601365075 -0.0023155457000000003 -0.0034983497 -0.0150596672 0.006550540400000001 -0.1021238835 -0.0645523957 -0.0434851712 -0.09146141460000001 -0.0312503938 -0.0734624467 -0.0064455861 0.0641818047 -0.0013043778 -0.0214537365 0.0169020852 0.0300293682 -0.0676309341 0.0786618905 0.1179141608 0.0517709337 -0.0237499673 -0.0955185677 0.0390824649 -0.049103130700000004 0.093466431 0.0025067592 0.0465452543 -0.0470219971 0.0998489097 0.0993960955 0.09864292570000001 0.09759167619999999 0.0962455236 -0.0592846 2.599999999998437e-06 0.00351466379716 6.759999999991873e-12 0.161893 -0.049314 0.0024318705960000003 0.026209343449000003 -0.0138675 -0.0013109999999999962 0.00019230755625000004 1.7187209999999902e-06 0.00341961 -0.0002567199999999998 1.16937325521e-05 6.590515839999989e-08 -0.00369475 0.0 1.36511775625e-05 0.0 -0.00308273 0.0002096400000000001 4.394892960000004e-08 9.5032242529e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34166.703125 -233.07421875 1167363602.4318848 54323.59144592285 21253.05859375 1.1484375 1.31890869140625 451692499.5893707 22319.09375 -59.271484375 498141945.82128906 3513.108860015869 0.738218 20.104347 0.0761276 -0.0155908021 -0.0175498194 -0.0019472429000000002 0.0020754538 -0.0391526368 0.1055231325 -0.015587494399999999 -0.0543893293 -0.0028183987 0.0333560627 0.0684003292 -0.0022904220000000003 0.018606473300000002 -0.035311861 0.008424079499999999 -0.05937152070000001 0.0070308165 0.029394908100000002 0.0407945931 -0.1322747394 -0.0037034471999999995 0.1278402383 -0.0844890305 0.0176764329 -0.07364787910000001 -0.0359052456 -0.0436673078 0.0053105726 0.0418338283 -0.028615509 -0.1066853281 0.07437696469999999 0.0326650373 -0.0224515674 -0.0115913087 -0.0013945276 0.0456474397 0.0364484748 -0.0044821882 -0.011502916799999999 0.0285079454 -0.1100359939 -0.00035432650000000003 0.061710905499999996 0.023841685499999998 -0.0221512959 -0.0673487884 0.0174002119 -0.032050702400000006 0.021138035299999997 0.0038856465999999997 -0.0045740728000000005 -0.0565526906 -0.0053583325 0.0330189024 0.0946593117 0.19830642910000001 0.0478109125 -0.0162229255 0.0070591533 -0.042898167800000005 -0.0311536415 0.0220954299 -0.0727747026 -0.053529821799999995 -0.042625284900000004 0.023960216200000002 -0.0378614071 0.0791657112 0.0373074387 0.07396097530000001 0.04329723269999999 0.0997502796 0.0990023658 0.09775999380000001 0.0960293686 0.0938191336 -0.059302 -1.7400000000000748e-05 0.003516727204 3.0276000000002605e-10 0.17351 0.011616999999999987 0.00013495468899999972 0.030105720099999997 -0.043363699999999984 -0.029496199999999986 0.0018804104776899992 0.0008700258144399992 0.0035696 0.0001499899999999996 1.2742044159999995e-05 2.2497000099999882e-08 -0.00332217 0.00037258 1.1036813508900003e-05 1.3881585639999998e-07 -0.0032601 -0.00017736999999999958 3.1460116899999865e-08 1.0628252009999996e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34079.625 -87.078125 1161420840.140625 7582.599853515625 21235.841796875 -17.216796875 296.41809463500977 450960976.8219032 22340.626953125 21.533203125 499103612.6586952 463.67883682250977 0.71916 19.58532 0.2100358 -0.012852641399999998 -0.0064393826 -0.0055117878 0.0011361136 -0.0639186541 0.08742707179999999 -0.0407231381 -0.0191698095 -0.0065394913 -0.0172747375 0.0095930894 -0.0908789659 -0.0205772021 0.0184329421 0.0408686823 0.0117962705 0.059176157699999996 -0.012224653899999998 -0.12492495140000001 -0.0958700887 0.0340834227 0.08413154130000003 -0.027641633399999997 0.0644051857 -0.061843205 -0.0029090217999999998 -0.0060559685999999995 -0.0488132509 0.0139411923 -0.036207030099999996 -0.17463721350000005 0.0554795884 0.0522993261 -0.0464874555 -0.0092744292 0.0214138946 0.0665891604 0.0116999053 -0.0079737166 -0.0057275576000000005 0.0587752529 -0.09694993380000001 -0.0416624282 0.0211794508 0.016733922 0.0892818401 0.0228395513 0.0183766986 -0.0067941731 0.0362464105 0.0086761864 -0.048558791 -0.0086274342 0.1473852195 0.0284493697 0.0675352394 0.08795967710000001 -0.0053770899 -0.0444197918 0.0291005917 -0.1089241667 -0.029269113500000006 -0.07069921400000001 -0.0361441065 -0.0523036126 0.0327243116 -0.08459708460000001 0.0073025815 0.1352399695 -0.1098737451 0.0043803277000000005 -0.0016129438 0.0996270376 0.0985109326 0.0966600102 0.0940880769 0.0908143174 -0.059239699999999985 6.230000000000818e-05 0.003509342056089999 3.881290000001021e-09 0.105748 -0.06776199999999999 0.0045916886439999974 0.011182639504000004 -0.0869467 -0.04358300000000001 0.007559728640890002 0.0018994778890000011 0.004759 0.0011894000000000006 2.2648081e-05 1.4146723600000014e-06 -0.00348833 -0.00016615999999999983 1.21684461889e-05 2.7609145599999946e-08 -0.00264309 0.0006170099999999999 3.8070134009999976e-07 6.985924748099998e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34194.38671875 114.76171875 1169256083.0714266 13170.252090454102 21237.3984375 1.556640625 2.42313003540039 451027092.3931274 22387.5078125 46.880859375 501200506.0547485 2197.8149757385254 0.70928 19.316267 0.179867 0.0042867035 0.008120909300000001 -0.0027367278000000003 -0.0051491652 -0.0460153059 0.050456540999999994 -0.034804627799999995 0.007602902 -0.0278242465 -0.0242600158 -0.0709968678 -0.0069632987 -0.0671190051 -0.0103744307 0.0071500765000000015 0.014871058500000001 0.12296030150000001 -0.0458065054 -0.0912308331 -0.16827251829999998 -0.09315353900000001 0.1410332241 0.1389822718 -0.09361249619999999 0.1043079841 -0.1134695084 -0.0431858275 0.024744568999999998 0.18074806149999997 -0.0603073709 -0.061175225800000003 0.0020920174 0.0709491097 -0.0680534875 0.0014363892999999998 0.01746745 0.0339192211 -0.0009346981 -0.0034400631 -0.0189169144 0.0421414985 -0.053644020599999995 -0.0394202204 -0.0034463481 0.0260136839 0.0137327981 0.1166686781 -0.0167975138 -0.0240389714 0.0919790851 -0.10934490320000001 -0.00047864949999999994 -0.0713884357 0.1546460849 0.0463876187 0.0031871927000000004 0.0772236264 0.2006604217 0.1462028833 -0.083999318 0.0465755624 0.0362326095 0.0417833006 -0.150822073 -0.11610252929999999 0.0264776794 -0.11960027470000001 0.0321453893 0.0566900001 -0.0702732071 -0.0256717456 0.053470176900000006 0.0994792142 0.0979222811 0.0953454172 0.0917754626 0.0872496007 -0.0467173 0.012522399999999987 0.0021825061192900005 0.00015681050175999974 0.07042320000000002 -0.03532479999999999 0.0012478414950399992 0.004959427098240003 -0.148625 -0.06167830000000001 0.022089390625000004 0.003804212690890001 0.00416359 -0.0005954100000000003 1.73354816881e-05 3.5451306810000026e-07 -0.00369476 -0.00020643000000000007 1.36512514576e-05 4.261334490000003e-08 -0.0020381 0.0006049899999999997 3.660129000999996e-07 4.1538516100000014e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34170.42578125 -23.9609375 1167617998.071915 574.1265258789062 21237.78515625 0.38671875 0.1495513916015625 451043518.3430328 22364.869140625 -22.638671875 500187371.67728037 512.509464263916 0.650464 17.714482999999994 0.12888280000000002 0.0077713404 0.011984657099999999 0.014060343400000001 -0.0165588483 -0.0530573842 0.0723980835 -0.0164376039 -0.0052379577 0.0304460201 -0.054790958099999995 0.0014325614 0.0002388153 -0.0404909081 0.037491558599999995 -0.012391724299999999 0.045503366100000005 0.1222035695 0.0813575843 0.025289186800000002 -0.1647926724 -0.1288791187 0.10298257039999999 0.0959605786 -0.1292127555 0.0223801517 -0.022469362599999997 0.0096919609 0.005502101999999999 0.0201973982 -0.0764764714 0.1259684844 0.0224811425 -0.0042790347999999995 0.0122984119 0.0081627073 0.0169960462 0.023142570299999998 0.024773735699999997 0.018112211200000002 -0.0266704246 0.043497642 -0.0766198282 -0.0293554394 -0.0010894741 -0.0348719255 0.0523515658 0.016738161 -0.0572595282 0.0013463198000000002 -0.0020806738 -0.0032016330999999998 0.1490847458 -0.0334490966 0.052615807599999995 -0.059975416 0.0035199614 0.10637464560000001 0.19482588050000002 0.07348447799999999 -0.009148328 0.0821302421 0.008439051999999999 0.0654159445 0.0228661619 -0.0175182324 -0.1013536639 0.0082778147 -0.12153294390000001 0.100790036 -0.0228026234 -0.1420571489 -0.09007782130000001 0.09930684570000001 0.097236992 0.0938191336 0.08910065240000001 0.08314696120000001 -0.0280334 0.018683900000000003 0.00078587151556 0.00034908811921000016 0.0559423 -0.014480900000000019 0.0002096964648100005 0.0031295409292899997 -0.14641499999999996 0.0022100000000000453 0.021437352224999987 4.8841000000002e-06 0.0030333 -0.00113029 9.20090889e-06 1.2775554840999998e-06 -0.00318984 0.0005049199999999998 1.01750792256e-05 2.5494420639999986e-07 -0.00180315 0.00023495000000000024 5.520150250000012e-08 3.251349922499999e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34251.77734375 81.3515625 1173184251.2058258 6618.076721191406 21312.794921875 75.009765625 5626.464939117432 454235227.3819008 22410.22265625 45.353515625 502218079.5027008 2056.941379547119 0.6327510000000001 17.232104999999994 0.0750909 0.0117557372 -0.0046521355 0.0137588075 0.0104915184 0.0203674508 0.0402952619 0.0664199976 0.013712849499999999 -0.0445072654 0.06378070429999999 -0.0222698248 -0.0602626259 -0.0204496442 0.0139783364 -0.0069688308 0.007464453199999999 -0.011919935800000002 -0.0431493139 0.0401329341 -0.08781759310000001 -0.1570022468 -0.0277647297 0.0556067799 -0.018253789399999998 0.0102840293 -0.1458315107 -0.0168526152 -0.100526802 0.060149786799999994 0.1299127286 0.029052147200000007 -0.1505145098 0.0743546079 0.0466933178 0.0133058887 0.0017938096 0.0039863510999999996 0.05203865269999999 0.0164556055 0.0148149106 -0.029213448700000002 -0.042519777800000005 0.0932088573 0.0033880216 0.06452132070000001 0.0336976555 0.042373262800000006 0.0042146606 -0.0192164575 0.0302608519 -0.0297680212 0.0065651123 0.0391394803 -0.055782398600000005 0.0509440112 -0.0677370291 -0.0335747358 0.1686576668 -0.0310064964 0.0539411824 -0.0092568407 0.11361870019999999 0.093266554 -0.1116302151 0.0205982411 0.046549617 0.0806704471 0.0879835502 -0.0811424234 -0.164648613 -0.10613810060000001 -0.0959078575 0.0991099747 0.0964557418 0.092084548 0.08607420269999999 0.0785316931 -0.0249411 0.003092300000000003 0.0006220584692099997 9.562319290000017e-06 0.0597794 0.003837099999999996 1.472333640999997e-05 0.003573576664359999 -0.117679 0.02873599999999997 0.013848347041 0.0008257576959999983 0.00310989 7.659000000000009e-05 9.6714158121e-06 5.866028100000012e-09 -0.00283061 0.0003592300000000003 8.0123529721e-06 1.2904619290000026e-07 -0.00145046 0.00035268999999999985 1.2439023609999994e-07 2.1038342116e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34448.87109375 197.09375 1186724719.6338046 38845.9462890625 21301.412109375 -11.3828125 129.56842041015622 453750157.8534278 22410.59375 0.37109375 502234712.2275391 0.1377105712890625 0.625305 17.029324 0.1272665 0.0029003892 -0.0280015213 0.012750706100000002 0.0133122976 0.0307476341 0.03570943 0.0630489875 0.0014105532 -0.036677085299999995 0.0513611724 -0.0338821238 -0.016506716100000002 0.026716986499999998 0.0436637465 -0.0546583641 -0.0038883584000000003 -0.1018522727 0.0254320248 -0.0231915523 0.0406860632 -0.047710286100000006 0.0325277614 0.0374979496 0.0048560952000000004 0.039060370899999995 -0.0600191634 0.0060434915 -0.0618619838 -0.0330107671 -0.0251083135 -0.0038352151 -0.024276936699999998 -0.0129951197 0.0269958483 0.0046106783000000005 -0.033119058300000004 -0.030173471400000002 0.0678282082 0.010913619199999999 0.0126574794 -0.0295844753 -0.044345586799999996 0.0789628866 0.0138226945 0.0203443556 -0.0302762058 0.050160231500000006 0.0211441817 0.0068079572999999996 -0.0608396127 -0.0011924316 -0.0292901643 0.0483561391 -0.0482388149 -0.08245160000000001 -0.0415696802 -0.0057888405000000006 0.0020744974 -0.013608186999999999 0.045657964800000006 -0.018410955700000002 0.0832159313 0.0452411141 -0.0122444863 -0.05804532480000001 0.0782827029 -0.0472631996 -0.0365821763 -0.0331092256 0.0491039604 0.0492181837 -0.0135553868 0.0988886499 0.0955793015 0.0901455117 0.0827080574 0.0734322509 -0.0248953 4.579999999999862e-05 0.0006197759620899999 2.0976399999998732e-09 0.11265 0.0528706 0.0027953003443600003 0.0126900225 -0.07554939999999999 0.042129599999999996 0.005707711840359999 0.0017749031961600003 0.00294865 -0.00016124 8.694536822500001e-06 2.59983376e-08 -0.00249762 0.00033299 6.2381056643999984e-06 1.108823401e-07 -0.00130028 0.00015017999999999995 2.2554032399999992e-08 1.6907280784e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34326.71484375 -122.15625 1178323351.9641266 14922.1494140625 21281.173828125 -20.23828125 409.5880279541016 452888359.50287247 22330.5703125 -80.0234375 498654370.4815064 6403.750549316406 0.648671 17.665658999999994 0.05866509999999999 0.0026298760999999998 -0.0068690227000000005 0.0092842947 0.0083806613 -0.0008920775999999998 0.0371132304 0.0295658396 0.0326799341 -0.0178114083 -0.0357985932 -0.0036528437 -0.049092707199999995 0.0425924861 0.037033599300000004 0.0323377966 -0.0489094795 -0.0294493682 -0.0855440207 -0.0507561012 0.0182368849 0.07726000150000001 -0.0105099567 0.0060276266000000005 -0.1004156865 0.0777399529 -0.0571321597 -0.009628547099999999 -0.043262844 0.0067280125 0.0096154564 0.0630707517 0.039688450800000004 -0.11530359949999999 -0.1191800207 0.0063373076 -2.1800300000000002e-05 -0.0157030329 0.046608788600000006 0.006917527 0.0039083562 -0.0047778879 -0.0369549319 0.025790975 -0.041295248300000004 -0.0030546505 0.0795059233 -0.0118978302 -0.0357593102 0.029777879900000002 0.0022346214 -0.0648071038 -0.1338067178 -0.026033932200000002 -0.0111606797 -0.059338619100000004 0.0339398293 -0.0189886704 -0.022526362299999998 0.0163017924 -0.0305823244 0.1345867246 0.0277632598 -0.0295629848 0.020665288100000002 -0.0016098959 -0.0727788719 0.0686073458 -0.011056329699999999 -0.1121668256 -0.0486276993 0.178719455 0.0173016801 0.09864292570000001 0.0946085359 0.0880063298 0.0790155012 0.06788007459999999 -0.0248717 2.3599999999998622e-05 0.00061860146089 5.56959999999935e-10 0.117624 0.004974000000000006 2.474067600000006e-05 0.013835405376000002 -0.0909334 -0.015384000000000009 0.00826888323556 0.0002366674560000003 0.00277144 -0.00017721000000000013 7.6808796736e-06 3.1403384100000045e-08 -0.00205934 0.00043827999999999966 4.240881235600002e-06 1.9208935839999968e-07 -0.00145046 -0.00015017999999999995 2.2554032399999992e-08 2.1038342116e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34220.45703125 -106.2578125 1171039679.4276276 11290.722717285156 21273.37890625 -7.794921875 60.76080703735352 452556650.0888825 22324.34765625 -6.22265625 498376498.27711487 38.72145080566406 0.7120529999999999 19.391785 0.1576715 0.0048075654 -0.014966241299999999 0.0103726473 0.0123147129 -0.008387425799999999 0.0147839003 0.0177317771 0.013259718200000001 -0.0045896934 0.018337088999999997 0.0586021426 -0.012160535 -0.0356103678 -0.0035172841 0.0129722428 0.032352847000000004 -0.022642614100000003 -0.1742497277 -0.0098363666 0.0603671146 0.0154951774 -0.0189549206 -0.0051026729 -0.0058715532999999995 0.002142156 0.0806182575 -0.10994519970000001 -0.061398427 0.071603553 0.076039987 -0.039917478799999996 0.0157194433 0.0205173594 -0.060120705499999996 0.006450533499999999 0.008793451800000001 0.032926459 0.0346124471 0.0092029528 0.0108423494 0.0108889318 -0.0174069203 0.0385007595 -0.0168003826 0.027796385 0.0102639259 -0.0528161888 -0.0504903622 0.0017706958 0.045058778499999994 -0.0646221709 -0.026985947599999997 0.1187391095 0.0045998324 0.048752051500000004 -0.0594783053 -0.046543663799999996 -0.0965089459 0.0067449719 0.0451590016 -0.0413840432 -0.0191476179 -0.150659855 -0.14614733929999998 -0.034977717900000004 0.0242009992 0.1315647249 0.0071600994999999985 0.0697440778 -0.0347904402 -0.0024303518 -0.0445282988 0.0983728629 0.0935444031 0.0856717519 0.07501110700000001 0.06190939490000001 -0.014583600000000004 0.010288099999999998 0.00021268138896000005 0.00010584500160999996 0.0361648 -0.08145920000000001 0.0066356012646400005 0.0013078927590400005 -0.0541692 0.0367642 0.00293430222864 0.0013516064016399995 0.00277144 0.0 7.6808796736e-06 0.0 -0.00225593 -0.00019659 5.0892201649000015e-06 3.864762809999999e-08 -0.00106385 0.00038660999999999985 1.4946729209999994e-07 1.1317768225000005e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34279.99609375 59.5390625 1175118132.1875153 3544.8999633789062 21254.009765625 -19.369140625 375.1636085510254 451732931.11728287 22344.2734375 19.92578125 499266555.44976807 397.0367584228516 0.714781 19.466059 0.08694439999999999 0.0077593679 -0.0009082878999999999 0.007712322 0.0050375081 -0.0144468727 0.0039164935 -0.0144544138 0.0047978255 0.0059779149 0.0127047117 -0.004687894000000001 0.0473494502 -0.0381713486 -0.0401995926 -0.0611126467 0.0523383553 0.0587565041 -0.0673928292 -0.0420208154 0.0556649596 -0.0292094164 -0.0109585376 -0.0698096874 0.0075862778 -0.07456258860000001 0.0445054262 -0.07217809160000001 -0.0722230392 0.0742743898 -0.102451819 -0.036327316 0.060331692 -0.045860704 0.1312051581 0.0131186369 0.0052588099 0.0138279163 0.0047087590999999995 0.0054674176 -0.0050753415 0.010544298200000001 -0.0030353744 -0.012995433999999998 -0.009891999 -0.0064694674 -0.0513656045 -0.0004938574 -0.0019128664000000002 -0.0151717207 0.0288380044 -0.0760685476 0.0373696276 0.0762814249 0.0743525722 0.0805001761 -0.0646510619 -0.014994429699999999 -0.031120488999999998 -0.0504281257 0.0651235672 0.0284126877 0.011070828700000002 -0.08084156740000001 -0.0410790918 -0.0838737234 -0.1148231447 -0.0846176822 0.0112230774 -0.1113838959 0.0452678015 0.0350270399 0.0532734642 0.09807852800000001 0.0923879533 0.08314696120000001 0.0707106781 0.0555570233 -0.012774700000000005 0.001808899999999997 0.00016319296009000014 3.272119209999989e-06 0.07038489999999999 0.03422009999999998 0.001171015244009999 0.004954034148009998 -0.0420787 0.012090500000000004 0.0017706169936899997 0.0001461801902500001 0.00208185 -0.0006895899999999999 4.3340994225000005e-06 4.755343680999999e-07 -0.00225593 0.0 5.0892201649000015e-06 0.0 -0.000976942 8.690800000000012e-05 7.553000464000021e-09 9.54415671364e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34241.0234375 -38.97265625 1172447686.0474243 1518.867935180664 21271.123046875 17.11328125 292.8643951416016 452460675.6752968 22341.955078125 -2.318359375 499162956.7129555 5.3747901916503915 0.7155729999999999 19.48764 0.0996898 0.0015187462 0.0046681094 0.0114620869 0.0061001101 0.0102978966 0.0133389699 0.0113325392 -0.0156988718 -0.0611334441 0.0052136916 -0.0256316207 0.011652793 -0.0093475529 -0.0392712793 -0.027716156000000002 -0.0102828468 0.10677666279999999 0.039887126200000005 -0.049504751500000006 -0.0411180751 -0.0576281851 0.0811743039 -0.10396314890000001 -0.098276346 -0.0046362524 0.1393481473 -0.0308707131 -0.034147443900000005 0.0436698189 -0.037600188900000005 0.0135546777 -0.0412720183 -0.0801264337 0.029234759 0.0032187843 -0.0074627743999999985 0.0029465992 0.004066567 0.013479868 -0.0062433270999999995 -0.0103193687 -0.0019361551999999998 0.014023411699999998 0.0258723229 0.0582420185 -0.0082097657 0.0380415046 0.0257424483 -0.0265978475 0.0336297587 -0.0626002449 0.0718068068 -0.11591581710000001 0.09588200599999999 -0.07787698900000001 -0.0845589147 0.0604365385 0.0166260991 -0.056801251500000004 -0.0773654783 0.0559277517 -0.0294731812 -0.0579311734 0.028837282000000002 -0.079075117 -0.036799182799999997 0.1440116613 -0.09128462710000004 -0.1419264373 0.1129388027 0.041222921 0.15158402810000002 0.09775999380000001 0.0911403277 0.08043756349999999 0.06613118650000001 0.0488621241 -0.0248582 -0.012083499999999995 0.00061793010724 0.00014601097224999988 0.0854391 0.01505420000000002 0.00022662893764000054 0.00729983980881 -0.028324 0.013754699999999995 0.0008022489760000001 0.00018919177208999983 0.00235672 0.00027487 5.5541291584e-06 7.555351689999999e-08 -0.00182837 0.00042756000000000017 3.3429368569e-06 1.8280755360000015e-07 -0.00145046 -0.000473518 2.2421929632399997e-07 2.1038342116e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34370.796875 129.7734375 1181351677.8225098 16841.145080566406 21314.537109375 43.4140625 1884.7808227539065 454309492.18692404 22338.3046875 -3.650390625 498999856.3115845 13.32535171508789 0.697742 19.002037 0.05071929999999997 0.0053201916 -0.0027795709999999998 0.018381724199999998 0.0200518453 0.038202574100000004 0.0035960539 0.0510755797 0.020530606599999997 -0.021649916800000002 0.0053158484 -0.015039090900000001 -0.1160252474 0.050871111399999995 -0.0059043718000000005 -0.0824689162 -0.0747036682 0.010585798200000001 0.0098010671 -0.022920086800000003 0.0224082612 -0.08452591890000001 -0.1060072256 -0.0639127787 -0.0535499138 -0.168770814 -0.014279071499999999 -0.033153886 -0.022026519100000003 -0.013807011000000001 -0.0050258432 -0.062377721 -0.0549472396 0.0353228104 0.0342510174 0.0097589418 -0.0238844489 -0.0261938881 -0.0011170178 0.0223824605 0.018410219499999998 -0.0369434119 -0.005006782800000001 0.0630944199 -0.0136248447 0.0073040042 0.0956041978 0.014516223100000001 0.07439466089999999 -0.051061188099999995 -0.056146368200000005 -0.0680999523 0.030364788900000002 -0.0169597925 -0.0187400645 -0.0092910326 -0.0911450347 -0.032119709100000005 0.0448049882 -0.1503278774 0.1510276216 -0.022601251800000003 -0.0048956804 -0.022186647900000002 -0.0493148766 0.055269552699999995 0.0069061365 0.0234395502 -0.018373895 -0.08539000320000001 0.1624134546 0.0710368876 -0.051987988799999996 0.0974173387 0.08980275759999999 0.0775495743 0.0612907054 0.0418659738 -0.0248252 3.299999999999831e-05 0.0006162905550400001 1.0889999999998884e-09 0.0854418 2.6999999999943736e-06 7.289999999969617e-12 0.007300301187239999 -0.0220334 0.0062906 0.0004854707155600001 3.957164836e-05 0.00255554 0.00019881999999999973 6.530784691599998e-06 3.952939239999989e-08 -0.00152046 0.00030791 2.3117986116e-06 9.48085681e-08 -0.00106933 0.00038112999999999987 1.4526007689999993e-07 1.1434666489e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34400.1953125 29.3984375 1183373437.538147 864.2681274414062 21263.400390625 -51.13671875 2614.9640045166016 452132196.17203134 22315.208984375 -23.095703125 497968552.01633066 533.4115028381349 0.743073 20.236559 0.06393499999999999 0.010366591 -0.0073966206999999985 0.0095318132 0.0110068915 -0.0023811267999999997 -0.0051385120000000005 -0.0038206946999999997 0.0036765664 -0.0050724077 -0.0227142742 -0.0104544976 -0.042774937400000004 0.0928879407 0.018453376299999998 -0.0694321282 -0.0653077381 -0.0963959927 -0.0806725263 -0.0615461155 0.0845749054 0.042296633 -0.025007218900000003 -0.0160392656 -0.06577051269999999 -0.0084586821 -0.006063435799999999 0.07359557559999999 -0.072679366 0.026240931600000003 0.021113043999999997 0.0539356088 -0.22504014309999998 -0.006135199399999999 0.0201309653 0.0110396067 -0.0206694837 -0.0332273206 -0.0030027758000000003 0.012510474399999999 0.0119197648 0.0066831328 0.0016063452 -0.0169104829 -0.0129059203 0.0006620039999999999 0.052788602999999996 -0.0107803056 0.07314940190000001 0.0228933084 -0.0499335588 -0.08946417029999999 -0.1128927444 0.048525047300000006 -0.0573213859 -0.0392395152 -0.0685862849 -0.0184048805 -0.0749988752 -0.0462527826 0.0185230166 0.1295658549 0.0036788039000000003 0.167449177 -0.0947034635 0.0528458383 0.0343728476 0.0016085593 -0.014762728000000001 -0.1737673779 -0.08454947800000001 0.011668219099999998 0.054034524 0.0970506473 0.088376563 0.0744894057 0.0562083378 0.034611705699999995 -0.0269793 -0.0021540999999999986 0.0007278826284900001 4.640146809999996e-06 0.115759 0.03031719999999999 0.0009191326158399995 0.013400146080999995 -0.0285976 -0.006564199999999999 0.00081782272576 4.3088721639999986e-05 0.00222881 -0.00032672999999999985 4.9675940161e-06 1.0675249289999994e-07 -0.00152046 0.0 2.3117986116e-06 0.0 -0.00124059 -0.0001712599999999999 2.9329987599999965e-08 1.5390635481e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34234.96875 -165.2265625 1172033085.3134766 27299.816955566406 21251.720703125 -11.6796875 136.41510009765622 451635632.8436317 22285.482421875 -29.7265625 496642726.7756996 883.6685180664062 0.63781 17.369864 0.137464 0.0139202786 -0.0026799336 0.0163755846 0.0017985791 -0.015800521799999998 -0.0271798758 -0.0149149137 0.0050138146 -0.0075877585 -0.0471329675 0.0149335442 -0.042183850599999996 0.0336344363 0.0243642728 0.0005264647000000001 -0.020208355600000002 -0.054350568700000004 -0.0882370333 0.0122590046 -0.058461681200000004 0.0742194754 -0.052359380899999995 -0.0209075534 -0.1374569273 -0.0593241639 0.0054223890000000005 0.0584300991 -0.0816746139 0.0259797616 -0.12214583300000001 -0.0611837249 -0.0308883275 -0.0973919399 0.0246107736 0.014192879299999999 0.0014647977 0.0049921263 -0.021682146099999997 0.0177818603 0.0042018541 0.0154846461 0.0265619344 -0.0245305306 -0.0227220417 0.0228118106 0.0625523348 -0.0197356016 0.0051036981 0.0307854379 0.0056378581 -0.0589998903 -0.0606252196 0.005589728100000001 -0.0619385805 0.0153318077 0.08888933519999999 0.010572476 -0.0160694725 -0.08957066640000001 0.0455406948 0.1145912086 -0.0556381314 0.019942125800000002 -0.09869550710000001 0.0258888843 0.0004116368 0.0322037246 -0.181366953 -0.1024292342 -0.0562716463 0.035140404 0.0677197908 0.0966600102 0.0868631514 0.07126385190000001 0.0509041416 0.027144045 -0.0248385 0.0021408000000000017 0.00061695108225 4.583024640000007e-06 0.032978 -0.082781 0.006852693960999999 0.001087548484 -0.039867800000000016 -0.011270200000000008 0.0015894414768400007 0.0001270174080400002 0.00170963 -0.0005191799999999999 2.9228347369e-06 2.695478724e-07 -0.00129465 0.0002258099999999999 1.6761186225e-06 5.0990156099999954e-08 -0.00132104 -8.045000000000014e-05 6.472202500000022e-09 1.7451466816000003e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34187.8203125 -47.1484375 1168807057.7197876 2222.9751586914067 21247.712890625 -4.0078125 16.06256103515625 451465303.08243185 22322.173828125 36.69140625 498279444.4130287 1346.259292602539 0.623794 16.98815 0.07984255 0.0184818011 -0.0091292159 0.013630738100000001 0.0096847254 -0.003983544 -0.0073999246999999985 -0.0339392107 -0.0089760454 -0.0161697702 0.0190306715 0.062065753099999996 0.0137967267 -0.0471517657 -0.0226884417 -0.026761751 -0.0221639048 -0.058046898300000004 -0.006825798 0.0038406603 0.111330695 0.06077040490000001 -0.036727787000000005 0.08955885949999999 -0.0101864091 -0.09254573 0.1569417146 0.06593445120000001 0.032770650899999997 0.0266370305 0.0624211317 0.008069766899999999 -0.0770973192 0.061083689000000004 -0.0062655415 0.0175718474 0.00783607 0.0402683235 -0.0161378824 0.013999848799999999 0.0115757617 0.0112487112 0.0010941213 -0.0376814001 0.0070018965 0.031812285600000004 -0.0340632364 -0.05163561480000002 -0.016486835 -0.0592348991 -0.009150541600000001 0.0172996354 0.015248727 0.0454455444 -0.0198456373 -0.0225219232 -0.0885180194 -0.0546870083 -0.1399534785 0.0595353805 -0.0107344778 -0.013853526299999998 -0.20653897170000002 0.010864761899999999 -0.0913886066 0.15965465480000002 -0.0136354257 -5.48849e-05 0.045414835099999995 -0.12569027359999999 -0.05841012070000001 -0.0690320856 -0.0178910573 0.0962455236 0.0852640164 0.06788007459999999 0.04539905 0.0195090322 -0.0248329 5.5999999999979686e-06 0.0006166729224100001 3.1359999999977235e-11 0.0329832 5.199999999996874e-06 2.7039999999967492e-11 0.0010878914822399998 -0.021995 0.017872800000000008 0.0004837800249999999 0.0003194369798400004 0.00170963 0.0 2.9228347369e-06 0.0 -0.0006643910000000001 0.000630259 4.4141540088100006e-07 3.97226407081e-07 -0.00071212 0.0006089200000000001 3.7078356640000015e-07 5.071148944e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34246.8125 58.9921875 1172844166.4101562 3480.0781860351562 21245.509765625 -2.203125 4.853759765625 451371685.2012672 22361.46484375 39.291015625 500035109.9582672 1543.7839088439941 0.6669619999999999 18.163786 0.1387213 0.012256216399999999 -0.012878959099999998 0.0149652972 -0.0042331910999999995 -0.0029168707 -0.0461643135 -0.0264355171 -0.0326645619 -0.0030924189000000003 0.0043180363000000005 0.0710061033 0.0518613706 -0.0569390484 -0.0466774817 0.007997970200000001 0.026819972799999998 -0.021381382200000004 -0.0341980867 0.046849569 0.11198614650000001 0.0014722832 -0.0965064469 0.0088934315 0.0281647401 0.1809721999 0.13410725240000002 0.049296191399999995 0.1555546812 0.0062199287 0.0173496702 0.0414287317 -0.0272346031 -0.010844685500000001 0.00567152 0.0100819873 0.00105716 0.0311847371 -0.0099592769 0.0164401829 -0.0045591276 0.0025493692999999998 0.0480836413 -0.0256142991 0.041302732599999996 0.020095791000000002 -0.057642897400000004 -0.0477868075 -0.0319532302 -0.041589010600000004 0.0531820146 0.0250709901 0.0124609999 0.0177665437 -0.0876311005 0.0018876313 -0.1016685879 -0.1591473951 -0.0622061525 0.0706616976 -0.18303687579999997 0.0261725844 -0.0368780138 -0.0680805801 0.06965587570000001 -0.0329437359 0.086601675 -0.0370324354 0.0617083097 -0.0476507396 0.0538180089 -0.0165849114 -0.004128805399999999 0.09580728990000001 0.0835807361 0.06434558650000001 0.0397147891 0.0117537397 -0.0248848 -5.189999999999709e-05 0.00061925327104 2.693609999999698e-09 0.109109 0.07612580000000001 0.0057951374256399995 0.011904773881 0.0052299 0.0272249 2.7351854010000002e-05 0.0007411951800099997 0.00115852 -0.0005511100000000001 1.3421685903999997e-06 3.0372223210000004e-07 -0.000515822 0.0001485690000000001 2.66072335684e-07 2.2072747761000026e-08 -0.000718815 -6.69500000000003e-06 4.4823025000000396e-11 5.166950042250001e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34216.046875 -30.765625 1170737863.7521973 946.523681640625 21289.611328125 44.1015625 1944.9478149414065 453247550.5026283 22391.9765625 30.51171875 501400614.3755493 930.9649810791016 0.8193530000000001 22.313925 0.18732755 0.026416024399999998 0.0162666124 0.020278472 0.0034386483 0.020061686000000002 -0.0668474133 0.0040348375 0.003875732800000001 0.0013867048000000002 0.0427102151 -0.0249389021 -0.015019835300000001 -0.09096405279999999 0.013103484399999999 0.0479454142 0.06259553940000001 0.0868439933 0.0137833744 -0.0004082556 -0.0863421542 0.032363804700000005 -0.018595868 -0.0476781622 0.15804599560000002 0.0054138736 0.023467102599999998 0.11160705289999999 0.0238366475 0.0298856098 0.005261624300000001 -0.052513545599999996 0.0319407622 -0.0761811637 0.1343168492 0.0277574694 0.0171742874 0.0218562138 -0.0718776355 0.0173802796 0.016517623999999998 -0.0196330314 0.0733269133 0.0304121216 0.0014053853 0.0072824578 -0.0023342607999999997 0.0549361693 -0.0106924001 -0.009969094599999999 0.029666254500000006 0.0354568145 0.026191014900000004 0.009837637 0.09516087570000001 0.1172755857 0.1002204235 -0.1300525975 0.0353819654 -0.04927584980000002 -0.0985933108 -0.19222005829999997 0.05518817559999999 -0.026878782 0.08564682550000001 -0.0106702554 0.0766549611 0.0013359759 -0.0491254993 -0.10988185210000001 -0.0388995974 0.06046877990000001 -0.0655185408 0.0953454172 0.0818149717 0.060668235099999995 0.033873792 0.0039259816 -0.0207103 0.004174500000000001 0.00042891652608999985 1.742645025000001e-05 0.0479503 -0.0611587 0.00374038658569 0.0022992312700900004 -0.0383516 -0.0435815 0.00147084522256 0.00189934714225 0.000323978 -0.000834542 1.0496174448400001e-07 6.964603497640001e-07 -0.000204878 0.000310944 4.1974994883999995e-08 9.668617113599998e-08 -0.00029604400000000003 0.000422771 1.78735318441e-07 8.764204993600001e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34572.94140625 356.89453125 1195288277.4799955 127373.70643615724 21318.5234375 28.912109375 835.9100685119629 454479441.5552368 22448.333984375 56.357421875 503927698.6740456 3176.1590003967285 0.934331 25.445196 0.128099394 0.0279514404 -0.006131772 0.033369746 0.0093840091 0.06507133009999999 -0.0541827985 0.0701506205 0.10828472289999999 0.0093279517 -0.017228061 -0.0299486414 -0.0515225718 0.1367391697 0.019262703500000002 -0.0331166619 0.0233227106 0.0352644327 -0.0746900277 0.0129108478 0.006520738000000001 0.014986064399999999 -0.1214232798 -0.045632150499999996 -0.0102522182 0.0588259897 0.0545890052 0.1110404461 -0.1170224303 0.0715428858 0.0968961751 0.02575891 0.0359123058 0.10264051810000001 -0.1270868651 0.027331896600000002 -0.0459487395 -0.07009136769999999 -0.0229569093 0.030358155499999998 0.014562328700000004 -0.053437215499999996 0.05828493940000001 0.071432672 -0.1024082874 -0.0067503505 0.0607154632 -0.0050975502 0.0869381805 0.1216935069 -0.0308874321 -0.0991966048 -0.0069673259 -0.0149550816 -0.0285510067 -0.021986863399999997 0.0226676393 -0.1211229097 -0.0525187777 -0.14997271439999998 -0.1072141549 -0.0462391477 0.0293333917 -0.033694411699999996 -0.10172594439999999 0.0561088429 0.0941948125 0.0084882101 0.0653003479 0.12474040859999999 0.0268956102 -0.0348284299 -0.0469695367 0.09486001949999999 0.0799684658 0.0568561851 0.0278991106 -0.0039259816 -0.00505406 0.01565624 2.55435224836e-05 0.00024511785093759994 0.00406846 -0.04388184 0.0019256158817856 1.6552366771600006e-05 0.000508694 0.038860294 2.5876958563599994e-07 0.0015101224497664355 0.000197711 -0.000126267 3.9089639520999995e-08 1.5943355289000002e-08 -2.76309e-05 0.0001772471 7.6346663481e-10 3.141653445841e-08 -5.5377e-06 0.00029050630000000005 8.439391033969003e-08 3.0666121289999996e-11 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34406.8671875 -166.07421875 1183832509.6582642 27580.64613342285 21295.728515625 -22.794921875 519.6084632873535 453508053.01120377 22376.666015625 -71.66796875 500715181.9748269 5136.2977447509775 0.87949 23.951683 0.159323506 0.014302038799999996 -0.017339348100000002 0.0210394425 0.0077982763 0.0583655492 -0.053196947800000005 0.0202044448 0.0009672276 -0.025174406 0.0360069212 -0.0211900259 -0.0478885057 0.1059287194 0.10682854060000001 0.0546745534 0.1067225859 -0.0881463954 0.0484774188 0.023677472 0.0138451116 0.1908689194 -0.07717291309999999 0.0753883697 -0.07542179660000001 0.0817313497 -0.0305312931 0.11031760970000001 -0.1140044358 -0.0827685943 0.050763686399999994 -0.0546131947 0.065104219 -0.08730261880000001 -0.0089597546 0.0194738523 -0.022644357200000003 -0.0238330652 -0.0027116518 0.0162944598 0.017130108 -0.06063656360000001 0.044374297 0.042445165 0.0104013479 0.0018867743 0.0106767818 0.045399805700000004 0.0673618074 0.1803649746 -0.0796396103 0.0898301715 -0.061759609800000004 0.0363603902 -0.020632309799999998 -0.0828613409 0.18082877149999999 -0.054945414299999995 -0.0752333204 0.0353455535 -0.0343271867 0.13838094509999999 0.0685898694 -0.0832286067 0.0110523938 0.0894833536 0.1176125164 -0.1159561975 0.0043834677 0.027074761800000003 -0.0917725196 0.17002830670000002 0.0461984133 0.09435121640000001 0.0780430407 0.0529179001 0.0218143241 -0.0117537397 -0.0100843 -0.005030239999999999 0.00010169310648999998 2.5303314457599992e-05 0.109783 0.10571454 0.0111755639674116 0.012052307088999998 0.014426 0.013917306 0.000208109476 0.000193691406297636 -0.000211431 -0.000409142 4.4703067761e-08 1.6739717616399998e-07 -0.00010112 -7.34891e-05 1.02252544e-08 5.40064781881e-09 -0.000216135 -0.0002105973 4.435122276729e-08 4.6714338225e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34321.1171875 -85.75 1177939084.998108 7353.0625 21241.052734375 -54.67578125 2989.441055297852 451182321.26449966 22353.96875 -22.697265625 499699918.87597656 515.1658668518066 0.772842 21.047277 0.08180259 0.0184072081 -0.0025861601 0.016734632 0.0035120503999999998 -0.010162201 -0.0600477913 -0.0416010949 0.0402402506 0.0402611585 -0.0747529063 0.0049742416 0.0184376623 0.0344226589 0.011019519299999999 0.0065699611 0.07833230719999999 0.0037750827 -0.046770211299999996 0.054502483 0.1130902285 0.0509097892 -0.10007497720000001 0.0786194016 -0.0934318609 -0.004064059 0.0889209883 0.15514348390000002 0.1402817854 -0.0547248505 0.0382608211 0.030427694900000007 0.0541494329 0.0111606743 0.0627492253 0.0203165778 0.0020457342 -0.0076268935 -0.030238209 0.0147209648 0.0077003511 0.0114260801 0.0659662634 -0.0613671226 -0.0628620886 -0.0280478734 0.0083119843 -0.027012503599999998 0.0046886817 0.0723078701 -0.0010202914 -0.0058289739 0.0699432738 0.0731796271 -0.0527921279 0.0524023867 -0.0022670254 -0.0744319488 -0.0385435275 0.0746575458 -0.0820116839 0.1278674347 -0.1600050643 -0.0517776704 0.058886300499999995 0.1460366451 0.050174215300000005 -0.1910606948 0.0197542022 0.17251543719999998 -0.0474273664 0.1522033052 -0.0612966902 0.0938191336 0.0760405966 0.0488621241 0.015643446499999998 -0.0195090322 -0.00681801 0.003266289999999999 4.64852603601e-05 1.0668650364099994e-05 0.0958431 -0.013939899999999993 0.00019432081200999976 0.009185899817610001 0.017196699999999995 0.002770699999999996 0.0002957264908899998 7.676778489999977e-06 0.0004186180000000001 0.000630049 1.7524102992400005e-07 3.9696174240100006e-07 -0.000209792 -0.00010867200000000002 4.401268326400001e-08 1.1809603584000003e-08 0.000281658 0.0004977930000000001 2.477978708490001e-07 7.933122896400001e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34260.74609375 -60.37109375 1173798722.9004061 3644.668960571289 21235.6015625 -5.451171875 29.715274810791016 450950773.7212525 22306.408203125 -47.560546875 497575846.9244423 2262.0056190490727 0.713819 19.439878 0.063074065 0.02625785 0.027046075 0.0199708644 -0.0050402438 0.008208749 -0.1110601281 -0.0305746033 -0.0397831052 -0.0565603259 0.001289348 0.0165641174 0.1295550251 0.0157782672 0.0120404303 0.0405244583 -0.032144437799999995 0.0543166997 0.0021400282 0.0053571866 0.0367275923 0.0494617821 -0.0968935485 -0.0105018512 -0.06701247190000001 0.1086052357 0.032495798900000004 0.043650540599999996 0.1403606999 0.0080743632 -0.046839147000000005 0.1071755268 0.1186417776 0.0071108221999999985 0.0273554923 0.0255944561 0.012742303200000001 -0.0175963515 -0.0879598184 0.0184134354 0.0081563495 -0.0002765296 0.1193359134 -0.0333333892 0.0471502533 0.038951307000000004 -0.0810622455 -0.0571640475 -0.0741309192 0.0401440302 -0.0190956678 -0.014935875 -0.0204172491 -0.0546382608 -0.0093789654 -0.0057642018 -0.025472976499999998 -0.06865421769999999 -0.0057541017 0.0213884524 -0.12850259320000001 0.10748909279999999 -0.0105073735 -0.024459241099999997 0.13043264699999998 -0.0085155731 -0.0522333355 -0.086376564 0.008252199699999999 0.0633130331 -0.002840568 -0.057663006100000004 -0.21634661460000001 0.0932639023 0.0739631095 0.0446978621 0.0094108313 -0.027144045 -0.00672004 9.797000000000019e-05 4.51589376016e-05 9.598120900000036e-09 0.11564700000000006 0.019803900000000055 0.0003921944552100022 0.013374228609000012 0.00236683 -0.014829869999999997 5.6018842489e-06 0.00021992504421689986 3.26495e-05 -0.0003859685000000001 1.06598985025e-09 1.4897168299225005e-07 -0.000162528 4.726400000000002e-05 2.6415350784e-08 2.2338856960000014e-09 0.000148044 -0.000133614 1.7852700996e-08 2.1917025936000002e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34211.19921875 -49.546875 1170406151.9850006 2454.892822265625 21231.482421875 -4.119140625 16.96731948852539 450775845.8303871 22337.8046875 31.396484375 498977518.256897 985.7392311096193 0.7406479999999999 20.170506 0.08790381499999997 0.030889935 0.0146176095 0.0272150671 -0.026305526699999998 0.005029296 -0.1063203414 -0.042775543799999996 -0.006947280300000001 -0.0714629199 0.0057137564000000005 0.0409545402 0.12024925289999999 -0.0225754686 -0.0120326625 -0.0397214225 0.0113730338 -0.0823275414 0.025055689300000003 0.08109205230000001 -0.06274167580000001 -0.0445118647 -0.1028429741 -0.1522354808 -0.0810081808 -0.0173669446 0.1242624732 0.15469739359999998 -0.06640325059999999 0.1307127784 0.0438586879 -0.071882528 -0.0008078983 0.0695045411 0.21160883170000008 0.0313900065 0.0029414740000000003 -0.0026251509999999996 -0.0746592116 0.028629208700000002 -0.0180135219 -0.0021735453 0.10645828980000001 -0.059006374199999996 0.021711522 0.0790611775 -0.07899889980000001 -0.0337343909 -0.0400102741 -0.0191187141 0.022732849 0.016042756499999998 0.07753463049999999 0.0461219521 -0.0930103908 -0.028207004900000002 -0.0264183771 -0.028217218199999998 0.0347487162 -0.2376655486 -0.1909937433 -0.041275997599999996 0.004563779699999999 -0.0002352748 -0.16356820630000002 0.000690136 0.0053950811999999996 0.043059899900000004 -0.2240985522 0.14384720939999998 0.0970514724 -0.1053841733 -0.024453047000000002 0.09268565960000001 0.0718126298 0.0404343596 0.0031410759000000004 -0.034611705699999995 0.00291528 0.00963532 8.4988574784e-06 9.283939150239998e-05 0.0958558 -0.01979120000000005 0.000391691597440002 0.00918833439364 0.0140586 0.01169177 0.00019764423396 0.00013669748573290002 0.0004648980000000001 0.0004322485000000001 2.1613015040400005e-07 1.8683876575225003e-07 0.000135311 0.000297839 1.8309066721e-08 8.870806992100001e-08 0.00035366699999999995 0.00020562299999999994 4.2280818128999976e-08 1.2508034688899993e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34324.1796875 112.98046875 1178149311.2197876 12764.586318969728 21256.3046875 24.822265625 616.1448707580566 451830488.9678345 22378.341796875 40.537109375 500790181.5777626 1643.257236480713 0.921085 25.084465 0.20811995 0.0400672455 0.006665969399999999 0.0283270944 0.00030493860000000003 0.040643056000000004 -0.10514540189999999 -0.0140298666 -0.027362874 0.0325130096 0.0030788132 0.04463867269999999 0.0817922492 0.0221018779 0.032037175 -0.0446972808 0.0336432298 -0.0478072786 -0.09084031320000001 -0.0473403984 0.0195871681 0.08397646630000001 -0.0783974297 -0.0164596493 -0.0612780755 0.122774706 0.0718879179 -0.0178238273 -0.049473104500000004 0.0495222587 0.094265578 0.1102006135 -0.0381562632 0.024455763300000002 0.1192110232 0.0306155677 -0.0013458702 -0.008121764200000001 -0.07322318139999999 0.0254421686 0.0119103044 -0.026731419 0.096662863 -0.0242367044 0.008377151 -0.022703297799999998 -0.0638501808 -0.0539215646 -0.0427171817 0.0523880346 -0.025357435499999997 -0.08894969650000001 -0.0236802568 0.0752669238 -0.0036982946999999998 -0.10133621699999999 -0.0176273511 -0.09795731769999999 -0.05839155190000001 0.006242895500000001 -0.1353923755 0.1077633952 0.0337481254 0.044233846900000005 -0.025800068500000002 0.040423251699999996 0.0139125774 -0.030054857400000006 0.1595063163 0.0628199434 -0.0020271937 0.0306438146 0.0375751162 0.092084548 0.0695912797 0.036081082599999995 -0.0031410759000000004 -0.0418659738 -0.00425188 -0.007167160000000001 1.8078483534400005e-05 5.136818246560001e-05 0.0181577 -0.0776981 0.00603699474361 0.00032970206929 -0.00674162 -0.02080022 4.54494402244e-05 0.0004326491520484 -0.000537085 -0.001001983 2.8846029722499995e-07 1.0039699322890005e-06 -5.27944e-05 -0.00018810540000000002 2.78724867136e-09 3.538364150916e-08 -0.000505334 -0.0008590009999999999 7.378827180009999e-07 2.5536245155599997e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34072.94140625 -251.23828125 1160965336.0737455 63120.6739654541 21259.546875 3.2421875 10.51177978515625 451968333.3303223 22405.1328125 26.791015625 501989976.34576416 717.7585182189941 1.028304 28.004417 0.26058328 0.0581740022 0.0465549214 0.038984260699999995 -0.0204863325 0.0317259986 -0.1635055713 -0.0193265031 0.0003713186 -0.0070560554000000004 0.007809015600000002 -0.027966016200000002 0.0802518529 -0.0639737724 0.0847746311 0.0989625317 0.1006749274 0.0628212404 0.039284976400000005 -0.0025809981 -0.0101761843 -0.0123255469 0.0168060527 -0.08290781559999999 0.0720717548 -0.0337619359 0.0344702261 -0.0535549333 0.0774894669 -0.0470107584 -0.0829817046 -0.0416813807 -0.058570399599999996 0.0627225753 -0.0198080067 0.0535283037 0.0471729193 0.0266435817 -0.1371215607 0.0398356582 -0.0032997738 -0.031954775299999995 0.1652232096 -0.0202007123 0.0042866046000000005 0.0014534445 -0.0444695372 0.0729225644 -0.0885026633 0.08011620679999999 0.0065419943 0.0918089289 0.0490121609 0.0098613448 0.08577208199999999 0.057023083899999986 0.0284592734 -0.0053211622 0.007351695799999999 -0.026617372200000003 0.04706087269999999 -0.07773086400000001 -0.0677665339 0.0222627627 0.0456074819 -0.10483165650000001 0.0569344679 0.0448456025 0.0159770947 -0.0144365595 0.17761137629999998 0.0182370166 0.032948992 0.091460716 0.0673012514 0.0316476967 -0.0094108313 -0.0488621241 0.0274766 0.03172848 0.0007549635475599997 0.0010066964431103998 -0.016227600000000002 -0.0343853 0.0011823488560899998 0.00026333500176000004 -0.105785 -0.09904338 0.011190466224999996 0.009809591121824396 -0.00203102 -0.001493935 4.1250422404000005e-06 2.231841784225e-06 0.000132529 0.0001853234 1.7563935840999998e-08 3.434476258756e-08 -0.000734598 -0.0002292640000000001 5.2561981696000026e-08 5.396342216040001e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34366.1953125 293.25390625 1181035380.256897 85997.85353088379 21287.392578125 27.845703125 775.3831825256348 453153082.7752113 22404.6484375 -0.484375 501968271.6079712 0.234619140625 1.0864280000000002 29.587345000000006 0.3058541 0.0930806941 0.036175157 0.0625855567 -0.023076760699999997 0.056152203600000006 -0.1505815784 0.0436039576 0.040467486000000004 0.0933119699 0.028448657999999998 -0.0856538494 0.0917628235 -0.0629228369 0.0452892311 0.1401654021 0.0408399174 -0.1187385154 -0.0035020673 0.0004874059 -0.0206066507 0.0607256008 0.1441005564 0.11395134050000001 0.0893679898 -0.004127808 -0.11918628390000001 0.132554434 0.0021855467000000003 0.060668968899999995 -0.0435195656 0.0829759057 -0.0755278652 0.0841556693 -0.0412723852 0.08534530679999999 0.0160220472 -0.0546190745 -0.10069886289999999 0.0627151321 0.0038513042 -0.0511086782 0.1453289434 0.0342726269 -0.0537777909 -0.1010562141 -0.088671397 0.070066573 -0.0800764095 0.0533916399 0.07282464940000001 0.1176991889 -0.09317657539999999 0.0684569612 0.0027734404 0.047862715800000004 0.090494401 0.11863956199999999 -0.0323571345 0.1456028599 -0.0308237677 -0.0341561218 0.0138731554 0.1829146953 -0.0686523015 0.07316557230000001 -0.0407975993 -0.062841618 0.0182849182 -0.047783917300000006 -0.10178726839999999 -0.007812383199999998 0.0455741517 0.0908143174 0.0649448048 0.027144045 -0.015643446499999998 -0.0555570233 0.0950015 0.06752489999999998 0.00902528500225 0.00455961212001 -0.0159803 0.0002473000000000024 6.115729000000117e-08 0.00025536998809 -0.14741700000000002 -0.04163200000000003 0.02173177188900001 0.0017332234240000025 -0.00433252 -0.0023015 1.87707295504e-05 5.29690225e-06 0.000241899 0.00010937000000000002 5.8515126201e-08 1.1961796900000005e-08 0.0007835299999999997 0.0015181279999999994 2.3047126243839988e-06 6.139192608999997e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34224.2421875 -141.953125 1171298753.3086548 20150.689697265625 21261.859375 -25.533203125 651.9444618225098 452066664.0822754 22388.826171875 -15.822265625 501259537.35443497 250.34408950805664 0.941383 25.637266 0.17909645 0.0850201215 0.0481332737 0.050323033600000004 -0.0235488158 0.0358830531 -0.1805223612 0.0300191783 0.09993036890000001 0.040501466800000004 -0.0454512205 -0.0923018035 0.0524838228 0.0036053558 -0.0571280398 0.147858216 0.0198464548 0.0730732522 -0.0848046174 0.0560349567 0.0569767184 -0.050267518899999995 0.07538394450000001 0.0064801107 0.0809737838 -0.0752675782 0.0066707558999999994 -0.0101064776 0.0959601759 0.0434660016 0.0782855776 -0.0425791848 -0.060036375 0.0658553237 0.108034055 0.0828026149 0.026037957599999998 -0.030792725299999997 -0.1323365956 0.0499972624 -0.0038683765999999995 -0.032750255 0.18866904199999998 0.009709495600000001 -0.10948233800000001 -0.07969241099999999 -0.0159743065 0.0444533525 -0.0544166846 0.0656658707 0.1632688416 -0.0350743796 -0.0028787534999999997 -0.0669080715 -0.0092321523 0.1210073203 -0.0718916188 0.0524823881 -0.014720158700000001 0.07187843940000001 -0.0156820521 -0.0657034801 -0.05609534730000002 -0.025954941699999998 0.0092882363 0.0707437709 -0.0707073699 0.0564417082 0.0862257279 0.040607395899999996 0.0312739714 -0.1037696068 -0.0786854671 0.0901455117 0.06252426559999999 0.022580126699999998 -0.0218143241 -0.06190939490000001 0.07370559999999997 -0.021295900000000038 0.005432515471359995 0.00045351535681000156 -0.0552696 -0.039289300000000006 0.00154364909449 0.0030547286841600004 -0.0722238 0.07519320000000003 0.005216277286439999 0.005654017326240002 -0.00402707 0.0003054500000000005 1.6217292784899993e-05 9.329970250000033e-08 0.00017047400000000002 -7.142499999999999e-05 2.906138467600001e-08 5.101530624999998e-09 0.00029404400000000003 -0.0004894859999999997 2.395965441959997e-07 8.646187393600002e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34637.0234375 412.78125 1199723392.6099243 170388.3603515625 21293.791015625 31.931640625 1019.6296730041504 453425535.817112 22391.515625 2.689453125 501379971.9846192 7.2331581115722665 0.8983049999999999 24.464088 0.1847034 0.0779865315 0.0109989824 0.05664281190000001 0.018899348700000002 0.0557693379 -0.185932237 0.06810049259999999 0.0465534439 0.0173863506 0.032629800800000004 -0.0687793585 0.0585577584 0.12638568039999998 -0.0102914239 0.0285293835 -0.0438411308 -0.114045269 0.05938700280000001 0.031681012599999996 0.0828313133 0.0233642373 0.056195239400000006 0.12244514050000001 0.011612059899999999 -0.1289174501 -0.0407292014 0.0660300237 0.0071155807 0.0225199742 0.0627531675 0.0833161238 0.06767048 0.022081026099999998 -0.1502032449 0.0694922877 -0.0389689135 -0.10733878869999999 -0.0999785584 0.0570694962 0.04231324559999999 -0.0396216057 0.1808791526 0.06775359339999999 -0.049835328 -0.040026027 -0.0701011841 -0.0092829266 0.051894217199999995 0.060006995300000004 0.0002963206 0.057224225499999996 -0.031683180899999996 -0.0367205108 -0.0645214501 -0.042163724699999995 -0.0023470381 0.0958376745 -0.08252263110000001 0.0901308267 0.0220698971 -0.047501752300000005 -0.0378235533 0.0623967907 -0.0434901762 0.20274045629999998 -0.1094263932 -0.021770320899999997 -0.0187454828 0.0631710304 -0.0566900427 -0.133005164 0.0385253854 0.089454464 0.0600420225 0.0179660749 -0.0278991106 -0.06788007459999999 0.0472582 -0.026447399999999968 0.0022333374672399995 0.0006994649667599982 -0.06659610000000002 -0.011326500000000015 0.0001282896022500004 0.0044350405352100025 -0.0162922 0.055931600000000005 0.00026543578084 0.0031283438785600004 -0.00319802 0.0008290499999999996 1.02273319204e-05 6.873239024999994e-07 0.000345853 0.000175379 1.1961429760899998e-07 3.0757793641000005e-08 -0.000521485 -0.0008155290000000001 6.650875498410001e-07 2.71946605225e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34143.359375 -493.6640625 1165768989.4104006 243704.2066040039 21218.466796875 -75.32421875 5673.737930297852 450223333.2100868 22302.439453125 -89.076171875 497398805.56030655 7934.564395904541 0.99915 27.210455 0.19108935 0.08520728820000001 0.043851229500000005 0.052748744199999996 -0.0234830938 -0.0021128373 -0.210469312 -0.09644531890000001 0.0631976311 0.0557237041 -0.0537148629 -0.042764310800000004 0.0637900817 -0.10695001890000001 0.0384822998 0.1171710425 0.0494791313 -0.0084346889 0.041748707 -0.0369171746 -0.0290122904 0.1334972553 0.0441527809 -0.0513253829 -0.0401399688 0.0416863788 -0.022972553599999997 -0.0747872193 -0.0132844178 -0.1462144491 0.0996611158 -0.07758751259999999 -0.0029091071000000002 -0.10797636740000001 -0.1232546318 0.08370376360000001 0.0522144205 0.0089111272 -0.164348326 0.0573364609 -0.0025274170999999997 0.0034592729999999997 0.2214958215 -0.11310980429999999 -0.0933877375 -0.0450831621 -0.0460896696 0.0579319386 -0.07416593219999999 0.0060715314 -0.005882930600000001 0.10952004439999999 -0.0672642187 0.0169778532 0.1013523265 -0.0220179319 0.1482905822 -0.0274012883 -0.0689850661 -0.0023180316 0.0876791041 0.0575491937 0.0345371164 -0.09339341 0.072406477 -0.0225087541 0.1265467749 0.1520317163 -0.049147216699999996 0.0824789779 0.0357432417 0.0439497139 -0.000811703 0.0887413447 0.057500525199999986 0.013312133899999998 -0.033873792 -0.0734322509 0.0547085 0.0074503 0.00299301997225 5.550697009e-05 0.0446937 0.11128980000000002 0.012385419584040006 0.00199752681969 -0.0518448 -0.035552600000000004 0.00268788328704 0.0012639873667599998 -0.00319802 0.0 1.02273319204e-05 0.0 0.0007812249999999998 0.0004353719999999997 6.103125006249996e-07 1.8954877838399978e-07 -0.000220924 0.00030056099999999997 9.033691472100002e-08 4.8807413776e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34222.75 79.390625 1171196617.5625 6302.871337890625 21203.251953125 -15.21484375 231.4914703369141 449577893.3876991 22321.74609375 19.306640625 498260348.6738434 372.7463722229004 0.819415 22.315632 0.1601225 0.0883752853 0.0930357485 0.055379389400000006 -0.0171604025 -0.0386248888 -0.2060187916 -0.0570368791 0.0629808065 0.0558407432 -0.0667540364 -0.1012033451 0.0960750092 0.0360219714 0.027882765099999998 0.0162544683 -0.0787798151 0.0251807987 0.0922883258 0.034884263900000004 -0.0470268862 0.0184036065 0.0014195877 0.0083340209 -0.007124901600000001 -0.025818829300000002 -0.08925514220000001 0.11565955689999999 -0.0198854418 -0.0890675826 -0.0257550602 0.0180670028 0.0393979796 0.014740214599999999 -0.1428343475 0.0847185906 0.060782032699999995 -0.045720134100000004 -0.2020161493 0.0589607764 0.007364170600000002 0.0453885806 0.2099834505 -0.0940124615 -0.06880023099999999 -0.07459618629999999 -0.058332665599999986 0.0557630564 -0.0451469876 0.020892319 -0.047909663 0.023238157000000002 -0.0120353544 -0.11956862539999999 -0.0434640822 -0.022722170299999997 0.08526102099999999 0.051051429599999996 0.0101298808 -0.0355269238 0.053049075099999995 0.0013410613 -0.0144585676 0.0808540326 -0.004746123400000001 0.09996789800000001 -0.0208211113 -0.0729259377 -0.10251739230000001 0.0604042535 0.0774871453 0.0103041151 0.1247499863 0.0880063298 0.054902281799999994 0.0086286366 -0.0397147891 -0.0785316931 0.0626298 0.007921300000000001 0.00392249184804 6.274699368999999e-05 -0.0325085 -0.0772022 0.005960179684840001 0.0010568025722499997 -0.0625817 -0.010736900000000008 0.003916469174890001 0.00011528102161000018 -0.00207036 0.0011276600000000006 4.286390529599998e-06 1.271617075600001e-06 0.000938807 0.00015758200000000019 8.813585832489998e-07 2.4832086724000056e-08 -0.000220924 0.0 0.0 4.8807413776e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34198.66015625 -24.08984375 1169548356.4826813 580.3205718994142 21204.287109375 1.03515625 1.0715484619140625 449621791.81680685 22315.1953125 -6.55078125 497967941.835022 42.91273498535156 0.965425 26.292009000000004 0.15403658 0.0808605087 0.032359909900000004 0.0549172667 -0.0256351217 -0.0042392715999999995 -0.2143520688 -0.0720930478 0.0028443499 0.1312352479 -0.07530656 0.066073385 0.09198902380000001 0.000516458 -0.024470702599999998 -0.0028684625 -0.0118459846 -0.032034710099999995 0.11325388210000001 0.0568553079 -0.028691414900000007 -0.0811014566 0.11971140849999999 -0.054507669800000005 0.0343600671 0.0335110812 -0.0255673698 -0.0355553085 0.032762840099999996 0.0400071661 0.0897110151 -0.011102903300000001 0.0027248728999999996 -0.1024206293 -0.2110846777 0.0710383732 0.0232031525 -0.008902562900000001 -0.13978132470000001 0.053762708099999994 -0.0105565999 0.0189446133 0.2114038771 -0.1173847158 -0.046242396100000006 -0.11124407160000001 -0.0591377124 -0.10703655779999999 -0.0327140082 -0.0204568201 -0.0118987536 0.07826748139999999 0.0388777146 -0.0605553571 0.0016358624 -0.0090183906 -0.0673981152 0.1415376229 0.051789531900000005 0.0092191253 -0.07323660280000001 -0.0542577072 0.0246326719 -0.0251382857 0.0597785965 -0.0135713703 -0.0292434444 0.1210619547 0.10844686 -0.0539574125 -0.21024769780000002 -0.016171616899999998 0.0140888255 0.0872496007 0.052249856500000004 0.0039259816 -0.04539905 -0.08314696120000001 0.0547095 -0.007920299999999998 0.0029931293902500005 6.273115208999997e-05 0.00680895 0.03931745 0.0015458618745024994 4.636180010250001e-05 -0.00449342 0.05808828000000001 2.01908232964e-05 0.0033742482733584013 -0.00298886 -0.0009185 8.9332840996e-06 8.436422500000002e-07 0.0008830960000000002 -5.571099999999985e-05 7.798585452160002e-07 3.1037155209999828e-09 -0.000220924 0.0 0.0 4.8807413776e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34130.77734375 -67.8828125 1164909962.0886385 4608.076232910156 21285.044921875 80.7578125 6521.824279785156 453053137.3262367 22377.556640625 62.361328125 500755041.20438 3888.935245513916 0.8937319999999999 24.339556 0.17393432 0.06712568969999999 0.014969677800000001 0.0550464962 0.0007622302000000001 0.0804976186 -0.1672132322 -0.0285506921 0.0107417643 0.0225484546 0.0191709116 0.013156993600000002 0.0274911033 -0.0647878566 -0.0496592902 0.07444058440000001 0.15292008529999998 0.0668180825 0.0188541308 -0.0133857797 -0.062947163 0.0404631125 -0.026730914300000002 -0.022243625299999997 -0.0151909092 -0.09703890789999996 0.053725557699999996 -0.18459745989999998 0.012437153400000001 -0.11914668240000001 0.0009541180999999999 0.014427291299999999 0.0186722159 -0.0529007175 0.0560347876 0.0636879723 0.0175799534 0.0178158661 -0.1111394326 0.058507543899999986 0.0240946298 -0.0786881399 0.1648679343 -0.0080295138 -0.0090266036 -0.013469983 -0.0437535457 -0.005540016899999999 -0.0095389826 0.0455466276 0.08719420779999999 0.08504440390000001 0.1008345506 0.08409684560000001 0.09234333310000001 -0.0010685171 0.09296454369999999 -0.0181169266 0.025640349700000002 -0.04580884650000002 0.1448708155 0.037532887599999995 -0.06354642440000001 -0.0875094606 0.11378620240000001 -0.0904429843 -0.0406819879 0.1393481281 0.010317548900000001 -0.0377010797 0.06815035259999999 -0.015482469099999997 -0.0368083564 0.0864713441 0.0495458668 -0.0007853901 -0.0509041416 -0.0872496007 0.054808 9.850000000000135e-05 0.003003916864 9.702250000000268e-09 0.0228261 0.016017149999999997 0.0002565490941224999 0.0005210308412099999 0.0544257 0.058919119999999985 0.00296215682049 0.0034714627015743986 -0.0039989000000000005 -0.0010100400000000007 1.5991201210000006e-05 1.0201808016000014e-06 0.000346024 -0.0005370720000000001 1.19732608576e-07 2.884463331840001e-07 0.000209955 0.000430879 1.85656712641e-07 4.4081102025e-08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34411.08984375 280.3125 1184123104.2346346 78575.09765625 21280.69140625 -4.353515625 18.95309829711914 452867826.7280426 22361.240234375 -16.31640625 500025064.81943136 266.225112915039 1.2565480000000002 34.220348 0.4319880999999999 0.0525173369 0.021068544900000003 0.0324550974 0.030266825299999998 0.0718499281 -0.17550776920000002 -0.012882989899999999 0.0137777986 -0.05351690519999999 0.016836971699999998 -0.0826200127 -0.0185472898 0.0662418109 -0.1344982275 -0.060873627199999995 0.0209614823 0.0959063551 0.206367375 0.0916696291 -0.0339276719 0.0146166701 -0.0151467296 0.03364929 0.10351657410000001 -0.0830445984 -0.0579866875 -0.20855610489999998 -0.0116025668 -0.016883209 0.009245683900000001 -0.1841052578 -0.0617087211 0.0551091562 0.1746434791 0.053738410599999994 -0.026633652400000003 -0.037967641499999996 -0.1799569577 0.0318026508 0.0542060424 -0.0680589291 0.1736877874 -0.0068328543999999995 0.001160424 0.0100920128 -0.019577926000000002 0.0569400696 0.1540341539 0.0090799053 -0.0016373884 0.0737709943 0.1755771412 -0.187277477 -0.024375915499999998 -0.0212049762 0.0146349976 0.010954731 0.09985796220000001 -0.0043105606 0.1728606347 -0.1176009164 0.0450802559 -0.040331077 -0.071874041 -0.1321932017 0.0436432664 -0.023815972999999997 0.1418260509 -0.1470568799 0.05991679110000001 0.0695966867 -0.053656967199999996 0.0856717519 0.046792981399999996 -0.005495018000000001 -0.0562083378 -0.0908143174 0.030499900000000007 -0.0243081 0.0009302439000100002 0.0005908837256100001 0.148521 0.12569490000000005 0.01579920788601001 0.022058487441000002 0.26342 0.20899429999999997 0.06939009639999999 0.04367861743249 -0.00290382 0.0010950800000000004 8.4321705924e-06 1.199200206400001e-06 0.000293837 -5.218699999999998e-05 8.634018256900001e-08 2.7234829689999974e-09 0.000522504 0.000312549 9.7686877401e-08 2.7301043001600003e-07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +35261.6484375 850.55859375 1243383850.5298462 723449.9214019775 21217.333984375 -63.357421875 4014.162906646729 450175261.4045144 22502.09765625 140.857421875 506344398.9314117 19840.813297271732 3.017733 82.18375400000002 2.0785756 -0.09588411449999999 -0.0413282238 -0.114514009 -0.12158952960000001 0.0228625508 0.2982335663 0.4017393968 -0.0917100351 0.0028957706 -0.3177253697 -0.1680747209 0.1457850104 -0.0777603486 -0.1840424718 0.2189991528 0.1223571894 -0.26123724649999996 0.1211700884 0.1465607905 -0.0749454437 0.1819738997 -0.0972445869 0.026798225800000002 0.0652268835 0.0396543514 0.0755642559 -0.1071742972 0.043592607900000004 0.025275216200000002 -0.0357153714 0.0394511861 -0.0859128736 0.11529034560000001 0.0338056556 -0.1356168142 -0.2258485426 -0.27703266390000003 0.3384420244 -0.0994642328 -0.19097653 -0.0342124501 -0.22318607070000002 0.2566687735 0.0393510632 -0.1261149181 0.1092065764 0.09774032640000001 -0.2215649312 0.10568543130000001 0.3512753006 0.2003003794 0.10911973789999999 0.0033836257 -0.2860440409 -0.17248209949999999 0.12303831050000001 -0.060866371600000004 -0.1197733358 0.0479438274 0.0084207858 0.0311116117 0.0176193471 0.0588117533 -0.10920189949999999 -0.069765251 0.0457194499 0.0100707946 0.0242735925 0.0302582671 0.1643539385 0.026911605800000002 -0.0919328514 0.0848510215 0.043993917 -0.0101924456 -0.0612907054 -0.0938191336 -0.0905192 -0.1210191 0.008193725568639999 0.014645622564809996 0.738429 0.589908 0.347991448464 0.545277388041 1.25801 0.99459 1.5825891601000002 0.9892092681000002 0.000117821 0.0030216410000000003 1.3881788041000003e-08 9.130314332881004e-06 0.0015419 0.0012480630000000002 2.37745561e-06 1.5576612519690003e-06 0.00371397 0.0031914659999999996 1.0185455229156e-05 1.37935731609e-05 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33062.01953125 -2199.62890625 1093097135.4847565 4838367.325210571 21206.767578125 -10.56640625 111.64894104003906 449726991.1126137 22332.470703125 -169.626953125 498739247.7059364 28773.303226470947 2.0205580000000003 55.02709599999999 1.0797718500000002 -0.1271147019 0.0784989182 -0.11457083779999999 -0.0461472741 -0.0874280706 0.1174596594 0.0048600204 0.1613714329 0.0942947195 0.2027072577 0.0153488025 -0.1190588854 -0.1641150129 -0.08527630929999999 0.1194729283 -0.1347027573 -0.0199104186 -0.12282090970000001 0.1009654158 0.0326881971 -0.0074657358 0.0423087706 0.16174795960000002 0.051721117999999996 0.0510210217 0.10799043009999999 -0.0911998258 -0.1363918573 -0.0187209388 0.0165334236 -0.0146427526 -0.0406280371 0.0530898622 0.0161995402 -0.1128552303 0.2104694459 0.1725109588 0.1637534815 -0.1153206458 -0.0374020921 0.0670583698 -0.131633856 0.1107409414 -0.1213485478 -0.0249499447 -0.047379644500000005 0.010718491 0.0045775155 -0.2014738634 0.0804590795 0.0196178499 -0.1136514337 -0.036853647 -0.0594775184 0.0341348716 -0.0169031928 -0.0529312467 -0.028574382000000002 0.11016572029999999 0.0927883125 -0.0610228392 -0.0318943587 -0.0210103826 -0.0179120188 -0.0286231196 0.1021209395 -0.0563916393 0.0467325653 0.0350330391 -0.049689555499999996 -0.0940364914 0.0187569379 0.08400935539999999 0.0411514359 -0.0148672434 -0.06613118650000001 -0.0962455236 -0.10782 -0.0173008 0.0116251524 0.0002993176806400001 0.5662020000000001 -0.1722269999999999 0.02966213952899997 0.3205847048040001 1.0067700000000002 -0.2512399999999999 1.0135858329000005 0.06312153759999996 -0.00944124 -0.009559060999999999 8.913701273760001e-05 9.137564720172099e-05 0.0004911000000000001 -0.0010508000000000002 2.4117921000000004e-07 1.1041806400000004e-06 0.00588419 0.00217022 4.7098548484e-06 3.46236919561e-05 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33390.59765625 328.578125 1114932011.841568 107963.58422851562 21120.216796875 -86.55078125 7491.037734985352 446063557.5470009 22238.3046875 -94.166015625 494542195.3740845 8867.238498687744 1.038502 28.282156 0.3728423499999999 -0.1367598387 0.08517998730000001 -0.1375806851 -0.09308861869999999 -0.1532172818 0.14214022769999998 0.019831229199999998 0.09592903130000001 0.0967866704 0.0705399787 0.0376495873 0.0411767147 -0.0909800216 -0.0843015913 0.1499327727 -0.0816431212 0.0396646702 -0.0656904893 -0.0426920146 0.07592709730000001 -0.0418362081 0.082874512 0.12320431109999999 0.0165700022 0.0120301503 0.0148481794 -0.0174383416 -0.18257420829999998 -0.030477540499999997 -0.0342219095 0.010592699399999999 -0.0464053248 0.0069530217 -0.025833062900000002 -0.134841023 0.1720294812 0.0650173857 0.17484729899999998 -0.1350150317 -0.10825079189999999 0.1420408808 -0.1413947196 0.0530301385 -0.08322079219999999 -0.0430854473 -0.0778285574 -0.023522876800000002 -0.0654345609 -0.0670404839 0.1176987553 0.0217614933 -0.1013957656 -0.09635314539999999 0.0642708176 -0.0045966651 -0.08517913419999999 -0.0094757741 -0.0776103341 0.0402373968 0.1180117703 -0.0042186262 0.053795666799999996 0.0507212433 0.0074064517 0.0446589118 0.0072324263 -0.0719859241 0.0320154233 -0.0610219174 -0.0429332405 0.0010532517 0.0562866 0.08314696120000001 0.0382683432 -0.0195090322 -0.0707106781 -0.09807852800000001 -0.0301026 0.07771739999999999 0.00090616652676 0.0060399942627599994 0.6942050000000001 0.12800299999999998 0.01638476800899999 0.4819205820250001 1.09228 0.08550999999999975 1.1930755984 0.007311960099999958 -0.0104476 -0.0010063599999999995 0.00010915234576 1.012760449599999e-06 0.000352161 -0.0001389390000000001 1.2401736992099992e-07 1.9304045721000026e-08 0.00637113 0.00048694 2.3711056359999996e-07 4.05912974769e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33877.16015625 486.5625 1147661980.2522125 236743.06640625 21165.005859375 44.7890625 2006.0601196289065 447957473.02737814 22335.3828125 97.078125 498869325.3809204 9424.162353515623 1.09673 29.867907 0.5900327999999999 -0.1132002637 0.056182790999999996 -0.1336994807 -0.031020287200000007 -0.09508744400000001 0.1062488719 0.0472800501 -0.000706968 0.11652752 0.1198135311 -0.0903643707 0.12893289189999999 -0.0918367447 -0.09629504 -0.006279265799999999 -0.1302035212 -0.016004722199999998 0.0457436966 -0.027433977999999998 -0.018922479 -0.0514428836 0.08558331220000001 0.0243948189 -0.0758765353 0.1302315571 0.025783600499999997 0.1429812682 -0.0285082096 0.0818122926 0.0514973071 0.09541391560000001 0.1105992434 -0.0169092585 0.1248498416 -0.1176387242 0.08465270470000001 -0.0189615599 0.1384996885 -0.133855866 -0.0335928373 0.0940446439 -0.10760323039999999 0.0592105368 0.0091565104 -0.12787642789999998 -0.1942537369 0.0562737369 -0.044168938399999996 -0.1758629738 0.0720900148 -0.011539642 -0.0382311079 -0.0335506202 0.0073492235 -0.079426813 -0.025389089500000003 0.042919481100000004 0.0359155698 0.0323023658 -0.199644231 0.06974938730000001 0.093208246 -0.045165312400000004 0.0290000931 0.0550278683 -0.0391287925 -0.009852676999999999 -0.0519220605 -0.1141704069 0.0204515854 0.0025539319 0.0174320356 0.0822640518 0.0353474844 -0.0241075061 -0.07501110700000001 -0.09930684570000001 -0.0240962 0.006006399999999999 0.0005806268544400001 3.6076840959999986e-05 0.4711770000000001 -0.22302800000000003 0.049741488784 0.22200776532900007 1.0441 -0.04817999999999989 1.09014481 0.002321312399999989 -0.005942899999999999 0.0045046999999999995 3.531806040999999e-05 2.0292322090000008e-05 0.000167863 -0.000184298 2.8177986769e-08 3.396575280399998e-08 0.00480376 -0.0015673700000000002 2.456648716900001e-06 2.30761101376e-05 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33987.22265625 110.0625 1155131303.8855133 12113.75390625 21175.8046875 10.798828125 116.61468887329102 448414704.163147 22313.908203125 -21.474609375 497910499.2974892 461.1588478088379 1.330953 36.246662 0.5009579000000001 -0.1109163884 0.0447110004 -0.11198938359999999 -0.045288896399999994 -0.0653163211 0.1590770765 -0.027116983900000002 0.0160360485 0.20941078870000002 0.011037373400000001 0.0686777609 -0.0184324642 0.0008456265 -0.06053227 0.1103358733 0.052855283899999994 -0.0493787882 0.0497596858 -0.06539742230000001 -0.0081456038 -0.1037896894 0.054277855800000004 -0.046913525899999996 -0.0630893302 -0.12994717050000001 -0.119172692 0.0928714326 0.053409814400000005 0.0864464556 0.0222441211 -0.020379591399999997 0.0332086731 -0.1559511852 0.0634008732 -0.1216560776 0.056577639699999994 0.0003313571 0.10163129109999999 -0.1125658523 -0.0496223397 0.060576496500000014 -0.1781274878 -0.0191455173 -0.0398571044 -0.15777175699999998 -0.01785204 -0.0760615072 0.0116265945 -0.0072450226000000005 0.0985807676 0.167231607 -0.037044648 0.0629838196 0.0944034215 0.1259226851 -0.0258667952 0.11868057929999999 0.13946871060000002 -0.0765843041 -0.0051786084000000005 0.08696259960000001 0.024089499599999998 -0.010980627 0.0328180447 0.0768041941 0.0301897309 0.0479850995 -0.0591700936 -0.0449065566 -0.0767510357 -0.010205866999999999 0.1063569652 0.081360845 0.0323917418 -0.028652455299999997 -0.0790155012 -0.09992290359999999 0.0419784 0.06607460000000001 0.00176218606656 0.00436585276516 0.675313 0.204136 0.041671506496 0.4560476479690001 0.869291 -0.174809 0.7556668426809999 0.030558186481 -0.00539883 0.0005440699999999988 2.91473653689e-05 2.9601216489999885e-07 -0.000187113 -0.000354976 3.5011274768999994e-08 1.2600796057600002e-07 0.00502348 0.00021972000000000048 4.8276878400000215e-08 2.52353513104e-05 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34199.578125 212.35546875 1169611143.9279785 45094.84510803223 21208.333984375 32.529296875 1058.1551551818848 449793430.3927956 22368.17578125 54.267578125 500335287.7808991 2944.9700355529785 1.35292 36.844891 0.5993508500000001 -0.1115965784 0.0114717923 -0.10465961369999999 -0.0246878923 -0.0408190008 0.08941328679999999 0.10808416859999999 0.121302429 0.0200161094 0.0263823385 -0.0095310257 0.0129316317 0.0127753511 -0.0583069247 0.054317833899999994 -0.0860085459 0.052361065400000004 -0.041874455299999995 -0.0851310348 -0.11010183789999999 -0.1356573677 -0.1132902826 -0.0158047529 0.11711638029999999 -0.06654155769999999 -0.0353347508 0.0072489731 -0.0201948863 -0.07376332969999999 0.0623068921 -0.0684464011 0.1393158229 -0.11314243339999999 -0.09948988439999999 -0.11473151150000001 0.0029709169 -0.0486126409 0.0702153821 -0.10349420039999999 -0.0408416088 0.042748670700000005 -0.0889170269 0.1279887292 -0.0989768284 -0.0009307597999999999 -0.0276289823 -0.0030271996999999998 -0.0256451141 -0.0312740174 0.0732625412 -0.035374841000000004 -0.10699082289999999 -0.0386805488 -0.011695549199999999 -0.0381108182 -0.006729625600000001 -0.048730127699999994 0.10063390300000001 -0.0616953348 0.0772871097 -0.1574124474 -0.0036873124 -0.10768751800000001 0.075864785 0.0462636404 -0.1599766607 -0.0058003854 -0.0367977855 0.10715495929999999 -0.0877834726 0.030539329599999998 0.0944918624 0.08043756349999999 0.0294040325 -0.0331337888 -0.0827080574 -0.09992290359999999 0.0478076 0.0058292000000000005 0.0022855666177600004 3.3979572639999995e-05 0.433946 -0.24136700000000005 0.05825802868900003 0.18830913091600002 0.944106 0.07481499999999996 0.8913361392360001 0.005597284224999994 -0.00955329 -0.00415446 9.12653498241e-05 1.7259537891600007e-05 0.0007918899999999997 0.0009790029999999998 6.270897720999996e-07 9.584468740089995e-07 0.00461015 -0.00041333 1.7084168889999995e-07 2.1253483022500006e-05 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34218.828125 19.25 1170928198.248291 370.5625 21195.796875 -12.537109375 157.17911148071292 449261805.16625977 22318.078125 -50.09765625 498096611.1936035 2509.775161743164 0.90559 24.662472 0.3755667 -0.0952650022 0.0165456379 -0.09762160339999999 -0.0070801537 -0.0370583824 0.1000266333 0.0065345593 0.1403327151 0.051850495499999996 0.0085375866 0.0331887932 -0.08722768380000001 0.0284180609 -0.08177104860000001 -0.0259713958 -0.0748943825 -0.0108994179 -0.0083935446 -0.0159843763 0.12212584119999999 -0.067838738 -0.043459884500000004 -0.0628596087 -0.0041629888 -0.06545914480000001 -0.2153072736 0.0355680662 0.1086332887 -0.0028417569 -0.056435298700000004 -0.0170165978 0.043930747699999995 0.0496604078 -0.012340963100000001 -0.0942544689 0.010441787099999999 -0.0143494277 0.028510574700000006 -0.09923077529999999 -0.016199140900000002 0.0383382027 -0.101585063 0.0121304433 -0.135371796 -0.0025512007000000002 0.0255994755 -0.0531894679 0.10580659699999999 -0.10094502820000001 -0.0082946345 0.0185985485 -0.0713390854 -0.028145899 0.0016212649 0.1906565166 -0.0570913471 0.033337338700000003 0.0086887616 -0.0472221845 0.0609004417 0.035894308300000004 0.0239545727 0.0275674412 0.00511589 0.0348913278 -0.036521334100000004 0.0031306796999999997 0.0547239832 0.0926885316 0.0781792669 0.0851939803 0.016398620200000002 0.0794944353 0.026387305 -0.0375415571 -0.08607420269999999 -0.09930684570000001 0.025297 -0.0225106 0.000639938209 0.0005067271123599999 0.518724 0.08477799999999996 0.007187309283999994 0.26907458817599994 0.875849 -0.06825700000000001 0.767111470801 0.004659018049000002 -0.00781131 0.0017419800000000006 6.10165639161e-05 3.034494320400002e-06 -0.000606772 -0.0013986619999999995 3.68172259984e-07 1.9562553902439997e-06 0.00546993 0.0008597799999999992 7.392216483999985e-07 2.9920134204899995e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34272.16015625 53.33203125 1174580961.77565 2844.305557250977 21195.216796875 -0.580078125 0.3364906311035156 449237215.06653214 22318.8515625 0.7734375 498131135.0689087 0.59820556640625 0.888777 24.204597 0.3397738 -0.0942359809 0.0132689798 -0.09008453849999999 0.0142557636 -0.0013024487 0.1057276568 -0.0003756082 0.013162137800000001 -0.0420803295 -0.017464315 -0.0320423615 0.025451460800000002 0.052442232000000005 -0.037754959 -0.021740794900000002 -0.043987211 0.0172322979 0.0103460897 -0.1428938017 0.0831556148 0.0604172362 -0.021971897200000003 0.010817328999999999 -0.1511427918 -0.012001576299999999 -0.0781510304 -0.0142390239 -0.0903196102 -0.1050437463 0.20843706280000002 0.014084633300000001 0.09480802990000001 0.04904892 -0.0532018701 -0.09502782580000001 -0.0074574648 -0.049873298600000004 0.0498266192 -0.0884102147 0.0076871522 0.0016161151 -0.0996149758 -0.0044296586 -0.009669066 0.0333555129 -0.0090830831 0.0002031407 0.0276361739 0.0060226273 0.0074269175 -0.0525817524 -0.0671814493 -0.0748907298 0.0907121066 -0.16002380859999998 -0.0077515514 0.036561919 -0.0371637391 -0.0409881786 0.0589955813 0.1010591099 0.0523789437 -0.1053337592 0.0084165587 0.1390985454 0.042685834299999996 -0.000720275 0.1114534527 0.0835476389 -0.04677110599999999 -0.1360966833 -0.1170677417 0.0785316931 0.0233445364 -0.0418659738 -0.08910065240000001 -0.09807852800000001 -0.041896 -0.06719299999999999 0.0017552748159999994 0.0045148992490000005 0.43937 -0.07935399999999998 0.006297057315999997 0.19304599690000002 0.7747390000000001 -0.10110999999999992 0.6002205181210001 0.010223232099999984 -0.00668237 0.0011289400000000002 4.46540688169e-05 1.2745055236000003e-06 -0.000339826 0.000266946 1.15481710276e-07 7.1260166916e-08 0.00502348 -0.00044644999999999933 1.9931760249999934e-07 2.52353513104e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34157.296875 -114.86328125 1166720929.8068848 13193.573379516602 21192.07421875 -3.142578125 9.875797271728516 449104009.6930084 22286.00390625 -32.84765625 496665970.1093903 1078.968521118164 1.086708 29.594986 0.44868741 -0.0499241935 0.0287649112 -0.0587280537 0.0182896107 0.030672392799999997 0.027971162799999998 -0.1073413719 -0.0263316608 -0.1028231667 0.017509536000000003 0.0415906229 0.0052585183 0.0039365845000000005 0.042375805499999995 -0.1266382209 -0.0833794578 0.0009170073 0.0532249047 -0.0424873955 -0.0975315918 -0.0023281387 -0.0212555406 0.0617308622 -0.04491361940000002 0.048101772699999996 0.0557404998 -0.0533991242 0.041670277799999995 0.1437845064 -0.0139563252 -0.0440602241 0.0384050946 0.0035814457 -0.0670307515 -0.0390631491 0.0050450014000000005 0.0196059749 -0.1398130392 -0.061737717000000004 0.017273864099999998 -0.031006132599999996 -0.031751718 -0.09942833 0.0481372322 0.1212435692 -0.012933067099999999 -0.013100594699999999 0.0453615176 -0.06866618740000001 -0.0999517275 -0.0541020593 0.012621241699999999 -0.0414778705 -0.0001448573 -0.0543621295 0.0214604965 -0.054366999400000005 0.0774832501 0.08270333440000001 -0.0690721791 -0.0334645798 -0.0257499273 -0.0924689136 -0.11488988039999999 0.0076579883 -0.0395721729 0.0420071597 0.07259418200000001 -0.0162689263 -0.0781727017 -0.0658702084 0.079797982 0.0775495743 0.0202787295 -0.0460974375 -0.0917754626 -0.0962455236 -0.07645369999999999 -0.03455769999999999 0.0058451682436899965 0.0011942346292899992 0.33865100000000004 -0.10071899999999996 0.01014431696099999 0.11468449980100005 0.574786 -0.19995300000000005 0.33037894579599997 0.03998120220900002 -0.00540662 0.00127575 2.92315398244e-05 1.6275380625e-06 -8.34018e-05 0.00025642419999999996 6.95586024324e-09 6.575337034564001e-08 0.0042865 -0.0007369799999999999 5.431395203999999e-07 1.8374082250000007e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34079.96484375 -77.33203125 1161444003.751236 5980.243057250977 21180.169921875 -11.904296875 141.71228408813474 448599597.9194984 22310.69921875 24.6953125 497767299.6295319 609.8584594726562 1.001257 27.267849 0.10069035999999992 -0.0715962862 -0.0403497648 -0.0667657958 0.00997649 0.0114142055 0.0106226007 -0.1021265935 -0.0775913158 0.0866269016 -0.007875977099999999 0.0699066953 -0.0192459773 -0.0088318552 0.0174608247 -0.1597744486 0.0387483401 -0.1106865734 0.0014859251000000002 0.0597878687 -0.035929098199999995 -0.0413317923 -0.0119264746 0.05466481 -0.0083941249 0.0241687418 0.010669543899999998 0.0179854021 0.18983892559999999 0.013259243700000001 0.0482796079 -0.0079562939 0.035170311600000004 -0.0723264626 0.0662150099 -0.071016316 -0.0156849406 0.0468311597 -0.0079701913 -0.07088785110000001 0.0134527822 -0.011088479699999999 -0.0225679798 -0.1086751362 0.047310218 -0.0725640622 -0.015200306799999999 -0.0332436034 0.0575718587 -0.0782425015 -0.1065499975 -0.0347154839 0.060465859500000003 0.1551514285 -0.1034382309 0.028118157400000003 -0.0100067761 -0.0342045711 0.0646453868 0.1377612484 -0.032500758 0.0134913313 -0.0084206686 -0.0831489443 0.0318792072 0.0752993936 0.0666817336 0.0172320385 0.0018918360999999999 -0.0617607936 0.0912706812 0.0419260921 -0.0245917056 0.0765483213 0.01719291 -0.050226553300000004 -0.0940880769 -0.0938191336 -0.06769019999999999 0.008763499999999994 0.004581963176039999 7.679893224999989e-05 0.321116 -0.017535000000000026 0.00030747622500000083 0.103115485456 0.619463 0.04467699999999997 0.383734408369 0.0019960343289999968 -0.00533847 6.815000000000033e-05 2.84992619409e-05 4.644422500000045e-09 -0.000607479 -0.0005240771999999999 3.69030735441e-07 2.7465691155984e-07 0.00428857 2.0699999999998497e-06 4.284899999999378e-12 1.8391832644900006e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34118.1171875 38.15234375 1164045920.419983 1455.601333618164 21182.08984375 1.919921875 3.686100006103516 448680930.1486969 22357.017578125 46.318359375 499836234.98859024 2145.3904151916504 0.730183 19.885521 0.17062289999999994 -0.07344435740000001 -0.020424397900000002 -0.0750649474 0.0113265802 0.0161387807 0.04848098309999999 -0.111465371 -0.0323689992 0.09453206509999999 -0.0758974003 0.06627261549999999 -0.0432092237 -0.0121560622 0.008073499 -0.1179889287 0.019992518600000002 0.0690625661 -0.0283449783 -0.0009082042999999999 -0.0353406665 -0.0053135012 0.042876069100000004 0.054173338099999996 0.1080109737 -2.49497e-05 -0.0024285589000000002 0.12309423859999999 0.029328853999999998 0.0103841987 -0.040205472400000004 0.0233443734 -0.024509402000000003 -0.0734584581 -0.0259070176 -0.0736336579 0.0007243967999999999 0.027124952999999997 0.0182276995 -0.081117391 0.0176845099 -0.013344851599999999 -0.05773143240000001 -0.1231329093 -0.0046502142 -0.0678806567 0.059772891200000004 -0.059473776299999996 -0.0045730909 -0.0625159855 -0.0434429097 -0.0586166068 0.0935188541 0.0451227487 0.023388919900000003 0.041740205600000004 0.0275119686 -0.0405137335 0.0099242174 0.0349537169 -0.0326998811 -0.1258860976 0.011684074 0.0419703837 0.0368656061 0.0540134892 0.0077576272 -0.0294258716 -0.1079603784 0.0530634746 -0.0437398918 0.0793009617 0.0057246015 0.0755281812 0.0140901232 -0.0542441537 -0.0960293686 -0.0908143174 -0.0559119 0.011778299999999992 0.0031261405616099997 0.0001387283508899998 0.35591100000000003 0.03479500000000002 0.0012106920250000016 0.12667263992100006 0.643563 0.02410000000000001 0.414173334969 0.0005808100000000005 -0.00593372 -0.0005952500000000003 3.52090330384e-05 3.5432256250000036e-07 0.000257453 0.0008649319999999999 6.628204720899999e-08 7.481073646239999e-07 0.00482738 0.0005388099999999998 2.903162160999998e-07 2.33035976644e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34025.60546875 -92.51171875 1157741827.5150301 8558.418106079102 21200.9140625 18.82421875 354.3512115478516 449478757.0855103 22366.017578125 9.0 500238742.3049965 81.0 0.752675 20.498068 0.08003715000000003 -0.0759329869 -0.0168923386 -0.059262701200000004 -0.0068462862 0.055546271200000004 0.023696936600000003 -0.0838185947 -0.0346391394 -0.0200727663 -0.0097822602 0.0174371551 -0.022773252799999998 -0.0169187223 0.053521002000000005 -0.0267865904 0.043081989 0.060748823499999986 0.0175285649 0.020569224599999998 -0.0732790811 -0.0866677875 -0.016392116 0.0070924428 0.011890453799999999 0.0778100976 -0.023815021800000002 0.0159405789 0.0283411394 -0.0204221988 -0.0638702209 -0.04687827730000002 -0.0262314175 -0.0786650825 0.023622552400000003 -0.07037684820000001 0.0075694263 0.0199353141 0.0012677791 -0.0609649289 -0.0010335343 -0.0587263422 -0.018892948899999998 -0.0665039647 0.0179784922 0.0295822523 0.0134012501 0.0086811272 -0.0080175929 0.0125876675 -0.0517200815 -0.0197435678 0.0393599396 -0.0179068539 -0.0030631521 0.0228330575 -0.0271754313 -0.0425254701 0.1568764188 0.0164306519 -0.0366666908 -0.043360099900000004 0.027383789199999998 0.06344820309999999 0.0326000515 -0.0552397726 0.05642870730000001 -0.0332196075 -0.0551236586 -0.0655698507 -0.0536093065 0.0124808974 -0.1877671088 0.0744894057 0.010973431100000002 -0.058141318399999996 -0.09759167619999999 -0.0872496007 -0.062528 -0.0066161 0.003909750784 4.377277921e-05 0.33748 -0.01843100000000003 0.0003397017610000011 0.11389275039999999 0.6198170000000001 -0.02374599999999993 0.3841731134890001 0.0005638725159999967 -0.00602707 -9.334999999999987e-05 3.63255727849e-05 8.714222499999973e-09 0.000507444 0.00024999099999999997 2.57499413136e-07 6.249550008100003e-08 0.00510892 0.00028154000000000026 7.926477160000015e-08 2.6101063566400007e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34253.796875 228.19140625 1173322600.3537598 52071.31788635254 21271.6953125 70.78125 5009.9853515625 452485021.4678345 22403.462890625 37.4453125 501915149.49161154 1402.1514282226562 0.7318319999999999 19.930426 0.14018019999999987 -0.061755584 -0.0356623027 -0.0485119953 0.0329375642 0.1314570068 0.0051091418 0.0150653825 -0.0229235116 -0.083842786 0.1232827251 0.0097376945 -0.0913328226 0.0662359584 0.0367334305 -0.1000035417 0.0663822075 -0.0188731932 0.045477059199999996 0.0341447888 0.0248375945 -0.0209350695 -0.054730395300000005 0.0114536847 -0.036068940699999996 -0.0405007383 -0.0321390193 0.0342529867 -0.036538619700000004 -0.1258927049 -0.21778884980000002 0.0791571284 -0.0088110254 0.08985411970000001 0.0476684783 -0.053815129100000005 -0.0330739249 -0.0149291223 0.0015430775 -0.051920424800000003 0.040814129399999996 -0.1386934119 -0.0131250431 0.0537199902 0.06193065900000001 0.0826732696 -0.013053036 0.0186612303 0.1570905395 0.0204745921 -0.11812637470000001 -0.0032787105 0.0521100362 0.0667356553 -0.0419259229 0.009771316700000001 0.0444093148 0.0295582125 -0.040986715099999994 -0.025591306299999998 0.0882445657 0.030396501200000002 -0.0149755983 0.1537105322 0.08167213200000001 -0.0465234142 -0.0792985254 -0.1604187855 -0.061206594100000004 -0.0399402511 0.08401920539999999 -0.1072399289 -0.0163387826 0.0734322509 0.0078459096 -0.06190939490000001 -0.09876883410000001 -0.08314696120000001 -0.0600388 0.002489199999999997 0.00360465750544 6.196116639999985e-06 0.264311 -0.07316899999999997 0.005353702560999997 0.06986030472100001 0.6026229999999999 -0.017194000000000154 0.3631544801289999 0.00029563363600000527 -0.00541462 0.0006124499999999996 2.93181097444e-05 3.750950024999995e-07 0.000467954 -3.948999999999999e-05 2.1898094611600003e-07 1.5594600999999993e-09 0.00540354 0.0002946199999999998 8.680094439999987e-08 2.91982445316e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34308.16796875 54.37109375 1177050389.3719635 2956.215835571289 21228.849609375 -42.845703125 1835.7542762756348 450664055.73746115 22385.35546875 -18.107421875 501104139.46229553 327.8787269592285 0.743913 20.259432 0.19837879999999994 -0.0661952064 -0.028477131699999998 -0.06243684 0.0341052606 0.0956502578 0.0006018276 -0.0010480726 -0.0412732144 -0.0732975142 0.0618043316 0.0239057534 -0.0887069543 0.0743664679 -0.0043676578999999995 0.012887078799999998 0.0981791442 -0.015428416 -0.0051212459999999994 -0.0022876674 0.0772077368 0.0084968921 0.051440339800000005 0.0648376992 -0.046572333 -0.0690568453 0.0023950761 0.0484644061 -0.0272978366 -0.0846281009 -0.113406966 -0.0207080469 -0.14785283859999998 0.07758533150000001 -0.102664129 -0.0592038876 -0.0368115151 -0.023702650800000002 0.0171862229 -0.0700604472 0.0459840235 -0.08909070990000001 -0.0080215202 0.025651111400000003 0.052162146500000006 0.0693546149 0.038811391800000004 0.0054973910999999995 0.11020812349999999 0.06350266019999999 0.0088732799 0.0319235977 0.0203454201 0.0339196177 0.0401224952 0.0498064812 -0.0167518466 0.0178557388 -0.061075531900000014 -0.0031584971999999998 0.10829785310000001 0.00399202 -0.1459476261 0.1405212943 0.022526545800000002 -0.0627244087 0.1462754014 -0.028466338900000002 -0.0861750166 0.0759182097 -0.0282789909 -0.0254049922 0.019656088000000002 0.0723569779 0.0047106451 -0.0655400171 -0.0995561965 -0.0785316931 -0.0414681 0.0185707 0.0017196033176099998 0.00034487089849000017 0.30835300000000004 0.044042000000000026 0.0019396977640000024 0.09508157260900002 0.643914 0.041291000000000085 0.414625239396 0.0017049466810000065 -0.00689081 -0.0014761899999999994 4.74832624561e-05 2.1791369160999987e-06 0.000122372 -0.000345582 1.4974906384000004e-08 1.1942691872399998e-07 0.00547127 6.773000000000022e-05 4.58735290000003e-09 2.9934795412900006e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34105.96875 -202.19921875 1163217104.3759766 40884.52406311035 21205.0 -23.849609375 568.8038673400879 449652025.0 22322.697265625 -62.658203125 498302813.21274185 3926.0504188537598 0.863765 23.523424 0.19040230000000014 -0.0893655864 -0.0302283538 -0.0806655988 0.0161815828 0.059935254199999996 0.0498461547 -0.0087722474 -0.0040635721 -0.0177011763 0.0054827226 0.0329594294 -0.029371707200000007 0.0132908218 0.0262174935 0.0079097716 0.0344853098 0.043816039800000005 -0.0353673407 0.0134823761 0.06187547030000001 0.046183801600000005 0.0353430735 -0.1200034391 -0.0015764248000000002 0.0365303681 -0.0665093275 -0.0489107475 -0.0182402234 -0.0919567962 0.0693892019 -0.0077579988 -0.1127436687 -0.0161460943 -0.0553867963 -0.0846561546 -0.0182225776 0.0082891045 0.0336600133 -0.0806039986 0.0184986425 -0.0632583738 -0.0431478929 9.4667e-06 0.0008283619 0.0316179744 0.0332190473 -0.0314364652 0.0166812896 0.0246359989 -0.0279519196 -0.020475434299999998 -0.0092192238 -0.0262533143 0.0460095726 0.045066494500000005 -0.0003224136 -0.0093766555 -0.029469504100000002 -0.06511291599999999 0.0564580675 0.031035149900000007 0.0596533135 0.0504005594 0.062423803099999994 -0.0133398834 0.09703040689999999 0.0945213224 0.07604338 0.0370789035 -0.0336856374 0.0032136328000000004 -0.048305518 0.07126385190000001 0.0015707317000000001 -0.06902512400000001 -0.099950656 -0.0734322509 -0.0415087 -4.0599999999994814e-05 0.0017229721756899994 1.6483599999995782e-09 0.325514 0.017160999999999926 0.00029449992099999745 0.10595936419599998 0.750534 0.10662000000000003 0.5633012851560001 0.011367824400000013 -0.00800895 -0.001118140000000001 6.414328010250003e-05 1.2502370596000021e-06 0.000151816 2.9444e-05 2.3048097856e-08 8.669491359999999e-10 0.0056553 0.00018403 3.386704089999998e-08 3.1982418090000005e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34162.3125 56.34375 1167063595.3476562 3174.6181640625 21200.748046875 -4.251953125 18.079105377197266 449471717.7470741 22360.408203125 37.7109375 499987855.0103798 1422.1148071289062 0.7563349999999999 20.597727 0.23063570000000005 -0.0638787969 -0.0060429787 -0.0696135059 0.0248393847 0.08723407400000001 0.0095095664 -0.0437800659 -0.060852021799999996 -0.1357470423 0.0293273027 0.0074060628 0.0425946866 0.022146201600000002 -0.004423781 -0.0715687286 0.0056698423 0.1079571405 -0.024435889300000003 -0.033647429 -0.0164000765 -0.0228959502 0.0179178331 -0.0432024667 -0.0542343837 0.0042516948 0.0352479225 -0.0741266745 0.055086863300000004 0.0155810569 -0.0300128898 0.1169118867 -0.0396278491 0.0321478381 0.1152137402 -0.0514884503 -0.0125273366 0.0089274784 -0.0651763024 -0.0764884014 0.0259175852 -0.0886576555 0.0052672985999999995 -0.0351371486 0.0972905491 0.1119058363 -0.026685425899999997 -0.015429845800000001 0.0029461359 0.007593245699999998 0.0121601985 -0.0793131973 0.0627735245 -0.0157902424 0.057101158799999996 -0.035178707000000004 -0.0359540873 0.0115263864 0.0399546119 0.0015798747 -0.0357941636 0.09154247300000001 0.015410136000000001 0.0072942451 0.0531992858 -0.0160135075 -0.1124437227 0.0506985763 0.0075860155 -0.10849073640000001 0.06065499730000001 -0.0162819387 0.09375400390000001 0.0701531426 -0.0015707317000000001 -0.0723569779 -0.099950656 -0.06788007459999999 -0.0576474 -0.016138700000000006 0.00332322272676 0.0002604576376900002 0.295369 -0.030144999999999974 0.0009087210249999986 0.08724284616099999 0.66085 -0.08968399999999999 0.4367227225000001 0.008043219855999997 -0.00641067 0.0015982800000000005 4.10966898489e-05 2.5544989584000017e-06 0.000124056 -2.776000000000002e-05 1.5389891136000003e-08 7.706176000000011e-10 0.00538798 -0.0002673200000000006 7.145998240000029e-08 2.90303284804e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34265.83203125 103.51953125 1174147244.7938385 10716.293350219728 21192.060546875 -8.6875 75.47265625 449103430.2224159 22380.27734375 19.869140625 500876813.9831696 394.7827491760254 0.810037 22.060234 0.08513345 -0.0559782776 -0.0286000772 -0.0522012829 0.03128525 0.0735276271 -0.016422406599999998 -0.0696050113 -0.1033906652 -0.0933701168 0.026266157999999998 -0.030893625600000002 0.0405732321 0.0148005635 -0.0142199293 -0.1731093715 0.0005320418 0.008748574399999999 0.0524943374 -0.0035583659000000007 -0.0755325907 0.045217857199999996 0.0310328019 -0.0071979778000000015 -0.0427598643 0.0822136377 0.0094706113 -0.0703012615 -0.09028171689999999 -0.0350913479 -0.0419438346 0.08124060179999999 0.0026898093 -0.007697622199999999 -0.0153072873 -0.0475260181 -0.0344421532 -0.008943341 -0.0463537412 -0.058707843499999995 0.0420031362 -0.06823713690000001 0.0162602169 -0.0710560445 0.1201344024 0.0628430578 -0.0559371466 0.0555145155 0.028219825299999998 -0.0319045704 -0.060496052 -0.1061538802 0.0934361668 -0.0015792824 -0.0104359449 -0.17289645420000002 0.0501033964 0.0065163463 -0.0121839024 0.006564942900000001 -0.00018863330000000008 0.018812186499999998 0.0456989093 0.09001411990000001 0.0677168957 -0.10057525390000001 0.0275072161 -0.016021608 0.0561449267 0.0733383364 0.0028739326000000003 0.1571497704 -0.0287766399 0.06902512400000001 -0.0047106451 -0.0755281812 -0.0995561965 -0.06190939490000001 -0.0577841 -0.00013669999999999655 0.00333900221281 1.8686889999999056e-08 0.3263 0.030930999999999983 0.0009567267609999992 0.10647168999999998 0.643579 -0.017271000000000036 0.41419392924099996 0.00029828744100000127 -0.00680077 -0.00039010000000000005 4.62504725929e-05 1.5217800999999998e-07 0.000329681 0.000205625 1.08689561761e-07 4.228164062499999e-08 0.00524781 -0.00014016999999999936 1.964762889999982e-08 2.7539509796100007e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34219.265625 -46.56640625 1170958139.9143064 2168.430191040039 21212.859375 20.798828125 432.591251373291 449985402.8635254 22378.509765625 -1.767578125 500797699.33017355 3.124332427978516 0.775119 21.109291 0.26460485 -0.0779326729 -0.049417246100000006 -0.0674984174 0.0560945578 0.0860788341 -0.0076623237 -0.0046931244 -0.0777607581 0.002484235 0.005724614499999999 0.08076514309999999 -0.0799412911 -0.0054718602 0.06563359440000001 -0.050219712400000005 0.0215586407 -0.059706386500000014 -0.0023720576 0.0412987508 -0.0283039776 -0.0425968959 -0.0712085294 0.0157467417 0.1374165936 -0.012219301 0.026137901600000003 -0.0377325458 -0.0615562042 0.060031693899999995 -0.0036355107 -0.0083569114 -0.0094412479 0.0885008351 -0.026657039100000002 -0.0784303083 -0.050579014900000004 0.0048070767 0.0150142495 -0.06724135690000001 0.0669728973 -0.0711625702 0.0138892756 0.0158565774 0.07328167320000001 0.0034954785 0.0768795708 -0.0488061738 0.0158994719 0.0055485416 -0.0941028412 0.031789589900000005 0.0143380844 0.10152262460000001 -0.051010478 0.022076190899999997 -0.0339234122 -0.030874544 0.0083127448 0.0073856934999999985 -0.0079119028 -0.10667463349999999 -0.0127211387 -0.0162149021 -0.1141650891 -0.0423953373 -0.030103828399999998 -0.0368773886 0.09197045949999999 -0.0078444967 -0.012282573400000002 -0.0196274123 0.0183189244 0.06788007459999999 -0.0078459096 -0.0785316931 -0.09876883410000001 -0.0555570233 -0.0610279 -0.003243800000000005 0.0037244045784099998 1.0522238440000033e-05 0.292929 -0.033370999999999984 0.001113623640999999 0.08580739904100002 0.7324509999999999 0.08887199999999984 0.5364844674009998 0.007898232383999972 -0.008545700000000002 -0.001744930000000001 7.302898849000002e-05 3.044780704900005e-06 0.00025709 -7.259099999999994e-05 6.609526810000001e-08 5.269453280999992e-09 0.00428297 -0.0009648400000000008 9.309162256000013e-07 1.83438320209e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34152.32421875 -66.94140625 1166381249.5426178 4481.151870727539 21192.8515625 -20.0078125 400.31256103515625 449136957.3501587 22377.802734375 -0.70703125 500766055.21860117 0.4998931884765625 0.8229229999999998 22.41115 0.10664474999999993 -0.0757858647 -0.0268979665 -0.0877620879 0.0375926038 0.07815501429999999 0.0362749186 -0.058878426799999994 -0.0621440678 0.0113103653 -0.0308199356 -0.0007554035 -0.05776747860000001 0.0661880854 0.0337293678 -0.044263633899999995 0.0735665499 0.0742665275 -0.0640157915 -0.028848645699999998 0.0291404494 -0.0741076241 0.0139962699 -0.0604641659 0.055875915899999996 -0.10087798 -0.014329653400000001 0.0776246204 0.012594966200000002 -0.0929290407 -0.0045314969 -0.0338688992 -0.05332587900000002 -0.0212216491 0.0764358064 -0.0706176463 -0.0222732156 -0.0049800158 0.0092293739 -0.09204606039999999 0.0429552977 -0.0689565194 -0.038406560299999996 -0.061423871399999996 0.0515577299 -0.030108231200000002 0.069342682 -0.0006338199 0.0654411865 0.0840157882 -0.0214249028 -0.05022031440000002 0.0388423081 0.0548124156 0.0651165434 0.0864498214 -0.0445779186 0.0312009798 0.039664027000000004 -0.1233528549 0.0521126983 -0.0165987304 -0.05744872230000001 0.0501119511 0.0669732319 0.0482123282 -0.0092361988 -0.0071219452 -0.0940949901 -0.0319007769 -0.0826364534 0.0288920529 -0.037899577999999996 0.0667182767 -0.010973431100000002 -0.081360845 -0.09759167619999999 -0.0488621241 -0.0582222 0.0028057000000000078 0.0033898245728399994 7.871952490000046e-06 0.29793800000000004 0.00500900000000004 2.509008100000041e-05 0.08876705184400002 0.727854 -0.004596999999999851 0.529771445316 2.1132408999998637e-05 -0.00739418 0.0011515200000000016 5.46738978724e-05 1.3259983104000032e-06 0.000567861 0.000310771 3.22466115321e-07 9.6578614441e-08 0.00470534 0.00042237 1.7839641690000004e-07 2.21402245156e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34342.56640625 190.2421875 1179411867.367691 36192.08990478516 21186.244140625 -6.607421875 43.65802383422852 448856940.7861672 22351.552734375 -26.25 499591909.63754654 689.0625 0.617205 16.808706 0.0475289 -0.0611855867 -0.0154778939 -0.0781190331 0.0502016456 0.08946405880000001 0.0663636389 -0.07990883730000001 -0.0747116102 -0.0421772453 -0.0778580913 -0.0787491008 -0.0341201246 0.1828977819 0.0392533162 -0.0258062527 0.0338108879 0.0737994028 -0.09380518 -0.0263627036 -0.022300808300000002 0.010318068199999999 0.07257967900000001 0.0473857411 0.07983989429999999 -0.0685684939 -0.0641177776 -0.053306447699999995 0.045100199999999986 0.063347032 -0.0728091754 -0.0164568376 0.028923772599999998 0.0388567705 0.0125702053 -0.0534191677 -0.044905068099999994 -0.0450889597 -0.0435492891 -0.08524790189999999 0.0561413059 -0.08451461880000001 -0.0636945594 -0.1007291667 0.06390649799999999 -0.028020255299999998 0.096020089 0.0209068403 0.0435560589 0.1447225483 -0.0089638227 -0.1261810093 0.0044676161 0.024651819900000004 0.0196415066 0.0919384805 -0.015290573100000001 0.06649551719999999 0.0019381603 0.1096339125 0.039235832000000005 -0.0822570096 -0.0153909667 0.027936351800000002 -0.14629869199999998 -0.0937467974 -0.0633228363 0.0149694251 -0.1471796726 0.012943976599999999 -0.0492181777 0.0236333463 -0.1038939092 0.0655400171 -0.0140901232 -0.08400935539999999 -0.0960293686 -0.0418659738 -0.0582504 -2.8200000000006e-05 0.0033931091001599997 7.952400000003383e-10 0.302869 0.004930999999999963 2.431476099999964e-05 0.091729631161 0.7151489999999999 -0.012705000000000077 0.5114380922009999 0.00016141702500000198 -0.00707717 0.0003170100000000004 5.00863352089e-05 1.0049534010000024e-07 0.000683845 0.00011598399999999995 4.67643984025e-07 1.3452288255999991e-08 0.00486964 0.00016430000000000004 2.699449000000001e-08 2.37133937296e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34201.984375 -140.58203125 1169775735.187744 19763.307510375977 21181.92578125 -4.318359375 18.64822769165039 448673979.8023834 22290.77734375 -60.775390625 496878754.5886383 3693.648105621338 0.722581 19.678476 0.1383582 -0.0753789885 -0.0295550511 -0.0758828124 0.0439975496 0.0769530722 0.0479492412 -0.0270662958 -0.060303055700000004 -0.0569890967 -0.048355955199999995 -0.0201607409 -0.0192067604 0.1063173057 0.060912155 -0.0212278832 -0.0774843531 -0.0138895078 -0.0646840728 0.0038203832 -0.0849635228 -0.061989307 -0.0367270454 -0.0404478541 0.036333973 0.0215233397 0.056156601699999996 -0.0317568671 -0.0702570129 0.0964609501 -0.0118220172 -0.026134865400000002 -0.06679548190000001 -0.0343283931 0.054263595 -0.0692939712 -0.0442256754 -0.0281493508 -0.0002092743 -0.0788611062 0.0392435534 -0.0693101862 -0.044596805999999996 -0.0373230312 0.0558779796 0.0255475358 0.0754564124 -1.42298e-05 -0.0344072979 0.06565842849999999 -0.0201985824 -0.12105045910000001 -0.034770073 -0.0259193286 -0.0770444946 -0.0516330702 -0.0502635954 -0.0273356926 0.0862014617 -0.0625646785 -0.0370059427 -0.0532856683 0.0357869632 0.047665920300000005 -0.0656032698 -0.0569746728 -0.049972151799999996 0.0053094226000000005 -0.0201399794 -0.0017855897 -0.031742630699999996 -0.0283632934 -0.0785550772 0.06434558650000001 -0.01719291 -0.0864713441 -0.0940880769 -0.034611705699999995 -0.07646279999999997 -0.01821239999999997 0.005846559783839995 0.00033169151375999885 0.292558 -0.010311000000000016 0.00010631672100000032 0.085590183364 0.770845 0.05569600000000008 0.5942020140250001 0.003102044416000009 -0.00798339 -0.00090622 6.37345158921e-05 8.212346884000002e-07 0.0006961010000000001 1.2256000000000094e-05 4.845566022010001e-07 1.502095360000023e-10 0.00470534 -0.00016430000000000004 2.699449000000001e-08 2.21402245156e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34147.71875 -54.265625 1166066695.8291016 2944.758056640625 21198.775390625 16.849609375 283.9093360900879 449388078.0621682 22319.708984375 28.931640625 498169409.14719015 837.0398292541504 0.7449979999999999 20.288988 0.18577865 -0.0716427058 -0.0483376991 -0.076125159 0.048660893200000006 0.11364651349999999 0.035044618 -0.082921917 -0.13515736820000002 0.008698470600000001 0.0207798907 0.0029531301 -0.0231181385 0.0018729443 0.07964038429999999 -0.1330406644 0.05615845 -0.0566256872 -0.10112173949999999 0.0055803563 -0.0243879987 0.0558970165 0.0382158565 -0.1032245314 -0.0675115506 0.032854191899999996 -0.050355976100000005 -0.0143925272 0.0549615143 0.0568286668 0.20687118329999998 0.0221721746 -0.017534819 0.009568805500000001 -0.12478835939999999 -0.0672782553 -0.0390202859 0.0257759503 -0.0136622777 -0.0828522916 0.058685708499999996 -0.10362995679999999 -0.0353372237 -0.0802660035 0.1357310736 -0.0087688471 0.0185848116 -0.0041303105 0.034759498 0.0007869608999999999 -0.0932156436 -0.1182050059 0.0047135623 0.1398576521 -0.020832514099999998 0.0179536605 0.030517992200000007 0.0678817154 -0.0721399142 -0.0242218864 -0.0830854058 0.0670021003 0.049500296900000004 -0.0738027777 -0.0784836455 0.11025632810000001 -0.0079784657 0.1208371727 0.0984821551 -0.054979211900000005 0.0164520428 0.0108178802 0.1122160602 0.0631352795 -0.0202787295 -0.0887413447 -0.0917754626 -0.027144045 -0.0980287 -0.021565900000000027 0.009609626023690001 0.00046508804281000115 0.287217 -0.0053409999999999855 2.852628099999984e-05 0.082493605089 0.7223699999999998 -0.048475000000000164 0.5218184168999997 0.0023498256250000147 -0.00635721 0.0016261799999999994 4.04141189841e-05 2.6444613923999994e-06 0.000582546 -0.0001135550000000001 3.39359842116e-07 1.2894738025000023e-08 0.00423714 -0.0004681999999999993 2.1921123999999933e-07 1.7953355379600008e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34172.6015625 24.8828125 1167766697.5493774 619.1543579101562 21191.935546875 -6.83984375 46.78346252441406 449098132.2229042 22337.875 18.166015625 498980659.515625 330.00412368774414 0.936934 25.516094 0.4262073000000001 -0.0935844571 -0.025917430099999996 -0.096640949 0.0357579948 0.0767970629 0.053908305999999996 0.0368264159 -0.10253724480000001 -0.0627002448 0.0357078538 -0.0047412954 -0.0020269418 -0.1652564901 0.0063564989 0.0320986315 -0.0369468999 0.0589433818 -0.0250819549 0.09022106880000001 0.08172631400000001 0.0329994857 0.0260836338 -0.1154448028 -0.0649308511 0.07696986980000001 0.0114227505 0.0324674878 0.0710456546 0.0520907875 0.0401229569 -0.0654510011 0.09512526380000001 0.0016146126 -0.0913388425 -0.09284631880000001 -0.0332801906 -0.0224647008 0.0638208666 -0.0969176315 0.0411633819 -0.0750471759 -0.0425854046 0.058300551900000004 0.1169023444 0.0554426321 0.0066825048 0.0328392103 -0.1040001363 -0.09280204869999999 -0.0058529393 0.015509541299999999 0.0130015632 -0.0423959093 0.0158035402 0.1124603833 0.0064513043 0.0293307041 -0.0926153235 -0.0257732274 -0.1400487393 0.038782676 0.0200525743 -0.0699948443 0.044465094299999994 -0.0451639945 0.036879339 0.0453975435 -0.0081076264 0.18443226489999998 0.0523155101 0.0341153559 0.0253756894 0.06190939490000001 -0.0233445364 -0.0908143174 -0.08910065240000001 -0.0195090322 -0.0983136 -0.00028490000000001847 0.009665563944960005 8.116801000001052e-08 0.373473 0.086256 0.007440097536 0.139482081729 0.934216 0.2118460000000001 0.8727595346559999 0.04487872771600004 -0.0087875 -0.00243029 7.722015625000001e-05 5.9063094841e-06 0.0007086639999999999 0.00012611799999999993 5.022046648959998e-07 1.5905749923999982e-08 0.00423714 0.0 0.0 1.7953355379600008e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33995.984375 -176.6171875 1155726953.625244 31193.63092041016 21138.474609375 -53.4609375 2858.0718383789062 446835108.8111916 22263.75 -74.125 495674564.0625 5494.515625 0.860991 23.447893 0.2124471 -0.10217802720000001 -0.0103588373 -0.1035549594 0.0272718116 0.025089840099999997 0.0592228872 -0.0053554347999999995 -0.023936960299999997 -0.0558019184 -0.0913728815 -0.0291683868 -0.015271253200000001 -0.06541081280000001 0.08092388219999999 0.0337406875 -0.13698305189999999 0.0766682751 -0.015304375 0.073227915 0.0655827066 0.042992717199999995 -0.0394406769 -0.0995182346 -0.07012419639999999 0.0388611663 0.1551246115 0.0045359078999999995 -0.0785728673 0.0172482055 -0.0828444339 -0.033533775 0.040544440099999995 0.011037505500000001 -0.044061006900000005 -0.1013446556 -0.0048023028999999995 -0.0068559569 0.0302719424 -0.1018870776 0.0242394597 -0.0201403963 -0.058143063700000004 -0.026379369700000002 0.015239905900000001 0.03004464 0.1152971528 0.017632638500000002 -0.142110276 -0.019552665900000002 -0.050424003099999996 -0.0472580566 -0.0045180820000000005 -0.12994883029999998 -0.0180282124 -0.0244645009 0.007399116099999999 -0.028366574500000002 -0.1129204607 -0.11659683859999999 -0.0736919686 0.0718009342 -0.0846050083 -0.0969263294 0.014593898400000001 -0.1690333155 -0.007959556500000001 -0.0368124087 0.0192024261 -0.09509832189999999 0.0561823408 0.010609071599999999 0.0920028742 0.060668235099999995 -0.026387305 -0.09268565960000001 -0.08607420269999999 -0.0117537397 -0.0975201 0.0007935000000000164 0.00951016990401 6.296422500000262e-07 0.347002 -0.026471000000000026 0.0007007138410000011 0.120410388004 0.940083 0.0058670000000000675 0.8837560468889999 3.442168900000078e-05 -0.011346 -0.0025585 0.000128731716 6.5459222499999995e-06 -0.000319148 -0.001027812 1.01855445904e-07 1.0563975073440001e-06 0.00423714 0.0 0.0 1.7953355379600008e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34290.0625 294.078125 1175808386.2539062 86481.94360351562 21216.169921875 77.6953125 6036.561584472656 450125866.15387344 22500.05859375 236.30859375 506252636.7221832 55841.75148010254 2.657039 72.360764 1.85132505 0.0042208340000000006 -0.0706554328 0.055164034800000004 0.1306093878 0.0311108581 -0.059970927 -0.0026117211 0.18482785440000002 -0.1998511353 -0.021975142000000003 0.1625554225 -0.0825684913 -0.2027782933 0.2490316681 0.2183937034 -0.3236349978 -0.1359291142 0.0791826783 -0.2401025487 0.0058381351 0.045264704100000004 0.0070463314 0.0449811342 0.0904509175 -0.10349707289999999 0.1178057751 0.0160784237 0.0866555919 -0.07033969429999999 -0.1306508853 0.0498664327 0.017926822 0.060939953399999996 0.1131282609 0.012863699 -0.08701304550000001 0.10091724949999999 -0.2466967336 0.060610993099999996 0.1261488527 -0.025335047700000002 0.0610170576 0.0357835555 -0.1203346557 0.26353091359999997 0.1430164568 -0.055052993099999996 -0.23299061079999997 -0.1547297861 -0.1274307513 0.23626304480000002 -0.3694039274 -0.0376898518 0.1181517511 -0.0829233786 0.0532956301 -0.0176820781 0.0234932981 0.0350418664 0.0715105851 -0.0451830265 -0.1693756364 0.0486089253 -0.0309110732 0.0169529025 -0.092783376 -0.0695177551 -0.0334212547 -0.0564054788 0.180263722 -0.0605118273 0.0864544431 0.059412106299999996 -0.0294040325 -0.09435121640000001 -0.0827080574 -0.0039259816 -0.112978 -0.015457899999999997 0.012764028483999998 0.0002389466724099999 -0.08394509999999998 -0.4309471 0.18571540299841 0.007046779814009997 0.459478 -0.480605 0.211120032484 0.230981166025 -0.0282705 -0.0169245 0.0007992211702499997 0.00028643870024999983 -0.000348189 -2.9040999999999995e-05 1.21235579721e-07 8.433796809999997e-10 0.0057699 0.0015327599999999991 2.3493532175999982e-06 3.3291746009999994e-05 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34260.078125 -29.984375 1173752953.1311035 899.062744140625 21080.900390625 -135.26953125 18297.84608459473 444404361.27945334 22333.607421875 -166.451171875 498790020.4744301 27705.99261856079 2.885045 78.57018999999998 2.29723165 0.1653713094 0.06182598690000001 0.17046352239999998 -0.08759381710000001 -0.2126633261 0.0492859029 0.11374470060000001 0.09557044449999999 -0.0869580126 -0.051297574299999996 0.1538756913 0.026468577400000002 0.0152626216 0.12120589779999999 -0.1574317348 -0.044643120700000004 -0.064231364 0.1277914724 0.0247442848 -0.044323336100000006 0.25502516129999997 0.1755971309 0.025731146200000003 0.1032279615 -0.1237133057 -0.0375543025 -0.0925001384 0.1693816277 0.23406703739999998 0.049586487400000004 0.0678824023 -0.073589293 0.054914418099999994 0.0636305097 0.16715068800000002 0.0015882852 -0.048086757300000005 -0.044834548499999995 0.17551410829999994 -0.1366792215 0.19621588550000002 -0.046438077800000005 0.061612383099999994 -0.088464615 0.1318952336 0.049182581100000004 -0.1265811136 -0.036427093 -0.019354618 -0.165096713 0.0369603747 0.1143544258 -0.017776984699999998 0.0287979387 -0.027113943300000002 0.1033073018 0.1283047316 -0.1046263699 0.2074426741 -0.0912447091 -0.0529973025 -0.0033860205999999998 0.103805311 -0.1830780401 -0.0704653308 -0.0833082284 0.12249729470000001 0.0228050664 -0.0680033471 0.0156900636 0.1368814332 -0.08978095859999999 0.058141318399999996 -0.0323917418 -0.09580728990000001 -0.0790155012 0.0039259816 -0.051106300000000014 0.06187169999999999 0.0026118538996900012 0.003828107260889999 -0.462746 -0.3788009 0.14349012184081 0.21413386051600003 -0.123085 -0.5825629999999999 0.015149917224999997 0.3393796489689999 -0.0487224 -0.0204519 0.0023738722617600004 0.0004182802136100001 -0.00277757 -0.002429381 7.7148951049e-06 5.901892043161e-06 0.00836854 0.002598640000000001 6.7529298496000055e-06 7.003246173160001e-05 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33136.5703125 -1123.5078125 1098032292.0752563 1262269.8047485352 21077.521484375 -3.37890625 11.417007446289062 444261911.92428964 22182.234375 -151.373046875 492051521.8674317 22913.799320220947 1.073748 29.242031 0.2518327000000001 0.103231209 0.0009261416 0.148613879 -0.09072635849999999 -0.2333904309 0.033924438700000004 0.1106616673 0.0421042216 -0.031672890499999995 0.0858297289 0.29649143920000004 -0.069362306 0.0594015369 0.0799918874 0.0061595229000000005 0.0748583448 0.0349005939 -0.049468327 0.0729111802 0.0500125034 0.025774781099999998 0.1845854911 -0.11615161560000001 -0.09200875050000001 0.2033269525 0.06768852110000001 -0.0289630399 0.0006437337 -0.11196455710000001 0.1784609678 -0.1389595932 0.0221736603 0.055335638799999996 0.0342977012 0.1063971174 0.12420075720000001 0.15500733460000002 0.26825705780000003 0.15400521820000002 -0.12333144130000001 0.2094391272 -0.0492420982 0.1207802708 -0.0278173615 0.0991818121 0.0167438282 -0.2668604364 0.0617600134 0.0533952392 -0.12145534710000001 -0.0017258973000000002 -0.0271301454 0.0635589442 0.0304236806 0.014447514299999999 -0.0188725024 0.1562108414 -0.0365323173 0.0054541464 -0.1343613069 0.0635929366 0.013288213799999999 -0.1713794757 0.0117945725 -0.0886081659 0.2074561072 0.0438965038 -0.0506955366 -0.0059913525 0.0552831667 -0.1026573926 -0.0846806666 0.0568561851 -0.0353474844 -0.0970506473 -0.07501110700000001 0.0117537397 -0.0130686 0.038037700000000015 0.00017078830596000004 0.0014468666212900006 -0.433793 0.02895299999999995 0.0008382762089999973 0.188176366849 -0.100011 0.023073999999999983 0.010002200121 0.0005324094759999994 -0.0519215 -0.0031991000000000033 0.0026958421622500003 1.0234240810000024e-05 -0.00279723 -1.9659999999999907e-05 7.8244956729e-06 3.865155999999962e-10 0.00835194 -1.6600000000000295e-05 2.755600000000098e-10 6.975490176360001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33413.875 277.3046875 1116487042.515625 76897.88970947267 21056.404296875 -21.1171875 445.93560791015625 443372161.913456 22184.54296875 2.30859375 492153946.7323151 5.329605102539063 1.038056 28.270012 0.4272558 0.1310263589 0.08831237039999999 0.15201818820000002 -0.1144176069 -0.2694690736 0.058785575599999994 0.0384809136 0.0652497977 -0.1195318287 0.1160576136 0.0354551186 0.0075740548 0.0636621631 0.015918990900000003 -0.0281861159 0.1400551119 0.1605230356 0.0166724673 -0.114407712 0.024123954 0.11732804710000001 0.0128083253 -0.0591865195 -0.0493307471 0.0660072762 -0.0283895423 0.0594569703 0.009134668 -0.044782386900000005 0.0382512956 0.082117846 -0.0293015031 -0.0185138509 -0.0039182651 0.1497589711 0.1437023534 0.0813605998 0.0849517916 0.15691556339999999 -0.1447831121 0.2457993547 -0.0664368189 0.0631511926 -0.0311804845 0.1311504283 -0.0684685849 -0.002557304 0.11281304210000001 0.08231780309999999 -0.023367810099999997 -0.0132720668 0.0450634461 0.0121439426 0.2249836374 0.0140575079 0.0815780656 -0.08659954789999999 -0.0550168007 0.0022027602 -0.0700815957 0.0727537977 0.0582467155 -0.0143088047 0.0355195455 0.0389005004 0.0222943244 0.06714424990000001 0.0218526123 -0.0054816467 -0.0388429033 -0.0558184109 0.10009190720000001 0.0555570233 -0.0382683432 -0.09807852800000001 -0.0707106781 0.0195090322 0.0275137 0.0405823 0.0007570036876899999 0.0016469230732900002 -0.5628350000000001 -0.12904200000000005 0.016651837764000012 0.3167832372250001 -0.244714 -0.14470299999999994 0.059884941795999985 0.02093895820899999 -0.0511298 0.0007916999999999992 0.00261425644804 6.26788889999999e-07 -0.00209508 0.0007021499999999999 4.3893602064e-06 4.930146224999999e-07 0.00911666 0.00076472 5.847966784e-07 8.311348955560001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33689.61328125 275.73828125 1134990043.0401766 76031.5997467041 21068.677734375 12.2734375 150.63726806640625 443889181.4749488 22239.796875 55.25390625 494608565.04125977 3052.994155883789 0.853665 23.248365 0.4196441 0.1391155849 0.0977006666 0.1569255775 -0.11611521300000001 -0.19999663059999997 0.066669342 0.0247818296 0.0071892482 -0.1580194059 0.0795879877 0.0083901399 0.046936197 0.1545418729 0.0302109799 -0.0301545711 0.0935583257 0.0909412027 0.0503989291 -0.0684988162 -0.0442683979 0.0014060217000000002 -0.0954437311 0.0211489359 -0.0347604727 -0.047798102599999996 0.0470224708 0.0730177415 0.030576420099999998 0.0315991325 0.0433983517 0.0220869457 0.0026068392 0.056877870199999986 -0.0661157855 0.1511197935 0.105321915 0.0089700955 0.0778034447 0.1614595631 -0.1480913298 0.1785148712 -0.0679626275 0.0352054699 0.0273295205 0.1593592237 -0.0665271416 0.0293426791 0.1173892936 0.16152683980000002 -0.045234820099999996 -0.0361406659 0.0426337343 -0.055265710999999995 0.0834814053 -0.050426146799999995 0.0398088573 -0.0761253088 0.06576835290000001 -0.0473459592 -0.0023121864 -0.0036694315999999997 -0.063672724 0.0195322769 -0.0380805287 0.1599321104 -0.0348348946 0.0348681646 0.1303130294 0.0654416011 0.1226608974 0.0212411554 0.0437729589 0.0542441537 -0.0411514359 -0.0988886499 -0.06613118650000001 0.027144045 0.0520428 0.024529099999999998 0.0027084530318400002 0.0006016767468100001 -0.503655 0.05918000000000013 0.0035022724000000143 0.253668359025 -0.340739 -0.09602500000000004 0.11610306612099999 0.009220800625000004 -0.0469779 0.0041519 0.0022069230884099998 1.723827361e-05 -0.00177017 0.00032491000000000014 3.1335018289e-06 1.0556650810000006e-07 0.00879527 -0.0003213899999999995 1.032915320999997e-07 7.735677437290001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34140.98828125 451.375 1165607080.8204498 203739.390625 21158.2265625 89.548828125 8018.992618560791 447670551.27008057 22255.26953125 15.47265625 495297021.90858465 239.4030914306641 1.141075 31.075602000000003 0.6812201999999999 0.14970794070000001 -0.0134018697 0.1852623026 -0.0026643213 -0.08565694630000001 0.0168124935 0.1578041984 -0.0342611727 -0.046909447800000004 0.11528267630000001 0.0090670555 -0.0098870078 -0.017058892 0.0023156869 -0.0167311316 -0.0607292425 -0.0099076432 0.0858503457 0.007872988000000001 0.0417477964 -0.1437967422 -0.0946695832 0.08574498119999999 -0.059111603600000014 -0.0633024636 -0.0379617269 -0.0170959276 0.0281305329 0.1058160811 -0.0197695191 -0.0363862046 -0.06810253549999999 -0.1636753097 0.0009419312 0.1414109031 -0.035742706 -0.021752892000000003 0.1147890398 0.1921463328 -0.017851795400000002 0.0810609444 -0.0219833786 0.1810161275 0.06672782320000001 0.048416551399999994 -0.042680690800000004 0.0134925022 0.0071109497 -0.035467866 -0.0576481582 0.0338789316 0.026814858599999998 -0.09234494380000001 -0.051549942300000005 0.027352309300000002 -0.1201072723 -0.0834672296 0.1289654959 -0.011195169199999999 0.0803225318 0.0208139338 -0.005397504 0.0744198943 -0.0025085306 0.057735855999999995 0.0337768984 0.017181596 -0.1357457122 0.0606510302 0.0111013897 -0.0464313894 -0.0340074914 0.0529179001 -0.043993917 -0.0994792142 -0.0612907054 0.034611705699999995 0.0156361 -0.03640669999999999 0.00024448762321000004 0.00132544780489 -0.503171 0.00048399999999992893 2.3425599999993118e-07 0.25318105524100004 -0.140549 0.20019 0.019754021401 0.0400760361 -0.0421587 0.0048192000000000035 0.0017773559856899999 2.3224688640000025e-05 -0.00052238 0.00124779 2.7288086440000004e-07 1.5569798840999996e-06 0.00597947 -0.002815800000000001 7.928729640000006e-06 3.57540614809e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34063.30078125 -77.6875 1160308460.1139069 6035.34765625 21093.20703125 -65.01953125 4227.5394439697275 444923382.8631744 22269.78515625 14.515625 495943330.9055328 210.703369140625 1.087778 29.62413 0.283099005 0.1360035649 -0.0851482506 0.1640801924 0.024776939300000002 -0.1487427258 0.022850859100000002 0.0588891738 0.0461967192 0.09392954210000001 -0.0021357503 0.0733171608 0.028627054199999998 -0.023628629100000003 0.0470454628 -0.0058614734 -0.0162610792 -0.0708986614 0.102298968 0.013443331000000001 -0.0550861442 -0.0666194445 -0.0212252614 -0.032599779700000005 -0.046342799500000004 0.0993234987 -0.0023981108 0.040609514900000004 -0.010789676100000001 -0.1534822934 -0.1513854638 -0.0688906325 -0.2021624873 -0.1680548493 0.0557009317 0.11310751710000001 -0.0642368414 0.0403194413 0.12381398619999999 0.16922625940000002 0.0013159726 0.1507854933 -0.0340737925 0.0368562505 -0.06311935219999999 -0.0672770821 -0.0553890763 -0.045103559 -7.715760000000001e-05 -0.028060180499999997 -0.0538786904 0.076220611 -0.0354752006 -0.0117519149 -0.044260401799999995 -0.0448044747 0.0252494519 -0.059264918 0.1171617805 -0.0733662866 -0.0068246365 0.0477296971 -0.0175027681 0.1599610988 0.14306840640000001 -0.1298695426 0.1525496216 0.0296937587 -0.06197486660000001 -0.0600626212 -0.17699023739999994 0.1170417478 -0.1142707583 0.051578589800000005 -0.046792981399999996 -0.0998489097 -0.0562083378 0.0418659738 0.07060169999999999 0.05496559999999999 0.004984600042889999 0.0030212171833599987 -0.548489 -0.04531799999999997 0.0020537211239999974 0.300840183121 0.000390655 0.140939655 1.52611329025e-07 0.019863986351519026 -0.0422651 -0.00010639999999999956 0.0017863386780099999 1.1320959999999905e-08 -0.000733055 -0.000210675 5.373696330250001e-07 4.4383955625000013e-08 0.00649991 0.0005204400000000005 2.708577936000005e-07 4.22488300081e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33994.015625 -69.28515625 1155593098.312744 4800.432876586914 21145.294921875 52.087890625 2713.148349761963 447123497.3330727 22313.525390625 43.740234375 497893415.35806656 1913.2081031799319 1.3973799999999998 38.055706 0.9664976249999998 0.1670396612 -0.015576633999999999 0.1766596803 0.0180157705 -0.0678720319 0.0389818173 0.0175621498 -0.05408167480000002 0.159972225 0.08956799509999999 -0.13960177199999999 0.0025112881 -0.0229578198 -0.027571326299999997 -0.0044166136 0.0309353552 0.00980395 -0.06187669110000001 -0.06336042230000001 0.0187884941 -0.0280438348 0.0013226833 -0.0383782154 0.0980964429 -0.010998828899999999 0.0064516855 0.0940785428 0.0789042577 -0.1153178483 0.0276876561 0.0557484404 0.08279388139999999 0.0901820869 -0.0223253236 0.1606932516 -0.0026383129999999998 0.0224310104 0.0455952688 0.17785037809999998 0.021324396699999998 0.0694999129 -0.0561550931 0.0280486519 0.0399952253 -0.1763250137 -0.08562868259999999 0.1087791298 0.053769205199999996 -0.0363963381 0.0140398208 -0.029075964500000002 -0.0405731883 0.06792943679999999 0.0337917232 0.0691604679 0.0227404964 0.0232868475 -0.0084692252 -0.0123281662 -0.0649638861 -0.07817191450000001 -0.011491616699999999 -0.010992459599999999 0.1381357094 0.0695907984 -0.0339521113 -0.1540027433 0.1464334316 -0.008387073 0.0396146467 0.0088023725 -0.006948060799999999 0.050226553300000004 -0.0495458668 -0.0999969158 -0.0509041416 0.0488621241 0.00501148 -0.06559021999999999 2.51149317904e-05 0.004302076959648399 -0.72519 -0.176701 0.031223243401000002 0.5259005361 -0.213372 -0.213762655 0.04552761038399999 0.04569447267264901 -0.0359865 0.006278600000000002 0.0012950281822499993 3.942081796000003e-05 -0.00371558 -0.002982525 1.38055347364e-05 8.895455375624999e-06 0.00555216 -0.0009477499999999998 8.982300624999997e-07 3.0826480665600014e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33952.69921875 -41.31640625 1152785784.2389069 1707.045425415039 21126.345703125 -18.94921875 359.0728912353516 446322482.76794815 22257.44140625 -56.083984375 495393697.952652 3145.413303375244 1.141186 31.078606 0.75604112 0.1684115725 0.0641961006 0.1665369987 -0.0618211064 -0.0460216412 0.0519889066 -0.0008115114 -0.047115216900000007 0.0838093053 0.06374560559999999 -0.1463710624 -0.0121084839 0.0332366418 0.009964752 -0.1295587294 0.1667332912 -0.0967178425 0.0885280978 -0.0776972785 -0.1130877142 0.0836520909 -0.0185040578 -0.0628742545 0.1054744073 -0.0765590548 0.035293477000000004 0.08887737470000001 -0.259151535 -0.0007152345 -0.1770461961 0.0820425224 0.0560945347 0.0150747958 0.0681511922 0.1736277236 0.04403944059999999 -0.0344876891 0.029911087200000002 0.163639751 -0.0639792313 0.0345972938 -0.07127523820000001 0.0043854218 0.019400938899999998 -0.0942035869 -0.0585334212 0.1482764195 0.10553459220000001 0.0731454574 -0.017296585700000002 0.0024868692999999997 0.10642250460000001 0.1833127607 0.0273277035 -0.16130130980000001 0.1086595421 0.0046791242 -0.0823335129 -0.17393807530000002 0.0189726268 -0.1239122602 0.0835459036 0.06939519570000001 -0.0284917046 -0.0309841125 -0.0852730433 -0.1702819976 -0.0620834079 -0.1630210376 -0.1371444834 -0.1100816106 -0.05575683360000002 0.0488621241 -0.052249856500000004 -0.09992290359999999 -0.04539905 0.0555570233 0.08655310000000001 0.08154162000000001 0.0074914391196100015 0.006649035792224403 -0.385542 0.339648 0.115360763904 0.148642633764 -0.398166 -0.184794 0.15853616355599998 0.034148822435999995 -0.0364066 -0.00042009999999999964 0.0013254405235599998 1.764840099999997e-07 -0.00214858 0.0015669999999999998 4.6163960164000015e-06 2.4554889999999995e-06 0.00656621 0.0010140499999999998 1.0282974024999996e-06 4.31151137641e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34112.78515625 160.0859375 1163682111.1164706 25627.507385253906 21143.244140625 16.8984375 285.55718994140625 447036772.79007334 22229.462890625 -27.978515625 494149020.40567404 782.7973365783691 1.070247 29.146688 0.6998812000000001 0.14879740689999998 -0.0430984864 0.1723846035 0.0237624613 -0.036434454 0.07512459 0.0762909016 -0.05132005519999999 0.0820756949 0.1112384458 -0.0968619507 0.0373498662 0.0683003595 -0.0234739525 0.0785142797 0.0707317284 0.0358932317 -0.07679893730000001 -0.0324839845 0.1292772784 -0.0550807084 -0.1292850494 0.0023812964000000003 0.0823917218 -0.05893337980000001 -0.0177440448 -0.0082509465 -0.0307728467 0.0498836967 -0.0064380843999999994 0.05751711690000001 0.1161222294 0.0056575168999999995 -0.0685069975 0.1532166535 -0.0406003505 -0.0019590581 0.1513113529 0.1748429997 0.0214079498 0.03468471 -0.0894637975 0.0917858342 0.0534936408 -0.0919973699 -0.1119163003 0.0854213956 0.0236369614 0.10039000990000001 0.0468196922 0.0036730388 -0.057167330499999995 0.017215090500000002 0.00040702370000000003 0.1024161865 -0.11389153960000001 -0.0802793851 -0.08703075810000001 -0.009767812399999999 0.028957014500000006 -0.0824433723 -0.025099505 -0.042577274299999995 -0.021403883399999997 -0.0085191944 -0.2129565014 0.0384210794 -0.12455289630000001 0.010935976699999999 0.10193829199999999 0.1342504796 0.0301602639 0.047485639 -0.054902281799999994 -0.0996270376 -0.0397147891 0.06190939490000001 0.0571524 -0.029400700000000012 0.0032663968257600007 0.0008644011604900005 -0.617718 -0.23217600000000002 0.053905694976 0.38157552752400004 -0.228542 0.16962399999999994 0.052231445764 0.028772301375999988 -0.039761800000000014 -0.0033552000000000096 0.0015810007392400005 1.1257367040000063e-05 -0.00108531 0.0010632700000000005 1.1778977961e-06 1.1305430929000003e-06 0.00561107 -0.0009551400000000002 9.122924196000004e-07 3.1484106544900004e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34025.69921875 -87.0859375 1157748207.3248446 7583.960510253906 21157.125 13.880859375 192.6782569885254 447623938.265625 22202.931640625 -26.53125 492970173.4382668 703.9072265625 1.254043 34.152107 0.5261220999999999 0.1676102625 -0.0719311981 0.1750433784 0.065671053 -0.0356930657 0.023428658199999997 0.044616824900000004 -0.033765952 0.0087111537 0.0501401979 -0.1661127059 -0.0177620003 -0.0267763123 -0.0618280325 0.06507672240000001 -0.0009902402 0.09470034199999999 -0.0516821524 -0.0811225614 0.0590437931 -0.0824143823 -0.1754067916 0.1274931941 -0.052586169 -0.0844440945 0.0237273856 -0.0249172008 0.13368832630000002 0.0842393146 0.029011752000000002 -0.1304243034 0.0324834036 -0.0459042766 -0.0453775557 0.1588797604 -0.067998499 0.0547577081 0.0661341996 0.1801282435 0.058839579800000014 0.0280674523 -0.0346367302 0.061998790199999994 0.0378231486 -0.0349237041 -0.0189460547 0.1528641707 0.0397138706 -0.0012754145 0.1147364966 -0.052516217999999996 -0.038768129900000003 -0.0759603239 0.008295540799999999 0.1244436894 -0.14217832519999998 -0.1439009578 0.0687059017 0.0510797621 0.0368880895 0.0388630363 -0.1250286404 -0.1629231394 -0.062947312 0.0201804592 -0.1072450932 -0.0174633673 -0.0279575866 -0.0067536777 -0.0903777511 0.0674604473 -0.0207685679 0.0460974375 -0.057500525199999986 -0.0991099747 -0.033873792 0.06788007459999999 0.0341502 -0.0230022 0.00116623616004 0.00052910120484 -0.50856 0.10915799999999998 0.011915468963999995 0.2586332736 -0.0707632 0.15777879999999997 0.00500743047424 0.02489414972944 -0.0371056 0.0026562000000000113 0.0013768255513599995 7.05539844000006e-06 -0.000691158 0.000394152 4.77699380964e-07 1.5535579910399994e-07 0.00393776 -0.00167331 2.7999663561e-06 1.55059538176e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34320.19921875 294.5 1177876074.414688 86730.25 21132.41796875 -24.70703125 610.4373931884767 446579089.2059479 22249.21484375 46.283203125 495027561.1633453 2142.1348915100093 1.093773 29.787373 0.65364085 0.1695876623 -0.10090950580000001 0.15640767 0.107659094 0.0008142942 0.006948840600000001 -0.030582957400000006 -0.10860569939999999 -0.0490881995 -0.0525340559 -0.1403522035 0.0366963719 -0.0272814123 -0.121152513 0.0164349447 -0.12557583390000002 -0.0519068892 0.0522158428 -0.0325541352 0.09227825390000001 -0.0791640682 0.058818059299999996 0.11525095699999999 -0.1368274386 -0.07954299570000001 -0.049108844900000004 -0.0392853695 0.0216268719 0.0359455932 0.1714580281 -0.1017814565 -0.0040420562 -0.0061322573 -0.0654385819 0.1592166977 -0.1165435837 0.0187712661 -0.0241545887 0.1590417733 0.1088756769 0.006127061800000001 -0.005438003100000001 -0.0633989042 0.1205757161 -0.01248642 0.0139689609 0.1213987312 -0.024734794100000002 -0.08578501050000001 0.0984362868 -0.012203634 -0.0288841907 -0.1442318267 -0.030749206299999998 -0.0670224908 -0.13662551050000002 0.0585265325 0.0404746054 0.0136606319 0.0705558253 0.0679821663 -0.015347131100000001 -0.0934313048 -0.0298277117 0.21060890300000001 0.1279871766 -0.018114866299999997 0.08701424869999999 -0.1038343251 -0.0697495012 -0.0461481304 -0.0511892553 0.0446978621 -0.0600420225 -0.0983728629 -0.0278991106 0.0734322509 -0.0273063 -0.061456500000000004 0.00074563401969 0.00377690139225 -0.383222 0.125338 0.015709614243999998 0.146859101284 0.0337052 0.1044684 0.00113604050704 0.01091364659856 -0.0316947 0.005410899999999996 0.00100455400809 2.927783880999996e-05 -0.000251669 0.000439489 6.3337285561e-08 1.93150581121e-07 0.00254059 -0.00139717 1.9520840089000004e-06 6.4545975481000016e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34134.94921875 -185.25 1165194758.1666412 34317.5625 21162.150390625 29.732421875 884.0169105529785 447836609.1554298 22225.865234375 -23.349609375 493989085.41659933 545.2042579650879 1.06687 29.054714 0.35319355 0.1336103747 -0.182945548 0.1518047884 0.1500368395 0.0350720963 -0.0045523376 -0.041017298199999996 -0.0500650431 0.09615104470000001 -0.0510008389 -0.0060594467 -0.048635846399999995 -0.0963346689 0.0150893217 0.0181827522 -0.0242074734 -0.084953296 -0.0387655767 0.13897502009999999 0.0416039996 -0.1350627121 -0.0772540076 0.029437645099999996 -0.11308841130000001 0.0727042361 -0.0777615054 -0.13213406460000002 -0.054490203200000004 -0.0521253782 -0.0074614157 0.0428643933 -0.0091676931 0.0494541658 -0.0875049661 0.1217314413 -0.1421782995 0.0938027124 0.0343599514 0.1594827117 0.15391649599999999 -0.0207468199 -0.0035941174 -0.0430235592 0.0214970041 -0.088383091 0.0639172379 0.0016932858 -0.0728220058 -0.0782937159 -0.046578830700000004 0.0476850426 0.0338235181 0.08867737869999999 -0.12372698289999999 0.042205048700000004 -0.0752904785 0.013832923799999999 0.0637803622 0.0196295081 0.09576953740000001 0.1192483465 0.0743434515 -0.036201064399999996 -0.012095468500000001 -0.0482097476 -0.017906583400000002 0.0620698874 0.0177501345 0.1528884772 0.0410767738 -0.17591849420000005 0.0456308978 0.043287258200000005 -0.06252426559999999 -0.0974173387 -0.0218143241 0.0785316931 -0.020692500000000003 0.006613799999999996 0.00042817955625000016 4.374235043999995e-05 -0.295945 0.08727700000000005 0.007617274729000008 0.08758344302499997 0.13538599999999998 0.1016808 0.018329368995999996 0.010338985088639998 -0.02877 0.002924699999999999 0.0008277129000000001 8.553870089999992e-06 -0.000287268 -3.559899999999998e-05 8.252290382399999e-08 1.2672888009999986e-09 0.00273273 0.00019213999999999996 3.6917779599999976e-08 7.4678132529e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33926.2890625 -208.66015625 1150993089.5523071 43539.060806274414 21111.310546875 -50.83984375 2584.689712524414 445687433.0065956 22196.189453125 -29.67578125 492670826.2390175 880.6519927978516 0.8283969999999999 22.56024 0.18321709000000008 0.1389918442 -0.1681558906 0.1440811025 0.1299896283 -0.021047396099999997 0.0226822063 -0.1359150321 0.027061217400000004 0.168997738 -0.2169836238 -0.057169978600000004 -0.06046157150000001 -0.060869586600000004 -0.0542428777 -0.020988868100000002 0.0455752018 -0.017855041000000002 -0.0580998491 0.1359571412 -0.0083260911 0.0087427844 -0.043800981600000004 0.042452771900000005 0.0692905576 0.0329040505 0.081576305 -0.0183548987 -0.08084111179999999 -0.0745270454 0.007138939499999998 -0.0127500009 -0.0360927995 -0.0409884043 0.0886245069 0.1317687683 -0.0999626735 0.13567973560000002 0.0224833775 0.14201021460000002 0.1230882666 0.030213156 -0.0348659477 -0.1835364425 -0.10877979869999999 -0.166987411 0.1399072202 0.0295516668 -0.0647089971 -0.027343329 0.074147117 0.0141628406 0.101519249 0.06957721509999999 -0.1301949777 -0.005887996800000001 0.051001178099999996 -0.06800626259999999 -0.0423917007 0.0030349889 0.0353003971 -0.0918979042 0.0686486414 -0.0623271507 0.0350793485 -0.052894398200000005 0.05260477400000002 0.0601941213 -0.0311026641 -0.037319105400000004 -0.0603001127 -0.2363938023 0.053266140999999996 0.0418659738 -0.0649448048 -0.0962455236 -0.015643446499999998 0.08314696120000001 0.00665294 0.02734544 4.426161064360001e-05 0.0007477730887936003 -0.358779 -0.06283400000000006 0.003948111556000007 0.12872237084100002 0.119328 -0.016057999999999975 0.014239171584 0.0002578593639999992 -0.0287615 8.499999999998092e-06 0.0008272238822500001 7.224999999996757e-11 0.000262815 0.000550083 6.907172422500001e-08 3.0259130688899997e-07 0.00371374 0.00098101 9.623806201000002e-07 1.37918647876e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33954.7734375 28.484375 1152926639.1919556 811.359619140625 21120.388671875 9.078125 82.412353515625 446070817.6510658 22190.314453125 -5.875 492410055.52856827 34.515625 0.7261569999999999 19.775877 0.14222589000000002 0.1387973915 -0.1743309721 0.14449015240000002 0.1501880858 -0.0034977921 0.0185678194 -0.0901376568 -0.0339503809 0.0205394413 -0.1059636015 -0.033368093 0.027269849900000004 -0.1602755923 0.014893875400000001 0.0301436968 -0.0122467844 -0.0024864185 -0.12477511289999994 0.08578072810000001 0.0074794835 -0.0652833093 -0.0255263979 -0.0501272668 0.0656299455 0.027903815800000002 -0.0208387692 0.007250755 -0.024058746000000002 0.0434962625 -0.1312248128 -0.0038587241999999996 0.0701588329 0.0602592079 -0.024983802000000003 0.1327809992 -0.1165355127 0.1412636153 0.0299112302 0.1435299263 0.1462687239 0.0101011978 -0.0182114461 -0.1015307473 0.011081829199999999 -0.0128460082 0.056803012800000004 0.0431392446 -0.1859533024 -0.0585939313 0.0521307016 -0.0373197175 0.0072892902 0.0661614035 -0.0808970557 0.109146928 -0.0168150268 -0.0137195974 -0.024294876 -0.034981691 -0.0047064786 0.0017807252 0.0006739586 0.0259991565 0.021880744900000002 -0.11873422189999999 -0.0136909904 -0.1668791453 0.0545279375 0.015083715900000001 -0.020823298 0.0816498211 0.0610668952 0.0404343596 -0.0673012514 -0.09486001949999999 -0.0094108313 0.0872496007 0.00692423 0.00027128999999999955 4.79449610929e-05 7.359826409999976e-08 -0.287525 0.07125400000000004 0.0050771325160000064 0.08267062562499998 0.138402 0.019073999999999997 0.019155113603999997 0.0003638174759999998 -0.0297465 -0.0009849999999999963 0.0008848542622500001 9.702249999999927e-07 0.000223743 -3.907200000000002e-05 5.0060930049e-08 1.5266211840000016e-09 0.00370528 -8.460000000000066e-06 7.15716000000011e-11 1.37290998784e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33925.34765625 -29.42578125 1150929213.5974276 865.8766021728516 21113.1015625 -7.287109375 53.10196304321289 445763057.58844 22196.623046875 6.30859375 492690074.6850624 39.79835510253906 0.758143 20.646975 0.08272257000000001 0.1522962049 -0.1582777796 0.1432943467 0.13882614529999998 0.004231041 0.0316450174 -0.11643254460000001 -0.0665141818 -0.0598735781 -0.0492442783 -0.056659420700000004 0.0742129055 -0.1072380607 -0.0660591036 0.0342501694 -0.0191158352 -0.0610340242 -0.0732120864 0.0112691578 -0.0135893147 0.0399771223 0.0678459071 -0.0531951818 0.056046720999999994 -0.0326755815 -0.0713271986 -0.027937925099999997 -0.0711714135 0.0229440493 0.026126382799999997 -0.0722344318 0.0102274492 0.0563492619 0.1068320852 0.1475985899 -0.1076372217 0.136314897 -0.017006365 0.1387315966 0.1320253656 -0.0007706074 -0.0353647174 -0.136241929 0.0635691447 0.059563462699999986 -0.0340536711 0.0622309889 -0.09970020380000001 -0.0607829707 0.1254286449 -0.011357757900000001 -0.028478811899999998 0.023210712 0.0050420112 0.0138691499 0.0224064103 0.0829492424 -0.05658508230000001 -0.0085251628 0.0700191332 -0.043360481299999996 0.0894275132 0.040236367200000005 -0.0886388808 0.0192314107 0.0433200292 0.0393199297 -0.0098554609 0.019564709399999998 0.08218224519999999 0.124384631 -0.022451945600000002 0.0389927688 -0.0695912797 -0.0932639023 -0.0031410759000000004 0.0908143174 0.0189553 0.01203107 0.00035930339809000004 0.00014474664534490004 -0.28820100000000004 -0.0006760000000000653 4.569760000000885e-07 0.08305981640100002 0.096402 -0.042 0.009293345603999999 0.0017639999999999995 -0.0291927 0.0005537999999999967 0.0008522137332900001 3.0669443999999626e-07 0.000220663 -3.0800000000000044e-06 4.8692159568999985e-08 9.486400000000025e-12 0.00370185 -3.430000000000013e-06 1.1764900000000087e-11 1.37036934225e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34014.6640625 89.31640625 1156997371.284729 7977.420425415039 21135.630859375 22.529296875 507.5692176818848 446714891.82376486 22241.51171875 44.888671875 494684843.53529364 2014.992862701416 0.785566 21.393801 0.2799796300000002 0.1377117818 -0.1888502063 0.1579168386 0.1613495596 0.005694541899999999 0.0542251047 -0.04963797 0.0118939451 -0.0049960062 -0.11412643060000001 -0.055876790700000005 -0.0629334417 -0.0351621602 0.0596829913 0.0146257186 -0.0386478654 -0.015010418999999999 -0.0595247268 0.11039866890000001 0.010454358 -0.0056170909 0.0164586413 -0.019728329699999998 0.0308134008 0.1078739055 -0.0030228016999999997 -0.012475278700000002 -0.1449623372 0.0347931259 0.033886919700000004 0.0495416479 0.0255067394 0.022107468999999998 0.024882333599999997 0.13093054810000002 -0.135913856 0.1308426827 0.0348939659 0.1542087986 0.1556326016 -0.0081395188 -0.056937071799999996 -0.0668811531 -0.0294513582 -0.0103268364 0.1172746242 0.042237504 -0.0888195068 -0.0079766729 -0.0084832861 -0.030805896800000006 -0.0197790537 -0.008719125500000001 -0.12128168310000001 -0.010878641999999999 -0.0420220455 0.0511711696 -0.1041853458 0.0061509614 -0.0185407338 0.050363507099999996 0.055982360300000006 0.024567904100000003 0.0199184492 -0.0022857702 0.0744451098 -0.0062083126 0.0981911676 0.128738376 -0.0071942565 0.112270304 0.05800901360000001 0.0375415571 -0.0718126298 -0.091460716 0.0031410759000000004 0.0938191336 -0.00320523 -0.02216053 1.02734993529e-05 0.0004910890898809 -0.349127 -0.06092599999999997 0.0037119774759999976 0.121889662129 0.12094700000000005 0.024545000000000053 0.014628176809000012 0.0006024570250000026 -0.032227099999999995 -0.003034399999999993 0.0010385859744099996 9.207583359999956e-06 0.000200821 -1.9842000000000008e-05 4.0329074041e-08 3.937049640000002e-10 0.00330913 -0.0003927200000000001 1.5422899840000005e-07 1.09503413569e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34820.3671875 805.703125 1212457971.0723267 649157.5256347656 21181.02734375 45.396484375 2060.840793609619 448635919.3366852 22288.7109375 47.19921875 496786635.2554321 2227.766250610352 2.919652 79.51267199999998 1.46855038 -0.0645951164 -0.239635348 -0.0430107837 0.0943908571 0.0772972713 -0.17131621730000002 0.39435340119999995 0.0071518341000000015 -0.1840475825 -0.2893286157 0.0997907789 -0.21510589440000005 -0.0726615104 -0.16129909580000001 0.0395596309 0.163308306 -0.0011309503 -0.062033872699999985 -0.0972807049 -0.0907217921 -0.13106888349999998 0.1990901116 -0.0783988388 -0.17154497510000002 0.1048939599 0.027302474900000002 0.0525146578 0.033146247999999996 -0.1158359291 -0.09830941369999999 0.0689236675 0.1049540177 -0.0519219462 -0.0753872909 -0.1167152976 -0.30917375469999997 -0.09844587630000001 -0.022433626800000002 -0.0219737469 0.060413021399999996 -0.0485854961 0.194545263 0.32546476010000003 -0.0471900082 0.1376646618 0.35146527520000004 -0.0317298605 -0.0220694191 -0.0425087572 0.2461083979 -0.0554598417 0.1017143316 0.1562020484 0.09105823869999999 -0.1464109069 -0.050997908200000004 0.166510446 0.1039781475 -0.0282541669 -0.11614419179999999 0.11334415 0.0130927688 0.0038089359 0.1796749663 -0.0410487777 0.0288873311 -0.0788250061 -0.0348140199 0.0203222645 -0.044333146500000004 0.0056352578000000006 -0.0145505358 0.036081082599999995 -0.0739631095 -0.089454464 0.0094108313 0.0962455236 0.0413417 0.04454693 0.0017091361588899995 0.0019844289724249 -0.08743059999999997 0.26169640000000005 0.06848500577296003 0.007644109816359996 1.10011 0.979163 1.2102420121000004 0.9587601805690004 -0.0326895 -0.00046240000000000164 0.0010686034102499998 2.138137600000016e-07 -0.00237881 -0.002579631 5.658737016099998e-06 6.654496096160999e-06 0.00268828 -0.00062085 3.854547225000001e-07 7.2268493584e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34018.6796875 -801.6875 1157270567.680725 642702.84765625 21094.982421875 -86.044921875 7403.7285804748535 444998283.3792152 22397.240234375 108.529296875 501636370.11630636 11778.608280181885 2.987732 81.36673 1.3440309 -0.0643773178 0.19159428480000001 -0.0332515875 -0.1497075259 0.067904258 -0.15388265140000001 0.12545795199999998 0.0254597979 0.13412122880000002 -0.0981683218 0.0856978724 -0.1625244811 0.0847485262 -0.09518182369999999 -0.0124145222 -0.1674692403 0.0805008441 -0.0707311154 -0.0090613538 -0.0159687906 0.2087680297 0.0055187452 -0.019773141799999998 0.1311583224 -0.0971619978 0.06577764009999999 0.0079582343 -0.048232562400000005 0.1144795662 -0.0447959425 0.031157850299999998 0.0640281892 -0.0316484023 -0.0241374098 -0.05386559230000002 0.0860115557 -0.23191437980000001 -0.1568640355 -0.0328569492 -0.1269902692 -0.066719267 0.1556794704 0.1109562425 -0.0635500676 -0.15373250289999998 0.2016633167 -0.1793400591 0.032021425 -0.060251577199999996 0.050367265700000004 -0.10771444699999999 -0.0077645656 -0.11676797859999999 0.0568834813 0.0231044083 0.1034275208 -0.028648137400000002 -0.157213828 0.0019465471 -0.0208477131 -0.0753928453 -0.0311193277 -0.048577516200000004 -0.0025775107 -0.0301977606 -0.0726278966 -0.0723482108 0.022142987599999997 -0.1750999318 -0.0707357103 0.0348519486 -0.0690988097 0.034611705699999995 -0.0760405966 -0.0872496007 0.015643446499999998 0.09807852800000001 0.0549895 0.013647800000000002 0.0030238451102499995 0.00018626244484000004 0.24726 0.33469059999999995 0.11201779772835996 0.06113750759999999 1.80766 0.7075499999999997 3.2676346755999988 0.5006270024999996 -0.0363717 -0.003682200000000004 0.0013229005608900001 1.3558596840000024e-05 -0.0034491 -0.0010702900000000002 1.189629081e-05 1.1455206841000004e-06 0.00369864 0.00101036 1.0208273296000002e-06 1.36799378496e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +32940.6953125 -1077.984375 1085089407.6709595 1162050.3127441406 21041.455078125 -53.52734375 2865.176528930664 442742831.8047524 22125.578125 -271.662109375 489541207.3654785 73800.30167007446 1.176023 32.027336 0.5809168 -0.0500200567 0.20989566510000002 -0.0412359468 -0.1927273775 0.0289895337 -0.10006858019999999 -0.0748081999 -0.0494291455 0.018445096499999997 0.0809362663 0.1110094908 -0.15010279769999998 0.09960852619999999 -0.1115570158 0.1189077517 -0.0802702869 0.0618670408 0.053591743 0.0994831131 -0.1156126404 0.016785821399999998 -0.0324131544 0.1396346164 0.0084243645 -0.0183924478 0.10360666029999999 -0.11347862619999999 -0.10914137869999999 0.034180308799999996 0.0432357864 0.0965651684 0.0471659951 -0.0903777353 -0.09697496060000001 -0.028871158900000006 0.2644591089 -0.0217756552 -0.047884924100000004 -0.0397636644 -0.1589474623 -0.0520325066 0.0954849018 -0.0343876938 0.07617732740000001 -0.0218644502 0.0830865444 -0.1416502247 0.1301599643 -0.010733234199999999 0.0768223945 0.0959677685 -0.0292811027 -0.1117929363 -0.0747665631 -0.0632473278 0.0438353759 -0.08428091880000001 0.001840562 0.0533251555 0.08397276640000001 -0.0279719856 -0.0233940067 -0.0680583629 0.0068107835 -0.0352402116 -0.08934256269999999 0.1104999567 -0.0453259357 0.048225213899999994 -0.1008042436 0.0556637003 0.0807755584 0.0331337888 -0.0780430407 -0.0848510215 0.0218143241 0.09930684570000001 0.0539487 -0.0010408000000000014 0.00291046223169 1.083264640000003e-06 0.634843 0.3875830000000001 0.15022058188900006 0.403025634649 1.85161 0.04394999999999994 3.4284595920999985 0.0019316024999999945 -0.035356 0.001015700000000001 0.001250046736 1.0316464900000026e-06 -0.00463182 -0.00118272 2.14537565124e-05 1.3988265984e-06 0.00446708 0.00076844 5.905000336e-07 1.99548037264e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33273.4375 332.7421875 1107121643.0664062 110717.36334228516 21025.44921875 -16.005859375 256.1875343322754 442069514.850235 22126.021484375 0.443359375 489560826.72702414 0.19656753540039065 0.8759179999999999 23.854412 0.4513753 -0.0565145051 0.171611737 -0.0712632013 -0.1331305098 -0.0270355873 -0.1277741417 -0.047631607699999995 0.0099627511 -0.0283165098 0.0578822479 -0.0199214076 -0.0195151328 0.0873689002 -0.06802469259999999 -0.0031900736 -0.08884720130000001 -0.030851177 0.0092588171 0.0702790149 -0.0338949194 -0.012658725400000001 0.0358156125 0.1167654695 -0.056693340599999996 0.0018288165 0.0137037826 -0.1069711479 0.0296205896 -0.1616507047 -0.023923867999999997 0.024945486200000002 0.1029165422 -0.0068561744 -0.0576976651 -0.0411438988 0.18315483920000009 -0.0193966419 -0.10412108119999999 -0.0741367743 -0.1161791341 0.0143344354 0.1379340356 -0.0290841084 0.0171549394 0.0054784748999999995 -0.042523183799999996 -0.0056391517 0.0803921796 -0.0202524465 -0.005484639699999999 -0.0398702759 -0.015373494599999999 -0.07664355910000001 -0.08843263550000001 -0.0625767295 0.0356726796 0.1008474829 0.056918289000000004 0.1138924025 0.1091348915 0.0394835367 -0.053772161299999996 -0.1102402711 0.0866766801 -0.0229533525 -0.0246864053 -0.0188199624 -0.0125245347 0.08703913939999999 -0.0321271992 0.0698885051 0.10120625220000001 0.0316476967 -0.0799684658 -0.0822640518 0.0278991106 0.09992290359999999 0.06506050000000001 0.011111800000000012 0.00423286866025 0.00012347209924000026 0.45972 -0.17512300000000008 0.03066806512900003 0.2113424784 1.76142 -0.09018999999999976 3.1026004164 0.00813423609999996 -0.0332414 0.002114600000000001 0.00110499067396 4.471533160000005e-06 -0.00489628 -0.0002644600000000002 2.3973557838400007e-05 6.993909160000013e-08 0.00558703 0.0011199499999999998 1.2542880024999994e-06 3.1214904220899995e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33487.9296875 214.4921875 1121441434.7549438 46006.898498535156 20993.048828125 -32.400390625 1049.7853126525881 440708099.1000405 22126.673828125 0.65234375 489589694.69623184 0.4255523681640625 0.648259 17.65444 0.2006225999999996 -0.054308376900000004 0.1642051913 -0.0782064489 -0.15757200130000001 -0.0072588366000000005 -0.06882792389999999 -0.0837495378 -0.024435441800000002 -0.0025476521 -0.07026456519999999 0.016166735800000002 0.0443030201 0.07193242030000001 -0.0758935481 0.0310842353 -0.052423203099999996 0.0481816138 0.053525404500000005 0.00043348830000000004 -0.0608409755 -0.012479001200000001 0.026318126299999998 0.15537097800000002 0.0367253501 0.022716161800000002 -0.021495642599999996 -0.0728267293 -0.029152357200000006 -0.0431674008 -0.04972451940000002 -0.0738170462 0.0052647528 -0.0179109483 0.0154035034 -0.043281915899999995 0.13765142 -0.0714654299 -0.09116074490000001 -0.0764221582 -0.14960436189999998 -0.0043537411 0.0818619487 -0.11975406029999999 0.0189559441 -0.0082683739 -0.003730468 -0.0566479194 0.0318203351 0.0259749463 0.05883196070000001 -0.00020169279999999998 -0.0105333792 -0.1187218381 -0.029385643 -0.071525966 -0.008259956899999999 -0.0135891125 0.0648546818 0.1174181532 0.1153869278 -0.0200858718 0.028883368599999997 -0.0308448323 -0.0292254598 -0.015320525500000001 -0.0091223988 -0.0272365371 -0.1009714849 -0.0640950034 0.028224816200000002 0.0262857295 0.0329837327 0.030153796 -0.0818149717 -0.0794944353 0.033873792 0.09992290359999999 0.0584559 -0.006604600000000009 0.00341709224481 4.3620741160000125e-05 0.569328 0.10960799999999997 0.012013913663999995 0.32413437158399994 1.79835 0.036929999999999914 3.2340627225 0.0013638248999999932 -0.032837599999999995 0.00040380000000000277 0.0010783079737599996 1.6305444000000223e-07 -0.00531164 -0.00041536 2.8213519489600008e-05 1.7252392960000002e-07 0.00545659 -0.0001304399999999999 1.7014593599999974e-08 2.97743744281e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33476.3984375 -11.53125 1120669252.3462524 132.9697265625 21001.19140625 8.142578125 66.30157852172853 441050040.48194885 22143.140625 16.466796875 490318676.7385254 271.15539932250977 0.715973 19.498520000000006 0.29406289999999985 -0.0663390852 0.1399117473 -0.0960861925 -0.10885879470000001 -0.051107168700000004 -0.0811813173 -0.08843172939999999 0.0693632718 0.0420842171 -0.0627760951 0.0047382738 0.011819208700000002 0.024096939700000004 -0.0886248781 -0.0024289316 -0.05149392480000002 -0.0169341939 -0.0085211581 -0.0691403403 -0.034069333 -0.0056519376 -0.1035731133 -0.09000765720000001 -0.0360067472 0.077366486 -0.0060791127 -0.0840198449 0.0024889526 0.0582867351 0.0665316093 -0.10299090720000001 0.033003681 0.0741129341 0.09485195390000001 -0.0636795805 0.1180418958 -0.024755275099999998 -0.1091483505 -0.0973554025 -0.10331223369999999 0.043902722699999994 0.0984170509 -0.10226829429999999 -0.073789879 -0.044708814000000006 -0.0169370492 -0.0324333433 0.05792299190000001 -0.0405022772 0.0597929441 -0.018212649299999998 -0.0747778893 0.0006044053 -0.0077203505000000006 -0.0005008431 -0.0129653231 -0.0595487845 0.023200637000000003 -0.0932404817 -0.0073352993000000005 0.0153668744 0.0838675221 -0.1115089692 -0.1194940664 -0.012811176100000002 -0.0217141252 0.027474516 0.0151562073 0.0018868238 0.1906831823 -0.095344556 -0.062020469400000014 0.028652455299999997 -0.0835807361 -0.0765483213 0.0397147891 0.09930684570000001 0.051103 -0.007352900000000002 0.002611516609 5.4065138410000046e-05 0.518424 -0.05090399999999995 0.0025912172159999946 0.268763443776 1.7177 -0.08064999999999989 2.95049329 0.006504422499999982 -0.0306207 0.0022168999999999943 0.00093762726849 4.9146456099999725e-06 -0.00575433 -0.0004426899999999999 3.31123137489e-05 1.9597443609999994e-07 0.00501306 -0.0004435300000000002 1.967188609000001e-07 2.51307705636e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33651.76171875 175.36328125 1132441066.775528 30752.2804107666 21005.376953125 4.185546875 17.518802642822266 441225860.9428749 22213.853515625 70.712890625 493455288.01364523 5000.312900543213 0.8428040000000001 22.952597 0.2422737 -0.083664135 0.09061570810000001 -0.10887254939999999 -0.0655100751 -0.035337727400000005 -0.0915819384 -0.07645040730000001 0.0755651697 0.0533265556 -0.0634654832 -0.0105251149 0.0110643776 -0.0427745708 -0.0343667561 -0.003630010300000001 -0.014264723 0.0053517881 -0.0046736128 -0.062328435599999996 -0.0765460067 0.0341203903 -0.0410540644 0.0283656019 -0.0016166529 0.046774774000000005 -0.0417768246 0.0230385594 0.11193685880000001 0.0643661278 -0.0452170416 0.0686877219 0.07258903530000001 0.030260680800000002 0.0407555849 -0.0834826885 0.0683273461 -0.0056408012 -0.1295411 -0.1079001633 -0.0571734449 0.0397085196 0.0925562561 -0.0878235388 -0.09374562439999999 -0.042573401799999994 -0.006192807099999999 0.0166828329 0.0015019487 -0.0515837605 0.0280769835 0.0064828954 -0.0405309495 0.029063473500000006 0.0228127534 -0.0025488635 0.0800586172 -0.0322371119 0.066571596 0.058436675099999995 -0.0848759343 0.014666799 -0.0016921982 0.0324141268 -0.0553611551 -0.0608936837 -0.11796726699999999 -0.0260570129 -0.0610298989 0.020029213400000002 -0.006930139300000001 -0.0569540984 -0.0550872674 0.027144045 -0.0852640164 -0.0734322509 0.04539905 0.09807852800000001 0.0679602 0.016857200000000003 0.00461858878404 0.00028416519184000017 0.455944 -0.062480000000000036 0.0039037504000000046 0.207884931136 1.62552 -0.09217999999999993 2.6423152704 0.008497152399999987 -0.0317566 -0.0011358999999999952 0.0010084816435599997 1.290268809999989e-06 -0.00559174 0.00016258999999999978 3.1267556227600014e-05 2.643550809999993e-08 0.0051297 0.00011664000000000032 1.3604889600000074e-08 2.6313822089999997e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33584.60546875 -67.15625 1127925724.4915926 4509.9619140625 21041.728515625 36.3515625 1321.4360961914062 442754338.9252663 22201.876953125 -11.9765625 492923340.24170303 143.43804931640625 0.783574 21.339548 0.18847400000000009 -0.08480121619999999 0.076657961 -0.10379889769999999 -0.0726665591 0.0045540738 -0.0886016326 0.0015041810999999999 0.0398349131 0.039378660600000004 0.019015393000000002 0.0432070313 0.022576122200000003 -0.0385912108 -0.0296928435 0.0108078122 0.017443923899999998 0.0154048306 -0.048587451 -0.0389437754 0.023100980400000002 0.0583415055 -0.0205694672 -0.0766440447 -0.0377404403 0.0081815062 0.0008394925 -0.0145284902 -0.011331774099999999 0.1279987867 -0.0784851442 -0.0617605767 0.0112597062 -0.1277922835 -0.0118462532 -0.09419282109999999 0.0725965917 -0.0136169445 -0.0850542802 -0.1046847524 -0.061781696 -0.0033592064 0.0900597492 0.0148569628 -0.0470263675 -0.011627165 -0.053526022199999995 -0.0262967081 0.0043971421 -0.0191985702 0.021322484500000002 -0.0200024486 -0.0098648682 -0.0048319109999999995 0.0790625687 0.0815214579 0.0166656355 -0.0228226295 -0.08735820400000001 -0.0376596523 -0.04243986809999999 0.0216095135 0.0092459295 0.0194682235 -0.054705174100000004 -0.083291345 -0.0063360756 0.0365759667 -0.0842466723 0.1626826065 -0.0361385286 0.0124822593 0.032955126 0.0256289373 -0.0868631514 -0.0701531426 0.0509041416 0.0962455236 0.0798522 0.011892 0.00637637384484 0.000141419664 0.45819 0.0022460000000000253 5.044516000000115e-06 0.2099380761 1.62491 -0.0006099999999999994 2.6403325081 3.7209999999999926e-07 -0.0300032 0.001753399999999999 0.0009001920102399998 3.074411559999996e-06 -0.00514764 0.00044410000000000017 2.64981975696e-05 1.9722481000000018e-07 0.00385268 -0.0012770200000000002 1.6307800804000006e-06 1.4843143182399996e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33613.0234375 28.41796875 1129835344.6099243 807.5809478759766 21036.267578125 -5.4609375 29.82183837890625 442524553.61847305 22266.515625 64.638671875 495797718.07836914 4178.157901763916 0.64788 17.644114000000005 0.14254880000000011 -0.0850711144 0.06863831969999999 -0.1055668412 -0.048154174699999996 -0.0112197371 -0.0688584859 -0.020583740700000002 -0.0022913945999999998 -0.013857158400000001 0.0527962388 0.0216219371 0.0835989419 -0.0244922724 0.0127454976 0.1010434443 0.0561676464 0.034487291499999996 0.06273166849999999 -0.042684816699999996 0.030314108399999998 -0.0474950087 -0.1141595705 -0.0481410251 -0.011789700600000001 0.0205541537 -0.0916432101 0.0250916664 0.0074526387 0.08731305449999999 -0.0370587666 -0.0365192494 -0.0551431821 0.0020974175 0.045822901799999996 -0.0868259184 0.0659785749 -0.0126346436 -0.0518913512 -0.1034774475 -0.0377403469 0.0115606205 0.0721052092 -0.0006502214 0.011349084099999998 0.0133123564 -0.10259162599999999 0.006291446500000001 -0.0285100941 0.051412269100000005 0.021227611400000002 0.0971975233 -0.0009558906 -0.0089678706 0.0515214576 0.0751507875 -0.0587039262 -0.1201813251 0.0680226925 -0.0811835659 -0.0235870024 0.0580100621 0.0950714634 0.018580042800000002 -0.0713691907 -0.0548564497 0.0029451853999999996 -0.0173954346 -0.024146909900000003 0.0064449366 0.0803500594 -0.0366025243 -0.0071026911 0.0241075061 -0.088376563 -0.0667182767 0.0562083378 0.0938191336 0.06723639999999999 -0.012615800000000009 0.004520733484959997 0.00015915840964000026 0.4819640000000001 0.023774000000000076 0.0005652030760000035 0.2322892972960001 1.62688 0.001969999999999805 2.6467385343999994 3.880899999999233e-06 -0.0287422 0.0012609999999999948 0.0008261140608400001 1.5901209999999868e-06 -0.00595549 -0.0008078499999999997 3.54678611401e-05 6.526216224999995e-07 0.00386761 1.4930000000000238e-05 2.2290490000000712e-10 1.49584071121e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33836.56640625 223.54296875 1144913226.164566 49971.45887756348 21073.23828125 36.970703125 1366.8328895568848 444081371.65834045 22319.380859375 52.865234375 498154761.9458352 2794.7330055236816 0.646977 17.619505 0.11883770000000014 -0.08437008130000001 0.042590335199999996 -0.08755113630000001 -0.018677698200000002 0.027181420499999998 -0.0480690342 0.0313178842 0.0798491904 0.0163154527 -0.0020017707 -0.02536417 -0.0006599287 0.0618450276 0.011514768100000001 0.013116481499999999 0.008274453499999999 0.0459259621 0.06916212969999999 -0.0185680445 0.0220304213 -0.0700001804 0.0520427487 -0.0443163711 0.0192580604 0.0536594292 -0.0800902132 0.009645615699999999 0.020980937999999998 0.0159723157 0.0746475296 0.1269367158 -0.0409730726 0.0103617428 0.0208764863 -0.0842484877 0.030540803199999998 -0.052596429699999996 -0.0375514385 -0.0924308806 -0.012719130700000001 -0.0227110928 0.0511005642 0.0431419519 -0.0702093558 -0.0194436919 0.0061858876 0.0114926637 0.0418863952 0.0433593903 -0.029852355 0.028985016800000006 0.004667501 -0.026307901600000003 0.03886196 -0.045257890499999995 -0.0501177917 0.0646282057 0.0628741852 0.0409498111 -0.07238871849999999 0.018505939 0.0702256714 0.10133002890000001 0.039374807000000005 0.055710557 -0.025506336 0.0053957587 0.09992474300000001 0.0523525647 -0.0038471352000000003 0.014102665700000001 0.06306310400000001 0.022580126699999998 -0.08980275759999999 -0.0631352795 0.0612907054 0.0908143174 0.0591132 -0.00812319999999999 0.00349437041424 6.598637823999984e-05 0.4482140000000001 -0.03375 0.0011390625 0.20089578979600006 1.60225 -0.02462999999999993 2.5672050625 0.0006066368999999965 -0.0290419 -0.0002997 0.0008434319556100003 8.982008999999998e-08 -0.00551215 0.00044333999999999953 3.0383797622500007e-05 1.9655035559999961e-07 0.00356396 -0.00030364999999999987 9.220332249999996e-08 1.27018108816e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33941.66796875 105.1015625 1152036824.5008698 11046.338439941406 21069.806640625 -3.431640625 11.77615737915039 443936751.87332535 22314.630859375 -4.75 497942750.3901711 22.5625 0.697455 18.994221 0.14767419999999998 -0.0861686898 0.049243382300000006 -0.0835122551 -0.026979604700000003 0.0565097708 -0.0358311769 0.0435929107 0.044714171100000005 0.0198955052 0.017610343100000002 0.0005805607 0.022931657 0.1173345686 0.0734799552 -0.0044482311 0.001061767 -0.052694287199999995 0.09842468160000001 0.0388958029 0.0213332391 -0.1158977531 0.0406113481 -0.0302374018 0.0196273328 0.0130518926 -0.0590982808 0.0010716621000000002 -0.09151209769999999 0.019757526 -0.0665594337 0.0324977146 -0.0063708167 -0.0727395604 0.0348236173 -0.08583158210000001 0.0147753251 -0.098886032 -0.0036289128999999996 -0.0850179791 -0.0131697904 -0.047360037199999996 0.0314892941 0.0441910354 -0.039042782799999995 -0.0227761998 -0.0210961414 -0.013137713899999999 0.0394479489 0.09564143160000001 -0.0780987672 0.04606974690000002 -0.0068896357 -0.0415862685 -0.0581821823 -0.0450620084 -0.0599552585 0.0720331285 0.0540602451 -0.0329394649 0.0217922328 -0.0070705278 0.0858778145 0.07095932070000001 0.0213455683 0.006318535300000001 -0.0381768183 -0.0304173609 -0.042364089800000004 0.0201373244 0.0237586187 0.004163642899999999 0.11350805259999999 0.021047176 -0.0911403277 -0.059412106299999996 0.06613118650000001 0.0872496007 0.059074 -3.919999999999618e-05 0.003489737476 1.5366399999997007e-09 0.534874 0.0866599999999999 0.0075099555999999824 0.28609019587599993 1.62096 0.018710000000000004 2.6275113216 0.00035006410000000017 -0.0290711 -2.9200000000000063e-05 0.0008451288552100003 8.526400000000036e-10 -0.00508427 0.0004278800000000003 2.58498014329e-05 1.8308129440000025e-07 0.00395218 0.00038821999999999945 1.5071476839999955e-07 1.5619726752399994e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33838.37890625 -103.2890625 1145035887.002945 10668.630432128906 21048.2109375 -21.595703125 466.3743934631348 443027183.6694946 22313.91796875 -0.712890625 497910935.1161041 0.5082130432128906 0.807008 21.97773 0.2588051999999997 -0.0855491659 0.0138976945 -0.1117665909 -0.0004795833 0.027437079700000002 -0.044889930300000006 0.0128086466 0.027263946400000003 -0.0571831354 0.0664923882 -0.0022355985000000003 0.1126162211 0.0189776165 0.0133273579 0.0244023735 0.0151379069 -0.11366659550000001 -0.0756990429 -0.0074411616 0.1213274797 0.0443461046 0.0499685629 -0.0307348406 -0.0033856739 -0.0223635986 -0.046077092 0.0104476988 0.0116332747 -0.0324054337 -0.0156381502 0.0015045423 -0.0455681365 0.0369790533 0.030178515899999998 -0.0883002189 0.011835508799999998 -0.0165709235 -0.0107228097 -0.1142324859 0.0088091474 -0.0197925804 0.051447159900000004 0.018561438899999998 0.0017713294 0.0646851584 -0.1154625865 0.0051306615000000005 -0.0178134801 0.0490684291 0.011870743700000002 -0.019013564099999998 -0.0700855784 0.0453588488 -0.034825991 0.0075953211 -0.0261728643 0.055814240999999994 -0.1146106841 -0.0023728682000000003 0.020312379 0.0174601051 0.016681583 0.06055521570000001 0.0210441423 0.0147449123 -0.0213258258 -0.0209710966 0.0676106395 -0.13732500460000002 -0.0178316323 -0.0651767246 0.0238817632 0.0195090322 -0.0923879533 -0.0555570233 0.0707106781 0.08314696120000001 0.0425648 -0.0165092 0.00181176219904 0.00027255368464000005 0.415888 -0.11898599999999993 0.014157668195999982 0.17296282854400002 1.56261 -0.0583499999999999 2.4417500121 0.003404722499999989 -0.0278914 0.0011797000000000025 0.00077793019396 1.3916920900000051e-06 -0.00508427 0.0 2.58498014329e-05 0.0 0.00383268 -0.0001194999999999994 1.4280249999999851e-08 1.46894359824e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33852.33984375 13.9609375 1145980912.8967438 194.90777587890625 21026.658203125 -21.552734375 464.5203590393066 442120355.1910439 22272.865234375 -41.052734375 496080525.74863046 1685.3269996643066 0.6362359999999999 17.326998 0.10157560000000013 -0.0909806711 0.0085439171 -0.103297461 0.0015023934 -0.0025460688 -0.0180766768 0.0025121652 0.0694160605 -0.0153021475 -0.0707341893 -0.0184274163 0.0321468892 0.0156786874 0.0210244649 0.024544250099999998 0.0256373575 0.0513377691 -0.0608016367 -0.0064811788 0.12342305 0.0094658034 0.0126816025 0.038828511499999996 -0.024986176800000003 0.041233044100000005 -0.0554251461 -0.040621052000000005 0.008104952700000001 0.0222850129 -0.0550559547 0.08785534449999999 -0.09531335269999999 -0.04383359269999999 0.018290468600000002 -0.0909268976 0.0016790311 -0.017314664599999998 -0.027574173799999997 -0.103306371 -0.0047990581 0.006832125400000001 0.023778978 -0.0030763171000000003 -0.07298459269999999 0.017692231699999998 0.0163979002 0.0006551001000000001 -0.0492073314 0.0606484681 0.0310343017 -0.0389744498 0.0068624698 -0.0337558743 0.0492745934 0.0381071904 -0.04983578 -0.0597161665 -0.0683483475 0.0672370146 0.0541230523 0.0690749091 0.047404502800000005 0.1163931466 0.0534463341 -0.030871668799999998 0.0043139124 0.09859562179999999 -0.0249147623 0.0147764788 0.0021903335 -0.09633025769999999 0.024886269 0.0179660749 -0.0935444031 -0.051578589800000005 0.07501110700000001 0.0785316931 0.030386700000000006 -0.012178099999999996 0.00092335153689 0.00014830611960999992 0.45847 0.04258199999999995 0.001813226723999996 0.2101947409 1.54786 -0.01475000000000004 2.3958705796 0.0002175625000000012 -0.0279853 -9.390000000000091e-05 0.0007831770160899999 8.817210000000175e-09 -0.00508427 0.0 2.58498014329e-05 0.0 0.00328527 -0.0005474100000000003 2.9965770810000036e-07 1.07929989729e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33688.65625 -163.68359375 1134925559.930664 26792.31886291504 21011.77734375 -14.880859375 221.4399757385254 441494787.1433258 22232.369140625 -40.49609375 494278237.60501486 1639.933609008789 0.836666 22.78544 0.0962272000000002 -0.0946401384 0.017482170800000002 -0.1029635491 -0.009312339000000001 -0.008161823 -0.0316916833 -0.0163767716 0.0362455483 0.0018290392999999999 0.016953346100000002 0.0400771822 0.1137324264 -0.025052732 0.0196711382 0.007735270799999998 0.0715832276 0.0029421724 -0.0148983496 0.0261632333 0.1406002975 -0.0201639564 0.0160678787 0.0384694726 0.0237716303 -0.049719880999999994 -0.0337023485 -0.0746337795 -0.0008123838999999999 0.0199498022 -0.1103210607 0.0680441499 -0.07523125480000001 -0.0136094776 0.041088814700000004 -0.0937774631 0.0240316613 0.0011600063 -0.0167563352 -0.1062352835 -0.0172299144 0.014029171100000001 0.0391393667 -0.0202761583 -0.0455373533 0.0230118843 -0.0988154007 -0.0280595127 -0.0578844129 0.055796448600000007 0.0088927367 0.057593814800000004 0.0589676645 0.045524240599999995 0.008824627600000001 0.06115089610000001 -0.08597270259999999 -0.0128292678 -0.043517311100000004 0.0778023141 0.06261853740000001 0.028482360499999998 0.0202488876 0.10325479369999999 0.0054273596999999995 -0.05910101120000001 -0.048083580300000005 -0.0074315084 -0.0139706574 -0.0369807089 0.0214991739 -0.0643441613 0.0022148872 0.0164186847 -0.0946085359 -0.047485639 0.0790155012 0.0734322509 0.030231 -0.0001557000000000017 0.000913913361 2.424249000000052e-08 0.477968 0.019498000000000012 0.00038017200400000065 0.228453409024 1.58149 0.03363000000000005 2.5011106201000004 0.0011309769000000032 -0.0273449 0.0006403999999999992 0.0007477435560100001 4.1011215999999906e-07 -0.00508428 -9.999999999940612e-09 2.58499031184e-05 9.999999999881223e-17 0.00350373 0.00021846000000000018 4.772477160000008e-08 1.22761239129e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33806.44140625 117.78515625 1142875480.5542145 13873.343032836914 21021.314453125 9.537109375 90.95645523071288 441895661.337162 22263.47265625 31.103515625 495662214.7155914 967.4286842346193 0.6939420000000001 18.89855 0.1321625999999997 -0.083052053 0.0124440256 -0.1052277422 0.014608216299999999 -0.0064943940000000006 -0.0163789132 0.0192368738 0.0098742048 -0.0735594814 0.0636371149 -0.0090959488 0.192880341 -0.0197410947 0.0185295726 0.0136272912 0.011389318899999999 0.012317881599999999 -0.0122558076 -0.04869449940000002 0.0817117542 -0.048582377 -0.0111297313 -0.011984731100000002 0.0157275061 -0.0002246758000000001 -0.1008628126 -0.0107747728 -0.048451696100000004 0.0239645627 0.0209514521 0.0052121751 -0.1045381259 0.1101612808 0.0317084927 -0.0839653603 0.0030833294 -0.019865649699999998 -0.0348999094 -0.10767888119999999 0.0100184121 0.015739131899999998 0.027091128199999998 0.017370075500000002 0.0261621981 0.0801825489 -0.1749158336 0.010021828100000001 -0.0939759207 0.0479735699 0.016635428799999998 -0.0124016944 -0.003776350300000001 -0.0100738779 0.044038485 0.0307843489 -0.0868159018 -0.0110957374 0.0037756987 -0.0517074543 0.0182737879 -0.0020025885 0.0784299651 0.0865302056 -0.0400414044 -0.0035540898999999997 0.0708870536 -0.049517691600000004 0.19423919039999998 -0.11320293880000001 -0.0380120892 -0.049521743300000004 -0.0778151609 0.0148672434 -0.0955793015 -0.043287258200000005 0.0827080574 0.06788007459999999 0.0167834 -0.0134476 0.00028168251555999997 0.00018083794576 0.44502 -0.03294800000000003 0.0010855707040000019 0.1980428004 1.61207 0.03058000000000005 2.5987696849 0.0009351364000000033 -0.026999900000000004 0.00034499999999999814 0.0007289946000100003 1.1902499999999866e-07 -0.00461412 0.0004701599999999999 2.12901033744e-05 2.2105042559999986e-07 0.00379231 0.00028858000000000014 8.327841640000005e-08 1.43816151361e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34623.98046875 817.5390625 1198820023.5003815 668370.1187133789 21134.0546875 112.740234375 12710.360446929932 446648267.5342407 22350.830078125 87.357421875 499559605.1812172 7631.3191566467285 2.289822 62.36010400000001 1.1216228 0.052959531799999994 0.0867671899 0.0581234347 -0.1002392156 0.2306483471 0.1282320334 0.08162187559999999 -0.0299226533 0.1241592575 -0.0351420052 0.1471758523 0.1807519313 0.1492835458 0.0058394532 -0.0415604545 -0.0019697688 -6.0254999999999985e-06 0.0859636505 -0.09373129960000001 -0.10833117169999999 0.0177174614 -0.0712845116 0.1394189887 -0.0072372629 0.0062350002 0.0496627787 -0.0265702354 -0.017082371000000002 -0.09359121599999999 0.105712059 -0.2034905349 0.11772249359999999 0.07155881759999999 -0.0138471001 0.0489837401 -0.0865189461 -0.3215668944 0.0811681545 0.0544842713 -0.0904491202 -0.2266238471 -0.1103392734 0.021226582999999997 -0.0022127466 -0.0970708688 -0.1146065154 -0.2222801088 0.0240542027 0.0782227198 -0.019539543700000002 0.008968183900000001 0.0013863507 -0.017384064299999998 0.0210585172 -0.1556099566 0.0379406544 -0.0096472051 0.0970987944 0.0516535509 0.08634083880000001 -0.123001595 -0.031027530499999997 -0.17734089690000002 -0.082018705 0.0893179146 0.10109154960000001 -0.08549325869999999 0.0031854836 0.1932023198 0.0160103523 -0.0570619671 0.1229602395 0.013312133899999998 -0.0964557418 -0.0389927688 0.08607420269999999 0.06190939490000001 0.08126719999999997 0.06448379999999998 0.006604357795839995 0.004158160462439995 0.6798310000000001 0.2348110000000001 0.05513620572100005 0.4621701885610001 2.17877 0.5667 4.7470387129 0.32114889 -0.030018400000000008 -0.0030185000000000003 0.0009011043385600001 9.111342250000003e-06 -0.00478058 -0.00016646000000000022 2.2853945136400007e-05 2.7708931600000078e-08 0.00571991 0.0019276 3.7156417599999986e-06 3.27173704081e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33399.7265625 -1224.25390625 1115541734.449768 1498797.6269683838 21106.17578125 -27.87890625 777.2334136962891 445470656.1090241 22225.158203125 -125.671875 493957657.1539345 15793.420166015625 1.22904 33.471199 0.3443511000000001 0.022098793999999998 0.117274865 0.0038295334 -0.0962982725 0.1267419646 0.0528475407 -0.0163437045 0.0755157878 0.0241214534 0.1562067683 -0.058263431399999996 0.0003044602 0.086858652 0.0828335723 0.0192000091 0.0775781291 -0.0269354608 -0.0960362117 0.10059871699999999 -0.1457846025 -0.030559148199999997 0.0104364156 0.0897879298 0.0395353831 0.1166066227 0.0673580696 0.08827444039999999 0.09544043140000001 -0.0064568354 -0.0410910083 0.0480741924 -0.0085473006 0.0627412816 0.0792348375 0.0383185473 0.127157101 -0.0308746835 0.0449012857 -0.0070403539 -0.07096017219999999 -0.1480897639 -0.0520021033 0.0306647394 -0.0452035599 -0.0208389084 -0.0886347326 0.0582308342 0.047062001900000004 0.1465042725 -0.0300877698 -0.045244720499999995 -0.0370147304 0.05738439610000001 -0.10689889949999999 0.0405884429 0.0774588287 0.0106766521 0.1227108724 0.09341642550000001 -0.1452916053 -0.0187102861 -0.08665058869999999 0.011015893600000002 0.054861432 -0.0044213483 0.024718025499999997 -0.0231494879 -0.040014948 -0.0378962521 0.090292209 -0.1362035335 0.0746168266 0.0117537397 -0.097236992 -0.034611705699999995 0.08910065240000001 0.0555570233 0.0494966 -0.03177059999999997 0.00244991341156 0.001009371024359998 0.597056 -0.08277500000000004 0.006851700625000007 0.35647586713600005 2.0953 -0.08347000000000017 4.39028209 0.0069672409000000254 -0.0275969 0.0024215000000000035 0.00076158888961 5.863662250000017e-06 -0.00427537 0.0005052100000000007 1.82787886369e-05 2.552371441000008e-07 0.00571991 0.0 0.0 3.27173704081e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33573.32421875 173.59765625 1127168099.0973053 30136.146255493164 21069.287109375 -36.888671875 1360.774112701416 443914859.29727554 22178.32421875 -46.833984375 491878065.1519928 2193.422092437744 0.8350059999999999 22.740234 0.2831469000000002 0.007075074200000002 0.096764899 -0.021568269700000003 -0.09120195140000001 0.08232861080000001 0.042924640599999994 -0.0329717888 0.0694558822 0.0412104677 0.0858464226 -0.09351556539999999 0.040405796699999996 0.1015404107 0.09402041 0.0072727061 0.0437529526 -0.0845170442 -0.0136952815 0.11297838939999999 -0.0818947341 0.0322504424 0.0218295453 0.0301488755 -0.0156218382 0.04805283 -0.0434550696 0.0691689773 0.0689069264 -0.044497828499999996 -0.002353287 -0.0137382928 -0.0052445486 -0.0198778624 -0.0217885618 0.020879540800000002 0.0936753774 -0.0410559 0.049906668700000004 -0.0279895844 -0.0781379272 -0.09708047119999999 -0.029151612099999998 -0.0091766504 -0.05636113900000001 -0.0544183688 -0.09736903390000001 0.0661450866 0.0265618451 0.1230871133 -0.1159088555 -0.0024906805 -0.0513656567 0.024809354199999998 -0.1347721163 0.0470606418 0.1320262893 0.073113195 0.0862879398 0.0631686033 -0.0259764125 0.0115034418 -0.0155320372 -0.010813376100000001 0.0148809745 0.0764018955 0.0448101505 0.0403647307 -0.04380189 0.0561973954 -0.0071833011 0.09348068539999999 0.0334083704 0.0101924456 -0.0979222811 -0.030153796 0.0917754626 0.0488621241 0.0411697 -0.008326900000000005 0.0016949441980899998 6.933726361000008e-05 0.7205159999999999 0.1234599999999999 0.015242371599999974 0.5191433062559999 2.02315 -0.07215000000000016 4.093135922499999 0.005205622500000022 -0.027928 -0.00033109999999999737 0.0007799731839999999 1.0962720999999824e-07 -0.00404575 0.00022961999999999985 1.6368093062499994e-05 5.272534439999992e-08 0.00469643 -0.0010234800000000002 1.0475113104000004e-06 2.20564547449e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33610.50390625 37.1796875 1129665972.8320465 1382.3291625976562 21042.115234375 -27.171875 738.310791015625 442770613.53671646 22184.66796875 6.34375 492159492.8836823 40.2431640625 0.933095 25.411531 0.2544592999999999 -0.0205076579 0.063422683 -0.057026111500000004 -0.061001694599999996 0.030860003599999998 0.0250281682 -0.019926227 0.0700870502 -0.0511730427 0.0850684409 -0.07528435929999999 0.0545213925 -0.0311453995 0.0207284605 0.024443384300000003 0.0671030221 -0.104102399 -0.07193900730000001 -0.0146381245 -0.06017719780000001 0.0619153616 0.0187014835 -0.06553796769999999 0.007676485500000002 -0.010596143700000001 0.025549294900000002 -0.0005738991 0.13700576609999998 0.0007614449000000001 -0.0655590748 -0.055592077000000004 0.05637476440000001 -0.0082932415 -0.0283449887 -0.0173008825 0.062378029400000014 0.0015556173000000001 0.0071629172 -0.0602654392 -0.0527326969 -0.0372019085 -0.019064676200000002 0.005422117299999999 -0.048746735 0.0629489533 -0.1104699333 0.1111955959 -0.0080274187 0.0189747821 0.020783194799999998 -0.0109722835 -0.0562005816 0.0817627417 -0.058352282199999994 0.0437249131 0.0981209845 0.0751028573 -0.0252599487 0.0014619929000000002 -0.018928013799999997 -0.008826609499999999 -0.0839201374 -0.0535108718 0.0011400942 -0.05773659900000001 -0.0277895515 0.0249060225 0.0534650563 -0.10522669130000001 0.05107491980000002 0.0302123995 -0.0887318824 0.0086286366 -0.0985109326 -0.0256289373 0.0940880769 0.0418659738 0.0305349 -0.010634799999999995 0.00093238011801 0.00011309897103999992 0.6583100000000001 -0.06220599999999987 0.0038695864359999843 0.4333720561000001 1.88629 -0.13685999999999954 3.5580899641000014 0.018730659599999876 -0.0276157 0.00031230000000000147 0.0007626268864899998 9.753129000000092e-08 -0.00363012 0.0004156299999999997 1.31777712144e-05 1.7274829689999974e-07 0.00452919 -0.00016723999999999992 2.796921759999997e-08 2.05135620561e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33693.29296875 82.7890625 1135237991.0780182 6854.028869628906 21020.4453125 -21.669921875 469.5855140686035 441859121.1358032 22214.13671875 29.46875 493467870.159317 868.4072265625 0.793738 21.616358 0.2844179999999997 -0.033708076600000005 0.053056195 -0.0670080855 -0.046109730099999996 0.0023414263 0.0232164292 -0.030254674 0.0846833068 0.0062727637 0.0015368170999999998 -0.039998762599999994 0.019607137099999998 -0.0496559903 0.0028482897999999998 -0.10494172939999999 0.0676256044 0.0205314797 0.017848656799999998 0.038006248799999996 0.0266002369 0.1026119483 -0.006491456 -0.0474635276 -0.0553075642 -0.0201405909 0.0705043264 -0.015998845 0.032397944500000005 -0.10656217039999999 0.0138991013 0.0370493162 0.0158923348 0.0382805294 -0.1586020106 -0.0305373065 0.0384657007 -0.0055926801000000005 0.0023392685 -0.0717158213 -0.046472901 -0.0039035423 -0.02263193 -0.025418622000000002 -0.0920789351 0.015034173400000003 -0.0282927126 0.0486820954 0.0114155298 -0.0354038454 -0.042019250300000005 -0.0411502872 0.1176965636 0.0005985981 -0.0012072782 -0.0616099617 0.055534726500000006 0.0027482297 -0.07459812769999999 -0.023191264 0.0204340421 0.0528965687 -0.10707097869999999 -0.063203698 0.09079336980000001 -0.0129946726 0.0238623362 0.0019222941 0.1174794383 -0.0089202795 -0.0745621207 -0.0448530427 -0.034010552400000005 0.0070626986 -0.0990023658 -0.021047176 0.0960293686 0.034611705699999995 0.0308659 0.000330999999999998 0.00095270378281 1.0956099999999865e-07 0.520204 -0.13810600000000006 0.019073267236000016 0.270612201616 1.84085 -0.04544000000000015 3.3887287225 0.0020647936000000133 -0.0273432 0.00027249999999999497 0.0007476505862400001 7.425624999999724e-08 -0.00271264 0.00091748 7.3584157696e-06 8.417695504000002e-07 0.00370835 -0.0008208399999999997 6.737783055999996e-07 1.37518597225e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33623.55859375 -69.734375 1130543692.5073395 4862.883056640625 20999.236328125 -21.208984375 449.8210182189941 440967926.36444473 22202.578125 -11.55859375 492954475.3967285 133.60108947753906 0.674463 18.368052 0.1763129000000003 -0.046255705599999995 0.038698892799999995 -0.0699724434 -0.0510972481 -0.0175614116 0.050070181500000005 -0.0726986995 0.053512306100000004 -0.020613333799999998 -0.0264862145 -0.0179736577 0.0838419019 -0.104600901 -0.0208714253 -0.0563377687 0.0726594097 0.0082359909 0.0213302392 0.0442625787 0.047735655 0.061941913099999996 -0.009573011 -0.0352231983 -0.0117859885 0.0369366493 -0.019388889399999998 -0.0378734034 -0.0057563697 -0.033819879500000004 0.024917909199999998 0.0542923603 0.004975716 0.017157896000000002 0.0182072147 -0.0459004735 0.0421866636 0.014579900600000001 0.0021247948 -0.0720302012 -0.0545867728 0.002167178 -0.03883581 -0.0842931024 -0.0719161656 0.0234240042 -0.0736768111 0.0376542998 -0.048669922000000004 -0.062215284 0.0070728412 0.0057256366 0.11282479349999999 0.0466004276 -0.0142215846 -0.012554326000000001 0.0027471660999999997 -0.0367285858 -0.0725246383 0.019016621100000002 0.0093778616 0.0493591875 0.0777906718 -0.0258513157 0.0781412957 -0.029492895800000002 0.044457098 -0.0264883517 -0.0045678242 0.0494562558 0.0537801114 0.06248639690000001 -0.0422854957 0.005495018000000001 -0.0993960955 -0.0164186847 0.09759167619999999 0.027144045 0.013996 -0.016869899999999997 0.00019588801600000004 0.00028459352600999986 0.592497 0.07229300000000005 0.005226277849000007 0.35105269500900005 1.79617 -0.04468000000000005 3.2262266689000003 0.0019963024000000046 -0.0272228 0.00012039999999999969 0.0007410808398400001 1.4496159999999923e-08 -0.00306215 -0.00034950999999999987 9.3767626225e-06 1.2215724009999994e-07 0.00332886 -0.0003794900000000001 1.440126601000001e-07 1.10813088996e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33738.953125 115.39453125 1138316957.9709473 13315.897842407228 21010.689453125 11.453125 131.174072265625 441449071.2956581 22220.341796875 17.763671875 493743589.5699501 315.548038482666 0.900872 24.533981 0.28354710000000005 -0.0530768883 0.0155204932 -0.0721224291 0.0034137596999999995 -0.0333189245 0.0206543234 -0.0022945295 0.1386214381 -0.0471400503 -0.0026578240999999996 -0.061890199699999995 0.1251470799 0.0304376075 -0.001188063 -0.046995502800000005 0.0177645724 0.012312633600000001 0.0075047476 -0.0450883692 0.0751848533 -0.0536000108 0.019298448899999997 -0.1527701638 0.0356349497 -0.030590636600000002 -0.0925902516 0.0392846869 -0.0413122114 -0.0107685431 0.0205386847 -0.0198752255 -0.20429722120000002 0.0261418317 -0.0479998436 -0.0482070009 0.0094460866 0.0027686576 -0.007664601899999998 -0.0766893295 -0.0064515323 0.034419891099999995 -0.013497315900000001 -0.019161061899999998 -0.1201774805 0.05767111780000001 -0.10002678539999996 0.0531534066 -0.0068276733999999995 0.0363893995 -0.0089946517 -0.049350128099999994 0.0020866643 -0.0177998177 0.0411116234 0.048237651299999997 -0.10146763710000001 0.0175530186 -0.0661902289 -0.1413063181 0.0356582463 -0.0213119574 0.0663051103 0.15356328560000002 0.010402304499999999 0.019464200900000003 0.10283678630000001 -0.0166329696 0.0457880958 0.023070278599999997 0.0001608196 -0.007757165600000002 -0.0005056183999999999 0.0039259816 -0.0996917334 -0.0117537397 0.09876883410000001 0.0195090322 0.0100879 -0.003908100000000003 0.00010176572640999997 1.527324561000002e-05 0.451679 -0.14081800000000005 0.019829709124000016 0.204013919041 1.75068 -0.04549000000000003 3.0648804624 0.0020693401000000033 -0.0256846 0.0015382 0.0006596986771600001 2.36605924e-06 -0.00315377 -9.162000000000016e-05 9.9462652129e-06 8.394224400000029e-09 0.00309206 -0.00023679999999999966 5.6074239999999855e-08 9.560835043600004e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33657.7265625 -81.2265625 1132842557.356018 6597.754455566406 21030.26953125 19.580078125 383.3794593811035 442272236.55702215 22229.810546875 9.46875 494164476.949955 89.6572265625 1.0635230000000002 28.963566 0.36634491 -0.0735029513 0.0040377393 -0.06643696610000001 -0.0013452574 -0.0057031728000000005 0.0417247372 -0.0309774642 0.0893358354 0.0072407402 -0.0163689089 -0.0036278211 0.034325188 0.0630728645 0.0862703266 0.0086052009 0.022697114100000002 -0.0913249149 0.0590630959 0.0444439592 0.0401050521 -0.0772466942 0.0447743631 -0.1025973532 -0.044593512 -0.057492696600000004 0.0016716357000000001 0.10418627859999999 -0.047007465199999994 0.012229565900000001 0.0303061352 -0.15949992640000002 -0.0554795613 -0.0604917225 -0.0189847324 -0.06811056759999999 0.0039337828000000005 -0.0135942977 0.049592051 -0.069007455 -0.0003870959 0.0018065891 -0.0495108188 -0.0288551879 -0.1030861888 0.018185427 -0.0367072096 0.019979531499999998 0.013549215900000001 0.0761250499 -0.073034016 0.0530949958 -0.026468359500000004 -0.0028327962 -0.0501769549 0.025320129700000003 -0.08626897089999999 0.0699667301 -0.0140637057 -0.1568719709 -0.0208463025 -0.0330452524 -0.0288184384 0.0117711476 0.011235368 0.12641240410000001 0.1334182438 0.0760330367 -0.0486485241 -0.013969767 0.0633652554 0.1281223712 -0.0564223649 0.0023559765 -0.0998889875 -0.0070626986 0.0995561965 0.0117537397 0.00994149 -0.00014640999999999786 9.88332234201e-05 2.143588809999937e-08 0.602353 0.15067400000000006 0.02270265427600001 0.36282913660899996 1.68772 -0.0629599999999999 2.8483987984000003 0.003963961599999988 -0.028059 -0.0023743999999999953 0.0007873074809999997 5.637775359999978e-06 -0.00328462 -0.00013084999999999963 1.07887285444e-05 1.7121722499999906e-08 0.00254602 -0.0005460400000000002 2.9815968160000026e-07 6.4822178404e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33906.62890625 248.90234375 1149659483.786148 61952.376724243164 21102.23046875 71.9609375 5178.376525878906 445304130.7562408 22238.25390625 8.443359375 494539936.7988434 71.29031753540039 1.234603 33.622692 0.26386701 -0.06276382280000001 -0.0155851668 -0.0712264839 0.0453066515 0.05841229360000001 -0.0412920919 0.0631153426 0.09864060890000001 -0.017497025700000002 0.1311606113 -0.0062762768 -0.058090843600000004 -0.1305473905 -0.0388657138 -0.1412461152 0.08448504009999999 -0.12205766609999999 -0.0428960237 -0.048283289900000005 -0.0332576195 0.0826330118 0.0192902938 -0.0509599779 0.0679413065 -0.09149594539999999 -0.0299699044 0.041083518799999996 -0.06909921570000001 0.0351475877 0.05315688 -0.2137412075 0.0027532179 -0.1353315873 0.0529264407 -0.0686379366 -0.0399436158 0.0080385044 -0.0992497859 -0.0732061759 0.050516639 -0.051284437800000006 0.0393828437 0.110808708 -0.09246605179999999 0.0542807005 -0.0637741607 0.0944191731 0.0743466732 -0.1323595453 -0.039229445 -0.0212324402 -0.0096657441 0.126827515 0.0367723987 0.0885196647 0.0671286176 0.0132721425 -0.0683908226 -0.0596712804 0.048295835499999995 -0.0653976654 0.0721270222 -0.0629197157 -0.0567286223 0.0860638591 0.1116793634 0.1249392606 -0.0812510307 0.0444453444 -0.0731371549 0.0012734442 -0.0023900875 0.0007853901 -0.09998766320000001 -0.0023559765 0.099950656 0.0039259816 0.0246025 0.01466101 0.0006052830062500001 0.0002149452142201 0.473423 -0.12893000000000004 0.016622944900000013 0.224129336929 1.73065 0.04292999999999991 2.9951494225 0.0018429848999999925 -0.0289793 -0.0009203000000000024 0.0008397998284899999 8.469520900000044e-07 -0.00279256 0.0004920599999999999 7.7983913536e-06 2.421230435999999e-07 0.00241146 -0.00013456000000000018 1.8106393600000043e-08 5.815139331599998e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34036.94140625 130.3125 1158513380.2924955 16981.34765625 21085.5625 -16.66796875 277.82118225097656 444600945.9414063 22287.0859375 48.83203125 496714199.5855103 2384.567276000977 1.353845 36.870098 0.4338221800000001 0.0020490148000000003 0.048614011900000004 -0.0084316476 -0.029967460499999998 0.1097806217 0.0375782533 0.06391348940000001 0.0208628051 0.0776561984 0.0768398039 0.07141228820000001 0.020016068799999998 -0.018831114 0.0012365686 -0.1027019022 -0.0400222315 0.0898870065 -0.09110443050000001 0.0157845786 0.09432842300000001 0.0385816337 -0.0337163198 0.0055310036 0.0488243539 -0.0428011541 0.0953759332 0.0248740953 0.08601409900000001 -0.0707458792 -0.011440049499999999 -0.0527902164 0.1518593983 0.2327893077 -0.0738792365 0.0030015043 -0.0077637964 -0.117228305 0.026494442200000003 -0.0094935036 -0.0165168062 -0.1053310066 -0.0410571653 0.07593746559999999 -0.0261963199 -0.0298759394 -0.0708531493 -0.0975241823 0.0105950223 -0.0825614851 -0.0824362675 -0.097801259 0.0165302925 0.010924285700000001 0.026880361800000002 0.0857452936 0.009689349 -0.0080534396 -0.0766257833 0.018628625700000002 -0.025594656 -0.0891456584 -0.1720556231 -0.056944593700000004 -0.039335273 0.0052590616 -0.08650641810000001 -0.1609846324 0.0757626342 0.0655691467 0.0005752516 -0.043663776200000004 -0.165795771 -0.0007853901 -0.09998766320000001 0.0023559765 0.099950656 -0.0039259816 -0.008854179999999998 -0.03345668 7.839650347239996e-05 0.0011193494366223996 0.459317 -0.014105999999999954 0.00019897923599999863 0.21097210648900006 1.99147 0.26082000000000005 3.965952760900001 0.06802707240000003 -0.0301396 -0.001160299999999996 0.0009083954881599996 1.3462960899999908e-06 -0.00227753 0.0005150300000000001 5.1871429009e-06 2.6525590090000007e-07 0.001578 -0.0008334599999999997 6.946555715999998e-07 2.490084e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33655.3046875 -381.63671875 1132679533.6084595 145646.5850982666 21077.517578125 -8.044921875 64.72076797485353 444261747.2561684 22247.349609375 -39.736328125 494944564.641758 1578.975772857666 1.581012 43.05666400000001 0.8948728200000001 -0.0333660348 0.0082157324 -0.024414008100000002 0.0480658125 0.0166772141 -0.029864104199999998 0.0005548775 -0.17477041129999998 0.15923547470000002 0.0034362028000000005 -0.11200143359999999 -0.2134860609 -0.011247950500000001 0.0831100009 0.0440716816 -0.0760120156 0.0813760493 0.0315825039 -0.0712722805 0.05822833860000001 0.084157324 0.06737091740000001 -0.0048028692 0.0891064317 0.0685549327 0.0571844996 0.07467102980000001 0.08971761029999999 0.062089204 0.09802280390000001 0.0908686482 0.0743810394 -0.0768838821 0.0160612163 -0.0374785097 0.0042982371 0.0048548642 -0.0047578203 -0.0183573395 0.0711055659 -0.0096814575 0.0077677904 0.013343226000000001 0.14331986130000002 -0.22878933829999998 0.1809767702 0.0613576213 0.047060937000000004 -0.041034932999999996 -0.08445610140000001 0.044380105700000005 -0.0912728857 -0.0590864711 0.09094689210000001 0.044469145099999996 -0.0100382087 -0.0163342215 -0.1127276908 0.10424387289999999 -0.14047608539999998 -0.0510410996 0.028293441000000006 -0.0600492613 0.0836911837 0.0886081218 -0.07191860580000001 0.05184531269999999 -0.0160551393 -0.0151651245 0.026566832999999998 -0.0109746403 0.0186811371 -0.0023559765 -0.0998889875 0.0070626986 0.0995561965 -0.0117537397 -0.123531 -0.11467681999999997 0.015259907960999996 0.013150773045312395 0.551283 0.09196599999999994 0.008457745155999988 0.303912946089 1.85755 -0.13392000000000004 3.4504920025000003 0.017934566400000008 -0.0303501 -0.00021050000000000238 0.0009211285700099998 4.4310250000000984e-08 -0.00127833 0.0009991999999999998 1.6341275889e-06 9.984006399999996e-07 -0.0082985 -0.0098765 9.754525225e-05 6.886510225000001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33752.42578125 97.12109375 1139226246.1187894 9432.506851196287 21032.162109375 -45.35546875 2057.1185455322266 442351842.9950295 22267.880859375 20.53125 495858517.96731955 421.5322265625 1.096375 29.858259000000004 0.3530336500000001 -0.037695432200000004 -0.0016818666 -0.031754194300000003 -0.0123261033 -0.002566925 0.0013037443 -0.0145708545 -0.1494810519 -0.09497767060000001 0.0105589472 -0.0262648008 -0.0795777746 0.0013546728 -0.0066055101 0.114943973 -0.08433116339999999 -0.0116694214 0.1202787705 -0.0045164687 -0.0605402854 -0.0702423246 0.0525552944 -0.0667277206 0.1278268966 0.0368443476 0.0690154975 0.0929135266 -0.0592184875 0.014091952 0.1534393233 -0.029768568 0.0121938971 -0.1676364283 0.0470257026 -0.0361181913 0.009382799 -0.020766963700000002 0.013499154499999999 -0.028716499500000006 -0.016129996299999998 0.0025937987 0.0071764561999999995 -0.0058606596 0.1804670321 0.0381610229 0.0824783273 0.0420852625 0.021996709500000003 -0.0231210288 0.0323387152 0.1277350803 -0.10018863199999999 -0.0890235943 0.0176546564 -0.0358678269 -0.0248810262 0.0166063483 0.0752568288 -0.055920835700000004 -0.11312694109999999 -0.1455188827 0.040108054500000004 -0.042527648099999996 0.0626672066 0.060033268499999994 0.0649884333 0.07970800410000001 -0.0057781149 0.012733020900000001 -0.1875585108 0.12709004289999998 -0.043161426600000004 -0.0039259816 -0.0996917334 0.0117537397 0.09876883410000001 -0.0195090322 -0.09483730000000004 0.02869369999999995 0.008994113471290009 0.000823328419689997 0.6823229999999999 0.13103999999999993 0.017171481599999986 0.4655646763289999 1.82451 -0.03304000000000018 3.3288367400999994 0.0010916416000000119 -0.0291073 0.0012427999999999988 0.0008472349132899999 1.544551839999997e-06 -0.000623781 0.000654549 3.89102735961e-07 4.2843439340100004e-07 -0.00699065 0.0013078500000000002 1.7104716225000003e-06 4.88691874225e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33960.59375 208.16796875 1153321927.852539 43333.903213500984 21048.91015625 16.748046875 280.49707412719727 443056618.7658844 22289.9296875 22.048828125 496840965.47369385 486.150821685791 0.804764 21.916624 0.32700215000000005 -0.0364805814 -0.026067736299999998 -0.0368734613 0.0367402795 -0.016594181399999998 -0.038421111099999995 0.0505778359 -0.1571650901 -0.0568342772 0.0544463604 -0.0330772523 -0.0518531609 -0.0258566002 0.047645630099999996 -0.045454491799999996 -0.0751277961 -0.09677216820000001 0.029409589 -0.027495116 0.0350005588 -0.058760785499999996 0.1246152274 0.1063392228 0.09923991619999999 -0.0491381463 0.054588030999999995 0.0026006097 0.0842767558 -0.043472732300000004 0.1628724098 0.07399655990000001 -0.0177787327 -0.0764165997 0.0248932744 -0.0408102612 -0.0290432238 -0.023625275 0.0066074631000000005 -0.0374161817 0.0357199638 0.024469147099999998 0.0332169744 0.0506977734 0.1783958126 0.0125120644 0.0410549683 0.045054563 0.006250289799999999 -0.079577664 -0.059711648799999996 0.0496131493 -0.068885291 0.015276139499999999 -0.0081236983 -0.054863048600000006 -0.0910084118 0.0744640044 0.010554714 0.1577551946 0.0002050393 -0.0663495461 -0.0463788866 0.012570388500000002 0.0426361279 0.0968762861 0.0028620801 0.1148406779 -0.06990251230000001 -0.0312685685 -0.0047099475 0.0970117628 -0.049682543600000004 -0.005495018000000001 -0.0993960955 0.0164186847 0.09759167619999999 -0.027144045 -0.122407 -0.027569699999999947 0.014983473648999997 0.0007600883580899971 0.514451 -0.1678719999999999 0.028181008383999968 0.264659831401 1.80955 -0.014959999999999862 3.2744712025 0.0002238015999999959 -0.0278891 0.0012182000000000026 0.0007778018988099997 1.4840112400000064e-06 -0.00146495 -0.0008411689999999999 2.1460785025e-06 7.075652865610002e-07 -0.00671801 0.0002726400000000002 7.433256960000012e-08 4.51316583601e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33805.203125 -155.390625 1142791758.3225098 24146.246337890625 21006.69140625 -42.21875 1782.4228515625 441281083.8374176 22219.3984375 -70.53125 493701666.92437744 4974.6572265625 0.6815829999999999 18.561954 0.12380199999999987 -0.0396667326 -0.01630185 -0.0321283473 0.0164553891 -0.0437484134 -0.003476617 -0.0082357755 -0.1375600689 -0.0169920376 -0.0663611921 0.026119079500000003 -0.0405136146 -0.0308818485 0.011451579299999999 0.0179107475 0.011689931899999999 0.013905619499999999 0.0291201011 0.0478919301 0.1141120591 -0.0219015867 0.042022763899999996 0.061811980999999995 -0.0008205396000000001 -0.1135404862 0.0093840187 0.0440122525 0.0345400523 0.0370526161 0.0618409635 -0.0576481619 0.07402584849999999 -0.0393012625 0.1851194961 -0.043817239400000006 -0.0066205864000000005 -0.002751835 0.027921016899999998 -0.0278023728 0.0091474591 0.0477104016 0.0088469914 -0.0236142725 0.1274543199 -0.0005969063 0.0875467878 -0.0308023573 -0.0313917532 -0.007594486700000002 0.0206532226 0.08285052379999999 0.0616159053 0.007905264399999999 0.038099772999999997 0.0727702498 -0.047961919699999994 0.0517411095 -0.0203699671 0.0360491192 -0.0088744758 -0.0430864678 0.0011400109 -0.027875527200000003 -0.0407810647 0.0738295834 0.0753771473 -0.0107294022 -0.0626781145 -0.0835499491 0.0673733658 -0.009714616700000001 -0.1331352721 -0.0070626986 -0.0990023658 0.021047176 0.0960293686 -0.034611705699999995 -0.120562 0.0018449999999999996 0.014535195843999997 3.4040249999999983e-06 0.5858260000000001 0.07137500000000008 0.005094390625000011 0.3431921022760001 1.78678 -0.02276999999999996 3.1925827684000003 0.000518472899999998 -0.027923000000000003 -3.390000000000684e-05 0.0007796939290000003 1.1492100000004638e-09 -0.00170258 -0.00023763 2.8987786564e-06 5.6468016899999974e-08 -0.00700272 -0.00028470999999999965 8.10597840999998e-08 4.90380873984e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33657.8671875 -147.3359375 1132852023.6113892 21707.878479003903 20998.814453125 -7.876953125 62.04639053344727 440950208.4367714 22173.662109375 -45.736328125 491671291.34073263 2091.811710357666 1.124269 30.617897 0.35127579999999986 -0.059022862599999996 -0.049679617300000006 -0.0591839046 0.0759185765 -0.0948749596 -0.013388251499999998 -0.0033202940999999997 -0.0283859612 -0.0339670323 -0.047445987 -0.0546566401 -0.0131124411 -0.0705489143 0.019750553799999997 -0.0161183508 -0.0492494746 0.049849355199999994 0.0537843539 -0.1080951747 -0.0078267811 0.0498752628 -0.1535545308 -0.0184953138 -0.0154138093 -0.029155898700000002 0.0446810443 -0.041047815099999996 -0.034603243 -0.0460292863 0.0152020969 0.031067145 -0.1293660942 0.1589804571 -0.1198802319 -0.061288577999999996 -0.024737218 0.0884079113 -0.0575958959 -0.0538031734 0.0598338081 0.1052427831 0.0105124192 -0.0145086759 0.038332849599999996 0.0246586477 0.0542669483 0.0606180933 -0.0520491641 -0.047117083600000005 -0.0234371893 -0.0271976345 0.0082187691 -0.015772315500000002 0.0581118975 -0.1089247492 0.0035414692 -0.1569672268 -0.045040547199999996 -0.08284808980000001 0.0743424234 -0.027828844100000003 -0.0532868958 0.0775228746 -0.0721022712 -0.034185557799999995 -0.0243616652 -0.08881457429999999 0.09305244689999999 0.06574241730000001 0.0533847848 0.0923906026 0.063160236 -0.0086286366 -0.0985109326 0.0256289373 0.0940880769 -0.0418659738 -0.0927637 0.0277983 0.00860510403769 0.0007727454828899999 0.462549 -0.12327700000000008 0.015197218729000019 0.213951577401 1.6835099999999998 -0.1032700000000002 2.8342059201 0.010664692900000041 -0.0267257 0.0011973000000000018 0.0007142630404899999 1.4335272900000045e-06 -0.00140675 0.00029583 1.9789455625e-06 8.751538889999997e-08 -0.00655724 0.0004454799999999998 1.9845243039999983e-07 4.29973964176e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33745.73828125 87.87109375 1138774852.1466215 7721.329116821289 21002.03515625 3.220703125 10.372928619384766 441085480.70436096 22172.763671875 -0.8984375 491631448.8488197 0.80718994140625 0.7486669999999999 20.388897 0.1270070999999998 -0.0619091178 -0.0430116879 -0.045488709100000004 0.064870914 -0.0758510127 0.001121112 -0.0105311899 -0.052176357199999995 0.0283609564 -0.1030932978 -0.053072443899999995 -0.0719087014 0.0105662538 0.0315448709 -0.034639082200000004 -0.1328794597 0.0379331529 0.057330308899999995 -0.0736056284 -0.0583092024 -0.0013132204999999999 -0.0193846289 0.1247368843 -0.07816647730000001 -0.0401473573 0.05746279 0.0005299418 0.011971216699999999 -0.07154894519999999 0.0368555285 0.0634785434 -0.09199474140000001 0.014537725900000001 0.0164282114 -0.0639264521 -0.0324519711 0.022577827400000004 -0.0350367631 -0.0351811035 0.0583722682 0.0819929204 -0.0090685901 -0.037130309 0.0257700647 -0.0643462937 0.1285368635 0.016456518 -0.013424141100000002 -0.049186317599999994 -0.054561932599999995 -0.044644442199999995 -0.0209249533 -0.0442279599 0.0393318843 -0.1304432647 0.0302152485 -0.0474914055 0.0756679496 0.0475630347 0.067099922 0.0125199759 -0.1127254167 0.0782438658 -0.0008827080000000002 0.0519996306 -0.0096857947 -0.0027861139 -0.032608289900000004 -0.0256682925 0.0386205354 0.015479300500000001 -0.0740186227 -0.0101924456 -0.0979222811 0.030153796 0.0917754626 -0.0488621241 -0.0991993 -0.006435600000000014 0.00984050112049 4.141694736000017e-05 0.504703 0.042154000000000025 0.0017769597160000024 0.254725118209 1.7086400000000002 0.02513000000000032 2.9194506496000003 0.0006315169000000161 -0.027645 -0.000919299999999998 0.0007642460249999999 8.45112489999996e-07 -0.00155319 -0.00014644000000000007 2.4123991761e-06 2.144467360000002e-08 -0.00655723 9.999999999940612e-09 9.999999999881223e-17 4.29972652729e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33711.5390625 -34.19921875 1136467865.9624634 1169.5865631103516 21024.99609375 22.9609375 527.2046508789061 442050460.7422028 22209.212890625 36.44921875 493249137.22110367 1328.5455474853516 0.8997859999999999 24.50441 0.33073469999999977 -0.0722093065 -0.07746860929999999 -0.058407255199999994 0.0986481441 -0.0787474646 -0.0114729136 -0.009536935699999999 -0.0039728637 0.0310020328 -0.022151282799999998 -0.0055951171 -0.0354177522 -0.057845647 -0.008464260500000001 -0.05299505980000002 -0.0284333232 -0.0704378029 -0.0027938308 -0.0082370672 -0.0206718872 0.08418088779999999 -0.1118205677 0.0810995573 -0.154048301 -0.0309287491 0.10944018230000001 0.0739479571 0.0093043563 0.048117744000000004 0.0503470268 -0.0053793211 -0.06359984070000001 -0.022953527999999997 0.0837811769 -0.0783075318 -0.0455021354 0.0834411837 -0.0079349885 -0.0568711032 0.0933939576 0.0827343023 -0.0030488526 -0.0085561318 -0.0058159701 -0.0211181137 0.0324865062 0.0274486279 -0.0173491718 -0.0699162429 -0.0081987919 -0.009248469 -0.004861848 0.0244090335 -0.053004826 -0.08316640139999999 0.0522535451 -0.1411001708 0.0285517353 -0.025276598900000002 -0.0637825836 0.1587750809 -0.1187218695 -0.0024919297 -0.09216912669999999 0.1028896774 0.0068676564 0.0649017772 -0.08202864879999999 -0.12095573220000001 -0.0105468618 -0.060877907099999996 -0.021369251000000002 -0.0117537397 -0.097236992 0.034611705699999995 0.08910065240000001 -0.0555570233 -0.10308800000000001 -0.0038886999999999954 0.010627135744 1.512198768999996e-05 0.433142 -0.07156099999999999 0.005120976720999998 0.187611992164 1.61237 -0.09627000000000008 2.5997370169000003 0.009267912900000015 -0.0254852 0.0021598000000000003 0.00064949541904 4.66473604e-06 -0.00205006 -0.0004968699999999997 4.202746003599999e-06 2.4687979689999966e-07 -0.006033600000000001 0.0005236299999999988 2.7418837689999885e-07 3.640432896000001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33703.90625 -7.6328125 1135953296.508789 58.25982666015625 21029.439453125 4.443359375 19.74344253540039 442237323.7126503 22184.783203125 -24.4296875 492164605.76965714 596.8096313476562 0.874519 23.816309 0.2474512999999997 -0.0629096201 -0.053265250300000004 -0.0507079661 0.0658725897 -0.021151701800000002 -0.016149126899999998 0.0036314506 -0.0942824864 -0.0697301138 0.07998396940000001 0.0433960596 0.0405239815 -0.1096055206 0.1275782155 0.0635723493 0.0678642006 0.05961806240000001 0.0187214955 -0.044741731900000005 -0.0328812401 0.0360097588 -0.049569550899999995 0.1193652575 0.019846265 0.0163981617 0.0460739784 -0.013195515900000001 0.0085882971 0.0299216643 0.054562605099999995 -0.0560637434 -0.0970074232 0.0406483392 -0.1168663083 -0.0695983691 -0.0202328048 0.050982226299999996 0.0184161408 -0.046196203899999996 0.0660473997 0.0312347436 0.0157107456 0.0274669968 0.10725682210000001 0.0904272709 -0.0308774075 0.0159769576 -0.09347555560000001 0.049054332 -0.0640735385 0.059930899 0.0357089206 0.023973250699999997 0.10279484960000004 0.0235028112 0.0350552834 -0.1488067794 0.0289739494 0.0465804303 0.0027872581 -0.0308685164 -0.1039940067 -0.0585401063 -0.07511866889999999 -0.0136524375 0.0635573488 0.0431832385 0.0818400929 -0.0320983734 -0.0581039209 -0.0692562948 -0.0199394425 -0.013312133899999998 -0.0964557418 0.0389927688 0.08607420269999999 -0.06190939490000001 -0.0978007 0.0052873000000000095 0.009564976920489998 2.7955541290000092e-05 0.523179 0.09003699999999992 0.008106661368999986 0.273716266041 1.69172 0.07935000000000003 2.8619165584000004 0.006296422500000004 -0.0258487 -0.0003635000000000027 0.0006681552916900001 1.3213225000000195e-07 -0.00136163 0.0006884299999999999 1.8540362569e-06 4.739358648999998e-07 -0.00562999 0.0004036100000000013 1.6290103210000105e-07 3.16967874001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33753.40625 49.5 1139292433.477539 2450.25 21018.01171875 -11.427734375 130.59311294555664 441756816.6095123 22235.087890625 50.3046875 494399133.50381845 2530.561584472656 0.967545 26.349741 0.28262909999999986 -0.0685851033 -0.08125671849999999 -0.0637737324 0.101137133 -0.0753288636 0.0001263514 0.0053017552 0.0343762332 -0.0516285225 -0.0144468168 -0.0355434575 0.030247409 -0.046957851200000005 0.0518330376 0.0661692871 -0.0524371212 0.0922506842 0.0949958875 0.0620410935 -0.11665875210000001 0.0272174802 -0.056931519699999995 0.06384595009999999 -0.028655634 0.038533722400000005 0.0104572237 0.0230592831 -0.013185734 -0.0899575894 -0.0117289142 -0.0065201149 0.0279115825 0.035113309 0.0016401913000000001 -0.06839061490000001 -0.044336901 0.073298003 0.00023929970000000002 -0.061607801799999994 0.0919456152 0.0824359442 -0.0068065533 0.0098481331 -0.0128632837 0.0449481891 0.0192571215 0.0419087478 -0.08623308380000001 0.020282958400000002 -0.0200095386 0.0616455575 0.0386470379 -0.1404839751 -0.0107487296 -0.0576467946 0.1258832965 -0.054697228 0.1205547041 -0.018814356100000002 -0.0099212835 0.0156964706 -0.0514995958 -0.0364570419 0.023019181099999998 -0.0203018435 0.060386920499999996 -0.11884190050000001 0.0685892473 -0.0152734433 -0.007161206 0.0778138365 -0.0254953374 -0.0148672434 -0.0955793015 0.043287258200000005 0.0827080574 -0.06788007459999999 -0.0865931 0.011207599999999984 0.007498364967610001 0.00012561029775999964 0.424363 -0.09881599999999996 0.009764601855999993 0.18008395576900002 1.63597 -0.055749999999999966 2.6763978409000004 0.0031080624999999962 -0.0245394 0.0013093000000000028 0.00060218215236 1.7142664900000074e-06 -0.00101062 0.00035100999999999985 1.0213527844000002e-06 1.2320802009999996e-07 -0.00495319 0.0006768 4.5805824000000003e-07 2.45340911761e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33782.33203125 28.92578125 1141245957.4696198 836.7008209228516 20997.6796875 -20.33203125 413.39149475097656 440902552.2588501 22246.658203125 11.5703125 494913801.20666885 133.87213134765622 0.8906569999999999 24.255806 0.10451675000000027 -0.0730082654 -0.07891743059999999 -0.054736075499999995 0.0902220266 -0.100413766 -0.0208672906 -0.0055431685 0.0176215768 0.0608212517 -0.0688727504 0.0261590869 0.0020206733 -0.0536008015 0.0882691159 -0.09284960029999999 -0.031632404100000004 -0.0273555577 0.0268676756 0.10760521619999999 -0.0644159434 0.0405959603 -0.0151247181 0.0450784885 0.0164897006 -0.0071494339 -0.0126282547 0.0798704886 -0.15666841550000002 -0.0014044231 0.0025786078 -0.0355941466 0.0253529517 0.1197858429 -0.0543167816 -0.0764666954 -0.0440570171 0.0551175582 0.0058638978 -0.0487828435 0.0832902435 0.1189405724 0.0049269417 -0.0260032595 -0.0417906634 -0.033519301099999996 0.0457597572 -0.0260628977 -0.0918028212 -0.0438295533 -0.10054166390000001 0.0081834826 0.058319653 0.003999207 -0.0448314437 -0.0238640349 0.11790163470000001 0.0231073809 0.007874365999999999 -0.0557541788 -0.0049325345 -0.0658301867 0.0038782876 -0.0352808992 -0.1347869782 -0.0136420847 0.0440289766 -0.0695866975 -0.0583036762 -0.1107175126 -0.0013532647 0.0167547291 0.12606513390000001 -0.0164186847 -0.0946085359 0.047485639 0.0790155012 -0.0734322509 -0.0921083 -0.005515199999999998 0.008483938928890001 3.0417431039999975e-05 0.420807 -0.003556000000000004 1.2645136000000024e-05 0.17707853124899997 1.64115 0.0051799999999999615 2.6933733225000003 2.6832399999999608e-05 -0.0257291 -0.0011897000000000019 0.00066198658681 1.4153860900000044e-06 -0.000601929 0.00040869100000000014 3.62318521041e-07 1.670283334810001e-07 -0.00516011 -0.0002069200000000002 4.281588640000008e-08 2.66267352121e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34318.16015625 535.828125 1177736116.510025 287111.77954101557 21158.44921875 160.76953125 25846.842178344727 447679973.3424225 22116.69140625 -129.966796875 489148038.7592926 16891.36828994751 3.200396 87.158325 1.10720195 0.09643408710000001 0.026648661299999998 0.09258674439999999 -0.023947687999999998 0.1911621161 0.0693835463 0.1567634382 -0.040938678900000004 -0.023829353900000003 0.0387682166 0.0835705212 0.0712479297 -0.2339667049 -0.06793005790000001 -0.0948835407 0.10314591769999999 0.2870993483 0.06957332179999999 -0.0827501241 0.0651494187 0.0456111642 -0.10415250029999999 0.14469547 0.0411760165 0.0131218376 0.0522329458 0.1968178132 -0.0154116502 0.0295470548 -0.066434911 0.0091609551 -0.0279070197 -0.1978044457 -0.0885267401 0.093694002 -0.0762031001 -0.165424328 0.0082577823 0.10112575369999999 -0.019136865 -0.2040056804 -0.0588368183 0.1477121498 0.0417853665 0.0465003478 -0.0740440286 -0.0224008264 -0.10090406699999999 -0.10004959179999999 0.0395347255 -0.0016834957000000002 0.2419263114 0.0013745548000000001 0.2171279998 0.0097139453 0.0322006972 -0.2686039443 -0.0650886688 0.07163041769999999 -0.043583424100000004 -0.0100642156 -0.0179945564 -0.008382119399999999 0.0397494133 0.0798968009 -0.0305653446 -0.0156874244 -0.2173710804 -0.006636896800000001 -0.1416466996 0.0166325895 0.1306170426 -0.0179660749 -0.0935444031 0.051578589800000005 0.07501110700000001 -0.0785316931 -0.0237814 0.0683269 0.0005655549859600001 0.00466856526361 0.576458 0.15565100000000004 0.024227233801000014 0.332303825764 2.33851 0.6973599999999998 5.468629020099999 0.4863109695999997 -0.0230845 0.0026446000000000004 0.00053289414025 6.993909160000003e-06 -0.00163713 -0.001035201 2.6801946369e-06 1.0716411104010003e-06 -0.00512263 3.7479999999999465e-05 1.4047503999999591e-09 2.6241338116900006e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34944.9765625 626.81640625 1221151386.9536743 392898.8071441649 21206.060546875 47.611328125 2266.838565826416 449697003.9177284 22349.43359375 232.7421875 499497181.961441 54168.925842285156 3.1901 86.877937 0.93557893 0.21181289679999998 -0.1991774807 0.19241359719999998 0.1159425364 0.3173696784 0.1859342693 -0.0332761404 0.20744371649999999 0.0665797227 -0.0755458319 0.2381522213 0.2526034034 0.050540404500000004 -0.036701982200000004 0.030367429100000006 -0.1167093836 -0.0408251853 -0.0442548049 -0.0448672348 -0.035928424199999996 -0.0294801217 -0.0052056595 -0.0215761277 -0.0854150939 -0.09000238529999999 -0.1583088787 -0.049882499299999994 0.0358194233 0.0216139737 0.0488548153 0.1830541631 0.0351568842 -0.162455029 0.0526155246 0.1851226298 -0.31353868960000003 -0.0713630705 0.0036953393 0.1731258593 0.1177112074 -0.3008163421 -0.1805062473 -0.0734280803 -0.2057515259 0.0387288156 -0.164206397 -0.28220019550000003 -0.1570590601 0.0052688990000000005 0.0546639663 -0.060097911399999995 -0.0726246421 -0.0071399807 -0.0075107863 -0.0401583908 -0.0287039271 0.0182227179 0.0972341377 -0.0492877537 0.024474928700000002 0.12175368869999999 0.1069929219 0.058995656699999996 0.09510966189999999 0.0559761979 -0.1166357502 0.0651350423 -0.013981758 -0.0909638992 -0.044005254400000006 0.1454552748 -0.0174504449 -0.0195090322 -0.0923879533 0.0555570233 0.0707106781 -0.08314696120000001 0.0439758 0.0677572 0.00193387098564 0.00459103815184 0.671741 0.095283 0.009078850089 0.4512359710810001 2.87526 0.5367500000000001 8.267120067599999 0.28810056250000005 -0.023115 -3.049999999999928e-05 0.000534303225 9.30249999999956e-10 3.32846e-05 0.0016704145999999998 1.1078645971600002e-09 2.7902849358931597e-06 -0.00210777 0.0030148600000000003 9.0893808196e-06 4.4426943729000015e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33091.75390625 -1853.22265625 1095064176.591812 3434434.2136383057 21164.740234375 -41.3203125 1707.3682250976562 447946229.18857193 22182.916015625 -166.517578125 492081762.9562722 27728.103824615482 1.827918 49.780804 0.6006468299999996 0.14841042699999998 -0.05834012650000001 0.1403369721 -0.0051745207 0.1671067728 0.1254537514 -0.10509073 0.1541566722 0.046933305599999996 0.1988164807 0.07541909690000001 -0.12322979390000001 -0.0733327828 -0.08496090949999999 0.07258125019999999 0.0291545187 -0.029738910499999997 0.0023682824 0.1793523212 -0.0778880808 0.10931858900000001 0.1939694023 -0.10527939999999998 -0.17627485629999998 -0.187289641 0.067552149 -0.08565517550000001 0.011353074199999999 0.0140927553 -0.027720829 0.154456963 0.025372997400000003 0.0967033727 0.0178864093 0.1581578231 0.0819953662 0.19323449969999998 0.0967217397 0.1246767519 0.022053942799999997 -0.18918440530000002 -0.1416886724 0.0008094452000000001 -0.122100893 0.0308636499 -0.0513721376 -0.04580593559999999 0.0945183369 -0.1332943187 0.0352967469 0.07639096150000001 0.1060436045 0.0278762225 0.0058224923 0.055134388099999994 0.1339060878 0.23970087510000002 -0.07094198389999999 -0.0205025865 0.037111543399999995 0.130012593 -0.1436211789 0.0388552668 -0.0924349056 -0.0634145827 -0.0877764127 0.0686137894 0.0900821585 0.0024373138000000003 -0.016214593 0.0120906255 -0.1456937775 -0.021047176 -0.0911403277 0.059412106299999996 0.06613118650000001 -0.0872496007 -0.0166399 -0.060615699999999995 0.00027688627201 0.0036742630864899997 0.7456470000000001 0.07390600000000003 0.005462096836000004 0.5559894486090001 2.56239 -0.31286999999999976 6.565842512100001 0.09788763689999984 -0.0239016 -0.0007865999999999983 0.0005712864825599999 6.187395599999975e-07 -0.000538398 -0.0005716826 2.8987240640400013e-07 3.2682099514276e-07 -0.00381459 -0.00170682 2.9132345124e-06 1.45510968681e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33356.0234375 264.26953125 1112624299.5630493 69838.38514709473 21099.6171875 -65.123046875 4241.011234283447 445193845.4590454 22153.306640625 -29.609375 490768995.11355966 876.715087890625 1.9259580000000005 52.450794 1.0159802 0.0933303005 -0.0115370817 0.1027094015 -0.0332786676 0.0638415795 0.0752777883 -0.1044688955 -0.0857239263 -0.06970201690000001 0.0385584775 0.0154384091 -0.1215046808 0.0101640866 -0.1529409944 0.2175498707 0.048298306500000006 0.013032873200000001 -0.0260345418 0.0752672757 -0.2157956875 -0.0451878047 -0.0404585326 -0.1895782905 0.1284351427 -0.046448625599999994 -0.047087979599999996 0.1156703085 0.0484383892 0.0871114485 0.1705831974 0.0603159239 -0.1148413555 0.021897862400000002 -0.11225514619999999 0.1141561052 0.0564886663 0.1028012647 0.0771011455 0.0923839358 -0.025032334399999998 -0.0893696175 -0.0646586753 -0.0675925721 0.11715484039999999 0.0526044015 0.0859542709 -0.0051110433000000005 0.07981797019999999 0.0108100371 0.22706840329999997 0.0969537118 -0.056796441100000004 0.0044631494 -0.032844365099999995 0.1500317081 0.143371846 -0.0234671893 0.12827719939999999 -0.1354402333 -0.10611395109999999 -0.1068083616 0.0684706429 0.046999617199999996 -0.0241723303 0.1191304197 -0.0504283545 0.2198755233 0.1536605264 0.0070434266 0.075649465 -0.07102059179999999 0.0988272173 -0.022580126699999998 -0.08980275759999999 0.0631352795 0.0612907054 -0.0908143174 -0.07119500000000001 -0.05455510000000001 0.005068728025000001 0.002976258936010001 0.824866 0.07921899999999993 0.006275649960999988 0.680403917956 2.34736 -0.2150300000000005 5.5100989696 0.04623790090000021 -0.0293503 -0.005448700000000001 0.0008614401100899999 2.968833169000001e-05 -0.00203061 -0.0014922120000000001 4.1233769721e-06 2.226696652944e-06 -0.0102172 -0.00640261 4.099341481210002e-05 0.00010439117584 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33673.421875 317.3984375 1133899340.7717285 100741.7681274414 21058.025390625 -41.591796875 1729.8775672912598 443440433.35220724 22258.248046875 104.94140625 495429606.1162148 11012.698745727539 1.305215 35.54572299999999 0.5486165 0.0581367275 0.014724033000000001 0.0512926717 -0.0181293664 -0.012895030600000001 0.041913871400000004 -0.025350825299999998 -0.0407978039 0.024562556800000003 0.0399498697 -0.17251251620000002 -0.1731946177 0.0481138785 -0.0930920275 0.013561471499999998 -0.0317560843 -0.0178783482 0.025319742200000002 0.012672781599999999 -0.140407742 0.05239255809999999 0.1724876906 -0.0833737504 -0.1633276368 -0.0050328207 -0.001410147 -0.0114034476 0.15886078480000002 -0.0780637505 -0.050785671100000006 -0.04713928059999999 -0.057151143700000004 0.14092951509999999 0.0156739431 0.06929964849999999 0.0348111006 0.0416693831 0.025104147200000003 0.052512578600000005 -0.011044375700000001 0.0014614704 -0.040681258 -0.0033856641999999997 0.0478588109 -0.081651467 0.0867717565 0.1470368549 0.178012662 -0.0732672748 0.0544717064 -0.051573876 -0.026742446099999997 -0.0808261463 0.0429463518 0.0343837532 0.1750792902 0.1476574931 0.0661888118 -0.0203974658 -0.0626785045 0.09728775220000001 -0.14894368289999999 0.055289331799999994 0.014308388100000001 -0.0647501654 0.0308411431 0.0314829482 0.15131968810000002 0.015998631 0.0680112467 -0.1705900207 0.0273028565 -0.0241075061 -0.088376563 0.0667182767 0.0562083378 -0.0938191336 -0.11953200000000005 -0.04833700000000005 0.014287899024000012 0.0023364655690000045 0.5980989999999999 -0.22676700000000005 0.05142327228900002 0.35772241380099995 2.16888 -0.17847999999999953 4.7040404544 0.03185511039999983 -0.028712900000000006 0.0006373999999999963 0.0008244306264100003 4.0627875999999535e-07 -0.00233486 -0.00030424999999999983 5.451571219599999e-06 9.256806249999991e-08 -0.0111762 -0.0009589999999999998 9.196809999999996e-07 0.00012490744644 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33559.59375 -113.828125 1126246332.665039 12956.842041015625 20995.423828125 -62.6015625 3918.9556274414062 440807821.722599 22174.3671875 -83.880859375 491702560.1660767 7035.998569488525 1.009701 27.497799 0.19729500000000014 0.0387929512 0.0102835562 0.0451386592 -0.0705660013 -0.0520586258 0.0361424818 -0.108381903 -0.12693604220000002 -0.0478544742 -0.051190532000000004 0.0203248555 -0.0612102038 0.0024132051 -0.1356242488 0.0698594846 0.0489994602 -0.0003502079 -0.026800817400000003 0.0360019655 0.0697477111 0.039517218 -0.04385807110000002 0.0169315524 -0.0611444971 0.0336650049 -0.0516907216 0.0764354297 0.0329050247 -0.0185758753 -0.0063150543 0.0376836445 -0.038483218799999996 -0.035896983199999996 -0.020727201299999998 0.0509456745 0.048683731900000006 0.0490101853 0.0502867534 0.044558365999999995 -0.073493285 0.0407531244 -0.0217790234 -0.1116789071 0.12476472109999999 0.02283048 0.0714352608 -0.0167834873 0.0682414983 -0.0130952553 0.11368260919999999 0.0158227734 -0.0006581691 -0.0025951837 -0.0087646723 0.0806048234 0.0434916666 -0.0774780108 -0.036499254700000004 0.0257527675 -0.015562773 0.1305183503 0.0157826729 0.0872159404 0.0306767471 0.0271786188 0.0453348518 -0.0369957456 -0.075692007 0.0829826865 0.017076084499999998 0.0319377099 -0.0558656497 -0.0256289373 -0.0868631514 0.0701531426 0.0509041416 -0.0962455236 -0.138223 -0.018690999999999958 0.019105597729000005 0.0003493534809999984 0.653217 0.05511800000000011 0.0030379939240000125 0.4266924490890001 2.1101400000000003 -0.058739999999999785 4.452690819600003 0.003450387599999976 -0.0292283 -0.0005153999999999992 0.0008542935208900001 2.656371599999992e-07 -0.00196454 0.00037032 3.8594174116e-06 1.3713690239999996e-07 -0.0115854 -0.0004091999999999985 1.6744463999999875e-07 0.00013422149316 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33746.62109375 187.02734375 1138834435.2451324 34979.227310180664 21014.3046875 18.880859375 356.4868507385254 441601001.4990845 22190.669921875 16.302734375 492425831.5816078 265.77914810180664 1.0533549999999998 28.686646000000003 0.4066551 0.0338280086 0.0172062549 0.0367334701 -0.0188292373 -0.0385027239 0.0007264302000000001 -0.0186967458 -0.0837392092 -0.0862373582 -0.0555246203 -0.012483483899999998 0.046605983 0.087876249 -0.061256956200000004 -0.0102545202 -0.0435628281 -0.0399495978 0.0748944803 0.028417489900000002 0.0583932849 -0.140276671 0.028902471800000006 -0.0452752392 -0.0414119592 -0.0331393663 0.069921775 0.054124660199999994 0.0365800006 -0.021211239 -0.046098743399999996 0.0109941829 0.0525293282 0.0817380938 -0.0863063099 0.034028826 0.0164252187 -0.012992233999999998 0.022766231600000002 0.0372112769 -0.029496429900000006 0.0413279904 0.0062899518000000005 -0.0541370962 0.093826458 0.0339119541 0.0157276788 -0.010039629 0.025413639900000003 0.003860435 0.0386539361 0.0270203314 0.0438558763 -0.0631154191 -0.084647711 -0.0723326205 -0.10519443390000001 0.08757826980000001 0.0463790468 -0.0660590476 -0.0588508652 -0.0068796075 -0.1096931717 0.029753875 0.0174268366 0.0206155001 -0.047482073 -0.1596779838 0.0482710989 0.0470520071 -0.0277306431 0.028607308900000007 0.07562824679999999 -0.027144045 -0.0852640164 0.0734322509 0.04539905 -0.09807852800000001 -0.0983049 0.03991810000000001 0.00966385336401 0.001593454707610001 0.526134 -0.12708300000000006 0.016150088889000016 0.276816985956 2.04637 -0.06377000000000033 4.1876301769 0.0040666129000000405 -0.0271422 0.0020861000000000005 0.0007366990208400001 4.3518132100000015e-06 -0.00206352 -9.898000000000025e-05 4.258114790400002e-06 9.797040400000051e-09 -0.0102528 0.0013325999999999998 1.7758227599999991e-06 0.00010511990784 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33615.46875 -131.15234375 1129999739.2822266 17200.937271118164 20977.8359375 -36.46875 1329.9697265625 440069600.6206665 22132.3359375 -58.333984375 489840294.050354 3402.853733062744 1.081277 29.447062 0.1831144 0.0160922203 0.016570248899999997 0.0105773962 -0.0219447305 -0.1047824465 -0.023806458399999997 -0.0783215793 -0.054175274 0.0214281612 -0.0528129369 0.0106589646 0.012085685300000001 -0.0051857959999999995 -0.0024485379 -0.0536737266 0.023532920099999997 -0.1355792325 0.0566168894 -0.0055108391000000005 0.0104709609 -0.0197666536 0.0320016936 -0.058304374299999996 -0.0491073841 -0.0687928967 -0.0227364371 -0.0399656537 0.0163888913 -0.0222965735 -0.0526460362 -0.069853071 0.07837015530000001 -0.023046521400000002 -0.1007720968 0.017120928 0.0308929606 0.0299206858 0.0118572108 0.0074048742000000015 -0.0337396761 0.10600805640000001 0.0265018731 -0.10754951310000001 0.0295080579 -0.0354845925 0.0013411824 0.0052566953 -0.00035550839999999996 -0.0328428603 -0.0268359277 0.0581848379 0.027928399500000003 0.06742948730000001 -0.0336469515 -0.0377613335 -0.0128231028 0.12580694539999998 0.005919194599999999 -0.0627084309 0.0590371542 -0.0007490282000000001 -0.013762277199999999 -0.049245352400000005 -0.0323096396 -0.0672013377 0.0022146685 0.033158789300000005 -0.0412616166 0.0420408359 -0.0348913653 0.10930563869999999 -0.0759358402 -0.028652455299999997 -0.0835807361 0.0765483213 0.0397147891 -0.09930684570000001 -0.07673249999999998 0.02157240000000002 0.005887876556249997 0.0004653684417600008 0.5141680000000001 -0.011965999999999921 0.00014318515599999812 0.2643687322240001 1.982 -0.06437000000000004 3.928324 0.004143496900000005 -0.026948700000000003 0.00019349999999999926 0.0007262324316900001 3.74422499999997e-08 -0.00247432 -0.0004107999999999998 6.1222594624e-06 1.6875663999999984e-07 -0.00915298 0.0010998199999999996 1.209604032399999e-06 8.377704288039999e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33527.69140625 -87.77734375 1124106091.03273 7704.862075805664 20995.806640625 17.970703125 322.9461708068848 440823896.4905129 22132.2734375 -0.0625 489837527.51226807 0.00390625 1.100233 29.963324 0.2898652999999998 -0.0175747882 -0.0071663234999999985 -0.017639324799999998 0.0078899458 -0.1136708807 -0.0182456096 -0.044318128600000006 -0.0077598956 0.014727465 -0.0676767289 0.0186795371 -0.0440178205 -0.057669284400000013 -0.06889082690000001 -0.0759434762 0.0910100301 -0.024632984 0.0001174234 -0.1363078571 -0.0541878873 -0.026101911499999998 -0.0505094217 -0.0806764465 0.015041976100000003 -0.1647101155 0.0414021633 -0.0530530401 0.052228816399999996 -0.0516582939 -0.0071328899 0.0843873266 -0.0895356952 -0.056966700599999996 0.021705949 -0.0170073071 0.0151442968 0.10001294960000001 -0.0677606674 -0.015270413500000003 -0.0094361785 0.11787444359999999 0.0179188347 -0.0479965209 -0.0088816178 -0.0126796035 0.060812358399999995 0.0155358245 0.0495029883 -0.0604217244 0.0416920269 -0.0088646531 0.0781106921 0.1543274684 0.07982361730000001 -0.085887799 -0.0252168681 -0.012925233999999999 0.0113413399 -0.0523187704 0.0744229339 -0.029415008399999998 -0.0606963653 0.0985633689 0.057002954400000014 0.0178875241 -0.0535924446 0.12286144439999999 0.0224721638 0.0499193667 0.0556959462 0.0849416526 -0.022088024700000004 -0.030153796 -0.0818149717 0.0794944353 0.033873792 -0.09992290359999999 -0.08375929999999998 -0.0070268 0.007015620336489997 4.937591824e-05 0.401175 -0.11299300000000008 0.012767418049000015 0.160941380625 1.84599 -0.13600999999999974 3.4076790801000008 0.018498720099999928 -0.0274302 -0.0004814999999999993 0.0007524158720400001 2.3184224999999928e-07 -0.00249207 -1.774999999999997e-05 6.210412884899998e-06 3.1506249999999903e-10 -0.00897552 0.00017745999999999908 3.149205159999968e-08 8.055995927040001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33609.375 81.68359375 1129590087.890625 6672.209487915039 21036.623046875 40.81640625 1665.979019165039 442539509.2163124 22217.787109375 85.513671875 493630064.03750986 7312.588077545166 1.006823 27.419415 0.2731422000000001 -0.0322592879 -0.0080992692 0.0037738821 0.0214799559 -0.0581711401 -0.0227169618 0.0390032429 -0.009531417700000001 0.0276051964 -0.0281464265 0.0841879526 0.009004679 0.1186418622 0.019998339099999998 0.053800322000000005 -0.0432226657 -0.051194708 0.027594431699999998 0.0011106145 0.036328987400000005 -0.06529113730000001 -0.057376892199999995 -0.026704908599999997 0.1133839449 0.0016901201 0.11060048550000001 -0.13600992720000002 -0.1455941313 0.0418638599 0.050870173899999996 0.0643525054 -0.0476795616 -0.0575523856 0.0343495346 -0.028045090800000002 0.0065597462 0.010928492 0.0140126203 0.006412669 0.0182528863 0.0669290226 0.0151885947 0.0345095138 -0.0052119294 -0.0089233063 0.0254657454 -0.1242512421 -0.007821746800000001 0.09238210449999999 -0.0058504008 0.0530116092 -0.0488459604 0.0044782843 -0.127782113 -0.135056185 -0.1284682506 -0.0546038783 -0.0502784429 -0.039312464500000005 0.0348470243 -0.1058349877 0.035196327 0.0036904534000000004 -0.031454236499999996 -0.05847529730000001 -0.0683780693 0.09807274839999999 0.012296563 -0.0076932838 -0.0471528184 -0.0236673426 -0.0450864092 -0.0316476967 -0.0799684658 0.0822640518 0.0278991106 -0.09992290359999999 -0.09595 -0.012190700000000013 0.0092064025 0.00014861316649000033 0.344659 -0.05651600000000001 0.003194058256000001 0.118789826281 1.7937900000000002 -0.05220000000000002 3.2176825641000013 0.002724840000000003 -0.0292697 -0.0018394999999999972 0.00085671533809 3.3837602499999904e-06 -0.0025061 -1.4029999999999945e-05 6.28053721e-06 1.9684089999999847e-10 -0.0101667 -0.00119118 1.4189097924e-06 0.00010336178889 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33753.375 144.0 1139290323.890625 20736.0 21057.5625 20.939453125 438.46069717407227 443420938.4414063 22247.0078125 29.220703125 494929356.609436 853.8494911193848 1.310552 35.691055 0.935119 -0.046208798899999994 -0.0614779888 -0.0117992283 0.06173362650000001 -0.07460775509999999 -0.08447124869999999 0.0928679609 -0.17626414370000001 -0.0178039321 0.09882822 0.10244174630000001 -0.0907253401 0.1173236686 0.041271624300000004 0.0887805904 0.0796025351 -0.1349861853 -0.014149076200000001 -0.0240128497 -0.015186501100000001 0.036084883 -0.1217525852 0.0488666278 0.0438968431 0.0770187782 -0.1108028548 -0.0405792326 0.06865648190000001 0.115822959 -0.113632234 0.0370737634 0.0657684358 0.057590095999999986 0.0450631018 -0.0574778796 -0.040557611 0.0619681067 -0.030675701200000002 -0.0005357991 0.058839759299999995 0.0902079481 0.0637166633 0.11981193779999999 0.1887720208 0.0192907036 0.013960236599999998 -0.0752865975 0.1196607727 0.1295195701 -0.0308627106 0.09693808279999999 -0.1030374933 0.09800550390000001 -0.0640882048 0.0537745172 0.03803148 -0.0251959771 -0.006173325 0.0855219042 -0.0319847298 0.0510600291 0.09812805390000001 0.0242435575 -0.04578511440000002 -0.1169020054 -0.1447490583 -0.0336740512 0.0406041331 -0.0104763635 -0.062802594 -0.0203757547 0.0128699794 -0.0331337888 -0.0780430407 0.0848510215 0.0218143241 -0.09930684570000001 -0.198057 -0.102107 0.039226575249 0.010425839448999998 0.419295 0.07463599999999998 0.005570532495999997 0.17580829702499998 1.67993 -0.1138600000000003 2.8221648049 0.012964099600000068 -0.0283298 0.0009399000000000003 0.0008025775680399999 8.83412010000001e-07 -0.00503712 -0.00253102 2.53725778944e-05 6.406062240400002e-06 -0.0195861 -0.009419399999999998 8.872509635999996e-05 0.00038361531321 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33770.47265625 17.09765625 1140444823.426529 292.32984924316406 21015.625 -41.9375 1758.75390625 441656494.140625 22301.263671875 54.255859375 497346361.3624916 2943.6982765197754 1.046503 28.500055 0.771511 -0.0544999038 -0.076925548 -0.0330331417 0.0728259899 -0.1064005766 -0.028078854900000002 0.0095764478 -0.0191840548 -0.0036091152 -0.0129838473 0.0197180031 -0.0113048645 0.06863719480000001 0.0509118176 0.07299710849999999 0.1308424648 0.0443231191 -0.062342715599999994 0.1091713346 0.08101840240000001 -0.0318688275 0.0232582214 0.0401308607 -0.053741217300000005 0.0617713184 -0.093996275 -0.052841209900000005 0.0164246403 -0.0371909319 -0.0134353678 -0.1220166138 0.0698539678 -0.015200018000000001 0.1426375962 -0.059716372300000015 -0.0223439623 0.070423689 0.0565891963 -0.031473794 0.0614126285 0.1092668642 0.0176036723 0.0088596119 0.0036370413000000002 0.0054774677 0.0259698069 -0.013802842 0.0097448485 0.1394558399 0.0301894441 0.012367906699999999 0.0555018042 -0.012119663999999999 -0.020407313899999998 0.1163592308 -0.055265956100000006 0.016002874099999998 0.0631923303 0.048375004699999995 0.0527544326 0.10008868679999999 0.0708941615 -0.1373216019 0.0549316175 -0.0714815838 0.0697765525 -0.0478268717 -0.0630475489 -2.06619e-05 -0.0395033263 -0.0045454713 -0.0011183838 -0.034611705699999995 -0.0760405966 0.0872496007 0.015643446499999998 -0.09807852800000001 -0.153798 0.044258999999999986 0.023653824803999995 0.0019588590809999995 0.364474 -0.054821000000000016 0.003005342041000001 0.13284129667599998 1.62278 -0.057150000000000034 2.6334149284 0.003266122500000004 -0.0244335 0.0038962999999999984 0.00059699592225 1.5181153689999987e-05 -0.003658400000000001 0.0013787199999999995 1.3383890560000004e-05 1.900868838399999e-06 -0.0125555 0.007030599999999998 4.942933635999997e-05 0.00015764058025000005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33788.0078125 17.53515625 1141629471.937561 307.48170471191406 21002.208984375 -13.416015625 179.98947525024414 441092782.223362 22281.279296875 -19.984375 496455407.1053505 399.375244140625 1.182974 32.216652 0.5273566999999999 -0.0795197266 -0.1415109293 -0.044861505999999995 0.1280065178 -0.1346415194 -0.0039514536999999995 0.0019606632999999997 0.0690639171 -0.0353328236 -0.08150549809999999 0.04849531519999999 0.0557177307 0.0268616458 0.0224076382 0.0902140501 0.0793510595 0.029034841800000002 -0.058879838399999995 0.07736351400000001 0.0387943994 -0.0643315454 -0.0192300546 -0.0495071866 0.0165178707 -0.0366570251 -0.0068370348999999995 -0.05644673820000001 -0.0189137152 -0.0966732761 0.0684161283 0.1028468969 0.0939633591 -0.028321117200000002 0.021564075499999998 -0.08315558440000001 -0.0791040459 0.1312236858 0.0148815845 -0.039375922599999995 0.10301147810000001 0.1497032785 -0.0028708465000000004 -0.0151986225 -0.07407547769999999 0.04661225099999999 0.0292904618 -0.0613986783 -0.072819309 0.1129968499 0.07009098820000001 0.0399727139 0.0402439089 0.0723240525 -0.0669211961 0.0370254421 -0.0781494826 0.0442539987 -0.0344962801 -0.00234231 0.028438293700000002 0.023901323399999997 0.0319040559 -0.0786481725 0.1340679158 0.08324899320000001 -0.0464435791 -0.0277024167 0.08482838820000001 0.0103085252 -0.0192522655 -0.0562422682 -0.006506063 -0.036081082599999995 -0.0739631095 0.089454464 0.0094108313 -0.0962455236 -0.0954038 0.058394199999999986 0.00910188505444 0.0034098825936399986 0.311913 -0.05256099999999997 0.002762658720999997 0.09728971956900001 1.45814 -0.1646399999999999 2.1261722596 0.02710632959999996 -0.022819 0.0016145000000000016 0.000520706761 2.606610250000004e-06 -0.00295506 0.0007033400000000005 8.732379603599999e-06 4.94687155600001e-07 -0.00983811 0.00271739 7.3842084121000015e-06 9.67884083721e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33954.1796875 166.171875 1152886318.2510376 27613.092041015625 21034.48828125 32.279296875 1041.9530067443848 442449697.25404364 22312.11328125 30.833984375 497830399.07533264 950.734592437744 0.935512 25.477371 0.4425102 -0.07911197889999999 -0.1233713078 -0.0194658827 0.16213541369999998 -0.1133876208 -0.0561999772 0.10959505800000001 -0.0026628496000000003 0.14695394960000002 0.0166716654 0.060780389299999994 0.1318677295 0.1632370414 0.0710302424 0.020913783999999998 -0.0253315607 0.0609463005 -0.004250181 0.06258191589999999 -0.0443344379 -0.08816829550000001 0.0295149681 -0.033509475 0.0083251248 -0.1337258998 0.1426311324 -0.0465321937 -0.0008741744 -0.030283722599999997 -0.1244097126 -0.0230561598 0.0265549347 -0.0358197418 0.0287658989 -0.0855592921 -0.0875799687 0.0198790399 0.0511969145 -0.0095455462 0.1541297718 0.1386929224 0.03056714 0.0964344671 -0.0205905867 -0.1286724381 -0.0845460844 -0.1456183855 -0.0462753683 0.1365524515 -0.0364176814 -0.0346750044 0.0690759987 -0.05672342070000001 -0.0170069765 -0.0047567226 -0.0232981194 0.0332585407 0.0358478867 -0.0629009511 0.0803077424 -0.0729347092 -0.1291768238 0.0413036605 0.0354728275 -0.012437696000000002 -0.0334570638 0.0045763367 -0.0325617126 0.026577535299999996 0.04311933019999999 -0.0312378153 -0.025649848399999998 -0.0375415571 -0.0718126298 0.091460716 0.0031410759000000004 -0.0938191336 -0.0801671 0.01523669999999999 0.006426763922410001 0.00023215702688999976 0.0450045 -0.2669085 0.07124014737225 0.00202540502025 1.48346 0.02532000000000001 2.2006535715999997 0.0006411024000000005 -0.0238518 -0.0010328000000000004 0.0005689083632400001 1.0666758400000008e-06 -0.00349417 -0.0005391100000000002 1.22092239889e-05 2.906395921000002e-07 -0.0109671 -0.00112899 1.2746184200999996e-06 0.00012027728241 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34048.671875 94.4921875 1159312056.451416 8928.773498535156 21094.7421875 60.25390625 3630.533218383789 444988147.9570923 22399.51171875 87.3984375 501738125.23841864 7638.486877441406 1.23116 33.528919 0.33727223999999983 -0.088845657 -0.22445440030000002 -0.0358375477 0.2849644726 -0.08393502380000001 -0.0451763284 0.0665498504 0.0148255296 0.2117146733 0.0877693658 0.0601235898 0.0477262678 0.1088520127 0.0425085953 -0.0094046941 0.08531435970000001 0.0155114831 -0.0015877382999999999 -0.1723172629 -0.0810301943 -0.022232912799999997 0.025303305699999997 -0.09111015119999999 -0.06251532559999999 0.1261842166 0.058450694299999995 -0.1269620197 -0.085699 0.1086853543 -0.025433007200000003 0.046397384900000005 0.0339959776 0.1466022334 -0.0991059094 -0.10980256529999999 -0.1705024255 0.1749717007 -0.0381602279 -0.025496389900000003 0.2919002349 0.12434106380000001 -0.0100991833 0.09462008109999999 -0.0364321613 -0.1559201933 -0.0861180358 -0.0937967893 0.0382847969 0.0907893752 0.0033473709000000004 -0.0569969034 -0.0169560961 0.1017349273 0.14994806800000002 -0.1603676963 -0.0391924035 0.0317816188 0.0486834434 -0.064573353 -0.0285254657 0.032825570400000004 0.0447273108 -0.062081062 -0.1230078883 -0.2045764772 -0.0377984134 0.0016206266 0.0091717065 0.0813814089 -0.009941556899999999 -0.11461345349999999 0.1225522726 -0.0389927688 -0.0695912797 0.0932639023 -0.0031410759000000004 -0.0908143174 -0.0935524 -0.013385299999999987 0.008752051545759998 0.00017916625608999968 -0.00943844 -0.05444294 0.0029640337158436 8.908414963359999e-05 1.23743 -0.24603 1.5312330049 0.06053076089999999 -0.0239202 -6.839999999999971e-05 0.0005721759680399999 4.6785599999999616e-09 -0.00342199 7.21799999999998e-05 1.1710015560100003e-05 5.209952399999973e-09 -0.0112948 -0.0003276999999999985 1.07387289999999e-07 0.00012757250703999994 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34070.3046875 21.6328125 1160785661.4990845 467.97857666015625 21140.90625 46.1640625 2131.1206665039067 446937917.07128906 22293.52734375 -105.984375 497001361.4265289 11232.687744140625 2.328538 63.414501 0.99687904 -0.047586513899999995 -0.0877676658 -0.0160056653 0.16784851039999998 -0.033446523 -0.08722193269999999 0.20545140760000002 0.0556058025 0.012947827299999999 0.1419218136 -0.0557172668 -0.076026186 -0.0454102058 0.0177405508 -0.11485690130000001 -0.06444153429999999 0.1985170197 0.0305065145 0.1757283339 -0.1031664854 0.0560354537 -0.0063652063 0.10147773859999999 0.042492416100000006 0.0745364476 -0.2049717037 -0.0011104628999999999 -0.0273303591 0.0082702465 0.0283167419 0.0880044158 -0.0212204943 0.055109868099999994 0.07996815360000001 -0.044629393200000006 -0.06175503860000001 0.004324192 -0.0878854183 -0.0026580991999999998 0.1667287454 0.0417927364 0.059381825199999995 0.2485232087 -0.0392770666 -0.0091772408 -0.013779795 0.0320048296 0.0157709269 -0.0616012348 -0.1116958158 -0.0788903423 0.1305570234 -0.1134926626 -0.0227410352 0.0900502757 0.09974105259999999 -0.007680503000000002 0.082911647 0.1614893976 -0.00045580949999999995 0.0096850848 0.22620734399999998 0.0273022385 -0.0178502789 0.09269956359999999 -0.06966102 -0.0016995673 0.0005745325 0.0051488903 0.1508198533 -0.0033137688 0.0426280662 -0.0404343596 -0.0673012514 0.09486001949999999 -0.0094108313 -0.0872496007 -0.197111 -0.1035586 0.038852746320999984 0.010724383633959998 0.218254 0.22769244 0.0518438472331536 0.047634808516 1.7172 0.47977 2.94877584 0.2301792529 -0.0222493 0.0016708999999999995 0.00049503135049 2.791906809999998e-06 -0.00183113 0.00159086 3.3530370769e-06 2.5308355396000003e-06 -0.0108394 0.0004553999999999999 2.0738915999999992e-07 0.00011749259235999998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34747.19140625 676.88671875 1207367310.622574 458175.63002014154 21094.333984375 -46.572265625 2168.9759254455566 444970926.24435806 22371.763671875 78.236328125 500495809.790226 6120.923038482666 2.568084 69.938187 1.129061205 0.0871611322 0.033416037 0.0932323146 -0.0337406035 0.10688353960000001 0.0294165305 0.1201376751 -0.0326763459 0.0565627811 -0.1873840505 0.0912027644 -0.0146242688 0.0830749604 0.103401243 -0.1002637358 -0.0593515015 0.1184540484 -0.030603545099999997 -0.09888669 0.10570984900000001 0.1365807986 0.13463261880000002 0.013364474 0.0667769251 0.056889706 -0.1450379425 -0.028451417200000002 -0.0391407654 0.0890735821 -0.0320960976 -0.1621170371 0.031606718900000004 0.0392049746 -0.0212016685 0.0746718671 -0.1202983985 -0.26156608929999997 0.0167255899 0.09245328550000001 -0.042764126900000005 -0.0938347922 -0.0188746904 0.023418335 -0.0257859955 -0.048965426299999996 0.1357638784 -0.10612364640000001 -0.0407813965 0.0794568889 -0.0874791421 -0.1239994135 -0.0029148066999999996 -0.1440110899 0.1461335818 0.0244115539 -0.0527293792 0.0825997561 -0.11718959849999999 0.05885273 0.0202451893 -0.0681040153 0.15048264220000002 -0.0004718912 -0.083125376 -0.0112543647 0.0835434362 -0.097191821 0.0138532607 -0.018661459 -0.08553478119999999 0.054549349000000004 0.0215650689 -0.0418659738 -0.0649448048 0.0962455236 -0.015643446499999998 -0.08314696120000001 -0.309206 -0.112095 0.09560835043600001 0.012565289025 0.417493 0.199239 0.039696179121 0.17430040504900002 2.19953 0.4823299999999997 4.837932220899999 0.2326422288999997 -0.0268715 -0.0046221999999999965 0.0007220775122499997 2.1364732839999968e-05 8.67141e-05 0.0019178441 7.519335138810001e-09 3.6781259919048103e-06 -0.0110073 -0.00016790000000000034 2.8190410000000114e-08 0.00012116065329 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33426.16796875 -1321.0234375 1117308705.0750883 1745102.9224243162 21054.55859375 -39.775390625 1582.081699371338 443294437.577652 22094.982421875 -276.78125 488188248.2229653 76607.8603515625 1.040846 28.345991 0.2138774049999997 0.0769938071 0.057962635199999994 0.0818157887 -0.07788372519999999 0.0242028683 0.010972411599999999 -0.076358735 -0.040031299 -0.046434331100000004 0.022599669500000003 -0.0133527154 -0.0349728917 0.047836405 0.0086667927 0.0750812651 -0.04884637 0.099211806 -0.0746916386 0.0580506088 0.21137677149999998 0.06754925980000001 0.0688757004 0.0966384644 -0.08878522539999999 0.0410324284 -0.016455066799999998 -0.0197380901 -0.1169197984 0.0234093633 -0.0308450965 -0.0255407478 0.061868291299999996 -0.0304689186 0.16154198460000002 0.0878542434 0.10636184439999999 0.0190639809 0.045292310499999995 0.0790369404 -0.0620035912 -0.0441174458 -0.0115846844 -0.0578548318 0.051572113600000004 0.0246557269 0.024431593300000002 -0.0120025722 -0.0042105224 0.0643289567 -0.0025093966 -0.0601111999 -0.0188985725 -0.1199517841 0.0046948479 0.0671823175 -0.1384456332 0.0219602014 -0.1706745498 0.0765639749 0.08886507699999999 0.1213818778 0.1143800084 -0.0508967954 0.0139347229 0.025556451600000002 0.055237557699999995 -0.1173720481 -0.1568353465 -0.0436173378 0.1208764806 -0.0689228848 -0.1287632083 -0.043287258200000005 -0.06252426559999999 0.0974173387 -0.0218143241 -0.0785316931 -0.27975900000000004 0.029446999999999945 0.07826509808100003 0.0008671258089999968 0.512424 0.094931 0.009011894760999995 0.262578355776 2.21367 0.014140000000000262 4.9003348689 0.00019993960000000744 -0.0270931 -0.00022160000000000235 0.0007340360676099999 4.9106560000001035e-08 -0.000569274 -0.0006559881000000001 3.2407288707600004e-07 4.3032038734161006e-07 -0.0103777 0.0006295999999999993 3.9639615999999907e-07 0.00010769665729000001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33359.046875 -67.12109375 1112826008.4084473 4505.241226196289 21015.46875 -39.08984375 1528.015884399414 441649926.78222656 22044.3046875 -50.677734375 485951369.1553345 2568.232761383057 0.833844 22.708593 0.13292405 0.0753818115 0.0668471304 0.07044436379999999 -0.0983251858 -0.007184969300000002 0.0228834249 -0.1232929443 -0.0318089229 -0.1343805951 -0.0650218245 -0.0337317491 0.0031441498 0.0934098465 -0.053369243 0.0598993766 -0.0828124163 0.0725100251 -0.043416324900000004 0.021721956299999998 0.0394042867 -0.0032366124 0.09995047160000001 0.0779630057 -0.0694176111 0.057110622300000004 0.0183705361 0.004015287199999999 -0.1182169084 0.0790701908 -0.012533351000000002 -0.0129891611 0.0189086706 -0.0094329574 0.11831115689999999 0.0850458043 0.09694648189999999 0.035350556 0.0044756306 0.06551354549999999 -0.1025471382 -0.0222861964 -0.0141687902 -0.1374071466 0.0520672517 0.0784093806 0.0403464298 0.0068722607 0.0220414629 0.05954752570000001 0.0796527073 -0.0759421316 -0.048842547800000004 -0.13253042880000002 -0.0139063478 0.0006737269 -0.059576246299999996 0.069516106 -0.07294945580000001 0.025858402000000003 0.0006740496 0.07433863809999999 0.0384960513 -0.0338290059 -0.0655130409 0.014238306599999999 0.0104382018 -0.0021974435999999996 -0.10205489820000001 -0.008500626800000001 0.054860760599999996 -0.08583919300000001 -0.0144949624 -0.0446978621 -0.0600420225 0.0983728629 -0.0278991106 -0.0734322509 -0.263175 0.016584000000000043 0.069261080625 0.00027502905600000144 0.568972 0.056548000000000036 0.0031976763040000053 0.3237291367840001 2.19964 -0.014029999999999987 4.838416129600001 0.00019684089999999962 -0.0268623 0.00023079999999999976 0.0007215831612899999 5.3268639999999884e-08 -0.000141633 0.000427641 2.0059906688999997e-08 1.8287682488100005e-07 -0.0101209 0.0002567999999999997 6.594623999999987e-08 0.00010243261681 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33664.609375 305.5625 1133305924.3713381 93368.44140625 21074.509765625 59.041015625 3485.841526031494 444134961.86142355 22079.560546875 35.255859375 487506993.9431191 1242.9756202697756 0.885656 24.119596 0.2846578 0.0631188344 0.065784309 0.054123858 -0.0622361451 0.0010590324 -0.029671162200000007 -0.0049019586 0.0201797504 -0.0430426517 0.0465551787 -0.0553648126 -0.0634301218 -0.0270837443 -0.024404315 -0.0439160237 -0.1477352258 -0.09300171300000001 -0.0519533037 -0.0209193779 0.09869884 -0.0021693323 -0.0008186688000000001 -0.0366266029 0.09063211759999999 0.16420079 -0.0505593957 0.0953943715 0.0103950928 -0.040214068900000004 -0.062209363499999996 -0.08267970919999999 -0.0341883589 -0.0273782167 0.0007455271000000001 0.0724578491 0.055632656600000004 -0.0167623676 -0.025234428 0.0514086926 -0.055912622099999996 -0.0103666451 0.0420736871 0.0154042234 -0.006090041 0.0160300824 0.002770527 0.0478429032 0.0512673231 -0.1301943124 -0.058860126799999996 -0.016179266799999998 -0.16597628890000002 -0.0061458447 -0.0844260614 0.08996642640000001 -0.0148978276 -0.055609675899999995 -0.08691195609999999 -0.0160150062 -0.07808297389999999 -0.0461787538 0.0551201645 0.0167461283 0.0745622067 -0.051344307699999994 0.1049680198 -0.0348478764 -0.1399674786 -0.023971894700000003 0.015306656299999999 -0.1032583503 -0.007401544300000002 -0.0460974375 -0.057500525199999986 0.0991099747 -0.033873792 -0.06788007459999999 -0.205348 0.05782699999999999 0.042167801103999994 0.003343961928999999 0.471514 -0.097458 0.009498061763999996 0.22232545219600006 2.16074 -0.038899999999999935 4.668797347600001 0.0015132099999999947 -0.0264338 0.0004285000000000018 0.0006987457824399997 1.8361225000000159e-07 -0.000495649 -0.00035401599999999997 2.4566793120100003e-07 1.25327328256e-07 -0.00909396 0.0010269400000000005 1.054605763600001e-06 8.27001084816e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33717.32421875 52.71484375 1136857952.4723053 2778.854751586914 21059.15625 -15.353515625 235.73044204711914 443488061.96191406 22093.830078125 14.26953125 488137327.52106094 203.61952209472656 0.950486 25.88516 0.2279468000000001 0.08538861269999999 0.0483258137 0.0762265986 -0.0756358778 0.0014195338 0.0283270972 -0.08740712390000001 0.0474133926 0.09009601310000001 -0.0232425171 0.029721642000000006 -0.0501724273 -0.0422089441 -0.1626965826 -0.1090234025 -0.0413494097 0.0144865531 0.0419164484 -0.024385451699999998 0.0089102558 0.045155255199999994 -0.1530358486 0.0211825339 -0.045554215300000006 0.0550196338 -0.014452631200000001 0.1032708929 0.0700648039 -0.042599402599999996 -0.11683287630000001 -0.0629211572 -0.0366070913 0.1113597085 -0.0046079011 0.0892439081 0.0372756969 -0.010631583899999998 0.0112110049 0.0757346522 -0.0694867106 -0.0061721159 -0.0239544667 -0.0877693626 -0.0744583759 -0.0605332984 -0.0209345048 -0.0382738168 0.1192744906 -0.1567010532 0.0338306977 -0.034344852 0.0412691342 -0.0158490439 -0.0070670838 0.030462394500000007 0.0875960193 -0.1535424768 0.043515306 -0.0349986301 -0.041034779 0.0370041933 -0.06341337030000001 0.06664720610000001 -0.020466382800000002 -0.0159926089 -0.0177515036 -0.1426696199 0.0210722886 -0.049692719 0.0530444721 0.0139209499 0.034442370699999995 -0.047485639 -0.054902281799999994 0.0996270376 -0.0397147891 -0.06190939490000001 -0.166972 0.038375999999999987 0.027879648784000004 0.0014727173759999995 0.5322439999999999 0.0607299999999999 0.0036881328999999866 0.2832836755359999 2.23267 0.07193000000000005 4.984815328900001 0.005173924900000007 -0.0266111 -0.00017730000000000176 0.00070815064321 3.1435290000000625e-08 -0.00013576299999999998 0.00035988599999999996 1.8431592168999995e-08 1.2951793299600002e-07 -0.00849293 0.0006010300000000008 3.612370609000008e-07 7.212985998489997e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33764.80859375 47.484375 1140062299.372574 2254.765869140625 21073.791015625 14.634765625 214.17636489868164 444104667.77023697 22178.794921875 84.96484375 491898944.1865883 7219.024673461914 0.878492 23.924501 0.15591835000000007 0.1014804528 0.0488573971 0.09490560599999999 -0.093227818 0.0470660876 0.035377875 -0.0693575534 0.0007774711 -0.04219495980000002 0.0083947711 0.0331618176 0.0285823358 -0.0419635359 -0.1133324094 0.035769067 -0.041118399900000005 0.021570267599999998 0.0684105739 -0.08622275730000001 -0.0634906063 -0.0037344011 -0.053350124699999994 -0.0314407976 0.030810363900000002 0.0677005331 -0.0719766766 -0.0511870055 -0.0329494327 -0.1990297859 0.0016547774 0.000411899 -0.0330325905 0.0690262909 0.0333844256 0.10578726720000001 0.0225441279 -0.031047465899999998 0.0130670975 0.08889454960000001 -0.0934615534 -0.0625702551 -0.0163041544 -0.0740363061 0.0181454946 0.0350643211 -0.0464096488 -0.026467293599999997 0.0403991816 -0.0895564917 0.0827496288 0.040530626 -0.056647112 -0.027311417 0.0665365569 -0.1061432244 0.08013158 -0.0458819669 0.0674868494 -0.058297678799999995 0.0882604664 -0.0166203095 0.08841417289999999 -0.0593595568 0.0632671147 -0.0523605504 0.0313312872 -0.039580523199999995 0.0707523005 -0.007361923 0.0918746912 -0.0207078974 -0.0005458963 -0.0488621241 -0.052249856500000004 0.09992290359999999 -0.04539905 -0.0555570233 -0.190373 -0.023401 0.036241879128999996 0.0005476068010000002 0.530826 -0.0014179999999999193 2.010723999999771e-06 0.281776242276 2.3073 0.07462999999999997 5.323633290000001 0.005569636899999996 -0.0273183 -0.0007072000000000017 0.00074628951489 5.001318400000022e-07 -0.00018503 -4.926700000000003e-05 3.4236100900000004e-08 2.427237289000003e-09 -0.008865849999999998 -0.0003729199999999988 1.3906932639999908e-07 7.860329622249996e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33936.109375 171.30078125 1151659519.5119631 29343.95765686035 21093.02734375 19.236328125 370.036319732666 444915802.5241852 22203.529296875 24.734375 492996713.2371864 611.789306640625 0.95178 25.92041 0.2192028500000001 0.0771837075 0.049718634299999995 0.0843932135 -0.0761100631 0.0404368541 -0.0030943547 0.0085020347 0.030823869 -0.0216958571 0.023383400699999998 -0.0005520065 0.0006056705000000001 0.014646370700000001 -0.0676304855 -0.0450151208 -0.1241647974 -0.105069428 0.022942296 0.024962007 0.0147035479 -0.0025454157 -0.0508657872 -0.0134659126 0.0162852611 0.12324665230000001 -0.0436638066 0.040068766 0.0245123548 -0.10596521619999999 -0.09330256880000001 0.0158016613 0.0485282353 -0.0544788732 -0.0135451298 0.0832353763 0.0168242883 -0.07549561440000001 0.0211044783 0.0818439641 -0.0665333847 -0.0464050704 0.013991233300000001 0.0062301039 -0.014017444099999998 0.019695772900000002 -0.0333371007 -0.0196637097 0.0569498323 -0.11117398740000001 -0.0256728292 -0.0075214866 -0.1044351843 -0.0181607482 -0.1460666891 -0.0277188346 0.06569019179999999 0.0117083555 0.0006950814999999999 -0.0105868951 0.0080681115 0.0737157767 0.0265792879 0.0002182861 0.1124112333 -0.0797133697 -0.0208319686 -0.091097695 -0.0064657348 -0.0444659001 -0.0230571732 -0.0655301657 -0.038468961499999996 -0.050226553300000004 -0.0495458668 0.0999969158 -0.0509041416 -0.0488621241 -0.190185 0.00018800000000002148 0.036170334225 3.5344000000008075e-08 0.452452 -0.078374 0.006142483876 0.20471281230399999 2.20166 -0.10564000000000018 4.8473067556 0.011159809600000035 -0.027432400000000003 -0.00011410000000000242 0.0007525365697600003 1.3018810000000546e-08 -0.000318657 -0.000133627 1.01542283649e-07 1.7856175129000005e-08 -0.00931814 -0.0004522900000000028 2.045662441000025e-07 8.682773305960003e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33803.34765625 -132.76171875 1142666312.7693026 17625.673965454098 21068.44140625 -24.5859375 604.4683227539062 443879223.2885895 22211.265625 7.736328125 493340320.6643066 59.85077285766602 0.711101 19.365858 0.17385024999999954 0.0726979984 0.0539637249 0.050530465499999996 -0.08389947689999999 0.021469379700000003 -0.0098553102 -0.031365078399999996 -0.0327385013 -0.0750425689 0.0277018013 -0.0617836701 -0.0569211378 -0.08261015669999999 -0.0564909898 -0.0464608137 0.045476654000000005 -0.09157419259999999 -0.0152130264 -0.06467394259999999 0.0863546291 0.019119633400000002 0.0210561023 0.0231811481 0.012620100300000001 0.0164367758 -0.0667823208 -0.1157764342 -0.069803553 0.0535073439 -0.1455961641 0.0012148265 0.101095071 -0.10941565380000001 0.0084258087 0.0738975902 0.0383925545 -0.0139921378 -0.0140178366 0.0427646587 -0.0875264333 -0.0377044982 0.0210125045 -0.017449861100000002 0.0408782232 0.057811987 0.0013939851000000002 0.1225159883 0.05361472 -0.0743070238 0.0007950946000000001 0.0121603349 -0.021876572200000003 0.0591648531 -0.0039234449 -0.0143026747 -0.0599151042 0.027697769900000002 -0.0768635371 0.0651136185 0.0963836799 0.0390533158 0.0813705265 -0.046586317099999996 -0.0122721841 -0.0988020847 -0.051445877599999995 0.0062162127 -0.0701383612 0.0789993365 -0.11402539390000001 -0.0509294562 0.021497021800000002 -0.051578589800000005 -0.046792981399999996 0.0998489097 -0.0562083378 -0.0418659738 -0.210827 -0.020641999999999997 0.044448023928999984 0.00042609216399999976 0.402322 -0.05013000000000006 0.0025130169000000067 0.16186299168399998 2.16584 -0.03581999999999974 4.690862905600001 0.0012830723999999814 -0.0267748 0.0006576000000000048 0.0007168899150399999 4.324377600000062e-07 -0.000476112 -0.00015745499999999998 2.26682636544e-07 2.479207702499999e-08 -0.00984825 -0.0005301099999999987 2.8101661209999854e-07 9.698802806249997e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33898.48046875 95.1328125 1149106978.0902252 9050.252014160156 21058.48828125 -9.953125 99.064697265625 443459928.69154364 22268.13671875 56.87109375 495869912.924942 3234.321304321289 0.984578 26.813599 0.38855795000000015 0.0722685074 0.0488947202 0.0515879109 -0.0967819558 0.0628693243 0.0381333228 -0.055880728899999996 -0.0147242559 -0.0290961015 0.0106694047 -0.0117234992 0.0808813644 0.0354031119 -0.0037699649 0.0285173449 0.0225284181 0.011088488300000001 -0.045312951799999994 -0.1705486602 0.0400441686 -0.1373019546 0.0552031755 0.0324659864 -0.0214372569 0.0426515312 0.13479496 -0.050255107199999996 0.0037893442999999997 -0.038560876800000005 -0.11277232820000001 -0.027174132 -0.012244706599999999 0.0188024527 -0.041785042200000004 0.07630755 0.0222251844 -0.0706756333 0.0509476732 0.0428445005 -0.08906164679999999 -0.0706839641 -0.025313304900000003 -0.0579810757 0.025794252200000003 0.0178093604 -0.0694470574 0.0141513998 0.0005822781999999999 0.047054600300000006 0.042742376900000004 -0.055405529800000006 -0.1010296032 0.0242580534 0.1256626894 -0.084328921 -0.14469170480000001 0.0153909777 0.030722951000000002 0.007617108 -0.00667863 -0.0169192407 -0.19101055 0.0286755842 0.0631366392 -0.10586815990000001 -0.0283535575 -0.0018564431 -0.066733842 -0.0300820038 0.0062862108 0.0299748788 -0.0027128029999999997 -0.0529179001 -0.043993917 0.0994792142 -0.0612907054 -0.034611705699999995 -0.220054 -0.009227000000000013 0.048423762916 8.513752900000024e-05 0.5581 0.15577800000000008 0.024266785284000027 0.3114756100000001 2.16163 -0.00421000000000049 4.672644256899999 1.7724100000004135e-05 -0.025993 0.0007817999999999957 0.0006756360490000001 6.112112399999933e-07 0.000929757 0.001405869 8.644480790490002e-07 1.9764676451610005e-06 -0.00764906 0.0021991899999999997 4.836436656099997e-06 5.85081188836e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33881.828125 -16.65234375 1147978277.092041 277.3005523681641 21072.43359375 13.9453125 194.47174072265625 444047457.56300354 22232.658203125 -35.478515625 494291090.77698135 1258.7250709533694 1.008983 27.47826 0.22725685000000004 0.0466682262 0.06685244480000001 0.0238059462 -0.0833274519 0.0296164093 -0.030326961099999997 0.0097410095 0.016586253999999998 -0.1522538265 0.0159661556 -0.0600826486 0.0403414408 -0.049255678 -0.030423923199999998 -0.045778872699999994 -0.0219377573 -0.0811837358 0.048698405599999994 -0.0252822786 0.0187514734 -0.14204217130000002 0.058923144800000014 -0.0701165716 0.0347762482 0.1000537648 0.0104745563 0.0259005668 0.0039481635 0.0360777045 0.0200058363 -0.0523521309 0.0084067647 0.0056308723 -0.0450956738 0.053077743399999995 0.0368550707 -0.056767747699999996 -0.015509386200000001 0.024216486000000002 -0.0929802515 -0.0421138649 0.0560536729 -2.21213e-05 0.0111877482 0.1182883314 -0.051340091100000006 0.0944046776 0.018203766200000002 -0.07663441309999999 -0.0064354413 0.027648394500000003 -0.025679883799999997 -0.0010955208 -0.0517881234 -0.0213630254 -0.1373055902 0.0452589812 0.0422759154 -0.023652281400000003 -0.1136103627 -0.0801309509 0.0252375975 0.047011084800000005 0.0016329429000000002 -0.038907065899999996 0.045946212199999996 0.009809639399999999 -0.0742369945 0.1412355629 -0.0597731658 -0.039633746 -0.0837560203 -0.0542441537 -0.0411514359 0.0988886499 -0.06613118650000001 -0.027144045 -0.21123000000000006 0.00882399999999997 0.04461811290000001 7.786297599999947e-05 0.5158159999999999 -0.0422840000000001 0.0017879366560000086 0.2660661458559999 2.06149 -0.10013999999999967 4.2497410201 0.010028019599999934 -0.0250186 0.0009744000000000037 0.0006259303459599999 9.494553600000072e-07 0.00040987 -0.000519887 1.679934169e-07 2.7028249276900003e-07 -0.00762317 2.588999999999977e-05 6.702920999999879e-10 5.81127208489e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33801.25 -80.578125 1142524501.5625 6492.834228515625 21078.408203125 5.974609375 35.69595718383789 444299292.3775673 22187.072265625 -45.5859375 492266175.72006613 2078.0776977539067 0.8783229999999999 23.919912 0.2702680000000003 0.047804544000000004 0.068374926 0.0324053936 -0.0949473316 0.0266911383 -0.016238241599999998 -0.007316324 -0.0051992207 -0.039350463100000004 0.0186972441 -0.0147264476 0.0367193964 -0.08706238820000001 0.0040506326 -0.1245734072 0.06653668730000001 -0.1216910301 -0.09436723539999999 -0.09834632210000001 -0.005191987 -0.0984476796 0.0276474539 0.0547178424 0.17211762600000002 0.0816055319 0.0496591782 -0.0842256105 -0.058364802 0.0594469409 0.0710152417 0.0761606285 0.0226754365 -0.0005402723000000001 -0.0333548024 0.0528036429 0.049579881500000006 -0.0362088571 -0.0141368864 0.0263337919 -0.0989359751 -0.0329783492 0.0272752023 -0.0141528352 -0.0029656365000000004 0.059580745199999986 -0.0514223977 0.0723065661 -0.0356077388 -0.0769907887 -0.0181031034 -0.0234601011 -0.049580973099999995 0.1909703996 -0.0205496789 -0.080128659 -0.1309292296 -0.0273200919 -0.0141596738 0.11123835259999999 -0.036780255 -0.1549796609 0.06502703 0.0074698349 -0.029295262000000002 -0.046676822300000004 0.006651311500000001 -0.0031828757 0.0694971606 0.054397564 -0.0366272282 0.0507676692 0.0048387317 -0.0555570233 -0.0382683432 0.09807852800000001 -0.0707106781 -0.0195090322 -0.223934 -0.012703999999999991 0.05014643635600001 0.00016139161599999983 0.390793 -0.12502299999999994 0.015630750528999985 0.152719168849 2.06923 0.007740000000000079 4.2817127929000005 5.990760000000124e-05 -0.0264985 -0.0014799000000000027 0.0007021705022500001 2.190104010000008e-06 0.00138752 0.00097765 1.9252117504e-06 9.557995225e-07 -0.007584699999999998 3.847000000000225e-05 1.4799409000001731e-09 5.752767408999998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33685.8515625 -115.3984375 1134736595.4907837 13316.799377441406 21072.57421875 -5.833984375 34.03537368774414 444053384.2047272 22145.642578125 -41.4296875 490429485.1980629 1716.4190063476562 1.013005 27.587778000000004 0.1872239999999998 0.0608363209 0.0918036637 0.0319497526 -0.09209191720000001 0.0169503226 -0.0157513315 -0.0195705989 0.061143904299999996 -0.051784461100000005 -0.0210666421 -0.0387676108 0.0237623354 -0.0372769726 -0.0393469773 -0.048056388600000007 0.049339426900000004 0.0149794483 -0.0543263469 -0.1094866526 0.0238556712 -0.1128270227 0.018972749599999998 -0.0914868065 0.17791499460000001 0.0358127211 0.0492398204 -0.1101735217 0.0254125432 0.028982146099999998 0.101091526 0.0476481856 -0.0785879686 -0.0192880486 -0.030923555499999998 0.06539724870000001 0.0633774819 -0.029289742 -0.0565832685 0.03183169 -0.099035107 -0.029927772000000002 0.0362572521 -0.0271673381 -0.0441491583 0.0508767813 -0.014502483799999999 0.0671965043 0.0067676528 -0.0107274476 0.0505965318 -0.05304743 -0.0342719718 0.0775658756 0.055661937 -0.0317000474 -0.1579967953 -0.023408040499999998 -0.0091381159 0.0156670919 -0.0240469352 -0.1443167316 0.033907916 0.0092795293 0.09024822619999999 -0.0756212751 -0.011439488400000001 0.0806026696 0.1374590801 -0.0159706182 0.041897832 0.0924907724 0.039040561200000004 -0.0568561851 -0.0353474844 0.0970506473 -0.07501110700000001 -0.0117537397 -0.215769 0.008165000000000006 0.04655626136100001 6.66672250000001e-05 0.369034 -0.021758999999999973 0.0004734540809999988 0.13618609315600005 2.1003 0.031069999999999712 4.411260089999999 0.000965344899999982 -0.0249197 0.0015788000000000015 0.0006209914480900001 2.4926094400000055e-06 0.00102512 -0.00036239999999999986 1.0508710144000002e-06 1.3133375999999995e-07 -0.0070013 0.0005833999999999977 3.4035555999999746e-07 4.901820169000001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33919.90234375 234.05078125 1150559775.0095367 54779.76820373535 21115.4296875 42.85546875 1836.5912017822266 445861370.8877564 22254.103515625 108.4609375 495245123.28415304 11763.774963378906 1.215802 33.110664 0.4735422000000004 0.074173893 0.0853439497 0.0822201429 -0.1020807393 0.09777265789999999 0.0459746782 0.0015754195000000002 -0.0140601922 -0.013165188700000002 -0.0819615771 0.031846808 -0.0738122738 0.1307103361 0.0324195501 0.0788166795 0.0073688227 -0.0229616597 0.0047623896999999995 -0.0413176284 0.029597533399999997 -0.0363843321 -0.0687558855 -0.0462271046 0.011708447 0.0948661091 0.1069204169 0.0567372328 -0.10780198099999999 0.0915996572 -0.0315287904 0.043918701100000006 -0.09598062869999999 -0.0084599646 0.0052905913 0.0795357569 0.0271375615 -0.11720978189999999 0.0312861518 0.0814373295 -0.09787191320000001 -0.1077534898 -0.0410135671 -0.0170455872 0.0106805442 -0.0170629611 0.1209682601 -0.0384926876 0.0515937532 0.1329495733 0.0490880749 0.011468695400000001 -0.0470635501 0.0085248507 -0.0374321692 -0.0986306468 -0.0590331043 -0.0867646986 -0.0396212605 -0.0638519904 -0.093935034 -0.021946237799999997 0.061069583 0.0855286019 0.0122356374 0.0136113374 0.0059094909 -0.0122672193 0.0374550382 -0.0521447242 0.0608038767 -0.0364053803 0.2682271563 -0.058141318399999996 -0.0323917418 0.09580728990000001 -0.0790155012 -0.0039259816 -0.24711100000000005 -0.031342000000000016 0.06106384632100001 0.0009823209640000006 0.445798 0.07676399999999994 0.00589271169599999 0.198735856804 2.13607 0.0357700000000003 4.5627950449000005 0.0012794929000000215 -0.0277286 -0.0028089 0.0007688752579600001 7.889919209999997e-06 0.000722196 -0.000302924 5.215670624160001e-07 9.1762949776e-08 -0.0104828 -0.0034814999999999985 1.212084224999999e-05 0.00010988909583999998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33907.875 -12.02734375 1149743987.015625 144.65699768066406 21062.939453125 -52.490234375 2755.224704742432 443647418.4060097 22296.3671875 42.263671875 497127989.75982666 1786.217960357666 1.779165 48.453094 0.6862239 -0.0171603715 0.0294735156 -0.0251668155 -0.037875612 -0.0541172218 -0.0436327234 0.0261815689 0.08955587820000001 -0.0041809482 -0.0807846392 -0.108270255 -0.1701136946 0.0181126126 0.0207138223 -0.06285121639999999 0.0288343637 -0.13700651619999998 -0.0811882929 -0.0721375157 0.0082751031 0.032499971 -0.0823393175 0.0072254342 -0.009318951899999999 0.0329806229 -0.1272207468 -0.1059486118 0.0561507775 0.1056779525 -0.054128845700000004 -0.0383207215 0.10895081529999999 0.0124006976 0.07413142219999999 -0.018134696000000002 -0.0003896735 0.0187818345 -0.1229794791 -0.0240326062 -0.0518578762 0.0544450592 0.0534920599 0.014550549099999999 -0.09443764199999999 -0.0225962068 0.14736778720000002 0.1160810928 0.08971163189999999 -0.0075988752 -0.049751461500000004 -0.0605833289 -0.10653275 0.1062998449 -0.046183424 0.0543597253 -0.0039715611 -0.0058094165 0.0115474133 0.047225353899999996 0.0605482134 0.0679111745 0.1261874809 -0.05743765610000001 -0.1002728667 -0.050234273200000006 -0.0716198537 -0.040550967 0.0715106522 0.0203833374 0.0138456251 0.0443382545 -0.033311782000000005 -0.059412106299999996 -0.0294040325 0.09435121640000001 -0.0827080574 0.0039259816 -0.276568 -0.029456999999999955 0.07648985862399997 0.0008677148489999974 0.315429 -0.13036899999999996 0.01699607616099999 0.099495454041 1.77174 -0.36433 3.1390626276000004 0.13273634890000002 -0.0270696 0.0006590000000000032 0.0007327632441599997 4.3428100000000436e-07 -0.000221562 -0.000943758 4.9089719844000005e-08 8.906791625640002e-07 -0.0121214 -0.0016386000000000007 2.685009960000001e-06 0.00014692833796000002 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33640.0 -267.875 1131649600.0 71757.015625 21030.787109375 -32.15234375 1033.773208618164 442294006.43985367 22223.947265625 -72.419921875 493903832.06528085 5244.645084381104 0.888503 24.19713 0.2771113499999999 -0.015171583600000003 0.0417890031 -0.021402119 -0.057326101399999996 -0.058048182300000015 -0.02603278 -0.014313214199999999 0.015252695600000001 -0.0075462336 -0.024097961299999998 0.0062698277 -0.0303873432 0.0390648007 0.0459489137 0.0742880059 0.0576528656 -0.00048743660000000004 -0.0045291435 0.11808238539999999 0.10056236869999999 0.020517576399999998 -0.0427753466 -0.0047048994 0.029372432999999996 -0.0301301919 -0.0908825385 -0.0798767532 0.0043272284999999995 0.0422021622 0.0039541537 -0.008029991 -0.0310787804 -0.019350978300000002 -0.0510992183 -0.014021730900000001 0.0648516877 0.0222050006 0.007023010600000001 -0.019146271399999998 -0.05955468360000001 0.0500490504 0.023145705 -0.0149996717 -0.0205302848 0.0118264341 0.0377651012 -0.0017165193 -0.0111121972 0.1018893018 -0.0287457517 0.061840985599999995 0.0245835077 -0.035198556400000004 -0.06909221389999999 0.1384442775 -0.0055728614 -0.0383642419 -0.054496551500000004 0.0105889946 0.07818930519999999 0.024128875 0.03643983 0.0450272267 -0.0048319046999999995 -0.0099654472 -0.0069030873 0.0023723344 0.0930017617 -0.0015328989 -0.013254611000000001 0.09508687240000001 -0.0015393797 -0.060668235099999995 -0.026387305 0.09268565960000001 -0.08607420269999999 0.0117537397 -0.269858 0.006709999999999994 0.072823340164 4.5024099999999907e-05 0.313386 -0.002043000000000017 4.17384900000007e-06 0.098210784996 1.7734900000000002 0.0017500000000001403 3.145266780100002 3.062500000000491e-06 -0.0240012 0.0030683999999999954 0.0005760576014400001 9.415078559999972e-06 0.000685105 0.000906667 4.69368861025e-07 8.22045048889e-07 -0.0107643 0.0013571 1.8417204099999998e-06 0.00011587015449 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33959.80078125 319.80078125 1153268069.102188 102272.53968811037 21064.658203125 33.87109375 1147.250991821289 443719825.21448135 22289.138671875 65.19140625 496805702.7340736 4249.919448852539 1.211796 33.001587 0.6496782449999997 0.0066844795999999995 0.0319221763 -0.0047653182 -0.0077058967 -0.0307545975 -0.054830057 0.1083614391 0.0101144149 -0.021745373399999997 0.0483713291 -0.0768596905 0.10825797890000001 -0.0110434608 -0.048703223600000005 -0.0654003066 -0.0400990961 0.0835527269 -0.0657213453 0.1265679428 0.0794296472 -0.032593442599999994 -0.006370909300000001 -0.0120953018 0.037070311 -0.0996530265 0.07541899690000001 -0.043323176500000005 0.05120798730000002 0.0400077534 -0.026651811299999998 -0.0153011391 0.021290649 -0.0197090233 -0.072630472 -0.0008837619 0.0108607756 -0.0506264775 -0.026744888300000002 -0.000898118 -0.0081999458 0.032676569100000004 0.0642300942 0.102240605 -0.0103434545 0.003186118 -0.0856125971 0.035760311600000004 -0.057986000999999995 -0.0231336304 0.007694331899999999 -0.0947263253 0.09028089460000001 -0.0968977383 -0.101516854 0.0878251498 -0.08419664519999999 0.0225635652 -0.08402087800000001 0.0034284483000000003 0.0379807125 -0.0344254596 -0.0805492476 0.011194649 0.012740375900000002 0.026133672200000003 -0.0074571551000000005 0.0454414974 -0.0252487946 0.012959074899999999 -0.0363360556 0.0267590025 0.0339070253 -0.06190939490000001 -0.0233445364 0.0908143174 -0.08910065240000001 0.0195090322 -0.236687 0.033171000000000006 0.056020735968999986 0.0011003152410000005 -0.012231 -0.325617 0.106026430689 0.000149597361 1.82821 0.054719999999999665 3.3423518041 0.0029942783999999624 -0.0221217 0.0018794999999999992 0.0004893696108900001 3.532520249999997e-06 -9.784990000000004e-05 -0.0007829549000000001 9.574602930010007e-09 6.130183754340101e-07 -0.00870335 0.002060949999999999 4.247514902499996e-06 7.574830122250001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33841.32421875 -118.4765625 1145235224.8785553 14036.695861816406 21033.6015625 -31.056640625 964.5149269104004 442412394.6900024 22307.7109375 18.572265625 497633967.2710571 344.92905044555664 1.167161 31.786005 0.5318262449999999 -0.0185434148 0.04326591900000002 -0.0220633292 -0.024550382200000002 -0.040535701 -0.031566706 -0.0124557955 -0.0255501325 0.19830795510000002 0.0088000432 -0.0372369209 0.0656647756 -0.030232085899999997 0.0225081635 -0.0856780163 0.026140260699999997 -0.1104565553 0.0935891941 -0.0588428588 -0.014669224299999999 -0.0216794989 0.08569495949999999 0.044903226 -0.048731652599999994 0.045836071900000004 0.0980507749 -0.0303162543 0.013341713100000001 0.0713696137 -0.056947492 -0.0735805543 0.0603060784 0.029802517 -0.026566492799999997 -0.0300125452 0.026869850299999998 -0.050951463200000005 0.023747629 -0.0193461849 -0.0200745527 0.0510158959 0.0144998766 -0.027926469199999998 -0.0099411836 -0.1919451291 -0.08984977359999999 0.044715057999999995 0.0047830571 -0.0465129567 -0.043365983600000005 0.0481386561 0.011467868899999999 0.0627950952 -0.0085903017 -0.119381011 -0.0417595419 0.0882323803 0.0038802608000000002 0.0617313733 -0.0818822228 -0.0050259508 -0.0589701176 -0.0573614361 -0.13342088970000002 -0.0873661186 0.0626362447 -0.010866503999999999 -0.046659686299999996 -0.055136127800000004 0.0541608259 0.1290852576 0.047920415300000005 -0.0631352795 -0.0202787295 0.0887413447 -0.0917754626 0.027144045 -0.203161 0.033526 0.041274391920999985 0.001123992676 0.278376 0.290607 0.08445242844900001 0.07749319737600001 1.7549400000000002 -0.07326999999999972 3.0798144036000012 0.00536849289999996 -0.0239693 -0.0018475999999999976 0.0005745273424899999 3.413625759999992e-06 0.000285355 0.0003832049 8.1427476025e-08 1.4684599538401006e-07 -0.00824569 0.0004576600000000004 2.0945267560000032e-07 6.79914035761e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33785.9140625 -55.41015625 1141487989.0386353 3070.285415649414 21077.2734375 43.671875 1907.232666015625 444251455.5591431 22319.720703125 12.009765625 498169932.26550674 144.2344703674316 1.11996 30.50054 0.4719582499999999 -0.0336352136 0.0214576224 -0.03669374 0.0008543964 -0.01229005 -0.0005027090000000001 0.0010914376 0.12622253449999998 0.0646391486 -0.0902623131 -0.039067575699999996 -0.0849903183 -0.0614520811 0.10661957220000001 0.0050804737 0.0441561439 0.048629596500000004 -0.0381178773 -0.0428150947 -0.010973726699999999 -0.0303880964 -0.0102119273 0.0078144295 0.0407673825 0.0205382425 0.0485227623 0.017367431399999998 0.0159815925 -0.014817148700000001 -0.0084131591 0.0644166453 -0.012626301599999999 -0.0452183353 0.0319058849 -0.0368760861 0.018422098300000002 0.0014446848000000002 -0.0034462665999999997 -0.0328530748 0.0023832102 0.0100979722 -0.0042477476 -0.0024311097 -0.1508633155 -0.0455363554 0.1192519634 0.0645122328 -0.0674222921 0.0113773556 -0.0404822334 -0.0223712231 0.0076858616000000015 0.09272723 0.0611413198 -0.0038946709 -0.0420860575 -0.0396029861 0.0059404713 0.0409020857 -0.0554196787 -0.0418126794 0.034603773500000004 0.032509997400000004 0.061448942699999995 0.0040144565 -0.0401348636 0.0658643858 -0.0758586424 -0.0055908875 0.063667405 -0.045961246799999994 0.0631531394 -0.06434558650000001 -0.01719291 0.0864713441 -0.0940880769 0.034611705699999995 -0.272746 -0.06958500000000001 0.074390380516 0.004842072225000002 0.26993 -0.008446000000000009 7.133491600000015e-05 0.0728622049 1.6590900000000002 -0.09585 2.7525796281000012 0.009187222499999998 -0.023185 0.0007842999999999982 0.000537544225 6.151264899999971e-07 0.00501474 0.004729385 2.51476172676e-05 2.2367082478225e-05 -0.00779783 0.00044785999999999963 2.0057857959999962e-07 6.08061527089e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33938.55859375 152.64453125 1151825759.421402 23300.352920532227 21095.9453125 18.671875 348.638916015625 445038908.6279907 22266.6015625 -53.119140625 495801545.1431274 2821.643100738525 1.044891 28.456156 0.41528 -0.0155846789 0.0390425485 -0.0084836179 -0.0216101383 0.036528735 -0.0055569327 0.10160833849999999 -0.015977944299999998 -0.022173395499999998 0.025066301200000002 -0.0342111443 0.0276888918 -0.0404110691 0.1686709843 0.006850845 -0.0932780094 0.010846623 -0.039266307599999994 0.1052406035 -0.0710039706 -0.0085368298 0.0093573096 -0.045867529299999994 0.0320206021 -0.1076158514 0.0220427432 0.1505471436 -0.058504868499999994 -0.06896574679999999 0.08975873109999999 -0.1249431465 0.0556856841 -0.0036589146000000003 0.0517119359 -0.0170034404 0.0134196729 -0.0876059398 0.023985971600000003 -0.00641664 -0.011208422 -0.0363844914 0.0025999006 0.1045626153 0.0291868939 0.0151957483 0.0049889365 0.028260226200000002 -0.1591842931 0.007495739499999998 -0.11588672900000001 -0.0118585054 -0.009857200200000001 -0.0377544697 -0.0464093707 0.0535172726 0.0926245797 0.10553717789999999 0.0207806553 -0.12522903900000001 0.00033901769999999996 -0.1300897959 -0.0200229244 -0.079877462 -0.013621634399999999 0.12055779300000001 0.06778114910000001 0.0005095246 -0.0462147045 -0.0040745621999999995 -0.0570438278 -0.0788503075 -0.0820284715 -0.0655400171 -0.0140901232 0.08400935539999999 -0.0960293686 0.0418659738 -0.345103 -0.072357 0.11909608060900001 0.005235535449000001 0.246233 -0.023697000000000024 0.0005615478090000011 0.060630690288999985 1.74107 0.08197999999999994 3.0313247449000005 0.00672072039999999 -0.0218432 0.0013418000000000006 0.00047712538624 1.800427240000002e-06 0.00645594 0.0014412 4.167916128360001e-05 2.0770574399999998e-06 -0.00975975 -0.001961919999999999 3.849130086399996e-06 9.525272006249997e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33968.09765625 29.5390625 1153831658.3845367 872.5562133789062 21061.654296875 -34.291015625 1175.873752593994 443593281.7210732 22277.974609375 11.373046875 496308152.69595724 129.3461952209473 1.165446 31.739305 0.4588519999999999 -0.0224976784 -0.0134798785 -0.0520852715 0.0238195859 -0.0411980006 0.0732888528 0.025424936800000002 0.09551986109999999 -0.06796218030000001 -0.07206270969999999 -0.10536800310000001 -0.020845901899999998 0.0426050121 0.0366951117 0.020145153500000002 0.0592226615 0.10719248349999999 -0.09647806169999999 0.0266326415 -0.015258610300000001 0.11478177789999999 -0.0478197807 -0.0061324825 -0.0583081711 -0.1350979744 0.0321883619 0.0320511177 0.0388501583 -0.0016265945 0.09557915609999999 -0.005641710699999999 0.0359622167 0.025465724300000003 0.0246749633 -0.0253807392 -0.018000714299999998 0.0171602748 0.0145245101 -0.053484002 0.0076684637 0.0410056639 -0.07659176940000001 0.0101169599 -0.0928866655 0.053179098 0.08333412559999999 0.086036057 -0.018152821399999998 0.1280598906 0.0390732824 -0.10363096890000001 0.0587389705 -0.0178198313 0.019925596 0.0684078619 0.0838600869 -0.0297773329 -0.0680759792 -0.0210102332 0.025254754100000002 0.0017334069 -0.0557100464 -0.0549064237 -0.0115539651 0.1310124491 -0.0792716661 -0.0159515222 0.0664064601 0.003343275 0.0025719243 -0.0126336245 -0.08989345 -0.0667182767 -0.010973431100000002 0.081360845 -0.09759167619999999 0.0488621241 -0.308043 0.03705999999999998 0.09489048984899999 0.001373443599999999 0.158093 -0.08813999999999997 0.007768659599999996 0.024993396649000004 1.59215 -0.14892000000000016 2.5349416225 0.02217716640000005 -0.0185456 0.0032976000000000012 0.00034393927935999995 1.0874165760000008e-05 0.00631834 -0.00013759999999999988 3.992142035560001e-05 1.8933759999999966e-08 -0.00950031 0.00025943999999999967 6.730911359999984e-08 9.02558900961e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33968.01171875 -0.0859375 1153825820.1251373 0.00738525390625 21075.55078125 13.896484375 193.11227798461914 444178840.7330475 22221.2265625 -56.748046875 493782909.9419556 3220.3408241271973 1.1029129999999998 30.036303000000004 0.3643355 -0.0563087247 -0.062833982 -0.0513825782 0.08497288869999997 -0.0031228365999999997 0.049675488899999995 0.021310295 0.013859288 -0.1519564258 -0.001815067 -0.068771652 0.0752461931 0.0715021755 0.1033727165 0.1006521957 0.060219992 -0.0036978319 -0.0175830334 0.00183696 -0.0756227909 -0.0076199111 -0.0667474707 0.12259742259999999 -0.0839907356 -0.061583377599999996 -0.0103766565 -0.0712021738 0.025935407799999997 0.0419733299 0.0152306042 -0.0564253924 0.0830094339 -0.09174787599999999 -0.09898409849999999 -0.0492069258 -0.0609807546 0.0316368213 0.0073071877 -0.051655662699999993 0.0728670526 0.0013649813 -0.0460885063 0.0204623119 0.0230759019 0.1205722195 -0.025320099900000004 0.0788444953 -0.0741164644 0.1838003735 0.0083741319 0.0013261720999999998 -0.022187765099999996 -0.0103761305 -0.0062087157 0.0220052222 0.0097334472 -0.024422287 0.09664208279999999 0.044468687199999996 0.08651988630000003 0.0407225604 -0.058699967900000004 -0.1388500716 -0.049329073099999995 0.0097727988 -0.0695183242 0.010209715 -0.0379989154 -0.0256195498 -0.1224780266 0.0054279735 0.0431021318 -0.06788007459999999 -0.0078459096 0.0785316931 -0.09876883410000001 0.0555570233 -0.268307 0.039736 0.071988646249 0.0015789496959999995 0.19694 0.038846999999999986 0.0015090894089999994 0.0387853636 1.4110200000000002 -0.1811299999999998 1.9909774404000005 0.032808076899999934 -0.0197333 -0.0011877 0.00038940312889 1.4106312899999997e-06 0.00590544 -0.00041290000000000077 3.4874221593599995e-05 1.7048641000000062e-07 -0.009992160000000005 -0.0004918500000000055 2.419164225000054e-07 9.984326146560009e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33769.28125 -198.73046875 1140364356.1416016 39493.799209594734 21044.6640625 -30.88671875 953.9893951416016 442877885.503479 22174.72265625 -46.50390625 491718324.8816071 2162.613296508789 1.004119 27.345793 0.29640299999999986 -0.0673137314 -0.0861556073 -0.0508150905 0.0935893074 -0.0677993884 0.0383572042 -0.044277079500000004 -0.0287724948 -0.057452796500000014 0.0662855554 0.0506833643 0.0476130439 -0.0248647445 -0.0423818017 0.0516861243 0.048968309 -0.07888404019999999 -0.0174356035 0.0547438421 -0.0460368985 0.14433966369999998 -0.0404712078 0.0153809381 -0.0407846472 -0.1026252817 -0.0216916791 -0.0058338325 0.0306010823 -0.026243033500000002 -0.0946623941 -0.1025302461 -0.0070805988 -0.19506509449999998 -0.1707207886 -0.06352026059999999 -0.0525476698 0.10620269189999999 0.0035268476000000007 -0.048594215700000006 0.08850454320000001 0.07726445 -0.0463158341 -0.0197778212 0.0428320675 0.11343595669999999 -0.0781401021 0.0047084952 -0.0034545460999999998 0.0314114535 0.0931456749 0.057888126399999996 -0.0089272525 0.0039896251 -0.0693240933 0.0533427268 0.16396069859999998 0.0001944415 -0.0687090637 -0.020768068400000003 0.0953110335 0.0797740042 -0.08911422810000001 -0.0512590328 0.0640525566 -0.0425067198 0.0407273862 0.051713118499999995 -0.059359570800000004 0.0129576949 -0.1473938655 0.0390810119 0.10973750019999999 -0.06902512400000001 -0.0047106451 0.0755281812 -0.0995561965 0.06190939490000001 -0.254531 0.013776000000000009 0.064786029961 0.00018977817600000026 0.120108 -0.07683200000000001 0.0059031562240000005 0.014425931664 1.34576 -0.0652600000000001 1.8110699775999999 0.004258867600000014 -0.0188786 0.0008546999999999999 0.00035640153796 7.305120899999998e-07 0.00459908 -0.0013063599999999995 2.11515368464e-05 1.7065764495999987e-06 -0.0106418 -0.0006496399999999947 4.2203212959999316e-07 0.00011324790723999999 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33878.5546875 109.2734375 1147756467.7139282 11940.684143066406 21038.310546875 -6.353515625 40.36716079711914 442610510.6667519 22248.1875 73.46484375 494981847.03515625 5397.083267211914 1.035254 28.193708 0.4331932 -0.061826589 -0.12598938269999999 -0.0515113683 0.13060872380000002 -0.08137258650000001 -0.0557982422 -0.0429480969 0.044348017 -0.0778829688 0.050853272000000005 0.10638899369999999 0.013549059099999998 -0.0768719269 -0.17805049050000002 -0.0530235946 -0.0164532313 0.0802910383 -0.08414523970000001 0.0234887217 -0.0835103467 0.1119833193 -0.0081088321 -0.0205321045 0.1081749243 -0.0297215714 -0.0990298077 0.1204460751 0.0293641462 0.0479334335 -0.0530164438 0.0153942771 0.021794745600000002 -0.0701120485 -0.0551994575 -0.056721667 -0.0877241744 0.1440379734 -0.12066781609999999 -0.048795766500000004 0.1234113967 0.0955369306 0.044444356399999996 -0.020783494099999997 -0.0156429452 0.1470273997 -0.0420668665 -0.07424438400000001 0.046682031900000004 -0.1265739942 0.0798871159 -0.0887337552 0.035483407599999996 -0.0187237569 0.019745598200000002 0.1560666057 0.17473599609999999 -0.007671234399999998 -0.0386736373 0.0166161334 -0.053321525 -0.0719526482 0.042600822 0.042740174699999994 0.0426329374 0.0490506271 -0.0264640507 -0.0150501411 -0.054419343499999995 0.0362090834 0.04482678650000002 0.0512838671 0.1097041408 -0.0701531426 -0.0015707317000000001 0.0723569779 -0.099950656 0.06788007459999999 -0.233263 0.02126800000000001 0.054411627169000006 0.0004523278240000004 0.0200873 -0.1000207 0.01000414042849 0.00040349962129 1.29465 -0.05110999999999999 1.6761186225000002 0.0026122320999999987 -0.0226121 -0.0037335000000000007 0.00051130706641 1.3939022250000006e-05 0.00383483 -0.0007642500000000003 1.47059211289e-05 5.840780625000003e-07 -0.00992366 0.0007181399999999992 5.157250595999987e-07 9.84790277956e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34178.22265625 299.66796875 1168150903.9402008 89800.89149475098 21103.9296875 65.619140625 4305.8716163635245 445375848.2549439 22267.123046875 18.935546875 495824768.7846718 358.55493545532227 2.215489 60.335758 0.9860132 0.0050266810999999995 0.0753583046 0.007214058499999999 -0.0841651513 0.08105249 -0.008061583 0.1695988731 -0.0968253442 0.09967037390000001 -0.087902945 0.0762499053 0.07482581769999999 -0.11232102529999999 0.0314091996 -0.10563522439999999 -0.0334532946 0.0712543747 0.0621217781 0.0429455551 -0.0527265252 -0.0151541848 0.0379436782 -0.049607114800000005 -0.050149905999999994 0.010254394 -0.0941241567 0.046846349800000006 -0.0513712729 -0.0507063742 0.10675055900000001 -0.0666984686 -0.0359314372 0.06383305389999999 0.0746951237 -0.0084875942 -0.0052928985 -0.20263163210000001 0.0232595968 0.0155233024 -0.0895522326 -0.0807211844 0.0231373347 0.1089117923 0.0617820544 -0.1204660092 0.007828719599999999 -0.0906229559 -0.1561907183 -0.09614796140000001 -0.0370823821 -0.0329955517 0.1281026966 0.0186776764 0.0299938425 -0.0479936898 0.0315333774 0.0554667618 0.0636753356 -0.0481582454 0.0017393872 -0.0078738288 0.1303629482 -0.0411733435 -0.0770709674 0.06524998530000001 0.114688118 -0.0480023679 0.0690287299 -0.004279236 0.0727242469 0.08839974169999999 0.011209521 -0.07126385190000001 0.0015707317000000001 0.06902512400000001 -0.099950656 0.0734322509 -0.252746 -0.019483000000000028 0.06388054051600002 0.00037958728900000115 0.254316 0.2342287 0.05486308390368999 0.06467662785600001 1.86674 0.57209 3.4847182275999997 0.3272869681 -0.021538 0.0010741000000000014 0.000463885444 1.1536908100000032e-06 0.00299885 -0.0008359800000000001 8.9931013225e-06 6.988625604000001e-07 -0.00862951 0.0012941500000000009 1.6748242225000025e-06 7.44684428401e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34025.4765625 -152.74609375 1157733055.3052368 23331.36915588379 21095.880859375 -8.048828125 64.78363418579103 445036189.23294455 22264.03125 -3.091796875 495687087.50097656 9.559207916259766 2.078098 56.594105000000006 0.7504754999999999 0.1177492943 0.12696915890000002 0.067807583 -0.133668852 0.1251177626 0.0040473008000000005 0.0441933508 -0.0348116164 0.0542737643 -0.057051852199999996 0.0194086154 0.0141003114 -0.0776994031 0.19679276510000002 0.0322356691 -0.0787729365 0.09654528949999999 -0.09044082519999999 -0.0130388555 -0.0236367355 0.0320272565 0.07465047080000001 0.049107613700000004 -0.0861436969 -0.026797269900000004 -0.0873568283 -0.0576765384 0.0804753986 0.009725799200000001 -0.0490062115 -0.0401855395 -0.1862709047 0.060787803200000004 -0.0445437334 0.0996845668 0.054574344500000004 -0.16585106859999998 0.012385405 0.0647335042 -0.1153726334 -0.1402114625 0.0079149937 0.0280195864 0.013234649199999999 -0.0530749538 0.0509598129 -0.0271133325 -0.2013264899 0.011674988600000002 -0.0894781367 -0.083291767 -0.0282084574 -0.017728138799999998 0.1276484601 0.0823729987 0.0373224213 0.017649123899999997 0.0778515554 0.0864676591 0.0681384704 0.0653661148 -0.0322244443 0.11113923070000001 -0.0587677288 -0.07756362160000001 0.1510445367 0.064496825 0.0709470176 0.0784141226 0.0013742238 -0.0428190378 0.0539480313 -0.0723569779 0.0047106451 0.0655400171 -0.0995561965 0.0785316931 -0.39803 -0.14528399999999994 0.15842788089999998 0.021107440655999992 0.223945 -0.030371000000000013 0.0009223976410000004 0.050151363024999986 2.19191 0.32517 4.8044694481 0.10573552889999996 -0.0199436 0.0015943999999999993 0.00039774718096 2.5421113599999974e-06 0.00531453 0.00231568 2.82442291209e-05 5.362373862399999e-06 -0.00971244 -0.0010829299999999993 1.1727373848999984e-06 9.43314907536e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33309.34765625 -716.12890625 1109512641.2849274 512840.61036682135 21073.921875 -21.958984375 482.1969947814941 444110183.1936035 22234.525390625 -29.505859375 494374119.34634787 870.5957374572754 1.6649040000000002 45.341354 0.6182884999999997 0.0533201665 0.1353970967 0.0077337718000000015 -0.1289534722 0.0701315728 0.0145700831 -0.055071734000000004 0.0294861514 -0.0639651903 0.04627643769999999 -0.0799610426 -0.0563835296 -0.0824333914 0.20917544829999998 0.1536435288 -0.012939154 -0.0158443384 0.0475754553 0.021753104199999998 -0.0028714327000000004 -0.0695002606 -0.0391652181 -0.0050391094 -0.0795621025 -0.0191787439 -0.023820978700000002 -0.03260847 0.0885695379 0.0512770649 0.011136276 -0.0123897471 -0.0391989427 0.0917396452 -0.0093530625 0.05297920440000002 0.1549924269 -0.0108028673 0.0509099664 0.0023101798999999998 -0.1111450825 -0.0960694264 -0.0034040587 -0.0056637064 -0.0083757967 0.0453231216 0.0389963709 0.13000190279999999 -0.1020824918 0.0477286315 -0.1105824567 0.1467701246 -0.10907997009999999 -0.0092828905 0.0271108699 0.09802675970000001 -0.046803936100000006 -0.017566011 0.1458565401 -0.0372162288 -0.037048203700000004 0.1066904716 -0.07487733070000001 0.0002797198 -0.0875092074 -0.059863874000000004 0.0158479147 -0.0121753001 0.08301087230000001 -0.0437227526 -0.0037555559999999997 -0.0522169683 -0.031970135 -0.0734322509 0.0078459096 0.06190939490000001 -0.09876883410000001 0.08314696120000001 -0.350066 0.047964000000000014 0.122546204356 0.002300545296000001 0.322678 0.09873300000000004 0.009748205289000007 0.104121091684 1.95609 -0.2358199999999999 3.826288088100001 0.05561107239999996 -0.022539 -0.002595400000000001 0.000508006521 6.736101160000007e-06 0.00496226 -0.00035227 2.46240243076e-05 1.240941529e-07 -0.00794468 0.0017677599999999984 3.1249754175999943e-06 6.311794030240003e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33753.03515625 443.6875 1139267382.2590485 196858.59765625 21066.43359375 -7.48828125 56.07435607910156 443794624.35987854 22246.482421875 11.95703125 494905980.14679337 142.97059631347656 1.2157 33.107890999999995 0.4885910000000001 0.0198415309 0.0844049115 -0.0107670527 -0.0801708525 0.017816248 -0.0040786765 0.0307597682 0.0080495236 0.0406233656 0.08211312059999999 -0.148925806 -0.0065124312 -0.0479541576 0.09456575210000001 -0.0445576697 0.06485221320000001 -0.0613853762 -0.0905658727 0.050669222 0.0398586635 -0.0496740963 0.007228704599999998 -0.0589275103 -0.0793614813 -0.07808847599999999 0.1379505363 -0.09561399470000001 -0.0688495328 0.0342213348 -0.0437748075 0.0590487586 0.0740347286 -0.0984275234 -0.06666950099999999 0.0137634729 0.0785390592 -0.0375053905 0.0251620179 -0.018173082099999998 -0.0655747456 -0.0233705641 -0.0013314498999999998 0.0644119149 0.0094368112 -0.0532431754 -0.0481391754 0.1661582688 -0.0421373909 0.0401499827 -0.0734379114 -0.0292131348 0.013413433 0.066582142 -0.0453494932 -0.0064933588 -0.050453433 0.0575352289 -0.066736687 -0.0764138172 0.028714015 0.0722767302 -0.18677178809999997 -0.0374483144 0.04308132889999999 -0.0835296074 -0.0401267171 0.0816300115 -0.0013860588 0.0502702772 -0.0932714456 0.025925738599999998 0.0778728439 -0.0744894057 0.010973431100000002 0.058141318399999996 -0.09759167619999999 0.0872496007 -0.28978200000000004 0.06028399999999995 0.08397360752400003 0.003634160655999994 0.150825 -0.17185300000000006 0.02953345360900001 0.022748180625 1.815 -0.14109000000000016 3.294225 0.019906388100000044 -0.0213676 0.0011713999999999993 0.00045657432975999997 1.3721779599999986e-06 0.00384697 -0.0011152899999999997 1.47991781809e-05 1.2438717840999992e-06 -0.00796527 -2.0589999999999147e-05 4.23948099999965e-10 6.34455261729e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33621.69140625 -131.34375 1130418133.017105 17251.1806640625 21022.419921875 -44.013671875 1937.203311920166 441942139.3716469 22237.15234375 -9.330078125 494490944.3591461 87.05035781860352 1.112998 30.310942 0.4498130000000001 -0.0077473717 0.0824836104 -0.0375778654 -0.0723579238 -0.0375284646 0.009990503199999999 -0.046728125700000005 0.0030896526000000002 -0.004965458 -0.0447997474 -0.0776962018 -0.0479438894 -0.0507642637 0.09239992300000001 0.0496419224 0.050800385499999996 0.0144054683 0.025317163700000003 -0.0131583584 -0.0543704329 0.0092555062 -0.0123072997 -0.025128714700000002 0.039999974 -0.014850920900000003 -0.0126962384 0.0579476603 0.016096974099999998 -0.0813046793 -0.0013230623000000002 0.0457194455 0.0033203716999999997 -0.0049395666 0.06181212780000001 -0.004599942199999999 0.0758110781 0.0100845713 -0.0244862183 -0.0370575766 -0.07596749309999999 0.029167290099999996 -0.0017409232 -0.045601908899999995 -0.013069573000000001 -0.0205346683 0.0622381932 0.1042627208 -0.0444542275 0.0464624346 -0.047434984000000006 0.0674925749 0.0184078131 0.044527284400000006 0.041847126299999995 0.023138541800000002 0.0825398225 -0.0069096758999999995 0.0584997748 -0.030755972799999996 -0.0416989268 -0.0147975169 -0.0033806962 -0.0035330082 0.0716974776 0.0598046611 -0.013545408799999999 -0.07795811 -0.0161855983 -0.0681686687 0.0473643306 0.0118593378 -0.038745324399999996 -0.0755281812 0.0140901232 0.0542441537 -0.0960293686 0.0908143174 -0.308197 -0.01841499999999996 0.09498539080900001 0.0003391122249999985 0.224548 0.07372300000000001 0.005435080729000002 0.050421804304 1.70382 -0.11117999999999983 2.9030025924000005 0.012360992399999965 -0.0235766 -0.0022089999999999987 0.0005558560675599999 4.879680999999996e-06 0.00545509 0.0016081200000000002 2.9758006908100006e-05 2.5860499344000007e-06 -0.00907805 -0.0011127800000000007 1.2382793284000016e-06 8.241099180250001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33869.08984375 247.3984375 1147115246.8440096 61205.986877441406 21026.47265625 4.052734375 16.42465591430664 442112552.3640289 22261.71875 24.56640625 495584121.7041016 603.5083160400392 0.997423 27.163439 0.30004449999999994 -0.0114499016 0.055202380499999995 -0.025022987599999998 -0.052571895 -0.0312736733 -0.0256884604 0.0416637766 0.0162325561 -0.0018191820000000001 -0.047385349900000005 -0.0814040068 0.05684186 -0.015966321000000002 0.052827483700000004 -0.09584224570000001 -0.1500740951 0.011098903700000001 0.0185134322 0.09748284480000001 0.026030273399999998 -0.0714679501 0.0312320606 -0.0814164335 -0.0397685299 -0.0737138261 0.050946268499999996 0.09488323929999999 0.0232977721 -0.0658432668 0.0996564174 0.0445678257 0.0133756444 9.13528e-05 0.0049566434 -0.0096213997 0.041336016499999996 -0.0710980171 0.029378817 -0.0249826694 -0.0537345156 0.0334623389 0.0400313131 0.0141613964 -0.0200807076 -0.027196469700000003 0.0150312832 0.035120541 -0.0840992424 -0.0548283147 -0.1070754528 -0.0677043915 0.0357916177 -0.0978795703 -0.061910448099999994 -0.049350735300000004 -0.0169253621 0.056605725 0.0196311194 -0.1248289693 -0.0523570896 -0.0219413862 -0.062349511399999995 0.0051036533 0.049704128099999995 0.1643035528 -0.0144765547 0.1017563246 -0.0253222576 0.0039502019 0.0274741715 -0.0737009787 -0.1033041819 -0.0765483213 0.01719291 0.050226553300000004 -0.0940880769 0.0938191336 -0.315784 -0.0075870000000000095 0.099719534656 5.756256900000016e-05 0.102922 -0.121626 0.014792883876 0.010592938084 1.67935 -0.024470000000000214 2.8202164225 0.0005987809000000103 -0.0213605 0.002216100000000002 0.0004562709602499999 4.911099210000008e-06 0.005400899999999999 -5.419000000000084e-05 2.9169720809999994e-05 2.9365561000000906e-09 -0.00842111 0.00065694 4.315701635999999e-07 7.09150936321e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33743.296875 -125.79296875 1138610083.9943848 15823.870986938477 20989.99609375 -36.4765625 1330.5396118164062 440579936.01564026 22231.82421875 -29.89453125 494254008.0933991 893.6829986572266 0.930189 25.332411 0.27106300000000005 -0.0106118394 0.0814412473 -0.035413594 -0.0972723882 -0.048366556799999995 -0.0034780302 -0.0579771907 -0.0440628768 0.09619535580000001 -0.0779243444 0.0069112991000000006 0.0163981236 -0.07380858650000001 0.097329074 -0.0770953756 -0.0425798338 -0.0659760903 -0.0184159604 0.052341503600000006 -0.045148553099999995 0.031075739100000006 -0.0349881388 -0.0219565358 -0.0809762181 -0.0003529289 -0.025118121400000002 0.000884071 -0.0780042719 -0.09683107619999999 0.08292182669999999 0.043390506399999994 -0.0077411009999999985 -0.10308173779999999 -0.0029135156 -0.0173499334 0.0632250386 -0.0556236289 0.0300765664 -0.0378777576 -0.09629879300000001 0.0456519117 0.008872047 -0.0871473918 0.0063791169 -0.0894798381 0.0236714626 -0.0163066904 -0.10283936199999999 -0.056639504800000004 -0.10787296519999999 -0.0362258429 0.025218493999999998 0.0377821147 -0.049143380199999996 -0.08563960960000001 0.0675594481 -0.0335008358 -0.0084133331 -0.0544431356 0.0384732866 0.0826524989 0.0335554491 -0.037056054 0.051593844900000005 0.0725597289 -0.0342063034 0.08326936 0.0061506375 -0.032260396499999996 -0.1251022633 -0.10604889769999999 0.0268800454 -0.0775495743 0.0202787295 0.0460974375 -0.0917754626 0.0962455236 -0.319583 -0.003798999999999997 0.10213329388900001 1.4432400999999975e-05 0.233228 0.13030600000000006 0.01697965363600001 0.054395299984000015 1.69148 0.012129999999999974 2.8611045904 0.00014713689999999938 -0.0233173 -0.0019568000000000016 0.0005436964792899999 3.829066240000007e-06 0.00545424 5.334000000000068e-05 2.97487339776e-05 2.8451556000000728e-09 -0.00890753 -0.0004864199999999996 2.3660441639999963e-07 7.93440907009e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33868.65234375 125.35546875 1147085611.5818026 15713.993545532228 21011.490234375 21.494140625 461.9980812072754 441482721.86923605 22226.73046875 -5.09375 494027547.33045965 25.9462890625 0.8035899999999999 21.884661 0.2996848 -0.006487224200000001 0.0613010687 -0.0381636925 -0.04581970690000002 -0.038896614700000005 -0.002687889 -0.0189704249 -0.0334892264 0.044565272 -0.056699260099999996 -0.07533695650000001 0.0376180578 -0.023540704 -0.0116943775 -0.10386294689999999 -0.0100785385 0.1100994651 -0.0677069389 0.0238525033 -0.015994883600000002 0.0268582321 0.043283353 -0.0403298065 0.0034787266 -0.08403521039999999 0.036186010299999995 -0.0411507915 -0.029619547200000002 -0.0462711122 0.017024143999999998 0.0587679214 -0.055672934900000005 -0.0227912684 -0.0401022162 -0.0103197889 0.045509221100000004 -0.037736957 -0.0137700509 -0.0387062157 -0.0483394825 0.0388972453 0.0083053295 -0.0511499749 0.0144566371 -0.0631644697 0.0075516644 0.047540475 -0.0532898116 -0.020967595 -0.0061488951 -0.1336932545 0.1048449975 -0.0312192678 0.0317185512 -0.0155883909 0.0143567836 0.031663121 -0.0389483968 -0.0625678012 0.0521004965 -0.0176469584 -0.037952168 0.0105213296 0.0504124351 0.0475524395 -0.0260879917 0.0363850971 0.0279781217 -0.0318940248 -0.013110576499999999 -0.0650367987 0.1151608826 -0.0785316931 0.0233445364 0.0418659738 -0.08910065240000001 0.09807852800000001 -0.308633 0.010950000000000015 0.095254328689 0.00011990250000000034 0.0379022 -0.1953258 0.038152168145640014 0.0014365767648399994 1.67123 -0.020249999999999883 2.7930097129 0.0004100624999999951 -0.0224415 0.0008757999999999995 0.00050362092225 7.67025639999999e-07 0.00498814 -0.00046609999999999973 2.4881540659600008e-05 2.1724920999999967e-07 -0.009028810000000002 -0.00012128000000000139 1.4708838400000337e-08 8.151941001610003e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33920.78515625 52.1328125 1150619665.6164706 2717.830139160156 21105.984375 94.494140625 8929.142612457275 445462576.43774414 22368.658203125 141.927734375 500356869.80823135 20143.48178482056 1.362775 37.113281 0.4539263000000001 -0.0343201006 0.005286545699999999 -0.0394200204 0.074387237 0.0121634636 0.0268305701 0.0295558007 0.0347060603 0.053938584299999995 0.0910092474 -0.0909530318 0.010847420600000001 0.0082791454 0.038896070299999995 -0.0312699248 -0.0110176494 -0.0128244122 0.19286433579999998 0.0339537635 -0.0725049334 0.0477782093 -0.039182239199999996 -0.0182731298 -0.0454722523 0.0761170145 -0.0349064086 -0.06832632820000001 0.11435289800000001 0.07567864980000001 0.0296707459 0.0329706685 0.0072913254000000005 -0.0800304202 0.07000458059999999 -0.037254881499999996 -0.0169565471 0.0279837908 0.0029428481 -0.0341072433 0.0748639191 -0.010247054200000001 -0.0272975518 0.050164355599999995 -0.0375390785 -0.0723974094 -0.0771079153 0.0618581504 0.060717760499999995 -0.028276727 -0.1183624249 0.11510998730000001 0.0596125712 -0.0502509129 -0.0233258602 -0.0239172864 0.028674492599999997 -0.045127903899999995 0.09469885119999999 0.067589468 -0.0664200302 0.08593220789999999 0.0432998365 -0.0085016238 -0.020918930500000002 -0.0062640463 -0.0452690683 0.0765610518 0.0407145539 -0.07099101299999999 0.0078062684 0.1125993201 -0.0400859656 -0.0794944353 0.026387305 0.0375415571 -0.08607420269999999 0.09930684570000001 -0.320791 -0.012158000000000002 0.102906865681 0.00014781696400000005 0.105351 0.0674488 0.004549340621440001 0.011098833200999999 1.42498 -0.2462500000000001 2.0305680004 0.060639062500000035 -0.0208399 0.0016015999999999982 0.00043430143201 2.565122559999994e-06 0.00446698 -0.0005211600000000004 1.99539103204e-05 2.716077456000005e-07 -0.008590179999999998 0.0004386300000000041 1.923962769000036e-07 7.379119243239997e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33712.9140625 -207.87109375 1136560574.5855105 43210.39161682129 21057.541015625 -48.443359375 2346.7590675354004 443420033.6247292 22398.384765625 29.7265625 501687640.10898215 883.6685180664062 2.031682 55.33001700000001 0.5868879999999999 -0.07416969059999999 -0.0272286005 -0.0451952282 0.006611124300000001 0.0178072218 0.05922606940000001 -0.0746565138 0.007099375 0.17357756789999998 -0.0665277759 0.0778155663 -0.1170631847 0.0932947635 0.1624863403 0.1534666476 0.1322478217 -0.0119933423 0.0512925341 -0.19531900670000002 -0.013246414 -0.07178004610000001 -0.0050576416 0.0624202134 0.0359876058 -0.1182214393 0.06806006269999999 0.1175424185 0.0300448756 -0.09418861140000001 0.0671931198 0.058680365 -0.0334512249 0.06198630650000001 0.0072839762 -0.0890405718 0.0017484826999999998 0.0380495431 0.0727155458 -0.0481653626 0.0160910954 -0.0179990309 -0.088994545 -0.0658653555 -0.056389948899999986 -0.141685451 0.1147174444 -0.08957912539999999 0.0023605648999999998 0.1534267594 -0.0309943602 0.13830314230000001 -0.1123559972 0.1549569949 0.1988136892 -0.0558103858 -0.026553696800000002 -0.0604928398 0.062772091 0.004517082899999999 0.005525819 -0.09898167699999999 -0.1377058249 0.0841865819 0.048057916299999996 0.109683487 0.0208043904 -0.0280356157 -0.0408808586 0.0636718105 0.08581125449999999 0.012314715700000001 -0.1486861955 -0.08043756349999999 0.0294040325 0.0331337888 -0.0827080574 0.09992290359999999 -0.299702 0.02108899999999997 0.08982128880400002 0.00044474592099999873 0.110161 0.004809999999999996 2.3136099999999953e-05 0.012135445920999998 1.2940200000000002 -0.13095999999999974 1.6744877604000004 0.017150521599999934 -0.02557 -0.0047300999999999975 0.0006538249 2.2373846009999974e-05 0.0060222 0.0015552200000000006 3.626689284000001e-05 2.4187092484000006e-06 -0.00627492 0.0023152599999999982 5.36042886759999e-06 3.93746210064e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34377.2578125 664.34375 1181795854.7070925 441352.6181640625 21127.810546875 70.26953125 4937.8070220947275 446384378.5046425 22415.0390625 16.654296875 502433976.1734009 277.3656044006348 2.725759 74.232239 1.3756575 -0.0123645402 -0.14793194880000002 -0.0110354115 0.1550947945 0.0679913206 0.009922205 -0.0856626353 0.3348005997 -0.0812460069 -0.0450397608 -0.0402819148 -0.0738492169 0.0051038886 -0.1796165144 -0.0658173035 0.13510600949999998 -0.031224182599999997 0.09597937289999996 -0.148481871 -0.0129758051 -0.052568780999999995 0.0343467033 0.1925822651 0.1100308875 0.0763611818 0.0607046419 0.029600043599999997 -0.0059159752000000005 7.986420000000001e-05 0.1579329418 -0.0628525095 0.0782304036 0.106107175 0.015983901499999998 0.0006106911 -0.1550539388 0.0962337417 -0.186523587 -0.016812886000000003 0.15724434 -0.0561084373 -0.0213062772 -0.0736214935 -0.31381536600000004 0.1405839628 0.0230554364 0.1013981541 0.2039368746 -0.0443425814 0.1576118717 0.0500203696 0.0298572303 0.034068819 0.0566781032 -0.1530438706 -0.0652437156 -0.0073366336 0.0517579487 0.15795705570000002 -0.0181906016 -0.14067134039999998 0.045887110700000004 -0.12384122480000001 -0.0376649472 0.0711080332 0.030151774 -0.056854925 -0.016504225 -0.0385607094 0.0182423956 0.0739206523 -0.1007906799 -0.081360845 0.0323917418 0.028652455299999997 -0.0790155012 0.09992290359999999 -0.176539 0.12316300000000002 0.031166018520999997 0.015169124569000006 -0.103333 -0.21349400000000002 0.045579688036 0.010677708889 1.11319 -0.18083000000000027 1.2391919761 0.032699488900000094 -0.0287535 -0.0031835000000000023 0.0008267637622500001 1.0134672250000014e-05 0.0125486 0.0065264 0.00015746736196 4.2593896960000005e-05 0.00117859 0.00745351 5.55548113201e-05 1.3890743881e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33839.41015625 -537.84765625 1145105679.7229154 289280.10133361816 21042.5859375 -85.224609375 7263.234043121338 442790422.9370728 22262.615234375 -152.423828125 495624037.0738258 23233.02338027954 1.720222 46.847862 1.4070975 -0.0504361408 -0.0834968123 -0.0384211461 0.0596321696 -0.008731444599999999 0.010106490400000001 -0.0469367511 0.0557943609 -0.1213986808 -0.0507632057 0.0511023607 -0.0384724376 0.1061501876 -0.0657652718 0.0355476171 0.007178264 -0.014259303300000001 0.0978756302 0.1118204186 0.05739338190000001 -0.0275852304 0.061424513499999986 0.0876991209 0.021549214 -0.038401459 -0.0062288740000000006 0.19429672329999997 -0.0498717837 0.0788305812 -0.0074668897999999985 0.0166232824 0.0586659023 0.039992845 -0.0459716874 -0.0368003513 -0.030088886699999998 0.04718742769999999 0.0234747115 -0.0409665731 0.053526739299999994 0.0100160733 -0.0120212521 -0.05665233 -0.0377816902 0.12205236130000001 0.046317410999999996 -0.034493344 0.06886386929999999 0.0404921158 0.0445038568 0.08898033779999999 0.0725564027 -0.1055195533 -0.056875298399999996 0.00044717739999999996 -0.0167269904 0.08535578699999999 -0.0408459156 0.0027807978000000005 -0.1101416657 -0.046943016100000005 -0.0241920946 0.0739534584 -0.0470581733 0.096726589 0.0039500971 -0.08930869949999999 -0.0289308523 -0.0313579612 -0.0596267191 -0.010609628400000001 0.0931999483 -0.0822640518 0.0353474844 0.0241075061 -0.07501110700000001 0.09930684570000001 -0.305711 -0.129172 0.093459215521 0.016685405584 0.126197 0.22953 0.052684020899999996 0.015925682809000002 1.26246 0.14927000000000026 1.5938052516000003 0.022281532900000067 -0.0254675 0.003286000000000001 0.00064859355625 1.0797796000000003e-05 0.00685645 -0.00569215 4.70109066025e-05 3.24005716225e-05 -0.00782577 -0.00900436 8.107849900959997e-05 6.124267609289999e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33831.9375 -7.47265625 1144599995.0039062 55.84059143066406 21013.21875 -29.3671875 862.4317016601562 441555362.2353516 22219.48828125 -43.126953125 493705659.48060614 1859.9340858459475 0.945524 25.750027 0.7291555000000001 -0.0415421574 -0.0352293234 -0.0232645682 0.010532359199999999 -0.030599065 -0.0464764466 0.0323362902 -0.0680222065 -0.0027360795 0.0377949104 0.1623394932 0.040692456 0.016705202 -0.1176691423 -0.0132317692 -0.0498119505 -0.054074088099999994 -0.171010045 0.10745087060000001 -0.053457073099999995 -0.030603714700000006 -0.0041506837 0.1109133977 0.0460155789 -0.0394127822 0.04967379139999999 0.0255079037 0.0083053027 -0.0472991938 -0.0123619399 -0.100915066 -0.0792986081 0.08792800869999999 -0.059071257 -0.042617884800000005 -0.002061925 0.0029065415999999997 0.0170028597 -0.0239025192 0.0071529588 0.0468316518 0.0492042651 0.035307908900000004 0.057614139 0.021773846800000003 -0.0360081101 -0.1829070721 0.0207958503 -0.0670184119 0.1200658895 -0.1016459185 -0.007854069200000001 0.013992849299999999 -0.1341577108 0.0615997924 0.042623633499999994 -0.0174793192 0.0290176148 0.0688543362 0.0785616386 -0.1088701751 -0.1309771043 0.0432766489 -0.0642465712 -0.047060325 0.12815683460000002 -0.0131532163 0.05928918480000001 -0.0026477344 -0.0171178495 0.0003663687 0.0343079799 -0.08314696120000001 0.0382683432 0.0195090322 -0.0707106781 0.09807852800000001 -0.347412 -0.04170099999999999 0.120695097744 0.001738973400999999 -0.205687 -0.331884 0.11014698945599996 0.04230714196899999 1.3838700000000002 0.12141000000000003 1.9150961769000003 0.014740388100000003 -0.0264371 -0.0009695999999999977 0.0006989202564099999 9.401241599999952e-07 0.00555207 -0.00130438 3.08254812849e-05 1.7014071843999996e-06 -0.010235 -0.00240923 5.8043891929e-06 0.000104755225 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 +33614.6484375 -217.2890625 1129944589.5767212 47214.536682128906 20994.677734375 -18.541015625 343.76926040649414 440776493.1702613 22227.359375 7.87109375 494055504.7854004 61.95411682128906 0.963691 26.244774 0.4541953000000001 -0.055764587000000004 -0.018548803899999997 -0.0382010686 0.0055944543 -0.0492091056 -0.015534297800000001 -0.0576652641 -0.10299894289999999 0.027851995 -0.007004764399999999 0.1435928892 0.0866686451 -0.07535078349999999 -0.0133704925 -0.012916681200000002 0.0334984873 0.015334602099999999 0.0270442511 -0.0210164194 -0.0300272062 -0.015496876599999999 -0.044368096600000004 0.0660612161 0.011733730900000001 -0.0030013009000000005 -0.012514651299999999 -0.0441840966 -0.023353435 -0.0067675888 0.111320805 0.0823208367 0.0810773295 0.06303018690000001 0.068470096 -0.0576000963 0.0226283592 0.0549218068 0.0081924976 -0.032470466499999996 0.0028847382 0.0570799651 0.0135900739 -0.0737029842 0.1038350287 -0.0012799456 -0.0578559375 -0.1235498407 -0.0573425059 -0.045417558200000006 0.0151063701 0.033459554 0.0695074233 0.0840201908 0.0390001188 -0.0523731187 -0.0207268062 -0.0206533037 0.0386067916 0.0521753522 0.0321789285 0.0132271025 0.07362962940000001 -0.0665270155 0.005779313 0.0776775376 -0.0526609928 -0.0137076847 0.0684294253 0.0145775493 -0.0078394502 -0.006039777099999999 0.023039456 -0.08400935539999999 0.0411514359 0.0148672434 -0.06613118650000001 0.0962455236 -0.34509 0.002321999999999991 0.1190871081 5.391683999999957e-06 0.07131030000000001 0.2769973 0.07672750420728999 0.005085158886090001 1.36014 -0.02373000000000025 1.8499808196 0.000563112900000012 -0.0238659 0.002571199999999996 0.0005695811828100001 6.611069439999978e-06 0.00552087 -3.1200000000000325e-05 3.04800055569e-05 9.734400000000204e-10 -0.00981448 0.0004205199999999989 1.7683707039999908e-07 9.63240176704e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33814.55078125 199.90234375 1143423844.537735 39960.94703674317 21032.09765625 37.419921875 1400.2505531311035 442349131.8220368 22323.771484375 96.412109375 498350773.28659433 9295.294834136965 0.919208 25.03336 0.32096230000000026 -0.041901166600000005 -0.0002431092 -0.0195107905 -0.013141988899999998 -0.0077596053000000016 -0.0259510783 0.044074206500000004 -0.0389695252 -0.023848923799999998 0.05691765610000001 0.1228748798 0.0731672122 -0.0030684293 -0.0013261316000000001 0.0221423994 -0.046320821100000006 0.0759684994 -0.050793986 0.1176723815 -0.12746927689999998 -0.0569956751 -0.07073019400000001 -0.04440452860000002 0.0017064258 0.016003985800000002 -0.0653152306 0.0062534651 -0.023128968599999997 -0.0782053672 -0.024241114100000002 0.1233241598 -0.0022390506 -0.01013635 0.0675708742 -0.0417097684 0.010113442 -0.0233437256 0.0358309691 -0.018881252 -0.0149582175 0.011165819099999998 0.026415962799999998 0.0535158372 0.0556346079 0.047394792699999994 -0.0580581265 -0.1263936718 -0.0847899835 -0.0013302534 0.0144079542 -0.0678959984 0.0411779188 -0.0032812714000000002 -0.0783144942 0.0661876874 0.0796742426 -0.0061735017 0.1221702819 -0.0616085315 0.0148798068 0.015096396399999996 0.047053312699999995 0.0359859675 0.1100917786 -0.0075436969999999985 -0.0429379747 -0.036283526600000005 0.0039636040999999995 -0.1110074299 0.0208633997 0.0075932718999999985 -0.05938345940000001 -0.0848510215 0.043993917 0.0101924456 -0.0612907054 0.0938191336 -0.363479 -0.018388999999999992 0.132116983441 0.0003381553209999996 -0.115507 -0.1868173 0.03490070357929001 0.013341867049 1.40335 0.043210000000000186 1.9693912225000003 0.0018671041000000168 -0.0246103 -0.0007443999999999957 0.0006056668660899999 5.541313599999937e-07 0.00503403 -0.0004868399999999997 2.53414580409e-05 2.3701318559999967e-07 -0.0095948 0.00021968000000000158 4.8259302400000714e-08 9.206018703999998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34076.65625 262.10546875 1161218501.180664 68699.27674865723 21124.68359375 92.5859375 8572.155822753906 446252256.9360504 22410.841796875 87.0703125 502245830.0445595 7581.239318847656 1.121271 30.536251 0.4320580000000001 -0.028335617400000002 -0.0672473975 -0.017559689099999998 0.0946021879 0.048597200599999994 -0.0242719946 0.07536858860000001 -0.0601440824 0.021788527599999996 0.1680858705 0.011770851799999999 -0.0256057951 0.0190126318 -0.057593857699999994 0.0416572383 0.0075819885 -0.0913767696 -0.1664950584 -0.0415086269 -0.022630853 0.0975107297 0.0516939858 -0.080034352 0.0627459511 0.0354619333 -0.004573786 -0.0273897312 0.0946809533 -0.039925538999999996 0.0462965974 0.1197742833 -0.0005513158 -0.0456305359 0.050498398099999994 -0.0348925733 -0.0621389242 0.044328708 -0.024145843700000003 -0.0171552529 0.1034592634 -0.0377675856 0.0131917516 0.1243962283 0.0758655481 -0.0046706993 -0.0789801079 -0.0337934347 0.068548005 -0.0062058978 0.0690828691 -0.0738578133 -0.15478197789999998 0.10934282320000001 -0.014411751499999997 0.0478413225 0.1083597737 0.018206800500000002 -0.0795867386 0.0502784056 -0.0600917064 -0.0147341904 -0.004902257 0.0400905758 0.1157814851 -0.0422262281 -0.057451098799999996 0.10779548929999999 0.021515962200000002 -0.0109997916 0.051829144400000006 0.0249864968 -0.0777475968 -0.0856717519 0.046792981399999996 0.005495018000000001 -0.0562083378 0.0908143174 -0.362027 0.0014520000000000088 0.131063548729 2.1083040000000257e-06 -0.265035 -0.14952799999999994 0.02235862278399999 0.07024355122499998 1.2795 -0.12385000000000003 1.6371202500000002 0.015338822500000003 -0.0226324 0.0019778999999999977 0.00051222552976 3.912088409999992e-06 0.00493507 -9.896000000000035e-05 2.43549159049e-05 9.793081600000071e-09 -0.0106625 -0.001067700000000001 1.1399832900000028e-06 0.00011368890625 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34081.953125 5.296875 1161579528.8146973 28.056884765625 21136.18359375 11.5 132.25 446738256.90870667 22411.9921875 1.150390625 502297393.812561 1.3233985900878906 1.241797 33.818611 0.6553665000000001 -0.0387759502 -0.0647262693 -0.0163218275 0.1472089344 0.0663564655 0.031434132999999996 -0.023312426600000002 0.1035414196 0.1085317097 0.0973989241 -0.0804416343 -0.056636125499999995 0.051822851399999995 -0.0822718105 0.0829177844 -0.1023345775 0.0495337745 0.2236578538 -0.1026051004 0.0802091011 0.1752481328 -0.0550910066 -0.1291371465 -0.030889265099999997 0.1952813618 0.0017998769 -0.08638163410000001 -0.0416184952 -0.0432800974 -0.0526437679 -0.048162872999999995 -0.05071388860000002 -0.0399423588 0.004790383 -0.029582521400000002 -0.0673579504 0.0520650054 -0.0189475186 -0.0161260392 0.1634568523 -0.0644515527 -0.039871099199999996 0.0249695612 -0.096370129 -0.1157573231 -0.049865554699999995 0.038772865499999996 0.1524757016 -0.0565289958 -0.049890409299999994 0.1336400851 -0.10519604869999999 -0.2217516253 0.055708094900000005 -0.0968411106 0.0391969451 -0.0926958717 -0.1286005479 -0.08862850289999999 0.0015936075 0.06900210309999999 0.0751243661 0.0204153078 0.0019578076 -0.1563442563 0.0170211946 -0.011726043 -0.0384729122 0.0954527138 -0.0651626699 -0.1147566387 -0.0926809576 -0.0864713441 0.0495458668 0.0007853901 -0.0509041416 0.0872496007 -0.33281900000000003 0.029207999999999963 0.11076848676100004 0.0008531072639999974 0.067715 0.33275 0.1107225625 0.004585321224999999 1.16162 -0.11787999999999997 1.3493610244000005 0.013895694399999995 -0.0235412 -0.0009088000000000012 0.0005541880974400001 8.259174400000024e-07 0.00428554 -0.0006495299999999997 1.83658530916e-05 4.2188922089999967e-07 -0.00871026 0.0019522400000000011 3.811241017600004e-06 7.586862926759998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 +34030.96484375 -50.98828125 1158106568.1965485 2599.8048248291016 21095.861328125 -40.322265625 1625.8851051330566 445035365.1754799 22341.826171875 -70.166015625 499157196.6942787 4923.269748687744 1.20001 32.680614 0.20824670000000006 -0.041520823 -0.0733447153 -0.016959643400000002 0.0535489718 0.053168929000000004 -0.0121715688 0.0722893879 0.0174122451 0.10342401300000001 0.0389670442 0.0092024495 -0.0798622848 0.06598532230000001 -0.0651416429 -0.0400588166 0.057410077300000015 0.0476693218 0.1291917936 0.11690831480000001 0.0696034353 -0.1139089526 0.0088755561 0.0922262527 -0.04667838269999999 0.0260399574 0.0033083078 0.011542464099999998 0.0490368909 0.0685780714 -0.009465752 0.0629261651 -0.15894463009999998 -0.0125701276 0.0248590225 -0.04345610230000002 -0.050528921399999996 -0.0167111992 0.0452039091 -0.0165891287 0.06065527690000001 -0.047034143 -0.0047201472 0.08424409779999999 -0.025102165699999998 -0.10064036289999999 0.0246282364 -0.0373354664 0.1185313873 -0.0171097259 -0.005181838 0.0812511255 0.1469727962 -0.0803638213 -0.026829944799999998 0.0215205554 -0.1176262692 -0.07994145400000001 0.061114545 0.09540737460000001 -0.0451510898 0.0633194279 -0.027556096800000002 0.18193404989999998 -0.024951977 0.0282731698 0.0399320068 0.0787087482 0.0111971292 0.0326040705 0.0306567633 0.047980727199999997 -0.009675437700000001 -0.0872496007 0.052249856500000004 -0.0039259816 -0.04539905 0.08314696120000001 -0.30542800000000003 0.027391000000000002 0.09328626318400003 0.0007502668809999999 0.042736800000000005 -0.024978199999999992 0.0006239104752399996 0.0018264340742400005 1.28933 0.12770999999999974 1.6623718488999997 0.01630984409999994 -0.0235368 4.400000000001625e-06 0.00055398095424 1.9360000000014303e-11 0.00430505 1.951000000000036e-05 1.8533455502500007e-05 3.806401000000141e-10 -0.00817082 0.0005394399999999988 2.9099551359999857e-07 6.676229947240001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33829.5 -201.46484375 1144435070.25 40588.08326721192 21018.638671875 -77.22265625 5963.338638305664 441783171.61883926 22307.3203125 -34.505859375 497616539.5244751 1190.6543312072756 0.964791 26.27475 0.31072940000000004 -0.039675628500000004 -0.0482620233 -0.0280915287 0.0221074092 0.001856509 -0.013032054 -0.045972650999999996 -0.038093988599999996 -0.058926086600000004 -0.0304020278 0.0849414289 0.0216198086 0.0352754842 -0.0611549907 0.0743757385 0.0815322634 0.0043526005 0.0180654732 0.0348551947 0.0402615328 0.0456717375 -0.0654593383 0.057366549100000004 0.005676619599999999 -0.0409400351 -0.1750528214 0.0302487471 -0.0499661694 -0.0700306071 0.024697378399999997 0.06741205759999999 0.10895916609999999 -0.052388093600000005 0.0810035031 -0.037811612200000004 -0.012945768 0.0329078043 0.0292706051 -0.031450996099999996 0.0235066885 0.0071323938 0.0146975599 -0.054312261900000006 0.046593450700000004 0.0571494544 0.0054142951 -0.066365597 0.0315121131 0.0760834632 0.0686152322 0.0911837625 0.0356600429 0.0104172606 -0.0135455496 0.0339927623 0.0412850427 -0.026887074 0.0026708596999999996 0.037208248799999996 0.10044150660000001 0.0631650599 0.1626990922 -0.0359850157 0.046437865 0.10784650720000001 -0.0895623596 -0.0977000629 -0.0836833976 0.049855813 0.0185508505 -0.0013817217999999999 -0.073843937 -0.0880063298 0.054902281799999994 -0.0086286366 -0.0397147891 0.0785316931 -0.343449 -0.03802099999999997 0.117957215601 0.0014455964409999978 0.023746400000000004 -0.0189904 0.00036063529216 0.0005638915129600003 1.27254 -0.01678999999999986 1.6193580516 0.0002819040999999953 -0.0254283 -0.0018914999999999974 0.0006465984408899997 3.57777224999999e-06 0.00569831 0.0013932599999999995 3.24707368561e-05 1.9411734275999983e-06 -0.00962462 -0.0014538 2.11353444e-06 9.26333101444e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34079.16796875 249.66796875 1161389689.442276 62334.09461975098 21042.166015625 23.52734375 553.5359039306642 442772750.62912375 22255.61328125 -51.70703125 495312322.5245514 2673.617080688477 1.20698 32.870415 0.5155854 -0.010622850500000001 -0.0793554138 -0.0065753901 0.1078469611 -0.0253457002 0.0018638228 -0.0074477415000000005 0.014533346899999999 -0.0705961271 -0.031876366 -0.0306786731 0.1073651649 0.1532257934 -0.1922761211 -0.034477165 -0.1006896902 0.0206778411 -0.0384002784 -0.0290633915 -0.0199122892 0.1049308435 0.08110754839999999 -0.0292660556 0.0468567163 0.0110999405 0.0713726496 -0.0020264562 0.0319218568 0.0081550111 0.0233849979 0.0746777396 0.0025480325 -0.019559226000000002 0.086303706 0.0001025241 -0.0758074346 0.0361734732 -0.0681782026 -0.0062070363 0.0962124441 0.0346209275 0.0048052741 -0.0380115425 -0.0025789153 0.0364930352 -0.045991936500000004 -0.0721265516 0.0666055052 0.0043515272 0.1237841981 -0.1231718076 -0.020881336 -0.0871838208 -0.0231287261 -0.08915961609999999 0.041384431299999996 0.0278752884 -0.08050880120000001 0.013795056699999999 -0.0644858276 -0.06454067570000001 0.0333865419 0.0024543719 0.0259253012 -0.0216995906 -0.012401838899999998 0.1258858323 -0.028945092599999996 -0.0018098508999999999 0.053158648200000005 -0.0803807122 -0.1164661064 -0.0887413447 0.057500525199999986 -0.013312133899999998 -0.033873792 0.0734322509 -0.357274 -0.013824999999999976 0.12764471107599998 0.0001911306249999993 -0.273387 -0.29713340000000005 0.08828825739556 0.074740451769 1.19381 -0.07872999999999998 1.4251823161 0.006198412899999995 -0.023984900000000003 0.001443399999999994 0.0005752754280100001 2.0834035599999827e-06 0.00585737 0.00015905999999999993 3.4308783316899995e-05 2.530008359999998e-08 -0.010540100000000002 -0.0009154800000000016 8.381036304000026e-07 0.00011109370801000005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 +33622.109375 -457.05859375 1130446238.8244631 208902.55812072754 21022.310546875 -19.85546875 394.23963928222656 441937540.7292519 22127.25390625 -128.359375 489615365.4316559 16476.129150390625 1.141938 31.0991 0.32276029999999983 -0.0398238917 -0.057998314599999996 -0.014037713 0.0249815317 -0.024502802200000003 -0.0007244994999999999 -0.052951035599999995 -0.0303674133 -0.044371457 -0.0391856357 0.1302932426 -0.018510348700000002 0.05255311360000001 -0.0495661603 0.045025151 0.0163901919 -0.0659206301 0.0276232126 0.01166457 -0.0424378679 0.081163001 -0.1266396291 -0.0037804295000000003 0.0308304454 -0.05479953059999999 -0.01208276 0.0795385589 -0.0453441743 0.01906206 -0.0210220643 -0.042001610599999996 -0.0874012859 0.124296454 -0.056161229400000005 -0.0307187254 -0.0208546363 0.06241650400000001 -0.0022543654 -0.011941565500000001 0.0211437411 0.019154827 0.006662826700000001 -0.0578244389 0.0329472232 0.0682848505 0.031222621000000002 -0.1294915062 0.0553598346 0.0273480418 0.045319422000000005 0.0646727107 0.0029800915999999996 0.0583031621 -0.0420360033 -0.0185474713 0.09284755 -0.1016744885 -0.044167975400000004 -0.0744515929 0.0115985821 -0.0211157131 0.020016425 0.0514631336 -0.1142744211 0.0485621924 -0.0175015276 -0.030899032000000007 0.0211465773 -0.041445678900000005 0.045314786399999994 0.0337630426 -0.0350792084 -0.089454464 0.0600420225 -0.0179660749 -0.0278991106 0.06788007459999999 -0.379828 -0.02255400000000002 0.144269309584 0.0005086829160000009 -0.0461042 0.2272828 0.051657471175840006 0.00212559725764 1.21715 0.02333999999999992 1.4814541225 0.0005447555999999962 -0.0246453 -0.0006603999999999985 0.0006073908120900001 4.36128159999998e-07 0.005756300000000001 -0.00010106999999999913 3.3134989690000015e-05 1.0215144899999822e-08 -0.010770299999999998 -0.00023019999999999638 5.2992039999998334e-08 0.00011599936208999995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33809.8828125 187.7734375 1143108175.794983 35258.863830566406 21036.27734375 13.966796875 195.07141494750977 442524964.4831696 22148.638671875 21.384765625 490562195.0172768 457.30820083618164 0.87965 23.95603 0.3731143 -0.0113021975 -0.0932176581 -0.009755564599999999 0.08963881630000001 -0.0167080254 -0.0041021757 -0.032602761800000005 -0.0407724182 0.016674685800000002 0.024384320299999998 0.0320669737 0.0037800640999999997 0.08183769190000001 -0.1022630133 0.0045716399 -0.0403501227 -0.0328828803 -0.11507356980000001 0.0010154545 -0.039910702799999996 0.0635893992 -0.020546003400000002 0.0599770073 -0.0226663602 -0.0005009661 -0.010390355 0.0144949764 0.08651534779999999 -0.0221725954 0.0011778177 -0.056080785300000005 -0.21258148289999998 -0.1191985297 -0.0842541965 -0.0071140171 -0.0555974909 0.08713936470000001 -0.0180551791 -0.010896741399999998 0.08785877119999999 0.0320806279 -0.0068829196 -0.0353381225 0.0442243851 -0.005501236600000001 -0.0192508007 -0.055798737 0.0731404819 0.0244802259 0.08676221449999999 -0.1111890697 -0.0621769145 -0.0366942354 -0.0767515153 -0.0151934505 0.0417740866 -0.0944025638 0.0398737779 0.0523918561 0.043152295199999996 0.0419491762 -0.059904806 0.0872244884 0.0264622142 0.0281341406 0.0749414348 0.10441537099999999 -0.0467035922 -0.01932009 -0.0424161969 0.0235602628 0.029494720800000002 -0.0901455117 0.06252426559999999 -0.022580126699999998 -0.0218143241 0.06190939490000001 -0.375162 0.0046660000000000035 0.140746526244 2.1771556000000034e-05 -0.219392 -0.1732878 0.03002866162884 0.048132849664 1.16684 -0.050310000000000084 1.3615155855999996 0.002531096100000008 -0.0225077 0.0021376000000000034 0.0005065965592900001 4.569333760000015e-06 0.00603521 0.0002789099999999994 3.64237597441e-05 7.779078809999965e-08 -0.0112508 -0.00048050000000000176 2.3088025000000171e-07 0.00012658050064000002 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33690.8671875 -119.015625 1135074531.8457642 14164.718994140625 21033.21484375 -3.0625 9.37890625 442396126.6633453 22180.322265625 31.68359375 491966695.8069801 1003.8501129150392 1.187152 32.330421 0.5025776999999999 -0.044910770999999995 -0.0618042412 -0.0262053956 0.0637943809 0.0169652346 0.0438932215 -0.0787195844 -0.1006024907 0.056946919900000004 0.0181520285 0.083020075 0.048686331799999996 0.0007332751 0.0262131098 0.1076819268 0.0462440023 -0.0234372042 0.1608928562 -0.0559038944 0.0764400248 0.0762785875 0.0723881462 -0.0057657683 0.011187545 0.029442698 0.0503871773 -0.09336432230000001 0.0623713318 0.11060875220000001 0.015074316899999999 0.027750221499999998 -0.0020369328 -0.0197468843 -0.013961783899999998 -0.0481293754 -0.0316617695 0.06967939849999999 0.0322330038 -0.029456256099999998 0.0684108428 -0.0134107283 -0.0530721692 -0.06801554530000001 0.08758408949999999 -0.05232459230000002 -0.0620383871 -0.061864258099999986 0.0009301396000000001 0.050487646 -0.0044485859 0.17434321100000005 -0.0178564208 -0.0467422946 0.0811705783 -0.0470267721 -0.0419896527 -0.0038987319 -0.08830628300000001 0.1009756666 -0.046305277699999994 0.050632276 -0.0052140364 0.0055942002 -0.057130463099999994 -0.0398425846 -0.0417735807 0.10719666580000001 0.080875413 -0.0042960261 0.04749408559999999 0.0148766844 -0.1245600982 -0.0908143174 0.0649448048 -0.027144045 -0.015643446499999998 0.0555570233 -0.35072800000000004 0.02443399999999996 0.12301012998400004 0.0005970203559999978 0.0506412 0.27003320000000003 0.07291792910223999 0.00256453113744 1.1776 0.010760000000000105 1.38674176 0.0001157776000000022 -0.0239203 -0.0014126000000000034 0.0005721807520900001 1.9954387600000097e-06 0.00638711 0.0003518999999999996 4.0795174152099986e-05 1.2383360999999975e-07 -0.00906829 0.0021825100000000004 4.7633499001000015e-06 8.223388352409999e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 +33742.41796875 51.55078125 1138550770.3778226 2657.483047485352 21088.443359375 55.228515625 3050.188938140869 444722443.32156754 22242.4375 62.115234375 494726025.9414063 3858.3023414611816 1.407125 38.321102 0.4464819999999999 -0.0337418198 -0.033865957599999996 -0.0061407231 0.0849826786 0.087518552 0.0634259073 -0.0324929177 -0.0322160625 -0.0478713308 0.09455489619999999 0.039392868399999996 0.0075840415 -0.0228052698 0.040712145299999995 0.1070627863 0.028809875099999997 0.059170307699999994 0.144981528 0.0255126265 -0.0349627897 0.0878405847 -0.0977933148 -0.0667413771 -0.0011857779 0.0795663167 -0.0032002861999999997 -0.043274077300000005 -0.028629015499999997 0.0364090649 0.0091189621 -0.18094254010000002 0.0465922939 -0.009213718000000001 0.0256642449 -0.0209681291 -0.029374124300000002 0.052985823499999994 0.0702351546 -0.0060339695999999995 0.0878047066 -0.0911811724 -0.054797770499999995 0.0063100208 0.0597393446 0.0541982122 -0.050702745199999996 -0.0151567344 0.0265949829 0.0378465235 -0.0534402115 0.144058708 0.0094333597 -0.08350181200000001 0.05429471190000002 0.0480894975 0.077837369 -0.0622623363 0.0113765852 -0.0322181683 -0.0348608913 0.0082740424 0.0400284548 -0.17800711989999998 -0.0624909644 -0.1051533147 -0.0168119204 -0.051787875 0.021540113 -0.049112996900000004 -0.0781623518 -0.034833811299999996 -0.0733249735 -0.091460716 0.0673012514 -0.0316476967 -0.0094108313 0.0488621241 -0.365416 -0.014687999999999925 0.133528853056 0.00021573734399999776 -0.0120873 -0.06272849999999999 0.003934864712249999 0.00014610282128999996 1.15067 -0.0269299999999999 1.3240414489 0.0007252248999999947 -0.0203018 0.0036185 0.00041216308324000013 1.3093542250000003e-05 0.008738249999999998 0.002351139999999998 7.635701306249996e-05 5.5278592995999914e-06 -0.008195219999999998 0.0008730700000000017 7.622512249000032e-07 6.716163084839997e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33849.24609375 106.828125 1145771461.1152494 11412.248291015625 21046.5390625 -41.904296875 1755.9700965881348 442956806.5093384 22211.759765625 -30.677734375 493362271.8858376 941.1233863830566 1.319616 35.93791599999999 0.4724562 -0.019363116899999998 -0.0789947451 -0.0096436487 0.0631433399 0.0357723992 0.0157298284 -0.0249920613 -0.034514788500000004 -0.0497281266 0.033581540099999994 0.0175232899 0.0544377958 -0.0070829846999999994 -0.060705371200000004 -0.022151104100000003 0.0779197213 -0.042513090700000006 0.0901908994 0.0146879977 0.057578098200000004 0.012754540600000001 0.1772071622 0.0380226833 0.0151238185 0.0012788536 0.1787297564 0.0920268342 -0.1108324051 -0.0379199646 -0.0258908981 -0.0321741397 -0.04924705150000002 0.011369816000000001 0.0062742987 -0.0126544648 -0.052511050999999996 0.0450668308 0.0136127908 -0.011922288 0.0647551334 -0.027753114500000002 -0.027081527299999998 -0.018967939 0.0342878202 0.0570103088 -0.063216488 -0.0017628894 0.0385192531 -0.010120007700000001 0.07794346320000001 0.0820964293 0.0854787125 -0.006647740500000001 0.0385457366 -0.1095160191 -0.0418054078 0.0728034957 -0.11538047470000001 -0.0013899487 -0.0529848956 -0.06940814299999999 -0.0929810264 0.0036730514000000002 0.022548001 -0.0274820183 0.1403791599 -0.0273513658 -0.0792144738 -0.0450396396 -0.0203807519 -0.046720089699999995 0.1042545057 -0.092084548 0.0695912797 -0.036081082599999995 -0.0031410759000000004 0.0418659738 -0.328424 0.03699199999999997 0.107862323776 0.0013684080639999976 -0.12953399999999998 -0.1174467 0.013793727340889995 0.016779057155999994 1.19656 0.04588999999999999 1.4317558336000002 0.0021058920999999986 -0.023828400000000003 -0.003526600000000001 0.0005677926465600001 1.2436907560000007e-05 0.00855139 -0.00018685999999999706 7.312627093210001e-05 3.4916659599998887e-08 -0.00646613 0.0017290899999999982 2.989752228099994e-06 4.18108371769e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33652.4453125 -196.80078125 1132487075.5108032 38730.54750061035 21013.8828125 -32.65625 1066.4306640625 441583270.8574829 22127.603515625 -84.15625 489630837.3446999 7082.2744140625 0.836299 22.775427 0.15241470000000001 -0.0161761705 -0.0490088991 -0.0146489225 0.0303588566 -0.0250599398 0.0387690646 -0.0831262441 0.0637959971 0.0143394726 -0.07632294740000001 0.028979818900000006 -0.052125061900000005 -0.0479143752 -0.0211377673 -0.0714469836 0.0643220869 0.0350899165 0.06643677419999999 0.0260118925 0.051570577199999995 -0.0328871383 0.0332183815 -0.0181049674 -0.0433043937 -0.0636283274 -0.0027678018 0.0716876264 0.023416076 0.0588435719 -0.059356522099999996 -0.0287647779 -0.0139945211 0.1017924726 0.0062905161 -0.0104669666 -0.0133795778 0.0721567983 -0.0057401052 -0.014538566299999996 0.019768338400000002 0.018735375500000002 -0.050647138 -0.09024427230000001 -0.0834646948 0.0104328384 0.054079742199999996 -0.0067262784 0.0405288383 -0.0532161015 -0.0078043394 0.0334622056 0.1117684339 0.0213675171 0.0718600395 0.0569657432 -0.041398467 0.0466936606 0.0175298521 -0.0201369923 -0.0159708904 0.0169542874 -0.0048300768 0.0609807163 -0.0443146328 0.0166087999 -0.0113187658 -0.052834268499999996 -0.016949099999999998 0.0586527042 0.0812108141 0.0207183206 0.017848655800000002 -0.09268565960000001 0.0718126298 -0.0404343596 0.0031410759000000004 0.034611705699999995 -0.34606 -0.017635999999999985 0.11975752359999997 0.00031102849599999946 -0.0486708 0.08086319999999997 0.006538857114239997 0.00236884677264 1.24865 0.05208999999999997 1.5591268225 0.002713368099999997 -0.0238649 -3.649999999999834e-05 0.0005695334520100001 1.3322499999998788e-09 0.00855139 0.0 7.312627093210001e-05 0.0 -0.00646612 9.999999999940612e-09 9.999999999881223e-17 4.18107078544e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33892.32421875 239.87890625 1148689640.9488678 57541.88966369629 21034.140625 20.2578125 410.37896728515625 442435071.8322754 22160.259765625 32.65625 491077112.87997824 1066.4306640625 0.8573819999999999 23.349606 0.3638697 -0.0064746337 -0.0395713053 -0.0049119328 0.0629512585 0.0072217243 0.0125468082 0.017557317 -0.034678503 -0.0272569702 0.0138317089 -0.0779425624 0.0919495608 0.0731327762 -0.046076245300000006 0.0122188522 0.00036060910000000016 0.0216073473 -0.0172287172 -0.0290352712 0.0064670115000000005 0.023011069900000004 0.1104351391 -0.017257019499999998 -0.0062415906 0.033691456200000004 0.1575403406 -0.0082615462 -0.00581754 -0.027229808799999998 0.0069689137 0.0333533918 0.0526218204 0.0264241278 0.0379196822 0.0001872424 -0.039469099199999996 0.0070176632 -0.0235404064 -0.0045730456 0.0632899525 0.0025102559 -0.0162252827 0.006856923399999999 0.0363555656 -0.0121357074 -0.042074340999999994 0.0326095282 0.008366144499999999 0.0658683325 0.0565010797 -0.0556484888 0.0041574595 -0.0673444196 0.0016725578 -0.1093565234 -0.0278933066 0.0600177654 -0.0629653477 0.0238616677 -0.0945079445 -0.019215811699999998 -0.0560457505 -0.0317891117 0.010675298100000001 -0.062342673099999996 0.0010126763 0.0141015053 -0.015476722 0.0785671339 0.0217394524 0.08454805130000001 -0.0220322563 -0.0932639023 0.0739631095 -0.0446978621 0.0094108313 0.027144045 -0.370137 -0.02407700000000001 0.137001398769 0.0005797019290000008 -0.258335 -0.2096642 0.04395907676163999 0.066736972225 1.26934 0.020689999999999875 1.6112240355999998 0.00042807609999999483 -0.0240338 -0.00016889999999999958 0.0005776235424400001 2.8527209999999863e-08 0.007747549999999998 -0.0008038400000000027 6.002453100249997e-05 6.461587456000044e-07 -0.007682149999999999 -0.001216029999999999 1.4787289608999974e-06 5.901542862249998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33929.5546875 37.23046875 1151214681.2920532 1386.1078033447266 21042.8984375 8.7578125 76.69927978515625 442803574.65094 22191.71484375 31.455078125 492472207.70631415 989.4219398498536 0.8736520000000001 23.792694 0.1954805 -0.0101286663 -0.0461735331 -0.0030145467999999997 0.055882569400000005 -0.0080818796 -0.0223101665 0.0338423083 -0.0784927182 0.0771333209 0.0958662905 -0.0381353757 0.043415409 0.0083883352 -0.0468491183 -0.0347079963 -0.0644371936 -0.058009727699999986 0.0504184677 -0.0610764054 0.0248743365 -0.0053306386 0.1119179067 0.0088278712 0.014284048600000003 0.0202699832 0.0145211479 0.0568348483 -0.0151105803 -0.0174520909 -0.0768438533 -0.0196720396 -0.0566382254 0.0175381071 -0.0248550625 -0.0163591478 -0.0531768089 0.0106382105 -0.013842445600000001 -0.0004576248 0.0649037504 0.016391168799999998 0.0170698297 0.0439531046 0.07726728969999999 -0.0999960973 -0.09046468419999999 0.0127632967 0.0428544 -0.0556984304 -0.0047663841 -0.022394652200000004 -0.04836836940000002 -0.0080356461 0.0188350798 -0.0533177841 -0.0161491302 0.052250892199999996 -0.0320174375 -0.0011382859 0.0102734867 -0.0296879843 -0.0200512247 0.0706419462 -0.0318368681 0.0065670713 0.09272219960000001 -0.048360386 -0.051157435300000005 0.0093609776 0.0876220891 -0.0276880402 0.0397181373 -0.0938191336 0.0760405966 -0.0488621241 0.015643446499999998 0.0195090322 -0.389217 -0.019079999999999986 0.15148987308899994 0.00036404639999999946 -0.212875 0.045459999999999966 0.002066611599999997 0.045315765625 1.27453 0.005190000000000028 1.6244267208999998 2.693610000000029e-05 -0.0235515 0.0004823000000000015 0.0005546731522499999 2.3261329000000144e-07 0.00709547 -0.0006520799999999977 5.034569452090001e-05 4.2520832639999685e-07 -0.00906278 -0.0013806300000000007 1.9061391969000019e-06 8.213398132839999e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33756.9375 -172.6171875 1139530829.3789062 29796.69342041016 21042.6953125 -0.203125 0.041259765625 442795026.0147095 22204.16015625 12.4453125 493024728.2444 154.88580322265625 0.908846 24.751167 0.4052695000000001 -0.0175277329 -0.0016156610999999998 -0.0168755402 0.0056765187 0.036528349 -0.0392747841 0.025645111499999998 -0.1061145797 0.0592628024 0.0834883383 0.0404798246 0.0227608587 -0.0866819199 -0.0283432389 0.0680438525 0.0490221747 0.032796942200000005 0.0357229126 -0.0235864421 0.1071701847 -0.025106024700000003 0.09559198810000001 -0.0045533788 -0.0427802524 -0.0250162144 -0.028521690099999997 -0.0170808498 0.025252801499999998 0.05807349730000001 -0.0273501148 -0.043679509400000004 -0.0151400781 0.0810241165 -0.042312080499999995 -0.0240786505 4.09957e-05 -0.00037876800000000003 0.0059426923 -0.0171216606 0.0166005031 -0.030968169900000002 0.0351827248 0.05293495559999999 0.106508911 -0.050668614400000006 -0.0678894119 -0.011152978700000002 -0.0092660289 -0.032819028199999996 0.026032141600000003 0.08467360439999999 0.0339798967 0.0010753971 0.0978832526 0.1029059098 -0.0763715209 0.057436387900000004 -0.047109186399999996 0.0199225408 0.0030596802 0.07900095160000001 -0.043416729 0.0402254689 -0.0811802242 0.0201056408 0.0484363242 -0.0033170522999999997 0.0850308935 -0.0055233191 0.050246754500000004 -0.013604433999999999 0.038407492599999996 -0.09435121640000001 0.0780430407 -0.0529179001 0.0218143241 0.0117537397 -0.395608 -0.0063910000000000355 0.15650568966400005 4.0844881000000455e-05 0.0018755 0.2147505 0.046117777250250014 3.51750025e-06 1.33765 0.06312000000000006 1.7893075225 0.003984134400000008 -0.0246692 -0.0011177000000000027 0.0006085694286400001 1.2492532900000064e-06 0.00606088 -0.0010345900000000002 3.673426637440001e-05 1.0703764681000004e-06 -0.008794909999999998 0.00026787000000000165 7.175433690000088e-08 7.735044190809998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33703.53515625 -53.40234375 1135928282.0285795 2851.810317993164 21009.3828125 -33.3125 1109.72265625 441394166.1621704 22207.4296875 3.26953125 493169933.3252564 10.689834594726562 0.990041 26.962391 0.1870111 -0.0086595505 0.022740682999999998 -0.004211562 -0.023720622 -0.0041134301 -0.0092104163 0.0073251694 -0.030930418900000006 -0.0136183069 0.001430053 0.032784643599999996 0.051715960899999996 -0.0332236965 0.0181453499 0.031121113199999998 -0.06377700230000001 0.0513684839 0.033477445099999996 0.0336601307 0.0032304896000000002 -0.0954103258 -0.0539882454 -0.0904904033 0.0419247519 -0.0145013244 0.0252604917 0.0076933721 0.066665125 -0.033048571 -0.041266245099999994 0.006536317099999999 0.1535481924 0.1580429793 0.0318654658 -0.0095416376 0.022306724 -0.0159394967 0.0052137808 -0.0025651838000000002 -0.018571924899999998 0.0070891386 0.012886628899999999 0.0040701368 0.046433521500000005 0.0117286356 -0.0260493254 -0.0469528161 -0.0628232292 -0.044703404599999996 -0.0014211652 0.043735139299999996 0.026146494300000003 -0.0382007394 -0.044358145300000006 0.0463191557 -0.047229578 0.050737371600000004 0.0620284729 -0.0795075105 -0.0256861423 -0.048445277099999996 -0.04568474769999999 -0.095935798 0.0404712113 0.024363665899999998 -0.1369049455 -0.172195111 0.0199769702 -0.022520455800000002 0.0636278156 -0.009885971 0.0045192654999999995 -0.09486001949999999 0.0799684658 -0.0568561851 0.0278991106 0.0039259816 -0.393537 0.002071000000000045 0.15487137036899998 4.289041000000187e-06 -0.0763586 -0.0782341 0.00612057440281 0.00583063579396 1.37343 0.035779999999999916 1.8863099649000001 0.0012802083999999946 -0.0246741 -4.899999999995187e-06 0.0006088112108099999 2.400999999995282e-11 0.00730623 0.00124535 5.338099681290001e-05 1.5508966225000005e-06 -0.008963179999999998 -0.00016826999999999988 2.8314792899999958e-08 8.033859571239996e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33982.07421875 278.5390625 1154781368.2086337 77584.00933837889 21023.73046875 14.34765625 205.8552398681641 441997242.82264715 22219.75 12.3203125 493717290.0625 151.79010009765625 0.8586860000000001 23.385117 0.3622158999999999 0.0034931277 -0.0237494787 -0.0021648353 0.0406304345 -0.0067060552 -0.006486861899999999 0.0316594809 -0.05927283730000001 -0.021290088399999997 0.0390931172 -0.038612333 0.0544360204 0.0360150057 0.0046603334 0.0166674091 -0.0905070855 -0.0671029715 -0.0646162027 0.015467988500000003 0.014388461399999997 0.0296852471 0.0529292275 -0.0238456131 -0.0081852469 0.0070512077 -0.0642348544 0.076946075 -0.022446763300000002 -0.0835244058 -0.0489826094 -0.100385219 0.0769542562 0.040299414 0.0060997892000000005 0.0019419553 -0.0335057752 -0.027047428999999998 0.0106098376 -0.0013143488 0.0407031235 0.021074685899999997 0.0045221475 0.024767546 0.0807001018 0.0053458301 -0.039903106699999996 0.0053953127 -0.027002578 -0.0010386105 0.0004084433 -0.0390004006 -0.090259546 -0.0316612362 -0.0455993603 0.011394844599999999 0.0753742172 0.09748613589999999 -0.0264975701 -0.048834757400000005 0.0202160426 -0.045306489000000005 0.050812578600000005 -0.0675127378 -0.0148810092 0.0193523227 0.08977244029999999 -0.08922159140000001 -0.0780017359 -0.0163197231 0.0630541389 -0.0116702083 0.0188207892 -0.0953454172 0.0818149717 -0.060668235099999995 0.033873792 -0.0039259816 -0.424346 -0.03080900000000003 0.18006952771600002 0.000949194481000002 -0.1745 -0.0981414 0.009631734393959998 0.030450249999999995 1.2901300000000002 -0.08329999999999971 1.6644354169000006 0.006938889999999951 -0.0234782 0.0011958999999999965 0.0005512258752400001 1.4301768099999911e-06 0.00789012 0.0005838900000000001 6.22539936144e-05 3.409275321000001e-07 -0.0101827 -0.0012195200000000034 1.4872290304000083e-06 0.00010368737929000004 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33616.0859375 -365.98828125 1130041233.7573853 133947.4220123291 21000.76953125 -22.9609375 527.2046508789061 441032320.9046784 22199.703125 -20.046875 492826818.8381348 401.877197265625 0.819543 22.319103 0.3997777000000001 -0.0054564404 0.0052444189000000006 -0.0141944475 -0.0165360948 -0.028973584700000006 -0.031828703199999996 -0.043383697 -0.0620557844 0.0503402446 -0.0232557823 0.0687925685 -0.0578257041 -0.0746527349 -0.0331025316 0.0161875117 0.0439674091 -0.0592376588 -0.0049119478 -0.08710622220000001 0.0925288513 -0.06273151440000001 -0.0092683778 0.0468001535 -0.06470075139999999 0.07908248849999999 -0.114544855 0.05536177849999999 0.039309329 0.0887834644 0.042953268200000005 0.0213685676 -0.038102189 0.0658995763 -0.0140808026 -0.0168050713 0.0197317855 0.041619833700000004 -0.0336157686 -0.0117999275 -0.010585993 0.0253648796 0.038867482099999996 -0.043179807599999995 0.042399964500000005 -0.0290164464 0.0368639273 -0.05232187519999999 0.0369960767 -0.0773943124 0.024264621400000002 0.07135028269999999 -0.04874962099999999 0.1083232452 0.0528702452 0.0778926801 -0.097603556 -0.0554542434 0.0473358151 0.0316808794 -0.0412232528 0.11474369640000001 0.0382921554 0.060575445 -0.08694605300000001 0.0471227153 0.105860675 -0.07340667969999999 0.0358722326 0.0335067455 -0.0154967743 -0.0086267582 0.11004783550000001 -0.09580728990000001 0.0835807361 -0.06434558650000001 0.0397147891 -0.0117537397 -0.406698 0.017647999999999997 0.165403263204 0.0003114519039999998 -0.0436463 0.13085370000000002 0.017122690803689996 0.00190499950369 1.32871 0.03857999999999984 1.7654702641000002 0.0014884163999999873 -0.0259838 -0.0025055999999999967 0.0006751578624399999 6.278031359999982e-06 0.00655078 -0.0013393400000000005 4.29127186084e-05 1.793831635600001e-06 -0.00977372 0.0004089800000000015 1.6726464040000125e-07 9.55256026384e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33739.21484375 123.12890625 1138334618.2727206 15160.727554321289 21032.376953125 31.607421875 999.0291175842284 442360880.29834366 22214.865234375 15.162109375 493500237.38144296 229.8895606994629 0.839354 22.858635 0.21382829999999992 0.0012410533 0.0062228131 -0.0082750329 0.0012736471 0.0125525909 -0.0574371787 0.0368326686 -0.0038702013 0.0338672927 0.0267703512 -0.0076919575 -0.0319672134 0.005289140899999999 -0.1437958094 0.041480066 -0.051574778700000004 0.0680205289 -0.0096918745 -0.0429471314 0.0335507911 0.0013609465 -0.0062527864 -0.11885894710000001 -0.0780221185 -0.030949048 0.0686151234 0.0346083753 0.015419810800000001 -0.0259868514 -0.0012203819999999999 -0.06894983360000001 -0.1240344297 -0.0049877844000000005 0.0361790108 -0.0014660968 0.0129341888 0.0088653093 -0.0665457604 -0.0049097609999999995 0.0129644262 -0.013074532 0.0564522076 0.0424072888 0.0077855784 -0.0480152026 -0.0001025889 -0.0297720948 0.0735778622 -0.0590863566 0.087168607 -0.037417740899999996 -0.0073400637 -0.0464404581 0.0537755951 0.0237442236 -0.0318577317 -0.013116411299999998 -0.0269513158 -0.1239531953 -0.0002653935 0.0588367069 -0.0912291143 0.0198830298 0.0415203605 0.0072254629 0.12068871130000006 0.022220661200000002 0.057736865899999996 0.0426411543 0.013249287700000001 0.11310630890000001 -0.0385921427 -0.0962455236 0.0852640164 -0.06788007459999999 0.04539905 -0.0195090322 -0.370184 0.03651399999999999 0.13703619385600002 0.0013332721959999994 -0.0711831 -0.0275368 0.0007582753542400001 0.00506703372561 1.3544 0.02568999999999999 1.83439936 0.0006599760999999995 -0.0268007 -0.0008169000000000022 0.00071827752049 6.673256100000038e-07 0.00531561 -0.0012351699999999998 2.82557096721e-05 1.5256449288999996e-06 -0.00934404 0.00042968 1.846249024e-07 8.731108352159999e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33735.8828125 -3.33203125 1138109789.138733 11.102432250976562 21020.27734375 -12.099609375 146.40054702758792 441852059.6081696 22227.341796875 12.4765625 494054723.3551064 155.66461181640625 0.8536709999999998 23.248549 0.23000539999999994 -0.0048705753 0.0358763143 0.0067535858 -0.024976617200000002 0.0114547423 -0.0513787713 0.0318624208 -0.038555368199999995 0.0009122144 0.029626483199999998 0.023715206699999998 0.0059809886 0.0047005785 0.0131747787 0.10194042369999999 -0.0569839796 -0.0459219777 -0.054437537599999995 -0.0936529694 -0.0457426295 -0.0598911716 -0.0121664257 -0.1066347081 -0.066171417 0.06768710309999999 -0.085855826 0.1241030043 -0.044661991100000006 0.0394561605 -0.0566186986 0.0452695713 0.1369107401 0.043467943200000005 0.010269334599999999 -0.0079934115 0.0180828649 -0.0422592315 0.0013866094 0.0077467828 -0.0157031807 -0.0059538376 0.0597107944 0.0356776321 0.0479376263 -0.0044842653 -0.0172298931 -0.0180477841 -0.019784224 -0.0019531346 0.0379480072 -0.011957336599999998 -0.136930759 0.0565380202 0.044929856100000005 0.023720160299999998 0.0156552254 0.08422882220000001 0.0285702314 -0.1188104584 -0.1099785051 0.0703009259 0.0567561366 -0.0308074432 0.009275300799999999 -0.0007517787 -0.1165953027 -0.1657165672 0.0052997536 0.037805796 -0.0917109436 0.0348929981 -0.032305619300000005 -0.0966600102 0.0868631514 -0.07126385190000001 0.0509041416 -0.027144045 -0.4138979999999999 -0.04371399999999992 0.17131155440399995 0.001910913795999993 -0.08766999999999997 -0.016486899999999968 0.000271817871609999 0.007686028899999996 1.36981 0.015409999999999925 1.8763794361000001 0.00023746809999999766 -0.0268007 0.0 0.00071827752049 0.0 0.00695484 0.0016392300000000002 4.83697994256e-05 2.6870749929000004e-06 -0.0107927 -0.001448660000000001 2.0986157956000025e-06 0.00011648237329 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33877.66015625 141.77734375 1147695857.6623688 20100.815200805664 21062.734375 42.45703125 1802.5995025634768 443638779.3518066 22240.69921875 13.357421875 494648701.73890686 178.42071914672852 0.9038830000000002 24.615992 0.21244500000000008 0.0212267877 0.059060225099999995 0.0139213805 -0.059543010999999986 0.06320904150000001 -0.053595813099999993 0.1120681134 -0.0756274954 0.0983266732 0.0899715736 0.008742682 -0.06377326400000001 -0.0684175014 -0.0385753957 -0.0360577454 -0.0375450912 -0.0330951454 -0.0496803718 -0.09627185490000001 0.0023622649 0.010700570900000001 -0.08550386869999999 -0.0109354355 -0.06743033650000001 -0.0735801738 -0.0015698204000000001 -0.0219196229 0.0252695133 -0.0047934366 0.0430758815 -0.0154808747 -0.0697516896 -0.0478335897 0.0745246322 0.0087607137 0.030206613599999998 -0.0800100812 -0.0241585223 0.0159797663 -0.044762696100000006 -0.059959473 0.0500181788 0.1344161682 0.07420922049999999 -0.10592136220000001 -0.0132022908 -0.025379995 0.0452989309 -0.1302939362 -0.0351012537 -0.023638802599999998 -0.0730466921 0.0792467034 0.0472856861 -0.0006670807 0.0018037388 -0.08861716900000001 0.019301999099999998 -0.0370329814 0.0952756024 0.0453238088 0.002901982 0.0117869269 -0.0588995497 0.0539060149 -0.0013296426 0.0847801265 -0.0784108935 -0.0377325326 -0.0033691051 0.0140730803 -0.0464498566 -0.0970506473 0.088376563 -0.0744894057 0.0562083378 -0.034611705699999995 -0.440257 -0.026359000000000018 0.193826226049 0.0006947968810000013 -0.139085 -0.051415000000000016 0.002643502225000001 0.019344637225 1.4931299999999998 0.12331999999999987 2.2294371969 0.015207822399999968 -0.0268007 0.0 0.00071827752049 0.0 0.00718186 0.00022701999999999965 5.15791130596e-05 5.1538080399999835e-08 -0.0107927 0.0 0.0 0.00011648237329 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33696.66796875 -180.9921875 1135465432.1961825 32758.17193603516 20958.255859375 -104.478515625 10915.760227203371 439248488.6670265 22236.705078125 -3.994140625 494471052.73151016 15.95315933227539 1.005478 27.382782 0.3740923 0.026223047000000003 0.1255689123 0.006527541800000001 -0.122671208 -0.0129157529 -0.030661541 -0.0108395437 -0.1156783999 0.04635784019999999 -0.05618911150000002 -0.026712318999999998 -0.0196207304 -0.0538460662 -0.0079448454 -0.0030886347999999997 -0.024392687799999997 0.0653324688 0.0039078345 -0.1142252668 0.048180369199999996 0.1066296608 -0.0370716651 -0.019597515 -0.1109099775 -0.1400834318 -0.0775767493 -0.0690561546 -0.0675959759 -0.0368797814 0.0430100166 0.11039047119999999 -0.021051950899999998 0.0460206957 0.09398954279999999 0.0206462218 0.0857255122 -0.0910865074 -0.0245110471 0.0101479028 -0.1207519239 0.0067558449 0.0373376031 -0.032420613 0.09544048320000001 -0.0806431683 0.0404600574 0.0043141091 -0.040074835499999996 -0.0540904101 -0.0011983511 -0.0358782113 0.025512568500000003 0.0106388678 0.1532878945 -0.0372998876 0.0324537096 -0.0149172752 -0.0806129407 -0.0391191189 0.1282815383 0.1069369641 0.013820179299999999 0.0293552685 -0.0023880648 0.042098912599999996 -0.1421848058 0.034422715 0.05376697440000002 -0.027023649900000002 -0.040383620499999995 -0.0354050668 -0.126566633 -0.0974173387 0.08980275759999999 -0.0775495743 0.0612907054 -0.0418659738 -0.457174 -0.016917000000000015 0.209008066276 0.0002861848890000005 -0.0012692 0.1378158 0.01899319472964 1.6108686399999999e-06 1.59735 0.1042200000000002 2.5515270225 0.010861808400000042 -0.0279097 -0.0011089999999999989 0.0007789513540900001 1.2298809999999974e-06 0.00767475 0.0004928900000000002 5.89017875625e-05 2.429405521000001e-07 -0.0100918 0.0007009000000000008 4.912608100000012e-07 0.00010184442724 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33794.77734375 98.109375 1142086975.7136385 9625.449462890623 20983.486328125 25.23046875 636.5765533447267 440306698.4826088 22288.8984375 52.193359375 496794993.55718994 2724.1467628479004 1.0443 28.44005 0.4225938 0.021861437200000004 0.0731997222 0.0094986997 -0.053976083200000004 -0.0315379205 -0.0348709726 0.0451038375 -0.058487159000000004 0.0182751695 0.0109937293 -0.1279806476 0.017879518799999997 0.0415640736 0.015529696 -0.022171198700000002 -0.10058007460000001 0.0529857505 -0.0429436932 -0.0716619584 -0.098130404 -0.0697839675 -0.1114699651 -0.0144828885 -0.0229513594 -0.0634764865 -0.06787364280000001 -0.0518229199 -0.020979591000000002 -0.057324019299999994 -0.013067602099999999 0.0576749729 -0.0087497752 0.0570152846 0.046924264199999996 0.0190341301 0.042387985700000005 -0.0605665954 -0.0218590844 0.0076309703000000005 -0.053875047 0.036760059 0.0440098853 0.0338818609 0.0631300778 -0.0690080679 -0.011133770800000001 0.08082461490000001 -0.027649108500000002 -0.0082061199 -0.010295164 -0.1321303904 -0.045901614 -0.0059147339 0.0048692859 -0.0240696039 0.0073670467 -0.05886179 0.1324899269 -0.06944210370000001 0.1261055729 0.0171747913 -0.0124288215 0.021693655200000002 -0.0526022463 -0.0200173492 -0.054486988099999994 -0.017667469499999998 -0.0038245987 0.1183421618 -0.00744186 0.052410143799999996 -0.0266569081 -0.09775999380000001 0.0911403277 -0.08043756349999999 0.06613118650000001 -0.0488621241 -0.4750430000000001 -0.017869000000000083 0.22566585184900004 0.00031930116100000285 -0.102691 -0.1014218 0.01028638151524 0.010545441481 1.4682 -0.1291500000000001 2.15561124 0.016679722500000025 -0.0258835 0.0020262000000000023 0.0006699555722499997 4.105486440000008e-06 0.00791911 0.0002443599999999999 6.27123031921e-05 5.971180959999995e-08 -0.0113043 -0.0012125 1.47015625e-06 0.00012778719849 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34049.58984375 254.8125 1159374568.5276034 64929.41015625 21026.98046875 43.494140625 1891.7402687072754 442133907.633194 22337.26171875 48.36328125 498953261.0919342 2339.0069732666016 1.393045 37.937634 0.8321215499999999 0.0177444668 -0.0061177404 0.0165412362 -0.0350604932 0.0122816003 -0.016764803300000002 0.0051261796 0.1561710234 -0.10072938619999999 -0.0408664719 0.047317848499999995 -0.10825446400000001 -0.0124553279 -0.0429221245 -0.1117312121 0.0403570615 -0.1021665184 0.09773121720000001 0.07789756519999999 0.0464544462 -0.0882473882 -0.0594493107 0.0382735855 -0.0693242775 -0.0040197636 0.0785986003 -0.002077971 0.0721586639 0.0409957653 0.056067026299999996 0.076079725 0.0307450284 -0.026746959100000002 0.0149084373 0.020081073999999997 -0.0268389715 -0.018549881100000002 -0.040836116 0.013800101799999999 -0.046805668499999994 -0.0226268175 0.0173393081 -0.004159708 -0.13106277789999998 0.1352177601 0.0715009343 0.0090221156 0.10841316179999999 -0.079940798 -0.0402054689 0.0956159234 0.0897438478 0.06698832889999999 -0.1448245183 -0.0374538726 -0.0774078251 -0.052344530099999995 0.0028863276 0.0108650056 -0.054693402599999996 0.09708234 -0.0658610786 -0.014436440600000001 -0.0278787213 0.0168827499 -0.07245267150000001 -0.021103551 0.008849393 0.051076212999999995 -0.057755470999999996 -0.061807093499999986 0.024193020899999997 -0.09807852800000001 0.0923879533 -0.08314696120000001 0.0707106781 -0.0555570233 -0.383305 0.09173800000000004 0.146922723025 0.008415860644000007 -0.00476845 0.09792255 0.0095888257985025 2.27381154025e-05 1.27584 -0.1923600000000001 1.6277677055999995 0.037002369600000036 -0.0266883 -0.0008048000000000012 0.0007122653568899999 6.477030400000022e-07 0.0100054 0.0020862899999999998 0.00010010802916 4.352605964099997e-06 -0.00519337 0.00611093 3.7343465464899986e-05 2.69710919569e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 +33847.87109375 -201.71875 1145678377.5791168 40690.4541015625 20990.23046875 -36.75 1350.5625 440589775.1312408 22276.1328125 -61.12890625 496226093.0801392 3736.743179321289 0.947981 25.816942 0.4210205500000001 0.0214824538 0.0103986075 0.01724379 -0.0357781254 -0.0390542671 -0.0302414234 0.0364418802 -0.0107734849 -0.0325102202 0.013985087700000001 0.1113531961 -0.0255173946 -0.0267590771 -0.0193037296 -0.027391995099999997 -0.0091596356 -0.09128434939999999 -0.0254375523 0.0457353636 -0.036442631600000004 -0.11558911640000001 0.0013606703 -0.0198071591 0.0209673233 -0.09429540460000001 -0.0071888909999999985 -0.029358015 -0.0660929277 0.0340234795 -0.05770580190000001 0.0189034118 0.013955693 0.023181214 -0.1256411814 0.0173172243 0.0118775409 -0.0138864714 -0.0119207858 0.0173083459 -0.044621300700000005 0.0310329527 0.0326678008 0.0487118551 0.0183534916 0.0692257146 0.016708631499999998 -0.08676226849999999 -0.0052622298 -0.0467236153 0.0252037188 0.0281271786 0.0183978731 0.0805059279 -0.085228956 0.028198614500000007 -0.0249679775 0.08760834619999999 0.016308585 -0.06155601910000001 0.06328216910000001 -0.0711379765 -0.0739923611 0.0656585087 -0.0286179861 0.0016729414000000002 -0.0408199458 0.0093591525 0.0505278147 -0.018061041200000003 -0.1409309943 -0.0356845993 0.0607044557 -0.0983728629 0.0935444031 -0.0856717519 0.07501110700000001 -0.06190939490000001 -0.40659 -0.023285 0.1653154281 0.000542191225 -0.191982 -0.18721355 0.035048913303602484 0.036857088324000004 1.34877 0.07293000000000016 1.8191805128999998 0.0053187849000000224 -0.026169900000000003 0.0005183999999999954 0.0006848636660100003 2.6873855999999516e-07 0.0103472 0.00034180000000000153 0.00010706454784 1.1682724000000101e-07 -0.00708501 -0.00189164 3.5783018896e-06 5.01973667001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33645.87109375 -202.0 1132044641.6572418 40804.0 20943.2109375 -47.01953125 2210.8363189697266 438618084.3726196 22225.615234375 -50.517578125 493977972.54648215 2552.0256996154785 0.800819 21.809189 0.3571677000000001 0.0145359247 0.0337713605 0.0091129965 -0.07542755429999999 -0.0528618472 -0.0203265113 -0.061454279199999996 -0.0092782542 0.0076763298 -0.04960222 0.0757568889 -0.0180687902 -0.0525344596 -0.0067593746 -0.0292713764 0.0560405172 -0.0245285307 0.0403986635 0.0548250167 0.0551665013 -0.026156534300000003 -0.0123981566 -0.0158276433 0.0756487047 0.0390878905 -0.09566666230000001 0.0206333658 -0.0281132726 0.0466730907 -0.0456951348 -0.0383557883 0.0523497477 0.1090795535 -0.032953676099999996 0.0090735276 0.052946211900000005 0.0103347818 0.0020649171 0.0075646818000000005 -0.0793792041 0.045202013099999994 0.0217808614 -0.0819608015 -0.007517139399999998 0.0151055068 0.0103418217 -0.0258972751 0.0044604205 -0.040773649599999996 0.0004861304 0.0732483583 0.052114943899999995 0.0335277794 -0.0193880091 0.090434495 -0.0553218657 0.0130219431 0.0093680729 -0.047505106799999995 -0.015418351100000003 -0.0455254078 0.0740513953 -0.0180540719 -0.0505288981 -0.0734152005 -0.02359379 -0.0715416182 -0.0728664488 -0.0598009462 0.0019112568 0.0315825526 0.0425863474 -0.09864292570000001 0.0946085359 -0.0880063298 0.0790155012 -0.06788007459999999 -0.441368 -0.03477800000000003 0.194805711424 0.0012095092840000024 0.0203012 0.2122832 0.045064157002239986 0.00041213872144 1.368 0.01923000000000008 1.871424 0.0003697929000000031 -0.0268712 -0.000701299999999995 0.0007220613894399999 4.918216899999928e-07 0.0105538 0.00020659999999999952 0.00011138269444 4.268355999999979e-08 -0.00799464 -0.0009096300000000008 8.274267369000012e-07 6.391426872960001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33602.62109375 -43.25 1129136144.3701324 1870.5625 20990.94140625 47.73046875 2278.1976470947266 440619621.1206207 22255.552734375 29.9375 495309627.51254654 896.25390625 0.789549 21.502279 0.20418169999999994 0.0137390018 0.045956765 0.0242095713 -0.0698684763 -0.0305194791 -0.029081714300000002 -0.0086434171 0.0319947502 0.0153773526 -0.0474864135 0.0796819163 -0.0562460043 -0.0312496962 0.034425635499999996 0.0022681945 -0.013247006 0.0161964895 -0.0338185412 0.0551319775 -0.0165840953 -0.0575576324 -0.11991906960000001 -0.0969055649 0.0592616361 0.042200178 -0.037403445800000004 -0.0815397589 -0.0594409984 0.015082804699999999 0.0159246818 0.0027678234999999997 0.029194355099999996 0.040837063300000004 -0.0415190438 0.0097561331 0.054072669500000003 0.004982542899999999 -0.0061863012 0.026869982 -0.0729658349 0.0209217388 0.0386614958 -0.0054072298 -0.0399987897 0.0043465863 0.0756596429 -0.0766754701 -0.043320486500000005 -0.011549215500000001 -0.0424136776 -0.011762704099999998 -0.0047476157 0.0328824659 -0.0629423455 0.058735213099999996 -0.024063543700000002 -0.0417790601 0.0237440119 -0.09386569880000001 0.04242415980000002 -0.0319797151 0.0611986862 -0.0553786572 0.0406848877 -0.0650238452 -0.0367456054 -0.0111359583 0.1008284882 0.0777469221 -0.053567838099999994 0.0940504059 0.015283726499999999 -0.0988886499 0.0955793015 -0.0901455117 0.0827080574 -0.0734322509 -0.440621 0.0007470000000000532 0.194146865641 5.580090000000793e-07 -0.116408 -0.1367092 0.018689405364639998 0.013550822464 1.37438 0.006379999999999829 1.8889203844 4.070439999999784e-05 -0.0260841 0.0007870999999999954 0.0006803802728100001 6.195264099999928e-07 0.010226100000000002 -0.0003276999999999985 0.00010457312121000003 1.07387289999999e-07 -0.00808675 -9.21099999999994e-05 8.484252099999893e-09 6.539552556250001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33916.33203125 313.7109375 1150317578.4539948 98414.5523071289 21046.8203125 55.87890625 3122.452163696289 442968645.2666626 22327.451171875 71.8984375 498515075.8324623 5169.385314941406 0.8141930000000001 22.173403 0.15618179999999993 0.022400755499999998 0.013032626100000002 0.015652738700000002 0.0096023026 0.034906641 -0.0041338865 0.045078986200000004 0.0032123045 -0.0682658708 0.0325148598 -0.11557511990000001 -0.0166601848 0.0708138712 0.0273632157 0.0601997518 -0.0075418124 0.0453230859 0.1071935307 -0.0332053469 0.0809781212 0.055315899800000005 0.058273358 -0.093684239 0.0525105538 -0.06601380059999999 -0.028878185299999998 -0.0178002097 -0.148830179 0.028135879500000002 0.046068584100000004 0.0682027006 0.0606507305 -0.0421977293 -0.0567911862 0.024309587599999998 -0.0009853560000000002 -0.0268378033 -0.0084619772 0.0146240566 0.017191581799999998 -0.0399572313 0.0038034416999999997 0.063213567 0.0126568604 0.0130559157 0.0065008485 0.11791346720000001 0.0094664444 0.0937173058 -0.0411510464 0.06751946190000001 0.0022940844 -0.1107805243 0.051289178600000006 -0.0691392342 -0.033959159100000004 0.11744932109999999 -0.1154628073 -0.1055316853 -0.0045377264 -0.0560922266 0.10281806789999999 0.0058332209 1.965e-06 0.0509023514 -0.0872701504 0.0200770843 0.0262177858 -0.008993116899999999 0.0244063923 0.038171045099999995 0.06298777280000001 -0.0991099747 0.0964557418 -0.092084548 0.08607420269999999 -0.0785316931 -0.450939 -0.01031800000000005 0.203345981721 0.00010646112400000103 -0.0899987 0.0264093 0.0006974511264899999 0.00809976600169 1.32111 -0.05326999999999993 1.7453316321 0.0028376928999999922 -0.0252493 0.0008348000000000036 0.00063752715049 6.96891040000006e-07 0.010282500000000002 5.639999999999985e-05 0.00010572980625000003 3.180959999999984e-09 -0.00851924 -0.0004324900000000007 1.870476001000005e-07 7.257745017760001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33848.171875 -68.16015625 1145698739.279541 4645.806900024414 21080.45703125 33.63671875 1131.4288482666016 444385668.6463776 22311.837890625 -15.61328125 497818110.0575295 243.7745513916016 1.035501 28.200438 0.4873965000000001 0.0204586688 0.0499296635 0.0353406976 -0.038655855499999996 0.0769618742 0.0097072438 0.0829678309 0.1349235898 0.016409925 0.036424972 -0.0084878715 -0.1558587847 -0.0825678408 0.09192668849999999 -0.09019412130000001 0.0832037365 -0.0233955621 0.0779117396 0.08658310050000001 0.043365224 -0.0831539521 -0.10121525099999999 0.0101841374 -0.0763776199 -0.0081358816 0.0820325799 -0.1388007002 0.0310744987 0.0226152484 0.0953425791 -0.07566379969999999 0.0982531562 -0.0541182978 0.003081284 0.017245298 0.0242882271 -0.056845340599999995 0.007479052099999999 0.0374927893 -0.0337549501 -0.0810778906 -0.020073680400000002 0.11343221220000001 -0.1269514319 0.0198861722 0.0712797094 0.0815453253 0.0590950178 -0.0418818755 -0.1329998808 0.0787733908 0.0963701187 0.0587471897 -0.0956265336 0.0277856334 -0.103225181 -0.0059790497 0.0285102527 0.0007149525 0.0459652907 0.0840301767 -0.037469527200000005 -0.22050310329999998 -0.0048992927 -0.0213844315 -0.0020266012 0.0687059476 -0.0430484566 -0.07010119 0.0427008699 0.037506215 0.077955937 -0.09930684570000001 0.097236992 -0.0938191336 0.08910065240000001 -0.08314696120000001 -0.370143 0.08079600000000002 0.137005840449 0.006527993616000006 -0.0783587 0.011639999999999998 0.00013548959999999996 0.006140085865690001 1.38964 0.06852999999999998 1.9310993296 0.0046963608999999965 -0.0260348 -0.0007855000000000015 0.0006778108110400001 6.170102500000023e-07 0.0106268 0.00034429999999999704 0.00011292887823999996 1.1854248999999796e-07 -0.00312043 0.00539881 2.9147149416100007e-05 9.7370833849e-06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33881.1484375 32.9765625 1147932219.4439087 1087.4536743164062 21002.55078125 -77.90625 6069.3837890625 441107139.318985 22336.142578125 24.3046875 498903265.2703285 590.7178344726562 1.022781 27.854025 0.6031536 0.0298828335 0.0286124244 0.011928163600000001 -0.0207709553 -0.0001615988 0.0616191564 -0.0151605749 0.10457691429999999 -0.0179338505 -0.0450964991 -0.0945741439 -0.052376079299999996 -0.0147133444 0.09598945880000001 -0.038437976400000004 -0.011772646299999998 0.053325018499999995 0.0644641833 0.088928421 0.0866512612 0.041580696699999996 0.029639593 -0.0041596396 0.0984055147 0.0356525696 -0.0657749551 0.006071991 -0.0417070343 -0.006112331800000001 0.0617065879 0.0238267031 -0.0515413997 -0.0775604318 -0.08494077230000001 0.030956597000000002 0.0192896857 -0.0177050287 0.0333061014 0.0088008026 -0.0267272065 -0.0103285136 -0.06259265480000001 -0.0298565712 -0.11287483150000001 0.0107524234 0.065379267 0.10894513619999999 -0.0228906592 0.0159308438 -0.10358088289999999 0.043900207999999996 0.038693081000000004 -0.1240494963 0.0011576887 0.0430806738 -0.0096305251 -0.023315744399999998 -0.0665145721 0.0280325308 0.0074853304 -0.039286408700000004 0.1005160974 0.053363539 0.0775624457 0.0278954246 0.0229664905 0.0664286664 0.0419979613 0.0134635842 -0.11226686970000001 -0.0049508708 0.071991128 -0.0994792142 0.0979222811 -0.0953454172 0.0917754626 -0.0872496007 -0.466087 -0.09594399999999996 0.217237091569 0.009205251135999995 -0.0681211 0.010237600000000001 0.00010480845376000001 0.004640484265210001 1.35558 -0.03405999999999998 1.8375971363999999 0.0011600835999999984 -0.022305900000000004 0.003728899999999997 0.0004975531748100001 1.3904695209999975e-05 0.0131624 0.002535600000000001 0.00017324877375999998 6.429267360000002e-06 -0.00611417 -0.0029937400000000004 8.962479187600004e-06 3.738307478890001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 +33830.87890625 -50.26953125 1144528367.5693512 2527.0257720947266 20961.66796875 -40.8828125 1671.4043579101562 439391524.03211975 22275.76953125 -60.373046875 496209908.2093658 3644.9047889709473 0.747396 20.354298 0.2566311000000001 0.0234492938 0.0186802719 0.007759751899999999 -0.019921934199999998 -0.0123229128 0.0795718759 -0.058148301799999996 0.038112082 0.032788300699999995 -0.08654529789999997 -0.0462514572 0.064768586 -0.007211367299999999 0.050423746900000004 0.015258187900000001 0.0496037344 0.1049725497 0.019289156000000002 0.1100447626 0.0864025664 0.032599441 0.0763254682 0.0359847237 0.0745074401 -0.00280192 0.0559934083 0.0773228064 -0.0026476495 0.1136379716 -0.1337405552 0.0234788186 0.0073239546 -0.0465614203 -0.1007291608 0.0223994506 0.0121690894 -0.023955201699999998 0.0666788789 0.0036635547999999997 -0.0266565364 0.0074051753000000005 -0.0778901231 -0.09016665300000001 -0.07118064660000001 -0.0332275366 0.0024952616 0.0328385293 -0.10333217369999999 0.0686172747 0.0047534277 0.0483407337 0.0961193311 -0.0918386209 -0.00045978489999999996 0.0863206954 -0.0014465854000000002 -0.0055738226 -0.09680920039999999 0.0360889442 -0.1304312506 -0.0682850919 -0.0472600621 0.0753823038 -0.046566089299999995 -0.061572929400000004 -0.007978143 -0.0009059792 -0.0429706651 -0.028773291200000002 -0.0838861572 -0.044973770999999996 0.0175608393 -0.0996270376 0.0985109326 -0.0966600102 0.0940880769 -0.0908143174 -0.454898 0.011189000000000004 0.206932190404 0.0001251937210000001 0.0166795 0.0848006 0.007191141760360001 0.00027820572025 1.31645 -0.03913000000000011 1.7330406024999998 0.0015311569000000086 -0.0211634 0.0011425000000000012 0.0004478894995600001 1.3053062500000026e-06 0.0125943 -0.0005681000000000003 0.00015861639249000001 3.227376100000002e-07 -0.006833800000000001 -0.0007196300000000006 5.178673369000009e-07 4.670082244000001e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33832.8046875 1.92578125 1144658673.022522 3.7086334228515625 20982.16796875 20.5 420.25 440251372.6688385 22199.115234375 -76.654296875 492800717.18906015 5875.881229400635 0.913773 24.885324 0.22351249999999967 0.034709323 0.0031825125 0.017929052 0.012693546699999999 -0.0235242279 0.0705405504 -0.0277148383 0.0375880077 -0.09777949960000001 -0.051831175199999996 -0.0878753733 0.0834792441 0.0120474124 0.08742350269999999 -0.028995535 -0.0408194694 0.020102526699999998 -0.053289305700000004 0.0205682609 -0.112952385 0.0130909897 -0.0248734268 -0.0439866962 0.09716314179999999 0.1101755418 0.021855302400000002 -0.009941994000000001 0.1083168908 0.0204241559 0.0142905458 0.045486695099999995 0.006197997199999999 -0.09885784630000001 -0.017743206299999998 0.044408333200000004 -0.0097449631 0.0082769482 0.0030238618 0.019892993600000002 -0.0012443786 0.0162321691 -0.060185440300000004 -0.048841178 -0.0199397447 0.0721881983 -0.0036951551 0.07320325150000001 -0.10941560880000001 0.0470878636 -0.048627213600000004 -0.0892644125 -0.0314700028 -0.035783465 -0.0507684007 -0.0534330837 0.0701534561 -0.0644486123 0.0565220363 0.0552886345 -0.1446587265 -0.12312959970000001 0.053533097 0.0031425963 0.08842344769999999 -0.0779741594 -0.1183576023 0.10102451039999999 -0.009052956800000001 0.0500778593 -0.0224724877 -0.0244506813 -0.09616094480000001 -0.0997502796 0.0990023658 -0.09775999380000001 0.0960293686 -0.0938191336 -0.468622 -0.01372400000000007 0.21960657888400004 0.00018834817600000192 -0.0589755 -0.075655 0.005723679025 0.00347810960025 1.28227 -0.034179999999999884 1.6442163529 0.0011682723999999914 -0.020139 0.0010244000000000052 0.00040557932099999984 1.0493953600000108e-06 0.0129124 0.0003181 0.00016673007375999998 1.0118760999999998e-07 -0.007490369999999999 -0.0006565699999999977 4.3108416489999716e-07 5.610564273689998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33726.41015625 -106.39453125 1137470742.0276034 11319.796279907228 20982.833984375 0.666015625 0.4435768127441406 440279322.0158424 22225.234375 26.119140625 493961043.0236816 682.2095069885254 1.161753 31.638733 0.654974 0.0198177459 0.0037262679 0.0207150359 -0.017064226000000002 -0.0102128264 -0.014186176000000003 0.0098593306 -0.037372182000000004 -0.1067859318 0.020412875 0.0004906447000000001 0.0468934499 -0.0667702686 0.0482883817 -0.069366073 0.053764104400000005 -0.0946248532 -0.1141777692 -0.104160214 -0.09297930060000001 -0.0051577534 0.09818395 0.20131483739999997 0.0272408842 -0.0222449649 -0.030140511800000002 0.0058065989 -0.0815950654 -0.18291688890000002 -0.0056065866 0.0228358362 -0.0146226571 -0.0491677476 0.058257652300000004 0.0248465852 8.54639e-05 0.0015142848000000001 0.0076656017 0.0202575194 -0.0251704892 0.009444755899999999 0.0162524101 0.0176823656 0.0500662578 0.1145070435 -0.0370453452 0.0724025907 -0.0627328194 0.006059550699999999 0.023863044 -0.0814995905 -0.040368074 0.1621955806 0.0312648292 -0.13680570820000001 0.049979690800000004 0.0658453876 0.007455030600000002 0.160704134 0.1309806157 -0.0318043322 0.045729535700000004 0.0384683008 0.0964769223 0.0725251457 0.13077543560000002 -0.045707519 -0.0597815804 -0.0566327407 0.0443455228 -0.0814244024 0.0113512937 -0.0998489097 0.0993960955 -0.09864292570000001 0.09759167619999999 -0.0962455236 -0.548851 -0.08022899999999994 0.30123742020100003 0.00643669244099999 -0.308071 -0.2490955 0.062048568120249975 0.09490774104099997 1.30733 0.02505999999999986 1.7091117288999995 0.000628003599999993 -0.0254315 -0.005292500000000002 0.0006467611922499999 2.8010556250000018e-05 0.0124394 -0.0004729999999999994 0.00015473867236000003 2.2372899999999948e-07 -0.00773666 -0.00024629000000000144 6.065876410000071e-08 5.98559079556e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 +33635.01171875 -91.3984375 1131314013.3204498 8353.674377441406 20966.666015625 -16.16796875 261.40321350097656 439601083.8107643 22204.8515625 -20.3828125 493055432.9126587 415.45904541015625 0.787271 21.440226000000006 0.3045720000000001 0.0252071593 -0.0126382886 0.020324918 0.002254939 -0.0387357733 0.009074203000000001 -0.0416537535 -0.018752513999999998 -0.0462236442 -0.0030495643 -0.0315070201 0.0633222129 -0.0696198331 0.04463470940000002 -0.023680026099999998 0.0601144303 -0.025306349300000003 -0.1098188482 -0.0341976495 -0.1346083213 0.1048589749 -0.0003603898 0.127520822 -0.057189569 -0.0524620335 -0.05921458070000001 -0.052793182 -0.0912349407 -0.0070096223 0.0393833309 0.0096223774 0.0627334657 -0.0164661568 0.0179031402 0.025256152400000002 0.010844179099999999 0.0691958478 -0.0004398822 0.0211242456 -0.0057767305000000005 0.0348412365 -0.0127753332 -0.0406852264 0.024154868399999998 0.0663220235 -0.0349110731 0.0809148947 -0.1028223632 0.0377104845 0.0120950916 -0.1035494131 0.0069510119 0.0808788375 0.032722686800000005 -0.0707303768 0.1375299791 0.011974008500000001 0.0024820851000000002 0.12060987599999999 0.11199860199999999 0.009819816700000001 0.0533832685 -0.0118633315 -0.0736708949 0.06955297 0.012059743799999998 0.0152912975 -0.0109800698 0.06882538769999999 0.039153335 -0.0500538672 -0.0238007142 -0.09992290359999999 0.0996917334 -0.09930684570000001 0.09876883410000001 -0.09807852800000001 -0.54823 0.0006209999999999827 0.3005561329 3.856409999999785e-07 -0.204277 0.10379400000000001 0.010773194436000002 0.041729092729 1.22836 -0.07896999999999976 1.5088682896000003 0.006236260899999962 -0.0236558 0.0017757000000000016 0.0005595968736399998 3.1531104900000056e-06 0.012234900000000005 -0.00020449999999999462 0.00014969277801000014 4.18202499999978e-08 -0.008180199999999999 -0.00044353999999999845 1.9672773159999853e-07 6.691567203999998e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +33686.51171875 51.5 1134781071.777481 2652.25 20980.76953125 14.103515625 198.90915298461914 440192690.12342834 22226.46875 21.6171875 494015913.09472656 467.30279541015625 0.8213599999999999 22.368597 0.10918700000000013 0.0169392753 -0.0045459015 0.029956311099999997 -0.013244708400000001 -0.0306781488 0.0392159521 -0.0354364507 0.0754031926 0.0701853791 -0.08579552 0.0022108947 -0.0249021371 0.0788648117 0.0319924273 0.0709531524 0.0507067877 0.0941990811 -0.1072244351 0.0119577792 -0.062745559 -0.0371840013 0.0523378621 0.0287743206 0.0142170788 0.06361988219999999 0.055353107699999994 -0.0176675001 0.0742292133 0.0097946738 -0.0789079301 -0.0866347425 0.011241063400000001 -0.0778671177 0.066945083 0.0189675627 0.0053282989 0.0191869225 0.039861282799999995 0.028712668900000002 -0.0193689677 0.026759857 -0.040195903399999997 -0.045078000099999994 -0.1083457699 -0.0635330931 0.0638777804 -0.0330458878 -0.0185300376 0.1219482494 0.06164064480000001 -0.0868200458 -0.0431533155 -0.0144159394 0.0495786976 0.0709849105 -0.0066502226 0.022130421600000002 0.0736650665 0.0864928434 -0.0573120259 0.0162608661 -0.0470731717 -0.0579076505 0.08255947870000001 -0.062460073 0.033002348199999997 0.029248188999999997 -0.0648020176 -0.0995891571 0.1025757376 -0.0285439727 0.0289022844 -0.099972243 0.0998889875 -0.0997502796 0.0995561965 -0.09930684570000001 -0.503689 0.044540999999999935 0.25370260872100003 0.001983900680999995 -0.219112 -0.014835000000000015 0.00022007722500000043 0.048010068543999994 1.23948 0.011119999999999795 1.5363106703999998 0.00012365439999999548 -0.0235254 0.0001303999999999958 0.0005534444451600001 1.7004159999998904e-08 0.0118906 -0.000344300000000004 0.00014138636836000002 1.1854249000000275e-07 -0.00788108 0.0002991199999999982 8.947277439999893e-08 6.21114219664e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +34052.77734375 366.265625 1159591644.8230133 134150.50805664062 21000.546875 19.77734375 391.14332580566406 441022969.04907227 22265.5390625 39.0703125 495754229.7437134 1526.4893188476562 0.934962 25.462387 0.4661479999999999 0.0356046146 -0.0260861527 0.0376975624 0.0303526262 -0.0332811814 0.0327579927 0.0343907694 0.0622667541 0.0104983345 -0.039584108 -0.0615805484 0.0315037008 0.1940600424 0.0355460566 -0.035803090600000004 -0.1086071468 -0.0192866589 -0.1694998404 0.0111519203 -0.0449487933 0.0003093093 -0.030124140499999997 0.0305765078 0.025469244199999998 0.1108345632 0.09230312630000001 -0.065807206 0.1946849754 -0.0276874389 -0.0430127513 -0.1298501325 -0.132992734 -0.0728881841 0.0008915116 0.0452527655 -0.0473307039 -0.0310908521 0.0294419419 0.0372072629 0.026334955400000002 0.0394453946 -0.0278317971 0.010645207299999999 -0.0694534518 -0.0413418221 0.0249778511 -0.028220977400000007 0.0453248819 0.1114543258 -0.0356431116 -0.20936924420000005 -0.12438309689999999 -0.0471290821 -0.1128187964 0.025724141000000002 -0.0033880803999999996 -0.08921817230000001 0.09258824730000001 0.0823113029 -0.024704078900000002 -0.043632036 -0.0962915167 0.0021298743 0.0561632842 -0.0993011987 0.1303187945 0.0319608147 0.06973035 -0.0294766159 0.074967642 0.010188151999999999 0.0410230401 -0.0999969158 0.09998766320000001 -0.099972243 0.099950656 -0.09992290359999999 -0.504861 -0.0011719999999999509 0.25488462932100003 1.3735839999998849e-06 -0.452248 -0.233136 0.05435239449599999 0.204528253504 1.22128 -0.018199999999999997 1.4915248383999995 0.0003312399999999998 -0.0217305 0.001794900000000002 0.00047221463024999996 3.2216660100000078e-06 0.0107528 -0.001137800000000001 0.00011562270784 1.294588840000003e-06 -0.00922118 -0.0013401000000000005 1.7958680100000007e-06 8.503016059240002e-05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/junifer/testing/datagrabbers.py b/junifer/testing/datagrabbers.py index 7bd4c7d2a..8acf3e2d8 100644 --- a/junifer/testing/datagrabbers.py +++ b/junifer/testing/datagrabbers.py @@ -140,10 +140,11 @@ class PartlyCloudyTestingDataGrabber(BaseDataGrabber): If False, returns all :term:`fMRIPrep` confounds (default True). age_group : {"adults", "child", "both"}, optional - Which age group to fetch (default "both"). - - 'adults' = fetch adults only (n=33, ages 18-39) - - 'child' = fetch children only (n=122, ages 3-12) - - 'both' = fetch full sample (n=155) + Which age group to fetch (default "both"): + + * 'adults' = fetch adults only (n=33, ages 18-39) + * 'child' = fetch children only (n=122, ages 3-12) + * 'both' = fetch full sample (n=155) """ def __init__( diff --git a/junifer/testing/utils.py b/junifer/testing/utils.py new file mode 100644 index 000000000..8bb676647 --- /dev/null +++ b/junifer/testing/utils.py @@ -0,0 +1,13 @@ +"""Testing utils""" + +# Authors: Federico Raimondo +# License: AGPL + +from pathlib import Path + +def get_testing_data(fname): + """Get the path to a testing data file.""" + t_path = Path(__file__).parent / 'data' / fname + if not t_path.exists(): + raise FileNotFoundError(f"File {fname} not found in testing data") + return t_path \ No newline at end of file -- 2.52.0 From 109b2142f079001648939322a7f20bde0defa0e9 Mon Sep 17 00:00:00 2001 From: Fede Date: Fri, 4 Nov 2022 09:04:19 +0200 Subject: [PATCH 137/142] lint --- junifer/testing/utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/junifer/testing/utils.py b/junifer/testing/utils.py index 8bb676647..ac77b5258 100644 --- a/junifer/testing/utils.py +++ b/junifer/testing/utils.py @@ -5,9 +5,10 @@ from pathlib import Path + def get_testing_data(fname): """Get the path to a testing data file.""" - t_path = Path(__file__).parent / 'data' / fname + t_path = Path(__file__).parent / "data" / fname if not t_path.exists(): raise FileNotFoundError(f"File {fname} not found in testing data") - return t_path \ No newline at end of file + return t_path -- 2.52.0 From 321c7cc2a87cac14cce88a562ac03909a8b933f3 Mon Sep 17 00:00:00 2001 From: Fede Date: Fri, 4 Nov 2022 09:04:39 +0200 Subject: [PATCH 138/142] more lint --- junifer/preprocess/tests/test_confounds.py | 1 - junifer/testing/utils.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/tests/test_confounds.py index 9ca8cee7e..a842bafb4 100644 --- a/junifer/preprocess/tests/test_confounds.py +++ b/junifer/preprocess/tests/test_confounds.py @@ -13,7 +13,6 @@ from pandas.testing import assert_frame_equal import numpy as np import nibabel as nib -from nilearn.interfaces import fmriprep from nilearn._utils.exceptions import DimensionError from junifer.preprocess.confounds import fMRIPrepConfoundRemover diff --git a/junifer/testing/utils.py b/junifer/testing/utils.py index ac77b5258..7f6d22e41 100644 --- a/junifer/testing/utils.py +++ b/junifer/testing/utils.py @@ -1,4 +1,4 @@ -"""Testing utils""" +"""Testing utils.""" # Authors: Federico Raimondo # License: AGPL -- 2.52.0 From e7bd2ab2a9b19ec2a9c05f6603d616880e5df3d6 Mon Sep 17 00:00:00 2001 From: Fede Date: Fri, 4 Nov 2022 11:02:03 +0200 Subject: [PATCH 139/142] @synchon: comments addressed --- junifer/preprocess/base.py | 3 ++- junifer/preprocess/confounds/__init__.py | 7 +++++++ .../fmriprep_confound_remover.py} | 8 ++++---- .../tests/test_fmriprep_confound_remover.py} | 0 junifer/testing/utils.py | 17 ++++++++++++++--- 5 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 junifer/preprocess/confounds/__init__.py rename junifer/preprocess/{confounds.py => confounds/fmriprep_confound_remover.py} (99%) rename junifer/preprocess/{tests/test_confounds.py => confounds/tests/test_fmriprep_confound_remover.py} (100%) diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py index 84d3e9d67..792c31311 100644 --- a/junifer/preprocess/base.py +++ b/junifer/preprocess/base.py @@ -71,7 +71,8 @@ class BasePreprocessor(ABC, PipelineStepMixin): Returns ------- list of str - The updated list of output kinds, as storage possibilities. + The updated list of available Junifer Data object keys after + the pipeline step. """ raise_error( diff --git a/junifer/preprocess/confounds/__init__.py b/junifer/preprocess/confounds/__init__.py new file mode 100644 index 000000000..bd0189b10 --- /dev/null +++ b/junifer/preprocess/confounds/__init__.py @@ -0,0 +1,7 @@ +"""Provide imports for confounds sub-package.""" + +# Authors: Federico Raimondo +# Leonard Sasse +# License: AGPL + +from .fmriprep_confound_remover import fMRIPrepConfoundRemover diff --git a/junifer/preprocess/confounds.py b/junifer/preprocess/confounds/fmriprep_confound_remover.py similarity index 99% rename from junifer/preprocess/confounds.py rename to junifer/preprocess/confounds/fmriprep_confound_remover.py index 575de40e7..56ef80a6e 100644 --- a/junifer/preprocess/confounds.py +++ b/junifer/preprocess/confounds/fmriprep_confound_remover.py @@ -1,4 +1,4 @@ -"""Provide class for confound removal using FMRIPrep format.""" +"""Provide class for confound removal using fMRIPrep format.""" # Authors: Federico Raimondo # Leonard Sasse @@ -13,9 +13,9 @@ from nilearn._utils.niimg_conversions import check_niimg_4d from nilearn.image import clean_img from nilearn.masking import compute_brain_mask -from .base import BasePreprocessor -from ..api.decorators import register_preprocessor -from ..utils import logger, raise_error +from ..base import BasePreprocessor +from ...api.decorators import register_preprocessor +from ...utils import logger, raise_error if TYPE_CHECKING: diff --git a/junifer/preprocess/tests/test_confounds.py b/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py similarity index 100% rename from junifer/preprocess/tests/test_confounds.py rename to junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py diff --git a/junifer/testing/utils.py b/junifer/testing/utils.py index 7f6d22e41..391243c34 100644 --- a/junifer/testing/utils.py +++ b/junifer/testing/utils.py @@ -6,9 +6,20 @@ from pathlib import Path -def get_testing_data(fname): - """Get the path to a testing data file.""" +def get_testing_data(fname : str) -> Path: + """Get the path to a testing data file. + + Parameters + ---------- + fname : str + The name of the file. + + Returns + ------- + pathlib.Path + The absolute path to the file. + """ t_path = Path(__file__).parent / "data" / fname if not t_path.exists(): raise FileNotFoundError(f"File {fname} not found in testing data") - return t_path + return t_path.resolve() -- 2.52.0 From 9fd7bfcd80e3119616c43caaaa0f418481655d74 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 4 Nov 2022 13:09:59 +0100 Subject: [PATCH 140/142] docs: disable sqlalchemy mapping --- docs/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 8df7856aa..ed1670def 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -65,6 +65,7 @@ nitpick_ignore_regex = [ ("py:obj", "subclass"), # python 3.11 error ("py:class", "typing.Any"), # python 3.11 error # ('py:class', 'numpy.typing.ArrayLike') + ("py:obj", "sqlalchemy.engine.Engine"), # ignore sqlalchemy ] # numpydoc_validation_checks = { @@ -145,7 +146,7 @@ intersphinx_mapping = { "numpy": ("https://numpy.org/doc/stable/", None), "numpy": ("https://numpy.org/doc/stable/", None), "pandas": ("https://pandas.pydata.org/pandas-docs/dev", None), - "sqlalchemy": ("https://docs.sqlalchemy.org/en/20/", None), + # "sqlalchemy": ("https://docs.sqlalchemy.org/en/20/", None), "scipy": ("https://docs.scipy.org/doc/scipy/", None), } -- 2.52.0 From 69419e8199934bea73b3ac8a4a8f6609b251016c Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Fri, 4 Nov 2022 13:10:17 +0100 Subject: [PATCH 141/142] docs: reorganize and run black on conf.py --- docs/conf.py | 128 ++++++++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 57 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index ed1670def..f738b1e68 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,10 +29,8 @@ project = "junifer" copyright = "2022, Authors of junifer" author = "Fede Raimondo" - # -- General configuration --------------------------------------------------- - # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. @@ -49,12 +47,18 @@ extensions = [ ] # Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] +templates_path = [ + "_templates", +] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] +exclude_patterns = [ + "_build", + "Thumbs.db", + ".DS_Store", +] nitpicky = True @@ -68,46 +72,30 @@ nitpick_ignore_regex = [ ("py:obj", "sqlalchemy.engine.Engine"), # ignore sqlalchemy ] -# numpydoc_validation_checks = { -# "all", -# "GL01", -# "GL02", -# "GL03", -# "ES01", -# "SA01", -# "EX01", -# } -numpydoc_xref_param_type = True -numpydoc_xref_aliases = { - "Path": "pathlib.Path", - "Nifti1Image": "nibabel.nifti1.Nifti1Image", - "Nifti2Image": "nibabel.nifti2.Nifti2Image", - "Engine": "sqlalchemy.engine.Engine", -} -numpydoc_xref_ignore = { - "of", - "shape", - "optional", - "or", - "the", - "options", - "function", - "object", - "class", - "objects" -} - -autoclass_content = "class" -autodoc_typehints = "description" -autodoc_typehints_description_target = "documented" - # -- Options for HTML output ------------------------------------------------- -# The theme to use for HTML and HTML Help pages. See the documentation for +# The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "furo" +html_logo = "./images/junifer_logo.png" + +# These paths are either relative to html_static_path +# or fully qualified paths (eg. https://...) +html_css_files = [ + "css/custom.css", +] + +html_js_files = [ + "js/custom.js", +] + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + html_sidebars = { "**": [ "sidebar/scroll-start.html", @@ -119,24 +107,19 @@ html_sidebars = { "sidebar/scroll-end.html", ] } -html_logo = "./images/junifer_logo.png" -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +# -- sphinx.ext.autodoc configuration ---------------------------------------- -# These paths are either relative to html_static_path -# or fully qualified paths (eg. https://...) -html_css_files = [ - 'css/custom.css', -] +autoclass_content = "both" +autodoc_typehints = "description" +autodoc_typehints_description_target = "documented" -html_js_files = [ - 'js/custom.js', -] +# -- sphinx.ext.autosummary configuration ------------------------------------ + +autosummary_generate = True + +# -- sphinx.ext.intersphinx configuration ------------------------------------ -# Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), "sklearn": ("https://scikit-learn.org/stable", None), @@ -150,6 +133,41 @@ intersphinx_mapping = { "scipy": ("https://docs.scipy.org/doc/scipy/", None), } +# -- numpydoc configuration -------------------------------------------------- + +numpydoc_show_class_members = False +numpydoc_xref_param_type = True +numpydoc_xref_aliases = { + "Path": "pathlib.Path", + "Nifti1Image": "nibabel.nifti1.Nifti1Image", + "Nifti2Image": "nibabel.nifti2.Nifti2Image", + # "Engine": "sqlalchemy.engine.Engine", +} +numpydoc_xref_ignore = { + "of", + "shape", + "optional", + "or", + "the", + "options", + "function", + "object", + "class", + "objects", + "Engine", +} +# numpydoc_validation_checks = { +# "all", +# "GL01", +# "GL02", +# "GL03", +# "ES01", +# "SA01", +# "EX01", +# } + +# -- Sphinx-Gallery configuration -------------------------------------------- + sphinx_gallery_conf = { "examples_dirs": ["../examples"], "gallery_dirs": ["auto_examples"], @@ -157,12 +175,8 @@ sphinx_gallery_conf = { "backreferences_dir": "generated", } +# -- sphinx-multiversion configuration --------------------------------------- -autosummary_generate = True -numpydoc_show_class_members = False -autoclass_content = "both" - -# sphinx-multiversion options smv_rebuild_tags = False smv_tag_whitelist = r"^v\d+\.\d+.\d+$" smv_branch_whitelist = r"main" -- 2.52.0 From 6f7e8e46e7dfdf73eb88826b6c02068911d42b5a Mon Sep 17 00:00:00 2001 From: Fede Date: Fri, 4 Nov 2022 23:44:55 +0200 Subject: [PATCH 142/142] fix this one --- docs/extending/datagrabber.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extending/datagrabber.rst b/docs/extending/datagrabber.rst index 3ee2bc871..51e50fc03 100644 --- a/docs/extending/datagrabber.rst +++ b/docs/extending/datagrabber.rst @@ -14,7 +14,7 @@ the structure of a dataset and provide two specific functionalities: In this section, we will see how to create a datagrabber for a dataset. Basic aspects of datagrabbers are covedered in the -:ref:`Understanding DataGrabbers ` section. +:ref:`Understanding DataGrabbers ` section. .. _extending_datagrabbers_think: -- 2.52.0